Przeglądaj źródła

Merge branch 'feature-tianyong' of http://git.dayaedu.com/tianyong/gym-music-score into hqyDev

黄琪勇 7 miesięcy temu
rodzic
commit
9af68ed87c

+ 1 - 1
src/helpers/metronome.ts

@@ -182,7 +182,7 @@ class Metronome {
 	
 	// 暂停的时候,点击音符,需要找到对应的节拍器的位置
 	findMetronomePosition = (currentTime: number) => {
-		console.log('取消选段',currentTime)
+		// console.log('取消选段',currentTime)
 		const originTime = currentTime;
 		// if (!state.sectionStatus){
 		// 	currentTime = setCurrentTime(currentTime);

+ 4 - 2
src/page-instrument/header-top/index.tsx

@@ -9,7 +9,7 @@ import { Badge, Circle, Popover, Popup, showConfirmDialog, showToast, NoticeBar
 import Speed from "./speed";
 import { evaluatingData, handleStartEvaluat } from "/src/view/evaluating";
 import Settting from "./settting";
-import state, { IPlatform, handleChangeSection, handleResetPlay, handleRessetState, togglePlay, IPlayState, refreshMusicSvg, EnumMusicRenderType, resetSettings, handleGuide } from "/src/state";
+import state, { IPlatform, handleChangeSection, handleResetPlay, handleRessetState, togglePlay, IPlayState, refreshMusicSvg, EnumMusicRenderType, resetSettings, handleGuide, resetCursorPosition } from "/src/state";
 import { getAudioCurrentTime } from "/src/view/audio-list";
 import { followData, toggleFollow } from "/src/view/follow-practice";
 import { api_back } from "/src/helpers/communication";
@@ -83,6 +83,7 @@ export const headTopData = reactive({
       smoothAnimationState.isShow.value = false; // 隐藏旋律线
       state.playIngSpeed = state.originSpeed;
       handleStartEvaluat();
+      resetCursorPosition()
       // 开发模式,把此处打开
       // state.modeType = "evaluating";
       // evaluatingData.rendered = true;
@@ -436,7 +437,8 @@ export default defineComponent({
       if (headTopData.modeType !== "show" || !headTopData.showBack) return { display: false, disabled: false };
       // 跟练开始, 评测开始 播放开始 隐藏
       if (state.playState == "play" || followData.start || evaluatingData.startBegin) return { display: true, disabled: true };
-
+      // 课件播放,上课页面潜入云教练,不显示模式切换
+      if (query.hideMode == 1) return { display: false, disabled: false };
       return {
         display: true,
         disabled: false,

+ 14 - 1
src/page-instrument/header-top/speed/index.tsx

@@ -35,10 +35,23 @@ export default defineComponent({
 			() => speed.value,
 			() => {
 				// handleSetSpeed(speed.value);
+				//console.log('速度123',speed.value)
 				state.speed = Math.floor(speed.value);
 				// handleSetSpeed(speed.value);
 				if (state.playState === 'paused') {
-					const currentItem: any = (state.sectionStatus && state.section.length === 2) ? state.section[0] : state.times[state.activeNoteIndex];
+					let currentItem: any;
+					if (state.section.length === 2 && state.sectionStatus && state.times[state.activeNoteIndex].MeasureNumberXML === state.sectionFirst.MeasureNumberXML) {
+						currentItem = state.section[0]
+					}
+					if (state.section.length === 2 && state.sectionStatus && state.times[state.activeNoteIndex].MeasureNumberXML !== state.sectionFirst.MeasureNumberXML) {
+						currentItem = state.times[state.activeNoteIndex]
+					}
+					// if (state.section.length === 2 && state.sectionStatus && state.times[state.activeNoteIndex].MeasureNumberXML !== state.sectionFirst.MeasureNumberXML) {
+					// 	currentItem = state.times[state.activeNoteIndex]
+					// } else {
+					// 	currentItem = (state.sectionStatus && state.section.length === 2) ? state.section[0] : state.times[state.activeNoteIndex];
+					// }
+					
 					state.basePlayRate = currentItem?.measureSpeed ? state.speed / currentItem.measureSpeed : state.speed / state.originSpeed;
 				}
 			}

+ 27 - 14
src/page-instrument/view-evaluat-report/index.tsx

@@ -83,6 +83,7 @@ export default defineComponent({
       headerHide: false,
       musicalNotesPlayStats: [] as any[],
       userMeasureScore: {} as any,
+      isNewReport: true,
     });
     const getAPPData = async () => {
       const screenData = await isSpecialShapedScreen();
@@ -169,7 +170,7 @@ export default defineComponent({
       state.partIndex = Number(res?.data?.partIndex);
       let resultData = {} as any;
       try {
-        resultData = JSON.parse(res?.data?.scoreData);
+        resultData = eval('(' + res?.data?.scoreData + ')');
       } catch (error) {
         console.error("解析评测结果:", error);
       }
@@ -179,7 +180,7 @@ export default defineComponent({
       console.log('结果11',resultData)
       detailData.musicalNotesPlayStats = resultData.musicalNotesPlayStats?.notesData || [];
       detailData.userMeasureScore = resultData.userMeasureScore || {};
-
+      detailData.isNewReport = res.data.practiceTime ? true : false;
       scoreData.heardLevel = res.data?.heardLevel;
       scoreData.cadence = res.data?.cadence;
       scoreData.integrity = res.data?.integrity;
@@ -237,7 +238,7 @@ export default defineComponent({
     };
 
     const filterNotes = () => {
-      let include = ["RIGHT", "WRONG", "NOT_PLAYED"];
+      let include = detailData.isNewReport ? ["RIGHT", "WRONG", "NOT_PLAYED"] : ["RIGHT", "WRONG", "NOT_PLAY"];
       if (scoreData.itemType === "intonation") {
         // 音准
         include.push(...["HIGH", "LOW"]);
@@ -246,15 +247,15 @@ export default defineComponent({
         include.push(...["EARLY", "LATE"]);
       } else if (scoreData.itemType === "integrity") {
         // 完整性
-        include = ["SHORT", "NORMAL", "NOT_PLAYED"];
+        include = detailData.isNewReport ? ["SHORT", "NORMAL", "NOT_PLAYED"] : ["INTEGRITY_WRONG", "RIGHT", "NOT_PLAY"];
       }
       if (scoreData.itemType === "cadence") {
-        return detailData.musicalNotesPlayStats.filter((item: any) => include.includes(item.rhythmicAssessment.result));
+        return detailData.musicalNotesPlayStats.filter((item: any) => include.includes(item.rhythmicAssessment ? item.rhythmicAssessment.result : item.musicalErrorType));
       } else if (scoreData.itemType === "integrity") {
-        return detailData.musicalNotesPlayStats.filter((item: any) => include.includes(item.integrityAssessment?.result));
+        return detailData.musicalNotesPlayStats.filter((item: any) => include.includes(item.integrityAssessment ? item.integrityAssessment?.result : item.musicalErrorType));
       } else  {
         return detailData.musicalNotesPlayStats.filter((item: any) => {
-          let result = item.pitchAssessment.result;
+          let result = item.pitchAssessment ? item.pitchAssessment.result : item.musicalErrorType;
           // if (scoreData.itemType === "integrity") {
           //   result = result === "HIGH" || result === "LOW" || result === "WRONG" ? "RIGHT" : result;
           // }
@@ -269,16 +270,21 @@ export default defineComponent({
       // console.log(1111,notes)
       for (const note of notes) {
         const idx = note.musicalNotesIndex !== undefined ? note.musicalNotesIndex : note.index;
-        const active = allNote.value.find((item: any) => item.i === idx);
+        const active = detailData.isNewReport ? allNote.value.find((item: any) => item.i === idx) : allNote.value[idx];
         setTimeout(() => {
-          if (useedid.value.includes(active.id)) {
+          if (!active?.id) return;
+          if (active?.id && useedid.value.includes(active?.id)) {
             return;
           }
           useedid.value.push(active.id);
           const svgEl = document.getElementById("vf-" + active.id);
           const stemEl = document.getElementById("vf-" + active.id + "-stem");
-          let errType = scoreData.itemType === "cadence" ? note.rhythmicAssessment.result : scoreData.itemType === "integrity" ? note.integrityAssessment.result : note.pitchAssessment.result;
-          // console.log(1111222,errType)
+          let errType = '';
+          if (detailData.isNewReport) {
+            errType = scoreData.itemType === "cadence" ? note.rhythmicAssessment.result : scoreData.itemType === "integrity" ? note.integrityAssessment.result : note.pitchAssessment.result;
+          } else {
+            errType = note.musicalErrorType
+          }
           /**
            * 新版小酷AI不需要在当前的音符复制出来一个音符,所以注释掉isNeedCopyElement和copySvg
            */
@@ -287,12 +293,19 @@ export default defineComponent({
           // if (scoreData.itemType === "integrity") {
           //   errType = errType = note.pitchAssessment.result === "HIGH" || note.pitchAssessment.result === "LOW" || note.pitchAssessment.result === "WRONG" ? "RIGHT" : errType;
           // }
-          if (scoreData.itemType === "integrity") {
-            errType = errType = note.integrityAssessment.result === "NORMAL" ? "RIGHT" : note.integrityAssessment.result === "SHORT" ? "SHORT" : errType;
+          if (detailData.isNewReport) {
+            if (scoreData.itemType === "integrity") {
+              errType = errType = note.integrityAssessment.result === "NORMAL" ? "RIGHT" : note.integrityAssessment.result === "SHORT" ? "SHORT" : errType;
+            }
+          } else {
+            errType = note.musicalErrorType
+          }
+          if (!detailData.isNewReport) {
+            errType = errType == "NOT_PLAY" ? "NOT_PLAYED" : errType == "INTEGRITY_WRONG" ? "SHORT" : errType;
           }
           stemEl?.classList.add(colorsClass[errType]);
           svgEl?.classList.add(colorsClass[errType]);
-          // console.log(123456,'添加颜色',errType)
+          console.log(123456,'添加颜色',errType)
           // 评测过的音符,需要给小节添加背景色
           // if (errType !== "NOT_PLAYED") {
           //   const staveNote = svgEl?.parentNode?.parentNode?.querySelector(".vf-stave");

+ 16 - 7
src/state.ts

@@ -671,7 +671,7 @@ export const onEnded = () => {
 
 // 根据当前小节动态设置,右上角展示的速度
 const dynamicShowPlaySpeed = (index: number, isPlaying?: boolean) => {
-  if (!headerColumnHide.value) {
+  //if (!headerColumnHide.value) {
     const item: any = state.times[index];
     if (state.sectionFirst && state.section.length === 2 && item.MeasureNumberXML === state.sectionFirst.MeasureNumberXML) {
       state.speed = Math.floor(state.section[0].measureSpeed * state.basePlayRate) || state.speed
@@ -684,7 +684,7 @@ const dynamicShowPlaySpeed = (index: number, isPlaying?: boolean) => {
         state.speed = newSpeed;
       }
     }
-  }
+  //}
 
 }
 
@@ -698,7 +698,7 @@ export const initSetPlayRate = () => {
   let item: any = (state.sectionStatus && state.section.length === 2) ? state.section[0] : state.times[state.activeNoteIndex];
   console.log('播放状态',state.playState)
   // 如果是选段,并且不是选段内的第一小节,取当前小节的速度
-  if (state.sectionStatus && state.section.length === 2 && state.times[state.activeNoteIndex].MeasureNumberXML !== state.section[0].MeasureNumberXML) {
+  if (state.sectionStatus && state.section.length === 2 && state.times[state.activeNoteIndex].MeasureNumberXML !== state.section[0].MeasureNumberXML && state.times[state.activeNoteIndex].MeasureNumberXML !== state.sectionFirst?.MeasureNumberXML) {
     item = state.times[state.activeNoteIndex];
   }
   if (item && item.measureSpeed) {
@@ -718,7 +718,7 @@ export const resetBaseRate = (idx?: number) => {
     currentItem = state.section[0];
   }
   const currentSpeed = currentItem?.measureSpeed ? currentItem.measureSpeed : state.originSpeed;
-  console.log('速度2',currentSpeed)
+  // console.log('速度2',currentSpeed)
   state.speed = currentSpeed
   //state.activeNoteIndex = 0
   state.basePlayRate = 1;
@@ -1818,15 +1818,16 @@ const setState = (data: any, index: number) => {
 
   // 如果是PC端,放大曲谱
   state.platform = query.platform?.toLocaleUpperCase() || "";
-  if (state.platform === IPlatform.PC) {
+  if (state.platform === IPlatform.PC || state.systemType === 'web') {
     // pc端,谱面默认初始大小设置为1.5
-    state.zoom = 1.5;
+    if (state.platform === IPlatform.PC) {
+      state.zoom = 1.5;
+    }
     if (query.zoom <= 1) {
       state.zoom = query.zoom ? Number(query.zoom) : state.zoom;
     } else {
       state.zoom = localStorage.getItem('scoreZoom') ? Number(localStorage.getItem('scoreZoom')) : state.zoom
     }
-    state.enableEvaluation = false;
   }
   if (storeData.isApp && !state.isPreView) {
     state.zoom = localStorage.getItem('scoreZoom') ? Number(localStorage.getItem('scoreZoom')) : state.zoom
@@ -1835,6 +1836,14 @@ const setState = (data: any, index: number) => {
   if (state.isPreView) {
     state.zoom = query.zoom ? Number(query.zoom) : state.zoom;
   }
+  // 评测报告取默认谱面大小
+  if (state.isEvaluatReport) {
+    state.zoom = 0.8
+  }
+  // 非APP打开的页面,禁止评测
+  if (!storeData.isApp) {
+    state.enableEvaluation = false;
+  }
   /**
    * 默认渲染什么谱面类型 & 能否转谱逻辑
    * 渲染类型:首先取url参数musicRenderType,没有该参数则取musicalInstruments字段匹配的当前分轨的defaultScore,没有匹配到则取默认值('firstTone')

+ 3 - 0
src/view/evaluating/index.tsx

@@ -622,6 +622,9 @@ export const handleViewReport = (key: "recordId" | "recordIdStr", type: "gym" |
       break;
     case "instrument":
       url = location.origin + location.pathname + "#/evaluat-report?id=" + id + "&musicRenderType=" + state.musicRenderType + "&systemType=" + state.systemType;
+      if (state.isSchool) {
+        url += `&school=1`;
+      }
       break;
     default:
       url = location.origin + location.pathname + "report-share.html?id=" + id;

+ 12 - 12
src/view/music-score/index.tsx

@@ -85,7 +85,7 @@ export default defineComponent({
 			const container = document.getElementById("musicAndSelection");
 			if (!container || !musicData.score) return;
 			setGlobalMusicSheet();
-			//if(!osmd){
+			if(!osmd){
 				osmd = new OpenSheetMusicDisplay(container, {
 					drawTitle: false,
 					drawSubtitle: false,
@@ -104,18 +104,18 @@ export default defineComponent({
 					// ...this.opotions,
 					colorStemsLikeNoteheads: true, // 是否将音符柄的颜色设置为与它们的音符头相同,默认false
 					// drawingParameters: "compact" // 使用紧凑布局
-					drawLyrics: (((!state.accompany && !state.music ) || state.playType === 'sing' || !state.isEvxml) && !state.isSimplePage) ? true : false, // 演唱模式才渲染歌词,simple页面不显示歌词
-					drawPartNames: props.showPartNames, // 是否渲染声轨名称
-					defaultColorMusic: props.musicColor, // 颜色
-					renderSingleHorizontalStaffline: state.isSingleLine ? true : false
+					// drawLyrics: (((!state.accompany && !state.music ) || state.playType === 'sing' || !state.isEvxml) && !state.isSimplePage) ? true : false, // 演唱模式才渲染歌词,simple页面不显示歌词
+					// drawPartNames: props.showPartNames, // 是否渲染声轨名称
+					// defaultColorMusic: props.musicColor, // 颜色
+					// renderSingleHorizontalStaffline: state.isSingleLine ? true : false
 				});
-			//}
-			// osmd.setOptions({
-			// 	drawLyrics: (((!state.accompany && !state.music ) || state.playType === 'sing' || !state.isEvxml) && !state.isSimplePage) ? true : false, // 演唱模式才渲染歌词,simple页面不显示歌词
-			// 	drawPartNames: props.showPartNames, // 是否渲染声轨名称
-			// 	defaultColorMusic: props.musicColor, // 颜色
-			// 	renderSingleHorizontalStaffline: state.isSingleLine ? true : false
-			// })
+			}
+			osmd.setOptions({
+				drawLyrics: (((!state.accompany && !state.music ) || state.playType === 'sing' || !state.isEvxml) && !state.isSimplePage) ? true : false, // 演唱模式才渲染歌词,simple页面不显示歌词
+				drawPartNames: props.showPartNames, // 是否渲染声轨名称
+				defaultColorMusic: props.musicColor, // 颜色
+				renderSingleHorizontalStaffline: state.isSingleLine ? true : false
+			})
 			// osmd.EngravingRules.CompactMode = true // 紧凑模式
 			// osmd.EngravingRules.PageRightMargin = state.isSingleLine ? (window.innerWidth+200)/10 : 2;
 			// osmd.EngravingRules.FixedMeasureWidth = state.isSingleLine ? true : false; // 是否固定小节的宽度(小节同一宽度渲染)