浏览代码

Merge remote-tracking branch 'origin/master'

zouxuan 4 年之前
父节点
当前提交
19bf342cac

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherIncomeDto.java

@@ -26,6 +26,8 @@ public class TeacherIncomeDto extends CourseSchedule {
 
     private long sortNum;
 
+    private List<TeacherSalaryDeductReasonDto> incomes;
+
     private List<TeacherSalaryDeductReasonDto> deductReasons;
 
     public long getSortNum() {
@@ -93,4 +95,12 @@ public class TeacherIncomeDto extends CourseSchedule {
     public void setBelongToDaya(Boolean belongToDaya) {
         this.belongToDaya = belongToDaya;
     }
+
+    public List<TeacherSalaryDeductReasonDto> getIncomes() {
+        return incomes;
+    }
+
+    public void setIncomes(List<TeacherSalaryDeductReasonDto> incomes) {
+        this.incomes = incomes;
+    }
 }

+ 5 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/DeductReasonEnum.java

@@ -11,7 +11,11 @@ public enum DeductReasonEnum implements BaseEnum<String,DeductReasonEnum> {
     SIGN_OUT_TIME_ERR("SIGN_OUT_TIME_ERR", "签退时间异常", ""),
     GPS_ERR("GPS_ERR", "位置异常", ""),
     NOT_SETTLEMENT("NOT_SETTLEMENT", "不结算课酬", "特殊老师不结算课酬"),
-    TRAIL("TRAIL", "试用期扣减", "试用期老师课酬按正式老师的80%计算");
+    TRAIL("TRAIL", "试用期扣减", "试用期老师课酬按正式老师的80%计算"),
+
+    //收入
+    SALARY("SALARY", "基本课酬", "课时应发课酬"),
+    COURSE_SUBSIDY("COURSE_SUBSIDY", "课酬调剂", "课时课酬调剂金额");
 
     private String code;
 

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TeachIncomeTypeEnum.java

@@ -4,7 +4,7 @@ import com.ym.mec.common.enums.BaseEnum;
 
 public enum TeachIncomeTypeEnum implements BaseEnum<String, TeachIncomeTypeEnum> {
 	SALARY("SALARY", "课酬"),
-	SUBSIDY("SUBSIDY", "教学点补贴"),
+	SUBSIDY("SUBSIDY", "课程补贴"),
 	SALE_REWARD("SALE_REWARD", "销售奖励");
 
 	private String code;

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentExercisesSituationQueryInfo.java

@@ -48,6 +48,17 @@ public class StudentExercisesSituationQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "作业提交截至时间")
     private String submitEndDate;
 
+    @ApiModelProperty(value = "服务是否异常")
+    private Boolean serviceIsError;
+
+    public Boolean getServiceIsError() {
+        return serviceIsError;
+    }
+
+    public void setServiceIsError(Boolean serviceIsError) {
+        this.serviceIsError = serviceIsError;
+    }
+
     public String getSubmitStartDate() {
         return submitStartDate;
     }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/TeacherServeQueryInfo.java

@@ -44,6 +44,17 @@ public class TeacherServeQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "及时训练评价次数是否达到预期")
     private Integer exercisesMessageTimelyNumIsAchieve;
 
+    @ApiModelProperty(value = "服务是否异常")
+    private Boolean serviceIsError;
+
+    public Boolean getServiceIsError() {
+        return serviceIsError;
+    }
+
+    public void setServiceIsError(Boolean serviceIsError) {
+        this.serviceIsError = serviceIsError;
+    }
+
     public JobNatureEnum getJobNature() {
         return jobNature;
     }

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SoundService.java

@@ -0,0 +1,14 @@
+package com.ym.mec.biz.service;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/5/19 0019
+ **/
+public interface SoundService {
+
+    void compare(MultipartFile record, Integer musicScoreId);
+
+}

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -3686,7 +3686,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					ts.setUpdateTime(date);
 					ts.setUserId(teacherId);
 
-					if(Objects.nonNull(mainTeacherSalary)&&!mainTeacherSalary.getEnableChangeSalary()){
+					if(TeachTypeEnum.BISHOP.equals(ts.getTeacherRole())&&Objects.nonNull(mainTeacherSalary)&&!mainTeacherSalary.getEnableChangeSalary()){
 						ts.setExpectSalary(mainTeacherSalary.getExpectSalary());
 						ts.setSubsidy(mainTeacherSalary.getSubsidy());
 						ts.setEnableChangeSalary(mainTeacherSalary.getEnableChangeSalary());

+ 22 - 20
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -2160,14 +2160,17 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             //教师
             Teacher teacher = idTeacherMap.get(teacherSalary.getUserId());
 
-            if(Objects.nonNull(teacherSalary.getActualSalary())){
-                continue;
-            }
-
             if(Objects.isNull(teacherSalary.getSubsidy())){
                 teacherSalary.setSubsidy(zero);
             }
 
+            teacherSalary.setExpectSalary(teacherSalary.getExpectSalary().setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP));
+            teacherSalary.setSubsidy(teacherSalary.getSubsidy().setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP));
+
+            if(Objects.nonNull(teacherSalary.getActualSalary())){
+                continue;
+            }
+
             switch (courseSchedule.getGroupType()){
                 case MUSIC:
                     calMusicCourseTeacherActualSalary(courseSchedule, teacherSalary, teacherAttendances, school, teacher, attendanceRange, false);
@@ -2278,6 +2281,9 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     teacherSalary.setSubsidy(zero);
                 }
 
+                teacherSalary.setExpectSalary(teacherSalary.getExpectSalary().setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP));
+                teacherSalary.setSubsidy(teacherSalary.getSubsidy().setScale(BigDecimal.ZERO.intValue(), BigDecimal.ROUND_HALF_UP));
+
                 BigDecimal oldSalary = null;
                 BigDecimal oldSubsidy = null;
                 if(Objects.nonNull(teacherSalary.getSettlementTime())){
@@ -2331,6 +2337,13 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 }
                 teacherIncomeInfo.setBelongToDaya(teacherSalary.getBelongToDaya());
                 teacherIncomeInfo.setSortNum(courseSchedule.getStartClassTime().getTime()+courseSchedule.getId());
+
+                //收入项
+                List<TeacherSalaryDeductReasonDto> incomes = new ArrayList<>();
+                incomes.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.SALARY, teacherIncomeInfo.getExpectSalary()));
+                incomes.add(new TeacherSalaryDeductReasonDto(DeductReasonEnum.COURSE_SUBSIDY, teacherIncomeInfo.getSubsidy()));
+                teacherIncomeInfo.setIncomes(incomes);
+
                 dataList.add(teacherIncomeInfo);
             }
         }
@@ -2436,18 +2449,12 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         salaryResult.put("amount", BigDecimal.ZERO);
         salaryResult.put("data", Collections.emptyList());
 
-        Map<String, Object> subsidyResult = new HashMap<>();
-        subsidyResult.put("desc", "教学点补贴");
-        subsidyResult.put("amount", BigDecimal.ZERO);
-        subsidyResult.put("data", Collections.emptyList());
-
         Map<String, Object> saleRewardResult = new HashMap<>();
         saleRewardResult.put("desc", "销售奖励");
         saleRewardResult.put("amount", BigDecimal.ZERO);
         saleRewardResult.put("data", Collections.emptyList());
 
         data.add(salaryResult);
-        data.add(subsidyResult);
         data.add(saleRewardResult);
 
         result.put("data", data);
@@ -2493,10 +2500,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         List<LocalDateBigDecimalMapDto> subsidyList = new ArrayList<>();
         List<LocalDateBigDecimalMapDto> saleRewardList = new ArrayList<>();
         for (LocalDateBigDecimalMapDto localDateBigDecimalMapDto : monthIncomeMapList) {
-            if(localDateBigDecimalMapDto.getAmount().compareTo(BigDecimal.ZERO)<0){
-                localDateBigDecimalMapDto.setSubsidy(localDateBigDecimalMapDto.getSubsidy().subtract(localDateBigDecimalMapDto.getAmount().abs()));
-                localDateBigDecimalMapDto.setAmount(BigDecimal.ZERO);
-            }
+//            if(localDateBigDecimalMapDto.getAmount().compareTo(BigDecimal.ZERO)<0){
+//                localDateBigDecimalMapDto.setSubsidy(localDateBigDecimalMapDto.getSubsidy().subtract(localDateBigDecimalMapDto.getAmount().abs()));
+//                localDateBigDecimalMapDto.setAmount(BigDecimal.ZERO);
+//            }
 
             LocalDateBigDecimalMapDto subsidyData = new LocalDateBigDecimalMapDto();
             BeanUtils.copyProperties(localDateBigDecimalMapDto, subsidyData);
@@ -2511,15 +2518,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
 
         BigDecimal reduce = monthIncomeMapList.stream().map(LocalDateBigDecimalMapDto::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
 
-        BigDecimal subsidy = monthIncomeMapList.stream().map(LocalDateBigDecimalMapDto::getSubsidy).reduce(BigDecimal.ZERO, BigDecimal::add);
-
-        result.put("total", reduce.add(subsidy));
+        result.put("total", reduce);
         salaryResult.put("amount", reduce);
         salaryResult.put("data", monthIncomeMapList);
 
-        subsidyResult.put("amount", subsidy);
-        subsidyResult.put("data", subsidyList);
-
         saleRewardResult.put("data", saleRewardList);
 
         return result;

+ 5 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -2391,8 +2391,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 courseScheduleTeacherSalary.setExpectSalary(salary);
             }
             courseScheduleTeacherSalary.setSubsidy(subsidy);
-            courseScheduleTeacherSalary.setEnableChangeSalary(false);
             courseScheduleTeacherSalary.setUpdateTime(new Date());
+            if(TeachTypeEnum.BISHOP.equals(courseScheduleTeacherSalary.getTeacherRole())){
+                courseScheduleTeacherSalary.setEnableChangeSalary(false);
+            }else{
+                courseScheduleTeacherSalary.setEnableChangeSalary(true);
+            }
             courseScheduleTeacherSalaryDao.update(courseScheduleTeacherSalary);
         }
         return true;

+ 175 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundServiceImpl.java

@@ -0,0 +1,175 @@
+package com.ym.mec.biz.service.impl;
+
+import be.tarsos.dsp.AudioDispatcher;
+import be.tarsos.dsp.AudioEvent;
+import be.tarsos.dsp.AudioProcessor;
+import be.tarsos.dsp.SilenceDetector;
+import be.tarsos.dsp.beatroot.BeatRootOnsetEventHandler;
+import be.tarsos.dsp.io.PipedAudioStream;
+import be.tarsos.dsp.io.TarsosDSPAudioInputStream;
+import be.tarsos.dsp.io.jvm.AudioDispatcherFactory;
+import be.tarsos.dsp.onsets.ComplexOnsetDetector;
+import be.tarsos.dsp.onsets.OnsetHandler;
+import com.alibaba.fastjson.JSON;
+import com.ym.mec.biz.dal.dao.SysMusicScoreDao;
+import com.ym.mec.biz.dal.entity.SysMusicScore;
+import com.ym.mec.biz.service.SoundService;
+import com.ym.mec.common.exception.BizException;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.sound.sampled.AudioFileFormat;
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioSystem;
+import javax.sound.sampled.UnsupportedAudioFileException;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/5/19 0019
+ */
+@Service
+public class SoundServiceImpl implements SoundService {
+
+    private float sampleRate = 44100;
+
+    @Autowired
+    private SysMusicScoreDao sysMusicScoreDao;
+
+    /**
+     * @describe 音频节拍信息提取
+     * @author Joburgess
+     * @date 2021/5/19 0019
+     * @return
+     */
+    private List<Double> beatExtractor(byte[] bytes, String url) throws UnsupportedAudioFileException, IOException {
+        List<Double> times = new ArrayList<>();
+        int size = 256;
+        int overlap = 128;
+        AudioDispatcher dispatcher = StringUtils.isBlank(url)?getFromByteArray(bytes, size, overlap):getFromUtl(url, size, overlap);
+
+        ComplexOnsetDetector detector = new ComplexOnsetDetector(size);
+        BeatRootOnsetEventHandler handler = new BeatRootOnsetEventHandler();
+        detector.setHandler(handler);
+
+        dispatcher.addAudioProcessor(detector);
+        dispatcher.run();
+
+        handler.trackBeats(new OnsetHandler() {
+            @Override
+            public void handleOnset(double time, double salience) {
+                times.add(time);
+            }
+        });
+        return times;
+    }
+
+    /**
+     * @describe 音频分贝信息提取
+     * @author Joburgess
+     * @date 2021/5/19 0019
+     * @param bytes: 文件字节
+     * @return java.util.List<java.lang.Double>
+     */
+    private List<Double> soundPressureLevelExtractor(byte[] bytes, String url) throws UnsupportedAudioFileException, IOException {
+        List<Double> pitchs = new ArrayList<>();
+        int size = 2048;
+        int overlap = 0;
+        final SilenceDetector silenceDetecor = new SilenceDetector();
+        AudioDispatcher dispatcher = StringUtils.isBlank(url)?getFromByteArray(bytes, size, overlap):getFromUtl(url, size, overlap);
+        dispatcher.addAudioProcessor(silenceDetecor);
+        dispatcher.addAudioProcessor(new AudioProcessor() {
+            @Override
+            public void processingFinished() {
+            }
+
+            @Override
+            public boolean process(AudioEvent audioEvent) {
+                pitchs.add(Double.isInfinite(silenceDetecor.currentSPL())?0:silenceDetecor.currentSPL());
+                return true;
+            }
+        });
+        dispatcher.run();
+        return pitchs;
+    }
+
+    private AudioDispatcher getFromByteArray(byte[] bytes, int size, int overlap) throws UnsupportedAudioFileException {
+        AudioFormat audioFormat = new AudioFormat(sampleRate, 16, 1, true, false);
+        AudioDispatcher dispatcher = AudioDispatcherFactory.fromByteArray(bytes, audioFormat, size, overlap);
+        return dispatcher;
+    }
+
+    private AudioDispatcher getFromUtl(String url, int size, int overlap) throws UnsupportedAudioFileException, IOException {
+        AudioDispatcher dispatcher = AudioDispatcherFactory.fromURL(new URL(url), size, overlap);
+        return dispatcher;
+    }
+
+    @Override
+    public void compare(MultipartFile record, Integer musicScoreId) {
+        SysMusicScore sysMusicScore = sysMusicScoreDao.get(musicScoreId);
+        if(Objects.isNull(sysMusicScore)|| StringUtils.isBlank(sysMusicScore.getUrl())){
+            throw new BizException("伴奏信息错误");
+        }
+
+        try {
+            AudioFileFormat sourceFile = AudioSystem.getAudioFileFormat(new URL(sysMusicScore.getUrl()));
+            double l_s = sourceFile.getFrameLength()/sourceFile.getFormat().getFrameRate();
+            System.out.printf("源长度:%.2f \n", l_s);
+            AudioFileFormat recordFile = AudioSystem.getAudioFileFormat(record.getInputStream());
+            double r_s = sourceFile.getFrameLength()/sourceFile.getFormat().getFrameRate();
+            System.out.printf("录音长度:%.2f \n", r_s);
+
+            //相似度
+            List<Double> pitchs_s = soundPressureLevelExtractor(null, sysMusicScore.getUrl());
+            List<Double> pitchs_r = soundPressureLevelExtractor(record.getBytes(), null);
+
+            int maxLength = pitchs_s.size();
+            if(pitchs_r.size()<maxLength){
+                maxLength = pitchs_r.size();
+            }
+
+            Double pitchSize = Double.valueOf(0);
+            Double allPitchGap = Double.valueOf(0);
+            for(int i=0;i<maxLength;i++){
+                Double pitch1 = Math.abs(pitchs_s.get(i));
+                Double pitch2 = Math.abs(pitchs_r.get(i));
+                Double pitchGap = Math.abs(pitch1-pitch2);
+                if(pitchGap>pitch1){
+                    pitchGap = pitch1;
+                }
+                allPitchGap+=pitchGap;
+                pitchSize+=pitch1;
+            }
+            Double intonation = 1-(allPitchGap/pitchSize);
+            System.out.printf("音准:%.2f \r\n", intonation);
+
+            //节奏
+            List<Double> times_s = beatExtractor(null, sysMusicScore.getUrl());
+            List<Double> times_r = beatExtractor(record.getBytes(), null);
+
+            float sameTimes = 0;
+            for (Double time1 : times_s) {
+                for (Double time2 : times_r) {
+                    if(Math.abs(time2-time1)<0.1){
+                        sameTimes++;
+                    }
+                }
+            }
+            Double cadence = Double.valueOf(sameTimes/times_s.size());
+            System.out.printf("节奏:%.2f", cadence);
+        } catch (UnsupportedAudioFileException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            return;
+        }
+    }
+}

+ 12 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -244,13 +244,17 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupApplyBaseInfo().getVipGroupActivityId());
 		if(Objects.nonNull(vipGroupActivity)&&Objects.nonNull(vipGroupActivity.getStudentMaxUsedTimes())&&vipGroupActivity.getStudentMaxUsedTimes()!=-1&&StringUtils.isNotBlank(vipGroupApplyBaseInfoDto.getStudentIdList())){
 			List<String> tempStudentIds = Arrays.asList(vipGroupApplyBaseInfoDto.getStudentIdList().split(","));
+			List<Integer> errStudentIds = new ArrayList<>();
 			for (String studentIdStr : tempStudentIds) {
 				int useNum = vipGroupDao.countStudentUserActivityNum(vipGroup.getVipGroupApplyBaseInfo().getVipGroupActivityId(), Integer.valueOf(studentIdStr));
 				if(useNum>=vipGroupActivity.getStudentMaxUsedTimes()){
-					SysUser student = teacherDao.getUser(Integer.valueOf(studentIdStr));
-					throw new BizException("{}学员已超过该活动购买次数限制", student.getUsername());
+					errStudentIds.add(Integer.valueOf(studentIdStr));
 				}
 			}
+			if(errStudentIds.size()>0){
+				List<SimpleUserDto> students = teacherDao.getUsersSimpleInfo(errStudentIds);
+				throw new BizException("学员{}已超过该活动购买次数限制", StringUtils.join(students.stream().map(SimpleUserDto::getNickName).collect(Collectors.toList()), "、"));
+			}
 		}
 		//判断课程安排是否超出范围
 		if(Objects.nonNull(vipGroupActivity)&&(Objects.nonNull(vipGroupActivity.getCoursesEndTime())||Objects.nonNull(vipGroupActivity.getCoursesStartTime()))){
@@ -2911,13 +2915,17 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		}
 
 		if(Objects.nonNull(vipGroupActivity)&&Objects.nonNull(vipGroupActivity.getStudentMaxUsedTimes())&&vipGroupActivity.getStudentMaxUsedTimes()!=-1&&!CollectionUtils.isEmpty(studentIds)){
+			List<Integer> errStudentIds = new ArrayList<>();
 			for (Integer studentId : studentIds) {
 				int useNum = vipGroupDao.countStudentUseingActivityNum(vipGroup.getVipGroupActivityId(), Integer.valueOf(studentId));
 				if(useNum>=vipGroupActivity.getStudentMaxUsedTimes()){
-					SysUser student = teacherDao.getUser(studentId);
-					throw new BizException("{}学员已超过该活动购买次数限制", student.getUsername());
+					errStudentIds.add(studentId);
 				}
 			}
+			if(errStudentIds.size()>0){
+				List<SimpleUserDto> students = teacherDao.getUsersSimpleInfo(errStudentIds);
+				throw new BizException("学员{}已超过该活动购买次数限制", StringUtils.join(students.stream().map(SimpleUserDto::getNickName).collect(Collectors.toList()), ","));
+			}
 		}
 
 		Date now=new Date();

+ 2 - 2
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -469,7 +469,7 @@
 		UPDATE course_schedule_teacher_salary csts left join course_schedule cs on csts.course_schedule_id_ = cs.id_ 
 		set
 			csts.subsidy_ = #{subsidy},
-		    csts.enable_change_salary_ = 0,
+		    csts.enable_change_salary_ = IF(teacher_role_='BISHOP', 0, 1),
 		    <if test="salary!=null">
 				csts.expect_salary_ = #{salary},
 			</if>
@@ -1129,7 +1129,7 @@
 				DATE_FORMAT( cs.class_date_, '%Y-%m-%d' ) dateStr,
 			</if>
 		    SUM(csts.subsidy_) subsidy,
-			SUM( csts.actual_salary_ - csts.subsidy_ ) amount
+			SUM( csts.actual_salary_) amount
 		FROM
 			course_schedule_teacher_salary csts
 				LEFT JOIN course_schedule cs ON csts.course_schedule_id_ = cs.id_

+ 18 - 0
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -290,6 +290,9 @@
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
 				AND exercises_message_num_ &lt; exercises_reply_num_
 			</if>
+			<if test="serviceIsError!=null and serviceIsError">
+				AND (actual_exercises_num_ &lt; expect_exercises_num_ OR exercises_message_num_ &lt; exercises_reply_num_)
+			</if>
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
 				AND exercises_message_num_ &gt;= exercises_reply_num_
 			</if>
@@ -310,6 +313,9 @@
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
 				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_
 			</if>
+			<if test="serviceIsError!=null and serviceIsError">
+				AND (actual_exercises_num_ &lt; expect_exercises_num_ OR IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_)
+			</if>
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
 				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &gt;= exercises_reply_num_
 			</if>
@@ -378,6 +384,9 @@
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
 				AND exercises_message_num_ &lt; exercises_reply_num_
 			</if>
+			<if test="serviceIsError!=null and serviceIsError">
+				AND (actual_exercises_num_ &lt; expect_exercises_num_ OR exercises_message_num_ &lt; exercises_reply_num_)
+			</if>
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
 				AND exercises_message_num_ &gt;= exercises_reply_num_
 			</if>
@@ -398,6 +407,9 @@
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
 				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_
 			</if>
+			<if test="serviceIsError!=null and serviceIsError">
+				AND (actual_exercises_num_ &lt; expect_exercises_num_ OR IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &lt; exercises_reply_num_)
+			</if>
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
 				AND IF(DATE_FORMAT(last_submit_time_, '%Y-%m-%d') BETWEEN #{submitStartDate} AND #{submitEndDate},exercises_message_num_,0) &gt;= exercises_reply_num_
 			</if>
@@ -592,6 +604,9 @@
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
 				AND SUM(exercises_message_num_) &lt; SUM(exercises_reply_num_)
 			</if>
+			<if test="serviceIsError!=null and serviceIsError">
+				AND (SUM(actual_exercises_num_) &lt; SUM(expect_exercises_num_) OR SUM(exercises_message_num_) &lt; SUM(exercises_reply_num_))
+			</if>
 			<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
 				AND SUM(exercises_message_num_) &gt;= SUM(exercises_reply_num_)
 			</if>
@@ -639,6 +654,9 @@
 				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==0">
 					AND SUM(exercises_message_num_) &lt; SUM(exercises_reply_num_)
 				</if>
+				<if test="serviceIsError!=null and serviceIsError">
+					AND (SUM(actual_exercises_num_) &lt; SUM(expect_exercises_num_) OR SUM(exercises_message_num_) &lt; SUM(exercises_reply_num_))
+				</if>
 				<if test="exercisesMessageNumIsAchieve!=null and exercisesMessageNumIsAchieve==1">
 					AND SUM(exercises_message_num_) &gt;= SUM(exercises_reply_num_)
 				</if>

+ 6 - 0
mec-common/common-core/pom.xml

@@ -66,5 +66,11 @@
 			<artifactId>emoji-java</artifactId>
 		</dependency>
 
+
+		<dependency>
+			<groupId>com.github.dragoon000320</groupId>
+			<artifactId>tarsosdsp</artifactId>
+			<version>1.0</version>
+		</dependency>
 	</dependencies>
 </project>

+ 69 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/SoundController.java

@@ -0,0 +1,69 @@
+package com.ym.mec.teacher.controller;
+
+import be.tarsos.dsp.AudioDispatcher;
+import be.tarsos.dsp.AudioEvent;
+import be.tarsos.dsp.AudioProcessor;
+import be.tarsos.dsp.SilenceDetector;
+import be.tarsos.dsp.beatroot.BeatRootOnsetEventHandler;
+import be.tarsos.dsp.io.jvm.AudioDispatcherFactory;
+import be.tarsos.dsp.onsets.ComplexOnsetDetector;
+import be.tarsos.dsp.onsets.OnsetHandler;
+import com.netflix.discovery.converters.Auto;
+import com.ym.mec.biz.service.SoundService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.sound.sampled.UnsupportedAudioFileException;
+import java.io.File;
+import java.io.IOException;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/5/19 0019
+ */
+@Api(tags = "音频服务")
+@RequestMapping("sound")
+@RestController
+public class SoundController extends BaseController {
+
+    private final Logger LOGGER = LoggerFactory.getLogger(SoundController.class);
+
+    @Autowired
+    private SoundService soundService;
+
+    @ApiOperation(value = "评分")
+    @PostMapping("compare")
+    public HttpResponseResult compare(@RequestParam("record") MultipartFile record, Integer musicScoreId){
+        Map<String, String> result = new HashMap<>();
+
+        LOGGER.info("文件名:{},伴奏编号:{}", record.getOriginalFilename(), musicScoreId);
+
+        DecimalFormat df   = new DecimalFormat("######0.00");
+
+        result.put("score", df.format(Math.random()*100));
+        result.put("intonation", df.format(Math.random()*100));
+        result.put("cadence", df.format(Math.random()*100));
+        result.put("integrity", df.format(Math.random()*100));
+
+        soundService.compare(record, musicScoreId);
+
+        return succeed(result);
+    }
+
+}

+ 6 - 2
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -2530,8 +2530,12 @@ public class ExportController extends BaseController {
         }
 
         try {
-            String[] header = {"分部", "老师编号", "老师姓名", "服务周期", "课后作业(节)", "课外作业(人)", "是否异常", "提醒时间", "操作人"};
-            String[] body = {"organName", "teacherId", "teacherName", "dateRange", "homeworkNum", "exerciseNum", "unDone==0?'否':'是'", "remindDate", "operatorName"};
+            String[] header = {"分部", "老师编号", "老师姓名", "服务周期", "课后作业(节)", "课外作业(人)",
+                    "作业布置", "作业点评", "作业提交率",
+                    "提醒时间", "操作人"};
+            String[] body = {"organName", "teacherId", "teacherName", "dateRange", "homeworkNum", "exerciseNum",
+                    "expectExercisesNum>actualExercisesNum?'异常':'正常'", "exercisesReplyNum>exercisesMessageNum?'异常':'正常'", "exercisesReplyNum",
+                    "remindDate", "operatorName"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, result.getRows());
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=teacherDefaultSalary-" + DateUtil.getDate(new Date()) + ".xls");