zouxuan 2 年之前
父節點
當前提交
208d87d2d1
共有 46 個文件被更改,包括 805 次插入850 次删除
  1. 16 24
      audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java
  2. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  3. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java
  4. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java
  5. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/YeepayMember.java
  6. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  7. 6 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java
  8. 3 292
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrder.java
  9. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/SuggestionType.java
  10. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/IndexBaseMonthDataService.java
  11. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  12. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  13. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  14. 16 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  15. 11 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java
  16. 6 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  17. 171 136
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/FinancialExpenditureServiceImpl.java
  18. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/HfMemberServiceImpl.java
  19. 233 249
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  20. 16 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  21. 16 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrderPayOpsServiceImpl.java
  22. 6 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PayServiceImpl.java
  23. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  24. 6 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java
  25. 15 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  26. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java
  27. 0 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantOrderRecordServiceImpl.java
  28. 14 18
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  29. 11 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  30. 1 1
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  31. 2 1
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  32. 2 2
      mec-biz/src/main/resources/config/mybatis/StudentPaymentRouteOrderMapper.xml
  33. 4 1
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  34. 66 4
      mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java
  35. 1 1
      mec-im/src/main/java/com/ym/controller/RoomController.java
  36. 27 6
      mec-im/src/main/java/com/ym/controller/UserController.java
  37. 2 0
      mec-im/src/main/java/com/ym/pojo/ReqDeviceControlData.java
  38. 77 9
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  39. 7 3
      mec-student/src/main/java/com/ym/mec/student/controller/CourseController.java
  40. 1 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherManageController.java
  41. 1 1
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/yeepay/YeepayMerchantService.java
  42. 10 0
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/yeepay/entity/MerchantInfo.java
  43. 1 1
      mec-web/src/main/java/com/ym/mec/web/config/ResourceServerConfig.java
  44. 2 2
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  45. 2 7
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  46. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/payment/YeepayController.java

+ 16 - 24
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -669,12 +669,14 @@ public class UserChannelContext {
 		LOGGER.debug("------------ correctedStartTime:{}  correctedEndTime:{}------------", correctedStartTime, correctedEndTime);
 		
 		//根据完整度取部分有效信号
-		int elementSize = chunkAnalysisList.size() * hardLevel.getIntegrityRange() / 100;
+		int elementSize = chunkAnalysisList.size() * (100 - hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration())) / 100;
 		chunkAnalysisList = chunkAnalysisList.subList(0, elementSize);
 		if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
 			return -1;
 		}
 		
+		reduceNoise(chunkAnalysisList, EvaluationCriteriaEnum.FREQUENCY);
+		
 		ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
 		
 		LOGGER.debug("-------startTime:{}  endTime:{}------", firstChunkAnalysis.getStartTime(), chunkAnalysisList.get(chunkAnalysisList.size() - 1)
@@ -714,36 +716,23 @@ public class UserChannelContext {
 		
 		chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(correctedStartTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(correctedEndTime)).collect(Collectors.toList());
 		
-		//根据完整度取部分有效信号,取中间的
-		int elementSize = chunkAnalysisList.size() * hardLevel.getIntegrityRange() / 100;
-		
-		int startIndex = (chunkAnalysisList.size() - elementSize) / 2 - 1;
-		startIndex = startIndex < 1 ? 0 : startIndex;
-		List<ChunkAnalysis> chunkList = chunkAnalysisList.subList(startIndex, elementSize + startIndex);
+		//根据完整度取部分有效信号
+		int elementSize = chunkAnalysisList.size() * (100 - hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration())) / 100;
+		List<ChunkAnalysis> chunkList = chunkAnalysisList.subList(0, elementSize);
 		
 		if(chunkList == null || chunkList.size() == 0){
 			return false;
 		}
 		
+		reduceNoise(chunkList, EvaluationCriteriaEnum.FREQUENCY);
+		
 		if (musicXmlNote.getFrequency() == -1) {// 休止符
 			return chunkList.stream().filter(t -> t.getFrequency() > MIN_FREQUECY).count() <= 1;
 		}
 
 		ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
-		//取出前面忽略的块
-		List<ChunkAnalysis> ignoreHeaderList = chunkAnalysisList.subList(0, startIndex);
-		if(ignoreHeaderList != null && ignoreHeaderList.size() > 0){
-			for(ChunkAnalysis ca : ignoreHeaderList){
-				if(ca.getFrequency() < MIN_FREQUECY){
-					firstChunkAnalysis.setFrequency(-1);
-					break;
-				}
-			}
-		}
-		
-		double firstChunkStartTime = firstChunkAnalysis.getStartTime();
 		
-		Optional<ChunkAnalysis> chunkAnalysisOptional = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getEndTime()) < Double.doubleToLongBits(firstChunkStartTime)).reduce((first, second) -> second);
+		Optional<ChunkAnalysis> chunkAnalysisOptional = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getEndTime()) < Double.doubleToLongBits(firstChunkAnalysis.getStartTime())).reduce((first, second) -> second);
 
 		ChunkAnalysis lastChunkAnalysis = null;
 		if (chunkAnalysisOptional.isPresent()) {
@@ -1054,6 +1043,13 @@ public class UserChannelContext {
 						chunkAnalysis.setAmplitude(0);
 						//chunkAnalysisList.set(i, chunkAnalysis);
 					}
+				}else if(EvaluationCriteriaEnum.FREQUENCY == criteria) {
+					if (chunkAnalysisList.get(i - 1).getFrequency() == -1 && chunkAnalysisList.get(i + 1).getFrequency() == -1
+							&& chunkAnalysis.getFrequency() > 0) {
+						
+						chunkAnalysis.setFrequency(-1);
+						//chunkAnalysisList.set(i, chunkAnalysis);
+					}
 				}
 			}
 		}
@@ -1061,8 +1057,4 @@ public class UserChannelContext {
 	}
 	
 	
-	public static void main(String[] args) {
-		
-	}
-	
 }

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

@@ -2019,7 +2019,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @param courseScheduleId 课程ID
      * @param muteAll 全员静音状态
      */
-    void updateGroupMuteAllStatus(@Param("courseScheduleId") Long courseScheduleId, @Param("muteAll") Boolean muteAll);
+    void updateGroupMuteAllStatus(@Param("courseScheduleId") Long courseScheduleId, @Param("muteAll") Boolean muteAll, @Param("cancelMute") Boolean cancelMute);
 
     void updateTeachingPointByClassGroupId(@Param("classGroupId") Integer classGroupId, @Param("teachingPoint") String teachingPoint);
 

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

@@ -392,7 +392,8 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
                                                                  @Param("organIds") List<Integer> organIds,@Param("tenantId") Integer tenantId);
 
     int countStudentErrorLeave(@Param("organIdList") Set<Integer> organIdList,
-                               @Param("format") String format,
+                               @Param("firstDay") String firstDay,
+                               @Param("lastDay") String lastDay,
                                @Param("classGroupIds") List<Long> classGroupIds,
                                @Param("studentErrorLeaveNum") Integer studentErrorLeaveNum,@Param("tenantId") Integer tenantId);
 

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java

@@ -201,4 +201,6 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrderRouteDto {
 
     @ApiModelProperty(value = "教学点",required = true)
     private String schoolName;
+
+    private Integer cooperationId;
 }

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

@@ -16,6 +16,8 @@ public class YeepayMember extends HfMember {
 	private String licenceUrl; //商户证件照片
 	
 	private String openAccountLicenceUrl; //开户许可证照片
+	
+    private String merchantType;//商家类型(企业-ENTERPRISE,个体户-INDIVIDUAL)
 
 	public String getLegalLicenceFrontUrl() {
 		return legalLicenceFrontUrl;
@@ -48,4 +50,12 @@ public class YeepayMember extends HfMember {
 	public void setOpenAccountLicenceUrl(String openAccountLicenceUrl) {
 		this.openAccountLicenceUrl = openAccountLicenceUrl;
 	}
+
+	public String getMerchantType() {
+		return merchantType;
+	}
+
+	public void setMerchantType(String merchantType) {
+		this.merchantType = merchantType;
+	}
 }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java

@@ -9,6 +9,7 @@ import com.ym.mec.common.enums.BaseEnum;
 
 import io.swagger.annotations.ApiModelProperty;
 
+import lombok.Getter;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
@@ -218,6 +219,10 @@ public class CourseSchedule  extends BaseEntity{
 	@ApiModelProperty("全员静音")
 	private Boolean muteAll;
 
+	@Getter
+	@ApiModelProperty("取消静音")
+	private Boolean cancelMuteFlag;
+
     @ApiModelProperty("教学点")
     private String teachingPoint;
 
@@ -765,6 +770,10 @@ public class CourseSchedule  extends BaseEntity{
 		this.shareMode = shareMode;
 	}
 
+	public void setCancelMuteFlag(Boolean cancelMuteFlag) {
+		this.cancelMuteFlag = cancelMuteFlag;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 6 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java

@@ -129,7 +129,6 @@ public class MusicGroup extends BaseEntity {
 	@ApiModelProperty(value = "家长会日期",required = false)
 	private String parentMeetingTime;
 
-	/** 缴费月份*/
 	@ApiModelProperty(value = "缴费月份(多个用,分开)",required = false)
 	private String paymentMonths;
 
@@ -147,6 +146,12 @@ public class MusicGroup extends BaseEntity {
 
 	@ApiModelProperty(value = "在读人数",required = true)
 	private Integer payNum;
+
+	@ApiModelProperty(value = "在读且有会员的人数",required = true)
+	private Integer memberNum = 0;
+
+	@ApiModelProperty(value = "在读且没有会员的人数",required = true)
+	private Integer notMemberNum = 0;
 	
 	@ApiModelProperty(value = "是否是课堂课",required = true)
 	private boolean isClassroomLessons;

+ 3 - 292
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrder.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import java.math.BigDecimal;
 import java.util.Date;
 
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import com.ym.mec.auth.api.entity.SysUser;
@@ -19,6 +20,7 @@ import org.springframework.data.annotation.Version;
 /**
  * 对应数据库表(student_payment_order):
  */
+@Data
 public class StudentPaymentOrder extends BaseEntity {
 
 	/**  */
@@ -136,296 +138,5 @@ public class StudentPaymentOrder extends BaseEntity {
 	@ApiModelProperty(value = "缴费项目编号",required = true)
 	private Long calenderId;
 
-	public Long getCalenderId() {
-		return calenderId;
-	}
-
-	public void setCalenderId(Long calenderId) {
-		this.calenderId = calenderId;
-	}
-
-	public Integer getActivityBuyNum() {
-		return activityBuyNum;
-	}
-
-	public void setActivityBuyNum(Integer activityBuyNum) {
-		this.activityBuyNum = activityBuyNum;
-	}
-
-	public String getActivityId() {
-		return activityId;
-	}
-
-	public void setActivityId(String activityId) {
-		this.activityId = activityId;
-	}
-
-	public String getCouponCodeId() {
-		return couponCodeId;
-	}
-
-	public void setCouponCodeId(String couponCodeId) {
-		this.couponCodeId = couponCodeId;
-	}
-
-	public BigDecimal getCouponRemitFee() {
-		return couponRemitFee;
-	}
-
-	public void setCouponRemitFee(BigDecimal couponRemitFee) {
-		this.couponRemitFee = couponRemitFee;
-	}
-
-	public String getReceiveStatus() {
-		return receiveStatus;
-	}
-
-	public void setReceiveStatus(String receiveStatus) {
-		this.receiveStatus = receiveStatus;
-	}
-
-	public void setId(Long id){
-		this.id = id;
-	}
-	
-	public Long getId(){
-		return this.id;
-	}
-			
-	public GroupType getGroupType() {
-		return groupType;
-	}
-
-	public void setGroupType(GroupType groupType) {
-		this.groupType = groupType;
-	}
-
-	public void setUserId(Integer userId){
-		this.userId = userId;
-	}
-	
-	public Integer getUserId(){
-		return this.userId;
-	}
-			
-	public void setTransNo(String transNo){
-		this.transNo = transNo;
-	}
-	
-	public String getTransNo(){
-		return this.transNo;
-	}
-			
-	public void setMemo(String memo){
-		this.memo = memo;
-	}
-	
-	public String getMemo(){
-		return this.memo;
-	}
-			
-	public void setCreateTime(java.util.Date createTime){
-		this.createTime = createTime;
-	}
-	
-	public java.util.Date getCreateTime(){
-		return this.createTime;
-	}
-			
-	public void setUpdateTime(java.util.Date updateTime){
-		this.updateTime = updateTime;
-	}
-	
-	public java.util.Date getUpdateTime(){
-		return this.updateTime;
-	}
-			
-	public void setPaymentChannel(String paymentChannel){
-		this.paymentChannel = paymentChannel;
-	}
-	
-	public String getPaymentChannel(){
-		return this.paymentChannel;
-	}
-			
-	public void setPaymentBusinessChannel(String paymentBusinessChannel){
-		this.paymentBusinessChannel = paymentBusinessChannel;
-	}
-	
-	public String getPaymentBusinessChannel(){
-		return this.paymentBusinessChannel;
-	}
-			
-	public void setPaymentAccountNo(String paymentAccountNo){
-		this.paymentAccountNo = paymentAccountNo;
-	}
-	
-	public String getPaymentAccountNo(){
-		return this.paymentAccountNo;
-	}
-			
-	public void setOrderNo(String orderNo){
-		this.orderNo = orderNo;
-	}
-	
-	public String getOrderNo(){
-		return this.orderNo;
-	}
-			
-	public void setMusicGroupId(String musicGroupId){
-		this.musicGroupId = musicGroupId;
-	}
-	
-	public String getMusicGroupId(){
-		return this.musicGroupId;
-	}
-			
-	public void setClassGroupId(Integer classGroupId){
-		this.classGroupId = classGroupId;
-	}
-	
-	public Integer getClassGroupId(){
-		return this.classGroupId;
-	}
-
-	public OrderTypeEnum getType() {
-		return type;
-	}
-
-	public void setType(OrderTypeEnum type) {
-		this.type = type;
-	}
-
-	public BigDecimal getExpectAmount() {
-		return expectAmount;
-	}
-
-	public void setExpectAmount(BigDecimal expectAmount) {
-		this.expectAmount = expectAmount;
-	}
-
-	public BigDecimal getActualAmount() {
-		return actualAmount;
-	}
-
-	public void setActualAmount(BigDecimal actualAmount) {
-		this.actualAmount = actualAmount;
-	}
-
-	public BigDecimal getBalancePaymentAmount() {
-		return balancePaymentAmount;
-	}
-
-	public void setBalancePaymentAmount(BigDecimal balancePaymentAmount) {
-		this.balancePaymentAmount = balancePaymentAmount;
-	}
-
-	public DealStatusEnum getStatus() {
-		return status;
-	}
-
-	public void setStatus(DealStatusEnum status) {
-		this.status = status;
-	}
-
-	public Integer getVersion() {
-		return version;
-	}
-
-	public void setVersion(Integer version) {
-		this.version = version;
-	}
-
-	public Date getPayTime() {
-		return payTime;
-	}
-
-	public void setPayTime(Date payTime) {
-		this.payTime = payTime;
-	}
-    public String getMerNos() {
-        return merNos;
-    }
-
-    public void setMerNos(String merNos) {
-        this.merNos = merNos;
-    }
-
-    public PaymentChannelTypeEnum getPaymentChannelType() {
-        return paymentChannelType;
-    }
-
-    public void setPaymentChannelType(PaymentChannelTypeEnum paymentChannelType) {
-        this.paymentChannelType = paymentChannelType;
-    }
-
-	public SysUser getUser() {
-		return user;
-	}
-
-	public void setUser(SysUser user) {
-		this.user = user;
-	}
-
-	public BigDecimal getComAmount() {
-		return comAmount;
-	}
-
-	public void setComAmount(BigDecimal comAmount) {
-		this.comAmount = comAmount;
-	}
-
-	public BigDecimal getPerAmount() {
-		return perAmount;
-	}
-
-	public void setPerAmount(BigDecimal perAmount) {
-		this.perAmount = perAmount;
-	}
-
-	public Integer getOrganId() {
-		return organId;
-	}
-
-	public void setOrganId(Integer organId) {
-		this.organId = organId;
-	}
-
-
-	public BigDecimal getRemitFee() {
-		return remitFee;
-	}
-
-	public void setRemitFee(BigDecimal remitFee) {
-		this.remitFee = remitFee;
-	}
-
-	public Integer getRoutingOrganId() {
-		return routingOrganId;
-	}
-
-	public void setRoutingOrganId(Integer routingOrganId) {
-		this.routingOrganId = routingOrganId;
-	}
-
-	@Override
-	public String toString() {
-		return ToStringBuilder.reflectionToString(this);
-	}
-
-	public BigDecimal getCourseRemitFee() {
-		return courseRemitFee;
-	}
-
-	public void setCourseRemitFee(BigDecimal courseRemitFee) {
-		this.courseRemitFee = courseRemitFee;
-	}
-
-	public String getBatchNo() {
-		return batchNo;
-	}
-
-	public void setBatchNo(String batchNo) {
-		this.batchNo = batchNo;
-	}
+	private Integer cooperationId;
 }

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

@@ -4,7 +4,9 @@ import com.ym.mec.common.enums.BaseEnum;
 
 public enum SuggestionType implements BaseEnum<String, SuggestionType> {
 	APP("APP", "软件反馈"),
-	SMART_PRACTICE("SMART_PRACTICE", "智能陪练");
+	SMART_PRACTICE("SMART_PRACTICE", "智能陪练"),
+	EXCEPTION("EXCEPTION", "异常反馈"),
+	;
 
 	private String code;
 

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

@@ -24,7 +24,7 @@ public interface IndexBaseMonthDataService extends BaseService<Long, IndexBaseMo
     List<DecimalMapDto> indexCoop(String organId, String startTime, String endTime);
 
 
-    void indexBaseDataTask(Integer tenantId, String month, Set<IndexDataType> dataTypes);
+    void indexBaseDataTask(Integer tenantId);
 
     Map<String, Object> getIndexErrData(String organId, IndexErrorType errorType);
 

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

@@ -17,6 +17,7 @@ import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.dal.wrapper.StudentWrapper;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import org.springframework.transaction.annotation.Transactional;
 
 public interface StudentService extends BaseService<Integer, Student> {
 
@@ -57,6 +58,11 @@ public interface StudentService extends BaseService<Integer, Student> {
      */
     String getStudentGrade(GradeTypeEnum gradeType,Integer gradeNum);
 
+
+    void updateNewStudentStatus();
+
+    void updateStudentSubject();
+
     /**
      * @describe 更新学员指导老师和声部信息
      * @author Joburgess

+ 4 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java

@@ -426,9 +426,10 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     String CLOSE_CLASS_STUDENT_REMIND_TIME = "close_class_student_remind_time";
     // 直播课程开始前XX分钟,发送通知
     String LIVE_CLASS_START_REMIND_TIME = "live_class_start_remind_time";
-    
-    //支付渠道
-    String PAYMENT_CHANNEL = "payment_channel";
+
+	//支付渠道
+	String PAYMENT_CHANNEL = "payment_channel";
+
 
     static void checkActivityDate(String startTimeStr, String endTimeStr) {
         if(StringUtils.isEmpty(startTimeStr) || StringUtils.isEmpty(startTimeStr)){

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

@@ -230,8 +230,8 @@ public class ContractServiceImpl implements ContractService {
 
 	@Override
     public SysUserTsign register(Integer userId, String realName, String idCardNo, String mobileNo) {
-
         if (StringUtils.isBlank(realName) || StringUtils.isBlank(idCardNo) || StringUtils.isBlank(mobileNo)) {
+            logger.error("用户电子签章参数校验失败 userId:{}", userId);
             return null;
         }
 

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

@@ -3199,21 +3199,22 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			if (!DateUtil.isSameDay(newCourseSchedule.getStartClassTime(), newCourseSchedule.getEndClassTime())) {
 				throw new BizException("上课时间不允许跨天,请重新调整上课时间");
 			}
-			if(Objects.isNull(newCourseSchedule.getClassGroupId())){
-				newCourseSchedule.setClassGroupId(oldCourseSchedule.getClassGroupId());
-			}
-			if(Objects.isNull(newCourseSchedule.getClassDate())){
-				newCourseSchedule.setClassDate(oldCourseSchedule.getClassDate());
-			}
-			if (newCourseSchedule.getStartClassTime().after(date)) {
-				newCourseSchedule.setStatus(CourseStatusEnum.NOT_START);
-			}
-			if (newCourseSchedule.getStartClassTime().before(date) && newCourseSchedule.getEndClassTime().after(date)) {
-				newCourseSchedule.setStatus(CourseStatusEnum.UNDERWAY);
-			}
-			if (newCourseSchedule.getEndClassTime().before(date)) {
-				newCourseSchedule.setStatus(CourseStatusEnum.OVER);
-			}
+            if(Objects.isNull(newCourseSchedule.getClassGroupId())){
+                newCourseSchedule.setClassGroupId(oldCourseSchedule.getClassGroupId());
+            }
+            if(Objects.isNull(newCourseSchedule.getClassDate())){
+                newCourseSchedule.setClassDate(oldCourseSchedule.getClassDate());
+            }
+            if (newCourseSchedule.getStartClassTime().after(date)) {
+                newCourseSchedule.setStatus(CourseStatusEnum.NOT_START);
+				newCourseSchedule.setServiceProvider(null);
+            }
+            if (newCourseSchedule.getStartClassTime().before(date) && newCourseSchedule.getEndClassTime().after(date)) {
+                newCourseSchedule.setStatus(CourseStatusEnum.UNDERWAY);
+            }
+            if (newCourseSchedule.getEndClassTime().before(date)) {
+                newCourseSchedule.setStatus(CourseStatusEnum.OVER);
+            }
 			//调整后的课程截止日期不能超过学期时间
 			if(newCourseSchedule.getValidEndTime() != null){
 				if(newCourseSchedule.getValidEndTime().compareTo(newCourseSchedule.getClassDate()) < 0){

+ 11 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java

@@ -279,26 +279,23 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
             }
             // 设置声部
             Set<Integer> subjectIdSet = dataList.stream().map(o -> o.getSubjectId()).filter(Objects::nonNull).collect(Collectors.toSet());
-
-            List<Subject> subjectList = subjectDao.findBySubjectIds(new ArrayList<>(subjectIdSet));
-
-            // id 分组
-            Map<Integer, Subject> subjectMap = subjectList.stream().collect(Collectors.toMap(Subject::getId, Function.identity()));
-            for (DegreeRegistration degreeRegistration : dataList) {
-                if (degreeRegistration.getSubjectId() == null) {
-                    continue;
-                }
-                Subject subject = subjectMap.get(degreeRegistration.getSubjectId());
-                if (subject != null) {
-                    degreeRegistration.setSubjectName(subject.getName());
+            if(!CollectionUtils.isEmpty(subjectIdSet)){
+                List<Subject> subjectList = subjectDao.findBySubjectIds(new ArrayList<>(subjectIdSet));
+                Map<Integer, Subject> subjectMap = subjectList.stream().collect(Collectors.toMap(Subject::getId, Function.identity()));
+                for (DegreeRegistration degreeRegistration : dataList) {
+                    if (degreeRegistration.getSubjectId() == null) {
+                        continue;
+                    }
+                    Subject subject = subjectMap.get(degreeRegistration.getSubjectId());
+                    if (subject != null) {
+                        degreeRegistration.setSubjectName(subject.getName());
+                    }
                 }
             }
-
             // 设置分部
             List<Integer> organIdSet = dataList.stream().map(o -> o.getOrganId()).filter(Objects::nonNull).collect(Collectors.toList());
             Integer tenantId = TenantContextHolder.getTenantId();
 
-
             List<Organization> organs = organizationService.findOrgans(organIdSet, tenantId);
 
             if (!CollectionUtils.isEmpty(organs)) {
@@ -307,8 +304,6 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
                 dataList.forEach(o -> o.setOrganName(organMap.get(o.getOrganId())));
             }
 
-
-
             DegreeRegistration degree = degreeRegistrationDao.getTotalAmount(params);
             pageInfo.setApplyNum(degreeRegistrationDao.countApplyNum(params));
             pageInfo.setTotalAmount(degree.getMoney());

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

@@ -1885,8 +1885,8 @@ public class ExportServiceImpl implements ExportService {
         Map<Integer, String> cooperationOrganMap = new HashMap<>();
         List<Integer> cooperationOrganIds = studentPaymentOrderExportDtos.stream()
                 .filter(e -> OUTORDER == e.getType() || GroupType.OUTORDER == e.getGroupType() && (e.getType() != RENEW && e.getType() != APPLY))
-                .filter(e -> e.getMusicGroupId() != null)
-                .map(e -> Integer.valueOf(e.getMusicGroupId()))
+                .filter(e -> e.getCooperationId() != null)
+                .map(e -> e.getCooperationId())
                 .distinct()
                 .collect(Collectors.toList());
         if (cooperationOrganIds.size() > 0) {
@@ -2268,11 +2268,11 @@ public class ExportServiceImpl implements ExportService {
                     row.setEduTeacher(cooperationOrgan.getLinkman() != null ? cooperationOrgan.getLinkman() : row.getEduTeacher());
                 }
             }
-            if ((row.getType() == OUTORDER || row.getGroupType() == GroupType.OUTORDER) && StringUtils.isNotEmpty(row.getMusicGroupId())) {
+            if ((row.getType() == OUTORDER || row.getGroupType() == GroupType.OUTORDER) && row.getCooperationId() != null) {
                 if (row.getType() != RENEW && row.getType() != APPLY) {
-                    if (cooperationOrganMap.containsKey(Integer.valueOf(row.getMusicGroupId()))) {
-                        row.setCooperationOrganName(cooperationOrganMap.get(Integer.valueOf(row.getMusicGroupId())));
-                        CooperationOrgan cooperationOrganEduTeacher = musicGroupDao.findCooperationOrganEduTeacher(Integer.valueOf(row.getMusicGroupId()));
+                    if (cooperationOrganMap.containsKey(row.getCooperationId())) {
+                        row.setCooperationOrganName(cooperationOrganMap.get(row.getCooperationId()));
+                        CooperationOrgan cooperationOrganEduTeacher = musicGroupDao.findCooperationOrganEduTeacher(row.getCooperationId());
                         if (cooperationOrganEduTeacher != null) {
                             row.setEduTeacher(cooperationOrganEduTeacher.getLinkman());
                         }

+ 171 - 136
mec-biz/src/main/java/com/ym/mec/biz/service/impl/FinancialExpenditureServiceImpl.java

@@ -74,7 +74,7 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
         return financialExpenditureDao;
     }
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(FinancialExpenditureServiceImpl.class);
+    private static final Logger businessLogger = LoggerFactory.getLogger(FinancialExpenditureServiceImpl.class);
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -226,10 +226,13 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
         return financialExpenditures;
     }
 
+    //需要处理的oa模板id
+    Set<Integer> processValuesToCheck = new HashSet<>(Arrays.asList(33, 22, 19, 51, 28));
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void syncOaPayLog(Integer workOrderId,String fileUrl) throws Exception {
+        businessLogger.info("syncOaPayLog--- workOrderId:{},fileUrl:{}",workOrderId,fileUrl);
         //防止幂等
         String key = "syncOaPayLog:" + workOrderId;
         RBucket<Object> bucket = redissonClient.getBucket(key);
@@ -250,17 +253,14 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
                     realName = simpleUser.getRealName();
                 }
             }
+            //获取模板
             String formStructure = financialExpenditureDao.getFormStructure(workOrderId);
+            //获取用户填写的表单
             JSONObject formData = JSONObject.parseObject(financialExpenditureDao.getFormData(workOrderId));
             OaFormStructureDto oaFormStructureDto = JSONObject.parseObject(formStructure, OaFormStructureDto.class);
             List<OaInputDto> oaInputDtos = oaFormStructureDto.getList();
             //课程退费和乐团退费需要单独处理
-            if(pWorkOrderInfo.getProcess().equals(33) ||
-                    pWorkOrderInfo.getProcess().equals(22) ||
-                    pWorkOrderInfo.getProcess().equals(19) ||
-                    pWorkOrderInfo.getProcess().equals(51) ||
-                    pWorkOrderInfo.getProcess().equals(28)
-            ){
+            if(processValuesToCheck.contains(pWorkOrderInfo.getProcess())){
                 List<FinancialExpenditure> financialExpenditureList = new ArrayList<>();
                 Integer organId = null;
                 String note = "";
@@ -352,55 +352,12 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
                             financialExpenditure.setApplyUserId(pWorkOrderInfo.getCreator());
                             financialExpenditure.setProcessId(pWorkOrderInfo.getProcess());
                             financialExpenditure.setEffectiveTime(DateUtil.format(endTime,DateUtil.ISO_YEAR_MONTH_FORMAT));
-                            List<OaColumnDto> columns = oaInputDto.getColumns();
-                            if (columns != null && columns.size() > 0) {
-                                for (OaColumnDto column : columns) {
-                                    List<OaInputDto> columnList = column.getList();
-                                    if (columnList != null && columnList.size() > 0) {
-                                        for (OaInputDto inputDto : columnList) {
-                                            String name = inputDto.getName();
-                                            Object o = hashMap.get(inputDto.getModel());
-                                            if (Objects.isNull(o) || StringUtils.isEmpty(o.toString())) {
-                                                continue;
-                                            }
-                                            if (StringUtils.equals(name,"课程组编号")) {
-                                                financialExpenditure.setVipGroupId(Long.parseLong(o.toString()));
-                                            } else if (StringUtils.equals(name,"课程类型")) {
-                                                financialExpenditure.setGroupType(o.toString());
-                                            } else if (StringUtils.equals(name,"乐团编号")) {
-                                                financialExpenditure.setMusicGroupId(o.toString());
-                                            } else if (StringUtils.equals(name,"退费项目")) {
-                                                financialExpenditure.setReturnFeeType(o.toString());
-                                            } else if (StringUtils.equals(name,"学员编号")) {
-                                                financialExpenditure.setStudentId(Integer.parseInt(o.toString()));
-                                            } else if (StringUtils.equals(name,"分部")) {
-                                                Organization organization = organizationDao.get(Integer.parseInt(o.toString()));
-                                                if (organization != null) {
-                                                    financialExpenditure.setOrganId(organization.getId());
-                                                    financialExpenditure.setOrganName(organization.getName());
-                                                }
-                                            } else if (StringUtils.equals(name,"学校")) {
-                                                financialExpenditure.setCooperationOrganId(Integer.parseInt(o.toString()));
-                                            } else if (StringUtils.contains(name,"金额")) {
-                                                financialExpenditure.setAmount(financialExpenditure.getAmount().add(new BigDecimal(Double.parseDouble(o.toString()))));
-                                                financialExpenditure.setCurrentAmount(financialExpenditure.getAmount());
-                                            } else if (StringUtils.equals(name,"情况说明") || StringUtils.equals(name,"事由")) {
-                                                financialExpenditure.setCause(o.toString());
-                                            }else if (StringUtils.equals(name,"费用类型") || StringUtils.equals(name,"费用类别")) {
-                                                FeeProjectEnum projectEnum = FeeProjectEnum.valueOfDesc(o.toString());
-                                                if(projectEnum == null){
-                                                    projectEnum = feeProjectEnum;
-                                                }
-                                                financialExpenditure.setFeeProject(projectEnum);
-                                                financialExpenditure.setType(getExpenditureType(projectEnum));
-                                            }else if (StringUtils.equals(name,"日期") || StringUtils.equals(name,"费用发生日期")) {
-                                                financialExpenditure.setPaymentTime(DateUtil.stringToDate(o.toString(),DateUtil.DEFAULT_PATTERN));
-                                            } else if (StringUtils.equals(name,"费用分摊月份")) {
-                                                financialExpenditure.setEffectiveTime(o.toString());
-                                            }
-                                        }
-                                    }
-                                }
+                            financialExpenditure.setFeeProject(feeProjectEnum);
+                            financialExpenditure.setType(getExpenditureType(feeProjectEnum));
+                            //解析用户录入
+                            this.setFinancialExpenditure(oaInputDto,hashMap,financialExpenditure);
+                            if(StringUtils.isEmpty(financialExpenditure.getMusicGroupId()) || financialExpenditure.getStudentId() == null){
+                                continue ;
                             }
                             if(financialExpenditure.getPaymentTime() == null){
                                 financialExpenditure.setPaymentTime(endTime);
@@ -412,83 +369,11 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
                         }
                     }
                 }
-                //课程退费
-                if(pWorkOrderInfo.getProcess().equals(22)){
-                    for (FinancialExpenditure financialExpenditure : financialExpenditureList) {
-                        ReturnFeeDto returnFeeDto = new ReturnFeeDto();
-                        returnFeeDto.setGroupType(GroupType.valueOfDesc(financialExpenditure.getGroupType()));
-                        returnFeeDto.setAmount(financialExpenditure.getAmount());
-                        returnFeeDto.setStudentId(financialExpenditure.getStudentId());
-                        returnFeeDto.setConfirmReturnActivityGive(true);
-                        returnFeeDto.setGroupId(financialExpenditure.getVipGroupId());
-                        returnFeeDto.setVipGroupId(financialExpenditure.getVipGroupId());
-                        if(returnFeeDto.getGroupType() == GroupType.VIP || returnFeeDto.getGroupType() == GroupType.LIVE){
-                            vipGroupService.applyRefundForStudentOa(returnFeeDto);
-                        }else if(returnFeeDto.getGroupType() == GroupType.COMM || returnFeeDto.getGroupType() == GroupType.PRACTICE){
-                            groupClassService.cancelGroupOa(returnFeeDto);
-                        }
-                    }
-                }else if(pWorkOrderInfo.getProcess().equals(33) || pWorkOrderInfo.getProcess().equals(19)){
-                    //退团
-                    for (FinancialExpenditure financialExpenditure : financialExpenditureList) {
-                        String returnFeeType = financialExpenditure.getReturnFeeType();
-                        if(StringUtils.isNotEmpty(returnFeeType)){
-                            if(returnFeeType.contains("乐器")){
-                                financialExpenditure.setRefundInstrumentFeeFlag(true);
-                            }
-                            if(returnFeeType.contains("乐保")){
-                                financialExpenditure.setMaintenanceFeeFlag(true);
-                            }
-                            if(returnFeeType.contains("教辅")){
-                                financialExpenditure.setRefundTeachingAssistantsFeeFlag(true);
-                            }
-                        }
-                    }
-                    //处理excel文件
-                    List<FinancialExpenditure> financialExpenditures = new ArrayList<>();
-                    if(StringUtils.isNotEmpty(fileUrl)){
-                        String[] split = fileUrl.split(",");
-                        for (String s : split) {
-                            URL url = new URL(s);
-                            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
-                            conn.setConnectTimeout(3*1000);
-                            File file = File.createTempFile(UUID.randomUUID().toString(), ".xls");
-                            FileUtils.copyInputStreamToFile(conn.getInputStream(),file);
-                            byte[] bytes = FileUtils.readFileToByteArray(file);
-                            String fileName = file.getName();
-                            //删除临时文件
-                            if (file.exists()) {
-                                file.delete();
-                            }
-                            financialExpenditures.addAll(financialExpenditureService.checkOaQuitMusicGroupExcel(bytes, fileName));
-                        }
-                        //去除重复数据
-                        financialExpenditures.removeAll(Collections.singleton(null));
-                        if(CollectionUtils.isNotEmpty(financialExpenditureList)){
-                            for (FinancialExpenditure financialExpenditure : financialExpenditureList) {
-                                if(financialExpenditures.contains(financialExpenditure)) {
-                                    continue;
-                                }
-                                financialExpenditures.add(financialExpenditure);
-                            }
-                        }
-                    }
-                    if(CollectionUtils.isNotEmpty(financialExpenditures)){
-                        for (FinancialExpenditure financialExpenditure : financialExpenditures) {
-                            financialExpenditure.setAprovalTime(endTime);
-                            financialExpenditure.setPaymentTime(endTime);
-                            financialExpenditure.setEffectiveTime(DateUtil.format(endTime,DateUtil.ISO_YEAR_MONTH_FORMAT));
-                            financialExpenditure.setApplyUser(realName);
-                            financialExpenditure.setFeeProject(FeeProjectEnum.REFUND);
-                            financialExpenditure.setType(getExpenditureType(financialExpenditure.getFeeProject()));
-                            financialExpenditure.setBatchNo(pWorkOrderInfo.getId().toString());
-                            financialExpenditure.setFinancialProcessNo(pWorkOrderInfo.getId().toString());
-                        }
-                        financialExpenditureList = financialExpenditures;
-                    }
-                    for (FinancialExpenditure financialExpenditure : financialExpenditureList) {
-                        musicGroupService.directQuitMusicGroupOa(financialExpenditure);
-                    }
+                //处理业务退费(vip退学、乐团退费.....)
+                this.processBusinessReturns(pWorkOrderInfo,financialExpenditureList,realName,fileUrl);
+                if(CollectionUtils.isEmpty(financialExpenditureList)){
+                    businessLogger.info("oa业务流程处理失败,请检查");
+                    return;
                 }
                 financialExpenditureDao.batchInsert(financialExpenditureList);
             }else {
@@ -513,14 +398,17 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
                     if(Objects.isNull(o) || StringUtils.isEmpty(o.toString())){
                         continue;
                     }
-                    if(StringUtils.equals(name,"金额")){
+                    if(StringUtils.contains(name,"金额")){
                         financialExpenditure.setAmount(new BigDecimal(Double.parseDouble(o.toString())));
                         financialExpenditure.setCurrentAmount(financialExpenditure.getAmount());
                     }else if(StringUtils.equals(name,"情况说明")){
                         financialExpenditure.setCause(o.toString());
                     }else if(StringUtils.equals(name,"费用类型") || StringUtils.equals(name,"费用类别")){
-                        financialExpenditure.setFeeProject(FeeProjectEnum.valueOfDesc(o.toString()));
-                        financialExpenditure.setType(getExpenditureType(financialExpenditure.getFeeProject()));
+                        FeeProjectEnum feeProjectEnum = FeeProjectEnum.valueOfDesc(o.toString());
+                        if(feeProjectEnum != null){
+                            financialExpenditure.setFeeProject(feeProjectEnum);
+                            financialExpenditure.setType(getExpenditureType(financialExpenditure.getFeeProject()));
+                        }
                     }
                 }
                 financialExpenditureDao.insert(financialExpenditure);
@@ -528,6 +416,153 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
         }
     }
 
+    private void setFinancialExpenditure(OaInputDto oaInputDto,HashMap hashMap,FinancialExpenditure financialExpenditure){
+        List<OaColumnDto> columns = oaInputDto.getColumns();
+        if (columns != null && columns.size() > 0) {
+            for (OaColumnDto column : columns) {
+                List<OaInputDto> columnList = column.getList();
+                if (columnList != null && columnList.size() > 0) {
+                    //比对模板、获取用户录入
+                    for (OaInputDto inputDto : columnList) {
+                        String name = inputDto.getName();
+                        Object o = hashMap.get(inputDto.getModel());
+                        if (Objects.isNull(o) || StringUtils.isEmpty(o.toString())) {
+                            continue;
+                        }
+                        if (StringUtils.equals(name,"课程组编号")) {
+                            financialExpenditure.setVipGroupId(Long.parseLong(o.toString()));
+                        } else if (StringUtils.equals(name,"课程类型")) {
+                            financialExpenditure.setGroupType(o.toString());
+                        } else if (StringUtils.equals(name,"乐团编号")) {
+                            financialExpenditure.setMusicGroupId(o.toString());
+                        } else if (StringUtils.equals(name,"退费项目")) {
+                            financialExpenditure.setReturnFeeType(o.toString());
+                        } else if (StringUtils.equals(name,"学员编号")) {
+                            financialExpenditure.setStudentId(Integer.parseInt(o.toString()));
+                        } else if (StringUtils.equals(name,"分部")) {
+                            Organization organization = organizationDao.get(Integer.parseInt(o.toString()));
+                            if (organization != null) {
+                                financialExpenditure.setOrganId(organization.getId());
+                                financialExpenditure.setOrganName(organization.getName());
+                            }
+                        } else if (StringUtils.equals(name,"学校")) {
+                            financialExpenditure.setCooperationOrganId(Integer.parseInt(o.toString()));
+                        } else if (StringUtils.contains(name,"金额")) {
+                            financialExpenditure.setAmount(financialExpenditure.getAmount().add(new BigDecimal(Double.parseDouble(o.toString()))));
+                            financialExpenditure.setCurrentAmount(financialExpenditure.getAmount());
+                        } else if (StringUtils.equals(name,"情况说明") || StringUtils.equals(name,"事由")) {
+                            financialExpenditure.setCause(o.toString());
+                        }else if (StringUtils.equals(name,"费用类型") || StringUtils.equals(name,"费用类别")) {
+                            FeeProjectEnum projectEnum = FeeProjectEnum.valueOfDesc(o.toString());
+                            if(projectEnum != null){
+                                financialExpenditure.setFeeProject(projectEnum);
+                                financialExpenditure.setType(getExpenditureType(projectEnum));
+                            }
+                        }else if (StringUtils.equals(name,"日期") || StringUtils.equals(name,"费用发生日期")) {
+                            financialExpenditure.setPaymentTime(DateUtil.stringToDate(o.toString(),DateUtil.DEFAULT_PATTERN));
+                        } else if (StringUtils.equals(name,"费用分摊月份")) {
+                            financialExpenditure.setEffectiveTime(o.toString());
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    //处理业务退费
+    private void processBusinessReturns(PWorkOrderInfo pWorkOrderInfo,List<FinancialExpenditure> financialExpenditureList,
+                                        String realName,String fileUrl) throws Exception {
+        //课程退费
+        if(pWorkOrderInfo.getProcess().equals(22)){
+            for (FinancialExpenditure financialExpenditure : financialExpenditureList) {
+                ReturnFeeDto returnFeeDto = new ReturnFeeDto();
+                returnFeeDto.setGroupType(GroupType.valueOfDesc(financialExpenditure.getGroupType()));
+                returnFeeDto.setAmount(financialExpenditure.getAmount());
+                returnFeeDto.setStudentId(financialExpenditure.getStudentId());
+                returnFeeDto.setConfirmReturnActivityGive(true);
+                returnFeeDto.setGroupId(financialExpenditure.getVipGroupId());
+                returnFeeDto.setVipGroupId(financialExpenditure.getVipGroupId());
+                if(returnFeeDto.getGroupType() == GroupType.VIP || returnFeeDto.getGroupType() == GroupType.LIVE){
+                    vipGroupService.applyRefundForStudentOa(returnFeeDto);
+                }else if(returnFeeDto.getGroupType() == GroupType.COMM || returnFeeDto.getGroupType() == GroupType.PRACTICE){
+                    groupClassService.cancelGroupOa(returnFeeDto);
+                }
+            }
+        }else if(pWorkOrderInfo.getProcess().equals(33) || pWorkOrderInfo.getProcess().equals(19)){
+            //处理学员乐团退费项目
+            this.processRefundItem(financialExpenditureList);
+            //处理excel文件
+            List<FinancialExpenditure> financialExpenditures = this.processExcelFile(fileUrl, financialExpenditureList);
+            if(CollectionUtils.isNotEmpty(financialExpenditures)){
+                for (FinancialExpenditure financialExpenditure : financialExpenditures) {
+                    financialExpenditure.setAprovalTime(pWorkOrderInfo.getUpdateTime());
+                    financialExpenditure.setPaymentTime(pWorkOrderInfo.getUpdateTime());
+                    financialExpenditure.setEffectiveTime(DateUtil.format(pWorkOrderInfo.getUpdateTime(),DateUtil.ISO_YEAR_MONTH_FORMAT));
+                    financialExpenditure.setApplyUser(realName);
+                    financialExpenditure.setFeeProject(FeeProjectEnum.REFUND);
+                    financialExpenditure.setType(getExpenditureType(financialExpenditure.getFeeProject()));
+                    financialExpenditure.setBatchNo(pWorkOrderInfo.getId().toString());
+                    financialExpenditure.setFinancialProcessNo(pWorkOrderInfo.getId().toString());
+                }
+                financialExpenditureList = financialExpenditures;
+            }
+            //批量处理oa审批退团逻辑
+            financialExpenditureList.stream().forEach(e->musicGroupService.directQuitMusicGroupOa(e));
+        }
+    }
+
+    //处理学员乐团退费项目
+    private void processRefundItem(List<FinancialExpenditure> financialExpenditureList){
+        for (FinancialExpenditure financialExpenditure : financialExpenditureList) {
+            String returnFeeType = financialExpenditure.getReturnFeeType();
+            if(StringUtils.isNotEmpty(returnFeeType)){
+                if(returnFeeType.contains("乐器")){
+                    financialExpenditure.setRefundInstrumentFeeFlag(true);
+                }
+                if(returnFeeType.contains("乐保")){
+                    financialExpenditure.setMaintenanceFeeFlag(true);
+                }
+                if(returnFeeType.contains("教辅")){
+                    financialExpenditure.setRefundTeachingAssistantsFeeFlag(true);
+                }
+            }
+        }
+    }
+
+    //处理excel文件
+    private List<FinancialExpenditure> processExcelFile(String fileUrl, List<FinancialExpenditure> financialExpenditureList) throws Exception {
+        List<FinancialExpenditure> financialExpenditures = new ArrayList<>();
+        if(StringUtils.isNotEmpty(fileUrl)){
+            String[] split = fileUrl.split(",");
+            for (String s : split) {
+                URL url = new URL(s);
+                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+                conn.setConnectTimeout(3*1000);
+                File file = File.createTempFile(UUID.randomUUID().toString(), ".xls");
+                FileUtils.copyInputStreamToFile(conn.getInputStream(),file);
+                byte[] bytes = FileUtils.readFileToByteArray(file);
+                String fileName = file.getName();
+                //删除临时文件
+                if (file.exists()) {
+                    file.delete();
+                }
+                financialExpenditures.addAll(financialExpenditureService.checkOaQuitMusicGroupExcel(bytes, fileName));
+            }
+            //去除重复数据
+            financialExpenditures.removeAll(Collections.singleton(null));
+            if(CollectionUtils.isNotEmpty(financialExpenditureList)){
+                for (FinancialExpenditure financialExpenditure : financialExpenditureList) {
+                    if(financialExpenditures.contains(financialExpenditure)) {
+                        continue;
+                    }
+                    financialExpenditures.add(financialExpenditure);
+                }
+            }
+        }
+        return financialExpenditures;
+    }
+
+
     public static ExpenditureTypeEnum getExpenditureType(FeeProjectEnum feeProjectEnum) {
         switch (feeProjectEnum) {
             case REFUND:

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

@@ -268,6 +268,7 @@ public class HfMemberServiceImpl extends BaseServiceImpl<Integer, HfMember> impl
 		merchantInfo.setLegalName(member.getLegalPerson());
 		merchantInfo.setLicenceNo(member.getSocialCreditCode());
 		merchantInfo.setLicenceUrl(member.getLicenceUrl());
+		merchantInfo.setMerchantType(member.getMerchantType());
 		merchantInfo.setMerchantName(member.getName());
 		merchantInfo.setMobile(member.getLegalMp());
 		merchantInfo.setOpenAccountLicenceUrl(member.getOpenAccountLicenceUrl());

+ 233 - 249
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -24,6 +24,8 @@ import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.web.EParallelStream;
 import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -34,9 +36,7 @@ import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
+import java.util.concurrent.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -70,7 +70,13 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 	private SysEmployeePositionService employeePositionService;
 	@Autowired
 	private MusicGroupCalenderRefundPeriodDao musicGroupCalenderRefundPeriodDao;
-	private static final ExecutorService exportExecutorService = Executors.newFixedThreadPool(10);
+	private static final ExecutorService exportExecutorService = new ThreadPoolExecutor(
+			20, 20, 0L, TimeUnit.MILLISECONDS,
+			new LinkedBlockingQueue<>(),
+			Executors.defaultThreadFactory(),
+			new ThreadPoolExecutor.CallerRunsPolicy()
+	);;
+	private static final Logger businessLogger = LoggerFactory.getLogger(IndexBaseMonthDataServiceImpl.class);
 
 	private static ThreadLocal<Set<Integer>> organIds = new ThreadLocal<Set<Integer>>(){
 		@Override
@@ -497,263 +503,227 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		});
 	}
 
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void indexBaseDataTask(Integer tenantId, String dayStr, Set<IndexDataType> dataTypes) {
-		LocalDate nowDate = LocalDate.now();
-
-		List<Organization> allOrgans = organizationService.findAllOrgans(tenantId);
-		this.organIds.get().clear();
-		this.organIds.get().addAll(allOrgans.stream().map(Organization::getId).collect(Collectors.toSet()));
 
-		if(StringUtils.isBlank(dayStr)){
-			dayStr = nowDate.plusDays(-1).toString();
-		}
+	public void runByBewTransactional(List<Runnable> tasks) {
+		List<CompletableFuture<Void>> futures = tasks.stream()
+				.map(task -> CompletableFuture.runAsync(() -> {
+					try {
+						task.run();
+					} catch (Exception e) {
+						businessLogger.error("indexBaseDataTask error: {}", e.getMessage());
+					}
+				}, exportExecutorService))
+				.collect(Collectors.toList());
 
-		LocalDate day = LocalDate.parse(dayStr, DateUtil.dateFormatter);
-		LocalDate monday = day.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
+		CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]))
+				.join();
+	}
 
-		//学员数据
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.STUDENT_REGISTRATION_NUM)){
-			saveData(indexBaseMonthDataDao.getStudentRegistrationData(dayStr,tenantId), dayStr, IndexDataType.STUDENT_REGISTRATION_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.CHARGE_STUDENT_CHANGE_RATE)) {
-			saveData(indexBaseMonthDataDao.getChargeStudentChangeData(dayStr,tenantId), dayStr, IndexDataType.CHARGE_STUDENT_CHANGE_RATE, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.ACTIVATION_RATE)) {
-			saveData(indexBaseMonthDataDao.getStudentSignUpData(dayStr, nowDate.plusMonths(-6).toString(),tenantId), dayStr, IndexDataType.ACTIVATION_RATE, tenantId);
-		}
 
-		//运营数据
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.SCHOOL)) {
-			saveData(indexBaseMonthDataDao.getSchoolData(dayStr,tenantId), dayStr, IndexDataType.SCHOOL, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.PROGRESS_MUSIC_GROUP_NUM)) {
-			saveData(indexBaseMonthDataDao.getMusicData(dayStr,tenantId), dayStr, IndexDataType.PROGRESS_MUSIC_GROUP_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(TRANSACTION_TEACHER_NUM)) {
-			Map<String, List<SimpleUserDto>> organPosition = employeePositionService.findOrganPosition(null, tenantId);
-			List<SimpleUserDto> transactionTeachers = organPosition.get(SysUserRoleEnum.JOIN_TEACHER.name());
-			Map<Integer, Integer> organTeacherNumMap = new HashMap<>();
-			if (transactionTeachers != null) {
-				for (SimpleUserDto transactionTeacher : transactionTeachers) {
-					Set<Integer> organIds = Arrays.stream(transactionTeacher.getOrganIds().split(","))
-							.map(s -> Integer.valueOf(s))
-							.collect(Collectors.toSet());
-					for (Integer organId : organIds) {
-						if (organTeacherNumMap.containsKey(organId)) {
-							organTeacherNumMap.put(organId, organTeacherNumMap.get(organId) + 1);
-						} else {
-							organTeacherNumMap.put(organId, 1);
-						}
+	//学员数据
+	public void studentData(String dayStr,Integer tenantId,LocalDate nowDate){
+		saveData(indexBaseMonthDataDao.getStudentRegistrationData(dayStr,tenantId), dayStr, IndexDataType.STUDENT_REGISTRATION_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getChargeStudentChangeData(dayStr,tenantId), dayStr, IndexDataType.CHARGE_STUDENT_CHANGE_RATE, tenantId);
+		saveData(indexBaseMonthDataDao.getStudentSignUpData(dayStr, nowDate.plusMonths(-6).toString(),tenantId), dayStr, IndexDataType.ACTIVATION_RATE, tenantId);
+	}
+	//运营数据
+	public void operateData(String dayStr,Integer tenantId){
+		saveData(indexBaseMonthDataDao.getSchoolData(dayStr,tenantId), dayStr, IndexDataType.SCHOOL, tenantId);
+		saveData(indexBaseMonthDataDao.getMusicData(dayStr,tenantId), dayStr, IndexDataType.PROGRESS_MUSIC_GROUP_NUM, tenantId);
+		Map<String, List<SimpleUserDto>> organPosition = employeePositionService.findOrganPosition(null, tenantId);
+		List<SimpleUserDto> transactionTeachers = organPosition.get(SysUserRoleEnum.JOIN_TEACHER.name());
+		Map<Integer, Integer> organTeacherNumMap = new HashMap<>();
+		if (transactionTeachers != null) {
+			for (SimpleUserDto transactionTeacher : transactionTeachers) {
+				Set<Integer> organIds = Arrays.stream(transactionTeacher.getOrganIds().split(","))
+						.map(s -> Integer.valueOf(s))
+						.collect(Collectors.toSet());
+				for (Integer organId : organIds) {
+					if (organTeacherNumMap.containsKey(organId)) {
+						organTeacherNumMap.put(organId, organTeacherNumMap.get(organId) + 1);
+					} else {
+						organTeacherNumMap.put(organId, 1);
 					}
 				}
 			}
-			List<IndexBaseMonthData> datas = new ArrayList<>();
-			Date month = DateUtil.stringToDate(dayStr, "yyyy-MM-dd");
-			for (Map.Entry<Integer, Integer> organTeacherNumMapEntry : organTeacherNumMap.entrySet()) {
-				IndexBaseMonthData data = new IndexBaseMonthData();
-				data.setOrganId(organTeacherNumMapEntry.getKey());
-				data.setMonth(month);
-				BigDecimal num = new BigDecimal(organTeacherNumMapEntry.getValue());
-				data.setTotalNum(num);
-				data.setActivateNum(num);
-				data.setPercent(num);
-				datas.add(data);
-			}
-			saveData(datas, dayStr, IndexDataType.TRANSACTION_TEACHER_NUM, tenantId);
-		}
-
-		//人事数据
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.TEACHER_NUM)) {
-			saveData(indexBaseMonthDataDao.getTeacherData(dayStr, null, null,tenantId), dayStr, IndexDataType.TEACHER_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.FULL_TIME_NUM)) {
-			saveData(indexBaseMonthDataDao.getTeacherData(dayStr, JobNatureEnum.FULL_TIME, null,tenantId), dayStr, IndexDataType.FULL_TIME_NUM, tenantId);
 		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.PART_TIME_NUM)) {
-			saveData(indexBaseMonthDataDao.getTeacherData(dayStr, JobNatureEnum.PART_TIME, null,tenantId), dayStr, IndexDataType.PART_TIME_NUM, tenantId);
+		List<IndexBaseMonthData> datas = new ArrayList<>();
+		Date month = DateUtil.stringToDate(dayStr, "yyyy-MM-dd");
+		for (Map.Entry<Integer, Integer> organTeacherNumMapEntry : organTeacherNumMap.entrySet()) {
+			IndexBaseMonthData data = new IndexBaseMonthData();
+			data.setOrganId(organTeacherNumMapEntry.getKey());
+			data.setMonth(month);
+			BigDecimal num = new BigDecimal(organTeacherNumMapEntry.getValue());
+			data.setTotalNum(num);
+			data.setActivateNum(num);
+			data.setPercent(num);
+			datas.add(data);
 		}
-//		saveData(indexBaseMonthDataDao.getTeacherData(dayStr, null, true), dayStr, IndexDataType.DIMISSION_NUM);
+		saveData(datas, dayStr, IndexDataType.TRANSACTION_TEACHER_NUM, tenantId);
+	}
 
-		//剩余课时
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.SURPLUS_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, null, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_COURSE_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.SURPLUS_MUSIC_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, GroupType.MUSIC, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_MUSIC_COURSE_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.SURPLUS_VIP_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, GroupType.VIP, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_VIP_COURSE_NUM, tenantId);
+	//人事数据
+	public void personnelData(String dayStr,Integer tenantId){
+		saveData(indexBaseMonthDataDao.getTeacherData(dayStr, null, null,tenantId), dayStr, IndexDataType.TEACHER_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getTeacherData(dayStr, JobNatureEnum.FULL_TIME, null,tenantId), dayStr, IndexDataType.FULL_TIME_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getTeacherData(dayStr, JobNatureEnum.PART_TIME, null,tenantId), dayStr, IndexDataType.PART_TIME_NUM, tenantId);
+	}
+
+	//剩余课时
+	public void subCourseData(String dayStr,Integer tenantId){
+		saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, null, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_COURSE_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, GroupType.MUSIC, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_MUSIC_COURSE_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, GroupType.VIP, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_VIP_COURSE_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, GroupType.PRACTICE, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_PRACTICE_COURSE_NUM, tenantId);
+	}
+
+	//已消耗课时
+	public void consumeCourseData(String dayStr,Integer tenantId){
+		saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, null, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_COURSE_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, GroupType.MUSIC, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_MUSIC_COURSE_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, GroupType.VIP, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_VIP_COURSE_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, GroupType.PRACTICE, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_PRACTICE_COURSE_NUM, tenantId);
+	}
+
+	//业务数据
+	public void businessData(String dayStr,Integer tenantId,LocalDate monday){
+		saveData(indexBaseMonthDataDao.getHomeworkData(dayStr, null,tenantId), monday.toString(), IndexDataType.HOMEWORK_CREATE_RATE, tenantId);
+		saveData(indexBaseMonthDataDao.getHomeworkData(dayStr, "submit",tenantId), monday.toString(), IndexDataType.HOMEWORK_SUBMIT_RATE, tenantId);
+		saveData(indexBaseMonthDataDao.getHomeworkData(dayStr, "comment",tenantId), monday.toString(), IndexDataType.HOMEWORK_COMMENT_RATE, tenantId);
+	}
+
+	//课程数据
+	public void courseData(String dayStr,Integer tenantId){
+		saveData(indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.MUSIC, null, null, null,tenantId), dayStr, IndexDataType.MUSIC_GROUP_COURSE, tenantId);
+
+		List<IndexBaseMonthData> vipCourseData = indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.VIP, null, null, null,tenantId);
+		List<OrganVipGroupCategoryCourseNumDto> vipGroupCategoryCourseData = indexBaseMonthDataDao.getVipGroupCategoryCourseData(dayStr, null, null, GroupType.VIP, null, null, null,tenantId);
+		Map<Integer, Map<String, Integer>> organCategoryCourseMap = new HashMap<>();
+		if (!CollectionUtils.isEmpty(vipGroupCategoryCourseData)) {
+			organCategoryCourseMap = vipGroupCategoryCourseData.stream().collect(Collectors.groupingBy(OrganVipGroupCategoryCourseNumDto::getOrganId, Collectors.toMap(OrganVipGroupCategoryCourseNumDto::getCategoryName, o -> o.getCourseNum())));
 		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.SURPLUS_PRACTICE_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupCourseData(dayStr, GroupType.PRACTICE, CourseStatusEnum.NOT_START,tenantId), dayStr, IndexDataType.SURPLUS_PRACTICE_COURSE_NUM, tenantId);
+		for (IndexBaseMonthData vipCourseDatum : vipCourseData) {
+			if (organCategoryCourseMap.containsKey(vipCourseDatum.getOrganId())) {
+				vipCourseDatum.setExtendInfo(JSON.toJSONString(organCategoryCourseMap.get(vipCourseDatum.getOrganId())));
+			}
 		}
+		saveData(vipCourseData, dayStr, IndexDataType.VIP_GROUP_COURSE, tenantId);
 
-		//已消耗课时
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.OVER_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, null, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_COURSE_NUM, tenantId);
+		List<IndexBaseMonthData> vipOnlineCourseData = indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.ONLINE, null,tenantId);
+		List<OrganVipGroupCategoryCourseNumDto> vipGroupOnlineCategoryCourseData = indexBaseMonthDataDao.getVipGroupCategoryCourseData(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.ONLINE, null,tenantId);
+		Map<Integer, Map<String, Integer>> organOnlineCategoryCourseMap = new HashMap<>();
+		if (!CollectionUtils.isEmpty(vipGroupOnlineCategoryCourseData)) {
+			organOnlineCategoryCourseMap = vipGroupOnlineCategoryCourseData.stream().collect(Collectors.groupingBy(OrganVipGroupCategoryCourseNumDto::getOrganId, Collectors.toMap(OrganVipGroupCategoryCourseNumDto::getCategoryName, o -> o.getCourseNum())));
 		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.OVER_MUSIC_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, GroupType.MUSIC, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_MUSIC_COURSE_NUM, tenantId);
+		for (IndexBaseMonthData vipCourseDatum : vipOnlineCourseData) {
+			if (organOnlineCategoryCourseMap.containsKey(vipCourseDatum.getOrganId())) {
+				vipCourseDatum.setExtendInfo(JSON.toJSONString(organOnlineCategoryCourseMap.get(vipCourseDatum.getOrganId())));
+			}
 		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.OVER_VIP_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, GroupType.VIP, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_VIP_COURSE_NUM, tenantId);
+		saveData(vipOnlineCourseData, dayStr, IndexDataType.VIP_GROUP_ONLINE_COURSE, tenantId);
+
+		List<IndexBaseMonthData> vipOfflineCourseData = indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.OFFLINE, null,tenantId);
+		List<OrganVipGroupCategoryCourseNumDto> vipGroupOfflineCategoryCourseData = indexBaseMonthDataDao.getVipGroupCategoryCourseData(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.OFFLINE, null,tenantId);
+		Map<Integer, Map<String, Integer>> organOfflineCategoryCourseMap = new HashMap<>();
+		if (!CollectionUtils.isEmpty(vipGroupOfflineCategoryCourseData)) {
+			organOfflineCategoryCourseMap = vipGroupOfflineCategoryCourseData.stream().collect(Collectors.groupingBy(OrganVipGroupCategoryCourseNumDto::getOrganId, Collectors.toMap(OrganVipGroupCategoryCourseNumDto::getCategoryName, o -> o.getCourseNum())));
 		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.OVER_PRACTICE_COURSE_NUM)) {
-			saveData(indexBaseMonthDataDao.getGroupSurplusCourseData(dayStr, GroupType.PRACTICE, CourseStatusEnum.OVER,tenantId), dayStr, IndexDataType.OVER_PRACTICE_COURSE_NUM, tenantId);
+		for (IndexBaseMonthData vipCourseDatum : vipOfflineCourseData) {
+			if (organOfflineCategoryCourseMap.containsKey(vipCourseDatum.getOrganId())) {
+				vipCourseDatum.setExtendInfo(JSON.toJSONString(organOfflineCategoryCourseMap.get(vipCourseDatum.getOrganId())));
+			}
 		}
+		saveData(vipOfflineCourseData, dayStr, IndexDataType.VIP_GROUP_OFFLINE_COURSE, tenantId);
 
-		//经营数据
+		saveData(indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.PRACTICE, null, null, null,tenantId), dayStr, IndexDataType.PRACTICE_GROUP_COURSE, tenantId);
+	}
 
-//		List<IndexBaseMonthData> financePayData = indexBaseMonthDataDao.getFinancePayData(dayStr);
-//		List<IndexBaseMonthData> financeBalanceData = indexBaseMonthDataDao.getFinanceBalanceData(dayStr);
-//		List<IndexBaseMonthData> financeActualData = indexBaseMonthDataDao.getFinanceActualData(dayStr);
-//
-//		saveData(financePayData,dayStr,IndexDataType.FINANCE_PAY);
-//		saveData(financeBalanceData,dayStr,IndexDataType.FINANCE_BALANCE_AMOUNT);
-//		saveData(financeActualData,dayStr,IndexDataType.FINANCE_AMOUNT);
-//		saveData(totalAmountData,dayStr,IndexDataType.TOTAL_AMOUNT);
+	//小课数据统计
+	public void smallCourseData(String dayStr,Integer tenantId){
+		saveData(indexBaseMonthDataDao.getStudentVipOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_VIP_ORDER_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getStudentTheoryOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_THEORY_ORDER_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getStudentPracticeOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_PRACTICE_ORDER_NUM, tenantId);
+	}
 
-		//业务数据
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.HOMEWORK_CREATE_RATE)) {
-			saveData(indexBaseMonthDataDao.getHomeworkData(dayStr, null,tenantId), monday.toString(), IndexDataType.HOMEWORK_CREATE_RATE, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.HOMEWORK_SUBMIT_RATE)) {
-			saveData(indexBaseMonthDataDao.getHomeworkData(dayStr, "submit",tenantId), monday.toString(), IndexDataType.HOMEWORK_SUBMIT_RATE, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.HOMEWORK_COMMENT_RATE)) {
-			saveData(indexBaseMonthDataDao.getHomeworkData(dayStr, "comment",tenantId), monday.toString(), IndexDataType.HOMEWORK_COMMENT_RATE, tenantId);
-		}
+	//学员变动
+	public void studentChangeData(String dayStr,Integer tenantId,LocalDate nowDate){
+		saveData(indexBaseMonthDataDao.getAddStudentRegistrationData(dayStr,tenantId), dayStr, IndexDataType.ADD_STUDENT_REGISTRATION_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getMusicStudentData(dayStr, null,tenantId), dayStr, IndexDataType.MUSIC_GROUP_STUDENT, tenantId);
+		saveData(null, nowDate.toString(), IndexDataType.NEWLY_STUDENT_NUM, tenantId);
+		saveData(null, nowDate.toString(), IndexDataType.QUIT_MUSIC_GROUP_STUDENT_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getOtherStudentData(dayStr,tenantId), dayStr, IndexDataType.VIP_PRACTICE_STUDENT_NUM, tenantId);
+		saveData(indexBaseMonthDataDao.getVipPracticeAddStudentData(dayStr,tenantId), dayStr, IndexDataType.VIP_PRACTICE_ADD_STUDENT_NUM, tenantId);
+	}
 
-		//课程数据
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.MUSIC_GROUP_COURSE)) {
-			saveData(indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.MUSIC, null, null, null,tenantId), dayStr, IndexDataType.MUSIC_GROUP_COURSE, tenantId);
+	//云教练相关
+	public void cloudTeacherData(String dayStr,Integer tenantId){
+		//分部学员质量
+		saveData(indexBaseMonthDataDao.getOrgansStudentNumData(dayStr,tenantId), dayStr, IndexDataType.ORGAN_TOTAL_STUDENT_NUM, tenantId);
+		//会员数量
+		saveData(indexBaseMonthDataDao.getMemberStudentNumData(dayStr,tenantId), dayStr, IndexDataType.MEMBER_STUDENT_NUM, tenantId);
+		//新增会员数量
+		saveData(indexBaseMonthDataDao.getNewMemberStudentNumData(dayStr,tenantId), dayStr, IndexDataType.NEW_MEMBER_STUDENT_NUM, tenantId);
+		//试用会员数量
+		saveData(indexBaseMonthDataDao.getExperienceMemberStudentNumData(dayStr,tenantId), dayStr, IndexDataType.EXPERIENCE_MEMBER_STUDENT_NUM, tenantId);
+		//云教练使用用户
+		saveData(indexBaseMonthDataDao.getCloudStudyDayUseStudentNumData(dayStr,tenantId), dayStr, IndexDataType.CLOUD_STUDY_DAY_USE_STUDENT_NUM, tenantId);
+		//活跃用户
+		saveData(indexBaseMonthDataDao.getCloudStudyLivelyStudentNumData(dayStr,tenantId), dayStr, IndexDataType.CLOUD_STUDY_LIVELY_STUDENT_NUM, tenantId);
+		//云教练新增人数
+		saveData(indexBaseMonthDataDao.getCloudStudyNewStudentNumData(dayStr,tenantId), dayStr, IndexDataType.CLOUD_STUDY_NEW_STUDENT_NUM, tenantId);
+		//云教练新用户人数
+		List<Integer> studentIdList = studentRegistrationDao.findStudentIds(tenantId);
+		if(!CollectionUtils.isEmpty(studentIdList)){
+			saveData(studentDao.groupOrganId(null,studentIdList),LocalDate.now().toString(),IndexDataType.CLOUD_NEW_STUDENT_NUM, tenantId);
 		}
+	}
 
-		//小课数据统计
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(STUDENT_VIP_ORDER_NUM)) {
-			saveData(indexBaseMonthDataDao.getStudentVipOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_VIP_ORDER_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(STUDENT_THEORY_ORDER_NUM)) {
-			saveData(indexBaseMonthDataDao.getStudentTheoryOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_THEORY_ORDER_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(STUDENT_PRACTICE_ORDER_NUM)) {
-			saveData(indexBaseMonthDataDao.getStudentPracticeOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_PRACTICE_ORDER_NUM, tenantId);
-		}
+	@Override
+	public void indexBaseDataTask(Integer tenantId) {
+		LocalDate nowDate = LocalDate.now();
 
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.VIP_GROUP_COURSE)) {
-			List<IndexBaseMonthData> vipCourseData = indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.VIP, null, null, null,tenantId);
-			List<OrganVipGroupCategoryCourseNumDto> vipGroupCategoryCourseData = indexBaseMonthDataDao.getVipGroupCategoryCourseData(dayStr, null, null, GroupType.VIP, null, null, null,tenantId);
-			Map<Integer, Map<String, Integer>> organCategoryCourseMap = new HashMap<>();
-			if (!CollectionUtils.isEmpty(vipGroupCategoryCourseData)) {
-				organCategoryCourseMap = vipGroupCategoryCourseData.stream().collect(Collectors.groupingBy(OrganVipGroupCategoryCourseNumDto::getOrganId, Collectors.toMap(OrganVipGroupCategoryCourseNumDto::getCategoryName, o -> o.getCourseNum())));
-			}
-			for (IndexBaseMonthData vipCourseDatum : vipCourseData) {
-				if (organCategoryCourseMap.containsKey(vipCourseDatum.getOrganId())) {
-					vipCourseDatum.setExtendInfo(JSON.toJSONString(organCategoryCourseMap.get(vipCourseDatum.getOrganId())));
-				}
-			}
-			saveData(vipCourseData, dayStr, IndexDataType.VIP_GROUP_COURSE, tenantId);
-		}
+		List<Organization> allOrgans = organizationService.findAllOrgans(tenantId);
+		this.organIds.get().clear();
+		this.organIds.get().addAll(allOrgans.stream().map(Organization::getId).collect(Collectors.toSet()));
 
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.VIP_GROUP_ONLINE_COURSE)) {
-			List<IndexBaseMonthData> vipOnlineCourseData = indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.ONLINE, null,tenantId);
-			List<OrganVipGroupCategoryCourseNumDto> vipGroupOnlineCategoryCourseData = indexBaseMonthDataDao.getVipGroupCategoryCourseData(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.ONLINE, null,tenantId);
-			Map<Integer, Map<String, Integer>> organOnlineCategoryCourseMap = new HashMap<>();
-			if (!CollectionUtils.isEmpty(vipGroupOnlineCategoryCourseData)) {
-				organOnlineCategoryCourseMap = vipGroupOnlineCategoryCourseData.stream().collect(Collectors.groupingBy(OrganVipGroupCategoryCourseNumDto::getOrganId, Collectors.toMap(OrganVipGroupCategoryCourseNumDto::getCategoryName, o -> o.getCourseNum())));
-			}
-			for (IndexBaseMonthData vipCourseDatum : vipOnlineCourseData) {
-				if (organOnlineCategoryCourseMap.containsKey(vipCourseDatum.getOrganId())) {
-					vipCourseDatum.setExtendInfo(JSON.toJSONString(organOnlineCategoryCourseMap.get(vipCourseDatum.getOrganId())));
-				}
-			}
-			saveData(vipOnlineCourseData, dayStr, IndexDataType.VIP_GROUP_ONLINE_COURSE, tenantId);
-		}
+		String dayStr = nowDate.plusDays(-1).toString();
 
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.VIP_GROUP_OFFLINE_COURSE)) {
-			List<IndexBaseMonthData> vipOfflineCourseData = indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.OFFLINE, null,tenantId);
-			List<OrganVipGroupCategoryCourseNumDto> vipGroupOfflineCategoryCourseData = indexBaseMonthDataDao.getVipGroupCategoryCourseData(dayStr, null, null, GroupType.VIP, null, TeachModeEnum.OFFLINE, null,tenantId);
-			Map<Integer, Map<String, Integer>> organOfflineCategoryCourseMap = new HashMap<>();
-			if (!CollectionUtils.isEmpty(vipGroupOfflineCategoryCourseData)) {
-				organOfflineCategoryCourseMap = vipGroupOfflineCategoryCourseData.stream().collect(Collectors.groupingBy(OrganVipGroupCategoryCourseNumDto::getOrganId, Collectors.toMap(OrganVipGroupCategoryCourseNumDto::getCategoryName, o -> o.getCourseNum())));
-			}
-			for (IndexBaseMonthData vipCourseDatum : vipOfflineCourseData) {
-				if (organOfflineCategoryCourseMap.containsKey(vipCourseDatum.getOrganId())) {
-					vipCourseDatum.setExtendInfo(JSON.toJSONString(organOfflineCategoryCourseMap.get(vipCourseDatum.getOrganId())));
-				}
-			}
-			saveData(vipOfflineCourseData, dayStr, IndexDataType.VIP_GROUP_OFFLINE_COURSE, tenantId);
-		}
+		LocalDate day = LocalDate.parse(dayStr, DateUtil.dateFormatter);
+		LocalDate monday = day.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
 
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.PRACTICE_GROUP_COURSE)) {
-			saveData(indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.PRACTICE, null, null, null,tenantId), dayStr, IndexDataType.PRACTICE_GROUP_COURSE, tenantId);
-		}
+		List<Runnable> tasks = new ArrayList<>();
 
 		//学员变动
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.ADD_STUDENT_REGISTRATION_NUM)) {
-			saveData(indexBaseMonthDataDao.getAddStudentRegistrationData(dayStr,tenantId), dayStr, IndexDataType.ADD_STUDENT_REGISTRATION_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.MUSIC_GROUP_STUDENT)) {
-			saveData(indexBaseMonthDataDao.getMusicStudentData(dayStr, null,tenantId), dayStr, IndexDataType.MUSIC_GROUP_STUDENT, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.NEWLY_STUDENT_NUM)) {
-			saveData(null, nowDate.toString(), IndexDataType.NEWLY_STUDENT_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.QUIT_MUSIC_GROUP_STUDENT_NUM)) {
-			saveData(null, nowDate.toString(), IndexDataType.QUIT_MUSIC_GROUP_STUDENT_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.VIP_PRACTICE_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getOtherStudentData(dayStr,tenantId), dayStr, IndexDataType.VIP_PRACTICE_STUDENT_NUM, tenantId);
-		}
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.VIP_PRACTICE_ADD_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getVipPracticeAddStudentData(dayStr,tenantId), dayStr, IndexDataType.VIP_PRACTICE_ADD_STUDENT_NUM, tenantId);
-		}
+		tasks.add(() -> this.studentChangeData(dayStr, tenantId, nowDate));
+
+		//小课数据统计
+		tasks.add(() -> this.smallCourseData(dayStr, tenantId));
 
 		//云教练相关
-		//分部学员数量
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.ORGAN_TOTAL_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getOrgansStudentNumData(dayStr,tenantId), dayStr, IndexDataType.ORGAN_TOTAL_STUDENT_NUM, tenantId);
-		}
+		tasks.add(() -> this.cloudTeacherData(dayStr, tenantId));
 
-		//会员数量
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.MEMBER_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getMemberStudentNumData(dayStr,tenantId), dayStr, IndexDataType.MEMBER_STUDENT_NUM, tenantId);
-		}
+		//课程数据
+		tasks.add(() -> this.courseData(dayStr, tenantId));
 
-		//新增会员数量
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.NEW_MEMBER_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getNewMemberStudentNumData(dayStr,tenantId), dayStr, IndexDataType.NEW_MEMBER_STUDENT_NUM, tenantId);
-		}
+		//业务数据
+		tasks.add(() -> this.businessData(dayStr, tenantId, monday));
 
-		//试用会员数量
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.EXPERIENCE_MEMBER_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getExperienceMemberStudentNumData(dayStr,tenantId), dayStr, IndexDataType.EXPERIENCE_MEMBER_STUDENT_NUM, tenantId);
-		}
+		//学员数据
+		tasks.add(() -> this.studentData(dayStr, tenantId, nowDate));
 
-		//云教练使用用户
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.CLOUD_STUDY_DAY_USE_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getCloudStudyDayUseStudentNumData(dayStr,tenantId), dayStr, IndexDataType.CLOUD_STUDY_DAY_USE_STUDENT_NUM, tenantId);
-		}
+		//运营数据
+		tasks.add(() -> this.operateData(dayStr, tenantId));
 
-		//活跃用户
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.CLOUD_STUDY_LIVELY_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getCloudStudyLivelyStudentNumData(dayStr,tenantId), dayStr, IndexDataType.CLOUD_STUDY_LIVELY_STUDENT_NUM, tenantId);
-		}
+		//人事数据
+		tasks.add(() -> this.personnelData(dayStr, tenantId));
 
-		//云教练新增人数
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.CLOUD_STUDY_NEW_STUDENT_NUM)) {
-			saveData(indexBaseMonthDataDao.getCloudStudyNewStudentNumData(dayStr,tenantId), dayStr, IndexDataType.CLOUD_STUDY_NEW_STUDENT_NUM, tenantId);
-		}
+		//剩余课时
+		tasks.add(() -> this.subCourseData(dayStr, tenantId));
 
-		//云教练新用户人数
-		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.CLOUD_NEW_STUDENT_NUM)) {
-			List<Integer> studentIdList = studentRegistrationDao.findStudentIds(tenantId);
-			if(!CollectionUtils.isEmpty(studentIdList)){
-				saveData(studentDao.groupOrganId(null,studentIdList),LocalDate.now().toString(),IndexDataType.CLOUD_NEW_STUDENT_NUM, tenantId);
-			}
-		}
+		//已消耗课时
+		tasks.add(() -> this.consumeCourseData(dayStr, tenantId));
+
+		this.runByBewTransactional(tasks);
 	}
 
 	/**
@@ -803,6 +773,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 
 	@Override
 	public Map<String, Object> getIndexErrData(String organIdsStr, IndexErrorType errorType) {
+		businessLogger.info("getIndexErrData-----organIdsStr:{},errorType:{}",organIdsStr,errorType);
 		//只筛选指定时间之后的数据
 		Date date = new Date();
 		String startTime = DateUtil.format(DateUtil.getFirstDayOfMonth(DateUtil.addMonths(date, -1)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
@@ -826,36 +797,38 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		Integer educationId = educationUserId;
 		List<Long> classGroupIdList = classGroupIds;
 		Integer tenantId = TenantContextHolder.getTenantId();
+		List<Runnable> tasks;
 		if(IndexErrorType.MUSIC_PATROL.equals(errorType)){
 			IndexErrInfoDto<IndexErrInfoDto> one = new IndexErrInfoDto<>();
 			one.setErrorType(IndexErrorType.MUSIC_PATROL);
 			one.setDesc(IndexErrorType.MUSIC_PATROL.getMsg());
 			List<IndexErrInfoDto> oneChild = new ArrayList<>();
+			tasks = new ArrayList<>();
 			//基础技能班学员数量异常
-			CompletableFuture future1 = this.async(()->{
+			tasks.add(()->{
 					oneChild.add(new IndexErrInfoDto(IndexErrorType.HIGH_CLASS_STUDENT_LESS_THAN_THREE,
 						indexBaseMonthDataDao.countLessThenThreeClassGroupNum(organIdList,educationId,tenantId,false)));
 			});
 			//乐团巡查事项异常
-			CompletableFuture future2 = this.async(()->{
+			tasks.add(()->{
 					oneChild.add(new IndexErrInfoDto(IndexErrorType.MUSIC_PATROL_ITEM,
 						indexBaseMonthDataDao.queryErrInspection(organIdList,startTime,tenantId)));
 			});
 			//未加入任何班级学员
-			CompletableFuture future3 = this.async(()-> {
+			tasks.add(()-> {
 				IndexErrInfoDto noClassMusicGroupStudentInfo = indexBaseMonthDataDao.getNoClassMusicGroupStudentInfo(organIdList,educationId,tenantId,true);
 				noClassMusicGroupStudentInfo.setErrorType(IndexErrorType.NO_CLASS_MUSIC_GROUP_STUDENT_ERROR);
 				noClassMusicGroupStudentInfo.setDesc(IndexErrorType.NO_CLASS_MUSIC_GROUP_STUDENT_ERROR.getMsg());
 				oneChild.add(noClassMusicGroupStudentInfo);
 			});
             //学校巡堂
-            CompletableFuture future4 = this.async(()-> {
+			tasks.add(()-> {
                 IndexErrInfoDto schoolPatrolError = indexBaseMonthDataDao.getSchoolPatrolError(organIdList,tenantId);
                 schoolPatrolError.setErrorType(IndexErrorType.SCHOOL_PATROL);
                 schoolPatrolError.setDesc(IndexErrorType.SCHOOL_PATROL.getMsg());
                 oneChild.add(schoolPatrolError);
             });
-			future1.join();future2.join();future3.join();future4.join();
+			this.runByBewTransactional(tasks);
 			one.setNum(oneChild.stream().mapToInt(IndexErrInfoDto::getNum).sum());
 			one.setResult(oneChild);
 			all.add(one);
@@ -867,17 +840,25 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			two.setErrorType(IndexErrorType.STUDENT_INFO);
 			two.setDesc(IndexErrorType.STUDENT_INFO.getMsg());
 			List<IndexErrInfoDto> twoChild = new ArrayList<>();
+			tasks = new ArrayList<>();
+			Date now = new Date();
 			//学员请假异常提醒(只提醒本月的异常)
-			CompletableFuture future1 = this.async(() -> {
+			tasks.add(() -> {
 				int studentErrorLeave = 0;
 				String studentErrorLeaveNum = sysTenantConfigService.getTenantConfigValue(SysConfigService.STUDENT_ERROR_LEAVE_NUM, tenantId);
 				if (StringUtils.isNotEmpty(studentErrorLeaveNum)) {
-					String format1 = DateUtil.format(new Date(), DateUtil.ISO_YEAR_MONTH_FORMAT);
-					studentErrorLeave = indexBaseMonthDataDao.countStudentErrorLeave(organIdList, format1, classGroupIdList, Integer.parseInt(studentErrorLeaveNum), tenantId);
+					String firstDay = DateUtil.format(DateUtil.getFirstDayOfMonth(now), DateUtil.ISO_YEAR_MONTH_FORMAT);
+					String lastDay = DateUtil.format(DateUtil.getLastDayOfMonth(now), DateUtil.ISO_YEAR_MONTH_FORMAT);
+					studentErrorLeave = indexBaseMonthDataDao.countStudentErrorLeave(organIdList,
+							firstDay,
+							lastDay,
+							classGroupIdList,
+							Integer.parseInt(studentErrorLeaveNum),
+							tenantId);
 				}
 				twoChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_ERROR_LEAVE,studentErrorLeave));
 			});
-			CompletableFuture future2 = this.async(() -> {
+			tasks.add(() -> {
 				//未缴费学员数
 				twoChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_ARREARAGE,
 						indexBaseMonthDataDao.countNoPaymentStudentNum(organIdList,educationId,tenantId,true), Arrays.asList(educationId)));
@@ -889,14 +870,14 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			});
 
 			//合作单位回款异常
-			CompletableFuture future3 = this.async(() -> {
+			tasks.add(() -> {
 				Map<String, Object> params1 = new HashMap<>();
 				params1.put("organId", organIdsStr);
 				params1.put("errorType", "COOPERATION_PAYMENT_ERROR");
 				twoChild.add(new IndexErrInfoDto(IndexErrorType.COOPERATION_PAYMENT_ERROR
 						, musicGroupCalenderRefundPeriodDao.countCoopRefund(params1)));
 			});
-			future1.join();future2.join();future3.join();
+			this.runByBewTransactional(tasks);
 			two.setNum(twoChild.stream().mapToInt(IndexErrInfoDto::getNum).sum());
 			two.setResult(twoChild);
 			all.add(two);
@@ -913,24 +894,24 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 				userId = sysUser.getId();
 			}
 			Integer userId1 = userId;
-			CompletableFuture future1 = this.async(() -> {
+			tasks = new ArrayList<>();
+			tasks.add(() -> {
 				//乐团巡查任务未计划
 				int inspectionItem = indexBaseMonthDataDao.queryInspectionItem(organIdsStr,startTime,userId1,tenantId);
 				threeChild.add(new IndexErrInfoDto(IndexErrorType.INSPECTION_ITEM,inspectionItem));
 			});
-			CompletableFuture future2 = this.async(() -> {
+			tasks.add(() -> {
 				//乐团巡查任务未提交
 				int inspectionItemPlan = indexBaseMonthDataDao.queryInspectionItemPlan(organIdsStr,startTime,tenantId);
 				threeChild.add(new IndexErrInfoDto(IndexErrorType.INSPECTION_ITEM_PLAN,inspectionItemPlan));
 
 			});
-			CompletableFuture future3 = this.async(() -> {
+			tasks.add(() -> {
 				//回访任务未完成
 				int studentVisit = indexBaseMonthDataDao.queryStudentVisit(organIdsStr,startTime,userId1,tenantId);
 				threeChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_VISIT,studentVisit));
 			});
-			future1.join();future2.join();future3.join();
-
+			this.runByBewTransactional(tasks);
 			three.setNum(threeChild.stream().mapToInt(IndexErrInfoDto::getNum).sum());
 			three.setResult(threeChild);
 			all.add(three);
@@ -941,8 +922,8 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			four.setErrorType(IndexErrorType.ATTENDANCE_SERVE);
 			four.setDesc(IndexErrorType.ATTENDANCE_SERVE.getMsg());
 			List<IndexErrInfoDto> fourChild = new ArrayList<>();
-
-			CompletableFuture future1 = this.async(() -> {
+			tasks = new ArrayList<>();
+			tasks.add(() -> {
 				String month = DateUtil.format(date,DateUtil.ISO_YEAR_MONTH_FORMAT);
 				//当月排课异常: (1)剩余课时(未开始+排课资格)4的学员,本月排课节数少于4节
 				int currentCourseError = indexBaseMonthDataDao.getCurrentCourseError(month,organIdList);
@@ -951,14 +932,14 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			CompletableFuture future2 = null;
 			CompletableFuture future3 = null;
 			if(classGroupIds == null || classGroupIds.size() > 0) {
-				future2 = this.async(() -> {
+				tasks.add(() -> {
 					//课程考勤异常
 					int teacherAttendanceError = indexBaseMonthDataDao.getTeacherAttendanceError(organIdList, startTime, classGroupIdList, tenantId);
 					int studentAttendanceError = indexBaseMonthDataDao.getStudentAttendanceError(organIdList, startTime, classGroupIdList, tenantId);
 					fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_EXCEPTION_ATTENDANCE, teacherAttendanceError));
 					fourChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_EXCEPTION_ATTENDANCE, studentAttendanceError));
 				});
-				future3 = this.async(() -> {
+				tasks.add(() -> {
 					int noAttendance = indexBaseMonthDataDao.getNoAttendance(organIdList, startTime, classGroupIdList, tenantId);
 					//课程异常
 					fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_NOT_A_CLASS, noAttendance));
@@ -969,10 +950,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 				//课程异常
 				fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_NOT_A_CLASS, 0));
 			}
-			if(classGroupIds == null || classGroupIds.size() > 0) {
-				future2.join();future3.join();
-			}
-			future1.join();
+			this.runByBewTransactional(tasks);
 			four.setNum(fourChild.stream().mapToInt(IndexErrInfoDto::getNum).sum());
 			four.setResult(fourChild);
 			all.add(four);
@@ -1346,8 +1324,14 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			int studentErrorLeave = 0;
 			String studentErrorLeaveNum = sysTenantConfigService.getTenantConfigValue(SysConfigService.STUDENT_ERROR_LEAVE_NUM, tenantId);
 			if(StringUtils.isNotEmpty(studentErrorLeaveNum)){
-				String format1 = DateUtil.format(new Date(), DateUtil.ISO_YEAR_MONTH_FORMAT);
-				studentErrorLeave = indexBaseMonthDataDao.countStudentErrorLeave(organIds, format1, classGroupIds,Integer.parseInt(studentErrorLeaveNum), tenantId);
+				String firstDay = DateUtil.format(DateUtil.getFirstDayOfMonth(date), DateUtil.ISO_YEAR_MONTH_FORMAT);
+				String lastDay = DateUtil.format(DateUtil.getLastDayOfMonth(date), DateUtil.ISO_YEAR_MONTH_FORMAT);
+				studentErrorLeave = indexBaseMonthDataDao.countStudentErrorLeave(organIds,
+						firstDay,
+						lastDay,
+						classGroupIds,
+						Integer.parseInt(studentErrorLeaveNum),
+						tenantId);
 			}
 			if(studentErrorLeave > 0){
 				flag2 = true;

+ 16 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -3407,10 +3407,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         Set<Integer> educationalTeacherIds = musicGroupList.stream().map(e -> e.getEducationalTeacherId()).collect(Collectors.toSet());
         Map<Integer, String> educationalTeacherNameMap = MapUtil.convertMybatisMap(teacherDao.queryNameByIds(StringUtils.join(educationalTeacherIds, ",")));
 
-        // 获取运营主管编号列表
-        //Set<Integer> teamTeacherIds = musicGroupList.stream().map(e -> e.getTeamTeacherId()).collect(Collectors.toSet());
-        //Map<Integer, String> teamTeacherNameMap = MapUtil.convertMybatisMap(teacherDao.queryNameByIds(StringUtils.join(teamTeacherIds, ",")));
-
         // 获取乐队指导编号列表
         Set<Integer> directorUserIds = musicGroupList.stream().map(e -> e.getDirectorUserId()).collect(Collectors.toSet());
         directorUserIds.removeAll(Collections.singleton(null));
@@ -3432,7 +3428,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         // 获取乐团编号列表
         Set<String> musicGroupIds = musicGroupList.stream().map(e -> e.getId()).collect(Collectors.toSet());
 
-        Map<String, Integer> payNumMap = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(studentRegistrationDao.countNormalNum(StringUtils.join(musicGroupIds, ",")))), HashMap.class);
+//        Map<String, Integer> payNumMap = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(studentRegistrationDao.countNormalNum(StringUtils.join(musicGroupIds, ",")))), HashMap.class);
 
 
         Map<String, BigDecimal> chargeStandardMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.queryChargeStandard(StringUtils.join(musicGroupIds, ",")));
@@ -3447,16 +3443,26 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         Map<String, Integer> purchaseListMap = musicGroupPurchaseListCount.stream().collect(Collectors.toMap(MusicGroupPurchaseList::getMusicGroupId, MusicGroupPurchaseList::getPurchaseNum));
 
         Map<String, Boolean> viewRegButtonMap = studentRegistrationService.checkMusicGroupsRegOrPayStatus(new ArrayList<>(musicGroupIds));
+		List<MusicGroup> instrument = studentRegistrationDao.countInstrument(new ArrayList<>(musicGroupIds));
+		Map<String, List<MusicGroup>> collect = new HashMap<>();
+		if (instrument != null && instrument.size() > 0) {
+			collect = instrument.stream().collect(Collectors.groupingBy(MusicGroup::getId));
+		}
         //获取分部名称map
         for (MusicGroup e : musicGroupList) {
-//            e.setSchoolName(schoolNameMap.get(e.getSchoolId()));
+			List<MusicGroup> musicGroups = collect.get(e.getId());
+			if (CollectionUtils.isNotEmpty(musicGroups)) {
+				MusicGroup musicGroup1 = musicGroups.get(0);
+				e.setPayNum(musicGroup1.getPayNum());
+				e.setHasInstrumentNum(musicGroup1.getHasInstrumentNum());
+				e.setMemberNum(musicGroup1.getMemberNum());
+				e.setNotMemberNum(e.getPayNum() - e.getMemberNum());
+			}
             e.setOrganName(organNames.get(e.getOrganId()));
             e.setCooperationOrganName(cooperationOrganNames.get(e.getCooperationOrganId()));
             e.setEducationalTeacherName(educationalTeacherNameMap.get(e.getEducationalTeacherId()));
-            //e.setTeamTeacherName(teamTeacherNameMap.get(e.getTeamTeacherId()));
             e.setRepairUserName(repairUserNameMap.get(e.getRepairUserId()));
             e.setDirectorUserName(directorUserNameMap.get(e.getDirectorUserId()));
-            e.setPayNum(payNumMap.get(e.getId()) == null ? 0 : payNumMap.get(e.getId()));
             e.setGroupMemberNum(e.getGroupMemberNum() == null ? 0 : e.getGroupMemberNum());
             e.setHasVerifyMusicalList(purchaseListMap.get(e.getId()) != null);
             if (e.getStatus().equals(MusicGroupStatusEnum.PREPARE) || e.getStatus().equals(MusicGroupStatusEnum.PROGRESS)) {
@@ -3491,6 +3497,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                         MusicGroup musicGroup1 = musicGroups.get(0);
                         musicGroup.setPayNum(musicGroup1.getPayNum());
                         musicGroup.setHasInstrumentNum(musicGroup1.getHasInstrumentNum());
+						musicGroup.setMemberNum(musicGroup1.getMemberNum());
+						musicGroup.setNotMemberNum(musicGroup.getPayNum() - musicGroup.getMemberNum());
                     }
                 }
             }

+ 16 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrderPayOpsServiceImpl.java

@@ -98,15 +98,6 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
             throw new Exception("PaymentParam query is null");
         }
         
-        StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findOrderByOrderNo(payParam.getOrderNo());
-        if(studentPaymentOrder == null) {
-        	throw new BizException("参数错误");
-        }
-        
-        payParam.setPayerName(studentPaymentOrder.getPaymentChannel());
-        
-        //签名验证
-        checkSing(payParam);
         //返回值
         Map<String, Object> payment;
 
@@ -116,6 +107,17 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
             //主动延迟检查订单
             delayCheckTenant();
         } else {
+            
+            StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findOrderByOrderNo(payParam.getOrderNo());
+            if(studentPaymentOrder == null) {
+            	throw new BizException("参数错误");
+            }
+            
+            payParam.setPayerName(studentPaymentOrder.getPaymentChannel());
+
+            //签名验证
+            checkSing(payParam);
+            
             //如果以上操作都没有 则应该是这一个,因为老代码就是这样写的。
             payment = student(payParam);
         }
@@ -160,7 +162,12 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         if (tenantOrderRecord.getOrderState() != 0) {
             throw new BizException("订单已处理!");
         }
+        payParam.setPayerName(tenantOrderRecord.getPaymentChannel());
         payParam.setMerNo(tenantOrderRecord.getMerNos());
+
+        //签名验证
+        checkSing(payParam);
+        
         //获取支付数据
         Map<String, Object> payment;
         try {

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

@@ -160,7 +160,7 @@ public class PayServiceImpl implements PayService {
 	        	
 	        	//String merNo = sysConfigDao.findConfigValue(SysConfigService.PLATFORM_PAYEE_ACCOUNT);
 				//乐小雅收款
-				Integer routeOrganId = 123;
+				Integer routeOrganId = 1;
 				
 				HfMember receiverMember = hfMemberDao.getByOrganId(routeOrganId, paymentChannelStr);
 				
@@ -210,12 +210,12 @@ public class PayServiceImpl implements PayService {
 		List<Integer> ignoreOrganList = Arrays.asList(4, 55, 59);
 		
 		//查询商品收款账户配置
-        String goodsSellReceiptMerNo = sysConfigDao.findConfigValue("goodsSellReceiptMerNo");
+        String goodsSellReceiptOrganId = sysConfigDao.findConfigValue("goodsSellReceiptOrganId");
         
-        if(!ignoreOrganList.contains(organId) && StringUtils.isNotBlank(goodsSellReceiptMerNo)){
+        if(!ignoreOrganList.contains(organId) && StringUtils.isNotBlank(goodsSellReceiptOrganId)){
 			
         	//根据商户号查询对应分部
-        	SysPaymentConfig sysPaymentConfig = sysPaymentConfigService.findPaymentConfigByMerNo(StringUtils.trim(goodsSellReceiptMerNo));
+        	SysPaymentConfig sysPaymentConfig = sysPaymentConfigService.findPaymentConfigByOrganId(paymentChannel, Integer.parseInt(goodsSellReceiptOrganId));
         	
         	if(sysPaymentConfig != null){
 
@@ -377,7 +377,7 @@ public class PayServiceImpl implements PayService {
     	            studentPaymentRouteOrder.setFeeFlag("Y");
     	            studentPaymentRouteOrder.setRouteAmount(subCashAmount);
     	            studentPaymentRouteOrder.setRouteBalanceAmount(subBalance);
-    	            studentPaymentRouteOrder.setMerNo(goodsSellReceiptMerNo);
+    	            studentPaymentRouteOrder.setMerNo(sysPaymentConfig.getHfMerNo());
     	            studentPaymentRouteOrder.setSaleAmount(BigDecimal.ZERO);
     	            studentPaymentRouteOrder.setServiceAmount(subCashAmount);
     	            studentPaymentRouteOrder.setTenantId(tenantId);
@@ -392,7 +392,7 @@ public class PayServiceImpl implements PayService {
     	            routeScaleDtoForGoodsSell.setPayType(PaymentChannelEnum.ADAPAY);
     	            routeScaleDtoForGoodsSell.setFeeType(FeeTypeEnum.SERVICE);
     	            routeScaleDtoForGoodsSell.setScale(100);
-    	            routeScaleDtoForGoodsSell.setMerNo(goodsSellReceiptMerNo);
+    	            routeScaleDtoForGoodsSell.setMerNo(sysPaymentConfig.getHfMerNo());
     	            routeScaleDtoForGoodsSell.setFeeFlag("Y");
         		}
         	}

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

@@ -222,7 +222,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private StudentDao studentDao;
     @Autowired
     private SysUserCashAccountDetailService sysUserCashAccountDetailService;
-	
+    
     @Autowired
     private YeepayPaymentService yeepayPaymentService;
     @Autowired

+ 6 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java

@@ -200,9 +200,13 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
             StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
             studentPaymentOrder.setActualAmount(studentPaymentRouteOrder.getRouteAmount());
             if(studentPaymentRouteOrder.getSchoolId() != null) {
-                studentPaymentOrder.setMusicGroupId(studentPaymentRouteOrder.getSchoolId() + "");
+                studentPaymentOrder.setCooperationId(studentPaymentRouteOrder.getSchoolId());
+            }
+            if(studentPaymentRouteOrder.getCalenderId() != null){
+                MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(studentPaymentRouteOrder.getCalenderId());
+                studentPaymentOrder.setMusicGroupId(calender.getMusicGroupId());
+                studentPaymentOrder.setCalenderId(studentPaymentRouteOrder.getCalenderId());
             }
-            studentPaymentOrder.setCalenderId(studentPaymentRouteOrder.getCalenderId());
             studentPaymentOrder.setType(studentPaymentRouteOrder.getType());
             studentPaymentOrder.setMerNos(studentPaymentRouteOrder.getMerNo());
             studentPaymentOrder.setOrderNo(studentPaymentRouteOrder.getOrderNo());

+ 15 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -337,13 +337,17 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void updateStudentTeacherAndSubject() {
+    public void updateNewStudentStatus() {
         //更新新学员状态
         List<Integer> newStudentIds = studentDao.getHasVipCourseStudentIdsFromNewStudents();
-        if(!CollectionUtils.isEmpty(newStudentIds)){
+        if (!CollectionUtils.isEmpty(newStudentIds)) {
             studentDao.updateNewStudentsToOld(newStudentIds);
         }
+    }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateStudentSubject() {
         List<Student> noTeacherOrNoSubjectStudent = studentDao.getNoTeacherOrNoSubjectStudent();
         if (CollectionUtils.isEmpty(noTeacherOrNoSubjectStudent)) {
             return;
@@ -362,9 +366,6 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
             }
             List<StudentClassInfoDto> studentClassInfoDtos = scm.get(student.getUserId());
             StudentClassInfoDto studentClassInfoDto = studentClassInfoDtos.stream().max(Comparator.comparing(StudentClassInfoDto::getClassGroupId)).get();
-//            if (Objects.isNull(student.getTeacherId())) {
-//                student.setTeacherId(studentClassInfoDto.getMainTeacherId());
-//            }
             if (StringUtils.isBlank(student.getSubjectIdList())) {
                 student.setSubjectIdList(studentClassInfoDto.getSubjectId().toString());
             }
@@ -378,6 +379,15 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         }
     }
 
+
+    @Override
+    public void updateStudentTeacherAndSubject() {
+        //更新新学员状态
+        this.updateNewStudentStatus();
+        //更新学员声部
+        this.updateStudentSubject();
+    }
+
     @Override
     public CooperationOrgan getStudentEduTeacher(Integer userId) {
         CooperationOrgan cooperationOrgan = musicGroupDao.findUserMusicGroupCooperationOrgan(userId);

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

@@ -969,11 +969,21 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
     @Override
     public TenantOrderRecord createOrderRecord(Integer tenantId, BigDecimal payAmount, String orderNo, TenantOrderRecordEnum
             tenantEnum, Integer orderState, String merNos) {
+    	
+    	//获取支付渠道
+		String paymentChannelStr = sysConfigDao.findConfigValue(SysConfigService.PAYMENT_CHANNEL);
+		
+		if(StringUtils.isBlank(paymentChannelStr)) {
+			paymentChannelStr = PaymentChannelEnum.ADAPAY.getCode();
+		}
+		
+		PaymentChannelEnum paymentChannel = PaymentChannelEnum.codeOf(paymentChannelStr);
+    			
         TenantOrderRecord record = new TenantOrderRecord();
         record.setTenantId(tenantId);
         record.setOrderNo(orderNo);
         record.setOrderType(tenantEnum.getCode());
-        record.setPaymentChannel(PaymentChannelEnum.ADAPAY.getCode());
+        record.setPaymentChannel(paymentChannel.getCode());
         record.setExpectAmount(payAmount);
         record.setActualAmount(payAmount);
         record.setOrderState(orderState);

+ 0 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantOrderRecordServiceImpl.java

@@ -574,17 +574,6 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
 			return e.getMessage();
 		}
 
-		// 验签请参data
-		String data = request.getParameter("data");
-		// 验签请参sign
-		String sign = request.getParameter("sign");
-		log.info("tenant callback request param:{}", data);
-		try {
-
-		} catch (Exception e) {
-			log.error("error tenant callback request param:{}", data);
-			return e.getMessage();
-		}
 		return "succeeded";
 	}
 

+ 14 - 18
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -296,13 +296,23 @@
         LEFT JOIN music_group mg ON cgtm.music_group_id_ = mg.id_
         LEFT JOIN class_group cg ON cg.id_ = cgtm.class_group_id_
         LEFT JOIN teacher t ON t.id_ = cgtm.user_id_
-        LEFT JOIN course_schedule cs ON (FIND_IN_SET(cs.class_group_id_,cg.id_) AND CONCAT(cs.class_date_,' ',cs.start_class_time_) > NOW())
-        WHERE cgtm.user_id_ = #{search} AND cg.del_flag_ = 0 AND cg.group_type_ = 'MUSIC' AND cs.pre_course_flag_ = 0
+        LEFT JOIN course_schedule cs ON cs.class_group_id_ = cg.id_ AND CONCAT(cs.class_date_,' ',cs.start_class_time_) > NOW() AND cs.pre_course_flag_ = 0
+        <include refid="queryGroupCoursesSql"/>
+        GROUP BY cgtm.id_
+        <include refid="global.limit"/>
+    </select>
+    <sql id="queryGroupCoursesSql">
+        WHERE cgtm.user_id_ = #{search} AND cg.del_flag_ = 0 AND cg.group_type_ = 'MUSIC'
         <if test="status != null">
             AND mg.status_ = #{status}
         </if>
-        GROUP BY cgtm.id_
-        <include refid="global.limit"/>
+    </sql>
+    <select id="countGroupCourses" resultType="java.lang.Integer">
+        SELECT COUNT(DISTINCT cgtm.id_)
+        FROM class_group_teacher_mapper cgtm
+        LEFT JOIN music_group mg ON cgtm.music_group_id_ = mg.id_
+        LEFT JOIN class_group cg ON cg.id_ = cgtm.class_group_id_
+        <include refid="queryGroupCoursesSql"/>
     </select>
 
 
@@ -413,9 +423,6 @@
             <if test="userId != null">
                 AND cgsm.user_id_ = #{userId}
             </if>
-            <if test="tenantId != null">
-                AND cgsm.tenant_id_ = #{tenantId}
-            </if>
             <if test="search != null and search != ''">
                 AND cg.name_ LIKE CONCAT('%',#{search},'%')
             </if>
@@ -784,17 +791,6 @@
         GROUP BY
         vg.id_,cg.id_
     </select>
-    <select id="countGroupCourses" resultType="java.lang.Integer">
-        SELECT COUNT(DISTINCT cgtm.id_)
-        FROM class_group_teacher_mapper cgtm
-        LEFT JOIN music_group mg ON cgtm.music_group_id_ = mg.id_
-        LEFT JOIN class_group cg ON cg.id_ = cgtm.class_group_id_
-        LEFT JOIN teacher t ON t.id_ = cgtm.user_id_
-        WHERE cgtm.user_id_ = #{search} AND cg.del_flag_ = 0 AND cg.group_type_ = 'MUSIC'
-        <if test="status != null">
-            AND mg.status_ = #{status}
-        </if>
-    </select>
     <select id="findStudentOrganIdsByClassGroup" resultType="int">
         SELECT
         DISTINCT su.organ_id_

+ 11 - 1
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -46,6 +46,7 @@
         <result column="settlement_report_flag_" property="settlementReportFlag"/>
         <result column="service_provider_" property="serviceProvider"/>
         <result column="mute_all_" property="muteAll"/>
+        <result column="cancel_mute_flag_" property="cancelMuteFlag"/>
         <result column="live_remind_" property="liveRemind"/>
         <result column="live_room_id_" property="liveRoomId" />
         <result column="continuous_course_" property="continuousCourse" />
@@ -189,6 +190,7 @@
         cs.evaluate_flag_,
         cs.service_provider_,
         cs.mute_all_,
+        cs.cancel_mute_flag_,
         cs.live_room_id_,
         cs.continuous_course_,
         cs.share_mode_
@@ -1416,6 +1418,7 @@
                     leave_student_num_ = #{item.leaveStudentNum},
                 </if>
                 schoole_id_ = #{item.schoolId},
+                service_provider_ = #{item.serviceProvider},
                 <if test="item.schoolId == null">
                     schoole_id_ = null,
                 </if>
@@ -4284,8 +4287,15 @@
     <!--更新全员静音状态-->
     <update id="updateGroupMuteAllStatus">
         UPDATE course_schedule
-        SET mute_all_ = #{muteAll},
+        <set>
+            <if test="muteAll != null">
+                mute_all_ = #{muteAll},
+            </if>
+            <if test="cancelMute != null">
+                cancel_mute_flag_ = #{cancelMute},
+            </if>
             update_time_ = NOW()
+        </set>
         WHERE id_ = #{courseScheduleId}
     </update>
     <!--更新全员静音状态-->

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml

@@ -1699,7 +1699,7 @@
 		SELECT COUNT(DISTINCT c.user_id_) FROM (
 		SELECT sa.user_id_ FROM student_attendance sa
 		LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
-		WHERE DATE_FORMAT(cs.class_date_,'%Y-%m') = #{format} AND sa.status_ = 'LEAVE' AND cs.pre_course_flag_ = 0 and cs.tenant_id_ = #{tenantId}
+		WHERE cs.class_date_ BETWEEN #{firstDay} AND #{lastDay} AND sa.status_ = 'LEAVE' AND cs.pre_course_flag_ = 0 and cs.tenant_id_ = #{tenantId}
 		<if test="organIdList != null and organIdList.size > 0">
 			AND cs.organ_id_ IN
 			<foreach collection="organIdList" open="(" close=")" item="item" separator=",">

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

@@ -700,6 +700,7 @@
         <result column="routeBalance" property="routeBalance"/>
         <result column="feeFlag" property="feeFlag"/>
         <result column="orderAmount" property="orderAmount"/>
+        <result column="cooperation_id_" property="cooperationId"/>
         <collection property="orderDetailList" ofType="com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail">
             <result column="detail_id_" property="id"/>
             <result column="detail_type_" property="type"/>
@@ -739,7 +740,7 @@
     <select id="ExportQueryPage" resultMap="orderAndDetail" parameterType="map">
         SELECT spo.*,u.username_,spod.id_ detail_id_,spod.type_ detail_type_,spod.price_
         detail_price_,spod.kit_group_purchase_type_ detail_kit_group_purchase_type_,
-        sci.charge_type_,g.id_ goods_id, g.name_ goods_name,o.name_ organ_name
+        sci.charge_type_,g.id_ goods_id, g.name_ goods_name,o.name_ organ_name,spo.cooperation_id_
         FROM student_payment_order spo
         LEFT JOIN sys_user u on spo.user_id_ = u.id_
         LEFT JOIN student_payment_order_detail spod on spo.id_ = spod.payment_order_id_

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

@@ -373,7 +373,7 @@ calender_id_,create_time_,create_by_,update_time_,update_by_,tenant_id_,type_
          per_amount_,
          balance_payment_amount_, remit_fee_, course_remit_fee_, trans_no_,
          status_, memo_, create_time_, update_time_, payment_channel_, payment_business_channel_,
-         payment_account_no_, mer_nos_, order_no_, music_group_id_, class_group_id_, pay_time_,tenant_id_,calender_id_)
+         payment_account_no_, mer_nos_, order_no_, music_group_id_, class_group_id_, pay_time_,tenant_id_,cooperation_id_)
         VALUES (#{id}, #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 #{userId}, #{organId}, #{routingOrganId},
                 #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
@@ -382,7 +382,7 @@ calender_id_,create_time_,create_by_,update_time_,update_by_,tenant_id_,type_
                 #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{memo}, #{createTime}, now(),
                 #{paymentChannel}, #{paymentBusinessChannel}, #{paymentAccountNo}, #{merNos}, #{orderNo},
                 #{musicGroupId},
-                #{classGroupId}, #{payTime},#{tenantId},#{calenderId})
+                #{classGroupId}, #{payTime},#{tenantId},#{cooperationId})
     </insert>
 
     <select id="queryAuditCount" parameterType="map" resultType="int">

+ 4 - 1
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml

@@ -1875,11 +1875,14 @@
         <result property="payNum" column="pay_num_"/>
         <result property="hasInstrumentNum" column="has_instrument_num_"/>
         <result property="id" column="music_group_id_"/>
+        <result property="memberNum" column="memberNum"/>
     </resultMap>
     <select id="countInstrument" resultMap="MusicGroup">
-        SELECT sr.music_group_id_,COUNT(DISTINCT sr.user_id_) pay_num_,SUM(CASE WHEN si.id_ IS NULL THEN 0 ELSE 1 END) has_instrument_num_ FROM student_registration sr
+        SELECT sr.music_group_id_,COUNT(DISTINCT sr.user_id_) pay_num_,SUM(CASE WHEN si.id_ IS NULL THEN 0 ELSE 1 END) has_instrument_num_,COUNT(distinct st.user_id_) memberNum
+        FROM student_registration sr
         LEFT JOIN (SELECT * FROM student_instrument WHERE del_flag_ = 0 AND end_time_ > NOW()
         GROUP BY student_id_ ) si ON sr.user_id_ = si.student_id_ AND si.del_flag_ = 0 AND si.end_time_ > NOW()
+        left join (select * from student where membership_end_time_ > NOW()) st ON st.user_id_ = sr.user_id_
         WHERE sr.music_group_status_ = 'NORMAL' AND sr.music_group_id_ IN
         <foreach collection="musicGroupIds" separator="," item="id" open="(" close=")">
             #{id}

+ 66 - 4
mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java

@@ -23,7 +23,11 @@ import org.springframework.web.bind.annotation.ExceptionHandler;
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
 import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.net.URLEncoder;
+import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
@@ -32,7 +36,7 @@ import java.util.stream.Collectors;
 @ControllerAdvice
 public class BaseController {
 
-    private final static Logger logger = LoggerFactory.getLogger(BaseController.class);
+    private final static Logger businessLogger = LoggerFactory.getLogger(BaseController.class);
 
     public static <T> HttpResponseResult<T> succeed(T object) {
         return getResponseData(true, HttpStatus.OK, object, "");
@@ -97,7 +101,7 @@ public class BaseController {
 		if (e == null) {
 			e = ex;
 		}
-		logger.error("System Error", e);
+        businessLogger.error("System Error", e);
 		// return failed(e.getMessage());
 		if (e instanceof BizException || e instanceof ThirdpartyException) {
 			if(e.getMessage().equals("205")){
@@ -126,17 +130,18 @@ public class BaseController {
                     .collect(Collectors.joining());
             return failed(errorMsg);
         }
+        String requestLog = printErrorRequestLog(request);
         try {
             Map<String,Object> paramMap = new HashMap<>(2);
             JSONObject jsonObject = new JSONObject();
-            jsonObject.put("content","系统繁忙请及时处理: " + request.getRequestURL() + "   " + e);
+            jsonObject.put("content","系统繁忙请及时处理: " + requestLog + "   " + e);
             paramMap.put("text",jsonObject.toJSONString());
             paramMap.put("msgtype","text");
             Map<String,String> headers = new HashMap<>(1);
             headers.put("Content-Type","application/json");
             HttpUtil.postForHttps(dingTalkRobotsSecurityParam(),JSON.toJSONString(paramMap),headers);
         }catch (Exception exception){
-            logger.error("System Error", exception);
+            businessLogger.error("System Error", exception);
         }
         if (StringUtils.isNotBlank(e.getMessage())) {
             return failed(e.getMessage());
@@ -144,6 +149,63 @@ public class BaseController {
         return failed("系统繁忙");
     }
 
+    private String printErrorRequestLog(HttpServletRequest request){
+        StringBuffer sb = new StringBuffer();
+        // 打印请求日志或执行其他逻辑
+        sb.append("Request URI: ").append(request.getRequestURI());
+//        businessLogger.info("Request URI: {}", request.getRequestURI());
+        Map<String, String> requestParams = getRequestParameters(request);
+        if (!requestParams.isEmpty()) {
+//            businessLogger.info("Request Parameters: {}", requestParams);
+            sb.append(", Request Parameters: ").append(requestParams);
+        }
+        Map<String, String> requestHeaders = getRequestHeaders(request);
+        if (!requestHeaders.isEmpty()) {
+//            businessLogger.info("Request Headers: {}", requestHeaders);
+            sb.append(", Request Headers: ").append(requestHeaders);
+        }
+        String requestBody = getRequestBody(request);
+        if (!requestBody.isEmpty()) {
+//            businessLogger.info("Request JSON: {}", requestBody);
+            sb.append(", Request JSON: ").append(requestBody);
+        }
+        return sb.toString();
+    }
+
+    private Map<String, String> getRequestParameters(HttpServletRequest request) {
+        Map<String, String> params = new HashMap<>();
+        request.getParameterMap().forEach((name, values) -> {
+            if (values.length > 0) {
+                params.put(name, values[0]);
+            }
+        });
+        return params;
+    }
+
+    private Map<String, String> getRequestHeaders(HttpServletRequest request) {
+        Enumeration<String> headerNames = request.getHeaderNames();
+        Map<String, String> headers = new HashMap<>();
+        while (headerNames.hasMoreElements()) {
+            String headerName = headerNames.nextElement();
+            String headerValue = request.getHeader(headerName);
+            headers.put(headerName, headerValue);
+        }
+        return headers;
+    }
+
+    private String getRequestBody(HttpServletRequest request) {
+        StringBuilder requestBody = new StringBuilder();
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()))) {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                requestBody.append(line);
+            }
+        } catch (IOException e) {
+            businessLogger.error("Error reading request body: {}", e.getMessage());
+        }
+        return requestBody.toString();
+    }
+
     public String dingTalkRobotsSecurityParam() throws Exception{
         Long timestamp = System.currentTimeMillis();
         String secret = "SEC405b2e5f38aaae6472b242ee53607fb4a6549cf05a72bdf6482ec3799d5576ec";

+ 1 - 1
mec-im/src/main/java/com/ym/controller/RoomController.java

@@ -116,7 +116,7 @@ public class RoomController{
                     break;
                 case 12:
                     //成员退出
-                    roomService.leaveRoomSuccess(roomId, userId,null, notify.getTimestamp());
+                    roomService.leaveRoomSuccess(roomId, userId, null, notify.getTimestamp());
                     break;
             }
         }catch (Exception e){

+ 27 - 6
mec-im/src/main/java/com/ym/controller/UserController.java

@@ -126,22 +126,39 @@ public class UserController {
             callbackOnMemberStateChange.setClientIP(clientIP);
             callbackOnMemberStateChange.setOptPlatform(optPlatform);
             if (callbackOnMemberStateChange.getGroupId().startsWith("LIVE")) {
+                // 直播间成员状态变更
                 imLiveBroadcastRoomService.callbackOnMemberStateChange(callbackOnMemberStateChange);
 
                 // 直播课学生签退
                 String[] values = callbackOnMemberStateChange.getGroupId().split("-");
                 String roomId = values.length > 2 ? values[1] : "";
 
+                // 直播课学生签退、签退
                 if ((roomId.startsWith("S") || roomId.startsWith("I"))
-                        && CollectionUtils.isNotEmpty(callbackOnMemberStateChange.getMemberList())
-                        && "Offline".equals(callbackOnMemberStateChange.getEventType())) {
+                        && CollectionUtils.isNotEmpty(callbackOnMemberStateChange.getMemberList())) {
 
                     // 学生编号
                     String userId = callbackOnMemberStateChange.getMemberList().get(0).getMemberAccount();
-                    try {
-                        roomService.leaveRoomSuccess(roomId, userId, null);
-                    } catch (Exception e) {
-                        log.error("tencentImCallback leaveRoomSuccess error, roomId={}, userId={}", roomId, userId, e);
+
+                    String eventType = callbackOnMemberStateChange.getEventType();
+                    // 学生离线消息通知
+                    if ("Offline".equals(eventType)) {
+
+                        try {
+                            roomService.leaveRoomSuccess(roomId, userId, null);
+                        } catch (Exception e) {
+                            log.error("tencentImCallback leaveRoomSuccess error, roomId={}, userId={}", roomId, userId, e);
+                        }
+                    }
+
+                    // 学生在线消息通知
+                    if ("Online".equals(eventType)) {
+
+                        try {
+                            roomService.joinRoomSuccess(roomId, userId, null);
+                        } catch (Exception e) {
+                            log.error("tencentImCallback joinRoomSuccess error, roomId={}, userId={}", roomId, userId, e);
+                        }
                     }
 
                 }
@@ -158,12 +175,14 @@ public class UserController {
             callbackAfterMemberExit.setOptPlatform(optPlatform);
 
             if (callbackAfterMemberExit.getGroupId().startsWith("LIVE")) {
+                // 直播间成员状态变更
                 imLiveBroadcastRoomService.callbackAfterMemberExit(callbackAfterMemberExit);
 
                 // 直播课学生签退
                 String[] values = callbackAfterMemberExit.getGroupId().split("-");
                 String roomId = values.length > 2 ? values[1] : "";
 
+                // 直播课学生签退、签退
                 if ((roomId.startsWith("S") || roomId.startsWith("I"))
                         && CollectionUtils.isNotEmpty(callbackAfterMemberExit.getExitMemberList())) {
 
@@ -188,12 +207,14 @@ public class UserController {
             callbackAfterNewMemberJoin.setOptPlatform(optPlatform);
 
             if (callbackAfterNewMemberJoin.getGroupId().startsWith("LIVE")) {
+                // 直播间成员状态变更
                 imLiveBroadcastRoomService.callbackAfterNewMemberJoin(callbackAfterNewMemberJoin);
 
                 // 直播课学生签到
                 String[] values = callbackAfterNewMemberJoin.getGroupId().split("-");
                 String roomId = values.length > 2 ? values[1] : "";
 
+                // 直播课学生签退、签退
                 if ((roomId.startsWith("S") || roomId.startsWith("I"))
                         && CollectionUtils.isNotEmpty(callbackAfterNewMemberJoin.getNewMemberList())) {
 

+ 2 - 0
mec-im/src/main/java/com/ym/pojo/ReqDeviceControlData.java

@@ -27,6 +27,8 @@ public class ReqDeviceControlData {
 	private Integer soundVolume = 100;
 	// 服务提供方
 	private String serviceProvider;
+	// 取消静音
+	private Boolean cancelMuteFlag;
 	// 发送用户信息
 	private String sendUserId;
 	private String sendUserName;

+ 77 - 9
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -12,6 +12,7 @@ import com.microsvc.toolkit.middleware.rtc.impl.RongCloudRTCPlugin;
 import com.microsvc.toolkit.middleware.rtc.impl.TencentCloudRTCPlugin;
 import com.microsvc.toolkit.middleware.rtc.message.ImGroupMemberWrapper;
 import com.microsvc.toolkit.middleware.rtc.message.RTCRoomMessage;
+import com.microsvc.toolkit.middleware.rtc.message.TencentRequest;
 import com.ym.common.ApiException;
 import com.ym.common.BaseResponse;
 import com.ym.common.DisplayEnum;
@@ -156,12 +157,17 @@ public class RoomServiceImpl implements RoomService {
         return Integer.parseInt(roomId);
     }
 
-    @Transactional(rollbackFor = Exception.class)
-    public String getCloseNetworkRoomTime(CourseSchedule courseSchedule, String continueCourseTime) {
+    public String getCloseNetworkRoomTime(CourseSchedule courseSchedule, String continueCourseTime, RoomResult roomResult) {
         String autoCloseNetworkRoomTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.COURSE_AFTER_BUFFER_TIME, courseSchedule.getTenantId());
         if (StringUtils.isEmpty(autoCloseNetworkRoomTime)) {
             autoCloseNetworkRoomTime = "15";
         }
+        // 课程结束后多少分钟关闭网络教室
+        // roomResult.setAutoCloseNetworkRoomTime(autoCloseNetworkRoomTime);
+
+        // 当前课剩余时长
+        int surplusTime = DateUtil.secondsBetween(new Date(), courseSchedule.getEndClassTime());
+
         CourseSchedule schedule = courseSchedule;
         //如果当前课程是连堂课,那么获取第一节课的课程编号
         while (true) {
@@ -169,11 +175,14 @@ public class RoomServiceImpl implements RoomService {
             String endClassTime = DateUtil.format(schedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
             schedule = courseScheduleDao.getLastCourse(schedule.getClassGroupId(), classDate + " " + endClassTime, schedule.getActualTeacherId(), continueCourseTime);
             if (schedule != null) {
-                autoCloseNetworkRoomTime = DateUtil.minutesBetween(new Date(), schedule.getEndClassTime()) + "";
+                surplusTime = DateUtil.secondsBetween(new Date(), schedule.getEndClassTime());
             } else {
                 break;
             }
         }
+        //获取当前课程剩余时长
+        roomResult.setSurplusTime(Math.max(surplusTime, 0));
+
         return autoCloseNetworkRoomTime;
     }
 
@@ -205,7 +214,8 @@ public class RoomServiceImpl implements RoomService {
         RoomResult roomResult = new RoomResult();
         // 直播间编号
         roomResult.setLiveRoomId(courseSchedule.getLiveRoomId());
-        roomResult.setAutoCloseNetworkRoomTime(this.getCloseNetworkRoomTime(courseSchedule, continueCourseTime));
+        // 连堂课剩余时长和关闭网络教室时间
+        roomResult.setAutoCloseNetworkRoomTime(this.getCloseNetworkRoomTime(courseSchedule, continueCourseTime, roomResult));
         CourseSchedule schedule = courseSchedule;
         //如果当前课程是连堂课,那么获取第一节课的课程编号
         while (true) {
@@ -219,6 +229,9 @@ public class RoomServiceImpl implements RoomService {
                 break;
             }
         }
+        //获取当前课程剩余时长
+        // roomResult.setSurplusTime(DateUtil.secondsBetween(new Date(), schedule.getEndClassTime()));
+
         Long courseId = Long.parseLong(roomId);
         // 默认获取首节课的课程信息
         if (Objects.isNull(schedule)) {
@@ -244,8 +257,6 @@ public class RoomServiceImpl implements RoomService {
 
         // RTC服务提供方
         roomResult.setServiceProvider(Optional.ofNullable(courseSchedule.getServiceProvider()).orElse("rongCloud"));
-        //获取当前课程剩余时长
-        roomResult.setSurplusTime(DateUtil.secondsBetween(new Date(), courseSchedule.getEndClassTime()));
         roomResult.setRoomId(roomId);
 
         // 网络课形式:RTC房间,直播间
@@ -683,6 +694,9 @@ public class RoomServiceImpl implements RoomService {
                     // 生成群组
                     pluginService.chatRoomCreate(roomId, courseSchedule.getName(), courseSchedule.getTeacherId().toString());
 
+                    // 更新群自定义字段
+                    updateChatRoomGroupData(roomId, courseSchedule, pluginService);
+
                     // 群组老师信息
                     List<ImGroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList(ImGroupMemberWrapper.ImGroupMember
                             .builder()
@@ -723,6 +737,39 @@ public class RoomServiceImpl implements RoomService {
 
         }
     }
+
+    /**
+     * 更新群自定义字段
+     * @param roomId 群ID
+     * @param courseSchedule CourseSchedule
+     * @param pluginService RTCRoomPluginService
+     */
+    private void updateChatRoomGroupData(String roomId, CourseSchedule courseSchedule, RTCRoomPluginService pluginService) {
+        // 生成群组自定义字段
+        List<TencentRequest.ChatRoomGroupDefinedData> definedDataList = Lists.newArrayList();
+
+        // 全员静音
+        definedDataList.add(TencentRequest.ChatRoomGroupDefinedData.builder()
+                        .key("isMuteAll").value(courseSchedule.getMuteAll().toString())
+                .build());
+        // 取消静音
+        definedDataList.add(TencentRequest.ChatRoomGroupDefinedData.builder()
+                .key("cancelMuteFlag").value(courseSchedule.getCancelMuteFlag().toString())
+                .build());
+
+        if (CollectionUtils.isNotEmpty(definedDataList)) {
+
+            try {
+                pluginService.chatRoomGroupDefinedData(TencentRequest.ChatRoomGroup.builder()
+                        .groupId(roomId)
+                        .appDefinedData(definedDataList)
+                        .build());
+            } catch (Exception e) {
+                log.error("直播网管课自定义字段设置失败: roomId={}", roomId, e);
+            }
+        }
+    }
+
     private void dismissImGroup(String userId,String roomId, String serviceProvider) throws Exception {
         log.info("dismissImGroup: roomId = {}, userId = {}", roomId, userId);
         String joinImGroupKey = "joinImGroup:" + roomId;
@@ -1122,6 +1169,9 @@ public class RoomServiceImpl implements RoomService {
 
         log.info("leaveRoomSuccess: roomId={}, userId={}, deviceNum={}, joinTs={}, callbackTs={}", roomId, userId, deviceNum,
                 roomMember.getJoinDt().getTime(), callbackTs);
+
+        // 若用户已经离开房间,先添加用户到房间
+
         // 用户离开事件
         leaveRoomSuccess(roomId, userId, deviceNum);
     }
@@ -1802,9 +1852,27 @@ public class RoomServiceImpl implements RoomService {
         }
         data.setServiceProvider(courseSchedule.getServiceProvider());
 
-        // 同步全员静音状态
-        if (Objects.nonNull(data.getMicrophoneOn())) {
-            courseScheduleDao.updateGroupMuteAllStatus(courseScheduleId, !data.getMicrophoneOn());
+        // 同步全员静音状态, 取消静音
+        if (Objects.nonNull(data.getMicrophoneOn()) || Objects.nonNull(data.getCancelMuteFlag())) {
+
+            Boolean muteAll = null;
+            if (Objects.nonNull(data.getMicrophoneOn())) {
+                muteAll = !data.getMicrophoneOn();
+            }
+            courseScheduleDao.updateGroupMuteAllStatus(courseScheduleId, muteAll, data.getCancelMuteFlag());
+
+            CourseSchedule newCourseSchedule = courseScheduleDao.get(courseScheduleId);
+            // 修改网管课群自定义属性
+            RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(courseSchedule.getServiceProvider());
+            if (Objects.nonNull(pluginService) && Objects.nonNull(newCourseSchedule)) {
+                // 更新群自定义字段
+                updateChatRoomGroupData(data.getRoomId(), newCourseSchedule, pluginService);
+            }
+
+            // 取消网络课群静音
+            if (Objects.nonNull(data.getCancelMuteFlag())) {
+                return true;
+            }
         }
 
         // 课程老师信息

+ 7 - 3
mec-student/src/main/java/com/ym/mec/student/controller/CourseController.java

@@ -15,6 +15,7 @@ import com.ym.mec.common.entity.ImGroupModel;
 import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import jodd.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -73,11 +74,14 @@ public class CourseController extends BaseController {
 
     @ApiOperation(value = "根据群编号,获取群组基本信息")
     @GetMapping("/findGroupById")
-    public HttpResponseResult<? extends Object> findGroupById(Integer groupId){
-        if(null == groupId){
+    public HttpResponseResult<? extends Object> findGroupById(String groupId){
+        if(StringUtil.isEmpty(groupId)){
             return failed("参数校验错误");
         }
-        return succeed(classGroupService.findGroupById(groupId));
+        if (groupId.contains("S") || groupId.contains("I")){
+            groupId = groupId.substring(1);
+        }
+        return succeed(classGroupService.findGroupById(Integer.parseInt(groupId)));
     }
 
     @ApiOperation(value = "分页获取学员购买记录")

+ 1 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherManageController.java

@@ -109,7 +109,7 @@ public class TeacherManageController extends BaseController {
     @ApiOperation(value = "根据群编号,获取群组基本信息")
     @GetMapping("/course/findGroupById")
     public Object findGroupById(String imGroupId){
-        if(null == imGroupId){
+        if(StringUtils.isEmpty(imGroupId)){
             return failed("参数校验错误");
         }
         if (imGroupId.contains("S") || imGroupId.contains("I")){

+ 1 - 1
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/yeepay/YeepayMerchantService.java

@@ -47,7 +47,7 @@ public class YeepayMerchantService {
 		Map<String, String> merchantSubjectInfoMap = new HashMap<String, String>();
 		merchantSubjectInfoMap.put("licenceUrl", merchantInfo.getLicenceUrl());
 		merchantSubjectInfoMap.put("signName", merchantInfo.getMerchantName());
-		merchantSubjectInfoMap.put("signType", "ENTERPRISE");
+		merchantSubjectInfoMap.put("signType", merchantInfo.getMerchantType());
 		merchantSubjectInfoMap.put("licenceNo", merchantInfo.getLicenceNo());
 		merchantSubjectInfoMap.put("shortName", merchantInfo.getMerchantName());
 		merchantSubjectInfoMap.put("openAccountLicenceUrl", merchantInfo.getOpenAccountLicenceUrl());

+ 10 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/yeepay/entity/MerchantInfo.java

@@ -5,6 +5,8 @@ public class MerchantInfo {
 	private String requestNo;
 
 	//-----企业信息
+    private String merchantType;//商家类型(企业-ENTERPRISE,个体户-INDIVIDUAL)
+    
 	private String merchantName; //企业名称
 	
 	private String licenceNo; //商户证件编号
@@ -65,6 +67,14 @@ public class MerchantInfo {
 		this.requestNo = requestNo;
 	}
 
+	public String getMerchantType() {
+		return merchantType;
+	}
+
+	public void setMerchantType(String merchantType) {
+		this.merchantType = merchantType;
+	}
+
 	public String getMerchantName() {
 		return merchantName;
 	}

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

@@ -43,7 +43,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                         "/tenantInfo/info/*", "/tenantInfo/checkInfo/*", "/tenantInfo/pay/*","/tenantInfo/testCheck", "/tenantInfo/getContract/*",
                         "/tenantPreJoin/add","/imLiveBroadcastRoom/queryRoomInfo","/imLiveBroadcastRoom/test",
                         "/eduOrganization/queryAllOrgan","/eduOrganization/queryAll","/eduOrganization/getOrganCooperation","/import/oaUploadFile",
-                        "/tenantInfo/callback", "/open/**","/schoolActivity/detail/*","/adapay/callback","/temp/*","/yeepay/callback/**"
+                        "/tenantInfo/callback/**", "/open/**","/schoolActivity/detail/*","/adapay/callback","/temp/*","/yeepay/callback/**"
                 )
                 .permitAll().anyRequest().authenticated().and().httpBasic();
     }

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

@@ -231,9 +231,9 @@ public class ExportController extends BaseController {
         OutputStream outputStream = response.getOutputStream();
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "乐团编号", "乐团名称", "合作单位", "乐团状态",
-                    "收费模式", "收费类型", "乐团主管", "成团人数", "在读人数", "申请时间", "成团时间", "清单状态", "收费标准"}, new String[]{
+                    "收费模式", "收费类型", "乐团主管", "成团人数", "在读人数",  "会员人数",  "非会员人数", "申请时间", "成团时间", "清单状态", "收费标准"}, new String[]{
                     "organName", "id", "name", "cooperationOrganName", "status.msg", "courseViewType.msg", "chargeTypeName",
-                    "educationalTeacherName", "groupMemberNum", "payNum"
+                    "educationalTeacherName", "groupMemberNum", "payNum", "memberNum", "notMemberNum"
                     , "createTime", "billStartDate", "hasVerifyMusicalList?'已确认':'未确认'", "chargeStandard"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attac:wq" +

+ 2 - 7
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -469,16 +469,11 @@ public class TaskController extends BaseController {
 	}
 
 	@GetMapping("/countIndexBaseData")
-	public void countIndexBaseData(String month, String dataTypes){
-		Set<IndexDataType> dataTypeSet = new HashSet<>();
-		if(StringUtils.isNotBlank(dataTypes)){
-			dataTypeSet = Arrays.stream(dataTypes.split(",")).map(s->IndexDataType.valueOf(s)).collect(Collectors.toSet());
-		}
-
+	public void countIndexBaseData(){
 		List<TenantInfo> tenantInfos = tenantInfoService.list(new QueryWrapper<TenantInfo>().eq("state_",1));
 		if(tenantInfos != null && tenantInfos.size() > 0){
 			for (TenantInfo tenantInfo : tenantInfos) {
-				indexBaseMonthDataService.indexBaseDataTask(tenantInfo.getId(), month, dataTypeSet);
+				indexBaseMonthDataService.indexBaseDataTask(tenantInfo.getId());
 			}
 		}
 	}

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/payment/YeepayController.java

@@ -150,7 +150,7 @@ public class YeepayController extends BaseController {
 			}else if("REVIEW_BACK".equals(dataObj.getString("applicationStatus"))) {
 				//审核驳回
 				hfMember.setStatus("failed");
-				hfMember.setMemo(dataObj.getString("returnMsg"));
+				hfMember.setMemo(dataObj.getString("auditOpinion"));
 				hfMemberService.update(hfMember);
 			}