|  | @@ -723,7 +723,28 @@ const handlePlaying = () => {
 | 
	
		
			
				|  |  |        // 如果开启了预备拍
 | 
	
		
			
				|  |  |        const selectStartItem = state.sectionFirst ? state.sectionFirst : state.section[0];
 | 
	
		
			
				|  |  |        const selectEndItem = state.section[1];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +      if (currentTime - selectEndItem.endtime >= 0) {
 | 
	
		
			
				|  |  | +        console.log("选段播放结束", state.setting.repeatAutoPlay);
 | 
	
		
			
				|  |  | +        // 如果为选段评测模式
 | 
	
		
			
				|  |  | +        if (state.modeType === "evaluating" && state.isSelectMeasureMode) {
 | 
	
		
			
				|  |  | +          onEnded();
 | 
	
		
			
				|  |  | +          return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // #8698 bug修复
 | 
	
		
			
				|  |  | +        if (state.modeType === "practise" && state.sectionStatus) {
 | 
	
		
			
				|  |  | +          // 练习作业,练习完一次需要增加练习次数
 | 
	
		
			
				|  |  | +          if (query.workRecord) {
 | 
	
		
			
				|  |  | +            HANDLE_WORK_ADD()
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +          onEnded();
 | 
	
		
			
				|  |  | +          // state.activeNoteIndex = state.sectionFirst ? state.sectionFirst.i : state.section[0].i
 | 
	
		
			
				|  |  | +          // dynamicShowPlaySpeed(state.activeNoteIndex)
 | 
	
		
			
				|  |  | +          resetPlaybackToStart();
 | 
	
		
			
				|  |  | +          return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        item = selectStartItem;
 | 
	
		
			
				|  |  | +        setAudioCurrentTime(selectStartItem.time, selectStartItem.i);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |        /**
 | 
	
		
			
				|  |  |         * #9374,反复小节的曲目播放错误, bug修复
 | 
	
		
			
				|  |  |         * 曲目:噢!苏珊娜-排箫-人音
 | 
	
	
		
			
				|  | @@ -750,28 +771,7 @@ const handlePlaying = () => {
 | 
	
		
			
				|  |  |        // if (Math.abs(selectEndItem.endtime - currentTime) < offset_duration) {
 | 
	
		
			
				|  |  |        // if (currentTime - selectEndItem.endtime > offset_duration) {
 | 
	
		
			
				|  |  |        //console.log(currentTime,selectEndItem.endtime)
 | 
	
		
			
				|  |  | -      if (currentTime - selectEndItem.endtime >= 0) {
 | 
	
		
			
				|  |  | -        console.log("选段播放结束", state.setting.repeatAutoPlay);
 | 
	
		
			
				|  |  | -        // 如果为选段评测模式
 | 
	
		
			
				|  |  | -        if (state.modeType === "evaluating" && state.isSelectMeasureMode) {
 | 
	
		
			
				|  |  | -          onEnded();
 | 
	
		
			
				|  |  | -          return;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        // #8698 bug修复
 | 
	
		
			
				|  |  | -        if (state.modeType === "practise" && state.sectionStatus) {
 | 
	
		
			
				|  |  | -          // 练习作业,练习完一次需要增加练习次数
 | 
	
		
			
				|  |  | -          if (query.workRecord) {
 | 
	
		
			
				|  |  | -            HANDLE_WORK_ADD()
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -          onEnded();
 | 
	
		
			
				|  |  | -          // state.activeNoteIndex = state.sectionFirst ? state.sectionFirst.i : state.section[0].i
 | 
	
		
			
				|  |  | -          // dynamicShowPlaySpeed(state.activeNoteIndex)
 | 
	
		
			
				|  |  | -          resetPlaybackToStart();
 | 
	
		
			
				|  |  | -          return;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        item = selectStartItem;
 | 
	
		
			
				|  |  | -        setAudioCurrentTime(selectStartItem.time, selectStartItem.i);
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      gotoNext(item);
 | 
	
		
			
				|  |  |      dynamicShowPlaySpeed(item.i, true);
 | 
	
	
		
			
				|  | @@ -1061,13 +1061,13 @@ export const gotoNext = (note: any, skipNote?: boolean) => {
 | 
	
		
			
				|  |  |    // 赋值音符id
 | 
	
		
			
				|  |  |    osmd.cursor.noteGraphicalId = state.times[state.activeNoteIndex].id;
 | 
	
		
			
				|  |  |    // 设置光标位置
 | 
	
		
			
				|  |  | -  nextTick(() => {
 | 
	
		
			
				|  |  | -      if (osmd.cursor.noteGraphicalId) {
 | 
	
		
			
				|  |  | -      const { x, y } = document.getElementById(`vf-${osmd.cursor.noteGraphicalId}`)?.getBoundingClientRect() || { x: 0, y: 0}
 | 
	
		
			
				|  |  | -      osmd.cursor.cursorElement.style.left = x + "px";
 | 
	
		
			
				|  |  | -      // cursorElement.style.top = y + "px";
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  })
 | 
	
		
			
				|  |  | +  // nextTick(() => {
 | 
	
		
			
				|  |  | +  //     if (osmd.cursor.noteGraphicalId) {
 | 
	
		
			
				|  |  | +  //     const { x, y } = document.getElementById(`vf-${osmd.cursor.noteGraphicalId}`)?.getBoundingClientRect() || { x: 0, y: 0}
 | 
	
		
			
				|  |  | +  //     osmd.cursor.cursorElement.style.left = x + "px";
 | 
	
		
			
				|  |  | +  //     // cursorElement.style.top = y + "px";
 | 
	
		
			
				|  |  | +  //   }
 | 
	
		
			
				|  |  | +  // })
 | 
	
		
			
				|  |  |    dynamicShowPlaySpeed(state.activeNoteIndex);
 | 
	
		
			
				|  |  |    if (prev && num - prev === 1) {
 | 
	
		
			
				|  |  |      // console.log('跳转音符',11111,osmd.cursor)
 | 
	
	
		
			
				|  | @@ -1813,9 +1813,13 @@ const setState = (data: any, index: number) => {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      state.enableEvaluation = false;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  if (storeData.isApp) {
 | 
	
		
			
				|  |  | +  if (storeData.isApp && !state.isPreView) {
 | 
	
		
			
				|  |  |      state.zoom = localStorage.getItem('scoreZoom') ? Number(localStorage.getItem('scoreZoom')) : state.zoom
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | +  // 详情预览页面,曲谱比例
 | 
	
		
			
				|  |  | +  if (state.isPreView) {
 | 
	
		
			
				|  |  | +    state.zoom = query.zoom ? Number(query.zoom) : state.zoom;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |    /**
 | 
	
		
			
				|  |  |     * 默认渲染什么谱面类型 & 能否转谱逻辑
 | 
	
		
			
				|  |  |     * 渲染类型:首先取url参数musicRenderType,没有该参数则取musicalInstruments字段匹配的当前分轨的defaultScore,没有匹配到则取默认值('firstTone')
 | 
	
	
		
			
				|  | @@ -2122,6 +2126,10 @@ watch(
 | 
	
		
			
				|  |  |          if(state.sectionFirst && measureNum === state.sectionFirst.MeasureNumberXML && state.section.length === 2){
 | 
	
		
			
				|  |  |            item?.querySelector('.vf-custom-bg')?.setAttribute("fill", "rgba(255, 193, 48, 0.15)")
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        // 如果是选段,超出选段时,不添加背景色
 | 
	
		
			
				|  |  | +        if (state.section.length === 2 && state.activeMeasureIndex > state.section[1].MeasureNumberXML) {
 | 
	
		
			
				|  |  | +          item.querySelector('.vf-custom-bg')?.setAttribute("fill", "transparent")
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |        } else {
 | 
	
		
			
				|  |  |          // 有选段只清除选段处的
 | 
	
		
			
				|  |  |          if (state.section.length === 2) {
 | 
	
	
		
			
				|  | @@ -2288,27 +2296,31 @@ export const handleGuide = async () => {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// 手动设置音符指针位置
 | 
	
		
			
				|  |  |  export const resetCursorPosition = () => {
 | 
	
		
			
				|  |  | -  if (metronomeData.cursorMode === 1) {
 | 
	
		
			
				|  |  | -    const currentActives: HTMLElement[] = Array.from(document.querySelectorAll(".dotActive"));
 | 
	
		
			
				|  |  | -    currentActives.forEach((currentActive) => {
 | 
	
		
			
				|  |  | -      currentActive?.classList.remove("dotActive");
 | 
	
		
			
				|  |  | -    })
 | 
	
		
			
				|  |  | -    // const currentDot = document.querySelector(`.noteIndex_${state.activeNoteIndex}`)
 | 
	
		
			
				|  |  | -    const noteId = state.times[state.activeNoteIndex].id;
 | 
	
		
			
				|  |  | -    const domId = "vf" + noteId;
 | 
	
		
			
				|  |  | -    const currentDot = document.querySelector(`[data-vf=${domId}]`)?.parentElement
 | 
	
		
			
				|  |  | -    if (currentDot) {
 | 
	
		
			
				|  |  | -      setTimeout(() => {
 | 
	
		
			
				|  |  | -        currentDot.classList.add('dotActive')
 | 
	
		
			
				|  |  | -      }, 0);
 | 
	
		
			
				|  |  | +  nextTick(() => {
 | 
	
		
			
				|  |  | +    if (metronomeData.cursorMode === 1) {
 | 
	
		
			
				|  |  | +      const currentActives: HTMLElement[] = Array.from(document.querySelectorAll(".dotActive"));
 | 
	
		
			
				|  |  | +      currentActives.forEach((currentActive) => {
 | 
	
		
			
				|  |  | +        currentActive?.classList.remove("dotActive");
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +      // const currentDot = document.querySelector(`.noteIndex_${state.activeNoteIndex}`)
 | 
	
		
			
				|  |  | +      const noteId = state.times[state.activeNoteIndex].id;
 | 
	
		
			
				|  |  | +      const domId = "vf" + noteId;
 | 
	
		
			
				|  |  | +      const currentDot = document.querySelector(`[data-vf=${domId}]`)?.parentElement
 | 
	
		
			
				|  |  | +      if (currentDot) {
 | 
	
		
			
				|  |  | +        setTimeout(() => {
 | 
	
		
			
				|  |  | +          currentDot.classList.add('dotActive')
 | 
	
		
			
				|  |  | +        }, 0);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      currentDot?.classList.add('dotActive')
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      const currentActives: HTMLElement[] = Array.from(document.querySelectorAll(".dotActive"));
 | 
	
		
			
				|  |  | +      currentActives.forEach((currentActive) => {
 | 
	
		
			
				|  |  | +        currentActive?.classList.remove("dotActive");
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | -    const currentActives: HTMLElement[] = Array.from(document.querySelectorAll(".dotActive"));
 | 
	
		
			
				|  |  | -    currentActives.forEach((currentActive) => {
 | 
	
		
			
				|  |  | -      currentActive?.classList.remove("dotActive");
 | 
	
		
			
				|  |  | -    })
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 |