|
@@ -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>
|
|
|
)
|
|
|
}
|
|
|
})
|