lex 11 місяців тому
батько
коміт
0bc9fbb605

+ 74 - 68
src/components/upload-file/index.tsx

@@ -6,9 +6,9 @@ import {
   UploadFileInfo,
   useMessage
 } from 'naive-ui'
-import {defineComponent, watch, PropType, reactive, ref} from 'vue'
+import { defineComponent, watch, PropType, reactive, ref } from 'vue'
 import Copper from './copper'
-import {getUploadSign, onFileUpload, onOnlyFileUpload} from '@/utils/oss-file-upload'
+import { getUploadSign, onFileUpload, onOnlyFileUpload } from '@/utils/oss-file-upload'
 
 export default defineComponent({
   name: 'upload-file',
@@ -105,8 +105,14 @@ export default defineComponent({
     }
   },
   // readFileInputEventAsArrayBuffer 只会在文件的时间回调
-  emits: ['update:fileList', 'upload:success', 'close', 'readFileInputEventAsArrayBuffer', 'remove'],
-  setup(props, {slots, attrs, emit, expose}) {
+  emits: [
+    'update:fileList',
+    'upload:success',
+    'close',
+    'readFileInputEventAsArrayBuffer',
+    'remove'
+  ],
+  setup(props, { slots, attrs, emit, expose }) {
     const ossUploadUrl = `https://${props.bucketName}.ks3-cn-beijing.ksyuncs.com/`
     const message = useMessage()
     const visiable = ref<boolean>(false)
@@ -124,7 +130,7 @@ export default defineComponent({
 
     const fileListRef = ref<UploadFileInfo[]>([])
     const initFileList = () => {
-      console.log('desc',props.desc)
+      console.log('desc', props.desc)
       if (props.fileList) {
         console.log('downloadUrl', props.fileList)
         const splitName = props.fileList.split('/')
@@ -137,7 +143,7 @@ export default defineComponent({
           }
         ]
       } else if (Array.isArray(props.imageList)) {
-        console.log(Array.isArray(props.imageList), props.imageList, 'Array.isArray(props.imageList)')
+        // console.log(Array.isArray(props.imageList), props.imageList, 'Array.isArray(props.imageList)')
         let list: any = []
         props.imageList.forEach((n: any) => {
           const splitName = n.split('/')
@@ -155,18 +161,18 @@ export default defineComponent({
     }
     initFileList()
     watch(
-        () => props.imageList,
-        () => {
-          initFileList()
-        },
-        {deep: true}
+      () => props.imageList,
+      () => {
+        initFileList()
+      },
+      { deep: true }
     )
     watch(
-        () => props.fileList,
-        () => {
-          console.log('list')
-          initFileList()
-        }
+      () => props.fileList,
+      () => {
+        console.log('list')
+        initFileList()
+      }
     )
     const handleClearFile = () => {
       uploadRef.value?.clear()
@@ -226,7 +232,7 @@ export default defineComponent({
           }
         }
         // const { data } = await policy(obj)
-        const {data} = await getUploadSign(obj)
+        const { data } = await getUploadSign(obj)
 
         state.policy = data.policy
         state.signature = data.signature
@@ -250,19 +256,19 @@ export default defineComponent({
     }
 
     const onCustomRequest = ({
-                               file,
-                               // data,
-                               // headers,
-                               // withCredentials,
-                               action,
-                               onFinish,
-                               onError,
-                               onProgress
-                             }: UploadCustomRequestOptions) => {
+      file,
+      // data,
+      // headers,
+      // withCredentials,
+      action,
+      onFinish,
+      onError,
+      onProgress
+    }: UploadCustomRequestOptions) => {
       const item = state
 
       item.file = file
-      onFileUpload({file, action, data: item, onProgress, onFinish, onError})
+      onFileUpload({ file, action, data: item, onProgress, onFinish, onError })
     }
 
     const onFinish = (options: any) => {
@@ -302,7 +308,7 @@ export default defineComponent({
           }
         }
         // const { data } = await policy(obj)
-        const {data} = await getUploadSign(obj)
+        const { data } = await getUploadSign(obj)
 
         state.policy = data.policy
         state.signature = data.signature
@@ -333,47 +339,47 @@ export default defineComponent({
       }
     }
     return () => (
-        <div>
-          <NUpload
-              ref={uploadRef}
-              action={ossUploadUrl}
-              customRequest={onCustomRequest}
-              data={state}
-              v-model:fileList={fileListRef.value}
-              listType={props.listType}
-              accept={props.accept}
-              multiple={props.multiple}
-              max={props.max}
-              disabled={props.disabled}
-              showFileList={props.showFileList}
-              showPreviewButton
-              onBeforeUpload={(options: any) => onBeforeUpload(options)}
-              onFinish={(options: any) => onFinish(options)}
-              onRemove={(options: any) => onRemove(options)}
-          >
-            {props.listType === 'image' && (
-                <NButton loading={btnLoading.value} type="primary">
-                  {props.text}
-                </NButton>
-            )}
-          </NUpload>
-          {props.tips && <p style="font-size: 13px; color: #666; padding-top: 4px;">{props.tips}</p>}
+      <div>
+        <NUpload
+          ref={uploadRef}
+          action={ossUploadUrl}
+          customRequest={onCustomRequest}
+          data={state}
+          v-model:fileList={fileListRef.value}
+          listType={props.listType}
+          accept={props.accept}
+          multiple={props.multiple}
+          max={props.max}
+          disabled={props.disabled}
+          showFileList={props.showFileList}
+          showPreviewButton
+          onBeforeUpload={(options: any) => onBeforeUpload(options)}
+          onFinish={(options: any) => onFinish(options)}
+          onRemove={(options: any) => onRemove(options)}
+        >
+          {props.listType === 'image' && (
+            <NButton loading={btnLoading.value} type="primary">
+              {props.text}
+            </NButton>
+          )}
+        </NUpload>
+        {props.tips && <p style="font-size: 13px; color: #666; padding-top: 4px;">{props.tips}</p>}
 
-          <NModal
-              v-model:show={visiable.value}
-              preset="dialog"
-              showIcon={false}
-              title="上传图片"
-              style={{width: '800px'}}
-          >
-            {/* @cropper-no="error" @cropper-ok="success" */}
-            <Copper
-                ref={CropperModal}
-                onClose={() => (visiable.value = false)}
-                onCropperOk={cropperOk}
-            />
-          </NModal>
-        </div>
+        <NModal
+          v-model:show={visiable.value}
+          preset="dialog"
+          showIcon={false}
+          title="上传图片"
+          style={{ width: '800px' }}
+        >
+          {/* @cropper-no="error" @cropper-ok="success" */}
+          <Copper
+            ref={CropperModal}
+            onClose={() => (visiable.value = false)}
+            onCropperOk={cropperOk}
+          />
+        </NModal>
+      </div>
     )
   }
 })

+ 1308 - 1158
src/views/music-library/music-sheet/modal/music-operationV2.tsx

@@ -1,10 +1,11 @@
-import type {SelectOption} from 'naive-ui'
+import type { SelectOption } from 'naive-ui'
 import {
   NAlert,
   NButton,
   NCascader,
   NCheckbox,
-  NCheckboxGroup, NDivider,
+  NCheckboxGroup,
+  NDivider,
   NForm,
   NFormItem,
   NFormItemGi,
@@ -23,19 +24,19 @@ import {
   useDialog,
   useMessage
 } from 'naive-ui'
-import {defineComponent, onMounted, PropType, reactive, ref, watch} from 'vue'
-import {musicSheetCategoriesQueryTree, musicSheetDetail, musicSheetSave} from '../../api'
+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'
 import deepClone from '@/utils/deep.clone'
 import axios from 'axios'
-import {appKey, clientType, musicSheetSourceType} from '@/utils/constant'
-import {getMapValueByKey, getSelectDataFromObj} from '@/utils/objectUtil'
-import {musicalInstrumentPage} from '@views/system-manage/subject-manage/api'
-import {subjectPage} from '@views/system-manage/api'
+import { appKey, clientType, musicSheetSourceType } from '@/utils/constant'
+import { getMapValueByKey, getSelectDataFromObj } from '@/utils/objectUtil'
+import { musicalInstrumentPage } from '@views/system-manage/subject-manage/api'
+import { subjectPage } from '@views/system-manage/api'
 import MusicSheetOwnerDialog from '@views/music-library/music-sheet/modal/musicSheetOwnerDialog'
-import {sysApplicationPage} from '@views/menu-manage/api'
-import {filterPointCategory} from '@views/teaching-manage/unit-test'
+import { sysApplicationPage } from '@views/menu-manage/api'
+import { filterPointCategory } from '@views/teaching-manage/unit-test'
 import MusicCreateImg from './music-create-img'
 
 /**
@@ -64,7 +65,7 @@ export const onlyVisible = (xml: any, partIndex: any) => {
   if (!xml) return ''
   const xmlParse = new DOMParser().parseFromString(xml, 'text/xml')
   const partList =
-      xmlParse.getElementsByTagName('part-list')?.[0]?.getElementsByTagName('score-part') || []
+    xmlParse.getElementsByTagName('part-list')?.[0]?.getElementsByTagName('score-part') || []
   const parts = xmlParse.getElementsByTagName('part')
   const visiblePartInfo = partList[partIndex]
   if (visiblePartInfo) {
@@ -162,8 +163,8 @@ export function getGradualLengthByXml(xml: string) {
       const measureNotes = Array.from(measure.querySelectorAll('note'))
 
       const noteInMeasureIndex = Array.from(measure.childNodes)
-          .filter((item: any) => item.nodeName === 'note')
-          .findIndex((item) => item === note)
+        .filter((item: any) => item.nodeName === 'note')
+        .findIndex((item) => item === note)
 
       let allDuration = 0
       let leftDuration = 0
@@ -217,9 +218,9 @@ export function getGradualLengthByXml(xml: string) {
       return textContent && ks.includes(textContent)
     })
     if (
-        ele.type === 'metronome' ||
-        (ele.type === 'words' && (textContent.startsWith('a tempo') || isKeyWork)) ||
-        isLastNoteAndNotClosed
+      ele.type === 'metronome' ||
+      (ele.type === 'words' && (textContent.startsWith('a tempo') || isKeyWork)) ||
+      isLastNoteAndNotClosed
     ) {
       const indexOf = gradualNotes.findIndex((item) => item.length === 1)
       if (indexOf > -1 && ele.index > gradualNotes[indexOf]?.[0].start) {
@@ -249,6 +250,46 @@ export function getGradualLengthByXml(xml: string) {
   return gradualNotes
 }
 
+export type FormatXMLInfo = {
+  speed: number
+  title: string
+  composer: string
+  partNames: string[]
+}
+
+/** 获取xml基本信息,标题,速度等信息 */
+export const getXmlInfo = (xml: string): FormatXMLInfo => {
+  const data: FormatXMLInfo = {
+    /** 速度 */
+    speed: 0,
+    /** 标题 */
+    title: '',
+    /** 作曲人 */
+    composer: '',
+    /** 声部列表 */
+    partNames: []
+  }
+  const xmlParse = new DOMParser().parseFromString(xml, 'text/xml')
+  data.title = xmlParse.getElementsByTagName('work-title')[0]?.textContent || ''
+  data.composer = xmlParse.getElementsByTagName('creator')[0]?.textContent || ''
+  const measures = xmlParse.getElementsByTagName('measure')
+
+  for (const item of Array.from(xmlParse.getElementsByTagName('part-name'))) {
+    if (item.textContent) {
+      data.partNames.push(item.textContent)
+    }
+  }
+
+  for (const measure of Array.from(measures)) {
+    const perMinute = measure.getElementsByTagName('per-minute')
+    if (perMinute.length && perMinute[perMinute.length - 1]) {
+      data.speed = parseFloat(perMinute[perMinute.length - 1].textContent || '0')
+      break
+    }
+  }
+  return data
+}
+
 export default defineComponent({
   name: 'music-operation',
   props: {
@@ -258,8 +299,7 @@ export default defineComponent({
     },
     data: {
       type: Object as PropType<any>,
-      default: () => {
-      }
+      default: () => {}
     },
     tagList: {
       type: Array as PropType<Array<SelectOption>>,
@@ -276,7 +316,7 @@ export default defineComponent({
   },
   emits: ['close', 'getList'],
 
-  setup(props, {slots, attrs, emit}) {
+  setup(props, { slots, attrs, emit }) {
     const forms = reactive({
       details: {} as any, // 曲目详情
       graduals: {} as any, // 渐变速度
@@ -285,7 +325,7 @@ export default defineComponent({
       midiUrl: null, // mid
       name: null, // 曲目名称
       // musicTag: [] as any, // 曲目标签
-      composer: null, // 音乐人
+      composer: null as any, // 音乐人
       playSpeed: null as any, // 曲谱速度
       // showFingering: null as any, // 是否显示指法
       // canEvaluate: null as any, // 是否评测
@@ -327,10 +367,10 @@ export default defineComponent({
       solmizationFileUrl: null, // 唱名文件
       isAllSubject: false, // 适用声部
 
-      fSongList:[] as any,// 范唱列表
+      fSongList: [] as any, // 范唱列表
       isScoreRender: true, // 总谱渲染
       defaultScoreRender: true, // 演奏是否默认展示总谱渲染
-      scoreAudioFileUrl: null as any, // 总谱文件
+      scoreAudioFileUrl: null as any // 总谱文件
     })
     const state = reactive({
       loading: false,
@@ -360,7 +400,7 @@ export default defineComponent({
 
       subjectDisabled: false, // 声部不可用
       instrumentDisabled: false, // 乐器不可用
-      initFSongMap: new Map() as any, //初始化的范唱
+      initFSongMap: new Map() as any //初始化的范唱
     })
     const gradualData = reactive({
       list: [] as any[],
@@ -368,11 +408,11 @@ export default defineComponent({
     })
 
     watch(
-        () => forms.multiTracksSelection,
-        (value) => {
-          initInstrumentAndSubjectByTrack(value)
-          initFSongList()
-        }
+      () => forms.multiTracksSelection,
+      (value) => {
+        initInstrumentAndSubjectByTrack(value)
+        initFSongList()
+      }
     )
 
     const btnLoading = ref(false)
@@ -388,19 +428,19 @@ export default defineComponent({
         }
         // 校验合奏时声轨与乐器是否存在不匹配情况
         if (forms.musicSheetType == 'CONCERT') {
-          let set = [] as any;
-          const {data} = await musicalInstrumentPage({page: 1, rows: 9999})
+          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) => {
-                set.push(code.replaceAll(' ','').toLocaleLowerCase())
+                set.push(code.replaceAll(' ', '').toLocaleLowerCase())
               })
             }
           })
           let unDefinedTrack = [] as any
           forms.multiTracksSelection.forEach((item: any) => {
             if (item && !isPtrack(item)) {
-              let contain = false;
+              let contain = false
               let code = item.replace(' ', '').toLocaleLowerCase()
               for (let i = 0; i < set.length; i++) {
                 if (code.startsWith(set[i])) {
@@ -418,8 +458,7 @@ export default defineComponent({
               title: '提示',
               content: `声轨未配置:${unDefinedTrack.join(',')}`,
               positiveText: '确定',
-              onPositiveClick: () => {
-              },
+              onPositiveClick: () => {}
             })
             return
           }
@@ -427,23 +466,40 @@ export default defineComponent({
 
         try {
           //extConfigJson: {"repeatedBeats":0,"gradualTimes":{"75":"02:38:60","77":"02:43:39"}}
-          let audioPlayTypes = new Set() as any;
-          let musicSheetSoundList = [];
-          let musicSheetType = forms.musicSheetType;
+          let audioPlayTypes = new Set() as any
+          let musicSheetSoundList = []
+          let musicSheetType = forms.musicSheetType
 
+          // 判断 伴唱 范唱 唱名只有上传一个都可以上传
+          let existFSFile = false
           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")
+              audioPlayTypes.add('SING')
+              existFSFile = true
             }
           }
 
-          var existYzFile = false;
+          // 总谱 伴唱判断
+          if (forms.scoreAudioFileUrl || state.bSongFile) {
+            existFSFile = true
+          }
+
+          let existYzFile = false
+          // console.log({
+          //   musicSheetType,
+          //   fSongList: forms.fSongList,
+          //   isAllSubject: forms.isAllSubject,
+          //   musicSheetSoundList_all_subject: forms.musicSheetSoundList_all_subject,
+          //   musicSheetSoundList_YZ: forms.musicSheetSoundList_YZ,
+          //   playMode: forms.playMode,
+          //   musicalInstrumentIdList: forms.musicalInstrumentIdList
+          // })
           if (musicSheetType == 'SINGLE') {
             if (forms.isAllSubject) {
               if (forms.musicSheetSoundList_all_subject) {
-                audioPlayTypes.add("PLAY")
+                audioPlayTypes.add('PLAY')
                 musicSheetSoundList.push({
                   audioFileUrl: forms.musicSheetSoundList_all_subject,
                   musicSheetId: props.data.id,
@@ -453,48 +509,66 @@ export default defineComponent({
               }
             } else {
               if (forms.musicSheetSoundList_YZ.length > 0) {
-                audioPlayTypes.add("PLAY")
                 forms.musicSheetSoundList_YZ.forEach((musicSheetSound: any) => {
-                  if (forms.musicalInstrumentIdList.includes(musicSheetSound.musicalInstrumentId) && musicSheetSound.audioFileUrl) {
+                  if (
+                    forms.musicalInstrumentIdList.includes(musicSheetSound.musicalInstrumentId) &&
+                    musicSheetSound.audioFileUrl
+                  ) {
                     existYzFile = true
                     musicSheetSoundList.push({
                       ...musicSheetSound,
-                      musicSheetId: props.data.id,
+                      musicSheetId: props.data.id
                     })
+                    // 判断是否显示
+                    if (!audioPlayTypes.includes('PLAY')) {
+                      audioPlayTypes.add('PLAY')
+                    }
                   }
                 })
               }
             }
           } else if (musicSheetType == 'CONCERT') {
-            audioPlayTypes.add("PLAY")
             forms.musicSheetSoundList_YY.forEach((musicSheetSound: any) => {
-              if (musicSheetSound.audioFileUrl && forms.multiTracksSelection.includes(musicSheetSound.track)) {
+              if (
+                musicSheetSound.audioFileUrl &&
+                forms.multiTracksSelection.includes(musicSheetSound.track)
+              ) {
                 musicSheetSoundList.push({
                   ...musicSheetSound,
                   musicSheetId: props.data.id,
                   audioPlayType: 'PLAY'
                 })
                 existYzFile = true
+
+                if (!audioPlayTypes.includes('PLAY')) {
+                  audioPlayTypes.add('PLAY')
+                }
               }
             })
           }
-          if (!state.bSongFile && !existYzFile) {
-            message.warning("请上传音频文件")
+          // 演唱 演奏只要有一个上传都可以
+          if (!existFSFile && !existYzFile) {
+            message.warning('请上传音频文件')
             return
           }
 
           // 生成图片
-          if (!state.isAutoSave) {
-            state.isAutoSave = true
-            state.productOpen = true
-            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,
+              scoreAudioFileUrl:
+                forms.multiTracksSelection.length > 1 &&
+                forms.isScoreRender &&
+                forms.scoreAudioFileUrl
+                  ? forms.scoreAudioFileUrl
+                  : null,
               audioPlayType: 'SING'
             })
           }
@@ -516,16 +590,15 @@ export default defineComponent({
             }
           }
 
-
           const obj = {
             musicCategoryId: forms.musicCategoryId,
             musicCover: forms.musicCover,
             name: forms.name,
             appAuditFlag: forms.appAuditFlag,
-            subjectIds: forms.isAllSubject ? "" : forms.subjectIds.join(','),
+            subjectIds: forms.isAllSubject ? '' : forms.subjectIds.join(','),
             remark: forms.remark,
             audioPlayTypes: Array.from(audioPlayTypes).join(','),
-            musicalInstrumentIds: forms.isAllSubject ? "" : forms.musicalInstrumentIdList.join(','),
+            musicalInstrumentIds: forms.isAllSubject ? '' : forms.musicalInstrumentIdList.join(','),
             composer: forms.composer,
             musicSheetType: forms.musicSheetType,
             isUseSystemBeat: forms.isUseSystemBeat,
@@ -557,17 +630,21 @@ export default defineComponent({
             isAllSubject: forms.isAllSubject,
             musicSheetExtend: forms.sourceType == 'PLATFORM' ? null : forms.musicSheetExtend,
             isScoreRender: isScoreRender,
-            defaultScoreRender: defaultScoreRender,
+            defaultScoreRender: defaultScoreRender
           }
           if (forms.audioType == 'MIDI') {
             obj.musicSheetSoundList = []
           }
+
+          console.log(obj, 'obj')
+          return
+
           btnLoading.value = true
           if (props.type === 'add') {
             await musicSheetSave(obj)
             message.success('添加成功')
           } else if (props.type === 'edit') {
-            await musicSheetSave({...obj, id: props.data.id})
+            await musicSheetSave({ ...obj, id: props.data.id })
             message.success('修改成功')
           }
           emit('getList')
@@ -608,7 +685,7 @@ export default defineComponent({
             // musicalInstrumentName: state.instrumentIdNameMap.get(item),
             musicalInstrumentName: null,
             solmizationFileUrl: null, // 唱名男
-            femaleSolmizationFileUrl: null, // 唱名女
+            femaleSolmizationFileUrl: null // 唱名女
           })
         }
       })
@@ -622,12 +699,22 @@ export default defineComponent({
       xmlRead.onload = (res) => {
         try {
           gradualData.list = getGradualLengthByXml(res?.target?.result as any).filter(
-              (item: any) => item.length === 2
+            (item: any) => item.length === 2
           )
-        } catch (error) {
-        }
+
+          // 音乐人中有值,则不做更新
+          const result = getXmlInfo(res?.target?.result as any)
+          if (!forms.composer) {
+            forms.composer = result.composer
+          }
+        } 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)))
+          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
@@ -636,7 +723,7 @@ export default defineComponent({
 
         let map = new Map<String, String>()
         for (let i = 0; i < forms.musicSheetSoundList_YY.length; i++) {
-          let track = forms.musicSheetSoundList_YY[i].track;
+          let track = forms.musicSheetSoundList_YY[i].track
           if (track) {
             map.set(track, forms.musicSheetSoundList_YY[i])
           }
@@ -645,20 +732,24 @@ export default defineComponent({
         let newMusicSheetSoundList = []
         let tracks = [] as any
         for (let j = 0; j < state.partListNames.length; j++) {
-          let track = state.partListNames[j].value;
+          let track = state.partListNames[j].value
           if (map.has(track)) {
             newMusicSheetSoundList.push(map.get(track))
           } else {
-            newMusicSheetSoundList.push({audioFileUrl: null, track: track, musicalInstrumentId: null})
+            newMusicSheetSoundList.push({
+              audioFileUrl: null,
+              track: track,
+              musicalInstrumentId: null
+            })
           }
           tracks.push(track)
-          if(!forms.multiTracksSelection.includes(track)) {
+          if (!forms.multiTracksSelection.includes(track)) {
             forms.multiTracksSelection.push(track)
           }
         }
 
         for (let i = 0; i < forms.musicSheetSoundList_YY.length; i++) {
-          let track = forms.musicSheetSoundList_YY[i].track;
+          let track = forms.musicSheetSoundList_YY[i].track
           if (!track || !tracks.includes(track)) {
             forms.musicSheetSoundList_YY[i].track = null
             newMusicSheetSoundList.push(forms.musicSheetSoundList_YY[i])
@@ -703,8 +794,13 @@ export default defineComponent({
 
     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;
+        return (
+          !item.track ||
+          !containOther(item.track) ||
+          (item.track?.toLocaleUpperCase?.() != 'COMMON' &&
+            forms.multiTracksSelection.includes(item.track))
+        )
+      }).length
     }
 
     const parseInstrumentAndSubject = (xml: any) => {
@@ -725,7 +821,7 @@ export default defineComponent({
       initInstrumentAndSubjectByTrack(instrumentCodeList)
     }
 
-    // 通过声轨反显乐器和声部
+    /** 通过声轨反显乐器和声部 */
     const initInstrumentAndSubjectByTrack = async (tracks: string[]) => {
       // 选择一个声轨,独奏
       // 选择了多个声轨,合奏,乐器和声部自动反显,不可修改
@@ -741,31 +837,55 @@ export default defineComponent({
       await initInstrumentAndSubjectByCode(tracks)
     }
 
+    /** 获取分轨名称 */
+    const getInstrumentName = (instruments: any, name = '') => {
+      name = name.toLocaleLowerCase().replace(/ /g, '')
+      if (!name) return ''
+      for (let key of instruments) {
+        const _key = key.toLocaleLowerCase().replace(/ /g, '')
+        if (_key.includes(name)) {
+          return key
+        }
+      }
+      for (let key of instruments) {
+        const _key = key.toLocaleLowerCase().replace(/ /g, '')
+        if (name.includes(_key)) {
+          return key
+        }
+      }
+      return ''
+    }
+
     // 通过乐器编码反显乐器和声部
     const initInstrumentAndSubjectByCode = async (codes: string[]) => {
       forms.musicalInstrumentIdList = []
       forms.subjectIds = []
       const codeIdMap = new Map<string, []>() as any
+      const codeMapKeys: string[] = []
       state.instrumentData.forEach((data: any) => {
         if (!data.disabled) {
           const codes = data.code.split(/[,,]/)
           codes.forEach((code: string) => {
-            let codeTemp = code.replaceAll(' ','').toLowerCase()
+            let codeTemp = code.replaceAll(' ', '').toLowerCase()
+            codeMapKeys.push(codeTemp)
             if (codeIdMap.has(codeTemp)) {
               codeIdMap.get(codeTemp).push(data.id + '')
             } else {
-              const arr = [] as any;
+              const arr = [] as any
               arr.push(data.id + '')
               codeIdMap.set(codeTemp, arr)
             }
           })
         }
       })
+
       for (let i = 0; i < codes.length; i++) {
-        let code = codes[i].replaceAll(' ','').toLowerCase()
-        if (codeIdMap.has(code)) {
-          codeIdMap.get(code).forEach((c: any) => {
-            if (!forms.musicalInstrumentIdList.includes(c)) {
+        let code = codes[i].replaceAll(' ', '').toLowerCase()
+        const tempCode = getInstrumentName(codeMapKeys, code)
+        if (codeIdMap.has(tempCode)) {
+          codeIdMap.get(tempCode).forEach((c: any) => {
+            const index = state.instrumentList.findIndex((item: any) => item.id.toString() === c)
+            if (!forms.musicalInstrumentIdList.includes(c) && index !== -1) {
               forms.musicalInstrumentIdList.push(c)
             }
           })
@@ -784,12 +904,13 @@ export default defineComponent({
       if (!xml) return []
       const xmlParse = new DOMParser().parseFromString(xml, 'text/xml')
       const partList: any =
-          xmlParse.getElementsByTagName('part-list')?.[0]?.getElementsByTagName('score-part') || []
+        xmlParse.getElementsByTagName('part-list')?.[0]?.getElementsByTagName('score-part') || []
       let partListNames = Array.from(partList).map((item: any) => {
         let part = item.getElementsByTagName('part-name')?.[0]
         // evxml没有分轨,需要手动设置一个默认的名称,用于上传原音
         let track = ''
-        if (forms.isEvxml) { // 秒极客曲目,取ID
+        if (forms.isEvxml) {
+          // 秒极客曲目,取ID
           let id = item.getAttribute('id')
           if (id) {
             track = id
@@ -867,8 +988,8 @@ export default defineComponent({
 
     // 反显声部
     const showBackSubject = async (musicalInstrumentIdList: []) => {
-      forms.subjectIds = []
       if (!musicalInstrumentIdList || musicalInstrumentIdList.length == 0) {
+        forms.subjectIds = []
         return
       }
       try {
@@ -878,11 +999,12 @@ export default defineComponent({
           musicalInstrumentIdList: musicalInstrumentIdList
         })
         const tempList = data.rows || []
+        const tempSubject: any[] = []
         tempList.forEach((item: any) => {
-          forms.subjectIds.push(item.id + '')
+          tempSubject.push(item.id + '')
         })
-      } catch {
-      }
+        forms.subjectIds = tempSubject
+      } catch {}
     }
 
     // 添加原音
@@ -914,7 +1036,10 @@ export default defineComponent({
             forms.musicSheetSoundList_YY.splice(index, 1)
           }
 
-          if (state.multiTracks == 'all' && state.partListNames.length != forms.multiTracksSelection.length) {
+          if (
+            state.multiTracks == 'all' &&
+            state.partListNames.length != forms.multiTracksSelection.length
+          ) {
             state.multiTracks = null
           }
         }
@@ -959,8 +1084,8 @@ export default defineComponent({
         state.ownerName += '-' + forms.musicSheetExtend.organizationRole
       } else if (forms.sourceType == 'PERSON') {
         state.ownerName +=
-            '-' +
-            getMapValueByKey(forms.musicSheetExtend.clientType, new Map(Object.entries(clientType)))
+          '-' +
+          getMapValueByKey(forms.musicSheetExtend.clientType, new Map(Object.entries(clientType)))
         if (forms.musicSheetExtend.userName) {
           state.ownerName += '-' + forms.musicSheetExtend.userName
         }
@@ -973,14 +1098,14 @@ export default defineComponent({
     // 声轨数据兼容
     const formatTrack = (track: string) => {
       if (!track) {
-        return '';
+        return ''
       }
-      const trim = track.trim().toUpperCase();
+      const trim = track.trim().toUpperCase()
       // 导入后的脏数据兼容
       if (trim == 'P1' || trim == 'NULL') {
-        return '';
+        return ''
       }
-      return track.trim();
+      return track.trim()
     }
 
     const changeSubject = async (subjectIdList: []) => {
@@ -989,21 +1114,24 @@ export default defineComponent({
         forms.musicalInstrumentIdList = []
         return
       }
-      let enableFlag = null;
+      let enableFlag = null
       if (props.type === 'add') {
-        enableFlag = true;
+        enableFlag = true
       }
       let tempMusicalInstrumentIdList = [] as any
-      const {data} = await musicalInstrumentPage({page: 1, rows: 999, subjectIds: subjectIdList, enableFlag: enableFlag});
+      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
-            }
-        )
+        state.instrumentList.push({
+          label: item.name,
+          value: item.id + '',
+          disabled: !item.enableFlag
+        })
       })
       forms.musicalInstrumentIdList = forms.musicalInstrumentIdList.filter((item: any) => {
         return tempMusicalInstrumentIdList.includes(item)
@@ -1021,7 +1149,7 @@ export default defineComponent({
           return
         }
         try {
-          const {data} = await musicalInstrumentPage({page: 1, rows: 999})
+          const { data } = await musicalInstrumentPage({ page: 1, rows: 999 })
           const tempList = data.rows || []
           tempList.forEach((item: any) => {
             item.label = item.name
@@ -1031,17 +1159,16 @@ export default defineComponent({
             state.instrumentIdNameMap.set(item.id + '', item.name)
 
             forms.musicSheetSoundList_YZ.push({
-              'musicSheetId': props.data.id,
-              'musicalInstrumentId': item.id + '',
-              'musicalInstrumentName': item.name,
-              'audioFileUrl': null,
-              'audioPlayType': 'PLAY'
-            });
+              musicSheetId: props.data.id,
+              musicalInstrumentId: item.id + '',
+              musicalInstrumentName: item.name,
+              audioFileUrl: null,
+              audioPlayType: 'PLAY'
+            })
           })
           state.instrumentData = tempList
           state.instrumentList = deepClone(tempList)
-        } catch {
-        }
+        } catch {}
       }
       state.subjectList = deepClone(props.subjectList)
       state.subjectList.forEach((subject: any) => {
@@ -1052,7 +1179,7 @@ export default defineComponent({
       {
         const appKeys = Object.keys(appKey)
 
-        const {data} = await sysApplicationPage({page: 1, rows: 999, parentId: 0})
+        const { data } = await sysApplicationPage({ page: 1, rows: 999, parentId: 0 })
         const tempList = data.rows || []
         const filter = tempList.filter((next: any) => {
           return appKeys.includes(next.appKey)
@@ -1067,16 +1194,15 @@ export default defineComponent({
       // 获取分类信息
       {
         try {
-          const {data} = await musicSheetCategoriesQueryTree({enable: true})
+          const { data } = await musicSheetCategoriesQueryTree({ enable: true })
           state.musicSheetCategories = filterPointCategory(data, 'musicSheetCategoriesList')
-        } catch (e) {
-        }
+        } catch (e) {}
       }
 
       if (props.type === 'edit' || props.type === 'preview') {
         const detail = props.data
         try {
-          const {data} = await musicSheetDetail({id: detail.id})
+          const { data } = await musicSheetDetail({ id: detail.id })
           forms.details = data
           forms.playMode = data.playMode
           forms.xmlFileUrl = data.xmlFileUrl
@@ -1110,7 +1236,7 @@ export default defineComponent({
               }
             })
             state.subjectList = state.subjectList.filter((subject: any) => {
-              return (!subject.disabled || subjectIds.includes(subject.value));
+              return !subject.disabled || subjectIds.includes(subject.value)
             })
           }
           forms.musicCategoryId = data.musicCategoryId
@@ -1124,18 +1250,19 @@ export default defineComponent({
             forms.repeatedBeats = !!extConfigJson.repeatedBeats
             forms.isEvxml = !!extConfigJson.isEvxml
             forms.repeatedBeatsToSing = !!extConfigJson.repeatedBeatsToSing
-          } catch (error) {
-          }
+          } catch (error) {}
           forms.evaluationStandard = data.evaluationStandard
           forms.musicSheetExtend = data.musicSheetExtend
 
           state.musicSheetSoundList = data.musicSheetSoundList ? data.musicSheetSoundList : []
 
-          let musicSheetAccompanimentList = data.musicSheetAccompanimentList ? data.musicSheetAccompanimentList : []
+          let musicSheetAccompanimentList = data.musicSheetAccompanimentList
+            ? data.musicSheetAccompanimentList
+            : []
           musicSheetAccompanimentList.forEach((next: any) => {
-            let audioPlayType = next.audioPlayType;
+            let audioPlayType = next.audioPlayType
             if (audioPlayType && audioPlayType == 'SING') {
-              state.bSongFile = next.audioFileUrl;
+              state.bSongFile = next.audioFileUrl
               forms.scoreAudioFileUrl = next.scoreAudioFileUrl
             } else {
               state.musicSheetAccompanimentUrl = next.audioFileUrl
@@ -1144,10 +1271,13 @@ export default defineComponent({
 
           // 初始化演奏
           for (let i = 0; i < state.musicSheetSoundList.length; i++) {
-            if (state.musicSheetSoundList[i].audioPlayType == 'SING' && state.musicSheetSoundList[i].track != null) {
+            if (
+              state.musicSheetSoundList[i].audioPlayType == 'SING' &&
+              state.musicSheetSoundList[i].track != null
+            ) {
               // 范唱 唱名
               state.initFSongMap.set(state.musicSheetSoundList[i].track, {
-                ...state.musicSheetSoundList[i],
+                ...state.musicSheetSoundList[i]
                 // musicalInstrumentName: state.instrumentIdNameMap.get(state.musicSheetSoundList[i].musicalInstrumentId),
               })
             } else {
@@ -1156,27 +1286,32 @@ export default defineComponent({
               } else {
                 // 乐器演奏原音
                 for (let j = 0; j < forms.musicSheetSoundList_YZ.length; j++) {
-                  let musicalInstrumentId = state.musicSheetSoundList[i].musicalInstrumentId;
-                  if (musicalInstrumentId && musicalInstrumentId == forms.musicSheetSoundList_YZ[j].musicalInstrumentId) {
-                    forms.musicSheetSoundList_YZ[j].audioFileUrl = state.musicSheetSoundList[i].audioFileUrl
+                  let musicalInstrumentId = state.musicSheetSoundList[i].musicalInstrumentId
+                  if (
+                    musicalInstrumentId &&
+                    musicalInstrumentId == forms.musicSheetSoundList_YZ[j].musicalInstrumentId
+                  ) {
+                    forms.musicSheetSoundList_YZ[j].audioFileUrl =
+                      state.musicSheetSoundList[i].audioFileUrl
                   }
                 }
               }
             }
           }
 
-          forms.musicalInstrumentIdList = data.musicalInstrumentIds ? data.musicalInstrumentIds.split(',') : []
+          forms.musicalInstrumentIdList = data.musicalInstrumentIds
+            ? data.musicalInstrumentIds.split(',')
+            : []
           // 乐器下拉格式化,停用的过滤
           state.instrumentList = state.instrumentList.filter((next: any) => {
-            return (next.enableFlag || forms.musicalInstrumentIdList.includes(next.id + ''));
+            return next.enableFlag || forms.musicalInstrumentIdList.includes(next.id + '')
           })
 
-
           setOwnerName()
           axios.get(data.xmlFileUrl).then((res: any) => {
             if (res?.data) {
               gradualData.list = getGradualLengthByXml(res?.data as any).filter(
-                  (item: any) => item.length === 2
+                (item: any) => item.length === 2
               )
               state.partListNames = getPartListNames(res?.data as any) as any
 
@@ -1185,7 +1320,11 @@ export default defineComponent({
               if (data.multiTracksSelection) {
                 data.multiTracksSelection = data.multiTracksSelection.toLocaleUpperCase()
               }
-              if (!data.multiTracksSelection || data.multiTracksSelection.trim() == '' || data.multiTracksSelection.trim() == 'NULL') {
+              if (
+                !data.multiTracksSelection ||
+                data.multiTracksSelection.trim() == '' ||
+                data.multiTracksSelection.trim() == 'NULL'
+              ) {
                 multiTracksSelection.push('')
               } else {
                 data.multiTracksSelection.split(',').forEach((next: any) => {
@@ -1193,7 +1332,9 @@ export default defineComponent({
                 })
               }
               let names = state.partListNames.map((next: any) => next.label)
-              multiTracksSelection = names.filter((next: any) => multiTracksSelection.includes(next.toLocaleUpperCase()))
+              multiTracksSelection = names.filter((next: any) =>
+                multiTracksSelection.includes(next.toLocaleUpperCase())
+              )
               forms.multiTracksSelection = multiTracksSelection
               // 根据声轨数量判断独奏合奏
               forms.musicSheetType = forms.multiTracksSelection.length > 1 ? 'CONCERT' : 'SINGLE'
@@ -1212,57 +1353,60 @@ export default defineComponent({
               //     forms.multiTracksSelection.push(track)
               //   }
               // } else {
-                const tracks = [] as any
-                state.partListNames.forEach((item: any) => {
-                  let audioFileUrl = null
-                  let musicalInstrumentId = null
-                  if (forms.musicSheetType == 'CONCERT') {
-                    existSoundList.forEach((next: any) => {
-                      if (next.audioPlayType == 'PLAY') {
-                        let track = ''
-                        if (next.track) {
-                          track = next.track.trim()
-                        }
-                        if (track == item.value) {
-                          audioFileUrl = next.audioFileUrl
-                          musicalInstrumentId = next.musicalInstrumentId
-                        }
+              const tracks = [] as any
+              state.partListNames.forEach((item: any) => {
+                let audioFileUrl = null
+                let musicalInstrumentId = null
+                if (forms.musicSheetType == 'CONCERT') {
+                  existSoundList.forEach((next: any) => {
+                    if (next.audioPlayType == 'PLAY') {
+                      let track = ''
+                      if (next.track) {
+                        track = next.track.trim()
                       }
-                    })
-                  }
-                  forms.musicSheetSoundList_YY.push({
-                    audioFileUrl: audioFileUrl, // 原音
-                    musicalInstrumentId: musicalInstrumentId, // 乐器
-                    track: item.value, // 轨道
-                    audioPlayType: 'PLAY'
+                      if (track == item.value) {
+                        audioFileUrl = next.audioFileUrl
+                        musicalInstrumentId = next.musicalInstrumentId
+                      }
+                    }
                   })
-                  tracks.push(item.value)
+                }
+                forms.musicSheetSoundList_YY.push({
+                  audioFileUrl: audioFileUrl, // 原音
+                  musicalInstrumentId: musicalInstrumentId, // 乐器
+                  track: item.value, // 轨道
+                  audioPlayType: 'PLAY'
                 })
+                tracks.push(item.value)
+              })
 
-                if (tracks.length == forms.multiTracksSelection.length) {
-                  state.multiTracks = 'all'
-                }
+              if (tracks.length == forms.multiTracksSelection.length) {
+                state.multiTracks = 'all'
+              }
 
-                // 处理没有声轨,但有原音
-                if (forms.musicSheetType == 'CONCERT') {
-                  state.musicSheetSoundList.forEach((next: any) => {
-                    if (next.audioPlayType == 'PLAY') {
-                      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'
-                        })
-                      }
+              // 处理没有声轨,但有原音
+              if (forms.musicSheetType == 'CONCERT') {
+                state.musicSheetSoundList.forEach((next: any) => {
+                  if (next.audioPlayType == 'PLAY') {
+                    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'
+                      })
                     }
-                  })
+                  }
+                })
                 // }
               }
             }
           })
-        } catch (error) {
-        }
+        } catch (error) {}
       } else {
         // 新增只能使用启用状态的数据
         state.subjectList = state.subjectList.filter((next: any) => {
@@ -1276,1094 +1420,1100 @@ export default defineComponent({
     })
 
     return () => (
-        <div style="background: #fff; padding-top: 12px">
-          <NSpin show={state.loading}>
-            <NForm
-                class={styles.formContainer}
-                model={forms}
-                ref={formsRef}
-                label-placement="left"
-                label-width="150"
-                disabled={state.previewMode}
-            >
-              <NAlert showIcon={false} style={{marginBottom: '12px'}}>
-                基本信息
-              </NAlert>
-              <NGrid cols={2}>
+      <div style="background: #fff; padding-top: 12px">
+        <NSpin show={state.loading}>
+          <NForm
+            class={styles.formContainer}
+            model={forms}
+            ref={formsRef}
+            label-placement="left"
+            label-width="150"
+            disabled={state.previewMode}
+          >
+            <NAlert showIcon={false} style={{ marginBottom: '12px' }}>
+              基本信息
+            </NAlert>
+            <NGrid cols={2}>
+              <NFormItemGi
+                label="曲目名称"
+                path="name"
+                rule={[
+                  {
+                    required: true,
+                    message: '请输入曲目名称',
+                    trigger: ['input', 'blur']
+                  }
+                ]}
+              >
+                <NInput
+                  v-model:value={forms.name}
+                  placeholder="请输入曲目名称"
+                  maxlength={50}
+                  showCount
+                />
+              </NFormItemGi>
+              <NFormItemGi
+                label="音乐人"
+                path="composer"
+                rule={[
+                  {
+                    required: false,
+                    message: '请输入音乐人',
+                    trigger: ['input', 'blur']
+                  }
+                ]}
+              >
+                <NInput
+                  v-model:value={forms.composer}
+                  placeholder="请输入音乐人名称"
+                  showCount
+                  maxlength={14}
+                />
+              </NFormItemGi>
+            </NGrid>
+            <NGrid cols={2}>
+              <NFormItemGi
+                label="曲目封面"
+                path="musicCover"
+                rule={[
+                  {
+                    required: false,
+                    message: '请上传曲目封面',
+                    trigger: ['input', 'blur']
+                  }
+                ]}
+              >
+                <UploadFile
+                  desc={'封面图'}
+                  disabled={state.previewMode}
+                  accept=".jpg,.jpeg,.png"
+                  tips="请上传大小1M以内的JPG、PNG图片"
+                  size={1}
+                  v-model:fileList={forms.musicCover}
+                  cropper
+                  bucketName="cbs"
+                  options={{
+                    autoCrop: true, //是否默认生成截图框
+                    enlarge: 2, //  图片放大倍数
+                    autoCropWidth: 200, //默框高度
+                    fixedBox: true, //是否固定截图框大认生成截图框宽度
+                    autoCropHeight: 200, //默认生成截图小 不允许改变
+                    previewsCircle: false, //预览图是否是原圆形
+                    title: '曲目封面'
+                  }}
+                />
+              </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>
+            <NGrid cols={2}>
+              <NFormItemGi
+                label="作者属性"
+                path="sourceType"
+                rule={[
+                  {
+                    required: true,
+                    message: '请选择作者属性',
+                    trigger: 'change'
+                  }
+                ]}
+              >
+                <NSelect
+                  v-model:value={forms.sourceType}
+                  options={getSelectDataFromObj(musicSheetSourceType)}
+                  placeholder="请选择作者属性"
+                  onUpdateValue={() => {
+                    // 发送变化,清理选择的所属人信息
+                    forms.musicSheetExtend = {}
+                    state.ownerName = null
+                    // forms.musicSheetExtend.userId = null
+                    // forms.musicSheetExtend.userName = null
+                    // forms.musicSheetExtend.applicationId = null
+                    // forms.musicSheetExtend.organizationRoleId = null
+                  }}
+                />
+              </NFormItemGi>
+              {forms.sourceType === 'PERSON' && (
                 <NFormItemGi
-                    label="曲目名称"
-                    path="name"
-                    rule={[
-                      {
-                        required: true,
-                        message: '请输入曲目名称',
-                        trigger: ['input', 'blur']
-                      }
-                    ]}
+                  label="所属人"
+                  path="musicSheetExtend.userId"
+                  rule={[
+                    {
+                      required: true,
+                      message: '请选择曲目所属人',
+                      trigger: ['input', 'change']
+                    }
+                  ]}
                 >
-                  <NInput
-                      v-model:value={forms.name}
-                      placeholder="请输入曲目名称"
-                      maxlength={50}
-                      showCount
-                  />
+                  <NButton
+                    disabled={state.previewMode || !forms.sourceType}
+                    type="primary"
+                    size="small"
+                    text
+                    //v-auth="orchestraSubsidyStandard/update1597887579789053953"
+                    onClick={() => {
+                      state.showMusicSheetOwnerDialog = true
+                    }}
+                  >
+                    {state.ownerName ? state.ownerName : '请选择所属人'}
+                  </NButton>
                 </NFormItemGi>
+              )}
+              {forms.sourceType === 'ORG' && (
                 <NFormItemGi
-                    label="音乐人"
-                    path="composer"
-                    rule={[
-                      {
-                        required: false,
-                        message: '请输入音乐人',
-                        trigger: ['input', 'blur']
-                      }
-                    ]}
+                  label="所属人"
+                  path="musicSheetExtend.organizationRoleId"
+                  rule={[
+                    {
+                      required: true,
+                      message: '请选择曲目所属机构',
+                      trigger: ['input', 'change']
+                    }
+                  ]}
                 >
-                  <NInput
-                      v-model:value={forms.composer}
-                      placeholder="请输入音乐人名称"
-                      showCount
-                      maxlength={14}
-                  />
+                  <NButton
+                    disabled={state.previewMode || !forms.sourceType}
+                    type="primary"
+                    size="small"
+                    text
+                    //v-auth="orchestraSubsidyStandard/update1597887579789053953"
+                    onClick={() => {
+                      state.showMusicSheetOwnerDialog = true
+                    }}
+                  >
+                    {state.ownerName ? state.ownerName : '请选择所属机构'}
+                  </NButton>
                 </NFormItemGi>
-              </NGrid>
-              <NGrid cols={2}>
-                <NFormItemGi
-                    label="曲目封面"
-                    path="musicCover"
-                    rule={[
+              )}
+            </NGrid>
+            <NGrid cols={2}>
+              <NFormItemGi
+                label="审核版本"
+                path="appAuditFlag"
+                rule={[
+                  {
+                    required: true,
+                    message: '请选择审核版本',
+                    trigger: 'change',
+                    type: 'number'
+                  }
+                ]}
+              >
+                <NSelect
+                  options={
+                    [
+                      {
+                        label: '是',
+                        value: 1
+                      },
                       {
-                        required: false,
-                        message: '请上传曲目封面',
-                        trigger: ['input', 'blur']
+                        label: '否',
+                        value: 0
                       }
-                    ]}
+                    ] as any
+                  }
+                  v-model:value={forms.appAuditFlag}
+                />
+              </NFormItemGi>
+            </NGrid>
+            <NAlert showIcon={false} style={{ marginBottom: '12px' }}>
+              曲目设置
+            </NAlert>
+            <NGrid cols={2}>
+              <NFormItemGi
+                label="播放模式"
+                path="playMode"
+                rule={[
+                  {
+                    required: true,
+                    message: '请选择播放模式'
+                  }
+                ]}
+              >
+                <NRadioGroup
+                  v-model:value={forms.playMode}
+                  onUpdateValue={(value: string | number | boolean) => {
+                    if (value === 'MP3') {
+                      forms.playMode = 'MP3'
+                    } else {
+                      forms.playMode = 'MIDI'
+                    }
+                  }}
                 >
-                  <UploadFile
-                      desc={'封面图'}
-                      disabled={state.previewMode}
-                      accept=".jpg,.jpeg,.png"
-                      tips="请上传大小1M以内的JPG、PNG图片"
-                      size={1}
-                      v-model:fileList={forms.musicCover}
-                      cropper
-                      bucketName="cbs"
-                      options={{
-                        autoCrop: true, //是否默认生成截图框
-                        enlarge: 2, //  图片放大倍数
-                        autoCropWidth: 200, //默框高度
-                        fixedBox: true, //是否固定截图框大认生成截图框宽度
-                        autoCropHeight: 200, //默认生成截图小 不允许改变
-                        previewsCircle: false, //预览图是否是原圆形
-                        title: '曲目封面'
-                      }}
-                  />
-                </NFormItemGi>
+                  <NRadio value="MP3">MP3</NRadio>
+                  {/*{forms.playMode == 'MIDI' && (<NRadio value="MIDI">MID</NRadio>)}*/}
+                </NRadioGroup>
+              </NFormItemGi>
+              {forms.playMode === 'MP3' && (
                 <NFormItemGi
-                    label="曲目分类"
-                    path="musicCategoryId"
-                    rule={[
-                      {
-                        required: true,
-                        message: '请选择曲目分类',
-                        trigger: ['change']
-                      }
-                    ]}
+                  label="伴奏类型"
+                  path="audioType"
+                  rule={[
+                    {
+                      required: true,
+                      message: '请选择伴奏类型'
+                    }
+                  ]}
                 >
-                  <NCascader
-                      valueField="id"
-                      labelField="name"
-                      children-field="musicSheetCategoriesList"
-                      placeholder="请选择分类"
-                      v-model:value={forms.musicCategoryId}
-                      options={state.musicSheetCategories}
-                      clearable
-                  />
+                  <NRadioGroup v-model:value={forms.audioType}>
+                    <NRadio value={'HOMEMODE'}>自制伴奏</NRadio>
+                    <NRadio value={'COMMON'}>普通伴奏</NRadio>
+                  </NRadioGroup>
                 </NFormItemGi>
-              </NGrid>
+              )}
+            </NGrid>
+            <NGrid cols={2}>
+              <NFormItemGi
+                label="上传XML"
+                path="xmlFileUrl"
+                rule={[
+                  {
+                    required: true,
+                    message: '请选择上传XML',
+                    trigger: ['change', 'input']
+                  }
+                ]}
+              >
+                <UploadFile
+                  desc={'XML文件'}
+                  disabled={state.previewMode}
+                  size={30}
+                  key={'xmlFileUrl'}
+                  v-model:fileList={forms.xmlFileUrl}
+                  tips="仅支持上传.xml/.mxml格式文件"
+                  listType="image"
+                  accept=".xml,.mxml,.evxml"
+                  bucketName="cloud-coach"
+                  text="点击上传XML文件"
+                  onReadFileInputEventAsArrayBuffer={readFileInputEventAsArrayBuffer}
+                  onRemove={() => {
+                    // forms.multiTracksSelection = []
+                    // state.partListNames = []
+                    // forms.musicSheetSoundList_YY = []
+                    // forms.musicalInstrumentIdList = []
+                    // forms.subjectIds = []
+                  }}
+                />
+              </NFormItemGi>
+              <NFormItemGi
+                label="评分标准"
+                path="evaluationStandard"
+                rule={[
+                  {
+                    required: true
+                  }
+                ]}
+              >
+                <NRadioGroup v-model:value={forms.evaluationStandard}>
+                  <NRadio value={'FREQUENCY'}>标准评测</NRadio>
+                  <NRadio value={'AMPLITUDE'}>打击乐(振幅)</NRadio>
+                  <NRadio value={'DECIBELS'}>节奏(分贝)</NRadio>
+                </NRadioGroup>
+              </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>
+              <NFormItemGi
+                label="速度"
+                path="playSpeed"
+                rule={[
+                  {
+                    required: false,
+                    message: '请输入速度'
+                  }
+                ]}
+              >
+                <NInputNumber
+                  placeholder="请输入速度"
+                  v-model:value={forms.playSpeed}
+                  min={0}
+                  style="width:100%"
+                />
+              </NFormItemGi>
+            </NGrid>
+            {!forms.isAllSubject && (
               <NGrid cols={2}>
                 <NFormItemGi
-                    label="作者属性"
-                    path="sourceType"
-                    rule={[
-                      {
-                        required: true,
-                        message: '请选择作者属性',
-                        trigger: 'change'
-                      }
-                    ]}
+                  label="可用乐器"
+                  path="musicalInstrumentIdList"
+                  rule={[
+                    {
+                      required: true,
+                      message: '请选择可用乐器',
+                      trigger: 'change',
+                      type: 'array'
+                    }
+                  ]}
                 >
                   <NSelect
-                      v-model:value={forms.sourceType}
-                      options={getSelectDataFromObj(musicSheetSourceType)}
-                      placeholder="请选择作者属性"
-                      onUpdateValue={() => {
-                        // 发送变化,清理选择的所属人信息
-                        forms.musicSheetExtend = {}
-                        state.ownerName = null
-                        // forms.musicSheetExtend.userId = null
-                        // forms.musicSheetExtend.userName = null
-                        // forms.musicSheetExtend.applicationId = null
-                        // forms.musicSheetExtend.organizationRoleId = null
-                      }}
+                    placeholder="请选择可用乐器"
+                    options={state.instrumentList}
+                    v-model:value={forms.musicalInstrumentIdList}
+                    // disabled = {state.instrumentDisabled}
+                    clearable
+                    multiple
+                    filterable
+                    maxTagCount={10}
+                    onUpdateValue={async (value: any) => {
+                      await showBackSubject(value)
+                    }}
                   />
                 </NFormItemGi>
-                {forms.sourceType === 'PERSON' && (
-                    <NFormItemGi
-                        label="所属人"
-                        path="musicSheetExtend.userId"
-                        rule={[
-                          {
-                            required: true,
-                            message: '请选择曲目所属人',
-                            trigger: ['input', 'change']
-                          }
-                        ]}
-                    >
-                      <NButton
-                          disabled={state.previewMode || !forms.sourceType}
-                          type="primary"
-                          size="small"
-                          text
-                          //v-auth="orchestraSubsidyStandard/update1597887579789053953"
-                          onClick={() => {
-                            state.showMusicSheetOwnerDialog = true
-                          }}
-                      >
-                        {state.ownerName ? state.ownerName : '请选择所属人'}
-                      </NButton>
-                    </NFormItemGi>
-                )}
-                {forms.sourceType === 'ORG' && (
-                    <NFormItemGi
-                        label="所属人"
-                        path="musicSheetExtend.organizationRoleId"
-                        rule={[
-                          {
-                            required: true,
-                            message: '请选择曲目所属机构',
-                            trigger: ['input', 'change']
-                          }
-                        ]}
-                    >
-                      <NButton
-                          disabled={state.previewMode || !forms.sourceType}
-                          type="primary"
-                          size="small"
-                          text
-                          //v-auth="orchestraSubsidyStandard/update1597887579789053953"
-                          onClick={() => {
-                            state.showMusicSheetOwnerDialog = true
-                          }}
-                      >
-                        {state.ownerName ? state.ownerName : '请选择所属机构'}
-                      </NButton>
-                    </NFormItemGi>
-                )}
-              </NGrid>
-              <NGrid cols={2}>
                 <NFormItemGi
-                    label="审核版本"
-                    path="appAuditFlag"
-                    rule={[
-                      {
-                        required: true,
-                        message: '请选择审核版本',
-                        trigger: 'change',
-                        type: 'number'
-                      }
-                    ]}
+                  label="可用声部"
+                  path="subjectIds"
+                  rule={[
+                    {
+                      required: true,
+                      message: '请选择可用声部',
+                      trigger: 'change',
+                      type: 'array'
+                    }
+                  ]}
                 >
                   <NSelect
-                      options={
-                        [
-                          {
-                            label: '是',
-                            value: 1
-                          },
-                          {
-                            label: '否',
-                            value: 0
-                          }
-                        ] as any
-                      }
-                      v-model:value={forms.appAuditFlag}
+                    v-model:value={forms.subjectIds}
+                    options={state.subjectList}
+                    // disabled={true}
+                    multiple
+                    filterable
+                    clearable
+                    placeholder="请选择可用声部"
+                    maxTagCount={10}
+                    onUpdateValue={async (val: any) => {
+                      // await changeSubject(val)
+                    }}
                   />
                 </NFormItemGi>
               </NGrid>
-              <NAlert showIcon={false} style={{marginBottom: '12px'}}>
-                曲目设置
-              </NAlert>
-              <NGrid cols={2}>
-                <NFormItemGi
-                    label="播放模式"
-                    path="playMode"
-                    rule={[
-                      {
-                        required: true,
-                        message: '请选择播放模式'
-                      }
-                    ]}
-                >
-                  <NRadioGroup
-                      v-model:value={forms.playMode}
-                      onUpdateValue={(value: string | number | boolean) => {
-                        if (value === 'MP3') {
-                          forms.playMode = 'MP3'
-                        } else {
-                          forms.playMode = 'MIDI'
-                        }
+            )}
+            <NGrid cols={1}>
+              <NFormItemGi
+                label={'切换声轨'}
+                path="multiTracksSelection"
+                rule={[
+                  {
+                    required: true,
+                    message: `请选择切换声轨`,
+                    trigger: 'change',
+                    type: 'array'
+                  }
+                ]}
+              >
+                <NGrid style="padding-top: 4px;">
+                  <NGi span={24}>
+                    <NRadioGroup
+                      v-model:value={state.multiTracks}
+                      onUpdateValue={(value) => {
+                        checkMultiTracks(value)
                       }}
-                  >
-                    <NRadio value="MP3">MP3</NRadio>
-                    {/*{forms.playMode == 'MIDI' && (<NRadio value="MIDI">MID</NRadio>)}*/}
-                  </NRadioGroup>
-                </NFormItemGi>
-                {forms.playMode === 'MP3' && (
-                    <NFormItemGi
-                        label="伴奏类型"
-                        path="audioType"
+                    >
+                      <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: true,
-                            message: '请选择伴奏类型'
+                            required: false
                           }
                         ]}
-                    >
-                      <NRadioGroup v-model:value={forms.audioType}>
-                        <NRadio value={'HOMEMODE'}>自制伴奏</NRadio>
-                        <NRadio value={'COMMON'}>普通伴奏</NRadio>
-                      </NRadioGroup>
-                    </NFormItemGi>
-                )}
-              </NGrid>
+                      >
+                        <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>
+                                <NCheckbox value={item.value} label={item.label} />
+                              </NGi>
+                            ))}
+                          </NGrid>
+                        </NCheckboxGroup>
+                      </NFormItemGi>
+                    </NGi>
+                  )}
+                </NGrid>
+              </NFormItemGi>
+            </NGrid>
+            {forms.multiTracksSelection.length > 1 && (
               <NGrid cols={2}>
                 <NFormItemGi
-                    label="上传XML"
-                    path="xmlFileUrl"
-                    rule={[
-                      {
-                        required: true,
-                        message: '请选择上传XML',
-                        trigger: ['change', 'input']
-                      }
-                    ]}
+                  label="总谱渲染"
+                  path="isScoreRender"
+                  rule={[
+                    {
+                      required: true,
+                      message: '请选择总谱渲染'
+                    }
+                  ]}
                 >
-                  <UploadFile
-                      desc={'XML文件'}
-                      disabled={state.previewMode}
-                      size={30}
-                      key={'xmlFileUrl'}
-                      v-model:fileList={forms.xmlFileUrl}
-                      tips="仅支持上传.xml/.mxml格式文件"
-                      listType="image"
-                      accept=".xml,.mxml,.evxml"
-                      bucketName="cloud-coach"
-                      text="点击上传XML文件"
-                      onReadFileInputEventAsArrayBuffer={readFileInputEventAsArrayBuffer}
-                      onRemove={() => {
-                        // forms.multiTracksSelection = []
-                        // state.partListNames = []
-                        // forms.musicSheetSoundList_YY = []
-                        // forms.musicalInstrumentIdList = []
-                        // forms.subjectIds = []
-                      }}
-                  />
+                  <NRadioGroup v-model:value={forms.isScoreRender}>
+                    <NRadio value={true}>支持</NRadio>
+                    <NRadio value={false}>不支持</NRadio>
+                  </NRadioGroup>
                 </NFormItemGi>
                 <NFormItemGi
-                    label="评分标准"
-                    path="evaluationStandard"
-                    rule={[
-                      {
-                        required: true
-                      }
-                    ]}
+                  label="默认显示"
+                  path="defaultScoreRender"
+                  rule={[
+                    {
+                      required: false
+                    }
+                  ]}
                 >
-                  <NRadioGroup v-model:value={forms.evaluationStandard}>
-                    <NRadio value={'FREQUENCY'}>标准评测</NRadio>
-                    <NRadio value={'AMPLITUDE'}>打击乐(振幅)</NRadio>
-                    <NRadio value={'DECIBELS'}>节奏(分贝)</NRadio>
+                  <NRadioGroup v-model:value={forms.defaultScoreRender}>
+                    <NRadio value={true}>总谱</NRadio>
+                    <NRadio value={false}>分轨</NRadio>
                   </NRadioGroup>
                 </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>*/}
+            )}
+            <NAlert showIcon={false} style={{ marginBottom: '12px' }}>
+              演唱文件
+            </NAlert>
+            <NGrid cols={2}>
+              <NFormItemGi
+                label="是否播放节拍器"
+                path="isPlaySingBeat"
+                rule={[
+                  {
+                    required: true,
+                    message: '请选择是否播放节拍器'
+                  }
+                ]}
+              >
+                <NRadioGroup v-model:value={forms.isPlaySingBeat}>
+                  <NRadio value={true}>是</NRadio>
+                  <NRadio value={false}>否</NRadio>
+                </NRadioGroup>
+              </NFormItemGi>
+              {forms.isPlaySingBeat && (
                 <NFormItemGi
-                    label="是否全声部"
-                    path="isAllSubject"
-                    rule={[
-                      {
-                        required: true,
-                        message: '是否全声部',
-                      }
-                    ]}
+                  label="播放方式"
+                  path="isUseSingSystemBeat"
+                  rule={[
+                    {
+                      required: true,
+                      message: '请选择播放方式'
+                    }
+                  ]}
                 >
-                  <NRadioGroup v-model:value={forms.isAllSubject}>
-                    <NRadio value={false}>否</NRadio>
-                    <NRadio value={true}>是</NRadio>
+                  <NRadioGroup v-model:value={forms.isUseSingSystemBeat}>
+                    <NRadio value={true}>系统节拍器</NRadio>
+                    <NRadio value={false}>MP3节拍器</NRadio>
                   </NRadioGroup>
                 </NFormItemGi>
-                <NFormItemGi
-                    label="速度"
-                    path="playSpeed"
-                    rule={[
-                      {
-                        required: false,
-                        message: '请输入速度'
-                      }
-                    ]}
-                >
-                  <NInputNumber
-                      placeholder="请输入速度"
-                      v-model:value={forms.playSpeed}
-                      min={0}
-                      style="width:100%"
-                  />
-                </NFormItemGi>
-              </NGrid>
-              {!forms.isAllSubject && (
-                  <NGrid cols={2}>
-                    <NFormItemGi
-                        label="可用乐器"
-                        path="musicalInstrumentIdList"
-                        rule={[
-                          {
-                            required: true,
-                            message: '请选择可用乐器',
-                            trigger: 'change',
-                            type: 'array'
-                          }
-                        ]}
-                    >
-                      <NSelect
-                          placeholder="请选择可用乐器"
-                          options={state.instrumentList}
-                          v-model:value={forms.musicalInstrumentIdList}
-                          // disabled = {state.instrumentDisabled}
-                          clearable
-                          multiple
-                          filterable
-                          maxTagCount={10}
-                          onUpdateValue={async (value: any) => {
-                            await showBackSubject(value)
-                          }}
-                      />
-                    </NFormItemGi>
+              )}
+            </NGrid>
+            <NGrid cols={2}>
+              <NFormItemGi
+                label="重复节拍时长"
+                path="repeatedBeatsToSing"
+                rule={[
+                  {
+                    required: false,
+                    message: '请选择是否重复节拍时长'
+                  }
+                ]}
+              >
+                <NRadioGroup v-model:value={forms.repeatedBeatsToSing}>
+                  <NRadio value={true}>是</NRadio>
+                  <NRadio value={false}>否</NRadio>
+                </NRadioGroup>
+              </NFormItemGi>
+            </NGrid>
+            <NGrid cols={2}>
+              <NFormItemGi
+                label="上传伴唱"
+                path="bSongFile"
+                rule={[
+                  {
+                    required: false
+                  }
+                ]}
+              >
+                <UploadFile
+                  desc={'上传伴唱'}
+                  disabled={state.previewMode}
+                  size={30}
+                  v-model:fileList={state.bSongFile}
+                  tips="仅支持上传.mp3格式文件"
+                  listType="image"
+                  accept=".mp3"
+                  bucketName="cloud-coach"
+                  text="点击上传伴唱文件"
+                />
+              </NFormItemGi>
+            </NGrid>
+            {forms.fSongList.length > 0 &&
+              forms.fSongList.map((item: any) => {
+                return (
+                  <NGrid class={styles.audioSection}>
                     <NFormItemGi
-                        label="可用声部"
-                        path="subjectIds"
-                        rule={[
-                          {
-                            required: true,
-                            message: '请选择可用声部',
-                            trigger: 'change',
-                            type: 'array'
-                          }
-                        ]}
+                      span={12}
+                      label={item.track + '范唱'}
+                      path={item.audioFileUrl}
+                      rule={[
+                        {
+                          required: false
+                        }
+                      ]}
                     >
-                      <NSelect
-                          v-model:value={forms.subjectIds}
-                          options={state.subjectList}
-                          // disabled={true}
-                          multiple
-                          filterable
-                          clearable
-                          placeholder="请选择可用声部"
-                          maxTagCount={10}
-                          onUpdateValue={async (val: any) => {
-                            // await changeSubject(val)
-                          }}
+                      <UploadFile
+                        desc={'上传范唱'}
+                        disabled={state.previewMode}
+                        size={100}
+                        v-model:fileList={item.audioFileUrl}
+                        tips="仅支持上传.mp3格式文件"
+                        listType="image"
+                        accept=".mp3"
+                        bucketName="cloud-coach"
+                        text={'点击上传范唱文件'}
                       />
                     </NFormItemGi>
                   </NGrid>
-              )}
-              <NGrid cols={1}>
+                )
+              })}
+            {forms.multiTracksSelection.length > 1 && forms.isScoreRender && (
+              <NGrid cols={2} class={styles.audioSection}>
                 <NFormItemGi
-                    label={'切换声轨'}
-                    path="multiTracksSelection"
-                    rule={[
-                      {
-                        required: true,
-                        message: `请选择切换声轨`,
-                        trigger: 'change',
-                        type: 'array'
-                      }
-                    ]}
+                  label="总谱范唱"
+                  path="scoreRenderFile"
+                  rule={[
+                    {
+                      required: false
+                    }
+                  ]}
                 >
-                  <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}
-                                            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>
-                                      <NCheckbox value={item.value} label={item.label}/>
-                                    </NGi>
-                                ))}
-                              </NGrid>
-                            </NCheckboxGroup>
-                          </NFormItemGi>
-                        </NGi>
-                    )}
-                  </NGrid>
+                  <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.multiTracksSelection.length > 1 && (
+            )}
+            {forms.fSongList.length > 0 &&
+              forms.fSongList.map((item: any) => {
+                return (
                   <NGrid cols={2}>
                     <NFormItemGi
-                        label="总谱渲染"
-                        path="isScoreRender"
-                        rule={[
-                          {
-                            required: true,
-                            message: '请选择总谱渲染'
-                          }
-                        ]}
+                      label={item.track + '唱名(男)'}
+                      path={item.solmizationFileUrl}
+                      rule={[
+                        {
+                          required: false
+                        }
+                      ]}
                     >
-                      <NRadioGroup
-                          v-model:value={forms.isScoreRender}
-                      >
-                        <NRadio value={true}>支持</NRadio>
-                        <NRadio value={false}>不支持</NRadio>
-                      </NRadioGroup>
+                      <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="默认显示"
-                        path="defaultScoreRender"
-                        rule={[
-                          {
-                            required: false,
-                          }
-                        ]}
+                      label={item.track + '唱名(女)'}
+                      path={item.femaleSolmizationFileUrl}
+                      rule={[
+                        {
+                          required: false
+                        }
+                      ]}
                     >
-                      <NRadioGroup
-                          v-model:value={forms.defaultScoreRender}
-                      >
-                        <NRadio value={true}>总谱</NRadio>
-                        <NRadio value={false}>分轨</NRadio>
-                      </NRadioGroup>
+                      <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>
-              <NGrid cols={2}>
+                )
+              })}
+            <NAlert showIcon={false} style={{ marginBottom: '12px' }}>
+              演奏文件
+            </NAlert>
+            <NGrid cols={2}>
+              <NFormItemGi
+                label="是否播放节拍器"
+                path="isPlayBeat"
+                rule={[
+                  {
+                    required: true,
+                    message: '请选择是否播放节拍器'
+                  }
+                ]}
+              >
+                <NRadioGroup v-model:value={forms.isPlayBeat}>
+                  <NRadio value={true}>是</NRadio>
+                  <NRadio value={false}>否</NRadio>
+                </NRadioGroup>
+              </NFormItemGi>
+              {forms.isPlayBeat && (
                 <NFormItemGi
-                    label="是否播放节拍器"
-                    path="isPlaySingBeat"
-                    rule={[
-                      {
-                        required: true,
-                        message: '请选择是否播放节拍器'
-                      }
-                    ]}
+                  label="播放方式"
+                  path="isUseSystemBeat"
+                  rule={[
+                    {
+                      required: true,
+                      message: '请选择播放方式'
+                    }
+                  ]}
                 >
-                  <NRadioGroup v-model:value={forms.isPlaySingBeat}>
-                    <NRadio value={true}>是</NRadio>
-                    <NRadio value={false}>否</NRadio>
+                  <NRadioGroup v-model:value={forms.isUseSystemBeat}>
+                    <NRadio value={true}>系统节拍器</NRadio>
+                    <NRadio value={false}>MP3节拍器</NRadio>
                   </NRadioGroup>
                 </NFormItemGi>
-                {forms.isPlaySingBeat && (
-                    <NFormItemGi
-                        label="播放方式"
-                        path="isUseSingSystemBeat"
-                        rule={[
-                          {
-                            required: true,
-                            message: '请选择播放方式'
-                          }
-                        ]}
-                    >
-                      <NRadioGroup v-model:value={forms.isUseSingSystemBeat}>
-                        <NRadio value={true}>系统节拍器</NRadio>
-                        <NRadio value={false}>MP3节拍器</NRadio>
-                      </NRadioGroup>
-                    </NFormItemGi>
-                )}
-              </NGrid>
-              <NGrid cols={2}>
+              )}
+            </NGrid>
+            <NGrid cols={2}>
+              <NFormItemGi
+                label="重复节拍时长"
+                path="repeatedBeats"
+                rule={[
+                  {
+                    required: false,
+                    message: '请选择是否重复节拍时长'
+                  }
+                ]}
+              >
+                <NRadioGroup v-model:value={forms.repeatedBeats}>
+                  <NRadio value={true}>是</NRadio>
+                  <NRadio value={false}>否</NRadio>
+                </NRadioGroup>
+              </NFormItemGi>
+              <NFormItemGi
+                label="是否显示指法"
+                path="isShowFingering"
+                rule={[
+                  {
+                    required: true,
+                    message: '请选择是否显示指法'
+                  }
+                ]}
+              >
+                <NRadioGroup v-model:value={forms.isShowFingering}>
+                  <NRadio value={true}>是</NRadio>
+                  <NRadio value={false}>否</NRadio>
+                </NRadioGroup>
+              </NFormItemGi>
+            </NGrid>
+            <NGrid cols={2}>
+              {forms.playMode === 'MP3' && (
                 <NFormItemGi
-                    label="重复节拍时长"
-                    path="repeatedBeatsToSing"
-                    rule={[
-                      {
-                        required: false,
-                        message: '请选择是否重复节拍时长'
-                      }
-                    ]}
+                  label="上传伴奏"
+                  path="musicSheetAccompanimentList"
+                  rule={[
+                    {
+                      required: false,
+                      message: '请选择上传.mp3'
+                    }
+                  ]}
                 >
-                  <NRadioGroup v-model:value={forms.repeatedBeatsToSing}>
-                    <NRadio value={true}>是</NRadio>
-                    <NRadio value={false}>否</NRadio>
-                  </NRadioGroup>
+                  <UploadFile
+                    disabled={state.previewMode}
+                    size={30}
+                    v-model:fileList={state.musicSheetAccompanimentUrl}
+                    tips="仅支持上传.mp3格式文件"
+                    listType="image"
+                    accept=".mp3"
+                    bucketName="cloud-coach"
+                    text="点击上传伴奏文件"
+                    max={1}
+                    desc={'上传伴奏文件'}
+                    // onReadFileInputEventAsArrayBuffer={readFileInputEventAsArrayBuffer}
+                  />
                 </NFormItemGi>
-              </NGrid>
-              <NGrid cols={2}>
+              )}
+              {forms.isAllSubject && forms.musicSheetType == 'SINGLE' && (
                 <NFormItemGi
-                    label="上传伴唱"
-                    path="bSongFile"
-                    rule={[
-                      {
-                        required: false,
-                      }
-                    ]}
+                  label="上传原音"
+                  path="musicSheetSoundList_all_subject"
+                  rule={[
+                    {
+                      required: false,
+                      message: '请选择上传原音',
+                      trigger: ['change', 'input']
+                    }
+                  ]}
                 >
                   <UploadFile
-                      desc={'上传伴唱'}
-                      disabled={state.previewMode}
-                      size={30}
-                      v-model:fileList={state.bSongFile}
-                      tips="仅支持上传.mp3格式文件"
-                      listType="image"
-                      accept=".mp3"
-                      bucketName="cloud-coach"
-                      text="点击上传伴唱文件"
+                    desc={'上传原音'}
+                    disabled={state.previewMode}
+                    size={30}
+                    max={1}
+                    v-model:fileList={forms.musicSheetSoundList_all_subject}
+                    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}
+              )}
+            </NGrid>
+
+            {/*渐变速*/}
+            {!!gradualData.list.length && (
+              <>
+                <NAlert showIcon={false} type="info">
+                  识别到共1处渐变速度,请输入Dorico对应小节时间信息
+                </NAlert>
+                <NFormItem label="rit." required style={{ marginTop: '10px' }}>
+                  <NSpace vertical>
+                    {gradualData.list.map((n: any, ni: number) => (
+                      <NInputGroup>
+                        <NFormItem
+                          path={`graduals.${n[0].measureIndex}`}
                           rule={[
+                            { required: true, message: '请输入合奏曲目时间' },
                             {
-                              required: false,
+                              pattern: /^((\d{2}):?){2,3}$/,
+                              message: '请输入正确的曲目时间',
+                              trigger: 'blur'
                             }
                           ]}
-                      >
-                        <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}
+                        >
+                          <NInputGroup>
+                            <NInputGroupLabel>{n[0].measureIndex}小节开始</NInputGroupLabel>
+                            <NInput
+                              placeholder="00:00:00"
+                              v-model:value={forms.graduals[n[0].measureIndex]}
+                            ></NInput>
+                          </NInputGroup>
+                        </NFormItem>
+                        <div style={{ lineHeight: '30px', padding: '0 4px' }}>~</div>
+                        <NFormItem
+                          path={`graduals.${n[1].measureIndex}`}
                           rule={[
+                            { required: true, message: '请输入合奏曲目时间' },
                             {
-                              required: false,
+                              pattern: /^((\d{2}):?){2,3}$/,
+                              message: '请输入正确的曲目时间',
+                              trigger: 'blur'
                             }
                           ]}
-                      >
-                        <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}
+                        >
+                          <NInputGroup>
+                            <NInput
+                              placeholder="00:00:00"
+                              v-model:value={forms.graduals[n[1].measureIndex]}
+                            ></NInput>
+                            <NInputGroupLabel>{n[1].measureIndex}小节结束</NInputGroupLabel>
+                          </NInputGroup>
+                        </NFormItem>
+                      </NInputGroup>
+                    ))}
+                  </NSpace>
+                </NFormItem>
+              </>
+            )}
+            {/*独奏*/}
+            {forms.musicSheetType == 'SINGLE' &&
+              forms.playMode === 'MP3' &&
+              !forms.isAllSubject &&
+              forms.musicSheetSoundList_YZ.map((item: any, index: any) => {
+                return (
+                  <>
+                    {forms.musicalInstrumentIdList.includes(item.musicalInstrumentId) && (
+                      <NGrid class={styles.audioSection}>
+                        <NFormItemGi
+                          span={12}
+                          label={item.musicalInstrumentName}
+                          path={`musicSheetSoundList_YZ[${index}].audioFileUrl`}
                           rule={[
                             {
                               required: false,
+                              message: `请上传乐器演奏文件`
                             }
                           ]}
-                      >
-                        <UploadFile
-                            desc={'上传范唱'}
+                        >
+                          <UploadFile
+                            desc={'乐器演奏文件'}
                             disabled={state.previewMode}
                             size={100}
-                            v-model:fileList={item.femaleSolmizationFileUrl}
+                            v-model:fileList={item.audioFileUrl}
                             tips="仅支持上传.mp3格式文件"
                             listType="image"
                             accept=".mp3"
+                            text={'点击上传MP3文件'}
                             bucketName="cloud-coach"
-                            text={'点击上传唱名文件'}
-                        />
-                      </NFormItemGi>
-                    </NGrid>
+                          />
+                        </NFormItemGi>
+                      </NGrid>
+                    )}
+                  </>
                 )
               })}
-              <NAlert showIcon={false} style={{marginBottom: '12px'}}>
-                演奏文件
-              </NAlert>
-              <NGrid cols={2}>
-                <NFormItemGi
-                    label="是否播放节拍器"
-                    path="isPlayBeat"
-                    rule={[
-                      {
-                        required: true,
-                        message: '请选择是否播放节拍器'
-                      }
-                    ]}
-                >
-                  <NRadioGroup v-model:value={forms.isPlayBeat}>
-                    <NRadio value={true}>是</NRadio>
-                    <NRadio value={false}>否</NRadio>
-                  </NRadioGroup>
-                </NFormItemGi>
-                {forms.isPlayBeat && (
-                    <NFormItemGi
-                        label="播放方式"
-                        path="isUseSystemBeat"
-                        rule={[
-                          {
-                            required: true,
-                            message: '请选择播放方式'
-                          }
-                        ]}
-                    >
-                      <NRadioGroup v-model:value={forms.isUseSystemBeat}>
-                        <NRadio value={true}>系统节拍器</NRadio>
-                        <NRadio value={false}>MP3节拍器</NRadio>
-                      </NRadioGroup>
-                    </NFormItemGi>
-                )}
-              </NGrid>
-              <NGrid cols={2}>
-                <NFormItemGi
-                    label="重复节拍时长"
-                    path="repeatedBeats"
-                    rule={[
-                      {
-                        required: false,
-                        message: '请选择是否重复节拍时长'
-                      }
-                    ]}
-                >
-                  <NRadioGroup v-model:value={forms.repeatedBeats}>
-                    <NRadio value={true}>是</NRadio>
-                    <NRadio value={false}>否</NRadio>
-                  </NRadioGroup>
-                </NFormItemGi>
-                <NFormItemGi
-                    label="是否显示指法"
-                    path="isShowFingering"
-                    rule={[
-                      {
-                        required: true,
-                        message: '请选择是否显示指法'
-                      }
-                    ]}
-                >
-                  <NRadioGroup v-model:value={forms.isShowFingering}>
-                    <NRadio value={true}>是</NRadio>
-                    <NRadio value={false}>否</NRadio>
-                  </NRadioGroup>
-                </NFormItemGi>
-              </NGrid>
-              <NGrid cols={2}>
-                {forms.playMode === 'MP3' && (
-                    <NFormItemGi
-                        label="上传伴奏"
-                        path="musicSheetAccompanimentList"
-                        rule={[
-                          {
-                            required: false,
-                            message: '请选择上传.mp3'
-                          }
-                        ]}
-                    >
-                      <UploadFile
-                          disabled={state.previewMode}
-                          size={30}
-                          v-model:fileList={state.musicSheetAccompanimentUrl}
-                          tips="仅支持上传.mp3格式文件"
-                          listType="image"
-                          accept=".mp3"
-                          bucketName="cloud-coach"
-                          text="点击上传伴奏文件"
-                          max={1}
-                          desc={'上传伴奏文件'}
-                          // onReadFileInputEventAsArrayBuffer={readFileInputEventAsArrayBuffer}
-                      />
-                    </NFormItemGi>
-                )}
-                {forms.isAllSubject && forms.musicSheetType == 'SINGLE' && (
-                    <NFormItemGi
-                        label="上传原音"
-                        path="musicSheetSoundList_all_subject"
-                        rule={[
-                          {
-                            required: false,
-                            message: '请选择上传原音',
-                            trigger: ['change', 'input']
-                          }
-                        ]}
-                    >
-                      <UploadFile
-                          desc={'上传原音'}
-                          disabled={state.previewMode}
-                          size={30}
-                          max={1}
-                          v-model:fileList={forms.musicSheetSoundList_all_subject}
-                          tips="仅支持上传.mp3格式文件"
-                          listType="image"
-                          accept=".mp3"
-                          bucketName="cloud-coach"
-                          text="点击上传原音"
-                          onRemove={() => {
-                          }}
-                      />
-                    </NFormItemGi>
-                )}
-              </NGrid>
-
-              {/*渐变速*/}
-              {!!gradualData.list.length && (
-                  <>
-                    <NAlert showIcon={false} type="info">
-                      识别到共1处渐变速度,请输入Dorico对应小节时间信息
-                    </NAlert>
-                    <NFormItem label="rit." required style={{marginTop: '10px'}}>
-                      <NSpace vertical>
-                        {gradualData.list.map((n: any, ni: number) => (
-                            <NInputGroup>
-                              <NFormItem
-                                  path={`graduals.${n[0].measureIndex}`}
-                                  rule={[
-                                    {required: true, message: '请输入合奏曲目时间'},
-                                    {
-                                      pattern: /^((\d{2}):?){2,3}$/,
-                                      message: '请输入正确的曲目时间',
-                                      trigger: 'blur'
-                                    }
-                                  ]}
-                              >
-                                <NInputGroup>
-                                  <NInputGroupLabel>{n[0].measureIndex}小节开始</NInputGroupLabel>
-                                  <NInput
-                                      placeholder="00:00:00"
-                                      v-model:value={forms.graduals[n[0].measureIndex]}
-                                  ></NInput>
-                                </NInputGroup>
-                              </NFormItem>
-                              <div style={{lineHeight: '30px', padding: '0 4px'}}>~</div>
-                              <NFormItem
-                                  path={`graduals.${n[1].measureIndex}`}
-                                  rule={[
-                                    {required: true, message: '请输入合奏曲目时间'},
-                                    {
-                                      pattern: /^((\d{2}):?){2,3}$/,
-                                      message: '请输入正确的曲目时间',
-                                      trigger: 'blur'
-                                    }
-                                  ]}
-                              >
-                                <NInputGroup>
-                                  <NInput
-                                      placeholder="00:00:00"
-                                      v-model:value={forms.graduals[n[1].measureIndex]}
-                                  ></NInput>
-                                  <NInputGroupLabel>{n[1].measureIndex}小节结束</NInputGroupLabel>
-                                </NInputGroup>
-                              </NFormItem>
-                            </NInputGroup>
-                        ))}
-                      </NSpace>
-                    </NFormItem>
-                  </>
-              )}
-              {/*独奏*/}
-              {forms.musicSheetType == 'SINGLE' && forms.playMode === 'MP3' && !forms.isAllSubject && forms.musicSheetSoundList_YZ.map((item: any, index: any) => {
-                return (
-                    <>
-                      {forms.musicalInstrumentIdList.includes(item.musicalInstrumentId) && (
-                          <NGrid class={styles.audioSection}>
+            {/*合奏*/}
+            {forms.musicSheetType == 'CONCERT' &&
+              forms.playMode === 'MP3' &&
+              forms.musicSheetSoundList_YY.length > 0 && (
+                <>
+                  {forms.musicSheetSoundList_YY.map((item: any, index: number) => {
+                    return (
+                      <>
+                        {(!containOther(item.track) ||
+                          (item.track?.toLocaleUpperCase?.() != 'COMMON' &&
+                            forms.multiTracksSelection.includes(item.track))) && (
+                          <NGrid
+                            class={styles.audioSection}
+                            // v-show={forms.multiTracksSelection.indexOf(item.track) > -1}
+                          >
                             <NFormItemGi
+                              span={12}
+                              label="原音"
+                              path={`musicSheetSoundList_YY[${index}].audioFileUrl`}
+                              rule={[
+                                {
+                                  // required: forms.multiTracksSelection.indexOf(forms.musicSheetSoundList_YY[index].audioFileUrl) > -1,
+                                  required: false,
+                                  message: `请上传${
+                                    item.track ? item.track + '的' : '第' + (index + 1) + '个'
+                                  }原音`
+                                }
+                              ]}
+                            >
+                              <UploadFile
+                                desc={'原音文件'}
+                                disabled={state.previewMode}
+                                size={100}
+                                v-model:fileList={item.audioFileUrl}
+                                tips="仅支持上传.mp3格式文件"
+                                listType="image"
+                                accept=".mp3"
+                                bucketName="cloud-coach"
+                              />
+                            </NFormItemGi>
+                            {state.partListNames.length > 0 && (
+                              <NFormItemGi
                                 span={12}
-                                label={item.musicalInstrumentName}
-                                path={`musicSheetSoundList_YZ[${index}].audioFileUrl`}
+                                label="所属轨道"
+                                path={`musicSheetSoundList_YY[${index}].track`}
                                 rule={[
                                   {
                                     required: false,
-                                    message: `请上传乐器演奏文件`
+                                    message: '请选择所属轨道'
                                   }
                                 ]}
-                            >
-                              <UploadFile
-                                  desc={'乐器演奏文件'}
-                                  disabled={state.previewMode}
-                                  size={100}
-                                  v-model:fileList={item.audioFileUrl}
-                                  tips="仅支持上传.mp3格式文件"
-                                  listType="image"
-                                  accept=".mp3"
-                                  text={"点击上传MP3文件"}
-                                  bucketName="cloud-coach"
-                              />
-                            </NFormItemGi>
-                          </NGrid>
-                      )}
-                    </>
-                )
-              })
-              }
-              {/*合奏*/}
-              {forms.musicSheetType == 'CONCERT' && forms.playMode === 'MP3' && forms.musicSheetSoundList_YY.length > 0 && (
-                  <>
-                    {forms.musicSheetSoundList_YY.map((item: any, index: number) => {
-                      return (
-                          <>
-                            {(!containOther(item.track) ||
-                                (item.track?.toLocaleUpperCase?.() != 'COMMON' &&
-                                    forms.multiTracksSelection.includes(item.track))) && (
-                                <NGrid
-                                    class={styles.audioSection}
-                                    // v-show={forms.multiTracksSelection.indexOf(item.track) > -1}
-                                >
-                                  <NFormItemGi
-                                      span={12}
-                                      label="原音"
-                                      path={`musicSheetSoundList_YY[${index}].audioFileUrl`}
-                                      rule={[
-                                        {
-                                          // required: forms.multiTracksSelection.indexOf(forms.musicSheetSoundList_YY[index].audioFileUrl) > -1,
-                                          required: false,
-                                          message: `请上传${
-                                              item.track ? item.track + '的' : '第' + (index + 1) + '个'
-                                          }原音`
+                              >
+                                <NSelect
+                                  placeholder="请选择所属轨道"
+                                  value={item.track}
+                                  options={initPartsListStatus(item.track)}
+                                  onUpdateValue={(value: any) => {
+                                    const track = item.track
+
+                                    if (track) {
+                                      // 声轨交换
+                                      forms.musicSheetSoundList_YY.forEach((next: any) => {
+                                        if (next.track == value) {
+                                          next.track = track
                                         }
-                                      ]}
-                                  >
-                                    <UploadFile
-                                        desc={'原音文件'}
-                                        disabled={state.previewMode}
-                                        size={100}
-                                        v-model:fileList={item.audioFileUrl}
-                                        tips="仅支持上传.mp3格式文件"
-                                        listType="image"
-                                        accept=".mp3"
-                                        bucketName="cloud-coach"
-                                    />
-                                  </NFormItemGi>
-                                  {state.partListNames.length > 0 && (
-                                      <NFormItemGi
-                                          span={12}
-                                          label="所属轨道"
-                                          path={`musicSheetSoundList_YY[${index}].track`}
-                                          rule={[
-                                            {
-                                              required: false,
-                                              message: '请选择所属轨道'
-                                            }
-                                          ]}
-                                      >
-                                        <NSelect
-                                            placeholder="请选择所属轨道"
-                                            value={item.track}
-                                            options={initPartsListStatus(item.track)}
-                                            onUpdateValue={(value: any) => {
-                                              const track = item.track
-
-                                              if (track) {
-                                                // 声轨交换
-                                                forms.musicSheetSoundList_YY.forEach((next: any) => {
-                                                  if (next.track == value) {
-                                                    next.track = track
-                                                  }
-                                                })
-
-                                                const index = forms.multiTracksSelection.indexOf(item.track)
-                                                forms.multiTracksSelection.splice(index, 1)
-                                              } else {
-                                                forms.musicSheetSoundList_YY = forms.musicSheetSoundList_YY.filter(
-                                                    (next: any) => {
-                                                      return next.track != 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>
-                                  )}
-                                  <NGi class={styles.btnRemove}>
-                                    <NButton
-                                        type="primary"
-                                        text
-                                        // disabled={forms.musicSheetSoundList_YY.length === 1}
-                                        onClick={() => removeSys(index)}
-                                    >
-                                      删除
-                                    </NButton>
-                                  </NGi>
-                                </NGrid>
+                                      })
+
+                                      const index = forms.multiTracksSelection.indexOf(item.track)
+                                      forms.multiTracksSelection.splice(index, 1)
+                                    } else {
+                                      forms.musicSheetSoundList_YY =
+                                        forms.musicSheetSoundList_YY.filter((next: any) => {
+                                          return next.track != 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>
                             )}
-                          </>
-                      )
-                    })}
-                  </>
+                            <NGi class={styles.btnRemove}>
+                              <NButton
+                                type="primary"
+                                text
+                                // disabled={forms.musicSheetSoundList_YY.length === 1}
+                                onClick={() => removeSys(index)}
+                              >
+                                删除
+                              </NButton>
+                            </NGi>
+                          </NGrid>
+                        )}
+                      </>
+                    )
+                  })}
+                </>
               )}
-
-            </NForm>
-          </NSpin>
-          {props.type !== 'preview' && (
-              <NSpace justify="end" style="padding-top:12px">
-                <NButton type="default" onClick={() => emit('close')}>
-                  取消
-                </NButton>
-                <NButton
-                    type="primary"
-                    onClick={() => onSubmit()}
-                    loading={btnLoading.value}
-                    disabled={btnLoading.value}
-                >
-                  确认
-                </NButton>
-              </NSpace>
-          )}
-
-          <NModal
-              v-model:show={state.showMusicSheetOwnerDialog}
-              preset="dialog"
-              showIcon={false}
-              maskClosable={false}
-              title="所属人"
-              style={{width: '800px'}}
-          >
-            <MusicSheetOwnerDialog
-                musicSheetExtend={forms.musicSheetExtend}
-                sourceType={forms.sourceType}
-                appData={state.appData}
-                onClose={() => {
-                  state.showMusicSheetOwnerDialog = false
-                }}
-                onChoseMusicSheetOwnerData={(musicSheetOwnerData) => {
-                  forms.musicSheetExtend = {
-                    ...musicSheetOwnerData
-                  }
-                  setOwnerName()
-                }}
-            />
-          </NModal>
-
-          <NModal
-              class={styles.productModal}
-              title="自动生成曲谱图片"
-              v-model:show={state.productOpen}
-              preset="dialog"
-              closeOnEsc={false}
-              maskClosable={false}
-              onClose={()=> {
-                state.isAutoSave = false
-              }}
-              showIcon={false}
-          >
-            <MusicCreateImg
-                xmlFileUrl={forms.xmlFileUrl || ''}
-                onClose={() => (state.productOpen = false)}
-                onConfirm={async (item: any) => {
-                  // 保存
-                  try {
-                    forms.musicImg = item.musicImg
-                    forms.musicFirstImg = item.musicFirstImg
-                    forms.musicJianImg = item.musicJianImg
-                    await onSubmit()
-                  } catch (e: any) {
-                    //
-                    console.log(e, 'e')
-                  }
-                  // setTimeout(() => {
-                  //   state.isAutoSave = false
-                  // }, 50)
-                }}
-            />
-          </NModal>
-        </div>
+          </NForm>
+        </NSpin>
+        {props.type !== 'preview' && (
+          <NSpace justify="end" style="padding-top:12px">
+            <NButton type="default" onClick={() => emit('close')}>
+              取消
+            </NButton>
+            <NButton
+              type="primary"
+              onClick={() => onSubmit()}
+              loading={btnLoading.value}
+              disabled={btnLoading.value}
+            >
+              确认
+            </NButton>
+          </NSpace>
+        )}
+
+        <NModal
+          v-model:show={state.showMusicSheetOwnerDialog}
+          preset="dialog"
+          showIcon={false}
+          maskClosable={false}
+          title="所属人"
+          style={{ width: '800px' }}
+        >
+          <MusicSheetOwnerDialog
+            musicSheetExtend={forms.musicSheetExtend}
+            sourceType={forms.sourceType}
+            appData={state.appData}
+            onClose={() => {
+              state.showMusicSheetOwnerDialog = false
+            }}
+            onChoseMusicSheetOwnerData={(musicSheetOwnerData) => {
+              forms.musicSheetExtend = {
+                ...musicSheetOwnerData
+              }
+              setOwnerName()
+            }}
+          />
+        </NModal>
+
+        <NModal
+          class={styles.productModal}
+          title="自动生成曲谱图片"
+          v-model:show={state.productOpen}
+          preset="dialog"
+          closeOnEsc={false}
+          maskClosable={false}
+          onClose={() => {
+            state.isAutoSave = false
+          }}
+          showIcon={false}
+        >
+          <MusicCreateImg
+            xmlFileUrl={forms.xmlFileUrl || ''}
+            onClose={() => (state.productOpen = false)}
+            onConfirm={async (item: any) => {
+              // 保存
+              try {
+                forms.musicImg = item.musicImg
+                forms.musicFirstImg = item.musicFirstImg
+                forms.musicJianImg = item.musicJianImg
+                await onSubmit()
+              } catch (e: any) {
+                //
+                console.log(e, 'e')
+              }
+              // setTimeout(() => {
+              //   state.isAutoSave = false
+              // }, 50)
+            }}
+          />
+        </NModal>
+      </div>
     )
   }
 })