Browse Source

feat:教务端学员云教练数据统计

Joburgess 3 years ago
parent
commit
2ca09c6230

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

@@ -8,6 +8,8 @@ import io.swagger.annotations.ApiModelProperty;
  */
 public class EduOrganStudentDataDto {
 
+    private int index;
+
     private Integer organId;
 
     @ApiModelProperty("分部名称")
@@ -43,6 +45,14 @@ public class EduOrganStudentDataDto {
     @ApiModelProperty("云教练新增人数")
     private int newCloudStudyStudentNum;
 
+    public int getIndex() {
+        return index;
+    }
+
+    public void setIndex(int index) {
+        this.index = index;
+    }
+
     public Integer getOrganId() {
         return organId;
     }

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCheckInfoDto.java

@@ -0,0 +1,32 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/19 0019
+ */
+public class SoundCheckInfoDto {
+
+    private int curIndex;
+
+    private List<Double> frequencyList;
+
+    public int getCurIndex() {
+        return curIndex;
+    }
+
+    public void setCurIndex(int curIndex) {
+        this.curIndex = curIndex;
+    }
+
+    public List<Double> getFrequencyList() {
+        return frequencyList;
+    }
+
+    public void setFrequencyList(List<Double> frequencyList) {
+        this.frequencyList = frequencyList;
+    }
+}

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/WebsocketTypeEnum.java

@@ -0,0 +1,34 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum WebsocketTypeEnum implements BaseEnum<String, WebsocketTypeEnum> {
+	SOUND_COMPARE("SOUND_COMPARE", "评测"),
+	SOUND_CHECK("SOUND_CHECK", "校音");
+
+	private String code;
+
+	private String msg;
+
+	WebsocketTypeEnum(String code, String msg) {
+		this.code = code;
+		this.msg = msg;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	@Override
+	public String getCode() {
+		return this.code;
+	}
+}

+ 10 - 12
mec-biz/src/main/java/com/ym/mec/biz/handler/WebSocketHandler.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.handler;
 import com.alibaba.fastjson.JSON;
 import com.ym.mec.biz.dal.dto.WebSocketClientDetail;
 import com.ym.mec.biz.dal.dto.WebSocketInfo;
+import com.ym.mec.biz.dal.enums.WebsocketTypeEnum;
 import com.ym.mec.biz.service.SoundSocketService;
 import com.ym.mec.biz.service.WebSocketEventHandler;
 import org.apache.commons.lang3.StringUtils;
@@ -30,21 +31,21 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
      */
     public static final Map<String, WebSocketClientDetail> WS_CLIENTS = new ConcurrentHashMap<>();
 
-    private static Map<String, WebSocketEventHandler> appMap = new ConcurrentHashMap<>();
+    private static Map<WebsocketTypeEnum, WebSocketEventHandler> appMap = new ConcurrentHashMap<>();
 
     /**
      * @describe 注册应用
      * @author Joburgess
      * @date 2021/8/5 0005
-     * @param tag:
+     * @param websocketType:
      * @param webSocketEventHandler:
      * @return boolean
      */
-    public static boolean regist(String tag, WebSocketEventHandler webSocketEventHandler){
-        if (appMap.containsKey(tag)){
+    public static boolean regist(WebsocketTypeEnum websocketType, WebSocketEventHandler webSocketEventHandler){
+        if (appMap.containsKey(websocketType)){
             return false;
         }
-        appMap.put(tag, webSocketEventHandler);
+        appMap.put(websocketType, webSocketEventHandler);
         return true;
     }
 
@@ -67,15 +68,12 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         String phone = session.getPrincipal().getName().split(":")[1];
         LOGGER.info("{}: {}", phone, message.getPayload());
         WebSocketInfo webSocketInfo = JSON.parseObject(message.getPayload(), WebSocketInfo.class);
-        String tag = "";
+
+        WebsocketTypeEnum websocketType = WebsocketTypeEnum.SOUND_COMPARE;
         if(webSocketInfo.getHeader().containsKey(SoundSocketService.TAG)){
-            tag = webSocketInfo.getHeader().get(SoundSocketService.TAG);
-        }
-        if(StringUtils.isNotBlank(tag)){
-            appMap.get(tag).receiveTextMessage(session, phone, message);
-        }else{
-            appMap.values().forEach(e->e.receiveTextMessage(session, phone, message));
+            websocketType = WebsocketTypeEnum.valueOf(webSocketInfo.getHeader().get(SoundSocketService.TAG));
         }
+        appMap.get(websocketType).receiveTextMessage(session, phone, message);
     }
 
     @Override

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

@@ -1326,7 +1326,11 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			comparing = Comparator.comparing(EduOrganStudentDataDto::getOrganId);
 		}
 
-		result = result.stream().skip(pageInfo.getOffset()).limit(pageInfo.getLimit()).sorted(comparing).collect(Collectors.toList());
+		result.sort(comparing);
+		for (int i = 0; i < result.size(); i++) {
+			result.get(i).setIndex(i+1);
+		}
+		result = result.stream().skip(pageInfo.getOffset()).limit(pageInfo.getLimit()).collect(Collectors.toList());
 		pageInfo.setRows(result);
 		return pageInfo;
 	}

+ 77 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCheckHandler.java

@@ -0,0 +1,77 @@
+package com.ym.mec.biz.service.impl;
+
+import be.tarsos.dsp.AudioDispatcher;
+import be.tarsos.dsp.AudioEvent;
+import be.tarsos.dsp.io.jvm.AudioDispatcherFactory;
+import be.tarsos.dsp.pitch.PitchDetectionHandler;
+import be.tarsos.dsp.pitch.PitchDetectionResult;
+import be.tarsos.dsp.pitch.PitchProcessor;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.biz.dal.dto.MusicPitchDetailDto;
+import com.ym.mec.biz.dal.dto.SoundCheckInfoDto;
+import com.ym.mec.biz.dal.dto.WebSocketInfo;
+import com.ym.mec.biz.dal.enums.WebsocketTypeEnum;
+import com.ym.mec.biz.handler.WebSocketHandler;
+import com.ym.mec.biz.service.SoundSocketService;
+import com.ym.mec.biz.service.WebSocketEventHandler;
+import com.ym.mec.common.exception.BizException;
+import org.springframework.stereotype.Service;
+import org.springframework.web.socket.BinaryMessage;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+
+import javax.sound.sampled.UnsupportedAudioFileException;
+import java.io.File;
+import java.io.IOException;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/19 0019
+ */
+@Service
+public class SoundCheckHandler implements WebSocketEventHandler {
+
+    private static final double COMPARE_FREQUENCY = 442;
+
+    /** 校音数据 */
+    private Map<String, Integer> userSoundCheckInfo = new ConcurrentHashMap<>();
+
+    public SoundCheckHandler() {
+        WebSocketHandler.regist(WebsocketTypeEnum.SOUND_CHECK, this);
+    }
+
+    @Override
+    public void afterConnectionEstablished(WebSocketSession session, String phone) {
+
+    }
+
+    @Override
+    public void receiveTextMessage(WebSocketSession session, String phone, TextMessage message) {
+        userSoundCheckInfo.put(phone, 0);
+    }
+
+    @Override
+    public void receiveBinaryMessage(WebSocketSession session, String phone, BinaryMessage message) {
+        if(!userSoundCheckInfo.containsKey(phone)){
+            return;
+        }
+        try {
+            AudioDispatcher dispatcher = AudioDispatcherFactory.fromByteArray(message.getPayload().array(), SoundCompareHandler.soundCompareConfig.audioFormat, SoundCompareHandler.soundCompareConfig.simpleSize, SoundCompareHandler.soundCompareConfig.overlap);
+            dispatcher.addAudioProcessor(new PitchProcessor(SoundCompareHandler.soundCompareConfig.algo, SoundCompareHandler.soundCompareConfig.simpleRate, SoundCompareHandler.soundCompareConfig.simpleSize, (pitchDetectionResult, audioEvent) -> {
+
+            }));
+            dispatcher.run();
+        } catch (UnsupportedAudioFileException e) {
+            throw new BizException("{}校音异常:{}", phone, e);
+        }
+    }
+
+    @Override
+    public void afterConnectionClosed(WebSocketSession session, String phone) {
+
+    }
+}

+ 3 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java

@@ -13,6 +13,7 @@ import com.ym.mec.biz.dal.dto.SoundCompareHelper;
 import com.ym.mec.biz.dal.dto.WavHeader;
 import com.ym.mec.biz.dal.dto.WebSocketInfo;
 import com.ym.mec.biz.dal.enums.DeviceTypeEnum;
+import com.ym.mec.biz.dal.enums.WebsocketTypeEnum;
 import com.ym.mec.biz.handler.WebSocketHandler;
 import com.ym.mec.biz.service.SoundSocketService;
 import com.ym.mec.biz.service.SysMusicCompareRecordService;
@@ -74,7 +75,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
     private SysMusicScoreAccompanimentDao sysMusicScoreAccompanimentDao;
 
     public SoundCompareHandler() {
-        WebSocketHandler.regist("SOUND_COMPARE", this);
+        WebSocketHandler.regist(WebsocketTypeEnum.SOUND_COMPARE, this);
         File soundDir = new File(tmpDir);
         if(!soundDir.exists()){
             soundDir.mkdir();
@@ -269,7 +270,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
         sysMusicCompareRecordService.saveMusicCompareData(phone, userSoundInfoMap.get(phone));
 
         if(Objects.nonNull(userSoundInfoMap.get(phone).getFile())){
-            userSoundInfoMap.get(phone).getFile().deleteOnExit();
+            userSoundInfoMap.get(phone).getFile().delete();
         }
 
         userSoundInfoMap.remove(phone);

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

@@ -3170,9 +3170,8 @@ public class ExportController extends BaseController {
         }
         OutputStream outputStream = response.getOutputStream();
         try {
-            String[] header = {"分部", "老师姓名", "学员总数", "付费学员数量",
-                    "试用会员", "会员占比"};
-            String[] body = {"teacherId", "teacherName", "totalStudentNum", "vipStudentNum", "eVipStudentNum", "vipStudentDuty"};
+            String[] header = {"分部", "学员总数", "付费会员数量","会员占比"};
+            String[] body = {"organName", "totalStudentNum", "vipStudentNum", "vipStudentDuty"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=employeeInfo-" + DateUtil.getDate(new Date()) + ".xls");
@@ -3223,9 +3222,8 @@ public class ExportController extends BaseController {
         }
         OutputStream outputStream = response.getOutputStream();
         try {
-            String[] header = {"分部", "老师姓名", "学员总数", "付费学员数量",
-                    "试用会员", "会员占比"};
-            String[] body = {"teacherId", "teacherName", "totalStudentNum", "vipStudentNum", "eVipStudentNum", "vipStudentDuty"};
+            String[] header = {"排名", "分部", "学员总数", "付费会员数量","会员占比"};
+            String[] body = {"index", "organName", "totalStudentNum", "vipStudentNum", "vipStudentDuty"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=employeeInfo-" + DateUtil.getDate(new Date()) + ".xls");