Преглед на файлове

Merge remote-tracking branch 'origin/master'

zouxuan преди 4 години
родител
ревизия
3dbb916d37
променени са 34 файла, в които са добавени 803 реда и са изтрити 134 реда
  1. 18 4
      cms/src/main/java/com/ym/mec/cms/controller/NewsController.java
  2. 10 0
      cms/src/main/java/com/ym/mec/cms/controller/queryinfo/NewsInformationQueryInfo.java
  3. 1 1
      cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsInformationServiceImpl.java
  4. 1 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/handler/BaseAuthenticationSuccessEventHandler.java
  5. 1 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserServiceImpl.java
  6. 1 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java
  7. 60 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/config/SoundCompareConfig.java
  8. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeInfoDao.java
  9. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeVisitDao.java
  10. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EmployeeInfoDto.java
  11. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCompareHelper.java
  12. 53 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/WebSocketClientDetail.java
  13. 66 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/EmployeeInfo.java
  14. 91 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/EmployeeVisit.java
  15. 58 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java
  16. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/StaffStatusEnum.java
  17. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/EmployeeInfoQueryInfo.java
  18. 34 90
      mec-biz/src/main/java/com/ym/mec/biz/handler/WebSocketHandler.java
  19. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeInfoService.java
  20. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeVisitService.java
  21. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java
  22. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeInfoServiceImpl.java
  23. 48 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeVisitServiceImpl.java
  24. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  25. 12 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  26. 45 4
      mec-biz/src/main/resources/config/mybatis/EmployeeInfoMapper.xml
  27. 84 0
      mec-biz/src/main/resources/config/mybatis/EmployeeVisitMapper.xml
  28. 22 2
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  29. 8 6
      mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java
  30. 7 3
      mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java
  31. 4 4
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SoundController.java
  32. 43 8
      mec-web/src/main/java/com/ym/mec/web/controller/APIController.java
  33. 22 0
      mec-web/src/main/java/com/ym/mec/web/controller/EmployeeController.java
  34. 27 0
      mec-web/src/main/java/com/ym/mec/web/controller/EmployeeInfoController.java

+ 18 - 4
cms/src/main/java/com/ym/mec/cms/controller/NewsController.java

@@ -8,6 +8,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -26,6 +27,7 @@ import com.ym.mec.cms.service.SysNewsInformationService;
 import com.ym.mec.cms.service.SysNewsTypeService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.web.WebFeignService;
 import com.yonge.log.model.AuditLogAnnotation;
 
 @RestController
@@ -44,16 +46,28 @@ public class NewsController extends BaseController {
 	
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
-
+	
+	@Autowired
+	private WebFeignService webFeignService;
+	
 	@ApiOperation("资讯列表分页查询")
 	@GetMapping(value = "/list")
 	public Object getList(NewsInformationQueryInfo queryInfo) {
+
 		SysUser user = sysUserFeignService.queryUserInfo();
-		if (user == null || user.getId() == null) {
-			queryInfo.setOrganId(43);
+		
+		String clientId = queryInfo.getClientId();
+		
+		if (!StringUtils.equalsIgnoreCase("student", clientId)) {
+			queryInfo.setOrganIdList(webFeignService.queryOrganIdByUserId(user.getId(), clientId));
 		} else {
-			queryInfo.setOrganId(user.getOrganId());
+			if (user == null || user.getId() == null) {
+				queryInfo.setOrganId(43);
+			} else {
+				queryInfo.setOrganId(user.getOrganId());
+			}
 		}
+		
 		Map<String, Object> params = new HashMap<String, Object>();
 		MapUtil.populateMap(params, queryInfo);
 		int count = sysNewsInformationDao.queryCount(params);

+ 10 - 0
cms/src/main/java/com/ym/mec/cms/controller/queryinfo/NewsInformationQueryInfo.java

@@ -35,6 +35,8 @@ public class NewsInformationQueryInfo extends QueryInfo {
 	
 	private String clientName;
 	
+	private String clientId;
+	
 	private String organIdList;
 	
 	private Date date;
@@ -126,4 +128,12 @@ public class NewsInformationQueryInfo extends QueryInfo {
 	public void setOrganIdList(String organIdList) {
 		this.organIdList = organIdList;
 	}
+
+	public String getClientId() {
+		return clientId;
+	}
+
+	public void setClientId(String clientId) {
+		this.clientId = clientId;
+	}
 }

+ 1 - 1
cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsInformationServiceImpl.java

@@ -23,8 +23,8 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.im.WebFeignService;
 import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.web.WebFeignService;
 
 @Service
 public class SysNewsInformationServiceImpl extends BaseServiceImpl<Long, SysNewsInformation> implements SysNewsInformationService {

+ 1 - 1
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/handler/BaseAuthenticationSuccessEventHandler.java

@@ -12,7 +12,7 @@ import javax.servlet.http.HttpServletResponse;
 import com.ym.mec.common.entity.ImResult;
 import com.ym.mec.common.entity.ImUserModel;
 import com.ym.mec.im.ImFeignService;
-import com.ym.mec.im.WebFeignService;
+import com.ym.mec.web.WebFeignService;
 
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;

+ 1 - 1
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserServiceImpl.java

@@ -23,7 +23,7 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.im.ImFeignService;
-import com.ym.mec.im.WebFeignService;
+import com.ym.mec.web.WebFeignService;
 
 @Service
 public class SysUserServiceImpl extends BaseServiceImpl<Integer, SysUser> implements SysUserService {

+ 1 - 1
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java

@@ -1,6 +1,5 @@
 package com.ym.mec.auth.web.controller;
 
-import com.ym.mec.im.WebFeignService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -40,6 +39,7 @@ import com.ym.mec.thirdparty.eseal.ESealPlugin;
 import com.ym.mec.thirdparty.user.realname.RealnameAuthenticationPluginContext;
 import com.ym.mec.thirdparty.user.realname.provider.LinkfaceRealnameAuthenticationPlugin;
 import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.web.WebFeignService;
 
 @RestController()
 @RequestMapping("user")

+ 60 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/config/SoundCompareConfig.java

@@ -0,0 +1,60 @@
+package com.ym.mec.biz.dal.config;
+
+import be.tarsos.dsp.SilenceDetector;
+import be.tarsos.dsp.pitch.PitchProcessor;
+
+import javax.sound.sampled.AudioFormat;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/4 0004
+ */
+public class SoundCompareConfig {
+
+    /**
+     * @describe 采样率
+     */
+    public float simpleRate = 44100;
+    /**
+     * @describe 采样大小
+     */
+    public int simpleSize = 1024;
+    /**
+     * @describe 帧覆盖大小
+     */
+    public int overlap = 256;
+
+    /**
+     * @describe 音频解析格式
+     */
+    public AudioFormat audioFormat = new AudioFormat(simpleRate, 16, 1, true, false);
+    /**
+     * @describe 音频解析算法
+     */
+    public PitchProcessor.PitchEstimationAlgorithm algo = PitchProcessor.PitchEstimationAlgorithm.FFT_YIN;
+    /**
+     * @describe 分贝检测器
+     */
+    public SilenceDetector silenceDetector = new SilenceDetector();
+
+    /**
+     * @describe 有效分贝大小
+     */
+    public int validDb = -70;
+    /**
+     * @describe 有效频率
+     */
+    public int validFrequency = 20;
+    /**
+     * @describe 音准前后音分误差范围
+     */
+    public int intonationCentsRange = 3;
+    /**
+     * @describe 节奏有效阈值
+     */
+    public float cadenceValidDuty = 0.09f;
+    /**
+     * @describe 完整性有效频率误差范围
+     */
+    public int integrityFrequencyRange = 30;
+}

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeInfoDao.java

@@ -1,9 +1,10 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.biz.dal.dto.EmployeeInfoDto;
 import com.ym.mec.biz.dal.entity.EmployeeInfo;
 import com.ym.mec.common.dal.BaseDAO;
 
 public interface EmployeeInfoDao extends BaseDAO<Long, EmployeeInfo> {
 
-	
+	EmployeeInfoDto queryDetail(Long id);
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeVisitDao.java

@@ -0,0 +1,11 @@
+package com.ym.mec.biz.dal.dao;
+
+import java.util.List;
+
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.entity.EmployeeVisit;
+
+public interface EmployeeVisitDao extends BaseDAO<Long, EmployeeVisit> {
+
+	List<EmployeeVisit> queryByEmployeeInfoId(Long employeeInfoId);
+}

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EmployeeInfoDto.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dto;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.ym.mec.biz.dal.entity.EmployeeInfo;
+import com.ym.mec.biz.dal.entity.EmployeeVisit;
+
+public class EmployeeInfoDto extends EmployeeInfo {
+
+	private List<EmployeeVisit> employeeVisitList = new ArrayList<EmployeeVisit>();
+
+	public List<EmployeeVisit> getEmployeeVisitList() {
+		return employeeVisitList;
+	}
+
+	public void setEmployeeVisitList(List<EmployeeVisit> employeeVisitList) {
+		this.employeeVisitList = employeeVisitList;
+	}
+}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCompareHelper.java

@@ -21,6 +21,9 @@ public class SoundCompareHelper {
     @ApiModelProperty
     private RandomAccessFile accessFile;
 
+    @ApiModelProperty(value = "录音文件地址")
+    private String recordFilePath;
+
     @ApiModelProperty(value = "小节xml信息字典")
     private Map<Integer, List<MusicPitchDetailDto>> measureXmlInfoMap = new HashMap<>();
 
@@ -89,6 +92,14 @@ public class SoundCompareHelper {
         return accessFile;
     }
 
+    public String getRecordFilePath() {
+        return recordFilePath;
+    }
+
+    public void setRecordFilePath(String recordFilePath) {
+        this.recordFilePath = recordFilePath;
+    }
+
     public void setAccessFile(RandomAccessFile accessFile) {
         this.accessFile = accessFile;
     }

+ 53 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/WebSocketClientDetail.java

@@ -0,0 +1,53 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.web.socket.WebSocketSession;
+
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/4 0004
+ */
+public class WebSocketClientDetail {
+
+    private WebSocketSession session;
+
+    @ApiModelProperty(value = "用户登录时间")
+    private Date loginTime;
+
+    @ApiModelProperty(value = "用户退出或断开时间")
+    private Date logoutTime;
+
+    public WebSocketClientDetail() {
+    }
+
+    public WebSocketClientDetail(WebSocketSession session, Date loginTime) {
+        this.session = session;
+        this.loginTime = loginTime;
+    }
+
+    public WebSocketSession getSession() {
+        return session;
+    }
+
+    public void setSession(WebSocketSession session) {
+        this.session = session;
+    }
+
+    public Date getLoginTime() {
+        return loginTime;
+    }
+
+    public void setLoginTime(Date loginTime) {
+        this.loginTime = loginTime;
+    }
+
+    public Date getLogoutTime() {
+        return logoutTime;
+    }
+
+    public void setLogoutTime(Date logoutTime) {
+        this.logoutTime = logoutTime;
+    }
+}

+ 66 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/EmployeeInfo.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import com.ym.mec.biz.dal.enums.JobNatureEnum;
 import com.ym.mec.biz.dal.enums.JobTypeEnum;
 import com.ym.mec.biz.dal.enums.StaffStatusEnum;
 
@@ -56,6 +57,9 @@ public class EmployeeInfo {
 
 	@ApiModelProperty(value = "声部", required = false)
 	private String subjectIdList;
+
+	@ApiModelProperty(value = "入职声部", required = false)
+	private String jobSubjectIdList;
 	
 	private String subjectName;
 
@@ -91,6 +95,9 @@ public class EmployeeInfo {
 	@ApiModelProperty(value = "离职日期", required = false)
 	private java.util.Date resignationDate;
 
+	@ApiModelProperty(value = "离职原因", required = false)
+	private String resignationReason;
+
 	@ApiModelProperty(value = "操作人编号", required = false)
 	private Integer operatorId;
 	
@@ -98,6 +105,17 @@ public class EmployeeInfo {
 
 	@ApiModelProperty(value = "信息来源", required = false)
 	private String sourceFrom;
+	
+	@ApiModelProperty(value = "岗位类别", required = false)
+	private JobTypeEnum jobType;
+	
+	@ApiModelProperty(value = "意向合作方式", required = false)
+	private JobNatureEnum jobNature;
+	
+	private String hrbp;
+	
+	/** 下次回访时间 */
+	private java.util.Date nextVisitDate;
 
 	/**  */
 	private java.util.Date createTime;
@@ -361,6 +379,54 @@ public class EmployeeInfo {
 		this.operatorName = operatorName;
 	}
 
+	public String getJobSubjectIdList() {
+		return jobSubjectIdList;
+	}
+
+	public void setJobSubjectIdList(String jobSubjectIdList) {
+		this.jobSubjectIdList = jobSubjectIdList;
+	}
+
+	public String getResignationReason() {
+		return resignationReason;
+	}
+
+	public void setResignationReason(String resignationReason) {
+		this.resignationReason = resignationReason;
+	}
+
+	public JobTypeEnum getJobType() {
+		return jobType;
+	}
+
+	public void setJobType(JobTypeEnum jobType) {
+		this.jobType = jobType;
+	}
+
+	public JobNatureEnum getJobNature() {
+		return jobNature;
+	}
+
+	public void setJobNature(JobNatureEnum jobNature) {
+		this.jobNature = jobNature;
+	}
+
+	public java.util.Date getNextVisitDate() {
+		return nextVisitDate;
+	}
+
+	public void setNextVisitDate(java.util.Date nextVisitDate) {
+		this.nextVisitDate = nextVisitDate;
+	}
+
+	public String getHrbp() {
+		return hrbp;
+	}
+
+	public void setHrbp(String hrbp) {
+		this.hrbp = hrbp;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 91 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/EmployeeVisit.java

@@ -0,0 +1,91 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(employee_visit):
+ */
+public class EmployeeVisit {
+
+	/**  */
+	private Long id;
+	
+	/**  */
+	private Long employeeInfoId;
+	
+	/** 回访人 */
+	private Integer operatorId;
+	
+	private String operatorName;
+	
+	/** 回访内容 */
+	private String content;
+	
+	/** 下次回访时间 */
+	private java.util.Date nextVisitDate;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	public void setId(Long id){
+		this.id = id;
+	}
+	
+	public Long getId(){
+		return this.id;
+	}
+			
+	public void setEmployeeInfoId(Long employeeInfoId){
+		this.employeeInfoId = employeeInfoId;
+	}
+	
+	public Long getEmployeeInfoId(){
+		return this.employeeInfoId;
+	}
+			
+	public void setOperatorId(Integer operatorId){
+		this.operatorId = operatorId;
+	}
+	
+	public Integer getOperatorId(){
+		return this.operatorId;
+	}
+			
+	public void setContent(String content){
+		this.content = content;
+	}
+	
+	public String getContent(){
+		return this.content;
+	}
+			
+	public void setNextVisitDate(java.util.Date nextVisitDate){
+		this.nextVisitDate = nextVisitDate;
+	}
+	
+	public java.util.Date getNextVisitDate(){
+		return this.nextVisitDate;
+	}
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	public String getOperatorName() {
+		return operatorName;
+	}
+
+	public void setOperatorName(String operatorName) {
+		this.operatorName = operatorName;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 58 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java

@@ -2,6 +2,8 @@ package com.ym.mec.biz.dal.entity;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import java.math.BigDecimal;
+
 /**
  * 对应数据库表(sys_music_compare_record):
  */
@@ -18,6 +20,21 @@ public class SysMusicCompareRecord {
 	
 	/** 评分数据 */
 	private String scoreData;
+
+	/** 总分 */
+	private BigDecimal score;
+
+	/** 音准 */
+	private BigDecimal intonation;
+
+	/** 节奏 */
+	private BigDecimal cadence;
+
+	/** 完成度 */
+	private BigDecimal integrity;
+
+	/** 录音文件地址 */
+	private String recordFilePath;
 	
 	/** 创建时间 */
 	private java.util.Date createTime;
@@ -53,7 +70,47 @@ public class SysMusicCompareRecord {
 	public String getScoreData(){
 		return this.scoreData;
 	}
-			
+
+	public BigDecimal getScore() {
+		return score;
+	}
+
+	public void setScore(BigDecimal score) {
+		this.score = score;
+	}
+
+	public BigDecimal getIntonation() {
+		return intonation;
+	}
+
+	public void setIntonation(BigDecimal intonation) {
+		this.intonation = intonation;
+	}
+
+	public BigDecimal getCadence() {
+		return cadence;
+	}
+
+	public void setCadence(BigDecimal cadence) {
+		this.cadence = cadence;
+	}
+
+	public BigDecimal getIntegrity() {
+		return integrity;
+	}
+
+	public void setIntegrity(BigDecimal integrity) {
+		this.integrity = integrity;
+	}
+
+	public String getRecordFilePath() {
+		return recordFilePath;
+	}
+
+	public void setRecordFilePath(String recordFilePath) {
+		this.recordFilePath = recordFilePath;
+	}
+
 	public void setCreateTime(java.util.Date createTime){
 		this.createTime = createTime;
 	}

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

@@ -4,7 +4,7 @@ import com.ym.mec.common.enums.BaseEnum;
 
 public enum StaffStatusEnum implements BaseEnum<String, StaffStatusEnum> {
 
-	NOT_EMPLOYED("未录用"), INTERVIEWING("面试中"), RESERVE("储备"), PART_TIME("兼职"), FULL_TIME("全职"), DIMISSION("离职");
+	NOT_EMPLOYED("未录用"), INTERVIEWING("面试中"), RESERVE("储备"), PART_TIME("兼职"), FULL_TIME("全职"), DIMISSION("离职"), BLACK_LIST("黑名单");
 
 	private String desc;
 

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/EmployeeInfoQueryInfo.java

@@ -36,6 +36,10 @@ public class EmployeeInfoQueryInfo extends QueryInfo {
 	private Date startDate;
 	
 	private Date endDate;
+	
+	private Date visitStartDate;
+	
+	private Date visitEndDate;
 
 	public String getUserNameOrIdOrMobile() {
 		return userNameOrIdOrMobile;
@@ -116,4 +120,20 @@ public class EmployeeInfoQueryInfo extends QueryInfo {
 	public void setIntentionCity(String intentionCity) {
 		this.intentionCity = intentionCity;
 	}
+
+	public Date getVisitStartDate() {
+		return visitStartDate;
+	}
+
+	public void setVisitStartDate(Date visitStartDate) {
+		this.visitStartDate = visitStartDate;
+	}
+
+	public Date getVisitEndDate() {
+		return visitEndDate;
+	}
+
+	public void setVisitEndDate(Date visitEndDate) {
+		this.visitEndDate = visitEndDate;
+	}
 }

+ 34 - 90
mec-biz/src/main/java/com/ym/mec/biz/handler/WebSocketHandler.java

@@ -1,16 +1,13 @@
 package com.ym.mec.biz.handler;
 
 import be.tarsos.dsp.AudioDispatcher;
-import be.tarsos.dsp.SilenceDetector;
 import be.tarsos.dsp.io.jvm.AudioDispatcherFactory;
 import be.tarsos.dsp.pitch.PitchProcessor;
 import be.tarsos.dsp.util.PitchConverter;
 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.SoundCompareHelper;
-import com.ym.mec.biz.dal.dto.WavHeader;
-import com.ym.mec.biz.dal.dto.WebSocketInfo;
+import com.ym.mec.biz.dal.config.SoundCompareConfig;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.service.SoundSocketService;
 import com.ym.mec.biz.service.SysMusicCompareRecordService;
 import com.ym.mec.common.constant.CommonConstants;
@@ -23,8 +20,6 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.web.socket.*;
 import org.springframework.web.socket.handler.AbstractWebSocketHandler;
 
-import javax.sound.sampled.AudioFormat;
-import javax.sound.sampled.UnsupportedAudioFileException;
 import java.io.File;
 import java.io.IOException;
 import java.io.RandomAccessFile;
@@ -44,22 +39,23 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketHandler.class);
 
-    //存储客户端链接
-    public static final Map<String, WebSocketSession> WS_CLIENTS = new ConcurrentHashMap<>();
-
-    private final BigDecimal oneHundred = new BigDecimal(100);
-    private final float simpleRate = 44100;
-    private final int simpleSize = 1024;
-    private final int overlap = 256;
+    /**
+     * @describe 存储客户端链接
+     */
+    public static final Map<String, WebSocketClientDetail> WS_CLIENTS = new ConcurrentHashMap<>();
 
-    private final AudioFormat audioFormat = new AudioFormat(simpleRate, 16, 1, true, false);
-    private static final PitchProcessor.PitchEstimationAlgorithm algo = PitchProcessor.PitchEstimationAlgorithm.FFT_YIN;
-    private final SilenceDetector silenceDetecor = new SilenceDetector();
+    private BigDecimal oneHundred = new BigDecimal(100);
 
     private final String tmpDir = FileUtils.getTempDirectoryPath() + "/soundCompare/";
 
-    //用户对应评分信息
+    /**
+     * @describe 用户对应评分信息
+     */
     private Map<String, SoundCompareHelper> userSoundInfoMap = new ConcurrentHashMap<>();
+    /**
+     * @describe 音频处理参数
+     */
+    private SoundCompareConfig soundCompareConfig = new SoundCompareConfig();
 
     @Autowired
     private SysMusicCompareRecordService sysMusicCompareRecordService;
@@ -76,7 +72,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
     public void afterConnectionEstablished(WebSocketSession session) throws Exception {
         String phone = session.getPrincipal().getName().split(":")[1];
         LOGGER.info("{}上线", phone);
-        WS_CLIENTS.put(phone, session);
+        WS_CLIENTS.put(phone, new WebSocketClientDetail(session, new Date()));
         super.afterConnectionEstablished(session);
     }
 
@@ -121,6 +117,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
                 }
                 File file = new File(tmpDir+phone + "_"+ userSoundInfoMap.get(phone).getMusicScoreId() +"_"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) +".wav");
                 userSoundInfoMap.get(phone).setAccessFile(new RandomAccessFile(file, "rw"));
+                userSoundInfoMap.get(phone).setRecordFilePath(file.getAbsolutePath());
                 break;
             case SoundSocketService.RECORD_END:
                 if(!userSoundInfoMap.containsKey(phone)){
@@ -128,7 +125,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
                 }
                 if(!CollectionUtils.isEmpty(userSoundInfoMap.get(phone).getMeasureEndTime())){
                     Integer lastMeasureIndex = userSoundInfoMap.get(phone).getMeasureEndTime().keySet().stream().min(Integer::compareTo).get();
-                    double recordTime = userSoundInfoMap.get(phone).getAccessFile().length()/(audioFormat.getFrameSize()*audioFormat.getFrameRate())*1000;
+                    double recordTime = userSoundInfoMap.get(phone).getAccessFile().length()/(soundCompareConfig.audioFormat.getFrameSize()*soundCompareConfig.audioFormat.getFrameRate())*1000;
                     //如果结束时时长大于某小节,则此小节需要评分
                     if(recordTime>userSoundInfoMap.get(phone).getMeasureEndTime().get(lastMeasureIndex).getEndTimeStamp()){
                         measureCompare(phone, lastMeasureIndex);
@@ -162,31 +159,30 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
             userSoundInfoMap.get(phone).getAccessFile().write(message.getPayload().array());
         }
 
-        AudioDispatcher dispatcher = AudioDispatcherFactory.fromByteArray(message.getPayload().array(), audioFormat, simpleSize, overlap);
-        dispatcher.addAudioProcessor(silenceDetecor);
-        dispatcher.addAudioProcessor(new PitchProcessor(algo, simpleRate, simpleSize, (pitchDetectionResult, audioEvent) -> {
+        AudioDispatcher dispatcher = AudioDispatcherFactory.fromByteArray(message.getPayload().array(), soundCompareConfig.audioFormat, soundCompareConfig.simpleSize, soundCompareConfig.overlap);
+        dispatcher.addAudioProcessor(soundCompareConfig.silenceDetector);
+        dispatcher.addAudioProcessor(new PitchProcessor(soundCompareConfig.algo, soundCompareConfig.simpleRate, soundCompareConfig.simpleSize, (pitchDetectionResult, audioEvent) -> {
             int timeStamp = (int) (userSoundInfoMap.get(phone).getMeasureStartTime() + audioEvent.getTimeStamp()*1000);
             float pitch = pitchDetectionResult.getPitch();
             if(pitch>0 && userSoundInfoMap.get(phone).getOffsetTime() == -1){
                 int preTimeStamp = CollectionUtils.isEmpty(userSoundInfoMap.get(phone).getRecordMeasurePithInfo())?0:userSoundInfoMap.get(phone).getRecordMeasurePithInfo().get(userSoundInfoMap.get(phone).getRecordMeasurePithInfo().size()-1).getTimeStamp();
                 calOffsetTime(phone, timeStamp - (timeStamp - preTimeStamp)/2);
             }
-            if(silenceDetecor.currentSPL()<-70){
+            if(soundCompareConfig.silenceDetector.currentSPL()<soundCompareConfig.validDb){
                 pitch = -1;
             }
-//            LOGGER.info("时间:{}, 频率:{}, 分贝:{}, 音分:{}", timeStamp, pitch, silenceDetecor.currentSPL(), cents);
-            userSoundInfoMap.get(phone).getRecordMeasurePithInfo().add(new MusicPitchDetailDto(timeStamp, pitch, silenceDetecor.currentSPL()));
+//            LOGGER.info("时间:{}, 频率:{}, 分贝:{}", timeStamp, pitch, silenceDetecor.currentSPL());
+            userSoundInfoMap.get(phone).getRecordMeasurePithInfo().add(new MusicPitchDetailDto(timeStamp, pitch, soundCompareConfig.silenceDetector.currentSPL()));
         }));
         dispatcher.run();
         if(Objects.isNull(userSoundInfoMap.get(phone).getAccessFile())){
             return;
         }
 
-        double recordTime = userSoundInfoMap.get(phone).getAccessFile().length()/(audioFormat.getFrameSize()*audioFormat.getFrameRate())*1000;
+        double recordTime = userSoundInfoMap.get(phone).getAccessFile().length()/(soundCompareConfig.audioFormat.getFrameSize()*soundCompareConfig.audioFormat.getFrameRate())*1000;
         userSoundInfoMap.get(phone).setMeasureStartTime(recordTime);
         for (Map.Entry<Integer, MusicPitchDetailDto> userMeasureEndTimeMapEntry : userSoundInfoMap.get(phone).getMeasureEndTime().entrySet()) {
-            int ot = (int) (userMeasureEndTimeMapEntry.getValue().getDuration()*0.1);
-            if(recordTime>(userMeasureEndTimeMapEntry.getValue().getEndTimeStamp()+ot)){
+            if(recordTime>(userMeasureEndTimeMapEntry.getValue().getEndTimeStamp())){
                 if(userMeasureEndTimeMapEntry.getValue().getDontEvaluating()){
                     continue;
                 }else{
@@ -262,9 +258,9 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         }
         if(Objects.nonNull(userSoundInfoMap.get(phone).getAccessFile())){
             RandomAccessFile randomAccessFile = userSoundInfoMap.get(phone).getAccessFile();
-            LOGGER.info("音频时长:{}", randomAccessFile.length()/(audioFormat.getFrameSize()*audioFormat.getFrameRate())*1000);
+            LOGGER.info("音频时长:{}", randomAccessFile.length()/(soundCompareConfig.audioFormat.getFrameSize()*soundCompareConfig.audioFormat.getFrameRate())*1000);
             randomAccessFile.seek(0);
-            randomAccessFile.write(WavHeader.getWaveHeader(randomAccessFile.length(), (long) audioFormat.getFrameRate(), audioFormat.getSampleSizeInBits()));
+            randomAccessFile.write(WavHeader.getWaveHeader(randomAccessFile.length(), (long) soundCompareConfig.audioFormat.getFrameRate(), soundCompareConfig.audioFormat.getSampleSizeInBits()));
             randomAccessFile.close();
             userSoundInfoMap.get(phone).setAccessFile(null);
         }
@@ -293,23 +289,15 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         BigDecimal integrity = BigDecimal.ZERO;
 
         try {
-            //最低有效频率
-            float minValidFrequency = 20;
-
             //音准分数
             float intonationScore = 0;
 
             //节奏匹配数量
             float cadenceNum = 0;
-            //节奏有效阈值
-            float cadenceValidDuty = 0.09f;
 
-            //完整性误差范围
-            float integrityRange = 30;
             //完整性分数
             float integrityScore = 0;
 
-
             int totalCompareNum = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).size();
 
             for (int i = 0; i < userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).size(); i++) {
@@ -319,12 +307,6 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
                 int startTimeStamp = musicXmlInfo.getTimeStamp() + userSoundInfoMap.get(phone).getOffsetTime() + ot5;
                 int endTimeStamp = musicXmlInfo.getTimeStamp()  + userSoundInfoMap.get(phone).getOffsetTime() + musicXmlInfo.getDuration() - ot5;
 
-                int preMeasureEndTimeStamp = startTimeStamp;
-                List<MusicPitchDetailDto> ms = userSoundInfoMap.get(phone).getMusicXmlInfos().stream().filter(m -> m.getMusicalNotesIndex() == musicXmlInfo.getMusicalNotesIndex() - 1).collect(Collectors.toList());
-                if(!CollectionUtils.isEmpty(ms)){
-                    preMeasureEndTimeStamp = ms.get(0).getEndTimeStamp() + userSoundInfoMap.get(phone).getOffsetTime();
-                }
-
                 //时间范围内有效节奏数量
                 float cadenceValidNum = 0;
                 //时间范围内有效音频数量
@@ -332,38 +314,6 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
                 //时间范围内匹配次数
                 float compareNum = 0;
 
-//                boolean newMeasure = false;
-//                float preMusicalNotesPitch = 0;
-//                if(userSoundInfoMap.get(phone).getMusicalNotePitchMap().containsKey(musicXmlInfo.getMusicalNotesIndex()-1)){
-//                    preMusicalNotesPitch = userSoundInfoMap.get(phone).getMusicalNotePitchMap().get(musicXmlInfo.getMusicalNotesIndex()-1);
-//                }
-//                if(userSoundInfoMap.get(phone).getMusicalNotePitchMap().get(musicXmlInfo.getMusicalNotesIndex())==-1){
-//                    newMeasure = true;
-//                }
-//                int newNum = 0;
-//
-//                for (MusicPitchDetailDto recordInfo : userSoundInfoMap.get(phone).getRecordMeasurePithInfo()) {
-//                    if(musicXmlInfo.getMusicalNotesIndex()==0){
-//                        newMeasure = true;
-//                    }
-//                    if(newMeasure){
-//                        break;
-//                    }
-//                    if(recordInfo.getTimeStamp()<preMeasureEndTimeStamp||recordInfo.getTimeStamp()>startTimeStamp){
-//                        continue;
-//                    }
-//                    if(Math.abs(recordInfo.getFrequency()-preMusicalNotesPitch)>10){
-//                        newNum++;
-//                    }else{
-//                        newNum = 0;
-//                    }
-//                    if(newNum>=2){
-//                        newMeasure = true;
-//                    }
-//                }
-
-//                List<Float> musicalNotesPitchs = new ArrayList<>();
-//                List<Float> decibels = new ArrayList<>();
                 List<MusicPitchDetailDto> measureSoundPitchInfos = new ArrayList<>();
 
                 for (int j = 0; j < userSoundInfoMap.get(phone).getRecordMeasurePithInfo().size(); j++) {
@@ -372,21 +322,15 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
                     if(recordInfo.getTimeStamp()<startTimeStamp||recordInfo.getTimeStamp()>endTimeStamp){
                         continue;
                     }
-//                    musicalNotesPitchs.add(recordInfo.getFrequency());
-//                    decibels.add(recordInfo.getDecibel());
                     measureSoundPitchInfos.add(recordInfo);
                     compareNum++;
-//                    LOGGER.info("{}频率({}-{}):{}, {}", recordInfo.getTimeStamp(), startTimeStamp, endTimeStamp, musicXmlInfo.getFrequency(), recordInfo.getFrequency());
                     //如果在最低有效频率以下则跳过
-                    if(recordInfo.getFrequency()<minValidFrequency&&musicXmlInfo.getFrequency()!=-1){
+                    if(recordInfo.getFrequency()<soundCompareConfig.validFrequency&&musicXmlInfo.getFrequency()!=-1){
                         continue;
                     }
                     cadenceValidNum++;
-                    if(recordInfo.getTimeStamp()<startTimeStamp||recordInfo.getTimeStamp()>endTimeStamp){
-                        continue;
-                    }
                     //如果频率差值在节奏误差范围内
-                    if(Math.abs(recordInfo.getFrequency()-musicXmlInfo.getFrequency())<=integrityRange){
+                    if(Math.abs(recordInfo.getFrequency()-musicXmlInfo.getFrequency())<=soundCompareConfig.integrityFrequencyRange){
                         integrityValidNum++;
                     }
                 }
@@ -452,7 +396,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
                     cadenceDuty = 0;
                 }
                 //节奏
-                if(cadenceDuty>=cadenceValidDuty){
+                if(cadenceDuty>=soundCompareConfig.cadenceValidDuty){
                     cadenceNum++;
                 }
                 //音准
@@ -464,7 +408,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
                         recordCents = PitchConverter.hertzToAbsoluteCent(avgPitch);
                     }
                     double cents = PitchConverter.hertzToAbsoluteCent(musicXmlInfo.getFrequency());
-                    double score = 100 - Math.round(Math.abs(cents - recordCents)) + 3;
+                    double score = 100 - Math.round(Math.abs(cents - recordCents)) + soundCompareConfig.intonationCentsRange;
                     if (score < 0){
                         score = 0;
                     }else if(score > 100){
@@ -475,7 +419,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
                 }
                 //完成度
                 if(integrityValidNum>0){
-                    integrityValidNum = integrityValidNum + (float) (compareNum * 0.05);
+                    integrityValidNum = integrityValidNum;
                 }
                 if(integrityValidNum > compareNum){
                     integrityValidNum = compareNum;
@@ -540,7 +484,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         createPushInfo(phone, "overall", -1, intonation, cadence, integrity);
 
         //存储评分数据
-        sysMusicCompareRecordService.saveMusicCompareData(phone, userSoundInfoMap.get(phone).getMusicScoreId(), userSoundInfoMap.get(phone).getUserMeasureScoreMap());
+        sysMusicCompareRecordService.saveMusicCompareData(phone, userSoundInfoMap.get(phone));
 
         LOGGER.info("评分数据:{}", JSON.toJSONString(userSoundInfoMap.get(phone)));
     }
@@ -578,7 +522,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         LOGGER.info("小节频分:{}", JSON.toJSONString(webSocketInfo));
 
         //推送结果
-        WS_CLIENTS.get(phone).sendMessage(new TextMessage(JSON.toJSONString(webSocketInfo)));
+        WS_CLIENTS.get(phone).getSession().sendMessage(new TextMessage(JSON.toJSONString(webSocketInfo)));
         return webSocketInfo;
     }
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeInfoService.java

@@ -1,8 +1,10 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.EmployeeInfoDto;
 import com.ym.mec.biz.dal.entity.EmployeeInfo;
 import com.ym.mec.common.service.BaseService;
 
 public interface EmployeeInfoService extends BaseService<Long, EmployeeInfo> {
 
+	EmployeeInfoDto queryDetail(Long id);
 }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeVisitService.java

@@ -0,0 +1,9 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.EmployeeVisit;
+import com.ym.mec.common.service.BaseService;
+
+public interface EmployeeVisitService extends BaseService<Long, EmployeeVisit> {
+
+	long insert(EmployeeVisit employeeVisit);
+}

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.SoundCompareHelper;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
 import com.ym.mec.common.service.BaseService;
 
@@ -13,9 +14,9 @@ public interface SysMusicCompareRecordService extends BaseService<Long, SysMusic
      * @author Joburgess
      * @date 2021/6/25 0025
      * @param phone:
-     * @param userMeasureScoreMap:
+     * @param soundCompareInfo:
      * @return void
      */
-    void saveMusicCompareData(String phone, Integer sysMusicScoreId, Map<Integer, Map<String, Object>> userMeasureScoreMap);
+    void saveMusicCompareData(String phone, SoundCompareHelper soundCompareInfo);
 
 }

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeInfoServiceImpl.java

@@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.ym.mec.biz.dal.dao.EmployeeInfoDao;
+import com.ym.mec.biz.dal.dto.EmployeeInfoDto;
 import com.ym.mec.biz.dal.entity.EmployeeInfo;
 import com.ym.mec.biz.service.EmployeeInfoService;
 import com.ym.mec.common.dal.BaseDAO;
@@ -19,5 +20,10 @@ public class EmployeeInfoServiceImpl extends BaseServiceImpl<Long, EmployeeInfo>
 	public BaseDAO<Long, EmployeeInfo> getDAO() {
 		return employeeInfoDao;
 	}
+
+	@Override
+	public EmployeeInfoDto queryDetail(Long id) {
+		return employeeInfoDao.queryDetail(id);
+	}
 	
 }

+ 48 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeVisitServiceImpl.java

@@ -0,0 +1,48 @@
+package com.ym.mec.biz.service.impl;
+
+import java.util.Date;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.ym.mec.biz.dal.dao.EmployeeInfoDao;
+import com.ym.mec.biz.dal.dao.EmployeeVisitDao;
+import com.ym.mec.biz.dal.entity.EmployeeInfo;
+import com.ym.mec.biz.dal.entity.EmployeeVisit;
+import com.ym.mec.biz.service.EmployeeVisitService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+
+@Service
+public class EmployeeVisitServiceImpl extends BaseServiceImpl<Long, EmployeeVisit>  implements EmployeeVisitService {
+	
+	@Autowired
+	private EmployeeVisitDao employeeVisitDao;
+	
+	@Autowired
+	private EmployeeInfoDao employeeInfoDao; 
+
+	@Override
+	public BaseDAO<Long, EmployeeVisit> getDAO() {
+		return employeeVisitDao;
+	}
+
+	@Override
+    @Transactional(rollbackFor = Exception.class)
+	public long insert(EmployeeVisit bean) {
+		
+		EmployeeInfo employeeInfo = employeeInfoDao.get(bean.getEmployeeInfoId());
+		if(employeeInfo == null){
+			throw new BizException("用户信息查询失败");
+		}
+		
+		employeeInfo.setNextVisitDate(bean.getNextVisitDate());
+		employeeInfo.setUpdateTime(new Date());
+		employeeInfoDao.update(employeeInfo);
+		
+		return super.insert(bean);
+	}
+	
+}

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

@@ -22,9 +22,10 @@ import com.ym.mec.common.entity.ImUserModel;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.im.ImFeignService;
-import com.ym.mec.im.WebFeignService;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.web.WebFeignService;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;

+ 12 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.SoundCompareHelper;
 import com.ym.mec.common.dal.BaseDAO;
 import org.springframework.beans.factory.annotation.Autowired;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
@@ -29,15 +30,23 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	}
 
 	@Override
-	public void saveMusicCompareData(String phone, Integer sysMusicScoreId, Map<Integer, Map<String, Object>> userMeasureScoreMap) {
+	public void saveMusicCompareData(String phone, SoundCompareHelper soundCompareInfo) {
 		SysUser user = teacherDao.getUserWithPhone(phone);
 		if(Objects.isNull(user)){
 			return;
 		}
 		SysMusicCompareRecord sysMusicCompareRecord = new SysMusicCompareRecord();
 		sysMusicCompareRecord.setUserId(user.getId());
-		sysMusicCompareRecord.setSysMusicScoreId(sysMusicScoreId);
-		sysMusicCompareRecord.setScoreData(JSON.toJSONString(userMeasureScoreMap));
+		sysMusicCompareRecord.setSysMusicScoreId(soundCompareInfo.getMusicScoreId());
+		sysMusicCompareRecord.setScoreData(JSON.toJSONString(soundCompareInfo.getUserMeasureScoreMap()));
+		if (Objects.nonNull(soundCompareInfo.getUserMeasureScoreMap()) && soundCompareInfo.getUserMeasureScoreMap().containsKey(-1)){
+			Map<String, Object> finalScore = soundCompareInfo.getUserMeasureScoreMap().get(-1);
+			sysMusicCompareRecord.setScore((BigDecimal) finalScore.get("score"));
+			sysMusicCompareRecord.setIntonation((BigDecimal) finalScore.get("intonation"));
+			sysMusicCompareRecord.setCadence((BigDecimal) finalScore.get("cadence"));
+			sysMusicCompareRecord.setIntegrity((BigDecimal) finalScore.get("integrity"));
+		}
+		sysMusicCompareRecord.setRecordFilePath(soundCompareInfo.getRecordFilePath());
 		sysMusicCompareRecordDao.insert(sysMusicCompareRecord);
 	}
 }

+ 45 - 4
mec-biz/src/main/resources/config/mybatis/EmployeeInfoMapper.xml

@@ -19,6 +19,7 @@
 		<result column="intention_city_" property="intentionCity" />
 		<result column="educational_background_" property="educationalBackground" />
 		<result column="subject_id_list_" property="subjectIdList" />
+		<result column="job_subject_id_list_" property="jobSubjectIdList" />
 		<result column="assessment_result_" property="assessmentResult" />
 		<result column="other_comment_" property="otherComment" />
 		<result column="entry_date_" property="entryDate" />
@@ -28,20 +29,36 @@
 		<result column="bank_card_no_" property="bankCardNo" />
 		<result column="bank_address_" property="bankAddress" />
 		<result column="resignation_date_" property="resignationDate" />
+		<result column="resignation_reason_" property="resignationReason" />
 		<result column="organ_id_" property="organId" />
 		<result column="operator_id_" property="operatorId" />
 		<result column="source_from_" property="sourceFrom" />
+		<result column="job_type_" property="jobType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
+		<result column="job_nature_" property="jobNature" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
+		<result column="hrbp_" property="hrbp" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 		<result column="organName" property="organName" />
 		<result column="subjectName" property="subjectName" />
 		<result column="operatorName" property="operatorName" />
+		<result column="next_visit_date_" property="nextVisitDate" />
+	</resultMap>
+	
+	<resultMap type="com.ym.mec.biz.dal.dto.EmployeeInfoDto" id="EmployeeInfoDto" extends="EmployeeInfo">
+		
+        <collection property="employeeVisitList"
+                     select="com.ym.mec.biz.dal.dao.EmployeeVisitDao.queryByEmployeeInfoId"
+                     column="id_" />
+        
 	</resultMap>
 
 	<!-- 根据主键查询一条记录 -->
 	<select id="get" resultMap="EmployeeInfo">
-		SELECT * FROM
-		employee_info WHERE id_ = #{id}
+		SELECT * FROM employee_info WHERE id_ = #{id}
+	</select>
+	
+	<select id="queryDetail" resultMap="EmployeeInfoDto">
+		SELECT * FROM employee_info WHERE id_ = #{id}
 	</select>
 
 	<!-- 全查询 -->
@@ -56,8 +73,8 @@
 		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
 			AS ID FROM DUAL </selectKey> -->
 		INSERT INTO employee_info
-		(id_,real_name_,mobile_no_,wechat_no_,id_card_,age_,gender_,birthdate_,emergency_contact_name_,emergency_contact_relation_,emergency_contact_phone_,live_city_,intention_city_,educational_background_,subject_id_list_,assessment_result_,other_comment_,entry_date_,organ_id_,position_,status_,is_probation_period_,bank_card_no_,bank_address_,resignation_date_,operator_id_,source_from_,create_time_,update_time_)
-		VALUES(#{id},#{realName},#{mobileNo},#{wechatNo},#{idCard},#{age},#{gender},#{birthdate},#{emergencyContactName},#{emergencyContactRelation},#{emergencyContactPhone},#{liveCity},#{intentionCity},#{educationalBackground},#{subjectIdList},#{assessmentResult},#{otherComment},#{entryDate},#{organId},#{position,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{isProbationPeriod},#{bankCardNo},#{bankAddress},#{resignationDate},#{operatorId},#{sourceFrom},#{createTime},#{updateTime})
+		(id_,real_name_,mobile_no_,wechat_no_,id_card_,age_,gender_,birthdate_,emergency_contact_name_,emergency_contact_relation_,emergency_contact_phone_,live_city_,intention_city_,educational_background_,subject_id_list_,assessment_result_,other_comment_,entry_date_,organ_id_,position_,status_,is_probation_period_,bank_card_no_,bank_address_,resignation_date_,operator_id_,source_from_,create_time_,update_time_,job_subject_id_list_,resignation_reason_,job_type_,job_nature_,hrbp_)
+		VALUES(#{id},#{realName},#{mobileNo},#{wechatNo},#{idCard},#{age},#{gender},#{birthdate},#{emergencyContactName},#{emergencyContactRelation},#{emergencyContactPhone},#{liveCity},#{intentionCity},#{educationalBackground},#{subjectIdList},#{assessmentResult},#{otherComment},#{entryDate},#{organId},#{position,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{isProbationPeriod},#{bankCardNo},#{bankAddress},#{resignationDate},#{operatorId},#{sourceFrom},#{createTime},#{updateTime},#{jobSubjectIdList},#{resignationReason},#{jobType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{jobNature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{hrbp})
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -108,6 +125,24 @@
 			<if test="operatorId != null">
 				operator_id_ = #{operatorId},
 			</if>
+			<if test="jobSubjectIdList != null">
+				job_subject_id_list_ = #{jobSubjectIdList},
+			</if>
+			<if test="resignationReason != null">
+				resignation_reason_ = #{resignationReason},
+			</if>
+			<if test="jobType != null">
+				job_type_ = #{jobType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="jobNature != null">
+				job_nature_ = #{jobNature,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="hrbp != null">
+				hrbp_ = #{hrbp},
+			</if>
+			<if test="nextVisitDate != null">
+				next_visit_date_ = #{nextVisitDate},
+			</if>
 				source_from_ = #{sourceFrom}
 		</set>
 		WHERE id_ = #{id}
@@ -147,6 +182,12 @@
 	        <if test="endDate != null">
 	            AND ei.update_time_ &lt;= #{endDate}
 	        </if>
+	        <if test="visitStartDate != null">
+	            AND ei.next_visit_date_ &gt;= #{visitStartDate}
+	        </if>
+	        <if test="visitEndDate != null">
+	            AND ei.next_visit_date_ &lt;= #{visitEndDate}
+	        </if>
 	        <if test="operator != null">
 	            AND (ei.operator_id_ like concat('%',#{operator},'%') or u.real_name_ like concat('%',#{operator},'%'))
 	        </if>

+ 84 - 0
mec-biz/src/main/resources/config/mybatis/EmployeeVisitMapper.xml

@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 这个文件是自动生成的。 不要修改此文件。所有改动将在下次重新自动生成时丢失。 -->
+<mapper namespace="com.ym.mec.biz.dal.dao.EmployeeVisitDao">
+
+	<resultMap type="com.ym.mec.biz.dal.entity.EmployeeVisit" id="EmployeeVisit">
+		<result column="id_" property="id" />
+		<result column="employee_info_id_" property="employeeInfoId" />
+		<result column="operator_id_" property="operatorId" />
+		<result column="operator_name_" property="operatorName" />
+		<result column="content_" property="content" />
+		<result column="next_visit_date_" property="nextVisitDate" />
+		<result column="create_time_" property="createTime" />
+	</resultMap>
+
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="EmployeeVisit">
+		SELECT * FROM
+		employee_visit WHERE id_ = #{id}
+	</select>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="EmployeeVisit">
+		SELECT * FROM employee_visit
+		ORDER BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.EmployeeVisit"
+		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
+			AS ID FROM DUAL </selectKey> -->
+		INSERT INTO employee_visit
+		(id_,employee_info_id_,operator_id_,content_,next_visit_date_,create_time_)
+		VALUES(#{id},#{employeeInfoId},#{operatorId},#{content},#{nextVisitDate},#{createTime})
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.EmployeeVisit">
+		UPDATE employee_visit
+		<set>
+			<if test="operatorId != null">
+				operator_id_ = #{operatorId},
+			</if>
+			<if test="nextVisitDate != null">
+				next_visit_date_ = #{nextVisitDate},
+			</if>
+			<if test="employeeInfoId != null">
+				employee_info_id_ = #{employeeInfoId},
+			</if>
+			<if test="id != null">
+				id_ = #{id},
+			</if>
+			<if test="content != null">
+				content_ = #{content},
+			</if>
+			<if test="createTime != null">
+				create_time_ = #{createTime},
+			</if>
+		</set>
+		WHERE id_ = #{id}
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete">
+		DELETE FROM employee_visit WHERE id_ = #{id}
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="EmployeeVisit" parameterType="map">
+		SELECT * FROM employee_visit ORDER BY id_
+		<include refid="global.limit" />
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM employee_visit
+	</select>
+	
+	<select id="queryByEmployeeInfoId" resultMap="EmployeeVisit">
+		SELECT ev.*,u.real_name_ operator_name_ FROM employee_visit ev left join sys_user u on ev.operator_id_ = u.id_
+		WHERE ev.employee_info_id_ = #{employeeInfoId} order by ev.id_ desc
+	</select>
+</mapper>

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

@@ -11,6 +11,11 @@
 		<result column="user_id_" property="userId" />
 		<result column="sys_music_score_id_" property="sysMusicScoreId" />
 		<result column="score_data_" property="scoreData" />
+		<result column="score_" property="score" />
+		<result column="intonation_" property="intonation" />
+		<result column="cadence_" property="cadence" />
+		<result column="integrity_" property="integrity" />
+		<result column="record_file_path_" property="recordFilePath" />
 		<result column="create_time_" property="createTime" />
 	</resultMap>
 
@@ -31,8 +36,8 @@
 		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
 		</selectKey>
 		-->
-		INSERT INTO sys_music_compare_record (id_,user_id_,sys_music_score_id_,score_data_,create_time_)
-		VALUES(#{id},#{userId},#{sysMusicScoreId},#{scoreData},NOW())
+		INSERT INTO sys_music_compare_record (id_,user_id_,sys_music_score_id_,score_data_,score_,intonation_,cadence_,integrity_,record_file_path_,create_time_)
+		VALUES(#{id},#{userId},#{sysMusicScoreId},#{scoreData},#{score},#{intonation},#{cadence},#{integrity},#{recordFilePath},NOW())
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -50,6 +55,21 @@
 		<if test="scoreData != null">
 			score_data_ = #{scoreData},
 		</if>
+		<if test="score != null">
+			score_ = #{score},
+		</if>
+		<if test="integrity != null">
+			integrity_ = #{integrity},
+		</if>
+		<if test="cadence != null">
+			cadence_ = #{cadence},
+		</if>
+		<if test="sysMusicScoreId != null">
+			sys_music_score_id_ = #{sysMusicScoreId},
+		</if>
+		<if test="recordFilePath != null">
+			record_file_path_ = #{recordFilePath},
+		</if>
 		<if test="createTime != null">
 			create_time_ = #{createTime},
 		</if>

+ 8 - 6
mec-client-api/src/main/java/com/ym/mec/im/WebFeignService.java → mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java

@@ -1,25 +1,27 @@
-package com.ym.mec.im;
+package com.ym.mec.web;
 
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import com.ym.mec.common.config.FeignConfiguration;
-import com.ym.mec.im.fallback.WebFeignServiceFallback;
+import com.ym.mec.web.fallback.WebFeignServiceFallback;
 
 @FeignClient(name = "web-server", contextId = "WebFeignService", configuration = FeignConfiguration.class, fallback = WebFeignServiceFallback.class)
 public interface WebFeignService {
 
 	@RequestMapping(value = "api/createCashAccount")
 	Boolean createCashAccount(@RequestParam("userId") Integer userId);
-	
+
 	@RequestMapping(value = "api/queryTeacherOrganId")
 	public Integer queryTeacherOrganId(@RequestParam("userId") Integer userId);
-	
+
 	@RequestMapping(value = "api/isPurchasedPracticeCourse")
 	Boolean isPurchasedPracticeCourse(@RequestParam("userId") Integer userId);
 
 	@RequestMapping(value = "api/updateNickName")
-	int updateNickName(@RequestParam("userId") Integer userId,
-					   @RequestParam("nickName") String nickName);
+	int updateNickName(@RequestParam("userId") Integer userId, @RequestParam("nickName") String nickName);
+
+	@RequestMapping(value = "api/queryOrganIdByUserId")
+	String queryOrganIdByUserId(@RequestParam("userId") Integer userId, @RequestParam("clientId") String clientId);
 }

+ 7 - 3
mec-client-api/src/main/java/com/ym/mec/im/fallback/WebFeignServiceFallback.java → mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java

@@ -1,9 +1,8 @@
-package com.ym.mec.im.fallback;
+package com.ym.mec.web.fallback;
 
 import org.springframework.stereotype.Component;
 
-import com.ym.mec.im.WebFeignService;
-import org.springframework.web.bind.annotation.RequestParam;
+import com.ym.mec.web.WebFeignService;
 
 @Component
 public class WebFeignServiceFallback implements WebFeignService {
@@ -27,4 +26,9 @@ public class WebFeignServiceFallback implements WebFeignService {
 	public int updateNickName(Integer userId, String nickName) {
 		return 0;
 	}
+
+	@Override
+	public String queryOrganIdByUserId(Integer userId, String clientId) {
+		return null;
+	}
 }

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

@@ -54,10 +54,10 @@ public class SoundController extends BaseController {
         if(!WebSocketHandler.WS_CLIENTS.containsKey(phone)){
             return failed("未上线");
         }
-        if(!WebSocketHandler.WS_CLIENTS.get(phone).isOpen()){
+        if(!WebSocketHandler.WS_CLIENTS.get(phone).getSession().isOpen()){
             return failed("已离线");
         }
-        WebSocketHandler.WS_CLIENTS.get(phone).sendMessage(new TextMessage(message));
+        WebSocketHandler.WS_CLIENTS.get(phone).getSession().sendMessage(new TextMessage(message));
         return succeed();
     }
 
@@ -66,10 +66,10 @@ public class SoundController extends BaseController {
         if(!WebSocketHandler.WS_CLIENTS.containsKey(phone)){
             return failed("未上线");
         }
-        if(!WebSocketHandler.WS_CLIENTS.get(phone).isOpen()){
+        if(!WebSocketHandler.WS_CLIENTS.get(phone).getSession().isOpen()){
             return failed("已离线");
         }
-        WebSocketHandler.WS_CLIENTS.get(phone).close();
+        WebSocketHandler.WS_CLIENTS.get(phone).getSession().close();
         return succeed();
     }
 

+ 43 - 8
mec-web/src/main/java/com/ym/mec/web/controller/APIController.java

@@ -1,7 +1,19 @@
 package com.ym.mec.web.controller;
 
+import io.swagger.annotations.Api;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.service.ImGroupService;
@@ -9,13 +21,6 @@ import com.ym.mec.biz.service.PracticeGroupService;
 import com.ym.mec.biz.service.PracticeLessonApplyService;
 import com.ym.mec.common.controller.BaseController;
 
-import io.swagger.annotations.Api;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
 @RequestMapping("api")
 @Api(tags = "对外接口")
 @RestController
@@ -26,14 +31,21 @@ public class APIController extends BaseController {
 	
 	@Autowired
 	private TeacherDao teacherDao;
-
+	
+	@Autowired
+	private EmployeeDao employeeDao;
+	
 	@Autowired
 	private PracticeLessonApplyService practiceLessonApplyService;
 	
 	@Autowired
 	private PracticeGroupService practiceGroupService;
+	
 	@Autowired
 	private ImGroupService imGroupService;
+	
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
 
 	@GetMapping("/createCashAccount")
 	public Boolean createCashAccount(Integer userId) {
@@ -67,4 +79,27 @@ public class APIController extends BaseController {
 		return imGroupService.updateNickName(userId,nickName);
 	}
 
+	@GetMapping("/queryOrganIdByUserId")
+	public String queryOrganIdByUserId(Integer userId, String clientId) {
+
+		if (StringUtils.equalsIgnoreCase("system", clientId) || StringUtils.equalsIgnoreCase("education", clientId)) {
+			Employee employee = employeeDao.get(userId);
+			if (employee != null) {
+				return employee.getOrganIdList();
+			}
+
+		} else if (StringUtils.equalsIgnoreCase("teacher", clientId)) {
+			Teacher teacher = teacherDao.get(userId);
+			if (teacher != null) {
+				return teacher.getOrganId() + "";
+			}
+		} else {
+			SysUser user = sysUserFeignService.queryUserInfo();
+			if (user != null) {
+				return user.getOrganId() + "";
+			}
+		}
+		return null;
+	}
+
 }

+ 22 - 0
mec-web/src/main/java/com/ym/mec/web/controller/EmployeeController.java

@@ -14,10 +14,13 @@ import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.StudentManageService;
 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.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -206,6 +209,25 @@ public class EmployeeController extends BaseController {
         return succeed(map);
     }
 
+    @ApiOperation(value = "获取对应角色的员工")
+    @GetMapping("/queryEmployeeByRole")
+    public HttpResponseResult queryEmployeeByRole(Integer organId, String roleId){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        String organIds = new String();
+        if(Objects.isNull(organId)){
+            Employee employee = employeeService.get(sysUser.getId());
+            if (StringUtils.isEmpty(organIds)) {
+                organIds = employee.getOrganIdList();
+            }
+        }else{
+            organIds = organId.toString();
+        }
+        return succeed(employeeService.findByRole(roleId, organIds));
+    }
+
     @ApiOperation(value = "获取教务老师")
     @GetMapping("/findEducationTeacher")
     public HttpResponseResult findEducationTeacher(Integer userId){

+ 27 - 0
mec-web/src/main/java/com/ym/mec/web/controller/EmployeeInfoController.java

@@ -16,8 +16,10 @@ import org.springframework.web.bind.annotation.RestController;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.EmployeeInfo;
+import com.ym.mec.biz.dal.entity.EmployeeVisit;
 import com.ym.mec.biz.dal.page.EmployeeInfoQueryInfo;
 import com.ym.mec.biz.service.EmployeeInfoService;
+import com.ym.mec.biz.service.EmployeeVisitService;
 import com.ym.mec.common.controller.BaseController;
 
 @RequestMapping("employeeInfo")
@@ -28,6 +30,9 @@ public class EmployeeInfoController extends BaseController {
     @Autowired
     private EmployeeInfoService employeeInfoService;
     
+    @Autowired
+    private EmployeeVisitService employeeVisitService;
+    
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
 
@@ -70,4 +75,26 @@ public class EmployeeInfoController extends BaseController {
         return succeed(employeeInfoService.queryPage(queryInfo));
     }
 
+    @ApiOperation(value = "查询员工信息")
+    @GetMapping("/queryDetail")
+    @PreAuthorize("@pcs.hasPermissions('employeeInfo/queryDetail')")
+    public Object queryDetail(Long id) {
+        return succeed(employeeInfoService.queryDetail(id));
+    }
+
+    @ApiOperation(value = "新增回访记录")
+    @PostMapping("/insertVisit")
+    @PreAuthorize("@pcs.hasPermissions('employeeInfo/insertVisit')")
+    public Object insertVisit(@RequestBody EmployeeVisit employeeVisit) {
+    	SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户信息获取失败");
+		}
+		employeeVisit.setOperatorId(sysUser.getId());
+    	Date date = new Date();
+    	employeeVisit.setCreateTime(date);
+    	employeeVisitService.insert(employeeVisit);
+        return succeed();
+    }
+
 }