Explorar o código

Merge branch 'online1' of http://git.dayaedu.com/yonge/mec into system_fee_update

zouxuan %!s(int64=4) %!d(string=hai) anos
pai
achega
8745231cde
Modificáronse 68 ficheiros con 2429 adicións e 520 borrados
  1. 20 5
      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. 22 11
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUser.java
  5. 1 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/handler/BaseAuthenticationSuccessEventHandler.java
  6. 1 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserServiceImpl.java
  7. 1 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java
  8. 46 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/config/NioAudioInputStream.java
  9. 56 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/config/SoundCompareConfig.java
  10. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeDao.java
  11. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeInfoDao.java
  12. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeVisitDao.java
  13. 84 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CirculationUser.java
  14. 33 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EmployeeDto.java
  15. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EmployeeInfoDto.java
  16. 65 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicPitchDetailDto.java
  17. 109 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OAFinancialDto.java
  18. 55 8
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCompareHelper.java
  19. 53 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/WebSocketClientDetail.java
  20. 23 12
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Employee.java
  21. 55 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/EmployeeInfo.java
  22. 81 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/EmployeeVisit.java
  23. 58 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java
  24. 213 125
      mec-biz/src/main/java/com/ym/mec/biz/handler/WebSocketHandler.java
  25. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ContractService.java
  26. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeInfoService.java
  27. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeService.java
  28. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeVisitService.java
  29. 37 0
      mec-biz/src/main/java/com/ym/mec/biz/service/OaUserService.java
  30. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SoundSocketService.java
  31. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java
  32. 93 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  33. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeInfoServiceImpl.java
  34. 21 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  35. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeVisitServiceImpl.java
  36. 75 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OaServiceImpl.java
  37. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  38. 12 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  39. 108 0
      mec-biz/src/main/resources/config/contracts/financial.ftl
  40. 35 4
      mec-biz/src/main/resources/config/mybatis/EmployeeInfoMapper.xml
  41. 26 5
      mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml
  42. 82 0
      mec-biz/src/main/resources/config/mybatis/EmployeeVisitMapper.xml
  43. 22 2
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  44. 52 0
      mec-client-api/src/main/java/com/ym/mec/oa/OaFeignService.java
  45. 95 0
      mec-client-api/src/main/java/com/ym/mec/oa/entity/OAUser.java
  46. 25 0
      mec-client-api/src/main/java/com/ym/mec/oa/entity/PostDept.java
  47. 29 0
      mec-client-api/src/main/java/com/ym/mec/oa/fallback/OaFeignServiceFallback.java
  48. 8 6
      mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java
  49. 7 3
      mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java
  50. 3 2
      mec-student/src/main/java/com/ym/mec/student/config/WebSocketConfig.java
  51. 3 2
      mec-teacher/src/main/java/com/ym/mec/teacher/config/WebSocketConfig.java
  52. 4 4
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SoundController.java
  53. 72 53
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/ESealPlugin.java
  54. 238 198
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/provider/TsignPlugin.java
  55. 28 26
      mec-web/src/main/java/com/ym/mec/web/config/ResourceServerConfig.java
  56. 41 0
      mec-web/src/main/java/com/ym/mec/web/config/WebSocketConfig.java
  57. 43 8
      mec-web/src/main/java/com/ym/mec/web/controller/APIController.java
  58. 3 2
      mec-web/src/main/java/com/ym/mec/web/controller/EmployeeController.java
  59. 27 0
      mec-web/src/main/java/com/ym/mec/web/controller/EmployeeInfoController.java
  60. 0 1
      mec-web/src/main/java/com/ym/mec/web/controller/SysMusicScoreCategoriesController.java
  61. 39 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduFeeTypeController.java
  62. 0 15
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduFinancialExpenditureController.java
  63. 56 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduMusicScoreController.java
  64. 6 2
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduOrganizationController.java
  65. 25 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/OaContractsController.java
  66. 28 0
      mec-web/src/main/java/com/ym/mec/web/interceptor/WebSocketHandshakeInterceptor.java
  67. BIN=BIN
      mec-web/src/main/resources/config/fonts/simsun.ttc
  68. BIN=BIN
      mec-web/src/main/resources/config/fonts/simsun.ttf

+ 20 - 5
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,29 @@ 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);
-		} else {
-			queryInfo.setOrganId(user.getOrganId());
+		
+		String clientId = queryInfo.getClientId();
+		
+		if (StringUtils.equalsIgnoreCase("student", clientId)) {
+			if (user == null || user.getId() == null) {
+				queryInfo.setOrganId(43);
+			} else {
+				queryInfo.setOrganId(user.getOrganId());
+			}
+			
+		}else{
+			queryInfo.setOrganIdList(webFeignService.queryOrganIdByUserId(user.getId(), clientId));
 		}
+		
 		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 {

+ 22 - 11
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUser.java

@@ -135,11 +135,14 @@ public class SysUser implements Serializable{
 
 	private String certificateType;
 
-	@ApiModelProperty(value = "部门id",required = false)
-	private Integer deptId;
+	@ApiModelProperty(value = "部门ids",required = false)
+	private String deptIds;
 
 	@ApiModelProperty(value = "岗位id",required = false)
-	private Integer postId;
+	private String postIds;
+
+	@ApiModelProperty(value = "岗位管理部门",required = false)
+	private String postDeptIds;
 
 	@ApiModelProperty(value = "银行卡号",required = false)
 	private String bankCard;
@@ -434,20 +437,20 @@ public class SysUser implements Serializable{
 		this.currentGradeNum = currentGradeNum;
 	}
 
-	public Integer getDeptId() {
-		return deptId;
+	public String getDeptIds() {
+		return deptIds;
 	}
 
-	public void setDeptId(Integer deptId) {
-		this.deptId = deptId;
+	public void setDeptIds(String deptId) {
+		this.deptIds = deptId;
 	}
 
-	public Integer getPostId() {
-		return postId;
+	public String getPostIds() {
+		return postIds;
 	}
 
-	public void setPostId(Integer postId) {
-		this.postId = postId;
+	public void setPostIds(String postIds) {
+		this.postIds = postIds;
 	}
 
 	public String getBankCard() {
@@ -465,4 +468,12 @@ public class SysUser implements Serializable{
 	public void setOpenBankAddress(String openBankAddress) {
 		this.openBankAddress = openBankAddress;
 	}
+
+	public String getPostDeptIds() {
+		return postDeptIds;
+	}
+
+	public void setPostDeptIds(String postDeptIds) {
+		this.postDeptIds = postDeptIds;
+	}
 }

+ 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")

+ 46 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/config/NioAudioInputStream.java

@@ -0,0 +1,46 @@
+package com.ym.mec.biz.dal.config;
+
+import be.tarsos.dsp.io.TarsosDSPAudioFormat;
+import be.tarsos.dsp.io.TarsosDSPAudioInputStream;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/4 0004
+ */
+public class NioAudioInputStream implements TarsosDSPAudioInputStream {
+
+    private final RandomAccessFile randomAccessFile;
+
+    public NioAudioInputStream(RandomAccessFile randomAccessFile) {
+        this.randomAccessFile = randomAccessFile;
+    }
+
+    @Override
+    public long skip(long bytesToSkip) throws IOException {
+        return randomAccessFile.skipBytes((int) bytesToSkip);
+    }
+
+    @Override
+    public int read(byte[] b, int off, int len) throws IOException {
+        return randomAccessFile.read(b, off, len);
+    }
+
+    @Override
+    public void close() throws IOException {
+        randomAccessFile.close();
+    }
+
+    @Override
+    public TarsosDSPAudioFormat getFormat() {
+        TarsosDSPAudioFormat tarsosDSPFormat = new TarsosDSPAudioFormat(44100, 16, 1, false, true);
+        return tarsosDSPFormat;
+    }
+
+    @Override
+    public long getFrameLength() {
+        return 0;
+    }
+}

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

@@ -0,0 +1,56 @@
+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 int validDb = -70;
+    /**
+     * @describe 有效频率
+     */
+    public int validFrequency = 20;
+    /**
+     * @describe 音准前后音分误差范围
+     */
+    public int intonationCentsRange = 3;
+    /**
+     * @describe 节奏有效阈值
+     */
+    public float cadenceValidDuty = 0.09f;
+    /**
+     * @describe 完整性有效频率误差范围
+     */
+    public int integrityFrequencyRange = 30;
+}

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeDao.java

@@ -194,4 +194,11 @@ public interface EmployeeDao extends BaseDAO<Integer, Employee> {
      * @return
      */
     List<String> queryVipGroupIdByUserId(Integer levelUserId);
+
+    /**
+     * 获取用户信息
+     * @param userIds
+     * @return
+     */
+    List<SysUser> getUsers(@Param("userIds") List<Integer> userIds);
 }

+ 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);
+}

+ 84 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CirculationUser.java

@@ -0,0 +1,84 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.SysUserTsign;
+import io.swagger.annotations.ApiModelProperty;
+
+public class CirculationUser {
+
+    @ApiModelProperty(value = "OA审批id", required = false)
+    private Integer workOrder;
+
+    @ApiModelProperty(value = "审批节点", required = false)
+    private String state;
+
+    @ApiModelProperty(value = "审批意见", required = false)
+    private String remarks;
+
+    @ApiModelProperty(value = "审批用户id", required = false)
+    private Integer userId;
+
+    @ApiModelProperty(value = "审批用户姓名", required = false)
+    private String realName;
+
+    @ApiModelProperty(value = "审批用户身份证号", required = false)
+    private String idCard;
+
+    @ApiModelProperty(value = "审批用户手机号", required = false)
+    private String phone;
+
+    public Integer getWorkOrder() {
+        return workOrder;
+    }
+
+    public void setWorkOrder(Integer workOrder) {
+        this.workOrder = workOrder;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public String getRemarks() {
+        return remarks;
+    }
+
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getIdCard() {
+        return idCard;
+    }
+
+    public void setIdCard(String idCard) {
+        this.idCard = idCard;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+}

+ 33 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EmployeeDto.java

@@ -60,6 +60,15 @@ public class EmployeeDto {
 
     private String postalCode;
 
+    @ApiModelProperty(value = "OA部门ids",required = false)
+    private String deptIds;
+
+    @ApiModelProperty(value = "OA岗位ids",required = false)
+    private String postIds;
+
+    @ApiModelProperty(value = "岗位管理范围",required = false)
+    private String postDeptIds;
+
     public String getOrganIdStr() {
         return organIdStr;
     }
@@ -187,4 +196,28 @@ public class EmployeeDto {
     public void setDemissionDate(Date demissionDate) {
         this.demissionDate = demissionDate;
     }
+
+    public String getDeptIds() {
+        return deptIds;
+    }
+
+    public void setDeptIds(String deptIds) {
+        this.deptIds = deptIds;
+    }
+
+    public String getPostIds() {
+        return postIds;
+    }
+
+    public void setPostIds(String postIds) {
+        this.postIds = postIds;
+    }
+
+    public String getPostDeptIds() {
+        return postDeptIds;
+    }
+
+    public void setPostDeptIds(String postDeptIds) {
+        this.postDeptIds = postDeptIds;
+    }
 }

+ 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;
+	}
+}

+ 65 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicPitchDetailDto.java

@@ -11,15 +11,69 @@ public class MusicPitchDetailDto {
     @ApiModelProperty("时间戳ms")
     private int timeStamp;
 
+    @ApiModelProperty("结束时间戳")
+    private int endTimeStamp;
+
     @ApiModelProperty("持续时长ms")
     private int duration;
 
     @ApiModelProperty("频率Hz")
     private float frequency;
 
+    private float avgFrequency;
+
+    @ApiModelProperty("分贝")
+    private float decibel;
+
     @ApiModelProperty("小节数")
     private int measureIndex;
 
+    @ApiModelProperty("音符数")
+    private int musicalNotesIndex;
+
+    @ApiModelProperty("不需要评分")
+    private Boolean dontEvaluating;
+
+    public float getDecibel() {
+        return decibel;
+    }
+
+    public void setDecibel(float decibel) {
+        this.decibel = decibel;
+    }
+
+    public float getAvgFrequency() {
+        return avgFrequency;
+    }
+
+    public void setAvgFrequency(float avgFrequency) {
+        this.avgFrequency = avgFrequency;
+    }
+
+    public Boolean getDontEvaluating() {
+        return dontEvaluating;
+    }
+
+    public void setDontEvaluating(Boolean dontEvaluating) {
+        this.dontEvaluating = dontEvaluating;
+    }
+
+    public int getMusicalNotesIndex() {
+        return musicalNotesIndex;
+    }
+
+    public void setMusicalNotesIndex(int musicalNotesIndex) {
+        this.musicalNotesIndex = musicalNotesIndex;
+    }
+
+    public int getEndTimeStamp() {
+        return endTimeStamp;
+    }
+
+    public void setEndTimeStamp(int endTimeStamp) {
+        this.endTimeStamp = endTimeStamp;
+    }
+
     public MusicPitchDetailDto() {
     }
 
@@ -28,12 +82,23 @@ public class MusicPitchDetailDto {
         this.frequency = frequency;
     }
 
+    public MusicPitchDetailDto(int timeStamp, int endTimeStamp) {
+        this.timeStamp = timeStamp;
+        this.endTimeStamp = endTimeStamp;
+    }
+
     public MusicPitchDetailDto(int timeStamp, int duration, float frequency) {
         this.timeStamp = timeStamp;
         this.duration = duration;
         this.frequency = frequency;
     }
 
+    public MusicPitchDetailDto(int timeStamp, float frequency, double decibel) {
+        this.timeStamp = timeStamp;
+        this.frequency = frequency;
+        this.decibel = (float) decibel;
+    }
+
     public int getTimeStamp() {
         return timeStamp;
     }

+ 109 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OAFinancialDto.java

@@ -0,0 +1,109 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.SysUserTsign;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public class OAFinancialDto {
+
+    @ApiModelProperty(value = "公司名称", required = false)
+    private String organName;
+
+    @ApiModelProperty(value = "费用申请人", required = false)
+    private String realName;
+
+    @ApiModelProperty(value = "费用类型", required = false)
+    private String feeType;
+
+    @ApiModelProperty(value = "报销金额", required = false)
+    private BigDecimal totalMoney;
+
+    @ApiModelProperty(value = "是否有借款 (是 否)", required = false)
+    private String hasLoan;
+
+    @ApiModelProperty(value = "情况说明", required = false)
+    private String memo;
+
+    @ApiModelProperty(value = "审批人数据", required = false)
+    private List<CirculationUser> circulationUsers;
+
+    @ApiModelProperty(value = "执行人数据", required = false)
+    private List<CirculationUser> executors;
+
+    @ApiModelProperty(value = "签章数据", required = false)
+    private List<SysUserTsign> sysUserTsigns;
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getFeeType() {
+        return feeType;
+    }
+
+    public void setFeeType(String feeType) {
+        this.feeType = feeType;
+    }
+
+    public BigDecimal getTotalMoney() {
+        return totalMoney;
+    }
+
+    public void setTotalMoney(BigDecimal totalMoney) {
+        this.totalMoney = totalMoney;
+    }
+
+    public String getHasLoan() {
+        return hasLoan;
+    }
+
+    public void setHasLoan(String hasLoan) {
+        this.hasLoan = hasLoan;
+    }
+
+    public String getMemo() {
+        return memo;
+    }
+
+    public void setMemo(String memo) {
+        this.memo = memo;
+    }
+
+    public List<CirculationUser> getCirculationUsers() {
+        return circulationUsers;
+    }
+
+    public void setCirculationUsers(List<CirculationUser> circulationUsers) {
+        this.circulationUsers = circulationUsers;
+    }
+
+    public List<CirculationUser> getExecutors() {
+        return executors;
+    }
+
+    public void setExecutors(List<CirculationUser> executors) {
+        this.executors = executors;
+    }
+
+    public List<SysUserTsign> getSysUserTsigns() {
+        return sysUserTsigns;
+    }
+
+    public void setSysUserTsigns(List<SysUserTsign> sysUserTsigns) {
+        this.sysUserTsigns = sysUserTsigns;
+    }
+}

+ 55 - 8
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCompareHelper.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.dto;
 
+import be.tarsos.dsp.SilenceDetector;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.RandomAccessFile;
@@ -16,16 +17,19 @@ public class SoundCompareHelper {
     private Integer musicScoreId;
 
     @ApiModelProperty(value = "小节开始时间")
-    private double measureStartTime;
+    private double measureStartTime = 0;
 
     @ApiModelProperty
     private RandomAccessFile accessFile;
 
+    @ApiModelProperty(value = "录音文件地址")
+    private String recordFilePath;
+
     @ApiModelProperty(value = "小节xml信息字典")
     private Map<Integer, List<MusicPitchDetailDto>> measureXmlInfoMap = new HashMap<>();
 
     @ApiModelProperty(value = "小节结束时间字典")
-    private Map<Integer, Integer> measureEndTime = new HashMap<>();
+    private Map<Integer, MusicPitchDetailDto> measureEndTime = new HashMap<>();
 
     @ApiModelProperty(value = "录音音频信息")
     private List<MusicPitchDetailDto> recordMeasurePithInfo = new ArrayList<>();
@@ -33,10 +37,45 @@ public class SoundCompareHelper {
     @ApiModelProperty(value = "小节分数记录")
     private Map<String, BigDecimal> userScoreMap = new HashMap<>();
 
-    private Map<Integer, Map<String, BigDecimal>> userMeasureScoreMap = new HashMap<>();
+    private Map<Integer, Map<String, Object>> userMeasureScoreMap = new HashMap<>();
+
+    @ApiModelProperty(value = "音符频率字典")
+    private Map<Integer, Float> musicalNotePitchMap = new HashMap<>();
 
     @ApiModelProperty(value = "偏移时间量,解决客户端录音播放不同步导致的声音留白")
-    private int offsetTime;
+    private int offsetTime = -1;
+
+    private List<MusicPitchDetailDto> musicXmlInfos;
+
+    private byte[] preDataArray = new byte[0];
+    /**
+     * @describe 分贝检测器
+     */
+    public SilenceDetector silenceDetector = new SilenceDetector();
+
+    public List<MusicPitchDetailDto> getMusicXmlInfos() {
+        return musicXmlInfos;
+    }
+
+    public void setMusicXmlInfos(List<MusicPitchDetailDto> musicXmlInfos) {
+        this.musicXmlInfos = musicXmlInfos;
+    }
+
+    public Map<Integer, Float> getMusicalNotePitchMap() {
+        return musicalNotePitchMap;
+    }
+
+    public void setMusicalNotePitchMap(Map<Integer, Float> musicalNotePitchMap) {
+        this.musicalNotePitchMap = musicalNotePitchMap;
+    }
+
+    public byte[] getPreDataArray() {
+        return preDataArray;
+    }
+
+    public void setPreDataArray(byte[] preDataArray) {
+        this.preDataArray = preDataArray;
+    }
 
     public int getOffsetTime() {
         return offsetTime;
@@ -58,6 +97,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;
     }
@@ -78,11 +125,11 @@ public class SoundCompareHelper {
         this.measureXmlInfoMap = measureXmlInfoMap;
     }
 
-    public Map<Integer, Integer> getMeasureEndTime() {
+    public Map<Integer, MusicPitchDetailDto> getMeasureEndTime() {
         return measureEndTime;
     }
 
-    public void setMeasureEndTime(Map<Integer, Integer> measureEndTime) {
+    public void setMeasureEndTime(Map<Integer, MusicPitchDetailDto> measureEndTime) {
         this.measureEndTime = measureEndTime;
     }
 
@@ -102,11 +149,11 @@ public class SoundCompareHelper {
         this.userScoreMap = userScoreMap;
     }
 
-    public Map<Integer, Map<String, BigDecimal>> getUserMeasureScoreMap() {
+    public Map<Integer, Map<String, Object>> getUserMeasureScoreMap() {
         return userMeasureScoreMap;
     }
 
-    public void setUserMeasureScoreMap(Map<Integer, Map<String, BigDecimal>> userMeasureScoreMap) {
+    public void setUserMeasureScoreMap(Map<Integer, Map<String, Object>> userMeasureScoreMap) {
         this.userMeasureScoreMap = userMeasureScoreMap;
     }
 }

+ 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;
+    }
+}

+ 23 - 12
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Employee.java

@@ -54,11 +54,11 @@ public class Employee extends SysUser {
 	@ApiModelProperty(value = "证件号码",required = false)
 	private String certificateNum;
 
-	@ApiModelProperty(value = "部门id",required = false)
-	private Integer depId;
+	@ApiModelProperty(value = "部门ids",required = false)
+	private String depIds;
 
-	@ApiModelProperty(value = "岗位id",required = false)
-	private Integer postId;
+	@ApiModelProperty(value = "岗位ids",required = false)
+	private String postIds;
 
 	@ApiModelProperty(value = "银行卡号",required = false)
 	private String bankCard;
@@ -66,6 +66,9 @@ public class Employee extends SysUser {
 	@ApiModelProperty(value = "开户行",required = false)
 	private String openBankAddress;
 
+	@ApiModelProperty(value = "岗位管理部门",required = false)
+	private String postDeptIds;
+
 	/**  */
 	private java.util.Date updateTime;
 
@@ -228,20 +231,20 @@ public class Employee extends SysUser {
 		return ToStringBuilder.reflectionToString(this);
 	}
 
-	public Integer getDeptId() {
-		return depId;
+	public String getDeptIds() {
+		return depIds;
 	}
 
-	public void setDeptId(Integer deptId) {
-		this.depId = deptId;
+	public void setDeptIds(String deptIds) {
+		this.depIds = deptIds;
 	}
 
-	public Integer getPostId() {
-		return postId;
+	public String getPostIds() {
+		return postIds;
 	}
 
-	public void setPostId(Integer postId) {
-		this.postId = postId;
+	public void setPostIds(String postIds) {
+		this.postIds = postIds;
 	}
 
 	public String getBankCard() {
@@ -259,4 +262,12 @@ public class Employee extends SysUser {
 	public void setOpenBankAddress(String openBankAddress) {
 		this.openBankAddress = openBankAddress;
 	}
+
+	public String getPostDeptIds() {
+		return postDeptIds;
+	}
+
+	public void setPostDeptIds(String postDeptIds) {
+		this.postDeptIds = postDeptIds;
+	}
 }

+ 55 - 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,14 @@ 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 createTime;
@@ -361,6 +376,46 @@ 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 String getHrbp() {
+		return hrbp;
+	}
+
+	public void setHrbp(String hrbp) {
+		this.hrbp = hrbp;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

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

@@ -0,0 +1,81 @@
+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 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;
+	}
+			
+	@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;
 	}

+ 213 - 125
mec-biz/src/main/java/com/ym/mec/biz/handler/WebSocketHandler.java

@@ -3,12 +3,11 @@ package com.ym.mec.biz.handler;
 import be.tarsos.dsp.AudioDispatcher;
 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;
@@ -21,7 +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 java.io.File;
 import java.io.IOException;
 import java.io.RandomAccessFile;
@@ -41,24 +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 int endCheckOffsetTime = 500;
-
-    private final float simpleRate = 44100;
-    private int simpleSize = 1024;
+    /**
+     * @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 BigDecimal oneHundred = new BigDecimal(100);
 
-    private static final String tmpDir = FileUtils.getTempDirectoryPath() + "/soundCompare/";
+    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;
@@ -75,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);
     }
 
@@ -99,11 +96,19 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
             case SoundSocketService.MUSIC_XML:
                 userSoundInfoMap.put(phone, new SoundCompareHelper());
                 List<MusicPitchDetailDto> musicXmlInfos = JSON.parseArray(bodyObject.getString("musicXmlInfos"), MusicPitchDetailDto.class);
+                userSoundInfoMap.get(phone).setMusicXmlInfos(musicXmlInfos);
+                musicXmlInfos = musicXmlInfos.stream().filter(m->!m.getDontEvaluating()).collect(Collectors.toList());
                 userSoundInfoMap.get(phone).setMusicScoreId(bodyObject.getInteger("id"));
                 userSoundInfoMap.get(phone).setMeasureXmlInfoMap(musicXmlInfos.stream().collect(Collectors.groupingBy(MusicPitchDetailDto::getMeasureIndex)));
+                musicXmlInfos.forEach(e->userSoundInfoMap.get(phone).getMusicalNotePitchMap().put(e.getMusicalNotesIndex(), e.getFrequency()));
                 for (Map.Entry<Integer, List<MusicPitchDetailDto>> userMeasureXmlInfoEntry : userSoundInfoMap.get(phone).getMeasureXmlInfoMap().entrySet()) {
-                    MusicPitchDetailDto musicPitchDetailDto = userMeasureXmlInfoEntry.getValue().stream().max(Comparator.comparing(MusicPitchDetailDto::getTimeStamp)).get();
-                    userSoundInfoMap.get(phone).getMeasureEndTime().put(userMeasureXmlInfoEntry.getKey(), musicPitchDetailDto.getTimeStamp()+musicPitchDetailDto.getDuration());
+                    MusicPitchDetailDto firstPitch = userMeasureXmlInfoEntry.getValue().stream().min(Comparator.comparing(MusicPitchDetailDto::getTimeStamp)).get();
+                    MusicPitchDetailDto lastPitch = userMeasureXmlInfoEntry.getValue().stream().max(Comparator.comparing(MusicPitchDetailDto::getTimeStamp)).get();
+                    long dc = userMeasureXmlInfoEntry.getValue().stream().filter(m -> m.getDontEvaluating()).count();
+                    MusicPitchDetailDto musicPitchDetailDto = new MusicPitchDetailDto(firstPitch.getTimeStamp(), lastPitch.getTimeStamp() + lastPitch.getDuration());
+                    musicPitchDetailDto.setDuration(musicPitchDetailDto.getEndTimeStamp()-musicPitchDetailDto.getTimeStamp());
+                    musicPitchDetailDto.setDontEvaluating(dc == userMeasureXmlInfoEntry.getValue().size());
+                    userSoundInfoMap.get(phone).getMeasureEndTime().put(userMeasureXmlInfoEntry.getKey(), musicPitchDetailDto);
                 }
                 break;
             case SoundSocketService.RECORD_START:
@@ -112,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)){
@@ -119,9 +125,9 @@ 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)){
+                    if(recordTime>userSoundInfoMap.get(phone).getMeasureEndTime().get(lastMeasureIndex).getEndTimeStamp()){
                         measureCompare(phone, lastMeasureIndex);
                         userSoundInfoMap.get(phone).getMeasureEndTime().remove(lastMeasureIndex);
                     }
@@ -132,6 +138,12 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
             case SoundSocketService.RECORD_CANCEL:
                 createHeader(phone);
                 break;
+            case SoundSocketService.PROXY_MESSAGE:
+//                if(bodyObject.containsKey(SoundSocketService.OFFSET_TIME)){
+//                    int offsetTime = bodyObject.getIntValue(SoundSocketService.OFFSET_TIME);
+//                    calOffsetTime(phone, offsetTime);
+//                }
+                break;
             default:
                 break;
         }
@@ -146,52 +158,36 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         if(Objects.nonNull(userSoundInfoMap.get(phone).getAccessFile())){
             userSoundInfoMap.get(phone).getAccessFile().write(message.getPayload().array());
         }
-        List<MusicPitchDetailDto> recordInfo = new ArrayList<>();
-        AudioDispatcher dispatcher = AudioDispatcherFactory.fromByteArray(message.getPayload().array(), audioFormat, simpleSize, 128);
-        dispatcher.addAudioProcessor(new PitchProcessor(algo, simpleRate, simpleSize, (pitchDetectionResult, audioEvent) -> {
+
+        AudioDispatcher dispatcher = AudioDispatcherFactory.fromByteArray(message.getPayload().array(), soundCompareConfig.audioFormat, soundCompareConfig.simpleSize, soundCompareConfig.overlap);
+        dispatcher.addAudioProcessor(userSoundInfoMap.get(phone).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();
-//            LOGGER.info("频率:{}, {}", timeStamp, pitch);
-            recordInfo.add(new MusicPitchDetailDto(timeStamp, pitch));
+            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(userSoundInfoMap.get(phone).silenceDetector.currentSPL()<soundCompareConfig.validDb){
+                pitch = -1;
+            }
+//            LOGGER.info("时间:{}, 频率:{}, 分贝:{}", timeStamp, pitch, silenceDetecor.currentSPL());
+            userSoundInfoMap.get(phone).getRecordMeasurePithInfo().add(new MusicPitchDetailDto(timeStamp, pitch, userSoundInfoMap.get(phone).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);
-        userSoundInfoMap.get(phone).getRecordMeasurePithInfo().addAll(recordInfo);
-
-        //如果是第一小节,需要计算出录音与播放不同步导致的空白时间偏移量
-        if(userSoundInfoMap.get(phone).getOffsetTime()<=0&&recordTime<endCheckOffsetTime){
-            int hasPitchNum = 0;
-            for (MusicPitchDetailDto ri : userSoundInfoMap.get(phone).getRecordMeasurePithInfo()) {
-                if(hasPitchNum<=0){
-                    userSoundInfoMap.get(phone).setOffsetTime(ri.getTimeStamp());
-                }
-                if(ri.getFrequency()>0){
-                    hasPitchNum++;
+        for (Map.Entry<Integer, MusicPitchDetailDto> userMeasureEndTimeMapEntry : userSoundInfoMap.get(phone).getMeasureEndTime().entrySet()) {
+            if(recordTime>(userMeasureEndTimeMapEntry.getValue().getEndTimeStamp())){
+                if(userMeasureEndTimeMapEntry.getValue().getDontEvaluating()){
+                    continue;
                 }else{
-                    hasPitchNum=0;
+                    measureCompare(phone, userMeasureEndTimeMapEntry.getKey());
                 }
-                if(hasPitchNum>=3){
-                    LOGGER.info("偏移时间:{}", userSoundInfoMap.get(phone).getOffsetTime());
-                    break;
-                }
-            }
-            if(hasPitchNum<3){
-                userSoundInfoMap.get(phone).setOffsetTime(0);
-            }
-        }
-
-        if(userSoundInfoMap.get(phone).getOffsetTime()<=0&&recordTime<endCheckOffsetTime){
-            return;
-        }
-        for (Map.Entry<Integer, Integer> userMeasureEndTimeMapEntry : userSoundInfoMap.get(phone).getMeasureEndTime().entrySet()) {
-            if((recordTime - userSoundInfoMap.get(phone).getOffsetTime())>userMeasureEndTimeMapEntry.getValue()){
-                measureCompare(phone, userMeasureEndTimeMapEntry.getKey());
                 userSoundInfoMap.get(phone).getMeasureEndTime().remove(userMeasureEndTimeMapEntry.getKey());
                 break;
             }
@@ -214,6 +210,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         exception.printStackTrace();
         LOGGER.info("发生了错误,移除客户端: {}", phone);
         WS_CLIENTS.remove(phone);
+        userSoundInfoMap.remove(phone);
         createHeader(phone);
     }
 
@@ -222,8 +219,9 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         super.afterConnectionClosed(session, status);
         String phone = session.getPrincipal().getName().split(":")[1];
         LOGGER.info("{}离线", phone);
-        WS_CLIENTS.remove(phone);
         createHeader(phone);
+        WS_CLIENTS.remove(phone);
+        userSoundInfoMap.remove(phone);
     }
 
     @Override
@@ -232,6 +230,22 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
     }
 
     /**
+     * @describe 处理时间偏移
+     * @author Joburgess
+     * @date 2021/7/5 0005
+     * @param phone:
+     * @param offsetTime:
+     * @return void
+     */
+    private void calOffsetTime(String phone, int offsetTime){
+        userSoundInfoMap.get(phone).setOffsetTime(offsetTime);
+        for (Map.Entry<Integer, MusicPitchDetailDto> musicPitchDetailDtoEntry : userSoundInfoMap.get(phone).getMeasureEndTime().entrySet()) {
+            musicPitchDetailDtoEntry.getValue().setTimeStamp(musicPitchDetailDtoEntry.getValue().getTimeStamp() + offsetTime);
+            musicPitchDetailDtoEntry.getValue().setEndTimeStamp(musicPitchDetailDtoEntry.getValue().getEndTimeStamp() + offsetTime);
+        }
+    }
+
+    /**
      * @describe 保存录音数据,并生成wav头信息
      * @author Joburgess
      * @date 2021/6/25 0025
@@ -244,14 +258,13 @@ 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);
         }
 //        userSoundInfoMap.get(phone).setRecordMeasurePithInfo(null);
-        LOGGER.info("评分数据:{}", JSON.toJSONString(userSoundInfoMap.get(phone)));
         userSoundInfoMap.remove(phone);
     }
 
@@ -264,6 +277,10 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
      * @return void
      */
     private void measureCompare(String phone, int measureIndex) throws IOException {
+        if (userSoundInfoMap.get(phone).getOffsetTime() == -1){
+            userSoundInfoMap.get(phone).setOffsetTime(0);
+        }
+
         //相似度
         BigDecimal intonation = BigDecimal.ZERO;
         //节奏
@@ -272,84 +289,151 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         BigDecimal integrity = BigDecimal.ZERO;
 
         try {
-            //最低有效频率
-            float minValidFrequency = 20;
-
-            //有效音频数量
-            float validNum = 0;
-            //音频有效阈值
-            float validDuty = 0.5f;
-
-            //音准匹配数量
-            float intonationNum = 0;
-            //音准匹配误差范围
-            float intonationErrRange = 15;
-            //音准有效阈值
-            float intonationValidDuty = 0.7f;
+            //音准分数
+            float intonationScore = 0;
 
             //节奏匹配数量
             float cadenceNum = 0;
-            //节奏匹配误差范围
-            float cadenceErrRange = 30;
-            //节奏有效阈值
-            float cadenceValidDuty = 0.6f;
+
+            //完整性分数
+            float integrityScore = 0;
 
             int totalCompareNum = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).size();
 
-            for (MusicPitchDetailDto musicXmlInfo : userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex)) {
-                int startTimeStamp = musicXmlInfo.getTimeStamp() + userSoundInfoMap.get(phone).getOffsetTime();
-                int endTimeStamp = musicXmlInfo.getTimeStamp()+musicXmlInfo.getDuration() + userSoundInfoMap.get(phone).getOffsetTime();
+            for (int i = 0; i < userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).size(); i++) {
+                MusicPitchDetailDto musicXmlInfo = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).get(i);
+
+                int ot5 = (int) (musicXmlInfo.getDuration()*0.1);
+                int startTimeStamp = musicXmlInfo.getTimeStamp() + userSoundInfoMap.get(phone).getOffsetTime() + ot5;
+                int endTimeStamp = musicXmlInfo.getTimeStamp()  + userSoundInfoMap.get(phone).getOffsetTime() + musicXmlInfo.getDuration() - ot5;
 
-                //时间范围内有效音准数量
-                float recordValidIntonationNum = 0;
                 //时间范围内有效节奏数量
                 float cadenceValidNum = 0;
                 //时间范围内有效音频数量
-                float recordValidNum = 0;
+                float integrityValidNum = 0;
                 //时间范围内匹配次数
                 float compareNum = 0;
-                for (MusicPitchDetailDto recordInfo : userSoundInfoMap.get(phone).getRecordMeasurePithInfo()) {
+
+                List<MusicPitchDetailDto> measureSoundPitchInfos = new ArrayList<>();
+
+                for (int j = 0; j < userSoundInfoMap.get(phone).getRecordMeasurePithInfo().size(); j++) {
+                    MusicPitchDetailDto recordInfo = userSoundInfoMap.get(phone).getRecordMeasurePithInfo().get(j);
                     //如果在时间范围之外直接跳过
                     if(recordInfo.getTimeStamp()<startTimeStamp||recordInfo.getTimeStamp()>endTimeStamp){
                         continue;
                     }
-//                    LOGGER.info("{}频率({}-{}):{}, {}", recordInfo.getTimeStamp(), startTimeStamp, endTimeStamp, musicXmlInfo.getFrequency(), recordInfo.getFrequency());
+                    measureSoundPitchInfos.add(recordInfo);
                     compareNum++;
                     //如果在最低有效频率以下则跳过
-                    if(recordInfo.getFrequency()<minValidFrequency&&musicXmlInfo.getFrequency()!=-1){
+                    if(recordInfo.getFrequency()<soundCompareConfig.validFrequency&&musicXmlInfo.getFrequency()!=-1){
                         continue;
                     }
-                    recordValidNum++;
+                    cadenceValidNum++;
                     //如果频率差值在节奏误差范围内
-                    if(Math.abs(recordInfo.getFrequency()-musicXmlInfo.getFrequency())<=cadenceErrRange){
-                        cadenceValidNum++;
-                    }
-                    //如果频率差值在音准误差范围内
-                    if(Math.abs(recordInfo.getFrequency()-musicXmlInfo.getFrequency())<=intonationErrRange){
-                        recordValidIntonationNum++;
+                    if(Math.abs(recordInfo.getFrequency()-musicXmlInfo.getFrequency())<=soundCompareConfig.integrityFrequencyRange){
+                        integrityValidNum++;
                     }
                 }
-                //有效音频占比
-                float recordValidDuty = recordValidNum/compareNum;
-                if(recordValidDuty<validDuty){
-                    continue;
+
+                //非正常频率次数
+                int errPitchNum = 0;
+                //分贝变化次数
+                int decibelChangeNum = 0;
+
+                if(CollectionUtils.isEmpty(measureSoundPitchInfos)){
+                    userSoundInfoMap.get(phone).getMusicalNotePitchMap().put(musicXmlInfo.getMusicalNotesIndex(), (float) 0);
+                }else{
+                    Map<Integer, Long> collect = measureSoundPitchInfos.stream().map(pitch -> (int)pitch.getFrequency()).collect(Collectors.groupingBy(Integer::intValue, Collectors.counting()));
+                    //出现次数最多的频率
+                    Integer pitch = collect.entrySet().stream().max(Comparator.comparing(e -> e.getValue())).get().getKey();
+                    //当前频率
+                    double cf = -1;
+                    //频率持续数量
+                    int fnum = 0;
+                    //是否演奏中
+                    boolean ing = false;
+                    //当前分贝
+                    double cd = 0;
+                    //分贝变化方向,-1变小,1变大
+                    int dcd = -1;
+                    //分贝持续数量
+                    int dnum = 0;
+                    for (MusicPitchDetailDto musicalNotesPitch : measureSoundPitchInfos) {
+                        //计算频率断层次数
+                        if (Math.abs(musicalNotesPitch.getFrequency() - cf) > 20){
+                            fnum ++;
+                        }
+                        if (fnum>=5){
+                            cf = musicalNotesPitch.getFrequency();
+                            fnum = 0;
+                            if (cf != -1){
+                                errPitchNum ++;
+                                ing = true;
+                                cd = musicalNotesPitch.getDecibel();
+                            }
+                        }
+                        //计算声音大小断层册数
+                        if(ing && Math.abs(musicalNotesPitch.getDecibel() - cd) > 10){
+                            dnum ++;
+                        }
+                        if (dnum > 2){
+                            int tdcd = cd > musicalNotesPitch.getDecibel() ? -1 : 1;
+                            cd = musicalNotesPitch.getDecibel();
+                            dnum = 0;
+                            if (tdcd != dcd) {
+                                decibelChangeNum++;
+                            }
+                            dcd = tdcd;
+                        }
+                    }
+                    userSoundInfoMap.get(phone).getMusicalNotePitchMap().put(musicXmlInfo.getMusicalNotesIndex(), (float) pitch);
                 }
-                validNum++;
-                //有效音高占比
-                float intonationDuty = recordValidIntonationNum/compareNum;
+
                 //有效节奏占比
                 float cadenceDuty = cadenceValidNum/compareNum;
-                if(intonationDuty>=intonationValidDuty){
-                    intonationNum++;
+                //如果频率出现断层或这个音量出现断层,则当前音符节奏无效
+                if(errPitchNum>=2 || decibelChangeNum>1){
+                    cadenceDuty = 0;
                 }
-                if(cadenceDuty>=cadenceValidDuty){
+                //节奏
+                if(cadenceDuty>=soundCompareConfig.cadenceValidDuty){
                     cadenceNum++;
                 }
+                //音准
+                if (!CollectionUtils.isEmpty(measureSoundPitchInfos)){
+                    Double avgPitch = measureSoundPitchInfos.stream().filter(pitch -> Math.abs((pitch.getFrequency()-musicXmlInfo.getFrequency()))<5).collect(Collectors.averagingDouble(pitch -> pitch.getFrequency()));
+                    //音分
+                    double recordCents = 0;
+                    if (avgPitch > 0){
+                        recordCents = PitchConverter.hertzToAbsoluteCent(avgPitch);
+                    }
+                    double cents = PitchConverter.hertzToAbsoluteCent(musicXmlInfo.getFrequency());
+                    double score = 100 - Math.round(Math.abs(cents - recordCents)) + soundCompareConfig.intonationCentsRange;
+                    if (score < 0){
+                        score = 0;
+                    }else if(score > 100){
+                        score = 100;
+                    }
+                    intonationScore += score;
+                    musicXmlInfo.setAvgFrequency(avgPitch.floatValue());
+                }
+                //完成度
+                if(integrityValidNum>0){
+                    integrityValidNum = integrityValidNum;
+                }
+                if(integrityValidNum > compareNum){
+                    integrityValidNum = compareNum;
+                }
+                float integrityDuty = integrityValidNum/compareNum;
+                integrityScore += integrityDuty;
             }
 
-            intonation = new BigDecimal(intonationNum).divide(new BigDecimal(totalCompareNum), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(oneHundred).setScale(0, BigDecimal.ROUND_HALF_UP);
-            cadence = new BigDecimal(cadenceNum).divide(new BigDecimal(totalCompareNum), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(oneHundred).setScale(0, BigDecimal.ROUND_HALF_UP);
-            integrity = new BigDecimal(validNum).divide(new BigDecimal(totalCompareNum), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(oneHundred).setScale(0, BigDecimal.ROUND_HALF_UP);
+            BigDecimal measureNum = new BigDecimal(totalCompareNum);
+
+            intonation = new BigDecimal(intonationScore).divide(measureNum, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).setScale(0, BigDecimal.ROUND_UP);
+            cadence = new BigDecimal(cadenceNum).divide(measureNum, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(oneHundred).setScale(0, BigDecimal.ROUND_UP);
+            integrity = new BigDecimal(integrityScore).divide(measureNum, CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(oneHundred).setScale(0, BigDecimal.ROUND_UP);
+
         } catch (ArithmeticException e){
             LOGGER.info("无musicXml信息");
         }
@@ -372,14 +456,8 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
             userSoundInfoMap.get(phone).getUserScoreMap().put("integrity", integrity);
         }
 
-        Map<String, BigDecimal> scoreData = new HashMap<>();
-        scoreData.put("intonation", intonation);
-        scoreData.put("cadence", cadence);
-        scoreData.put("integrity", integrity);
-
-        userSoundInfoMap.get(phone).getUserMeasureScoreMap().put(measureIndex, scoreData);
-
-        WS_CLIENTS.get(phone).sendMessage(new TextMessage(JSON.toJSONString(createPushInfo("measureScore", measureIndex, intonation, cadence, integrity))));
+        //计算分数并推送
+        createPushInfo(phone, "measureScore", measureIndex, intonation, cadence, integrity);
     }
 
     /**
@@ -399,13 +477,16 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         if(currentCompareNum>0){
             intonation = userSoundInfoMap.get(phone).getUserScoreMap().get("intonation").divide(new BigDecimal(currentCompareNum), 0, BigDecimal.ROUND_DOWN);
             cadence = userSoundInfoMap.get(phone).getUserScoreMap().get("cadence").divide(new BigDecimal(currentCompareNum), 0, BigDecimal.ROUND_DOWN);
-            integrity = new BigDecimal(currentCompareNum).divide(new BigDecimal(totalCompareNum), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(oneHundred).setScale(0, BigDecimal.ROUND_DOWN);
+            integrity = userSoundInfoMap.get(phone).getUserScoreMap().get("integrity").divide(new BigDecimal(currentCompareNum), 0, BigDecimal.ROUND_DOWN);
         }
 
-        WS_CLIENTS.get(phone).sendMessage(new TextMessage(JSON.toJSONString(createPushInfo("overall", -1, intonation, cadence, integrity))));
+        //计算分数并推送
+        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)));
     }
 
     /**
@@ -419,22 +500,29 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
      * @param integrity:
      * @return com.ym.mec.biz.dal.dto.WebSocketInfo
      */
-    private WebSocketInfo createPushInfo(String command, Integer measureIndex,
-                                         BigDecimal intonation, BigDecimal cadence, BigDecimal integrity){
+    private WebSocketInfo createPushInfo(String phone, String command, Integer measureIndex,
+                                         BigDecimal intonation, BigDecimal cadence, BigDecimal integrity) throws IOException {
         WebSocketInfo webSocketInfo = new WebSocketInfo();
         HashMap<String, String> header = new HashMap<>();
         header.put("commond", command);
         webSocketInfo.setHeader(header);
         Map<String, Object> result = new HashMap<>();
-        BigDecimal score = intonation.multiply(new BigDecimal(0.5)).add(cadence.multiply(new BigDecimal(0.5))).setScale(0, BigDecimal.ROUND_HALF_UP);
-//        BigDecimal score = cadence.setScale(0, BigDecimal.ROUND_HALF_UP);
+//        BigDecimal score = intonation.multiply(new BigDecimal(0.5)).add(cadence.multiply(new BigDecimal(0.5))).setScale(0, BigDecimal.ROUND_HALF_UP);
+        BigDecimal score = intonation.add(cadence).add(integrity).divide(new BigDecimal(3), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).setScale(0, BigDecimal.ROUND_UP);
+//        BigDecimal score = integrity.setScale(0, BigDecimal.ROUND_HALF_UP);
         result.put("score", score);
         result.put("intonation", intonation);
         result.put("cadence", cadence);
         result.put("integrity", integrity);
         result.put("measureIndex", measureIndex);
         webSocketInfo.setBody(result);
+
+        userSoundInfoMap.get(phone).getUserMeasureScoreMap().put(measureIndex, result);
+
         LOGGER.info("小节频分:{}", JSON.toJSONString(webSocketInfo));
+
+        //推送结果
+        WS_CLIENTS.get(phone).getSession().sendMessage(new TextMessage(JSON.toJSONString(webSocketInfo)));
         return webSocketInfo;
     }
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ContractService.java

@@ -2,8 +2,11 @@ package com.ym.mec.biz.service;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 import java.util.Map;
 
+import com.ym.mec.biz.dal.dto.CirculationUser;
+import com.ym.mec.biz.dal.dto.OAFinancialDto;
 import com.ym.mec.biz.dal.entity.SysUserTsign;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
 import com.ym.mec.common.entity.HttpResponseResult;
@@ -128,4 +131,13 @@ public interface ContractService {
 	 * @return
 	 */
 	Map<String, Object> queryProductContract(Integer userId,String musicGroupId);
+
+
+	/**
+	 * OA财务审批的签章
+	 * @param financialDto
+	 * @return
+	 */
+	String transferOaFinancial(OAFinancialDto financialDto);
+
 }

+ 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);
 }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/EmployeeService.java

@@ -7,6 +7,7 @@ import com.ym.mec.biz.dal.enums.EmployeeOperateEnum;
 import com.ym.mec.biz.dal.page.EmployeeQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import com.ym.mec.oa.entity.OAUser;
 
 import java.util.HashMap;
 import java.util.List;

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

@@ -0,0 +1,8 @@
+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> {
+
+}

+ 37 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/OaUserService.java

@@ -0,0 +1,37 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.Employee;
+
+public interface OaUserService {
+
+    /**
+     * 添加OA用户
+     * @param employee
+     * @return
+     */
+    Object addOaUser(Employee employee);
+
+
+    /**
+     * 修改OA用户
+     * @param employee
+     * @return
+     */
+    Object updateOaUser(Employee employee);
+
+
+    /**
+     * 删除OA用户(软删除)
+     * @param employee
+     * @return
+     */
+    Object delOaUser(Employee employee);
+
+
+    /**
+     * 恢复OA用户
+     * @param employee
+     * @return
+     */
+    Object reInsertOaUser(Employee employee);
+}

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

@@ -11,5 +11,7 @@ public interface SoundSocketService {
     String RECORD_START = "recordStart";
     String RECORD_END = "recordEnd";
     String RECORD_CANCEL = "recordCancel";
+    String PROXY_MESSAGE = "proxyMessage";
+    String OFFSET_TIME = "offsetTime";
 
 }

+ 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, BigDecimal>> userMeasureScoreMap);
+    void saveMusicCompareData(String phone, SoundCompareHelper soundCompareInfo);
 
 }

+ 93 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java

@@ -3,16 +3,17 @@ package com.ym.mec.biz.service.impl;
 import java.io.File;
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
-import java.util.Objects;
+import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.CirculationUser;
+import com.ym.mec.biz.dal.dto.OAFinancialDto;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -31,12 +32,6 @@ import org.springframework.util.CollectionUtils;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.enums.CertificateTypeEnum;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
-import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
-import com.ym.mec.biz.dal.dao.StudentDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
-import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
-import com.ym.mec.biz.dal.dao.SysUserContractsDao;
 import com.ym.mec.biz.dal.dto.StudentInfo;
 import com.ym.mec.biz.dal.entity.CooperationOrgan.OwnershipType;
 import com.ym.mec.biz.dal.entity.Goods;
@@ -142,6 +137,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 	@Autowired
 	private StudentDao studentDao;
 
+	@Autowired
+	private EmployeeDao employeeDao;
+
 	@Value("${contract.baseDir:/var/pdf}")
 	private String contractBaseDir;
 
@@ -498,7 +496,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		} else {
 			params.put("paymentcalender", calenders.stream().map(cal -> cal.getPaymentMonth().toString()).collect(Collectors.joining("月,")) + "月");
 		}*/
-		
+
 		params.put("paymentcalender", "一次性");
 
 		params.put("isShowVisualSeal", true);
@@ -1250,4 +1248,87 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		FileUtils.deleteQuietly(srcFile);
 		return BaseController.succeed();
 	}
+
+	@Override
+	public String transferOaFinancial(OAFinancialDto financialDto) {
+		List<Integer> circulationUserIds = financialDto.getCirculationUsers().stream().map(CirculationUser::getUserId).collect(Collectors.toList());
+		List<Integer> executorIds = financialDto.getExecutors().stream().map(CirculationUser::getUserId).collect(Collectors.toList());
+		circulationUserIds.addAll(executorIds);
+		List<SysUser> users = employeeDao.getUsers(circulationUserIds);
+
+		Integer workOrderId = null;
+		List<SysUserTsign> sysUserTsigns = new ArrayList<>();
+		for (SysUser user : users) {
+			for (CirculationUser circulationUser : financialDto.getCirculationUsers()) {
+				if (workOrderId == null) {
+					workOrderId = circulationUser.getWorkOrder();
+				}
+				if (!circulationUser.getUserId().equals(user.getId())) continue;
+				circulationUser.setRealName(user.getRealName());
+			}
+			for (CirculationUser executor : financialDto.getExecutors()) {
+				if (!executor.getUserId().equals(user.getId())) continue;
+				executor.setRealName(user.getRealName());
+			}
+			SysUserTsign sysUserTsign = sysUserTsignService.get(user.getId());
+			if (sysUserTsign == null) {
+				try {
+					sysUserTsign = register(user.getId(), user.getRealName(), user.getIdCardNo(), user.getPhone());
+				} catch (Exception e) {
+					logger.error("用户电子签章注册失败", e);
+					continue;
+				}
+			}
+			sysUserTsigns.add(sysUserTsign);
+		}
+
+		Date date = new Date();
+
+		// 合成freemarker
+		String srcPdfPath = contractBaseDir + "/oa/" + dateFormat1.format(date) + "/" + workOrderId + "_" + LocalDateTime.now().getSecond() + ".pdf";
+
+		File srcFile = new File(srcPdfPath);
+
+		File debtFile = new File(srcFile.getParent());
+		if (!debtFile.exists()) {
+			debtFile.mkdirs();
+		}
+
+		FreemarkerTemplateEngine templateEngine = FreemarkerTemplateEngine.getInstance();
+		templateEngine.setClassForTemplateLoading(ContractServiceImpl.class, "/config/contracts/");
+
+		Map<String, Object> params = new HashMap<String, Object>();
+
+		// 查询参数信息
+		params.put("organName", financialDto.getOrganName());
+		params.put("realName", financialDto.getRealName());
+		params.put("feeType", financialDto.getFeeType());
+		params.put("totalMoney", financialDto.getTotalMoney().setScale(2, RoundingMode.HALF_UP));
+		params.put("hasLoan", financialDto.getHasLoan());
+		params.put("memo", financialDto.getMemo());
+		params.put("circulationUsers", financialDto.getCirculationUsers());
+		params.put("executors", financialDto.getExecutors());
+
+		templateEngine.render(params, "financial.ftl", srcFile);
+
+		// 生成借款协议PDF
+		try {
+			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath, "simsun.ttc");
+		} catch (IOException e) {
+			logger.error("生成签章协议失败", e);
+		}
+
+		for (SysUserTsign sysUserTsign : sysUserTsigns) {
+			eSealPlugin.userSign(sysUserTsign.getAccountId(), sysUserTsign.getSealData(), sysUserTsign.getUserId().toString(), srcPdfPath, srcPdfPath);
+		}
+
+		//上传到oss
+		String dateStrOss = dateFormatOss.format(date);
+		dateStrOss = "oa/" + dateStrOss + "/" + DateUtil.getHour(date);
+		String pdfFilePath = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, dateStrOss, srcFile);
+
+		FileUtils.deleteQuietly(srcFile);
+
+		return pdfFilePath;
+	}
 }

+ 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);
+	}
 	
 }

+ 21 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java

@@ -4,13 +4,14 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.service.ImUserFriendService;
+import com.ym.mec.biz.service.OaUserService;
 import com.ym.mec.im.entity.GroupMember;
 import com.ym.mec.im.entity.GroupModel;
+import com.ym.mec.oa.entity.OAUser;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@@ -31,7 +32,6 @@ import com.ym.mec.biz.dal.page.EmployeeQueryInfo;
 import com.ym.mec.biz.service.EmployeeService;
 import com.ym.mec.biz.service.ImGroupMemberService;
 import com.ym.mec.common.dal.BaseDAO;
-import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.entity.ImGroupModel;
 import com.ym.mec.common.entity.ImResult;
 import com.ym.mec.common.entity.ImUserModel;
@@ -67,6 +67,8 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 	private ImGroupDao imGroupDao;
 	@Autowired
 	private CooperationOrganDao cooperationOrganDao;
+	@Autowired
+	private OaUserService oaUserService;
 
 	@Override
 	public BaseDAO<Integer, Employee> getDAO() {
@@ -107,6 +109,12 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 		ImResult imResult = imFeignService.register(new ImUserModel(employee.getId().toString(), employee.getUsername(),null));
 		employee.setImToken(imResult.getToken());
 		teacherDao.updateUser(employee);
+		if(user != null){
+			employee.setAvatar(user.getAvatar());
+		}
+
+		//添加到OA
+		oaUserService.addOaUser(employee);
 	}
 
 	@Override
@@ -135,6 +143,11 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 		imGroupDao.updateNickname(employee.getUserId(), employee.getRealName());
 		imGroupDao.updateUserFriendNickname(employee.getUserId(), employee.getRealName());
 		imFeignService.update(new ImUserModel(employee.getUserId().toString(),employee.getRealName(),sysUser.getAvatar()));
+
+		employee.setAvatar(sysUser.getAvatar());
+
+		//更新OA信息
+		oaUserService.updateOaUser(employee);
 	}
 
 	@Override
@@ -213,10 +226,16 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 				employeeDao.updateUserLock(employeeId,1);
 				employeeDao.updateUserDemissionDate(employeeId);
 				sysUserFeignService.exitByPhone("system", sysUser.getPhone());
+
+				//更新OA信息
+				oaUserService.delOaUser(employee);
 				break;
 			case REINSTATE:
 				//离职,如果有关联课程组教务老师,
 				employeeDao.updateUserDemissionDate(employeeId);
+
+				//更新OA信息
+				oaUserService.reInsertOaUser(employee);
 				break;
 		}
 	}

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

@@ -0,0 +1,23 @@
+package com.ym.mec.biz.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.biz.dal.dao.EmployeeVisitDao;
+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.service.impl.BaseServiceImpl;
+
+@Service
+public class EmployeeVisitServiceImpl extends BaseServiceImpl<Long, EmployeeVisit>  implements EmployeeVisitService {
+	
+	@Autowired
+	private EmployeeVisitDao employeeVisitDao;
+
+	@Override
+	public BaseDAO<Long, EmployeeVisit> getDAO() {
+		return employeeVisitDao;
+	}
+	
+}

+ 75 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OaServiceImpl.java

@@ -0,0 +1,75 @@
+package com.ym.mec.biz.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.service.OaUserService;
+import com.ym.mec.oa.OaFeignService;
+import com.ym.mec.oa.entity.OAUser;
+import com.ym.mec.oa.entity.PostDept;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+@Service
+public class OaServiceImpl implements OaUserService {
+    @Autowired
+    private OaFeignService oaFeignService;
+
+    @Override
+    @Async
+    public Object addOaUser(Employee employee) {
+        OAUser oaUser = new OAUser();
+        oaUser.setMecUserId(employee.getUserId());
+        oaUser.setUserName(employee.getRealName());
+        oaUser.setNickName(employee.getRealName());
+        oaUser.setPhone(employee.getPhone());
+        oaUser.setSex(employee.getGender().toString());
+        oaUser.setDeptIds(JSON.parseArray(employee.getDeptIds(), Integer.class));
+        oaUser.setAvatar(employee.getAvatar());
+        oaUser.setPostDeptIds(JSON.parseArray(employee.getPostDeptIds(), PostDept.class));
+        if (oaUser.getPostDeptIds() != null) {
+            List<Integer> postIds = oaUser.getPostDeptIds().stream().map(PostDept::getPostId).collect(Collectors.toList());
+            oaUser.setPostIds(postIds);
+        }
+        return oaFeignService.register(oaUser);
+    }
+
+    @Override
+    @Async
+    public Object updateOaUser(Employee employee) {
+        OAUser oaUser = new OAUser();
+        oaUser.setMecUserId(employee.getUserId());
+        oaUser.setUserName(employee.getRealName());
+        oaUser.setNickName(employee.getRealName());
+        oaUser.setPhone(employee.getPhone());
+        oaUser.setSex(employee.getGender().toString());
+        oaUser.setDeptIds(JSON.parseArray(employee.getDeptIds(), Integer.class));
+        oaUser.setAvatar(employee.getAvatar());
+        oaUser.setPostDeptIds(JSON.parseArray(employee.getPostDeptIds(), PostDept.class));
+        if (oaUser.getPostDeptIds() != null) {
+            List<Integer> postIds = oaUser.getPostDeptIds().stream().map(PostDept::getPostId).collect(Collectors.toList());
+            oaUser.setPostIds(postIds);
+        }
+        return oaFeignService.updateUser(oaUser);
+    }
+
+    @Override
+    @Async
+    public Object delOaUser(Employee employee) {
+        OAUser oaUser = new OAUser();
+        oaUser.setMecUserId(employee.getUserId());
+        return oaFeignService.delUser(oaUser);
+    }
+
+    @Override
+    @Async
+    public Object reInsertOaUser(Employee employee) {
+        OAUser oaUser = new OAUser();
+        oaUser.setMecUserId(employee.getUserId());
+        return oaFeignService.reInsertUser(oaUser);
+    }
+}

+ 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, BigDecimal>> 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);
 	}
 }

+ 108 - 0
mec-biz/src/main/resources/config/contracts/financial.ftl

@@ -0,0 +1,108 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"/>
+    <meta http-equiv="Pragma" content="no-cache"/>
+    <meta http-equiv="Cache-Control" content="no-cache"/>
+    <meta http-equiv="Expires" content="0"/>
+    <title>费用报销单</title>
+    <style>
+        body {
+            margin: 0;
+        }
+
+        .container {
+            padding: 22px 20px 3px;
+            font-size: 14px;
+            max-width: 600px;
+            margin: 0 auto;
+        }
+
+        h1 {
+            font-size: 18px;
+            text-align: center;
+            margin-bottom: 8px;
+        }
+
+        table {
+            width: 100%;
+            border-collapse: collapse;
+        }
+
+        table, tr, td {
+            border: 1px solid #424242;
+        }
+
+        .title {
+            width: 110px;
+            text-align: center;
+        }
+
+        td {
+            padding: 10px 5px;
+        }
+    </style>
+</head>
+<body style="font-family:'SimSun'">
+<div class="container">
+    <h1>${organName!}费用报销单</h1>
+    <table class="table">
+        <tr>
+            <td class="title">公司名称:</td>
+            <td class="concat">${organName!}</td>
+        </tr>
+        <tr>
+            <td class="title">费用申请人:</td>
+            <td class="concat">${realName!}</td>
+        </tr>
+        <tr>
+            <td class="title">费用类型:</td>
+            <td class="concat">${feeType!}</td>
+        </tr>
+        <tr>
+            <td class="title">报销金额:</td>
+            <td class="concat">${totalMoney?string(',###.00')}</td>
+        </tr>
+        <tr>
+            <td class="title">是否有借款:</td>
+            <td class="concat">${hasLoan!}</td>
+        </tr>
+
+        <tr>
+            <td class="title">情况说明:</td>
+            <td class="concat">
+                ${memo!}
+            </td>
+        </tr>
+    </table>
+    <table style="border-top: 0;">
+        <#list circulationUsers as circulationUser>
+            <#if circulationUser_index=0>
+                <tr style="border-top: 0;">
+                    <td style="border-top: 0;" rowspan="${circulationUsers?size}" class="title">审批意见:</td>
+                    <td class="title" style="width: 110px;border-top: 0;">${circulationUser.state!}:</td>
+                    <td style="border-top: 0;" class="concat">${circulationUser.remarks!}<span style="color: #ffffff;">${circulationUser.userId?c}</span></td>
+                </tr>
+            <#else>
+                <tr>
+                    <td class="title" style="width: 110px;">${circulationUser.state!}:</td>
+                    <td class="concat">${circulationUser.remarks!}<span style="color: #ffffff;">${circulationUser.userId?c}</span></td>
+                </tr>
+            </#if>
+        </#list>
+        <#list executors as executor>
+            <tr>
+                <#if executor_index=0>
+                    <td rowspan="${executors?size}" class="title">执行:</td>
+                </#if>
+                <td class="title" style="width: 110px;">${executor.state!}:</td>
+                <td class="concat">${executor.remarks!}<span style="color: #ffffff;">${executor.userId?c}</span></td>
+            </tr>
+        </#list>
+    </table>
+</div>
+</body>
+</html>

+ 35 - 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,35 @@
 		<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" />
 	</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 +72,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 +124,21 @@
 			<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>
 				source_from_ = #{sourceFrom}
 		</set>
 		WHERE id_ = #{id}

+ 26 - 5
mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml

@@ -23,8 +23,9 @@
         <result column="demission_date_" property="demissionDate"/>
         <result column="contact_address_" property="contactAddress"/>
         <result column="postal_code_" property="postalCode"/>
-        <result column="dept_id_" property="deptId"/>
-        <result column="post_id_" property="postId"/>
+        <result column="dept_ids_" property="deptIds"/>
+        <result column="post_ids_" property="postIds"/>
+        <result column="post_dept_ids_" property="postDeptIds"/>
         <result column="bank_card_" property="bankCard"/>
         <result column="open_bank_address_" property="openBankAddress"/>
     </resultMap>
@@ -49,6 +50,7 @@
         <result column="birthdate_" property="birthdate"/>
         <result column="email_" property="email"/>
         <result column="im_token_" property="imToken"/>
+        <result column="real_name_" property="realName"/>
         <result column="id_card_no_" property="idCardNo"/>
         <result column="wechat_id_" property="wechatId"/>
     </resultMap>
@@ -73,9 +75,9 @@
         -->
         INSERT INTO employee
         (user_id_,organ_id_list_,job_nature_,is_probation_period_,education_background_,graduate_school_,technical_titles_,
-        entry_date_,certificate_type_,certificate_num_,update_time_,create_time_,introduction_,demission_date_,contact_address_,postal_code_)
+        entry_date_,certificate_type_,certificate_num_,update_time_,create_time_,introduction_,demission_date_,contact_address_,postal_code_,dept_ids_,post_ids_,post_dept_ids_)
         VALUES(#{userId},#{organIdList},#{jobNature},#{isProbationPeriod},#{educationBackground},#{graduateSchool},
-        #{technicalTitles},#{entryDate},#{certificateType},#{certificateNum},now(),now(),#{introduction},#{demissionDate},#{contactAddress},#{postalCode})
+        #{technicalTitles},#{entryDate},#{certificateType},#{certificateNum},now(),now(),#{introduction},#{demissionDate},#{contactAddress},#{postalCode},#{deptIds},#{postIds},#{postDeptIds})
     </insert>
     <insert id="batchAddEmployeeRole">
         INSERT INTO sys_user_role(user_id_,role_id_) values
@@ -134,6 +136,15 @@
             <if test="demissionDate != null">
                 demission_date_ = #{demissionDate},
             </if>
+            <if test="deptIds != null">
+                dept_ids_ = #{deptIds},
+            </if>
+            <if test="postIds != null">
+                post_ids_ = #{postIds},
+            </if>
+            <if test="postDeptIds != null">
+                post_dept_ids_ = #{postDeptIds},
+            </if>
         </set>
         WHERE user_id_ = #{userId}
     </update>
@@ -190,6 +201,9 @@
         <result property="contactAddress" column="contact_address_"/>
         <result property="postalCode" column="postal_code_"/>
         <result property="organIdStr" column="organ_id_str_"/>
+        <result property="deptIds" column="dept_ids_"/>
+        <result property="postIds" column="post_ids_"/>
+        <result property="postDeptIds" column="post_dept_ids_"/>
         <collection property="roleNames" ofType="string" javaType="list">
             <result column="role_name_"/>
         </collection>
@@ -200,7 +214,7 @@
     <select id="queryEmployByOrganId" resultMap="EmployeeDto">
         SELECT ue.*,ue.organ_id_ organ_id_str_,sr.role_name_,sr.id_ role_id_
         FROM (SELECT e.user_id_,su.real_name_,su.gender_,su.phone_,su.user_type_,e.job_nature_,su.lock_flag_,
-        e.entry_date_,e.demission_date_,e.organ_id_list_ organ_id_,e.create_time_,e.contact_address_,e.postal_code_
+        e.entry_date_,e.demission_date_,e.organ_id_list_ organ_id_,e.create_time_,e.contact_address_,e.postal_code_,e.dept_ids_,e.post_ids_,e.post_dept_ids_
         FROM employee e
         LEFT JOIN sys_user su ON e.user_id_ = su.id_
         <if test="roleId != null">
@@ -375,4 +389,11 @@
         SELECT DISTINCT id_ FROM vip_group
         WHERE educational_teacher_id_ = #{levelUserId} AND group_status_ IN (2,6)
     </select>
+
+    <select id="getUsers" resultMap="SysUser">
+        select * from sys_user where id_ IN
+        <foreach collection="userIds" open="(" close=")" separator="," item="userId">
+            #{userId}
+        </foreach>
+    </select>
 </mapper>

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

@@ -0,0 +1,82 @@
+<?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="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 * FROM employee_visit WHERE employee_info_id_ = #{employeeInfoId}
+	</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>

+ 52 - 0
mec-client-api/src/main/java/com/ym/mec/oa/OaFeignService.java

@@ -0,0 +1,52 @@
+package com.ym.mec.oa;
+
+import com.ym.mec.common.config.FeignConfiguration;
+import com.ym.mec.common.entity.*;
+import com.ym.mec.oa.entity.OAUser;
+import com.ym.mec.oa.fallback.OaFeignServiceFallback;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient(name = "oa-server", url = "http://localhost:8002/api/v1", configuration = FeignConfiguration.class, fallback = OaFeignServiceFallback.class)
+public interface OaFeignService {
+
+    /**
+     * 用户注册
+     *
+     * @param oaUser
+     * @return
+     */
+    @PostMapping(value = "/register", consumes = MediaType.APPLICATION_JSON_VALUE)
+    Object register(@RequestBody OAUser oaUser);
+
+    /**
+     * 用户信息修改
+     *
+     * @param oaUser
+     * @return
+     */
+    @PostMapping(value = "/updateUser", consumes = MediaType.APPLICATION_JSON_VALUE)
+    Object updateUser(@RequestBody OAUser oaUser);
+
+    /**
+     * 软删除
+     *
+     * @param oaUser
+     * @return
+     */
+    @PostMapping(value = "/softDelMecUser", consumes = MediaType.APPLICATION_JSON_VALUE)
+    Object delUser(@RequestBody OAUser oaUser);
+
+
+    /**
+     * 恢复软删除的用户
+     *
+     * @param oaUser
+     * @return
+     */
+    @PostMapping(value = "/reInsertMecUser", consumes = MediaType.APPLICATION_JSON_VALUE)
+    Object reInsertUser(@RequestBody OAUser oaUser);
+
+}

+ 95 - 0
mec-client-api/src/main/java/com/ym/mec/oa/entity/OAUser.java

@@ -0,0 +1,95 @@
+package com.ym.mec.oa.entity;
+
+import java.util.List;
+
+public class OAUser {
+    private Integer mecUserId;
+
+    private String nickName;
+
+    private String userName;
+
+    private String phone;
+
+    private String avatar;
+
+    private String sex;
+
+    private List<Integer> deptIds;
+
+    private List<Integer> postIds;
+
+    private List<PostDept> postDeptIds;
+
+    public List<PostDept> getPostDeptIds() {
+        return postDeptIds;
+    }
+
+    public void setPostDeptIds(List<PostDept> postDeptIds) {
+        this.postDeptIds = postDeptIds;
+    }
+
+    public Integer getMecUserId() {
+        return mecUserId;
+    }
+
+    public void setMecUserId(Integer mecUserId) {
+        this.mecUserId = mecUserId;
+    }
+
+    public String getNickName() {
+        return nickName;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public List<Integer> getDeptIds() {
+        return deptIds;
+    }
+
+    public void setDeptIds(List<Integer> deptIds) {
+        this.deptIds = deptIds;
+    }
+
+    public List<Integer> getPostIds() {
+        return postIds;
+    }
+
+    public void setPostIds(List<Integer> postIds) {
+        this.postIds = postIds;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+}

+ 25 - 0
mec-client-api/src/main/java/com/ym/mec/oa/entity/PostDept.java

@@ -0,0 +1,25 @@
+package com.ym.mec.oa.entity;
+
+import java.util.List;
+
+public class PostDept {
+    private Integer postId;
+
+    private List<Integer> deptIds;
+
+    public Integer getPostId() {
+        return postId;
+    }
+
+    public void setPostId(Integer postId) {
+        this.postId = postId;
+    }
+
+    public List<Integer> getDeptIds() {
+        return deptIds;
+    }
+
+    public void setDeptIds(List<Integer> deptIds) {
+        this.deptIds = deptIds;
+    }
+}

+ 29 - 0
mec-client-api/src/main/java/com/ym/mec/oa/fallback/OaFeignServiceFallback.java

@@ -0,0 +1,29 @@
+package com.ym.mec.oa.fallback;
+
+import com.ym.mec.oa.OaFeignService;
+import com.ym.mec.oa.entity.OAUser;
+import org.springframework.stereotype.Component;
+
+@Component
+public class OaFeignServiceFallback implements OaFeignService {
+    @Override
+    public Object register(OAUser oaUser) {
+        return null;
+    }
+
+    @Override
+    public Object updateUser(OAUser oaUser) {
+        return null;
+    }
+
+    @Override
+    public Object delUser(OAUser oaUser) {
+        return null;
+    }
+
+    @Override
+    public Object reInsertUser(OAUser oaUser) {
+        return null;
+    }
+
+}

+ 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;
+	}
 }

+ 3 - 2
mec-student/src/main/java/com/ym/mec/student/config/WebSocketConfig.java

@@ -25,8 +25,9 @@ public class WebSocketConfig implements WebSocketConfigurer {
 
     @Override
     public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
-        webSocketHandlerRegistry.addHandler(webSocketHandler, "/ws")
-                .addInterceptors(webSocketHandshakeInterceptor);
+        webSocketHandlerRegistry.addHandler(webSocketHandler, "/audioEvaluate")
+                .addInterceptors(webSocketHandshakeInterceptor)
+                .setAllowedOrigins("*");
     }
 
     @Bean

+ 3 - 2
mec-teacher/src/main/java/com/ym/mec/teacher/config/WebSocketConfig.java

@@ -25,8 +25,9 @@ public class WebSocketConfig implements WebSocketConfigurer {
 
     @Override
     public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
-        webSocketHandlerRegistry.addHandler(webSocketHandler, "/ws")
-                .addInterceptors(webSocketHandshakeInterceptor);
+        webSocketHandlerRegistry.addHandler(webSocketHandler, "/audioEvaluate", "/ws")
+                .addInterceptors(webSocketHandshakeInterceptor)
+                .setAllowedOrigins("*");
     }
 
     @Bean

+ 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();
     }
 

+ 72 - 53
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/ESealPlugin.java

@@ -2,63 +2,82 @@ package com.ym.mec.thirdparty.eseal;
 
 public interface ESealPlugin {
 
-	/**
-	 * 创建用户账户(个人)
-	 * @param realName 姓名
-	 * @param idcard 身份证号码
-	 * @param mobile 手机号码
-	 * @return 账户唯一标识
-	 */
-	public String createUserAccount(String realName, String idcard, String mobile);
+    /**
+     * 创建用户账户(个人)
+     *
+     * @param realName 姓名
+     * @param idcard   身份证号码
+     * @param mobile   手机号码
+     * @return 账户唯一标识
+     */
+    public String createUserAccount(String realName, String idcard, String mobile);
 
-	/**
-	 * 创建用户账户(企业)
-	 * @param orgName  机构名称
-	 * @param organCode 统一社会信用代码
-	 * @return 账户唯一标识
-	 */
-	public String createOrganAccount(String orgName, String organCode);
+    /**
+     * 创建用户账户(企业)
+     *
+     * @param orgName   机构名称
+     * @param organCode 统一社会信用代码
+     * @return 账户唯一标识
+     */
+    public String createOrganAccount(String orgName, String organCode);
 
-	/**
-	 * 创建个人印章
-	 * @param accountId 账户唯一标识
-	 * @return 电子印章数据
-	 */
-	public String createUserSeal(String accountId);
+    /**
+     * 创建个人印章
+     *
+     * @param accountId 账户唯一标识
+     * @return 电子印章数据
+     */
+    public String createUserSeal(String accountId);
 
-	/**
-	 * 创建企业印章
-	 * @param accountId 账户唯一标识
-	 * @param hText 生成印章中的横向文内容
-	 * @param qText 生成印章中的下弦文内容
-	 * @return 电子印章数据
-	 */
-	public String createOrganSeal(String accountId, String hText, String qText);
+    /**
+     * 创建企业印章
+     *
+     * @param accountId 账户唯一标识
+     * @param hText     生成印章中的横向文内容
+     * @param qText     生成印章中的下弦文内容
+     * @return 电子印章数据
+     */
+    public String createOrganSeal(String accountId, String hText, String qText);
 
-	/**
-	 * 平台自身PDF摘要签署(印章标识)
-	 * @param srcPdfPath 源文件
-	 * @param destPdfPath 签名后的目标文件
-	 * @return
-	 */
-	public boolean platformSign(String srcPdfPath, String destPdfPath);
+    /**
+     * 平台自身PDF摘要签署(印章标识)
+     *
+     * @param srcPdfPath  源文件
+     * @param destPdfPath 签名后的目标文件
+     * @return
+     */
+    public boolean platformSign(String srcPdfPath, String destPdfPath);
 
-	/**
-	 * 企业PDF摘要签署(印章图片)
-	 * @param sealData 电子印章数据
-	 * @param srcPdfPath 源文件
-	 * @param destPdfPath 签名后的目标文件
-	 * @return
-	 */
-	public boolean organSign(String sealData, String srcPdfPath, String destPdfPath);
+    /**
+     * 企业PDF摘要签署(印章图片)
+     *
+     * @param sealData    电子印章数据
+     * @param srcPdfPath  源文件
+     * @param destPdfPath 签名后的目标文件
+     * @return
+     */
+    public boolean organSign(String sealData, String srcPdfPath, String destPdfPath);
 
-	/**
-	 * 用户签名
-	 * @param accountId 账户唯一标识
-	 * @param sealData 电子印章数据
-	 * @param srcPdfPath 平台签名后的源文件
-	 * @param destPdfPath 平台、用户都签名后的文件地址
-	 * @return
-	 */
-	public boolean userSign(String accountId, String sealData, String srcPdfPath, String destPdfPath);
+    /**
+     * 用户签名
+     *
+     * @param accountId   账户唯一标识
+     * @param sealData    电子印章数据
+     * @param srcPdfPath  平台签名后的源文件
+     * @param destPdfPath 平台、用户都签名后的文件地址
+     * @return
+     */
+    public boolean userSign(String accountId, String sealData, String srcPdfPath, String destPdfPath);
+
+    /**
+     * 用户签名
+     *
+     * @param accountId   账户唯一标识
+     * @param sealData    电子印章数据
+     * @param keyWorld    印章关键字
+     * @param srcPdfPath  平台签名后的源文件
+     * @param destPdfPath 平台、用户都签名后的文件地址
+     * @return
+     */
+     boolean userSign(String accountId, String sealData, String keyWorld, String srcPdfPath, String destPdfPath);
 }

+ 238 - 198
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/provider/TsignPlugin.java

@@ -35,226 +35,266 @@ import com.ym.mec.thirdparty.exception.ThirdpartyException;
 @Service
 public class TsignPlugin implements ESealPlugin, InitializingBean, DisposableBean {
 
-	@Value("${eseal.tsign.projectid:4438776254}")
-	public String projectId; // = "1111563517";
+    @Value("${eseal.tsign.projectid:4438776254}")
+    public String projectId; // = "1111563517";
 
-	@Value("${eseal.tsign.projectSecret:a94cf63d6361084d232f345d71321691}")
-	public String projectSecret; // = "95439b0863c241c63a861b87d1e647b7";
+    @Value("${eseal.tsign.projectSecret:a94cf63d6361084d232f345d71321691}")
+    public String projectSecret; // = "95439b0863c241c63a861b87d1e647b7";
 
-	@Value("${eseal.tsign.apisUrl:http://smlitsm.tsign.cn:8080/tgmonitor/rest/app!getAPIInfo2}")
-	public String apisUrl; // = "http://smlitsm.tsign.cn:8080/tgmonitor/rest/app!getAPIInfo2";
+    @Value("${eseal.tsign.apisUrl:http://smlitsm.tsign.cn:8080/tgmonitor/rest/app!getAPIInfo2}")
+    public String apisUrl; // = "http://smlitsm.tsign.cn:8080/tgmonitor/rest/app!getAPIInfo2";
 
-	private ServiceClient serviceClient;
+    private ServiceClient serviceClient;
 
-	public static String getName() {
-		return "Tsign";
-	}
+    public static String getName() {
+        return "Tsign";
+    }
 
-	@Override
-	public void afterPropertiesSet(){
-		ProjectConfig projectconfig = new ProjectConfig();
-		projectconfig.setProjectId(projectId);
-		projectconfig.setProjectSecret(projectSecret);
-		projectconfig.setItsmApiUrl(apisUrl);
-		Result result = ServiceClientManager.registClient(projectconfig, null, null);
-		if (result.getErrCode() != 0) {
-			throw new ThirdpartyException("e签宝客户端注册失败:{}", result.getMsg());
-		}
+    @Override
+    public void afterPropertiesSet() {
+        ProjectConfig projectconfig = new ProjectConfig();
+        projectconfig.setProjectId(projectId);
+        projectconfig.setProjectSecret(projectSecret);
+        projectconfig.setItsmApiUrl(apisUrl);
+        Result result = ServiceClientManager.registClient(projectconfig, null, null);
+        if (result.getErrCode() != 0) {
+            throw new ThirdpartyException("e签宝客户端注册失败:{}", result.getMsg());
+        }
 
-		serviceClient = ServiceClientManager.get(projectId);
-		if (serviceClient == null) {
-			throw new ThirdpartyException("获取e签宝客户端失败");
-		}
-	}
+        serviceClient = ServiceClientManager.get(projectId);
+        if (serviceClient == null) {
+            throw new ThirdpartyException("获取e签宝客户端失败");
+        }
+    }
 
-	@Override
-	public void destroy() throws Exception {
-		ServiceClientManager.shutdown(projectId);
-	}
+    @Override
+    public void destroy() throws Exception {
+        ServiceClientManager.shutdown(projectId);
+    }
 
-	/**
-	 * 创建用户账户(个人)
-	 * @param realName 姓名
-	 * @param idcard 身份证号码
-	 * @param mobile 手机号码
-	 * @return e签宝账户唯一标识
-	 */
-	public String createUserAccount(String realName, String idcard, String mobile) {
-		PersonBean personbean = new PersonBean();
-		personbean.setName(realName);
-		personbean.setIdNo(idcard);
-		personbean.setMobile(mobile);
-		personbean.setPersonArea(LegalAreaType.MAINLAND);
-		// personbean.setPersonArea(4);
-		AccountService service = serviceClient.accountService();
-		AddAccountResult result = service.addAccount(personbean);
-		if (result.getErrCode() == 0) {
-			return result.getAccountId();
-		} else if (result.getErrCode() == 1500012) {
-			return queryAccountIdByIdNo(idcard);
-		}
-		throw new ThirdpartyException(result.getMsg());
-	}
+    /**
+     * 创建用户账户(个人)
+     *
+     * @param realName 姓名
+     * @param idcard   身份证号码
+     * @param mobile   手机号码
+     * @return e签宝账户唯一标识
+     */
+    public String createUserAccount(String realName, String idcard, String mobile) {
+        PersonBean personbean = new PersonBean();
+        personbean.setName(realName);
+        personbean.setIdNo(idcard);
+        personbean.setMobile(mobile);
+        personbean.setPersonArea(LegalAreaType.MAINLAND);
+        // personbean.setPersonArea(4);
+        AccountService service = serviceClient.accountService();
+        AddAccountResult result = service.addAccount(personbean);
+        if (result.getErrCode() == 0) {
+            return result.getAccountId();
+        } else if (result.getErrCode() == 1500012) {
+            return queryAccountIdByIdNo(idcard);
+        }
+        throw new ThirdpartyException(result.getMsg());
+    }
 
-	/**
-	 * 创建用户账户(企业)
-	 * @param orgName  机构名称
-	 * @param organCode 统一社会信用代码
-	 * @return e签宝账户唯一标识
-	 */
-	public String createOrganAccount(String orgName, String organCode) {
-		OrganizeBean organizeBean = new OrganizeBean();
-		organizeBean.setName(orgName);
-		organizeBean.setOrganCode(organCode);
-		organizeBean.setRegType(OrganRegType.MERGE);
-		organizeBean.setUserType(0);
+    /**
+     * 创建用户账户(企业)
+     *
+     * @param orgName   机构名称
+     * @param organCode 统一社会信用代码
+     * @return e签宝账户唯一标识
+     */
+    public String createOrganAccount(String orgName, String organCode) {
+        OrganizeBean organizeBean = new OrganizeBean();
+        organizeBean.setName(orgName);
+        organizeBean.setOrganCode(organCode);
+        organizeBean.setRegType(OrganRegType.MERGE);
+        organizeBean.setUserType(0);
 
-		AccountService service = serviceClient.accountService();
-		AddAccountResult result = service.addAccount(organizeBean);
-		if (result.getErrCode() == 0) {
-			return result.getAccountId();
-		}
-		throw new ThirdpartyException("创建企业账户接口调用失败code=" + result.getErrCode() + "msg=" + result.getMsg());
-	}
+        AccountService service = serviceClient.accountService();
+        AddAccountResult result = service.addAccount(organizeBean);
+        if (result.getErrCode() == 0) {
+            return result.getAccountId();
+        }
+        throw new ThirdpartyException("创建企业账户接口调用失败code=" + result.getErrCode() + "msg=" + result.getMsg());
+    }
 
-	/**
-	 * 创建印章
-	 * @param accountId e签宝账户唯一标识
-	 * @return 电子印章数据
-	 */
-	public String createUserSeal(String accountId) {
-		// 生成模板印章的颜色
-		SealColor color = SealColor.RED;
-		SealService service = serviceClient.sealService();
-		AddSealResult result = service.addTemplateSeal(accountId, PersonTemplateType.RECTANGLE, color);
-		if (0 == result.getErrCode()) {
-			return result.getSealData();
-		}
-		throw new ThirdpartyException("个人模板印章接口调用失败code=" + result.getErrCode() + "msg=" + result.getMsg());
-	}
+    /**
+     * 创建印章
+     *
+     * @param accountId e签宝账户唯一标识
+     * @return 电子印章数据
+     */
+    public String createUserSeal(String accountId) {
+        // 生成模板印章的颜色
+        SealColor color = SealColor.RED;
+        SealService service = serviceClient.sealService();
+        AddSealResult result = service.addTemplateSeal(accountId, PersonTemplateType.RECTANGLE, color);
+        if (0 == result.getErrCode()) {
+            return result.getSealData();
+        }
+        throw new ThirdpartyException("个人模板印章接口调用失败code=" + result.getErrCode() + "msg=" + result.getMsg());
+    }
 
-	@Override
-	public String createOrganSeal(String accountId, String hText, String qText) {
-		// 生成模板印章的颜色
-		SealColor color = SealColor.RED;
-		SealService service = serviceClient.sealService();
-		AddSealResult result = service.addTemplateSeal(accountId, OrganizeTemplateType.STAR, color, hText, qText);
-		if (0 == result.getErrCode()) {
-			return result.getSealData();
-		}
-		throw new ThirdpartyException("企业模板印章接口调用失败code=" + result.getErrCode() + "msg=" + result.getMsg());
-	}
+    @Override
+    public String createOrganSeal(String accountId, String hText, String qText) {
+        // 生成模板印章的颜色
+        SealColor color = SealColor.RED;
+        SealService service = serviceClient.sealService();
+        AddSealResult result = service.addTemplateSeal(accountId, OrganizeTemplateType.STAR, color, hText, qText);
+        if (0 == result.getErrCode()) {
+            return result.getSealData();
+        }
+        throw new ThirdpartyException("企业模板印章接口调用失败code=" + result.getErrCode() + "msg=" + result.getMsg());
+    }
 
-	/**
-	 * 平台自身PDF摘要签署(印章标识)
-	 * @param srcPdfPath 源文件
-	 * @param destPdfPath 签名后的目标文件
-	 * @return
-	 */
-	public boolean platformSign(String srcPdfPath, String destPdfPath) {
-		PosBean posBean = new PosBean();
-		// 签章类型,Single-单页签章、Multi-多页签章、Edges-骑缝章、Key-关键字签章
-		SignType signType = SignType.Key;
-		// 接口调用方(平台方)的印章,请在www.tsign.cn官网中设置默认印章其sealId值为0
-		int sealId = 0;
-		// 设置接口调用方(平台方)签章位置信息
-		posBean.setPosPage("1");// 签署页码,若为多页签章,支持页码格式“1-3,5,8“,若为坐标定位时,不可空
-		posBean.setKey("甲方签章");
-		// 签署位置X坐标,默认值为0,以pdf页面的左下角作为原点,控制距离页面左端的横向移动距离,单位为px
-		posBean.setPosX(100);
-		// 签署位置Y坐标,默认值为0,以pdf页面的左下角作为原点,控制距离页面底端的纵向移动距离,单位为px
-		posBean.setPosY(0);
-		// 印章图片在PDF文件中的等比缩放大小,公章标准大小为4.2厘米即159px
-		posBean.setWidth(100);
-		SignPDFFileBean PDFbean = new SignPDFFileBean();
-		PDFbean.setSrcPdfFile(srcPdfPath);
-		PDFbean.setDstPdfFile(destPdfPath);
+    /**
+     * 平台自身PDF摘要签署(印章标识)
+     *
+     * @param srcPdfPath  源文件
+     * @param destPdfPath 签名后的目标文件
+     * @return
+     */
+    public boolean platformSign(String srcPdfPath, String destPdfPath) {
+        PosBean posBean = new PosBean();
+        // 签章类型,Single-单页签章、Multi-多页签章、Edges-骑缝章、Key-关键字签章
+        SignType signType = SignType.Key;
+        // 接口调用方(平台方)的印章,请在www.tsign.cn官网中设置默认印章其sealId值为0
+        int sealId = 0;
+        // 设置接口调用方(平台方)签章位置信息
+        posBean.setPosPage("1");// 签署页码,若为多页签章,支持页码格式“1-3,5,8“,若为坐标定位时,不可空
+        posBean.setKey("甲方签章");
+        // 签署位置X坐标,默认值为0,以pdf页面的左下角作为原点,控制距离页面左端的横向移动距离,单位为px
+        posBean.setPosX(100);
+        // 签署位置Y坐标,默认值为0,以pdf页面的左下角作为原点,控制距离页面底端的纵向移动距离,单位为px
+        posBean.setPosY(0);
+        // 印章图片在PDF文件中的等比缩放大小,公章标准大小为4.2厘米即159px
+        posBean.setWidth(100);
+        SignPDFFileBean PDFbean = new SignPDFFileBean();
+        PDFbean.setSrcPdfFile(srcPdfPath);
+        PDFbean.setDstPdfFile(destPdfPath);
 
-		SelfSignService service = serviceClient.selfSignService();
-		FileDigestSignResult result = service.localSignPdf(PDFbean, posBean, sealId, signType);
-		if (0 != result.getErrCode()) {
-			throw new ThirdpartyException("平台自身PDF摘要签署接口调用失败!Code=" + result.getErrCode() + "MSG=" + result.getMsg());
-		}
-		return true;
-	}
+        SelfSignService service = serviceClient.selfSignService();
+        FileDigestSignResult result = service.localSignPdf(PDFbean, posBean, sealId, signType);
+        if (0 != result.getErrCode()) {
+            throw new ThirdpartyException("平台自身PDF摘要签署接口调用失败!Code=" + result.getErrCode() + "MSG=" + result.getMsg());
+        }
+        return true;
+    }
 
-	/**
-	 * 企业PDF摘要签署(印章图片)
-	 * @param sealData 电子印章数据
-	 * @param srcPdfPath 源文件
-	 * @param destPdfPath 签名后的目标文件
-	 * @return
-	 */
-	public boolean organSign(String sealData, String srcPdfPath, String destPdfPath) {
-		PosBean posBean = new PosBean();
-		// 签章类型,Single-单页签章、Multi-多页签章、Edges-骑缝章、Key-关键字签章
-		SignType signType = SignType.Key;
-		// 设置接口调用方(平台方)签章位置信息
-		posBean.setPosPage("1");// 签署页码,若为多页签章,支持页码格式“1-3,5,8“,若为坐标定位时,不可空
-		posBean.setKey("甲方签章");
-		// 签署位置X坐标,默认值为0,以pdf页面的左下角作为原点,控制距离页面左端的横向移动距离,单位为px
-		posBean.setPosX(100);
-		// 签署位置Y坐标,默认值为0,以pdf页面的左下角作为原点,控制距离页面底端的纵向移动距离,单位为px
-		posBean.setPosY(0);
-		// 印章图片在PDF文件中的等比缩放大小,公章标准大小为4.2厘米即159px
-		posBean.setWidth(100);
-		SignPDFFileBean PDFbean = new SignPDFFileBean();
-		PDFbean.setSrcPdfFile(srcPdfPath);
-		PDFbean.setDstPdfFile(destPdfPath);
+    /**
+     * 企业PDF摘要签署(印章图片)
+     *
+     * @param sealData    电子印章数据
+     * @param srcPdfPath  源文件
+     * @param destPdfPath 签名后的目标文件
+     * @return
+     */
+    public boolean organSign(String sealData, String srcPdfPath, String destPdfPath) {
+        PosBean posBean = new PosBean();
+        // 签章类型,Single-单页签章、Multi-多页签章、Edges-骑缝章、Key-关键字签章
+        SignType signType = SignType.Key;
+        // 设置接口调用方(平台方)签章位置信息
+        posBean.setPosPage("1");// 签署页码,若为多页签章,支持页码格式“1-3,5,8“,若为坐标定位时,不可空
+        posBean.setKey("甲方签章");
+        // 签署位置X坐标,默认值为0,以pdf页面的左下角作为原点,控制距离页面左端的横向移动距离,单位为px
+        posBean.setPosX(100);
+        // 签署位置Y坐标,默认值为0,以pdf页面的左下角作为原点,控制距离页面底端的纵向移动距离,单位为px
+        posBean.setPosY(0);
+        // 印章图片在PDF文件中的等比缩放大小,公章标准大小为4.2厘米即159px
+        posBean.setWidth(100);
+        SignPDFFileBean PDFbean = new SignPDFFileBean();
+        PDFbean.setSrcPdfFile(srcPdfPath);
+        PDFbean.setDstPdfFile(destPdfPath);
 
-		SelfSignService service = serviceClient.selfSignService();
-		FileDigestSignResult result = service.localSignPdf(PDFbean, posBean, sealData, signType);
-		if (0 != result.getErrCode()) {
-			throw new ThirdpartyException("平台自身PDF摘要签署接口调用失败!Code=" + result.getErrCode() + "MSG=" + result.getMsg());
-		}
-		return true;
-	}
+        SelfSignService service = serviceClient.selfSignService();
+        FileDigestSignResult result = service.localSignPdf(PDFbean, posBean, sealData, signType);
+        if (0 != result.getErrCode()) {
+            throw new ThirdpartyException("平台自身PDF摘要签署接口调用失败!Code=" + result.getErrCode() + "MSG=" + result.getMsg());
+        }
+        return true;
+    }
 
-	/**
-	 * 用户签名
-	 * @param accountId e签宝账户唯一标识
-	 * @param sealData 电子印章数据
-	 * @param srcPdfPath 平台签名后的源文件
-	 * @param destPdfPath 平台、用户都签名后的文件地址
-	 * @return
-	 */
-	public boolean userSign(String accountId, String sealData, String srcPdfPath, String destPdfPath) {
+    /**
+     * 用户签名
+     *
+     * @param accountId   e签宝账户唯一标识
+     * @param sealData    电子印章数据
+     * @param srcPdfPath  平台签名后的源文件
+     * @param destPdfPath 平台、用户都签名后的文件地址
+     * @return
+     */
+    public boolean userSign(String accountId, String sealData, String srcPdfPath, String destPdfPath) {
 
-		SignPDFFileBean signPDFStreamBean = new SignPDFFileBean();
-		// C:test_signed.pdf为平台自身签署后路径
-		signPDFStreamBean.setSrcPdfFile(srcPdfPath);
-		signPDFStreamBean.setDstPdfFile(destPdfPath);
-		PosBean posBean = new PosBean();
-		posBean.setPosPage("1");
-		posBean.setPosType(1);
-		posBean.setWidth(80);
-		posBean.setKey("乙方签章");
-		posBean.setPosX(100);
-		posBean.setPosY(0);
+        SignPDFFileBean signPDFStreamBean = new SignPDFFileBean();
+        // C:test_signed.pdf为平台自身签署后路径
+        signPDFStreamBean.setSrcPdfFile(srcPdfPath);
+        signPDFStreamBean.setDstPdfFile(destPdfPath);
+        PosBean posBean = new PosBean();
+        posBean.setPosPage("1");
+        posBean.setPosType(1);
+        posBean.setWidth(80);
+        posBean.setKey("乙方签章");
+        posBean.setPosX(100);
+        posBean.setPosY(0);
 
-		// 签章类型,Single-单页签章、Multi-多页签章、Edges-骑缝章、Key-关键字签章
-		SignType signtype = SignType.Key;
-		UserSignService service = serviceClient.userSignService();
-		FileDigestSignResult result = service.localSignPDF(accountId, sealData, signPDFStreamBean, posBean, signtype);
-		if (result.getErrCode() == 0) {
-			return true;
-		}
-		throw new ThirdpartyException("平台用户PDF摘要签署接口调用失败" + result.getErrCode() + "msg=" + result.getMsg());
-	}
+        // 签章类型,Single-单页签章、Multi-多页签章、Edges-骑缝章、Key-关键字签章
+        SignType signtype = SignType.Key;
+        UserSignService service = serviceClient.userSignService();
+        FileDigestSignResult result = service.localSignPDF(accountId, sealData, signPDFStreamBean, posBean, signtype);
+        if (result.getErrCode() == 0) {
+            return true;
+        }
+        throw new ThirdpartyException("平台用户PDF摘要签署接口调用失败" + result.getErrCode() + "msg=" + result.getMsg());
+    }
 
-	private String queryAccountIdByIdNo(String idcardNo) {
+    private String queryAccountIdByIdNo(String idcardNo) {
 
-		AccountService service = serviceClient.accountService();
+        AccountService service = serviceClient.accountService();
 
-		GetAccountProfileResult result = service.getAccountInfoByIdNo(idcardNo, LicenseQueryType.MAINLAND);
+        GetAccountProfileResult result = service.getAccountInfoByIdNo(idcardNo, LicenseQueryType.MAINLAND);
 
-		if (result != null) {
-			AccountProfile accountProfile = result.getAccountInfo();
-			if (accountProfile != null) {
-				return accountProfile.getAccountUid();
-			}
-		}
+        if (result != null) {
+            AccountProfile accountProfile = result.getAccountInfo();
+            if (accountProfile != null) {
+                return accountProfile.getAccountUid();
+            }
+        }
 
-		return null;
-	}
+        return null;
+    }
+
+    /**
+     * 用户签名
+     *
+     * @param accountId   e签宝账户唯一标识
+     * @param sealData    电子印章数据
+     * @param keyWorld    印章关键字
+     * @param srcPdfPath  平台签名后的源文件
+     * @param destPdfPath 平台、用户都签名后的文件地址
+     * @return
+     */
+    public boolean userSign(String accountId, String sealData, String keyWorld, String srcPdfPath, String destPdfPath) {
+
+        SignPDFFileBean signPDFStreamBean = new SignPDFFileBean();
+        // C:test_signed.pdf为平台自身签署后路径
+        signPDFStreamBean.setSrcPdfFile(srcPdfPath);
+        signPDFStreamBean.setDstPdfFile(destPdfPath);
+        PosBean posBean = new PosBean();
+        posBean.setPosPage("1");
+        posBean.setPosType(1);
+        posBean.setWidth(80);
+        posBean.setKey(keyWorld);
+        posBean.setPosX(100);
+        posBean.setPosY(0);
+
+        // 签章类型,Single-单页签章、Multi-多页签章、Edges-骑缝章、Key-关键字签章
+        SignType signtype = SignType.Key;
+        UserSignService service = serviceClient.userSignService();
+        FileDigestSignResult result = service.localSignPDF(accountId, sealData, signPDFStreamBean, posBean, signtype);
+        if (result.getErrCode() == 0) {
+            return true;
+        }
+        throw new ThirdpartyException("平台用户PDF摘要签署接口调用失败" + result.getErrCode() + "msg=" + result.getMsg());
+    }
 }

+ 28 - 26
mec-web/src/main/java/com/ym/mec/web/config/ResourceServerConfig.java

@@ -16,31 +16,33 @@ import com.ym.mec.common.security.BaseAuthenticationEntryPoint;
 @EnableGlobalMethodSecurity(prePostEnabled = true)
 public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 
-	@Autowired
-	private BaseAccessDeniedHandler baseAccessDeniedHandler;
-
-	@Autowired
-	private BaseAuthenticationEntryPoint baseAuthenticationEntryPoint;
-
-	@Override
-	public void configure(HttpSecurity http) throws Exception {
-		http.csrf()
-				.disable()
-				.exceptionHandling()
-				.accessDeniedHandler(baseAccessDeniedHandler)
-				.authenticationEntryPoint(baseAuthenticationEntryPoint)
-				.and()
-				.authorizeRequests()
-				.antMatchers("/task/**")
-				.hasIpAddress("0.0.0.0/0")
-				.antMatchers("/v2/api-docs", "/classGroup/highClassGroups", "/code/*", "/api/*", "/appVersionInfo/queryByPlatform", "/eduDegree/*",
-						"/uploadFile", "/eduContracts/queryProduceContract","/activity/doubleEleven2020Statis","/replacementInstrument/queryPage",
-						"/replacementInstrumentActivity/queryReplacementsStat","/eduStudentRegistration/queryPreApplyList","/eduSubject/findSubSubjects","/eduFinancialExpenditure/batchAdd","/eduSendNotice/*").permitAll().anyRequest().authenticated().and().httpBasic();
-	}
-
-	@Override
-	public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
-		resources.authenticationEntryPoint(baseAuthenticationEntryPoint).accessDeniedHandler(baseAccessDeniedHandler);
-	}
+    @Autowired
+    private BaseAccessDeniedHandler baseAccessDeniedHandler;
+
+    @Autowired
+    private BaseAuthenticationEntryPoint baseAuthenticationEntryPoint;
+
+    @Override
+    public void configure(HttpSecurity http) throws Exception {
+        http.csrf()
+                .disable()
+                .exceptionHandling()
+                .accessDeniedHandler(baseAccessDeniedHandler)
+                .authenticationEntryPoint(baseAuthenticationEntryPoint)
+                .and()
+                .authorizeRequests()
+                .antMatchers("/task/**")
+                .hasIpAddress("0.0.0.0/0")
+                .antMatchers("/v2/api-docs", "/classGroup/highClassGroups", "/code/*", "/api/*", "/appVersionInfo/queryByPlatform", "/eduDegree/*",
+                        "/uploadFile", "/eduContracts/queryProduceContract", "/activity/doubleEleven2020Statis", "/replacementInstrument/queryPage",
+                        "/replacementInstrumentActivity/queryReplacementsStat", "/eduStudentRegistration/queryPreApplyList",
+                        "/eduSubject/findSubSubjects", "/eduFinancialExpenditure/batchAdd", "/eduSendNotice/*",
+                        "/oaContracts/*").permitAll().anyRequest().authenticated().and().httpBasic();
+    }
+
+    @Override
+    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
+        resources.authenticationEntryPoint(baseAuthenticationEntryPoint).accessDeniedHandler(baseAccessDeniedHandler);
+    }
 
 }

+ 41 - 0
mec-web/src/main/java/com/ym/mec/web/config/WebSocketConfig.java

@@ -0,0 +1,41 @@
+package com.ym.mec.web.config;
+
+import com.ym.mec.biz.handler.WebSocketHandler;
+import com.ym.mec.web.interceptor.WebSocketHandshakeInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
+import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
+import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/8 0008
+ */
+@Configuration
+@EnableWebSocket
+public class WebSocketConfig implements WebSocketConfigurer {
+
+    @Autowired
+    private WebSocketHandler webSocketHandler;
+    @Autowired
+    private WebSocketHandshakeInterceptor webSocketHandshakeInterceptor;
+
+    @Override
+    public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
+        webSocketHandlerRegistry.addHandler(webSocketHandler, "/audioEvaluate")
+                .addInterceptors(webSocketHandshakeInterceptor)
+                .setAllowedOrigins("*");
+    }
+
+    @Bean
+    public ServletServerContainerFactoryBean createWebSocketContainer() {
+        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
+        container.setMaxTextMessageBufferSize(8192*4);
+        container.setMaxBinaryMessageBufferSize(8192*4);
+        return container;
+    }
+
+}

+ 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;
+	}
+
 }

+ 3 - 2
mec-web/src/main/java/com/ym/mec/web/controller/EmployeeController.java

@@ -136,10 +136,11 @@ public class EmployeeController extends BaseController {
             sysUser.setRoles(employeeDao.queryUserRole(sysUser.getId()));
             sysUser.setContactAddress(employee.getContactAddress());
             sysUser.setPostalCode(employee.getPostalCode());
-            sysUser.setDeptId(employee.getDeptId());
-            sysUser.setPostId(employee.getPostId());
+            sysUser.setDeptIds(employee.getDeptIds());
+            sysUser.setPostIds(employee.getPostIds());
             sysUser.setBankCard(employee.getBankCard());
             sysUser.setOpenBankAddress(employee.getOpenBankAddress());
+            sysUser.setPostDeptIds(employee.getPostDeptIds());
             return succeed(sysUser);
         }
         return failed("获取用户信息失败");

+ 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();
+    }
+
 }

+ 0 - 1
mec-web/src/main/java/com/ym/mec/web/controller/SysMusicScoreCategoriesController.java

@@ -18,7 +18,6 @@ public class SysMusicScoreCategoriesController extends BaseController {
     @Autowired
     private SysMusicScoreCategoriesService sysMusicScoreCategoriesService;
 
-
     @ApiOperation(value = "分页查询")
     @GetMapping("/queryPage")
     @PreAuthorize("@pcs.hasPermissions('sysMusicScoreCategories/queryPage')")

+ 39 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduFeeTypeController.java

@@ -0,0 +1,39 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.biz.dal.enums.ExpenditureTypeEnum;
+import com.ym.mec.biz.dal.enums.FeeProjectEnum;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@RequestMapping("eduFeeType")
+@Api(tags = "费用类型服务")
+@RestController
+public class EduFeeTypeController extends BaseController {
+
+    @GetMapping("/getExpenditureType")
+    public HttpResponseResult<Map<Integer, String>> getExpenditureType() {
+        Map<Integer, String> typeMap = new HashMap<>();
+        for (ExpenditureTypeEnum val : ExpenditureTypeEnum.values()) {
+            typeMap.put(val.getCode(), val.getDesc());
+        }
+        return succeed(typeMap);
+    }
+
+    @GetMapping("/getFeeProject")
+    public HttpResponseResult<Map<Integer, String>> getFeeProject() {
+        Map<Integer, String> typeMap = new HashMap<>();
+        for (FeeProjectEnum val : FeeProjectEnum.values()) {
+            typeMap.put(val.getCode(), val.getDesc());
+        }
+        return succeed(typeMap);
+    }
+
+}

+ 0 - 15
mec-web/src/main/java/com/ym/mec/web/controller/education/EduFinancialExpenditureController.java

@@ -31,26 +31,11 @@ import java.util.stream.Collectors;
 public class EduFinancialExpenditureController extends BaseController {
     @Autowired
     private FinancialExpenditureService financialExpenditureService;
-    @Autowired
-    private OrganizationDao organizationDao;
-    @Autowired
-    private CooperationOrganDao cooperationOrganDao;
 
     @ApiOperation(value = "批量添加支出记录")
     @PostMapping(value = "/batchAdd")
     public HttpResponseResult<List<FinancialExpenditure>> batchAdd(@RequestBody List<FinancialExpenditure> financialExpenditures) {
-        List<Organization> organs = organizationDao.findAllOrgans();
-        Map<String, Integer> organMap = organs.stream().collect(Collectors.toMap(Organization::getName, Organization::getId));
-        List<CooperationOrgan> cooperationOrgans = cooperationOrganDao.getAllCooperationOrgan();
-        Map<String, Integer> cooperationOrganMap = cooperationOrgans.stream().collect(Collectors.toMap(e -> e.getName() + e.getOrganId(), e -> e.getId()));
         for (FinancialExpenditure financialExpenditure : financialExpenditures) {
-            if (organMap.containsKey(financialExpenditure.getOrganName())) {
-                financialExpenditure.setOrganId(organMap.get(financialExpenditure.getOrganName()));
-            }
-            if (cooperationOrganMap.containsKey(financialExpenditure.getCooperationOrganName() + financialExpenditure.getOrganId())) {
-                Integer cooperationOrganId = cooperationOrganMap.get(financialExpenditure.getCooperationOrganName() + financialExpenditure.getOrganId());
-                financialExpenditure.setCooperationOrganId(cooperationOrganId);
-            }
             for (ExpenditureTypeEnum typeEnum : ExpenditureTypeEnum.values()) {
                 if (typeEnum.getDesc().equals(financialExpenditure.getFeeType())) {
                     financialExpenditure.setType(typeEnum);

+ 56 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduMusicScoreController.java

@@ -0,0 +1,56 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.auth.api.dto.MusicScoreQueryInfo;
+import com.ym.mec.biz.dal.enums.ClientTypeEnum;
+import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
+import com.ym.mec.biz.service.SysMusicScoreAccompanimentService;
+import com.ym.mec.biz.service.SysMusicScoreCategoriesService;
+import com.ym.mec.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang.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;
+
+@RequestMapping("eduMusicScore")
+@Api(tags = "智能陪练")
+@RestController
+public class EduMusicScoreController extends BaseController {
+    @Autowired
+    private SysMusicScoreCategoriesService sysMusicScoreCategoriesService;
+    @Autowired
+    private SysMusicScoreAccompanimentService sysMusicScoreAccompanimentService;
+
+    @ApiOperation(value = "树状列表")
+    @GetMapping("/queryTree")
+    public Object queryTree(MusicScoreQueryInfo queryInfo) {
+        return succeed(sysMusicScoreCategoriesService.queryTree(queryInfo));
+    }
+
+    @ApiOperation(value = "分页查询")
+    @GetMapping("/queryPage")
+    public Object queryPage(SysExamSongQueryInfo queryInfo) {
+        return succeed(sysMusicScoreAccompanimentService.queryAll(queryInfo));
+    }
+
+    @ApiOperation(value = "分页查询")
+    @GetMapping("/queryPageLimit")
+    public Object queryPageLimit(SysExamSongQueryInfo queryInfo) {
+        String type = queryInfo.getType();
+        if(StringUtils.isEmpty(type)){
+            queryInfo.setType("ALL");
+        }
+        if(queryInfo.getClientType() == null){
+            queryInfo.setClientType(ClientTypeEnum.SMART_PRACTICE);
+        }
+        return succeed(sysMusicScoreAccompanimentService.queryScorePage(queryInfo));
+    }
+
+    @ApiOperation(value = "获取伴奏声部列表")
+    @GetMapping("/querySubjectIds")
+    public Object querySubjectIds() {
+        return succeed(sysMusicScoreAccompanimentService.querySubjectIds());
+    }
+}

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

@@ -1,14 +1,18 @@
 package com.ym.mec.web.controller.education;
 
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.service.CooperationOrganService;
 import com.ym.mec.biz.service.OrganizationService;
 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.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 @RequestMapping("eduOrganization")
 @Api(tags = "分部服务")
 @RestController
@@ -26,8 +30,8 @@ public class EduOrganizationController extends BaseController {
     }
 
     @ApiOperation(value = "根据分部id获取合作单位(学校)列表")
-    @GetMapping("/queryByOrganId")
-    public Object queryByOrganId(String organId) {
+    @GetMapping("/getOrganCooperation")
+    public HttpResponseResult<List<CooperationOrgan>> getOrganCooperation(String organId) {
         return succeed(cooperationOrganService.queryByOrganId(organId));
     }
 }

+ 25 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/OaContractsController.java

@@ -0,0 +1,25 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.biz.dal.dto.OAFinancialDto;
+import com.ym.mec.biz.service.ContractService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RequestMapping("oaContracts")
+@Api(tags = "OA签章服务")
+@RestController
+public class OaContractsController extends BaseController {
+
+    @Autowired
+    private ContractService contractService;
+
+    @PostMapping("finance")
+    public HttpResponseResult<String> transferProduceContract(@RequestBody OAFinancialDto financialDto) {
+        String fileUrl = contractService.transferOaFinancial(financialDto);
+        return succeed(fileUrl);
+    }
+
+}

+ 28 - 0
mec-web/src/main/java/com/ym/mec/web/interceptor/WebSocketHandshakeInterceptor.java

@@ -0,0 +1,28 @@
+package com.ym.mec.web.interceptor;
+
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.WebSocketHandler;
+import org.springframework.web.socket.server.HandshakeInterceptor;
+
+import java.util.Map;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/9 0009
+ */
+@Component
+public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {
+
+    @Override
+    public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
+        return true;
+    }
+
+    @Override
+    public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {
+
+    }
+
+}

BIN=BIN
mec-web/src/main/resources/config/fonts/simsun.ttc


BIN=BIN
mec-web/src/main/resources/config/fonts/simsun.ttf