فهرست منبع

Merge branch 'saas' of http://git.dayaedu.com/yonge/mec into zx_saas_0208

zouxuan 3 سال پیش
والد
کامیت
f05c262d2c
86فایلهای تغییر یافته به همراه5356 افزوده شده و 1681 حذف شده
  1. 29 0
      audio-analysis/src/main/java/com/yonge/netty/dto/NoteFrequencyRange.java
  2. 44 2
      audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java
  3. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/PlatformServeDao.java
  4. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysAreaDao.java
  5. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantApplyCallRecordDao.java
  6. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantContractRecordDao.java
  7. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantContractTemplateDao.java
  8. 10 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantInfoDao.java
  9. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantPreJoinDao.java
  10. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantProductInfoDao.java
  11. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TenantContractTemplateDto.java
  12. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TenantInfoDto.java
  13. 275 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TenantPreJoinDto.java
  14. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java
  15. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Teacher.java
  16. 28 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantApply.java
  17. 85 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantApplyCallRecord.java
  18. 140 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantContractRecord.java
  19. 159 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantContractTemplate.java
  20. 336 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantPreJoin.java
  21. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TenantContractTemplateQueryInfo.java
  22. 90 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/TenantInfoPageVo.java
  23. 1 3
      mec-biz/src/main/java/com/ym/mec/biz/service/ContractService.java
  24. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/PlatformServeService.java
  25. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysAreaService.java
  26. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantApplyCallRecordService.java
  27. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantConfigService.java
  28. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantContractRecordService.java
  29. 45 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantContractTemplateService.java
  30. 14 16
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantInfoService.java
  31. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantPreJoinService.java
  32. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantProductInfoService.java
  33. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/UploadFileService.java
  34. 156 65
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  35. 13 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  36. 77 57
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberFeeSettingServiceImpl.java
  37. 56 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  38. 1322 1325
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  39. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  40. 16 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PlatformServeServiceImpl.java
  41. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  42. 9 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysAreaServiceImpl.java
  43. 85 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantApplyCallRecordServiceImpl.java
  44. 2 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantAssetsInfoServiceImpl.java
  45. 38 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantConfigServiceImpl.java
  46. 83 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantContractRecordServiceImpl.java
  47. 142 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantContractTemplateServiceImpl.java
  48. 349 95
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java
  49. 1 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantOrderRecordServiceImpl.java
  50. 106 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantPreJoinServiceImpl.java
  51. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantProductInfoServiceImpl.java
  52. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  53. 140 0
      mec-biz/src/main/resources/config/contracts/latest_contract_template.ftl
  54. 419 0
      mec-biz/src/main/resources/config/contracts/lexiaoyaContract.ftl
  55. 3 3
      mec-biz/src/main/resources/config/contracts/product4.ftl
  56. 6 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  57. 4 1
      mec-biz/src/main/resources/config/mybatis/PlatformServeMapper.xml
  58. 4 0
      mec-biz/src/main/resources/config/mybatis/SysAreaMapper.xml
  59. 1 1
      mec-biz/src/main/resources/config/mybatis/SysMusicScoreMapper.xml
  60. 1 1
      mec-biz/src/main/resources/config/mybatis/SysPaymentConfigMapper.xml
  61. 3 1
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  62. 25 0
      mec-biz/src/main/resources/config/mybatis/TenantApplyCallRecordMapper.xml
  63. 10 2
      mec-biz/src/main/resources/config/mybatis/TenantApplyMapper.xml
  64. 29 0
      mec-biz/src/main/resources/config/mybatis/TenantContractRecordMapper.xml
  65. 156 0
      mec-biz/src/main/resources/config/mybatis/TenantContractTemplateMapper.xml
  66. 54 4
      mec-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml
  67. 58 0
      mec-biz/src/main/resources/config/mybatis/TenantPreJoinMapper.xml
  68. 37 0
      mec-biz/src/main/resources/config/mybatis/TenantProductInfoMapper.xml
  69. 1 1
      mec-common/common-core/pom.xml
  70. 40 2
      mec-common/common-core/src/main/java/com/ym/mec/common/page/WrapperUtil.java
  71. 3 8
      mec-common/common-core/src/main/java/com/ym/mec/common/service/BaseService.java
  72. 5 1
      mec-common/common-core/src/main/java/com/ym/mec/common/service/impl/BaseServiceImpl.java
  73. 1 1
      mec-im/src/main/java/com/ym/job/ScheduleManager.java
  74. 1 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherContractController.java
  75. 20 0
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/ESealPlugin.java
  76. 38 1
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/provider/TsignPlugin.java
  77. 1 1
      mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java
  78. 36 1
      mec-util/src/main/java/com/ym/mec/util/freemarker/FreemarkerTemplateEngine.java
  79. 2 2
      mec-web/src/main/java/com/ym/mec/web/config/ResourceServerConfig.java
  80. 58 0
      mec-web/src/main/java/com/ym/mec/web/controller/TenantApplyCallRecordController.java
  81. 52 0
      mec-web/src/main/java/com/ym/mec/web/controller/TenantContractRecordController.java
  82. 100 0
      mec-web/src/main/java/com/ym/mec/web/controller/TenantContractTemplateController.java
  83. 18 2
      mec-web/src/main/java/com/ym/mec/web/controller/TenantInfoController.java
  84. 53 0
      mec-web/src/main/java/com/ym/mec/web/controller/TenantPreJoinController.java
  85. 4 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduMusicScoreController.java
  86. 1 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentRegistrationController.java

+ 29 - 0
audio-analysis/src/main/java/com/yonge/netty/dto/NoteFrequencyRange.java

@@ -1,6 +1,8 @@
 package com.yonge.netty.dto;
 
 import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 一个音符的频率范围,包含最大值和最小值
@@ -70,9 +72,36 @@ public class NoteFrequencyRange {
 		return false;
 	}
 	
+	@Override
+	public int hashCode() {
+		int result = 17;
+		result = 31 * result + Double.hashCode(minFrequency);
+		result = 31 * result + Double.hashCode(maxFrequency);
+		return result;
+	}
+
 	public static void main(String[] args) {
+		
+		Map<NoteFrequencyRange,Integer> map = new HashMap<NoteFrequencyRange, Integer>();
+		
 		NoteFrequencyRange nfr = new NoteFrequencyRange(442,442);
 		System.out.println(nfr.getMinFrequency() + "-"+ nfr.getMaxFrequency());
+		
+		if(map.containsKey(nfr) == false){
+			map.put(nfr, 1);
+		}
+
+		NoteFrequencyRange nfr1 = new NoteFrequencyRange(442,430);
+		System.out.println(nfr1.getMinFrequency() + "-"+ nfr1.getMaxFrequency());
+		
+		if(map.containsKey(nfr1) == false){
+			map.put(nfr1, 1);
+		}else{
+			map.put(nfr, 2);
+		}
+		
+		System.out.println(nfr.equals(nfr1));
+		System.out.println(map.size());
 	}
 
 }

+ 44 - 2
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -7,6 +7,7 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -727,9 +728,48 @@ public class UserChannelContext {
 		NoteFrequencyRange noteFrequencyRange = null;
 		ChunkAnalysis chunkAnalysis = null;
 		boolean tempo = false;
-		boolean isContinue = true;
-		int unplayedSize = 0;
+		//boolean isContinue = true;
+		//int unplayedSize = 0;
 		int firstPeakIndex = -1;
+		
+		//将信号分堆归类
+		Map<NoteFrequencyRange, Integer> signalGrouping = new HashMap<NoteFrequencyRange, Integer>();
+		
+		for (int i = 0; i < chunkList.size(); i++) {
+			chunkAnalysis = chunkList.get(i);
+			if (chunkAnalysis != null) {
+				if (chunkAnalysis.getFrequency() > MIN_FREQUECY || firstPeakIndex > -1) {
+					
+					if (firstPeakIndex == -1) {
+						firstPeakIndex = i;
+					}
+					
+					noteFrequencyRange = new NoteFrequencyRange(standardFrequecy, chunkAnalysis.getFrequency());
+					
+					if (signalGrouping.containsKey(noteFrequencyRange)) {
+						signalGrouping.put(noteFrequencyRange, signalGrouping.get(noteFrequencyRange) + 1);
+					} else {
+						signalGrouping.put(noteFrequencyRange, 1);
+					}
+				}
+			}
+		}
+		
+		Integer maxTimes = 0, totalTimes = 0;
+		
+		for (Entry<NoteFrequencyRange, Integer> entry : signalGrouping.entrySet()) {
+			if (entry.getValue() > maxTimes) {
+				maxTimes = entry.getValue();
+			}
+			totalTimes = totalTimes + entry.getValue();
+		}
+		
+		if (maxTimes / totalTimes < hardLevel.getIntegrityRange()) {
+			tempo = false;
+			LOGGER.debug("节奏错误原因:不是同一个音");
+		}
+		
+		/**
 		for (int i = 0; i < chunkList.size(); i++) {
 			chunkAnalysis = chunkList.get(i);
 			if (chunkAnalysis != null) {
@@ -766,6 +806,7 @@ public class UserChannelContext {
 				}
 			}
 		}
+		*/
 		
 		if (tempo) {
 			// 判断进入时间点
@@ -939,6 +980,7 @@ public class UserChannelContext {
 		int standardPitch = 440; // a is 440 hz...
 		for (int x = 0; x < midi.length; ++x)
 		{
+			//转调
 		   midi[x] = new BigDecimal(standardPitch).multiply(new BigDecimal(Math.pow(2, new BigDecimal(x-69).divide(new BigDecimal(12),6,BigDecimal.ROUND_HALF_UP).doubleValue()))).doubleValue();
 		   System.out.println("x=" + x +"  "+ midi[x]);
 		}

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

@@ -16,7 +16,9 @@ public interface PlatformServeDao extends BaseMapper<PlatformServe> {
 
     int insert(PlatformServe record);
 
-    <T> IPage<T> queryPage(Page<T> page, @Param("search") String search);
+    <T> IPage<T> queryPage(Page<T> page, @Param("search") String search, @Param("id") Integer id);
+
+    <T> T queryPage(@Param("search") String search, @Param("id") Integer id);
 
     PlatformServeInfoVo queryInfo(Integer id);
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysAreaDao.java

@@ -25,4 +25,6 @@ public interface SysAreaDao extends BaseDAO<Integer, SysArea> {
      * @return
      */
     SysArea getParentArea(Integer id);
+
+    SysArea queryByCode(String code);
 }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantApplyCallRecordDao.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.TenantApplyCallRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 机构申请记录(TenantApplyCallRecord)表数据库访问层
+ *
+ * @author hgw
+ * @since 2022-02-09 10:44:00
+ */
+public interface TenantApplyCallRecordDao extends BaseMapper<TenantApplyCallRecord> {
+
+    int insertBatch(@Param("entities") List<TenantApplyCallRecord> entities);
+
+}
+

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantContractRecordDao.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.TenantContractRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 机构协议记录表(TenantContractRecord)表数据库访问层
+ *
+ * @author hgw
+ * @since 2022-02-12 16:16:40
+ */
+public interface TenantContractRecordDao extends BaseMapper<TenantContractRecord> {
+
+    int insertBatch(@Param("entities") List<TenantContractRecord> entities);
+
+}
+

+ 27 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantContractTemplateDao.java

@@ -0,0 +1,27 @@
+package com.ym.mec.biz.dal.dao;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.dto.TenantContractTemplateDto;
+import com.ym.mec.biz.dal.entity.TenantContractTemplate;
+
+public interface TenantContractTemplateDao extends BaseDAO<Integer, TenantContractTemplate> {
+
+	List<TenantContractTemplateDto> queryPageList(Map<String, Object> params);
+	
+	/**
+	 * 获取最新协议模板
+	 * @param owner
+	 * @param type
+	 * @return
+	 */
+	TenantContractTemplate queryLatestContractTemplate(@Param("owner") String owner, @Param("type") String type, @Param("tenantId") Integer tenantId);
+	
+	int disableContract(@Param("owner") String owner, @Param("type") String type, @Param("tenantId") Integer tenantId);
+	
+	Integer queryMaxVersion();
+}

+ 10 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantInfoDao.java

@@ -1,17 +1,19 @@
 package com.ym.mec.biz.dal.dao;
 
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Param;
+
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ym.mec.biz.dal.entity.TenantInfo;
 import com.ym.mec.biz.dal.entity.TenantProductSumm;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
 
 public interface TenantInfoDao extends BaseMapper<TenantInfo> {
+	
+	TenantInfo getLocked(Integer tenantId);
 
     <T> IPage<T> queryPage(Page<T> page, @Param("param") Map<String, Object> param);
 
@@ -23,7 +25,9 @@ public interface TenantInfoDao extends BaseMapper<TenantInfo> {
 
     TenantInfo queryTenantInfoByOrgan(@Param("organId") Integer organId);
 
-    void updatePhone(@Param("newPhone")String newPhone, @Param("oldPhone")String oldPhone);
+    void updatePhone(@Param("newPhone") String newPhone, @Param("oldPhone") String oldPhone);
 
     Integer queryUserByTenantId(@Param("tenantId") Integer tenantId);
+
+    int openInitNewsInformation(@Param("tenantId") Integer tenantId, @Param("orgId") String orgId);
 }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantPreJoinDao.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.TenantPreJoin;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 机构入驻表(预加入)(TenantPreJoin)表数据库访问层
+ *
+ * @author hgw
+ * @since 2022-02-09 14:38:08
+ */
+public interface TenantPreJoinDao extends BaseMapper<TenantPreJoin> {
+
+    int insertBatch(@Param("entities") List<TenantPreJoin> entities);
+
+}
+

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantProductInfoDao.java

@@ -4,4 +4,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ym.mec.biz.dal.entity.TenantProductInfo;
 
 public interface TenantProductInfoDao extends BaseMapper<TenantProductInfo> {
+
+    int updateByTenantId(TenantProductInfo obj);
 }

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TenantContractTemplateDto.java

@@ -0,0 +1,16 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.TenantContractTemplate;
+
+public class TenantContractTemplateDto extends TenantContractTemplate {
+
+	private String latestOperator;
+
+	public String getLatestOperator() {
+		return latestOperator;
+	}
+
+	public void setLatestOperator(String latestOperator) {
+		this.latestOperator = latestOperator;
+	}
+}

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TenantInfoDto.java

@@ -49,6 +49,7 @@ public class TenantInfoDto implements Serializable {
     /**
      * 地址
      */
+    @NotBlank(message = "地址不能为空!")
     @Size(max = 200, message = "地址不能超过200个字!")
     @ApiModelProperty(value = "地址")
     private String address;

+ 275 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TenantPreJoinDto.java

@@ -0,0 +1,275 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * @author hgw
+ * Created by 2022-02-10
+ */
+public class TenantPreJoinDto implements Serializable {
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @NotBlank(message = "公司全称不能为空")
+    @ApiModelProperty(value = "公司全称")
+    private String tsignName;
+
+    @NotBlank(message = "公司简称不能为空")
+    @ApiModelProperty(value = "机构名称/公司简称")
+    private String name;
+
+    @ApiModelProperty(value = "area表code字段")
+    private String areaCode;
+
+    @NotBlank(message = "邮箱不能为空!")
+    @Email(message = "邮箱格式不正确!")
+    @Size(max = 64, message = "邮箱长度不能超过64位!")
+    @ApiModelProperty(value = "机构邮箱")
+    private String email;
+
+    @Size(max = 13, message = "客服电话电话-手机号最高11位、座机号最高为13位,请核实后再填写!")
+    @Pattern(regexp = "^[0-9]*$", message = "客服电话只能填写数字!")
+    @ApiModelProperty(value = "客服电话")
+    private String customerServicePhone;
+
+    @NotBlank(message = "营业执照编码不能为空!")
+    @ApiModelProperty(value = "营业执照编码")
+    private String tsignCode;
+
+    @Size(max = 200, message = "地址不能超过200个字!")
+    @ApiModelProperty(value = "地址")
+    private String address;
+
+    @Size(max = 200, message = "机构描述不能超过200个字!")
+    @ApiModelProperty(value = "机构描述-200字")
+    private String remark;
+
+    @NotBlank(message = "企业负责人不能为空!")
+    @ApiModelProperty(value = "企业负责人")
+    private String enterpriseLiableName;
+
+    @NotBlank(message = "企业负责人电话不能为空!")
+    @Size(max = 11, message = "手机号最高11位请核实后再填写!")
+    @Pattern(regexp = "^[0-9]*$", message = "企业负责人电话只能填写数字!")
+    @ApiModelProperty(value = "企业负责人电话")
+    private String enterpriseLiablePhone;
+
+    @NotBlank(message = "法人身份证正面照片不能为空!")
+    @ApiModelProperty(value = "法人身份证正面照片地址")
+    private String legalPersonIdFrontPic;
+
+    @NotBlank(message = "法人身份证反面照片不能为空!")
+    @ApiModelProperty(value = "法人身份证反面照片地址")
+    private String legalPersonIdReversePic;
+
+    @NotBlank(message = "项目负责人不能为空!")
+    @ApiModelProperty(value = "项目负责人/机构联系人")
+    private String contacts;
+
+    @NotBlank(message = "项目负责人电话电话不能为空!")
+    @Size(max = 11, message = "手机号最高11位请核实后再填写!")
+    @Pattern(regexp = "^[0-9]*$", message = "项目负责人电话电话只能填写数字!")
+    @ApiModelProperty(value = "项目负责人电话/机构联系人电话")
+    private String phone;
+
+    @NotBlank(message = "公司营业执照图片不能为空!")
+    @ApiModelProperty(value = "公司营业执照图片")
+    private String tsignPic;
+
+    @NotBlank(message = "税务登记证照片不能为空!")
+    @ApiModelProperty(value = "税务登记证照片地址")
+    private String taxRegisterPic;
+
+    @NotBlank(message = "公司开户信息照片不能为空!")
+    @ApiModelProperty(value = "公司开户信息照片地址")
+    private String companyAccountInfoPic;
+
+    @NotBlank(message = "机构logo照片不能为空!")
+    @ApiModelProperty(value = "机构logo")
+    private String logo;
+
+    @NotBlank(message = "企业公章图片不能为空!")
+    @ApiModelProperty(value = "企业公章图片地址")
+    private String corporateChops;
+
+    @NotBlank(message = "企业财务公章图片不能为空!")
+    @ApiModelProperty(value = "企业财务公章图片地址")
+    private String corporateFinanceChops;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getTsignName() {
+        return tsignName;
+    }
+
+    public void setTsignName(String tsignName) {
+        this.tsignName = tsignName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getCustomerServicePhone() {
+        return customerServicePhone;
+    }
+
+    public void setCustomerServicePhone(String customerServicePhone) {
+        this.customerServicePhone = customerServicePhone;
+    }
+
+    public String getTsignCode() {
+        return tsignCode;
+    }
+
+    public void setTsignCode(String tsignCode) {
+        this.tsignCode = tsignCode;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getEnterpriseLiableName() {
+        return enterpriseLiableName;
+    }
+
+    public void setEnterpriseLiableName(String enterpriseLiableName) {
+        this.enterpriseLiableName = enterpriseLiableName;
+    }
+
+    public String getEnterpriseLiablePhone() {
+        return enterpriseLiablePhone;
+    }
+
+    public void setEnterpriseLiablePhone(String enterpriseLiablePhone) {
+        this.enterpriseLiablePhone = enterpriseLiablePhone;
+    }
+
+    public String getLegalPersonIdFrontPic() {
+        return legalPersonIdFrontPic;
+    }
+
+    public void setLegalPersonIdFrontPic(String legalPersonIdFrontPic) {
+        this.legalPersonIdFrontPic = legalPersonIdFrontPic;
+    }
+
+    public String getLegalPersonIdReversePic() {
+        return legalPersonIdReversePic;
+    }
+
+    public void setLegalPersonIdReversePic(String legalPersonIdReversePic) {
+        this.legalPersonIdReversePic = legalPersonIdReversePic;
+    }
+
+    public String getContacts() {
+        return contacts;
+    }
+
+    public void setContacts(String contacts) {
+        this.contacts = contacts;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getTsignPic() {
+        return tsignPic;
+    }
+
+    public void setTsignPic(String tsignPic) {
+        this.tsignPic = tsignPic;
+    }
+
+    public String getTaxRegisterPic() {
+        return taxRegisterPic;
+    }
+
+    public void setTaxRegisterPic(String taxRegisterPic) {
+        this.taxRegisterPic = taxRegisterPic;
+    }
+
+    public String getCompanyAccountInfoPic() {
+        return companyAccountInfoPic;
+    }
+
+    public void setCompanyAccountInfoPic(String companyAccountInfoPic) {
+        this.companyAccountInfoPic = companyAccountInfoPic;
+    }
+
+    public String getLogo() {
+        return logo;
+    }
+
+    public void setLogo(String logo) {
+        this.logo = logo;
+    }
+
+    public String getCorporateChops() {
+        return corporateChops;
+    }
+
+    public void setCorporateChops(String corporateChops) {
+        this.corporateChops = corporateChops;
+    }
+
+    public String getCorporateFinanceChops() {
+        return corporateFinanceChops;
+    }
+
+    public void setCorporateFinanceChops(String corporateFinanceChops) {
+        this.corporateFinanceChops = corporateFinanceChops;
+    }
+
+    public String getAreaCode() {
+        return areaCode;
+    }
+
+    public void setAreaCode(String areaCode) {
+        this.areaCode = areaCode;
+    }
+
+}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java

@@ -199,6 +199,9 @@ public class MusicGroup extends BaseEntity {
 	
 	@ApiModelProperty(value = "收费标准",required = false)
 	private BigDecimal chargeStandard;
+	
+	@ApiModelProperty(value = "是否赠送辅件",required = false)
+	private Boolean isGiveAccessories;
 
 	public Integer getHasInstrumentNum() {
 		return hasInstrumentNum;
@@ -689,4 +692,12 @@ public class MusicGroup extends BaseEntity {
 	public void setChargeStandard(BigDecimal chargeStandard) {
 		this.chargeStandard = chargeStandard;
 	}
+
+	public Boolean getIsGiveAccessories() {
+		return isGiveAccessories;
+	}
+
+	public void setIsGiveAccessories(Boolean isGiveAccessories) {
+		this.isGiveAccessories = isGiveAccessories;
+	}
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Teacher.java

@@ -119,6 +119,8 @@ public class Teacher extends SysUser {
 	private Integer lectureNum;
 	
 	private String memo;
+	
+	private String contractUrl;
 
 	private BigDecimal operatingIndex;
 	private BigDecimal serviceIndex;
@@ -390,6 +392,14 @@ public class Teacher extends SysUser {
 		this.memo = memo;
 	}
 
+	public String getContractUrl() {
+		return contractUrl;
+	}
+
+	public void setContractUrl(String contractUrl) {
+		this.contractUrl = contractUrl;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 28 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantApply.java

@@ -35,7 +35,17 @@ public class TenantApply {
 	
 	/** 回访记录 */
 	private String callBackLog;
-	
+
+    /**
+     * 回访人/沟通人
+     */
+    private String callBackPeople;
+
+    /**
+     * 推荐人/非必填
+     */
+    private String recommender;
+
 	private String smsCode;
 	
 	public void setId(Long id){
@@ -126,7 +136,23 @@ public class TenantApply {
 		this.smsCode = smsCode;
 	}
 
-	@Override
+    public String getCallBackPeople() {
+        return callBackPeople;
+    }
+
+    public void setCallBackPeople(String callBackPeople) {
+        this.callBackPeople = callBackPeople;
+    }
+
+    public String getRecommender() {
+        return recommender;
+    }
+
+    public void setRecommender(String recommender) {
+        this.recommender = recommender;
+    }
+
+    @Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
 	}

+ 85 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantApplyCallRecord.java

@@ -0,0 +1,85 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+
+/**
+ * 机构申请记录(TenantApplyCallRecord)表实体类
+ *
+ * @author hgw
+ * @since 2022-02-09 10:44:23
+ */
+@ApiModel(value = "tenant_apply_call_record-机构申请记录")
+public class TenantApplyCallRecord implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @TableField("tenant_apply_id_")
+    @ApiModelProperty(value = "tenant_apply表id")
+    private Integer tenantApplyId;
+
+    @TableField("call_back_people_")
+    @ApiModelProperty(value = "回访人/沟通人姓名")
+    private String callBackPeople;
+
+    @TableField("call_back_log_")
+    @ApiModelProperty(value = "回访/沟通记录-最多140个字符")
+    private String callBackLog;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "沟通时间")
+    private Date createTime;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getTenantApplyId() {
+        return tenantApplyId;
+    }
+
+    public void setTenantApplyId(Integer tenantApplyId) {
+        this.tenantApplyId = tenantApplyId;
+    }
+
+    public String getCallBackPeople() {
+        return callBackPeople;
+    }
+
+    public void setCallBackPeople(String callBackPeople) {
+        this.callBackPeople = callBackPeople;
+    }
+
+    public String getCallBackLog() {
+        return callBackLog;
+    }
+
+    public void setCallBackLog(String callBackLog) {
+        this.callBackLog = callBackLog;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+}
+

+ 140 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantContractRecord.java

@@ -0,0 +1,140 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 机构协议记录表(TenantContractRecord)表实体类
+ *
+ * @author hgw
+ * @since 2022-02-12 16:16:41
+ */
+@ApiModel(value = "tenant_contract_record-机构协议记录表")
+public class TenantContractRecord implements Serializable {
+
+    public enum TenantContractRecordEnum {
+        OPEN(0, "机构开通"),
+        RENEW(1, "机构续费");
+
+        private Integer type;
+
+        private String msg;
+
+        TenantContractRecordEnum(Integer type, String msg) {
+            this.type = type;
+            this.msg = msg;
+        }
+
+        public Integer getType() {
+            return type;
+        }
+
+        public void setType(Integer type) {
+            this.type = type;
+        }
+
+        public String getMsg() {
+            return msg;
+        }
+
+        public void setMsg(String msg) {
+            this.msg = msg;
+        }
+    }
+
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @TableField("tenant_id_")
+    @ApiModelProperty(value = "机构id")
+    private Integer tenantId;
+
+    @TableField("contract_name_")
+    @ApiModelProperty(value = "协议名称")
+    private String contractName;
+
+    @TableField("url_")
+    @ApiModelProperty(value = "协议网络地址")
+    private String url;
+
+    @TableField("type_")
+    @ApiModelProperty(value = "协议类型 0机构开通 1机构续费 待补充")
+    private Integer type;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField("biz_date_")
+    @ApiModelProperty(value = "创建日期")
+    private Date bizDate;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getContractName() {
+        return contractName;
+    }
+
+    public void setContractName(String contractName) {
+        this.contractName = contractName;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Date getBizDate() {
+        return bizDate;
+    }
+
+    public void setBizDate(Date bizDate) {
+        this.bizDate = bizDate;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+}
+

+ 159 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantContractTemplate.java

@@ -0,0 +1,159 @@
+package com.ym.mec.biz.dal.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(tenant_contract_template):
+ */
+public class TenantContractTemplate {
+
+	@ApiModelProperty(value = "编号")
+	private Integer id;
+
+	@ApiModelProperty(value = "协议名称")
+	private String name;
+
+	@ApiModelProperty(value = "协议类型")
+	private String type;
+
+	@ApiModelProperty(value = "协议内容")
+	private String contractTemplateContent;
+
+	@ApiModelProperty(value = "原始协议文件url")
+	private String origanalFileUrl;
+
+	@ApiModelProperty(value = "协议号")
+	private String contractNo;
+
+	@ApiModelProperty(value = "是否启用(1-启用  0-不启用)")
+	private Boolean status;
+
+	@ApiModelProperty(value = "协议版本号")
+	private Integer version;
+
+	@ApiModelProperty(value = "最后修改人编号")
+	private Integer modifyBy;
+
+	@ApiModelProperty(value = "最后修改时间")
+	private java.util.Date updateTime;
+
+	@ApiModelProperty(value = "创建时间")
+	private java.util.Date createTime;
+
+	@ApiModelProperty(value = "甲方")
+	private String owner;
+	
+	private Integer tenantId;
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Integer getId() {
+		return this.id;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	public void setContractTemplateContent(String contractTemplateContent) {
+		this.contractTemplateContent = contractTemplateContent;
+	}
+
+	public String getContractTemplateContent() {
+		return this.contractTemplateContent;
+	}
+
+	public void setOriganalFileUrl(String origanalFileUrl) {
+		this.origanalFileUrl = origanalFileUrl;
+	}
+
+	public String getOriganalFileUrl() {
+		return this.origanalFileUrl;
+	}
+
+	public void setContractNo(String contractNo) {
+		this.contractNo = contractNo;
+	}
+
+	public String getContractNo() {
+		return this.contractNo;
+	}
+
+	public void setStatus(boolean status) {
+		this.status = status;
+	}
+
+	public boolean getStatus() {
+		return this.status;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+	public Integer getVersion() {
+		return this.version;
+	}
+
+	public void setModifyBy(Integer modifyBy) {
+		this.modifyBy = modifyBy;
+	}
+
+	public Integer getModifyBy() {
+		return this.modifyBy;
+	}
+
+	public void setUpdateTime(java.util.Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public java.util.Date getUpdateTime() {
+		return this.updateTime;
+	}
+
+	public void setCreateTime(java.util.Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public java.util.Date getCreateTime() {
+		return this.createTime;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getOwner() {
+		return owner;
+	}
+
+	public void setOwner(String owner) {
+		this.owner = owner;
+	}
+
+	public Integer getTenantId() {
+		return tenantId;
+	}
+
+	public void setTenantId(Integer tenantId) {
+		this.tenantId = tenantId;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 336 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantPreJoin.java

@@ -0,0 +1,336 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 机构入驻表(预加入)(TenantPreJoin)表实体类
+ *
+ * @author hgw
+ * @since 2022-02-10 13:53:58
+ */
+@ApiModel(value = "tenant_pre_join-机构入驻表(预加入)")
+public class TenantPreJoin implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @TableField("tsign_name_")
+    @ApiModelProperty(value = "公司全称")
+    private String tsignName;
+
+    @TableField("name_")
+    @ApiModelProperty(value = "机构名称/公司简称")
+    private String name;
+
+    @TableField("area_id_")
+    @ApiModelProperty(value = "城市id")
+    private Integer areaId;
+
+    @TableField("area_name_")
+    @ApiModelProperty(value = "城市名称")
+    private String areaName;
+
+    @TableField("email_")
+    @ApiModelProperty(value = "机构邮箱")
+    private String email;
+
+    @TableField("customer_service_phone_")
+    @ApiModelProperty(value = "客服电话")
+    private String customerServicePhone;
+
+    @TableField("tsign_code_")
+    @ApiModelProperty(value = "营业执照编码")
+    private String tsignCode;
+
+    @TableField("address_")
+    @ApiModelProperty(value = "地址")
+    private String address;
+
+    @TableField("remark_")
+    @ApiModelProperty(value = "机构描述-200字")
+    private String remark;
+
+    @TableField("enterprise_liable_name_")
+    @ApiModelProperty(value = "企业负责人")
+    private String enterpriseLiableName;
+
+    @TableField("enterprise_liable_phone_")
+    @ApiModelProperty(value = "企业负责人电话")
+    private String enterpriseLiablePhone;
+
+    @TableField("legal_person_id_front_pic_")
+    @ApiModelProperty(value = "法人身份证正面照片地址")
+    private String legalPersonIdFrontPic;
+
+    @TableField("legal_person_id_reverse_pic_")
+    @ApiModelProperty(value = "法人身份证反面照片地址")
+    private String legalPersonIdReversePic;
+
+    @TableField("contacts_")
+    @ApiModelProperty(value = "项目负责人/机构联系人")
+    private String contacts;
+
+    @TableField("phone_")
+    @ApiModelProperty(value = "项目负责人电话/机构联系人电话")
+    private String phone;
+
+    @TableField("tsign_pic_")
+    @ApiModelProperty(value = "公司营业执照图片")
+    private String tsignPic;
+
+    @TableField("tax_register_pic_")
+    @ApiModelProperty(value = "税务登记证照片地址")
+    private String taxRegisterPic;
+
+    @TableField("company_account_info_pic_")
+    @ApiModelProperty(value = "公司开户信息照片地址")
+    private String companyAccountInfoPic;
+
+    @TableField("logo_")
+    @ApiModelProperty(value = "机构logo")
+    private String logo;
+
+    @TableField("corporate_chops_")
+    @ApiModelProperty(value = "企业公章图片地址")
+    private String corporateChops;
+
+    @TableField("corporate_finance_chops_")
+    @ApiModelProperty(value = "企业财务公章图片地址")
+    private String corporateFinanceChops;
+
+    @TableField("state_")
+    @ApiModelProperty(value = "是否已创建为机构 0未创建 1已创建")
+    private Integer state;
+
+    @TableField("created_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    @TableField("province_id_")
+    @ApiModelProperty(value = "省份id")
+    private Integer provinceId;
+
+    @TableField("province_name_")
+    @ApiModelProperty(value = "省份名称")
+    private String provinceName;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getTsignName() {
+        return tsignName;
+    }
+
+    public void setTsignName(String tsignName) {
+        this.tsignName = tsignName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getAreaId() {
+        return areaId;
+    }
+
+    public void setAreaId(Integer areaId) {
+        this.areaId = areaId;
+    }
+
+    public String getAreaName() {
+        return areaName;
+    }
+
+    public void setAreaName(String areaName) {
+        this.areaName = areaName;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getCustomerServicePhone() {
+        return customerServicePhone;
+    }
+
+    public void setCustomerServicePhone(String customerServicePhone) {
+        this.customerServicePhone = customerServicePhone;
+    }
+
+    public String getTsignCode() {
+        return tsignCode;
+    }
+
+    public void setTsignCode(String tsignCode) {
+        this.tsignCode = tsignCode;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getEnterpriseLiableName() {
+        return enterpriseLiableName;
+    }
+
+    public void setEnterpriseLiableName(String enterpriseLiableName) {
+        this.enterpriseLiableName = enterpriseLiableName;
+    }
+
+    public String getEnterpriseLiablePhone() {
+        return enterpriseLiablePhone;
+    }
+
+    public void setEnterpriseLiablePhone(String enterpriseLiablePhone) {
+        this.enterpriseLiablePhone = enterpriseLiablePhone;
+    }
+
+    public String getLegalPersonIdFrontPic() {
+        return legalPersonIdFrontPic;
+    }
+
+    public void setLegalPersonIdFrontPic(String legalPersonIdFrontPic) {
+        this.legalPersonIdFrontPic = legalPersonIdFrontPic;
+    }
+
+    public String getLegalPersonIdReversePic() {
+        return legalPersonIdReversePic;
+    }
+
+    public void setLegalPersonIdReversePic(String legalPersonIdReversePic) {
+        this.legalPersonIdReversePic = legalPersonIdReversePic;
+    }
+
+    public String getContacts() {
+        return contacts;
+    }
+
+    public void setContacts(String contacts) {
+        this.contacts = contacts;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getTsignPic() {
+        return tsignPic;
+    }
+
+    public void setTsignPic(String tsignPic) {
+        this.tsignPic = tsignPic;
+    }
+
+    public String getTaxRegisterPic() {
+        return taxRegisterPic;
+    }
+
+    public void setTaxRegisterPic(String taxRegisterPic) {
+        this.taxRegisterPic = taxRegisterPic;
+    }
+
+    public String getCompanyAccountInfoPic() {
+        return companyAccountInfoPic;
+    }
+
+    public void setCompanyAccountInfoPic(String companyAccountInfoPic) {
+        this.companyAccountInfoPic = companyAccountInfoPic;
+    }
+
+    public String getLogo() {
+        return logo;
+    }
+
+    public void setLogo(String logo) {
+        this.logo = logo;
+    }
+
+    public String getCorporateChops() {
+        return corporateChops;
+    }
+
+    public void setCorporateChops(String corporateChops) {
+        this.corporateChops = corporateChops;
+    }
+
+    public String getCorporateFinanceChops() {
+        return corporateFinanceChops;
+    }
+
+    public void setCorporateFinanceChops(String corporateFinanceChops) {
+        this.corporateFinanceChops = corporateFinanceChops;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+    }
+
+    public Integer getProvinceId() {
+        return provinceId;
+    }
+
+    public void setProvinceId(Integer provinceId) {
+        this.provinceId = provinceId;
+    }
+
+    public String getProvinceName() {
+        return provinceName;
+    }
+
+    public void setProvinceName(String provinceName) {
+        this.provinceName = provinceName;
+    }
+
+}
+

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/TenantContractTemplateQueryInfo.java

@@ -0,0 +1,17 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+public class TenantContractTemplateQueryInfo extends QueryInfo {
+
+    private Boolean status;
+
+	public Boolean getStatus() {
+		return status;
+	}
+
+	public void setStatus(Boolean status) {
+		this.status = status;
+	}
+
+}

+ 90 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/TenantInfoInfoPageVo.java → mec-biz/src/main/java/com/ym/mec/biz/dal/vo/TenantInfoPageVo.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -12,7 +13,7 @@ import java.util.Date;
  * Created by 2021-12-09
  */
 @ApiModel(value = "分页查询机构信息")
-public class TenantInfoInfoPageVo implements Serializable {
+public class TenantInfoPageVo implements Serializable {
     //机构基础信息
     @ApiModelProperty(value = "机构id")
     private Integer id;
@@ -20,12 +21,18 @@ public class TenantInfoInfoPageVo implements Serializable {
     @ApiModelProperty(value = "机构名称")
     private String name;
 
+    @ApiModelProperty(value = "企业全称称")
+    private String tsignName;
+
     @ApiModelProperty(value = "机构联系人")
     private String contacts;
 
     @ApiModelProperty(value = "机构联系人电话")
     private String phone;
 
+    @ApiModelProperty(value = "地址")
+    private String address;
+
     @ApiModelProperty(value = "机构email")
     private String email;
 
@@ -48,6 +55,9 @@ public class TenantInfoInfoPageVo implements Serializable {
     @ApiModelProperty(value = "服务名称")
     private String serveName;
 
+    @ApiModelProperty(value = "服务id")
+    private Integer serveId;
+
     @ApiModelProperty(value = "学员上限")
     private Integer studentUpLimit;
 
@@ -55,6 +65,21 @@ public class TenantInfoInfoPageVo implements Serializable {
     @ApiModelProperty(value = "到期时间")
     private Date expireDate;
 
+    @ApiModelProperty(value = "合同价单价-续费价格")
+    private BigDecimal contractPrice;
+
+    @ApiModelProperty(value = "开通价")
+    private BigDecimal openPrice;
+
+    @ApiModelProperty(value = "有效期(数字-结合有效期单位)")
+    private Integer expiryCount;
+
+    @ApiModelProperty(value = "有效期单位(年/月)")
+    private String expiryUnit;
+
+    @ApiModelProperty(value = "城市/区域id")
+    private Integer areaId;
+
     @ApiModelProperty(value = "学员上限")
     private Integer userId;
 
@@ -169,4 +194,68 @@ public class TenantInfoInfoPageVo implements Serializable {
     public void setUserId(Integer userId) {
         this.userId = userId;
     }
+
+    public String getTsignName() {
+        return tsignName;
+    }
+
+    public void setTsignName(String tsignName) {
+        this.tsignName = tsignName;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public BigDecimal getContractPrice() {
+        return contractPrice;
+    }
+
+    public void setContractPrice(BigDecimal contractPrice) {
+        this.contractPrice = contractPrice;
+    }
+
+    public Integer getExpiryCount() {
+        return expiryCount;
+    }
+
+    public void setExpiryCount(Integer expiryCount) {
+        this.expiryCount = expiryCount;
+    }
+
+    public String getExpiryUnit() {
+        return expiryUnit;
+    }
+
+    public void setExpiryUnit(String expiryUnit) {
+        this.expiryUnit = expiryUnit;
+    }
+
+    public Integer getAreaId() {
+        return areaId;
+    }
+
+    public void setAreaId(Integer areaId) {
+        this.areaId = areaId;
+    }
+
+    public Integer getServeId() {
+        return serveId;
+    }
+
+    public void setServeId(Integer serveId) {
+        this.serveId = serveId;
+    }
+
+    public BigDecimal getOpenPrice() {
+        return openPrice;
+    }
+
+    public void setOpenPrice(BigDecimal openPrice) {
+        this.openPrice = openPrice;
+    }
 }

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

@@ -2,10 +2,8 @@ package com.ym.mec.biz.service;
 
 import java.math.BigDecimal;
 import java.util.Date;
-import java.util.List;
 import java.util.Map;
 
-import com.ym.mec.biz.dal.dto.CirculationUser;
 import com.ym.mec.biz.dal.dto.OAFinancialDto;
 import com.ym.mec.biz.dal.entity.SysUserTsign;
 import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
@@ -25,7 +23,7 @@ public interface ContractService {
 	SysUserTsign register(Integer userId, String realName, String idCardNo, String mobileNo);
 
     void addTsign(Integer userId,String organCode, String orgName,Integer tenantId);
-
+    
 	/**
 	 * 传递注册协议至第三方公证平台
 	 * @param userId

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

@@ -20,6 +20,8 @@ public interface PlatformServeService extends IService<PlatformServe> {
 
     PageInfo<PlatformServePageVo> queryPage(String search, Integer page, Integer rows);
 
+    PlatformServePageVo queryProductNameById(Integer id);
+
     PlatformServeInfoVo queryInfo(Integer id);
 
     List<PlatformServeModeVo> queryModeDetail(Integer id);

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

@@ -29,4 +29,10 @@ public interface SysAreaService extends BaseService<Integer, SysArea> {
      * @return
      */
     SysArea getParentArea(Integer id);
+
+    /**
+     * 根据code查询
+     */
+    SysArea queryByCode(String code);
+
 }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantApplyCallRecordService.java

@@ -0,0 +1,22 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.entity.TenantApplyCallRecord;
+import com.ym.mec.common.page.PageInfo;
+
+import java.util.Map;
+
+/**
+ * 机构申请记录(TenantApplyCallRecord)表服务接口
+ *
+ * @author hgw
+ * @since 2022-02-09 10:44:23
+ */
+public interface TenantApplyCallRecordService extends IService<TenantApplyCallRecord> {
+
+    PageInfo<TenantApplyCallRecord> queryPage(Map<String,Object> param);
+
+    int insert(TenantApplyCallRecord obj);
+
+}
+

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantConfigService.java

@@ -4,6 +4,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ym.mec.biz.dal.dto.TenantConfigDto;
 import com.ym.mec.biz.dal.entity.TenantConfig;
 
+import java.math.BigDecimal;
+import java.util.Map;
+
 public interface TenantConfigService extends IService<TenantConfig> {
 
     void addConfig(TenantConfigDto dto);
@@ -11,4 +14,8 @@ public interface TenantConfigService extends IService<TenantConfig> {
     void updateConfig(TenantConfigDto dto);
     
     TenantConfig queryByTenantId(Integer tenantId);
+
+    Map<String, BigDecimal> getRule(Integer tenantId);
+
+    Map<String, BigDecimal> getCloudRoomRule(String config);
 }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantContractRecordService.java

@@ -0,0 +1,22 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.entity.TenantContractRecord;
+import com.ym.mec.biz.dal.entity.TenantContractRecord.TenantContractRecordEnum;
+import com.ym.mec.common.page.PageInfo;
+
+import java.util.Map;
+
+/**
+ * 机构协议记录表(TenantContractRecord)表服务接口
+ *
+ * @author hgw
+ * @since 2022-02-12 16:16:41
+ */
+public interface TenantContractRecordService extends IService<TenantContractRecord> {
+
+    int insertContractRecord(Integer tenantId, String contractPath, TenantContractRecordEnum en);
+
+    PageInfo<TenantContractRecord> queryPage(Map<String, Object> param);
+}
+

+ 45 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantContractTemplateService.java

@@ -0,0 +1,45 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.dto.TenantContractTemplateDto;
+import com.ym.mec.biz.dal.entity.TenantContractTemplate;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.common.service.BaseService;
+
+public interface TenantContractTemplateService extends BaseService<Integer, TenantContractTemplate> {
+	
+	/**
+	 * 分页查询
+	 * @param queryInfo
+	 * @return
+	 */
+	PageInfo<TenantContractTemplateDto> queryPageList(QueryInfo queryInfo);
+	
+	/**
+	 * 启用协议
+	 * @param id
+	 * @param userId 操作人
+	 * @return
+	 */
+	boolean enableContract(Integer id, Integer userId);
+
+	/**
+	 * 更新协议版本
+	 * @return
+	 */
+	boolean updateContractVersion();
+	
+	/**
+	 * 查询最新协议模板
+	 * @param tenantId
+	 * @param owner
+	 * @param type
+	 * @return
+	 */
+	TenantContractTemplate queryLatestContractTemplate(Integer tenantId, String owner, String type);
+	
+	boolean createContractTemplate(TenantContractTemplate tenantContractTemplate);
+	
+	boolean updateContractTempalte(TenantContractTemplate tenantContractTemplate);
+	
+}

+ 14 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/TenantInfoService.java

@@ -1,16 +1,11 @@
 package com.ym.mec.biz.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ym.mec.biz.dal.dao.TenantInfoDao;
 import com.ym.mec.biz.dal.dto.TenantInfoDto;
-import com.ym.mec.biz.dal.entity.TenantInfo;
-import com.ym.mec.biz.dal.entity.TenantOrderRecord;
-import com.ym.mec.biz.dal.entity.TenantProductInfo;
-import com.ym.mec.biz.dal.entity.TenantProductSumm;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.TenantOrderRecordEnum;
-import com.ym.mec.biz.dal.vo.TenantInfoInfoPageVo;
+import com.ym.mec.biz.dal.vo.TenantInfoPageVo;
 import com.ym.mec.common.page.PageInfo;
-import com.ym.mec.thirdparty.yqpay.Msg;
 import org.redisson.api.RBucket;
 
 import javax.servlet.http.HttpServletRequest;
@@ -19,8 +14,6 @@ import java.util.Map;
 
 public interface TenantInfoService extends IService<TenantInfo> {
 
-    TenantInfoDao baseMapper();
-
     void addTenantInfo(TenantInfoDto dto);
 
     void updateTenantInfo(TenantInfoDto dto);
@@ -29,12 +22,14 @@ public interface TenantInfoService extends IService<TenantInfo> {
 
     TenantInfoDto queryTenantInfoCheck(Integer tenantId);
 
-    Map<String,Object> opsTenantState(Integer id, Integer state);
+    Map<String, Object> opsTenantState(Integer id, Integer state);
 
-    PageInfo<TenantInfoInfoPageVo> queryPage(Map<String, Object> param);
+    PageInfo<TenantInfoPageVo> queryPage(Map<String, Object> param);
 
     TenantInfo get(Integer tenantId);
 
+    String getContract(Integer tenantId, TenantContractRecord.TenantContractRecordEnum en, Integer val);
+
     Map<String, Object> tenantOpenPay(Integer tenantId) throws Exception;
 
     Map<String, Object> tenantRenewPay(Integer tenantId, Integer val) throws Exception;
@@ -46,6 +41,8 @@ public interface TenantInfoService extends IService<TenantInfo> {
     TenantOrderRecord createOrderRecord(Integer tenantId, BigDecimal payAmount, String orderNo, TenantOrderRecordEnum
             tenantEnum, Integer orderState, String merNos);
 
+    void tenantOpenSuccess(Integer tenantId);
+
     Map<String, Object> recharge(Integer tenantId, BigDecimal amount) throws Exception;
 
     Boolean rechargeCheck(String orderNo) throws Exception;
@@ -53,16 +50,17 @@ public interface TenantInfoService extends IService<TenantInfo> {
     TenantProductSumm queryTenantInfoProductSumm(Integer id);
 
     /**
-    * @description: 保存tenantId
      * @param request
-    * @return void
-    * @author zx
-    * @date 2022/1/7 14:42
-    */
+     * @return void
+     * @description: 保存tenantId
+     * @author zx
+     * @date 2022/1/7 14:42
+     */
     void saveTenantContextHolder(HttpServletRequest request);
 
     /**
      * 按部门查询机构信息
+     *
      * @return 机构信息
      */
     TenantInfo queryTenantInfoByOrgan(Integer organId);

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

@@ -0,0 +1,23 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dto.TenantPreJoinDto;
+import com.ym.mec.biz.dal.entity.TenantPreJoin;
+import com.ym.mec.common.page.PageInfo;
+
+import java.util.Map;
+
+/**
+ * 机构入驻表(预加入)(TenantPreJoin)表服务接口
+ *
+ * @author hgw
+ * @since 2022-02-09 14:38:28
+ */
+public interface TenantPreJoinService extends IService<TenantPreJoin> {
+
+    PageInfo<TenantPreJoin> queryPage(Map<String, Object> param);
+
+    int insert(TenantPreJoinDto obj);
+
+}
+

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

@@ -9,4 +9,6 @@ public interface TenantProductInfoService extends IService<TenantProductInfo> {
     void addTenantProduct(TenantProductInfoDto dto);
 
     void updateTenantProduct(TenantProductInfoDto dto);
+
+    void updateByTenantId(TenantProductInfo obj);
 }

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

@@ -31,7 +31,7 @@ public class UploadFileService {
 	private int maxSize;
 
 	/** 支持的扩展名 */
-	@Value("${common.upload.supportExtensions:jpg,jpeg,gif,png,mp3,mid,midi,aac,m4a,mp4,xml,xlsx,xls,doc,docx,txt,pdf,psd,eps,rar,zip}")
+	@Value("${common.upload.supportExtensions:jpg,jpeg,gif,png,mp3,mid,midi,aac,m4a,mp4,xml,xlsx,xls,doc,docx,txt,pdf,psd,eps,rar,zip,ai,eps,svg,sketch}")
 	private String supportExtensions;
 
 	/** 文件根目录 */

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

@@ -1,18 +1,81 @@
 package com.ym.mec.biz.service.impl;
 
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.http.HttpStatus;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.enums.CertificateTypeEnum;
-import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
+import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import java.nio.charset.Charset;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.SysUserContractsDao;
 import com.ym.mec.biz.dal.dto.CirculationUser;
 import com.ym.mec.biz.dal.dto.OAFinancialDto;
 import com.ym.mec.biz.dal.dto.StudentInfo;
 import com.ym.mec.biz.dal.entity.CooperationOrgan.OwnershipType;
-import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
+import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
+import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.biz.dal.entity.SysUserContracts;
 import com.ym.mec.biz.dal.entity.SysUserContracts.ContractType;
+import com.ym.mec.biz.dal.entity.SysUserTsign;
+import com.ym.mec.biz.dal.entity.TenantConfig;
+import com.ym.mec.biz.dal.entity.TenantContractTemplate;
+import com.ym.mec.biz.dal.entity.TenantInfo;
+import com.ym.mec.biz.dal.entity.VipGroup;
 import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.service.ContractService;
+import com.ym.mec.biz.service.GoodsService;
+import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.MusicGroupSubjectGoodsGroupService;
+import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.SubjectService;
+import com.ym.mec.biz.service.SysUserContractsService;
+import com.ym.mec.biz.service.SysUserTsignService;
+import com.ym.mec.biz.service.TenantConfigService;
+import com.ym.mec.biz.service.TenantContractTemplateService;
+import com.ym.mec.biz.service.TenantInfoService;
+import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
@@ -25,31 +88,6 @@ import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.freemarker.FreemarkerTemplateEngine;
 import com.ym.mec.util.money.MoneyUtil;
 import com.ym.mec.util.pdf.PDFUtil;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.http.HttpStatus;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Isolation;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
-import java.io.File;
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.time.LocalDateTime;
-import java.util.*;
-import java.util.stream.Collectors;
 
 @Service
 public class ContractServiceImpl implements ContractService, InitializingBean {
@@ -115,6 +153,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
     
     @Autowired
     private TenantConfigService tenantConfigService;
+    
+    @Autowired
+    private TenantContractTemplateService tenantContractTemplateService;
 
     @Value("${contract.baseDir:/var/pdf}")
     private String contractBaseDir;
@@ -151,25 +192,48 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
      * 校验企业营业信息,不存在则添加一个
      */
     @Override
-    public void addTsign(Integer userId, String organCode, String orgName, Integer tenantId) {
-        Optional.ofNullable(organCode).orElseThrow(() -> new BizException("营业执照编号不能为空!"));
-        Optional.ofNullable(orgName).orElseThrow(() -> new BizException("营业名称不能为空"));
+	public void addTsign(Integer userId, String organCode, String orgName, Integer tenantId) {
+		Optional.ofNullable(organCode).orElseThrow(() -> new BizException("营业执照编号不能为空!"));
+		Optional.ofNullable(orgName).orElseThrow(() -> new BizException("营业名称不能为空"));
 
-        String accountId = eSealPlugin.createOrganAccount(orgName, organCode);
-        if (StringUtils.isBlank(accountId)) {
-            throw new BizException("创建企业电子存证账户失败");
-        }
+		SysUserTsign sysUserTsign = null;
 
-        String sealData = eSealPlugin.createOrganSeal(accountId, "", "");
-        if (StringUtils.isBlank(sealData)) {
-            throw new BizException("创建电子存证印章失败");
-        }
+		SysUserTsign orignSysUserTsign = sysUserTsignService.get(-userId);
 
-        SysUserTsign sysUserTsign = new SysUserTsign(-userId, accountId, sealData, orgName, organCode, tenantId);
-        sysUserTsignService.insert(sysUserTsign);
-    }
+		if (orignSysUserTsign == null || !StringUtils.equals(orignSysUserTsign.getCardNo(), organCode)) {
 
-    @Override
+			String accountId = eSealPlugin.createOrganAccount(orgName, organCode);
+			if (StringUtils.isBlank(accountId)) {
+				throw new BizException("创建企业电子存证账户失败");
+			}
+
+			String sealData = eSealPlugin.createOrganSeal(accountId, "", "");
+			if (StringUtils.isBlank(sealData)) {
+				throw new BizException("创建电子存证印章失败");
+			}
+
+			sysUserTsign = new SysUserTsign(-userId, accountId, sealData, orgName, organCode, tenantId);
+
+			if (orignSysUserTsign == null) {
+				sysUserTsignService.insert(sysUserTsign);
+			} else {
+				orignSysUserTsign.setAccountId(accountId);
+				orignSysUserTsign.setSealData(sealData);
+				orignSysUserTsign.setName(orgName);
+				orignSysUserTsign.setCardNo(organCode);
+				sysUserTsignService.update(orignSysUserTsign);
+			}
+
+		} else if (!StringUtils.equals(orignSysUserTsign.getName(), orgName)) {
+			if (eSealPlugin.updateOrganAccount(orignSysUserTsign.getAccountId(), orgName, organCode)) {
+				orignSysUserTsign.setName(orgName);
+				sysUserTsignService.update(orignSysUserTsign);
+			}
+		}
+
+	}
+
+	@Override
     public SysUserTsign register(Integer userId, String realName, String idCardNo, String mobileNo) {
 
         if (StringUtils.isBlank(realName) || StringUtils.isBlank(idCardNo) || StringUtils.isBlank(mobileNo)) {
@@ -907,8 +971,18 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
         if (Objects.nonNull(courseViewType)) {
             ownershipType = courseViewType;
         }
+		
+        // 查询最新协议模板
+		TenantContractTemplate tenantContractTemplate = tenantContractTemplateService.queryLatestContractTemplate(user.getTenantId(), null, null);
+		if(tenantContractTemplate == null){
+			logger.error("最新协议模板查询失败");
+			return;
+		}
+		String mainContent = tenantContractTemplate.getContractTemplateContent();
+		params.put("contractMainContent", mainContent);
 
-        List<SysUserContracts> userContracts = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT, ownershipType.getContractVersion());
+        // 查询是否已生成协议
+        List<SysUserContracts> userContracts = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT, tenantContractTemplate.getVersion());
         if (!CollectionUtils.isEmpty(userContracts)) {
             return;
         }
@@ -923,20 +997,20 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			throw new BizException("机构配置信息查询失败");
 		}
 		
-		params.put("compayName", tenantInfo.getTsignName());
+		params.put("companyName", tenantInfo.getTsignName());
 		params.put("sealPicture", tenantConfig.getCorporateChops());
         
 		if (studentInfo.getTenantId() == 1) {
 			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
-				params.put("compayName", "深圳大雅乐盟网络教育股份有限公司");
-				params.put("sealPicture", "https://daya-online.oss-cn-beijing.aliyuncs.com/website/cachet.png");
+				//params.put("companyName", "深圳大雅乐盟网络教育股份有限公司");
+				//params.put("sealPicture", "https://daya-online.oss-cn-beijing.aliyuncs.com/website/cachet.png");
 			} else {
-				params.put("compayName", "武汉长乐长风乐器销售有限公司");
+				params.put("companyName", "武汉长乐长风乐器销售有限公司");
 				params.put("sealPicture", "https://daya-online.oss-cn-beijing.aliyuncs.com/website/clcf.png");
 			}
 		}
 
-        templateEngine.render(params, "product" + ownershipType.getContractVersion() + ".ftl", srcFile);
+        templateEngine.render(params, "latest_contract_template.ftl", srcFile);
 
         // 生成借款协议PDF
         try {
@@ -979,7 +1053,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
         sysUserContracts.setType(ContractType.PRODUCT);
         sysUserContracts.setUrl(pdfFilePath);
         sysUserContracts.setUserId(userId);
-        sysUserContracts.setVersion(ownershipType.getContractVersion());
+        sysUserContracts.setVersion(tenantContractTemplate.getVersion());
 
         sysUserContractsService.insert(sysUserContracts);
 
@@ -1049,20 +1123,27 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			throw new BizException("机构配置信息查询失败");
 		}
 		
-		params.put("compayName", tenantInfo.getTsignName());
+		params.put("companyName", tenantInfo.getTsignName());
 		params.put("sealPicture", tenantConfig.getCorporateChops());
         
 		if (studentInfo.getTenantId() == 1) {
 			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
-				//params.put("compayName", "深圳大雅乐盟网络教育股份有限公司");
+				//params.put("companyName", "深圳大雅乐盟网络教育股份有限公司");
 				//params.put("sealPicture", "https://daya-online.oss-cn-beijing.aliyuncs.com/website/cachet.png");
 			} else {
-				params.put("compayName", "武汉长乐长风乐器销售有限公司");
+				params.put("companyName", "武汉长乐长风乐器销售有限公司");
 				params.put("sealPicture", "https://daya-online.oss-cn-beijing.aliyuncs.com/website/clcf.png");
 			}
 		}
+		
+		TenantContractTemplate tenantContractTemplate = tenantContractTemplateService.queryLatestContractTemplate(studentInfo.getTenantId(), null, null);
+		if(tenantContractTemplate == null){
+			throw new BizException("最新协议模板查询失败");
+		}
+		String mainContent = tenantContractTemplate.getContractTemplateContent();
+		params.put("contractMainContent", mainContent);
 
-        templateEngine.render(params, "product" + ownershipType.getContractVersion() + ".ftl", srcFile);
+        templateEngine.render(params, "latest_contract_template.ftl", srcFile);
 
         String html = "";
         try {
@@ -1130,8 +1211,22 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
         params.put("isShowVisualSeal", false);
 
-        CourseViewTypeEnum courseViewType = CourseViewTypeEnum.COURSE_FEE;
         params.put("ownershipType", "OWN");
+		
+        // 查询最新协议模板
+		TenantContractTemplate tenantContractTemplate = tenantContractTemplateService.queryLatestContractTemplate(user.getTenantId(), null, null);
+		if(tenantContractTemplate == null){
+			logger.error("最新协议模板查询失败");
+            return BaseController.succeed();
+		}
+		String mainContent = tenantContractTemplate.getContractTemplateContent();
+		params.put("contractMainContent", mainContent);
+
+        // 查询是否已生成协议
+        List<SysUserContracts> userContracts = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT, tenantContractTemplate.getVersion());
+        if (!CollectionUtils.isEmpty(userContracts)) {
+            return BaseController.succeed();
+        }
         
 		TenantInfo tenantInfo = tenantInfoService.get(studentInfo.getTenantId());
 		if(tenantInfo == null){
@@ -1143,29 +1238,24 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			throw new BizException("机构配置信息查询失败");
 		}
 		
-		params.put("compayName", tenantInfo.getTsignName());
+		params.put("companyName", tenantInfo.getTsignName());
 		params.put("sealPicture", tenantConfig.getCorporateChops());
         
 		if (studentInfo.getTenantId() == 1) {
 			if (OwnershipType.OWN.name().equals(params.get("ownershipType"))) {
-				//params.put("compayName", "深圳大雅乐盟网络教育股份有限公司");
+				//params.put("companyName", "深圳大雅乐盟网络教育股份有限公司");
 				//params.put("sealPicture", "https://daya-online.oss-cn-beijing.aliyuncs.com/website/cachet.png");
 			} else {
-				params.put("compayName", "武汉长乐长风乐器销售有限公司");
+				params.put("companyName", "武汉长乐长风乐器销售有限公司");
 				params.put("sealPicture", "https://daya-online.oss-cn-beijing.aliyuncs.com/website/clcf.png");
 			}
 		}
 
-        List<SysUserContracts> userContracts = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT, 2);
-        if (!CollectionUtils.isEmpty(userContracts)) {
-            return BaseController.succeed();
-        }
-
-        templateEngine.render(params, "product2.ftl", srcFile);
+        templateEngine.render(params, "latest_contract_template.ftl", srcFile);
 
         // 生成借款协议PDF
         try {
-            PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath, "simsun.ttc");
+            PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile, Charset.defaultCharset()), srcPdfPath, "simsun.ttc");
         } catch (IOException e) {
             logger.error("生成产品协议失败", e);
             return BaseController.failed("生成产品协议失败");
@@ -1205,6 +1295,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
         sysUserContracts.setUrl(pdfFilePath);
         sysUserContracts.setUserId(userId);
         sysUserContracts.setVersion(2);
+        sysUserContracts.setTenantId(user.getTenantId());
 
         sysUserContractsService.insert(sysUserContracts);
 

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

@@ -769,11 +769,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 							throw new BizException("调整时间不得早于开课时间({})",groupStartDate);
 						}
 					}
-					if (groupEndDate != null) {
+					/*if (groupEndDate != null) {
 						if (calendar.getTime().after(groupEndDate)) {
 							throw new BizException("排课时间超出排课截止日期({})", DateUtil.dateToString(groupEndDate, DateUtil.DATE_FORMAT_MIN));
 						}
-					}
+					}*/
 
 					courseScheduleDao.insert(courseSchedule);
 					courseScheduleList.add(courseSchedule);
@@ -1683,6 +1683,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			existCours.setUpdateTime(now);
 			existCours.setStartClassTime(ac.getStartClassTime());
 			existCours.setEndClassTime(DateUtil.addMinutes(existCours.getStartClassTime(), singleClassMinutes));
+            
+            //课程结束时间必须在21:00之前
+            if(DateUtil.getHour(existCours.getEndClassTime()) > 20 && DateUtil.getMinute(existCours.getEndClassTime()) > 0){
+            	throw new BizException("课程结束时间不能超过21:00,请重新调整上课时间");
+            }
 
 			if(!DateUtil.isSameDay(existCours.getStartClassTime(), existCours.getEndClassTime())){
 				throw new BizException("课程暂不支持跨天");
@@ -3353,6 +3358,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
             	int minutes = DateUtil.minutesBetween(oldCourseSchedule.getStartClassTime(), oldCourseSchedule.getEndClassTime());
             	newCourseSchedule.setEndClassTime(DateUtil.addMinutes(newCourseSchedule.getStartClassTime(), minutes));
             }
+            
+            //课程结束时间必须在21:00之前
+            if(DateUtil.getHour(newCourseSchedule.getEndClassTime()) > 20 && DateUtil.getMinute(newCourseSchedule.getEndClassTime()) > 0){
+            	throw new BizException("课程结束时间不能超过21:00,请重新调整上课时间");
+            }
+            
             //判断上课时间是否跨天
 			if (!DateUtil.isSameDay(newCourseSchedule.getStartClassTime(), newCourseSchedule.getEndClassTime())) {
 				throw new BizException("上课时间不允许跨天,请重新调整上课时间");

+ 77 - 57
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberFeeSettingServiceImpl.java

@@ -1,78 +1,98 @@
 package com.ym.mec.biz.service.impl;
 
+import com.ym.mec.biz.dal.dao.MemberFeeSettingDao;
+import com.ym.mec.biz.dal.entity.MemberFeeSetting;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
+import com.ym.mec.biz.service.MemberFeeSettingService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
-import org.springframework.beans.factory.annotation.Autowired;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.biz.dal.entity.MemberFeeSetting;
-import com.ym.mec.biz.service.MemberFeeSettingService;
-import com.ym.mec.biz.dal.dao.MemberFeeSettingDao;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.util.Objects;
 import java.util.function.BiFunction;
 
-import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum.AUDITING;
-
 @Service
-public class MemberFeeSettingServiceImpl extends BaseServiceImpl<Integer, MemberFeeSetting>  implements MemberFeeSettingService {
-	
-	@Autowired
-	private MemberFeeSettingDao memberFeeSettingDao;
+public class MemberFeeSettingServiceImpl extends BaseServiceImpl<Integer, MemberFeeSetting> implements MemberFeeSettingService {
 
-	@Override
-	public BaseDAO<Integer, MemberFeeSetting> getDAO() {
-		return memberFeeSettingDao;
-	}
+    @Autowired
+    private MemberFeeSettingDao memberFeeSettingDao;
+
+    @Override
+    public BaseDAO<Integer, MemberFeeSetting> getDAO() {
+        return memberFeeSettingDao;
+    }
 
     @Override
     public MemberFeeSetting findByRankIdAndOrganId(Integer organId, Integer rankId) {
-		return memberFeeSettingDao.findByRankIdAndOrganId(organId,rankId);
+        return memberFeeSettingDao.findByRankIdAndOrganId(organId, rankId);
+    }
+
+    @Override
+    public BigDecimal getAmount(Integer organId, Integer memberRankSettingId, PeriodEnum period, BigDecimal num,
+                                BiFunction<PeriodEnum, MemberFeeSetting, BigDecimal> func) {
+        MemberFeeSetting memberFee = memberFeeSettingDao.findByRankIdAndOrganId(organId, memberRankSettingId);
+        if (memberFee == null) {
+            throw new BizException("操作失败:请配置当前分部会员收费标准");
+        }
+        //获取总价(原价或者现价)
+        return func.apply(period, memberFee).multiply(num).setScale(0, BigDecimal.ROUND_HALF_UP);
     }
 
-	@Override
-	public BigDecimal getAmount(Integer organId, Integer memberRankSettingId, PeriodEnum period, BigDecimal num,
-								BiFunction<PeriodEnum, MemberFeeSetting, BigDecimal> func) {
-		MemberFeeSetting memberFee = memberFeeSettingDao.findByRankIdAndOrganId(organId,memberRankSettingId);
-		if(memberFee == null){
-			throw new BizException("操作失败:请配置当前分部会员收费标准");
-		}
-		//获取总价(原价或者现价)
-		return func.apply(period,memberFee).multiply(num).setScale(0, BigDecimal.ROUND_HALF_UP);
-	}
+    public static BigDecimal getGroupPurchaseFee(PeriodEnum periodEnum, MemberFeeSetting memberFee) {
+        BigDecimal amount;
+        switch (periodEnum) {
+            case DAY:
+                amount = memberFee.getGroupPurchaseDayFee();
+                break;
+            case MONTH:
+                amount = memberFee.getGroupPurchaseMonthFee();
+                break;
+            case QUARTERLY:
+                amount = memberFee.getGroupPurchaseQuarterlyFee();
+                break;
+            case YEAR_HALF:
+                amount = memberFee.getGroupPurchaseHalfYearFee();
+                break;
+            case YEAR:
+                amount = memberFee.getGroupPurchaseYearFee();
+                break;
+            default:
+                throw new BizException("请选择正确的会员有效期");
+        }
+        if (Objects.isNull(amount)) {
+            throw new BizException("未设置团练宝的价格");
+        }
+        return amount;
+    }
 
-	public static BigDecimal getGroupPurchaseFee(PeriodEnum periodEnum,MemberFeeSetting memberFee){
-		switch (periodEnum){
-			case DAY :
-				return memberFee.getGroupPurchaseDayFee();
-			case MONTH :
-				return memberFee.getGroupPurchaseMonthFee();
-			case QUARTERLY :
-				return memberFee.getGroupPurchaseQuarterlyFee();
-			case YEAR_HALF :
-				return memberFee.getGroupPurchaseHalfYearFee();
-			case YEAR :
-				return memberFee.getGroupPurchaseYearFee();
-			default:
-				throw new BizException("请选择正确的会员有效期");
-		}
-	}
+    public static BigDecimal getOriginalFee(PeriodEnum periodEnum, MemberFeeSetting memberFee) {
+        BigDecimal amount;
+        switch (periodEnum) {
+            case DAY:
+                amount = memberFee.getOriginalDayFee();
+                break;
+            case MONTH:
+                amount = memberFee.getOriginalMonthFee();
+                break;
+            case QUARTERLY:
+                amount = memberFee.getOriginalQuarterlyFee();
+                break;
+            case YEAR_HALF:
+                amount = memberFee.getOriginalHalfYearFee();
+                break;
+            case YEAR:
+                amount = memberFee.getOriginalYearFee();
+                break;
+            default:
+                throw new BizException("请选择正确的会员有效期");
+        }
+        if (Objects.isNull(amount)) {
+            throw new BizException("未设置会员有效期的价格");
+        }
+        return amount;
+    }
 
-	public static BigDecimal getOriginalFee(PeriodEnum periodEnum,MemberFeeSetting memberFee){
-		switch (periodEnum){
-			case DAY :
-				return memberFee.getOriginalDayFee();
-			case MONTH :
-				return memberFee.getOriginalMonthFee();
-			case QUARTERLY :
-				return memberFee.getOriginalQuarterlyFee();
-			case YEAR_HALF :
-				return memberFee.getOriginalHalfYearFee();
-			case YEAR :
-				return memberFee.getOriginalYearFee();
-			default:
-				throw new BizException("请选择正确的会员有效期");
-		}
-	}
 }

+ 56 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java

@@ -4,7 +4,6 @@ import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType.ST
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum.AUDITING;
 import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.NON_PAYMENT;
 import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED;
-import static com.ym.mec.biz.dal.enums.PaymentStatusEnum.YES;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -19,27 +18,54 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderDetailDto;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
-import com.ym.mec.biz.service.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderCourseSettingsDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailDao;
+import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.FeeStudentDto;
 import com.ym.mec.biz.dal.dto.MusicArrearageStudentDto;
+import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderDetailDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.dto.StudentSubTotalCourseTimesDto;
+import com.ym.mec.biz.dal.entity.ActivityUserMapper;
+import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderActivity;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderMember;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
-import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
+import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.dal.page.ArrearageStudentsQueryInfo;
 import com.ym.mec.biz.dal.page.MusicCalenderDetailQueryInfo;
-import com.ym.mec.biz.event.source.GroupEventSource;
-import com.ym.mec.common.constant.CommonConstants;
+import com.ym.mec.biz.service.ActivityUserMapperService;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderActivityService;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderDetailService;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderMemberService;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
@@ -433,10 +459,10 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 		// 所有缴费项目已完成排课才能创建下一个缴费项目
 		List<String> batchNoList = new ArrayList<>();
 		batchNoList.add(batchNo);
-		String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, null, null,batchNoList);
+		/*String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, null, null,batchNoList);
 		if (StringUtils.isNoneBlank(orignBatchNo)) {
 			throw new BizException("当前乐团存在未排课的缴费项目,请先完成排课再操作");
-		}
+		}*/
 		//获取欠费学员列表
 		List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(musicGroupId, new ArrayList<>(userIdList));
 		if(noPaymentUserIds.size() > 0){
@@ -465,6 +491,25 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 		if(Collections.disjoint(userList, userIdList) == false){
 			throw new BizException("操作失败:包含已存在的学员");
 		}
+		
+		List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(musicGroupPaymentCalenderId);
+		
+		if (courseSettingsList != null && courseSettingsList.size() > 0) {
+			List<StudentSubTotalCourseTimesDto> studentCourseTypeDtos = musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTimes(musicGroupId);
+
+			Set<String> courseTypes = new HashSet<String>();
+			for (StudentSubTotalCourseTimesDto dto : studentCourseTypeDtos) {
+				if (userIdList.contains(dto.getUserId())) {
+					courseTypes.addAll(dto.getMapDtos().stream().filter(t -> t.getValue() > 0).map(t -> t.getKey()).collect(Collectors.toSet()));
+				}
+			}
+
+			for (MusicGroupPaymentCalenderCourseSettings mgpccs : courseSettingsList) {
+				if (courseTypes.contains(mgpccs.getCourseType().name())) {
+					throw new BizException("操作失败:存在未排完的[{}]", mgpccs.getCourseType().getMsg());
+				}
+			}
+		}
 
 		Date date = new Date();
 		MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
@@ -540,7 +585,6 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 		musicGroupPaymentCalenderService.update(musicGroupPaymentCalender);
 
 		//创建学生课排课分钟数
-		List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(musicGroupPaymentCalenderId);
 		if(courseSettingsList != null && courseSettingsList.size() > 0){
 			List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<>();
 			MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;

+ 1322 - 1325
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -1,15 +1,12 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.toolkit.support.Property;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.auth.api.entity.SysUserRole;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderDto.MusicGroupPaymentDateRange;
 import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType;
@@ -27,7 +24,6 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
-import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -35,16 +31,11 @@ import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.math.BigInteger;
 import java.util.*;
-import java.util.Map.Entry;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType.SCHOOL;
@@ -57,188 +48,194 @@ import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.ORGAN_MANAGER;
 @Service
 public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long, MusicGroupPaymentCalender> implements MusicGroupPaymentCalenderService {
 
-	@Autowired
-	private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
-	@Autowired
-	private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
-	@Autowired
-	private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
-	@Autowired
-	private MusicGroupPaymentCalenderCourseSettingsServiceImpl musicGroupPaymentCalenderCourseSettingsService;
-	@Autowired
-	private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
-	@Autowired
-	private MusicGroupSchoolTermCourseDetailDao musicGroupSchoolTermCourseDetailDao;
-	@Autowired
-	private MusicGroupSchoolTermStudentCourseDetailDao musicGroupSchoolTermStudentCourseDetailDao;
-	@Autowired
-	private IdGeneratorService idGeneratorService;
-	@Autowired
-	private ClassGroupService classGroupService;
-	@Autowired
-	private MusicGroupDao musicGroupDao;
-	@Autowired
-	private ClassGroupDao classGroupDao;
-	@Autowired
-	private CourseScheduleDao courseScheduleDao;
-	@Autowired
-	private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
-	@Autowired
-	private TeacherAttendanceDao teacherAttendanceDao;
-	@Autowired
-	private MusicGroupBuildLogDao musicGroupBuildLogDao;
-	@Autowired
-	private SysConfigDao sysConfigDao;
-	@Autowired
-	private OrganizationDao organizationDao;
-	@Autowired
-	private SysMessageService sysMessageService;
-	@Autowired
-	private SendSeoMessageSource sendSeoMessageSource;
-	@Autowired
-	private SysUserFeignService sysUserFeignService;
-	@Autowired
-	private ImGroupMemberService imGroupMemberService;
-	@Autowired
-	private ImUserFriendService imUserFriendService;
-	@Autowired
-	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
-	@Autowired
-	private MusicGroupStudentClassAdjustDao musicGroupStudentClassAdjustDao;
-	@Autowired
-	private MusicGroupPaymentCalenderDetailService musicGroupPaymentCalenderDetailService;
-	@Autowired
-	private MusicGroupPaymentCalenderStudentDetailDao musicGroupPaymentCalenderStudentDetailDao;
-	@Autowired
-	private StudentRegistrationDao studentRegistrationDao;
-	@Autowired
-	private GroupEventSource groupEventSource;
-	@Autowired
-	private StudentPaymentOrderDao studentPaymentOrderDao;
-	@Autowired
-	private MemberRankPrivilegesService memberRankPrivilegesService;
-	@Autowired
-	private CloudTeacherOrderDao cloudTeacherOrderDao;
-	@Autowired
-	private MusicGroupPaymentCalenderActivityServiceImpl musicGroupPaymentCalenderActivityService;
-	@Autowired
-	private MusicGroupPaymentCalenderMemberServiceImpl musicGroupPaymentCalenderMemberService;
-	@Autowired
-	private MusicGroupPaymentCalenderRepairServiceImpl musicGroupPaymentCalenderRepairService;
-	@Autowired
-	private StudentDao studentDao;
-	@Autowired
-	private ActivityUserMapperService activityUserMapperService;
-
-	@Override
-	public BaseDAO<Long, MusicGroupPaymentCalender> getDAO() {
-		return musicGroupPaymentCalenderDao;
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public String create(MusicGroupPaymentCalenderDto musicGroupPaymentCalenderDto) {
-		PaymentType paymentType = musicGroupPaymentCalenderDto.getPaymentType();
-		if(paymentType != SPAN_GROUP_CLASS_ADJUST){
-			throw new BizException("操作失败:该入口不支持{}",paymentType.getDesc());
-		}
-		List<MusicGroupPaymentDateRange> musicGroupPaymentDateRangeList = musicGroupPaymentCalenderDto.getMusicGroupPaymentDateRangeList();
-		if(musicGroupPaymentDateRangeList.size() > 1){
-			throw new BizException("创建缴费失败:不支持多周期缴费");
-		}
-		String musicGroupId = musicGroupPaymentCalenderDto.getMusicGroupId();
-		MusicGroup musicGroup = musicGroupDao.getLocked(musicGroupId);
-		if (musicGroup == null) {
-			throw new BizException("乐团查询失败,请检查参数");
-		}
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			throw new BizException("请登录");
-		}
-		// 所有缴费项目已完成排课才能创建下一个缴费项目
-		String organBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, null, null,musicGroupPaymentCalenderDto.getIgnoreBatchNoList());
-		if (StringUtils.isNoneBlank(organBatchNo)) {
-			if(StringUtils.isEmpty(musicGroupPaymentCalenderDto.getBatchNo()) || !musicGroupPaymentCalenderDto.getBatchNo().equals(organBatchNo)){
-				throw new BizException("当前乐团存在未排课的缴费项目,请先完成排课再操作");
-			}
-		}
-
-		List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = musicGroupPaymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails();
-
-		PaymentCalenderStatusEnum status = musicGroupPaymentCalenderDto.getStatus();
-
-		Date date = new Date();
-		String batchNo = idGeneratorService.generatorId() + "";
-
-		MusicGroupPaymentDateRange musicGroupPaymentDateRange = musicGroupPaymentDateRangeList.get(0);
-		MusicGroupPaymentCalender musicGroupPaymentCalender = new MusicGroupPaymentCalender();
-		musicGroupPaymentCalender.setAttribute1(musicGroupPaymentCalenderDto.getAttribute1());
-		musicGroupPaymentCalender.setAttribute2(musicGroupPaymentCalenderDto.getAttribute2());
-		musicGroupPaymentCalender.setDeadlinePaymentDate(musicGroupPaymentDateRange.getDeadlinePaymentDate());
-		musicGroupPaymentCalender.setMemo(musicGroupPaymentCalenderDto.getMemo());
-		musicGroupPaymentCalender.setMusicGroupId(musicGroupId);
-		musicGroupPaymentCalender.setMusicGroupOrganizationCourseSettingId(musicGroupPaymentCalenderDto.getMusicGroupOrganizationCourseSettingId());
-
-		musicGroupPaymentCalender.setOriginalTotalAmount(calenderStudentDetails.stream().map(e->e.getCourseOriginalPrice()).reduce(BigDecimal.ZERO,BigDecimal::add));
-		musicGroupPaymentCalender.setCurrentTotalAmount(calenderStudentDetails.stream().map(e->e.getCourseCurrentPrice()).reduce(BigDecimal.ZERO,BigDecimal::add));
-		musicGroupPaymentCalender.setPaymentType(paymentType);
-		musicGroupPaymentCalender.setPayUserType(musicGroupPaymentCalenderDto.getPayUserType());
-		musicGroupPaymentCalender.setStartPaymentDate(musicGroupPaymentDateRange.getStartPaymentDate());
-		musicGroupPaymentCalender.setStudentIds(musicGroupPaymentCalenderDto.getStudentIds());
-		musicGroupPaymentCalender.setOperator(sysUser.getId());
-		musicGroupPaymentCalender.setCreateTime(date);
-		musicGroupPaymentCalender.setUpdateTime(date);
-		musicGroupPaymentCalender.setStatus(status);
-		musicGroupPaymentCalender.setOrganId(musicGroup.getOrganId());
-		if (musicGroupPaymentCalender.getStatus() != AUDITING) {
-			if (date.after(musicGroupPaymentCalender.getStartPaymentDate())) {
-				musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
-			} else if (date.after(musicGroupPaymentCalender.getDeadlinePaymentDate())) {
-				musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OVER);
-			} else {
-				musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.NO);
-			}
-		}
-		// 设置批次号
-		musicGroupPaymentCalender.setBatchNo(batchNo);
-		musicGroupPaymentCalenderDto.setBatchNo(batchNo);
-		musicGroupPaymentCalenderDao.insert(musicGroupPaymentCalender);
-		//如果是跨团班级合并,保存用户缴费详情
-		//记录学员缴费详情
-		musicGroupPaymentCalenderStudentDetailDao.batchInsert(musicGroupPaymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails(),musicGroupPaymentCalender.getBatchNo());
-		if (musicGroupPaymentCalender.getStatus() != AUDITING) {
-			//如果是跨团班级合并,添加学员
-			musicGroupPaymentCalenderDetailService.batchAdd(musicGroupPaymentCalender,musicGroupPaymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails());
-			//将0元未缴费学员缴费状态更新为已缴费
-			this.updateNoPaymentAndZeroPaymentStatus(musicGroupPaymentCalender,true);
-		}
-		if (status == AUDITING) {
-			// 如果是审核中
-			Organization organization = organizationDao.get(musicGroup.getOrganId());
-			sendSeoMessageSource.sendSeoMessage(musicGroup.getOrganId(),new SysUserRoleEnum[]{ORGAN_MANAGER},
-					null,null,MessageTypeEnum.BACKSTAGE_PAYMENT_CALENDER_AUDIT,organization.getName(), musicGroup.getName());
-		}else {
-			imUserFriendService.refreshGroupImUserFriend(musicGroupId, GroupType.MUSIC);
-		}
-		return batchNo;
-	}
-
-	public <T> void checkObjectNull(T t, Consumer consumer){
-		if(t == null){
-			consumer.accept(null);
-		}
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public String create1(MusicGroupPaymentBaseCalender musicGroupPaymentBaseCalender) {
-		checkObjectNull(musicGroupPaymentBaseCalender, o -> {throw new BizException("参数校验异常");});
-		String musicGroupId = musicGroupPaymentBaseCalender.getMusicGroupId();
-		MusicGroup musicGroup = musicGroupDao.getLocked(musicGroupId);
-		checkObjectNull(musicGroup, o -> {throw new BizException("乐团查询失败,请检查参数");});
-
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		checkObjectNull(sysUser, o -> {throw new BizException("请登录");});
+    @Autowired
+    private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
+    @Autowired
+    private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
+    @Autowired
+    private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
+    @Autowired
+    private MusicGroupPaymentCalenderCourseSettingsServiceImpl musicGroupPaymentCalenderCourseSettingsService;
+    @Autowired
+    private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
+    @Autowired
+    private MusicGroupSchoolTermCourseDetailDao musicGroupSchoolTermCourseDetailDao;
+    @Autowired
+    private MusicGroupSchoolTermStudentCourseDetailDao musicGroupSchoolTermStudentCourseDetailDao;
+    @Autowired
+    private IdGeneratorService idGeneratorService;
+    @Autowired
+    private ClassGroupService classGroupService;
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+    @Autowired
+    private ClassGroupDao classGroupDao;
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+    @Autowired
+    private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
+    @Autowired
+    private TeacherAttendanceDao teacherAttendanceDao;
+    @Autowired
+    private MusicGroupBuildLogDao musicGroupBuildLogDao;
+    @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
+    private OrganizationDao organizationDao;
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
+    private SendSeoMessageSource sendSeoMessageSource;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private ImGroupMemberService imGroupMemberService;
+    @Autowired
+    private ImUserFriendService imUserFriendService;
+    @Autowired
+    private ClassGroupStudentMapperDao classGroupStudentMapperDao;
+    @Autowired
+    private MusicGroupStudentClassAdjustDao musicGroupStudentClassAdjustDao;
+    @Autowired
+    private MusicGroupPaymentCalenderDetailService musicGroupPaymentCalenderDetailService;
+    @Autowired
+    private MusicGroupPaymentCalenderStudentDetailDao musicGroupPaymentCalenderStudentDetailDao;
+    @Autowired
+    private StudentRegistrationDao studentRegistrationDao;
+    @Autowired
+    private GroupEventSource groupEventSource;
+    @Autowired
+    private StudentPaymentOrderDao studentPaymentOrderDao;
+    @Autowired
+    private MemberRankPrivilegesService memberRankPrivilegesService;
+    @Autowired
+    private CloudTeacherOrderDao cloudTeacherOrderDao;
+    @Autowired
+    private MusicGroupPaymentCalenderActivityServiceImpl musicGroupPaymentCalenderActivityService;
+    @Autowired
+    private MusicGroupPaymentCalenderMemberServiceImpl musicGroupPaymentCalenderMemberService;
+    @Autowired
+    private MusicGroupPaymentCalenderRepairServiceImpl musicGroupPaymentCalenderRepairService;
+    @Autowired
+    private StudentDao studentDao;
+    @Autowired
+    private ActivityUserMapperService activityUserMapperService;
+
+    @Override
+    public BaseDAO<Long, MusicGroupPaymentCalender> getDAO() {
+        return musicGroupPaymentCalenderDao;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String create(MusicGroupPaymentCalenderDto musicGroupPaymentCalenderDto) {
+        PaymentType paymentType = musicGroupPaymentCalenderDto.getPaymentType();
+        if (paymentType != SPAN_GROUP_CLASS_ADJUST) {
+            throw new BizException("操作失败:该入口不支持{}", paymentType.getDesc());
+        }
+        List<MusicGroupPaymentDateRange> musicGroupPaymentDateRangeList = musicGroupPaymentCalenderDto.getMusicGroupPaymentDateRangeList();
+        if (musicGroupPaymentDateRangeList.size() > 1) {
+            throw new BizException("创建缴费失败:不支持多周期缴费");
+        }
+        String musicGroupId = musicGroupPaymentCalenderDto.getMusicGroupId();
+        MusicGroup musicGroup = musicGroupDao.getLocked(musicGroupId);
+        if (musicGroup == null) {
+            throw new BizException("乐团查询失败,请检查参数");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("请登录");
+        }
+        // 所有缴费项目已完成排课才能创建下一个缴费项目
+        String organBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, null, null, musicGroupPaymentCalenderDto.getIgnoreBatchNoList());
+        if (StringUtils.isNoneBlank(organBatchNo)) {
+            if (StringUtils.isEmpty(musicGroupPaymentCalenderDto.getBatchNo()) || !musicGroupPaymentCalenderDto.getBatchNo().equals(organBatchNo)) {
+                throw new BizException("当前乐团存在未排课的缴费项目,请先完成排课再操作");
+            }
+        }
+
+        List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = musicGroupPaymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails();
+
+        PaymentCalenderStatusEnum status = musicGroupPaymentCalenderDto.getStatus();
+
+        Date date = new Date();
+        String batchNo = idGeneratorService.generatorId() + "";
+
+        MusicGroupPaymentDateRange musicGroupPaymentDateRange = musicGroupPaymentDateRangeList.get(0);
+        MusicGroupPaymentCalender musicGroupPaymentCalender = new MusicGroupPaymentCalender();
+        musicGroupPaymentCalender.setAttribute1(musicGroupPaymentCalenderDto.getAttribute1());
+        musicGroupPaymentCalender.setAttribute2(musicGroupPaymentCalenderDto.getAttribute2());
+        musicGroupPaymentCalender.setDeadlinePaymentDate(musicGroupPaymentDateRange.getDeadlinePaymentDate());
+        musicGroupPaymentCalender.setMemo(musicGroupPaymentCalenderDto.getMemo());
+        musicGroupPaymentCalender.setMusicGroupId(musicGroupId);
+        musicGroupPaymentCalender.setMusicGroupOrganizationCourseSettingId(musicGroupPaymentCalenderDto.getMusicGroupOrganizationCourseSettingId());
+
+        musicGroupPaymentCalender.setOriginalTotalAmount(calenderStudentDetails.stream().map(e -> e.getCourseOriginalPrice()).reduce(BigDecimal.ZERO, BigDecimal::add));
+        musicGroupPaymentCalender.setCurrentTotalAmount(calenderStudentDetails.stream().map(e -> e.getCourseCurrentPrice()).reduce(BigDecimal.ZERO, BigDecimal::add));
+        musicGroupPaymentCalender.setPaymentType(paymentType);
+        musicGroupPaymentCalender.setPayUserType(musicGroupPaymentCalenderDto.getPayUserType());
+        musicGroupPaymentCalender.setStartPaymentDate(musicGroupPaymentDateRange.getStartPaymentDate());
+        musicGroupPaymentCalender.setStudentIds(musicGroupPaymentCalenderDto.getStudentIds());
+        musicGroupPaymentCalender.setOperator(sysUser.getId());
+        musicGroupPaymentCalender.setCreateTime(date);
+        musicGroupPaymentCalender.setUpdateTime(date);
+        musicGroupPaymentCalender.setStatus(status);
+        musicGroupPaymentCalender.setOrganId(musicGroup.getOrganId());
+        if (musicGroupPaymentCalender.getStatus() != AUDITING) {
+            if (date.after(musicGroupPaymentCalender.getStartPaymentDate())) {
+                musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
+            } else if (date.after(musicGroupPaymentCalender.getDeadlinePaymentDate())) {
+                musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OVER);
+            } else {
+                musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.NO);
+            }
+        }
+        // 设置批次号
+        musicGroupPaymentCalender.setBatchNo(batchNo);
+        musicGroupPaymentCalenderDto.setBatchNo(batchNo);
+        musicGroupPaymentCalenderDao.insert(musicGroupPaymentCalender);
+        //如果是跨团班级合并,保存用户缴费详情
+        //记录学员缴费详情
+        musicGroupPaymentCalenderStudentDetailDao.batchInsert(musicGroupPaymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails(), musicGroupPaymentCalender.getBatchNo());
+        if (musicGroupPaymentCalender.getStatus() != AUDITING) {
+            //如果是跨团班级合并,添加学员
+            musicGroupPaymentCalenderDetailService.batchAdd(musicGroupPaymentCalender, musicGroupPaymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails());
+            //将0元未缴费学员缴费状态更新为已缴费
+            this.updateNoPaymentAndZeroPaymentStatus(musicGroupPaymentCalender, true);
+        }
+        if (status == AUDITING) {
+            // 如果是审核中
+            Organization organization = organizationDao.get(musicGroup.getOrganId());
+            sendSeoMessageSource.sendSeoMessage(musicGroup.getOrganId(), new SysUserRoleEnum[]{ORGAN_MANAGER},
+                    null, null, MessageTypeEnum.BACKSTAGE_PAYMENT_CALENDER_AUDIT, organization.getName(), musicGroup.getName());
+        } else {
+            imUserFriendService.refreshGroupImUserFriend(musicGroupId, GroupType.MUSIC);
+        }
+        return batchNo;
+    }
+
+    public <T> void checkObjectNull(T t, Consumer consumer) {
+        if (t == null) {
+            consumer.accept(null);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String create1(MusicGroupPaymentBaseCalender musicGroupPaymentBaseCalender) {
+        checkObjectNull(musicGroupPaymentBaseCalender, o -> {
+            throw new BizException("参数校验异常");
+        });
+        String musicGroupId = musicGroupPaymentBaseCalender.getMusicGroupId();
+        MusicGroup musicGroup = musicGroupDao.getLocked(musicGroupId);
+        checkObjectNull(musicGroup, o -> {
+            throw new BizException("乐团查询失败,请检查参数");
+        });
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        checkObjectNull(sysUser, o -> {
+            throw new BizException("请登录");
+        });
 
 //		if(musicGroupPaymentBaseCalender.getCalenderActivityList() == null
 //				&& musicGroupPaymentBaseCalender.getCalenderMember() == null
@@ -246,1165 +243,1165 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 //				&& musicGroupPaymentBaseCalender.getMusicRepair() == null){
 //			throw new BizException("请选择一个缴费项目");
 //		}
-		if (musicGroup.getStatus() != MusicGroupStatusEnum.PROGRESS && musicGroup.getStatus() != MusicGroupStatusEnum.PRE_BUILD_FEE) {
-			throw new BizException("创建缴费失败:已存在缴费项目");
-		}
-		// 所有缴费项目已完成排课才能创建下一个缴费项目
-		String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, null, null,null);
-		if (StringUtils.isNoneBlank(orignBatchNo)) {
-			throw new BizException("当前乐团存在未排课的缴费项目,请先完成排课再操作");
-		}
-
-		// 不是进行中,只能创建一次缴费
-		if (musicGroup.getStatus() != MusicGroupStatusEnum.PROGRESS) {
-			List<MusicGroupPaymentCalender> list = musicGroupPaymentCalenderDao.findByMusicGroupId(musicGroupId);
-			if (list.size() > 0) {
-				throw new BizException("创建失败,已经存在缴费信息");
-			}
-		}
-		//进行中加学员拓展信息
-		CalenderAddStudent calenderAddStudent = musicGroupPaymentBaseCalender.getCalenderAddStudent();
-		MusicGroupPaymentCalender musicGroupPaymentCalender = new MusicGroupPaymentCalender();
-		//判断缴费项目类型
-		if(musicGroup.getStatus() == MusicGroupStatusEnum.PRE_BUILD_FEE){
-			musicGroupPaymentBaseCalender.setPaymentType(MUSIC_APPLY);
-		}else {
-			if(calenderAddStudent != null && calenderAddStudent.getStudentIds() != null){
-				musicGroupPaymentBaseCalender.setPaymentType(ADD_STUDENT);
-				//预计缴费人数
-				musicGroupPaymentCalender.setAttribute1(calenderAddStudent.getClassGroupIds());
-				musicGroupPaymentCalender.setStudentIds(calenderAddStudent.getStudentIds().toString());
-				musicGroupPaymentCalender.setExpectNum(1);
-				//校验是否可以加学员
-				checkAddStudent(calenderAddStudent,musicGroup);
-			}else {
-				if(musicGroupPaymentBaseCalender.getMusicGroupOrganizationCourseSettingId() != null){
-					musicGroupPaymentBaseCalender.setPaymentType(MUSIC_RENEW);
-				}else {
-					musicGroupPaymentBaseCalender.setPaymentType(ADD_COURSE);
-				}
-			}
-		}
-		musicGroupPaymentBaseCalender.setMusicGroup(musicGroup);
-
-		//计算缴费项目原价
-		BigDecimal courseOriginalAmount = musicGroupPaymentCalenderCourseSettingsService.getOriginalAmount(musicGroupPaymentBaseCalender);
-		BigDecimal memberOriginalAmount = musicGroupPaymentCalenderMemberService.getOriginalAmount(musicGroupPaymentBaseCalender);
-		BigDecimal repairOriginalAmount = musicGroupPaymentCalenderRepairService.getOriginalAmount(musicGroupPaymentBaseCalender);
-		BigDecimal activityOriginalAmount = musicGroupPaymentCalenderActivityService.getOriginalAmount(musicGroupPaymentBaseCalender);
-
-		BigDecimal originalTotalAmount = courseOriginalAmount.add(memberOriginalAmount)
-				.add(activityOriginalAmount)
-				.add(repairOriginalAmount).setScale(0, BigDecimal.ROUND_HALF_UP);
-
-		//计算缴费项目总金额(前端录入)
-		BigDecimal courseActualAmount = musicGroupPaymentCalenderCourseSettingsService.getActualAmount(musicGroupPaymentBaseCalender);
-		BigDecimal memberActualAmount = musicGroupPaymentCalenderMemberService.getActualAmount(musicGroupPaymentBaseCalender);
-		BigDecimal repairActualAmount = musicGroupPaymentCalenderRepairService.getActualAmount(musicGroupPaymentBaseCalender);
-		BigDecimal activityActualAmount = musicGroupPaymentCalenderActivityService.getActualAmount(musicGroupPaymentBaseCalender);
-
-		BigDecimal actualTotalAmount = courseActualAmount.add(memberActualAmount)
-				.add(repairActualAmount)
-				.add(activityActualAmount).setScale(0, BigDecimal.ROUND_HALF_UP);
-
-		PaymentCalenderStatusEnum status;
-		if (musicGroupPaymentBaseCalender.getPayUserType() == SCHOOL) {
-			status = AUDITING;
-		} else {
-			//计算项目原现价
-			BigDecimal courseCurrentAmount = musicGroupPaymentCalenderCourseSettingsService.getCurrentAmount(musicGroupPaymentBaseCalender);
-			BigDecimal memberCurrentAmount = musicGroupPaymentCalenderMemberService.getCurrentAmount(musicGroupPaymentBaseCalender);
-			BigDecimal repairCurrentAmount = musicGroupPaymentCalenderRepairService.getCurrentAmount(musicGroupPaymentBaseCalender);
-			BigDecimal activityCurrentAmount = musicGroupPaymentCalenderActivityService.getCurrentAmount(musicGroupPaymentBaseCalender);
-			BigDecimal currentTotalAmount = courseCurrentAmount.add(memberCurrentAmount)
-					.add(repairCurrentAmount)
-					.add(activityCurrentAmount).setScale(0, BigDecimal.ROUND_HALF_UP);
-			status = actualTotalAmount.compareTo(currentTotalAmount) == 0 ? NO:AUDITING;
-		}
-
-		Date date = new Date();
-
-		musicGroupPaymentCalender.setDeadlinePaymentDate(musicGroupPaymentBaseCalender.getDeadlinePaymentDate());
-		musicGroupPaymentCalender.setMemo(musicGroupPaymentBaseCalender.getMemo());
-		musicGroupPaymentCalender.setMusicGroupId(musicGroupId);
-		musicGroupPaymentCalender.setMusicGroupOrganizationCourseSettingId(musicGroupPaymentBaseCalender.getMusicGroupOrganizationCourseSettingId());
-		musicGroupPaymentCalender.setPayUserType(musicGroupPaymentBaseCalender.getPayUserType());
-		musicGroupPaymentCalender.setStartPaymentDate(musicGroupPaymentBaseCalender.getStartPaymentDate());
-		musicGroupPaymentCalender.setOperator(sysUser.getId());
-		musicGroupPaymentCalender.setCreateTime(date);
-		musicGroupPaymentCalender.setUpdateTime(date);
-		musicGroupPaymentCalender.setPaymentType(musicGroupPaymentBaseCalender.getPaymentType());
-		musicGroupPaymentCalender.setCurrentTotalAmount(actualTotalAmount);
-		musicGroupPaymentCalender.setOriginalTotalAmount(originalTotalAmount);
-		musicGroupPaymentCalender.setStatus(status);
-		musicGroupPaymentCalender.setOrganId(musicGroup.getOrganId());
-
-		if (musicGroupPaymentCalender.getStatus() != AUDITING) {
-			if (date.after(musicGroupPaymentCalender.getStartPaymentDate())) {
-				musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
-			} else if (date.after(musicGroupPaymentCalender.getDeadlinePaymentDate())) {
-				musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OVER);
-			} else {
-				musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.NO);
-			}
-		}
-
-		// 设置批次号
-		String batchNo = idGeneratorService.generatorId() + "";
-		musicGroupPaymentCalender.setBatchNo(batchNo);
-		musicGroupPaymentCalenderDao.insert(musicGroupPaymentCalender);
-		Long calenderId = musicGroupPaymentCalender.getId();
-		//保存会员缴费信息
-		MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentBaseCalender.getCalenderMember();
-		if(calenderMember != null){
-			calenderMember = musicGroupPaymentCalenderMemberService.initBean(calenderMember);
-			calenderMember.setOriginalAmount(memberOriginalAmount);
-			calenderMember.setCalenderId(calenderId);
-			if (musicGroupPaymentBaseCalender.getPayUserType() == SCHOOL) {
-				calenderMember.setActualAmount(BigDecimal.ZERO);
-			}
-			musicGroupPaymentCalenderMemberService.insert(calenderMember);
-		}
-		//保存乐保缴费信息
-		MusicGroupPaymentCalenderRepair musicRepair = musicGroupPaymentBaseCalender.getMusicRepair();
-		if(musicRepair != null){
-			musicRepair.setOriginalAmount(repairOriginalAmount);
-			musicRepair.setCalenderId(calenderId);
-			if (musicGroupPaymentBaseCalender.getPayUserType() == SCHOOL) {
-				musicRepair.setActualAmount(BigDecimal.ZERO);
-			}
-			musicGroupPaymentCalenderRepairService.insert(musicRepair);
-		}
-		//保存活动缴费信息
-		List<MusicGroupPaymentCalenderActivity> calenderActivityList = musicGroupPaymentBaseCalender.getCalenderActivityList();
-		if(calenderActivityList != null && calenderActivityList.size() > 0){
-			musicGroupPaymentCalenderActivityService.initBean(calenderActivityList);
-			if (musicGroupPaymentBaseCalender.getPayUserType() == SCHOOL) {
-				calenderActivityList.forEach(e->e.setActualAmount(BigDecimal.ZERO));
-			}
-			musicGroupPaymentCalenderActivityService.batchInsert(musicGroupPaymentBaseCalender,calenderId);
-		}
-		//保存课程费用列表
-		musicGroupPaymentCalender.setMusicGroupPaymentCalenderCourseSettingsList(musicGroupPaymentBaseCalender.getMusicGroupPaymentCalenderCourseSettingsList());
-		musicGroupPaymentCalenderCourseSettingsService.batchInsert(musicGroupPaymentCalender);
-
-		// 如果是报名,需要修改乐团状态
-		if (musicGroupPaymentBaseCalender.getPaymentType() == MUSIC_APPLY) {
-			if (status != AUDITING) {
-				musicGroup.setStatus(MusicGroupStatusEnum.APPLY);
-				// 记录操作日志
-				musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "报名缴费项目创建成功(创建缴费中 -> 报名中)", sysUser.getId(), ""));
-			} else {
-				musicGroup.setStatus(MusicGroupStatusEnum.FEE_AUDIT);
-				// 记录操作日志
-				musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "报名缴费项目创建成功(创建缴费 -> 费用审核中)", sysUser.getId(), ""));
-			}
-			musicGroup.setUpdateTime(date);
-			musicGroupDao.update(musicGroup);
-		}
-		if (status == AUDITING) {
-			// 如果是审核中
-			Organization organization = organizationDao.get(musicGroup.getOrganId());
-			sendSeoMessageSource.sendSeoMessage(musicGroup.getOrganId(),new SysUserRoleEnum[]{ORGAN_MANAGER},
-					null,null,MessageTypeEnum.BACKSTAGE_PAYMENT_CALENDER_AUDIT,organization.getName(), musicGroup.getName());
-		}else {
-			if (musicGroupPaymentCalender.getPaymentType() == PaymentType.ADD_STUDENT) {
-				addStudent(musicGroupPaymentCalender, musicGroupPaymentCalender.getMusicGroupPaymentCalenderCourseSettingsList(),musicGroup);
-				//将0元未缴费学员缴费状态更新为已缴费
-				this.updateNoPaymentAndZeroPaymentStatus(musicGroupPaymentCalender,true);
-				// 学生加到班级
-				classGroupService.addStudentToClassGroupAndCourseArranging(calenderAddStudent.getStudentIds(), calenderAddStudent.getClassGroupIds(),
-						batchNo, musicGroupPaymentBaseCalender.getMusicGroupPaymentCalenderCourseSettingsList(),musicGroup);
-				ExecutorService executor = Executors.newFixedThreadPool(5);
-				CompletableFuture.runAsync(()->{
-					imUserFriendService.refreshGroupImUserFriend(musicGroupId, GroupType.MUSIC);
-				},executor);
-				executor.shutdown();
-			}
-		}
-		return batchNo;
-	}
-
-	//校验缴费项目进行中加学员
-	public void checkAddStudent(CalenderAddStudent calenderAddStudent,MusicGroup musicGroup){
-		//获取缴费状态在审核中或者已拒绝的缴费项目的学员
-		Integer userId = calenderAddStudent.getStudentIds();
-		if(musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){
-			//该学员是否在其他的会员团
-			boolean hasMemberGroup = studentRegistrationDao.checkHasMemberGroup(musicGroup.getId(),userId);
-			if(hasMemberGroup){
-				throw new BizException("操作失败:学员已在其他系统收费乐团中,不可报名该乐团请联系教务老师");
-			}
-		}
-
-		String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroup.getId(),null);
-		if(StringUtils.isNotEmpty(studentIds)){
-			if(studentIds.contains(userId.toString())){
-				throw new BizException("创建缴费失败:所选学员有待审核或已拒绝的缴费项目");
-			}
-		}
-		List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList = musicGroupPaymentCalenderDetailDao.queryNotPaymentStudentByUserIdAndMusicGroupId(userId, musicGroup.getId());
-		if(musicGroupPaymentCalenderDetailList != null && musicGroupPaymentCalenderDetailList.size() > 0){
-			throw new BizException("创建缴费失败:已存在缴费项目");
-		}
-	}
-
-	public Map<String, Object> getCalenderDetail(Map<String, Object> result,Long calenderId){
-		//课程
-		result.put("course", musicGroupPaymentCalenderCourseSettingsService.queryCalenderCourseSettings(calenderId));
-		//乐保
-		result.put("repair",musicGroupPaymentCalenderRepairService.findByCalenderId(calenderId));
-		MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberService.findByCalenderId(calenderId);
-		//会员信息
-		result.put("member",calenderMember);
-		//活动相关信息
-		result.put("activity",musicGroupPaymentCalenderActivityService.findByCalenderId(calenderId));
-		if(calenderMember != null){
-			result.put("memberPrivilegesItemList", memberRankPrivilegesService.queryByMemberRankId(calenderMember.getMemberRankSettingId()));
-		}
-		return result;
-	}
-
-	@Override
-	public Map<String, Object> getDetail(Long id) {
-		Map<String, Object> result = new HashMap<>(10);
-		//获取缴费项目详情
-		MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(id);
-		//统计预计缴费人数
-		Map<Long, Long> expectNumMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.countExpectNum(id));
-		if(expectNumMap != null){
-			calender.setExpectNum(expectNumMap.get(id) == null ? 0 : expectNumMap.get(id).intValue());
-		}
-		//统计实际缴费人数
-		Map<Long, Long> actualNumMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.countActualNum(id));
-		if(actualNumMap != null){
-			calender.setActualNum(actualNumMap.get(id) == null ? 0 : actualNumMap.get(id).intValue());
-		}
-
-		if(calender.getOrganId() != null){
-			Organization organization = organizationDao.get(calender.getOrganId());
-			calender.setOrganName(organization.getName());
-		}
-		if (StringUtils.isNotEmpty(calender.getMusicGroupId())){
-			MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
-			calender.setMusicGroupName(musicGroup.getName());
-		}
-		result.put("calender", calender);
-		//汇总收款金额
-		BigDecimal sumActualAmount = musicGroupPaymentCalenderDetailDao.sumActualAmount(id);
-		result.put("sumActualAmount", sumActualAmount);
-		//进行中加学员
-		if(calender.getPaymentType() == ADD_STUDENT){
-			String studentIds = calender.getStudentIds();
-			if(StringUtils.isNotEmpty(studentIds)){
-				SysUser sysUser = studentDao.getUser(Integer.parseInt(studentIds));
-				result.put("phone",sysUser.getPhone());
-				result.put("username",sysUser.getUsername());
-			}
-		}
-		//获取跨团合班学员缴费详情
-		result.put("musicMerger",musicGroupPaymentCalenderStudentDetailDao.findByBatchNo(calender.getBatchNo()));
-		return getCalenderDetail(result,id);
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public String merge(MusicGroupPaymentCalenderDto musicGroupPaymentCalenderDto) {
-		
-		String batchNo = musicGroupPaymentCalenderDto.getBatchNo();
-		
-		List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
-		if(musicGroupPaymentCalenderList == null || musicGroupPaymentCalenderList.size() == 0){
-			throw new BizException("[批次号]参数错误");
-		}
-		PaymentCalenderStatusEnum status = musicGroupPaymentCalenderList.get(0).getStatus();
-		if(status != PaymentCalenderStatusEnum.REJECT && status != PaymentCalenderStatusEnum.DRAFT){
-			throw new BizException("{}的缴费状态不允许修改",status.getDesc());
-		}
-		PaymentType paymentType = musicGroupPaymentCalenderDto.getPaymentType();
-		if(paymentType != SPAN_GROUP_CLASS_ADJUST){
-			throw new BizException("操作失败:该入口不支持{}",paymentType.getDesc());
-		}
-		List<MusicGroupPaymentDateRange> musicGroupPaymentDateRangeList = musicGroupPaymentCalenderDto.getMusicGroupPaymentDateRangeList();
-		if(musicGroupPaymentDateRangeList.size() > 1){
-			throw new BizException("创建缴费失败:不支持多周期缴费");
-		}
-		String musicGroupId = musicGroupPaymentCalenderDto.getMusicGroupId();
-
-		MusicGroup musicGroup = musicGroupDao.getLocked(musicGroupId);
-		if (musicGroup == null) {
-			throw new BizException("乐团查询失败,请检查参数");
-		}
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			throw new BizException("请登录");
-		}
-
-		List<Long> calenderIds = musicGroupPaymentCalenderList.stream().map(MusicGroupPaymentCalender :: getId).collect(Collectors.toList());
-		//删除原来数据
-		musicGroupPaymentCalenderDao.delByIds(calenderIds);
-		musicGroupPaymentCalenderCourseSettingsService.deleteByMusicGroupPaymentCalenderId(calenderIds);
-
-		status = PaymentCalenderStatusEnum.NO;
-
-		Date date = new Date();
-
-		MusicGroupStudentClassAdjust adjust = musicGroupStudentClassAdjustDao.findByBatchNo(batchNo);
-		//获取默认的学员缴费详情
-		List<Integer> studentIdList = JSON.parseArray(adjust.getStudentIds(), Integer.class);
-		//获取欠费学员列表
-		List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(musicGroup.getId(), studentIdList);
-		if(noPaymentUserIds.size() > 0){
-			throw new BizException("操作失败:有欠费的学员不允许创建缴费");
-		}
-		//获取缴费状态在审核中或者已拒绝的缴费项目的学员
-		String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroupId,batchNo);
-		if(StringUtils.isNotEmpty(studentIds)){
-			for (Integer integer : studentIdList) {
-				if(studentIds.contains(integer.toString())){
-					throw new BizException("操作失败:所选学员有待审核或已拒绝的缴费项目");
-				}
-			}
-		}
-
-		List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails = classGroupService.queryStudentPaymentCalenders(adjust.getMasterClassGroupId(),
-				adjust.getClassGroupStudents(),studentIdList);
-		List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = musicGroupPaymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails();
-
-		boolean containsAll = musicGroupPaymentCalenderStudentDetails.containsAll(calenderStudentDetails);
-		if(!containsAll){
-			status = AUDITING;
-		}
-		//删除之前的记录
-		musicGroupPaymentCalenderStudentDetailDao.delByBatchNo(batchNo);
-		//保存现有记录
-		musicGroupPaymentCalenderStudentDetailDao.batchInsert(calenderStudentDetails,batchNo);
-
-		MusicGroupPaymentDateRange musicGroupPaymentDateRange = musicGroupPaymentDateRangeList.get(0);
-		MusicGroupPaymentCalender musicGroupPaymentCalender = new MusicGroupPaymentCalender();
-		musicGroupPaymentCalender.setAttribute1(musicGroupPaymentCalenderDto.getAttribute1());
-		musicGroupPaymentCalender.setAttribute2(musicGroupPaymentCalenderDto.getAttribute2());
-		musicGroupPaymentCalender.setDeadlinePaymentDate(musicGroupPaymentDateRange.getDeadlinePaymentDate());
-		musicGroupPaymentCalender.setMemo(musicGroupPaymentCalenderDto.getMemo());
-		musicGroupPaymentCalender.setMusicGroupId(musicGroupId);
-		musicGroupPaymentCalender.setMusicGroupOrganizationCourseSettingId(musicGroupPaymentCalenderDto.getMusicGroupOrganizationCourseSettingId());
-		musicGroupPaymentCalender.setOriginalTotalAmount(calenderStudentDetails.stream().map(e->e.getCourseOriginalPrice()).reduce(BigDecimal.ZERO,BigDecimal::add));
-		musicGroupPaymentCalender.setCurrentTotalAmount(calenderStudentDetails.stream().map(e->e.getCourseCurrentPrice()).reduce(BigDecimal.ZERO,BigDecimal::add));
-		musicGroupPaymentCalender.setPaymentType(paymentType);
-		musicGroupPaymentCalender.setPayUserType(musicGroupPaymentCalenderDto.getPayUserType());
-		musicGroupPaymentCalender.setStartPaymentDate(musicGroupPaymentDateRange.getStartPaymentDate());
-		musicGroupPaymentCalender.setStudentIds(musicGroupPaymentCalenderDto.getStudentIds());
-		musicGroupPaymentCalender.setOperator(sysUser.getId());
-		musicGroupPaymentCalender.setCreateTime(date);
-		musicGroupPaymentCalender.setUpdateTime(date);
-		musicGroupPaymentCalender.setStatus(status);
-		musicGroupPaymentCalender.setOrganId(musicGroup.getOrganId());
-		if (musicGroupPaymentCalender.getStatus() != AUDITING) {
-			if (date.after(musicGroupPaymentCalender.getStartPaymentDate())) {
-				musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
-			} else if (date.after(musicGroupPaymentCalender.getDeadlinePaymentDate())) {
-				musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OVER);
-			} else {
-				musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.NO);
-			}
-		}
-		// 设置批次号
-		musicGroupPaymentCalender.setBatchNo(batchNo);
-		musicGroupPaymentCalenderDto.setBatchNo(batchNo);
-		musicGroupPaymentCalenderDao.insert(musicGroupPaymentCalender);
-		List<MusicGroupPaymentCalenderCourseSettings> currentMusicGroupPaymentCalenderCourseSettings = musicGroupPaymentCalender
-				.getMusicGroupPaymentCalenderCourseSettingsList();
-
-		if (musicGroupPaymentCalender.getStatus() != AUDITING) {
-			// 如果是进行中加学生
-			if (musicGroupPaymentCalender.getPaymentType() == PaymentType.ADD_STUDENT) {
-				addStudent(musicGroupPaymentCalender, currentMusicGroupPaymentCalenderCourseSettings,musicGroup);
-			}else if(musicGroupPaymentCalender.getPaymentType() == SPAN_GROUP_CLASS_ADJUST){
-				//如果是跨团班级合并,添加学员
-				musicGroupPaymentCalenderDetailService.batchAdd(musicGroupPaymentCalender,musicGroupPaymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails());
-			}
-			//将0元未缴费学员缴费状态更新为已缴费
-			this.updateNoPaymentAndZeroPaymentStatus(musicGroupPaymentCalender,true);
-		}
-
-		if (status == AUDITING) {
-			// 如果是审核中
-			Organization organization = organizationDao.get(musicGroup.getOrganId());
-			sendSeoMessageSource.sendSeoMessage(musicGroup.getOrganId(),new SysUserRoleEnum[]{ORGAN_MANAGER},
-					null,null,MessageTypeEnum.BACKSTAGE_PAYMENT_CALENDER_AUDIT,organization.getName(), musicGroup.getName());
-		}else {
-			//删除和解冻班级,课程信息
-			List<Map> classGroupStudents = JSON.parseArray(adjust.getClassGroupStudents(),Map.class);
-			List<Long> courseIds = JSON.parseArray(adjust.getSubLockCourseIds(), Long.class);
-			List<Long> allLockCourseIds = JSON.parseArray(adjust.getAllLockCourseIds(), Long.class);
-			classGroupService.spanGroupClassAdjustPass(adjust.getMasterClassGroupId()
-					,studentIdList,courseIds,classGroupStudents,allLockCourseIds,batchNo,adjust.getMasterTotalPrice());
-		}
-		return batchNo;
-	}
-
-	//将0元未缴费学员缴费状态更新为已缴费
-	@Transactional(rollbackFor = Exception.class)
-	public void updateNoPaymentAndZeroPaymentStatus(MusicGroupPaymentCalender musicGroupPaymentCalender,Boolean updateFlag){
-		if(musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0){
-			int j = musicGroupPaymentCalenderDetailDao.updateNoPaymentAndZeroPaymentStatus(musicGroupPaymentCalender.getId());
-			if(j > 0){
-				musicGroupPaymentCalender.setActualNum((musicGroupPaymentCalender.getActualNum()==null?0:musicGroupPaymentCalender.getActualNum()) + j);
-				if(updateFlag){
-					musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
-				}
-			}
-		}
-	}
-
-	@Override
-	public boolean makesureSchoolePaid(Long id, String memo) {
-		MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderDao.get(id);
-		if(musicGroupPaymentCalender == null){
-			throw new BizException("查询缴费信息失败");
-		}
-		
-		if(musicGroupPaymentCalender.getPayUserType() != PayUserType.SCHOOL){
-			throw new BizException("只有学校缴费才能确认缴费状态");
-		}
-		
-		musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.PAID);
-		musicGroupPaymentCalender.setMemo(memo);
-		musicGroupPaymentCalender.setUpdateTime(new Date());
-		musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
-		
-		return true;
-	}
-
-	@Transactional(rollbackFor = Exception.class)
-	@Override
-	public void addStudent(MusicGroupPaymentCalender musicGroupPaymentCalender,
-						   List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettingsList,
-						   MusicGroup musicGroup){
-		//如果是进行中加学生
-		Date date = new Date();
-		String studentIdStr = musicGroupPaymentCalender.getStudentIds();
-		if (StringUtils.isNoneBlank(studentIdStr)) {
-			//当前乐团是否有预排课计划
-			MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroup.getId(), null, 0);
-			List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<MusicGroupPaymentStudentCourseDetail>();
-			MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;
-
-			List<MusicGroupPaymentCalenderActivity> calenderActivities = musicGroupPaymentCalenderActivityService.findByCalenderId(musicGroupPaymentCalender.getId());
-			MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberService.findByCalenderId(musicGroupPaymentCalender.getId());
-			for (String studentId : studentIdStr.split(",")) {
-				if(termCourseDetail != null){
-					//是否已经预排部分课程
-					List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(musicGroup.getId());
-					if(courseSchedules.size() > 0){
-						throw new BizException("操作失败:该乐团存在预排课课程,请优先完成预排课");
-					}else {
-						MusicGroupSchoolTermStudentCourseDetail studentCourseDetail = new MusicGroupSchoolTermStudentCourseDetail();
-						studentCourseDetail.setMusicGroupSchoolTermCourseDetailId(termCourseDetail.getId());
-						studentCourseDetail.setUserId(Integer.parseInt(studentId));
-						studentCourseDetail.setMemberCourseMinutes(termCourseDetail.getTotalCourseTime());
-						musicGroupSchoolTermStudentCourseDetailDao.insert(studentCourseDetail);
-					}
-				}
-				// 学生加到calenderDetail
-				MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
-				musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
-				musicGroupPaymentCalenderDetail.setCreateTime(date);
-				musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.NON_PAYMENT);
-				musicGroupPaymentCalenderDetail.setUpdateTime(date);
-				musicGroupPaymentCalenderDetail.setUserId(Integer.parseInt(studentId));
-				musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
-				musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
-
-				musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
-				//如果是0元那么更新fee表和studentRegistration表
-				if(musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0){
-					// 添加会员有效时长
-					if(calenderMember != null){
-						CloudTeacherOrder cloudTeacherOrder = new CloudTeacherOrder();
-						cloudTeacherOrder.setLevel(calenderMember.getMemberRankSettingId());
-						cloudTeacherOrder.setOrganId(musicGroup.getOrganId());
-						cloudTeacherOrder.setType(calenderMember.getPeriod());
-						cloudTeacherOrder.setStudentId(Integer.parseInt(studentId));
-						cloudTeacherOrder.setOrderId(musicGroup.getOrganId().longValue());
-						cloudTeacherOrder.setTime(calenderMember.getNum().intValue());
-						cloudTeacherOrder.setAmount(BigDecimal.ZERO);
-						cloudTeacherOrder.setStatus(1);
-						cloudTeacherOrder.setRemark("进行中乐团0元加学生");
-						cloudTeacherOrder.setMusicGroupId(musicGroup.getId());
-						cloudTeacherOrderDao.insert(cloudTeacherOrder);
-					}
-					//添加小课包
-					if(calenderActivities != null && calenderActivities.size() > 0){
-						List<ActivityUserMapper> activityUserMapperList = new ArrayList<>();
-						for (MusicGroupPaymentCalenderActivity calenderActivity : calenderActivities) {
-							ActivityUserMapper activityUserMapper = new ActivityUserMapper();
-							activityUserMapper.setActualPrice(BigDecimal.ZERO);
-							activityUserMapper.setActivityId(calenderActivity.getActivityId());
-							Student student = studentDao.get(Integer.parseInt(studentId));
-							activityUserMapper.setUserId(Integer.parseInt(studentId));
-							activityUserMapper.setTeacherId(student.getTeacherId());
-							if("网管课".equals(calenderActivity.getCategoryName())){
-								activityUserMapper.setPracticeFlag(1);
-							}else {
-								activityUserMapper.setVipFlag(1);
-							}
-							activityUserMapperList.add(activityUserMapper);
-						}
-						activityUserMapperService.batchInsert(activityUserMapperList);
-					}
-					//如果是进行中加学员
-					StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(Integer.parseInt(studentId), musicGroupPaymentCalender.getMusicGroupId());
-					studentRegistration.setPaymentStatus(YES);
-					studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
-					studentRegistrationDao.update(studentRegistration);
-
-					//统计变更学员数
-					groupEventSource.musicGroupStudentChangeEvent(musicGroupPaymentCalender.getMusicGroupId(), StudentMusicGroupStatusEnum.NORMAL, new ArrayList<>(Arrays.asList(Integer.parseInt(studentId))));
-				}
-				if(musicGroupPaymentCalenderCourseSettingsList != null && musicGroupPaymentCalenderCourseSettingsList.size() > 0){
-					// 学生加课程明细
-					for(MusicGroupPaymentCalenderCourseSettings courseSettings : musicGroupPaymentCalenderCourseSettingsList){
-						if (courseSettings.getIsStudentOptional() == true) {
-							continue;
-						}
-						musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
-						musicGroupPaymentStudentCourseDetail.setCourseType(courseSettings.getCourseType());
-						musicGroupPaymentStudentCourseDetail.setCreateTime(date);
-						musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
-						musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetail.getId());
-						musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSettings.getCourseTotalMinuties());
-						musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSettings.getCourseOriginalPrice());
-						musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSettings.getCourseCurrentPrice());
-						musicGroupPaymentStudentCourseDetail.setUpdateTime(date);
-						musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(courseSettings.getCourseTotalMinuties());
-						musicGroupPaymentStudentCourseDetail.setUserId(Integer.parseInt(studentId));
-						musicGroupPaymentStudentCourseDetailList.add(musicGroupPaymentStudentCourseDetail);
-					}
-
-				}
-				if(musicGroupPaymentStudentCourseDetailList.size() > 0){
-					musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetailList);
-				}
-			}
-		}
-	}
-
-	@Override
-	public void autoUpdateMusicGroupStudentFeeStatus() {
-		Date date = new Date();
-		String format = DateUtil.format(date, DateUtil.DEFAULT_PATTERN);
-		// 获取距离缴费开启指定天数后的缴费明细
-		String configValue = sysConfigDao.findConfigValue("push_payment_detail");
-		Map<Long, Long> maps = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.queryCalenderByDay(configValue, format));
-		if (maps != null && maps.size() > 0) {
-			Set<Long> calenderId = maps.keySet();
-			List<CalenderPushDto> calenderPushDtos = musicGroupPaymentCalenderDao.getCalenderPushDto(calenderId);
-			Map<Long, List<CalenderPushDto>> collect = calenderPushDtos.stream().collect(Collectors.groupingBy(CalenderPushDto::getCalenderId));
-			calenderId.forEach(e -> {
-				CalenderPushDto calenderPushDto = collect.get(e).get(0);
-				Map<Integer, String> receivers = new HashMap<>(1);
-				receivers.put(calenderPushDto.getTeacherId(), calenderPushDto.getTeacherPhone());
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_DETAIL, receivers, null, 0,
-						null, null, calenderPushDto.getMusicGroupName(), calenderPushDto.getPaymentValidStartDate(), calenderPushDto.getPaymentValidEndDate(),
-						maps.get(e));
-				Map<Integer, String> receivers1 = new HashMap<>(1);
-				receivers1.put(calenderPushDto.getTeacherId(), calenderPushDto.getTeacherId().toString());
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_DETAIL, receivers1, null, 0,
-						null, "SYSTEM", calenderPushDto.getMusicGroupName(), calenderPushDto.getPaymentValidStartDate(), calenderPushDto.getPaymentValidEndDate(),
-						maps.get(e));
-			});
-		}
-		// 获取离截止还有指定时间的缴费项,并发送推送消息给指定老师
-		String configValue1 = sysConfigDao.findConfigValue("push_create_payment_calender");
-		List<Long> calenderIds = musicGroupPaymentCalenderDao.queryEndIds(configValue1, format,null);
-		if (calenderIds != null && calenderIds.size() > 0) {
-			List<CalenderPushDto> calenderPushDtos = musicGroupPaymentCalenderDao.getCalenderPushDto(calenderIds);
-			Map<Long, List<CalenderPushDto>> collect = calenderPushDtos.stream().collect(Collectors.groupingBy(CalenderPushDto::getCalenderId));
-			calenderIds.forEach(e -> {
-				CalenderPushDto calenderPushDto = collect.get(e).get(0);
-				Map<Integer, String> receivers = new HashMap<>(1);
-				receivers.put(calenderPushDto.getTeacherId(), calenderPushDto.getTeacherPhone());
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_CREATE, receivers, null, 0,
-						null, null, calenderPushDto.getMusicGroupName(), calenderPushDto.getPaymentValidStartDate(), calenderPushDto.getPaymentValidEndDate());
-				Map<Integer, String> receivers1 = new HashMap<>(1);
-				receivers1.put(calenderPushDto.getTeacherId(), calenderPushDto.getTeacherId().toString());
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_CREATE, receivers1, null, 0,
-						null, "SYSTEM", calenderPushDto.getMusicGroupName(), calenderPushDto.getPaymentValidStartDate(), calenderPushDto.getPaymentValidEndDate());
-			});
-		}
-
-		// 乐团报名到期,提醒教务老师创建缴费
-		List<CalenderPushDto> calenderPushDtos = musicGroupPaymentCalenderDao.getMusicCalenderPushDto(configValue1, format);
-		if (calenderPushDtos != null && calenderPushDtos.size() > 0) {
-			calenderPushDtos.forEach(e -> {
-				Map<Integer, String> receivers = new HashMap<>(1);
-				receivers.put(e.getTeacherId(), e.getTeacherPhone());
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_CREATE, receivers, null, 0,
-						null, null, e.getMusicGroupName(), e.getPaymentValidStartDate(), e.getPaymentValidEndDate());
-				Map<Integer, String> receivers1 = new HashMap<>(1);
-				receivers1.put(e.getTeacherId(), e.getTeacherId().toString());
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_CREATE, receivers1, null, 0,
-						null, "SYSTEM", e.getMusicGroupName(), e.getPaymentValidStartDate(), e.getPaymentValidEndDate());
-			});
-		}
-	}
-
-	@Override
-	public PageInfo<MusicGroupPaymentCalenderAuditDto> auditList(MusicGroupPaymentCalenderQueryInfo queryInfo) {
-		PageInfo<MusicGroupPaymentCalenderAuditDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<>();
-		MapUtil.populateMap(params, queryInfo);
-
-		List<MusicGroupPaymentCalenderAuditDto> dataList = null;
-		int count = musicGroupPaymentCalenderDao.countAuditList(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = musicGroupPaymentCalenderDao.queryAuditList(params);
-			List<Integer> collect = dataList.stream().map(e -> e.getOrganId()).collect(Collectors.toList());
-			collect.removeAll(Collections.singleton(null));
-			Map<Integer, String> organNameMap = getMap("organization", "id_", "name_", collect,queryInfo.getTenantId(), Integer.class, String.class);
-			List<Integer> operatorIds = dataList.stream().map(e -> e.getOperator()).collect(Collectors.toList());
-			operatorIds.removeAll(Collections.singleton(null));
-			Map<Integer, String> realNameMap = getMap("sys_user", "id_", "real_name_", operatorIds,queryInfo.getTenantId(), Integer.class, String.class);
-			dataList.forEach(e->{
-				e.setOrganName(organNameMap.get(e.getOrganId()));
-				e.setOperatorName(realNameMap.get(e.getOperator()));
-			});
-		}
-		if (count == 0) {
-			dataList = new ArrayList<>();
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
-	}
-
-	@Override
-	public MusicGroupPaymentCalenderAuditDetailDto auditListDetail(String batchNo) {
-		MusicGroupPaymentCalenderAuditDetailDto calenderAuditDetailDto = new MusicGroupPaymentCalenderAuditDetailDto();
-		MusicGroupPaymentCalenderAuditDto auditDto = musicGroupPaymentCalenderDao.getAuditDetail(batchNo);
-		calenderAuditDetailDto.setAuditDto(auditDto);
-		//获取缴费周期
-		List<MusicGroupPaymentCalender> groupPaymentCalenders = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
-		if(groupPaymentCalenders == null || groupPaymentCalenders.size() == 0){
-			throw new BizException("缴费项目异常,请联系管理员");
-		}
-		calenderAuditDetailDto.setMusicGroupPaymentCalenders(groupPaymentCalenders);
-		MusicGroupPaymentCalender paymentCalender = groupPaymentCalenders.get(0);
+        if (musicGroup.getStatus() != MusicGroupStatusEnum.PROGRESS && musicGroup.getStatus() != MusicGroupStatusEnum.PRE_BUILD_FEE) {
+            throw new BizException("创建缴费失败:已存在缴费项目");
+        }
+        // 所有缴费项目已完成排课才能创建下一个缴费项目
+        /*String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, null, null, null);
+        if (StringUtils.isNoneBlank(orignBatchNo)) {
+            throw new BizException("当前乐团存在未排课的缴费项目,请先完成排课再操作");
+        }*/
+
+        // 不是进行中,只能创建一次缴费
+        if (musicGroup.getStatus() != MusicGroupStatusEnum.PROGRESS) {
+            List<MusicGroupPaymentCalender> list = musicGroupPaymentCalenderDao.findByMusicGroupId(musicGroupId);
+            if (list.size() > 0) {
+                throw new BizException("创建失败,已经存在缴费信息");
+            }
+        }
+        //进行中加学员拓展信息
+        CalenderAddStudent calenderAddStudent = musicGroupPaymentBaseCalender.getCalenderAddStudent();
+        MusicGroupPaymentCalender musicGroupPaymentCalender = new MusicGroupPaymentCalender();
+        //判断缴费项目类型
+        if (musicGroup.getStatus() == MusicGroupStatusEnum.PRE_BUILD_FEE) {
+            musicGroupPaymentBaseCalender.setPaymentType(MUSIC_APPLY);
+        } else {
+            if (calenderAddStudent != null && calenderAddStudent.getStudentIds() != null) {
+                musicGroupPaymentBaseCalender.setPaymentType(ADD_STUDENT);
+                //预计缴费人数
+                musicGroupPaymentCalender.setAttribute1(calenderAddStudent.getClassGroupIds());
+                musicGroupPaymentCalender.setStudentIds(calenderAddStudent.getStudentIds().toString());
+                musicGroupPaymentCalender.setExpectNum(1);
+                //校验是否可以加学员
+                checkAddStudent(calenderAddStudent, musicGroup);
+            } else {
+                if (musicGroupPaymentBaseCalender.getMusicGroupOrganizationCourseSettingId() != null) {
+                    musicGroupPaymentBaseCalender.setPaymentType(MUSIC_RENEW);
+                } else {
+                    musicGroupPaymentBaseCalender.setPaymentType(ADD_COURSE);
+                }
+            }
+        }
+        musicGroupPaymentBaseCalender.setMusicGroup(musicGroup);
+
+        //计算缴费项目原价
+        BigDecimal courseOriginalAmount = musicGroupPaymentCalenderCourseSettingsService.getOriginalAmount(musicGroupPaymentBaseCalender);
+        BigDecimal memberOriginalAmount = musicGroupPaymentCalenderMemberService.getOriginalAmount(musicGroupPaymentBaseCalender);
+        BigDecimal repairOriginalAmount = musicGroupPaymentCalenderRepairService.getOriginalAmount(musicGroupPaymentBaseCalender);
+        BigDecimal activityOriginalAmount = musicGroupPaymentCalenderActivityService.getOriginalAmount(musicGroupPaymentBaseCalender);
+
+        BigDecimal originalTotalAmount = courseOriginalAmount.add(memberOriginalAmount)
+                .add(activityOriginalAmount)
+                .add(repairOriginalAmount).setScale(0, BigDecimal.ROUND_HALF_UP);
+
+        //计算缴费项目总金额(前端录入)
+        BigDecimal courseActualAmount = musicGroupPaymentCalenderCourseSettingsService.getActualAmount(musicGroupPaymentBaseCalender);
+        BigDecimal memberActualAmount = musicGroupPaymentCalenderMemberService.getActualAmount(musicGroupPaymentBaseCalender);
+        BigDecimal repairActualAmount = musicGroupPaymentCalenderRepairService.getActualAmount(musicGroupPaymentBaseCalender);
+        BigDecimal activityActualAmount = musicGroupPaymentCalenderActivityService.getActualAmount(musicGroupPaymentBaseCalender);
+
+        BigDecimal actualTotalAmount = courseActualAmount.add(memberActualAmount)
+                .add(repairActualAmount)
+                .add(activityActualAmount).setScale(0, BigDecimal.ROUND_HALF_UP);
+
+        PaymentCalenderStatusEnum status;
+        if (musicGroupPaymentBaseCalender.getPayUserType() == SCHOOL) {
+            status = AUDITING;
+        } else {
+            //计算项目原现价
+            BigDecimal courseCurrentAmount = musicGroupPaymentCalenderCourseSettingsService.getCurrentAmount(musicGroupPaymentBaseCalender);
+            BigDecimal memberCurrentAmount = musicGroupPaymentCalenderMemberService.getCurrentAmount(musicGroupPaymentBaseCalender);
+            BigDecimal repairCurrentAmount = musicGroupPaymentCalenderRepairService.getCurrentAmount(musicGroupPaymentBaseCalender);
+            BigDecimal activityCurrentAmount = musicGroupPaymentCalenderActivityService.getCurrentAmount(musicGroupPaymentBaseCalender);
+            BigDecimal currentTotalAmount = courseCurrentAmount.add(memberCurrentAmount)
+                    .add(repairCurrentAmount)
+                    .add(activityCurrentAmount).setScale(0, BigDecimal.ROUND_HALF_UP);
+            status = actualTotalAmount.compareTo(currentTotalAmount) == 0 ? NO : AUDITING;
+        }
+
+        Date date = new Date();
+
+        musicGroupPaymentCalender.setDeadlinePaymentDate(musicGroupPaymentBaseCalender.getDeadlinePaymentDate());
+        musicGroupPaymentCalender.setMemo(musicGroupPaymentBaseCalender.getMemo());
+        musicGroupPaymentCalender.setMusicGroupId(musicGroupId);
+        musicGroupPaymentCalender.setMusicGroupOrganizationCourseSettingId(musicGroupPaymentBaseCalender.getMusicGroupOrganizationCourseSettingId());
+        musicGroupPaymentCalender.setPayUserType(musicGroupPaymentBaseCalender.getPayUserType());
+        musicGroupPaymentCalender.setStartPaymentDate(musicGroupPaymentBaseCalender.getStartPaymentDate());
+        musicGroupPaymentCalender.setOperator(sysUser.getId());
+        musicGroupPaymentCalender.setCreateTime(date);
+        musicGroupPaymentCalender.setUpdateTime(date);
+        musicGroupPaymentCalender.setPaymentType(musicGroupPaymentBaseCalender.getPaymentType());
+        musicGroupPaymentCalender.setCurrentTotalAmount(actualTotalAmount);
+        musicGroupPaymentCalender.setOriginalTotalAmount(originalTotalAmount);
+        musicGroupPaymentCalender.setStatus(status);
+        musicGroupPaymentCalender.setOrganId(musicGroup.getOrganId());
+
+        if (musicGroupPaymentCalender.getStatus() != AUDITING) {
+            if (date.after(musicGroupPaymentCalender.getStartPaymentDate())) {
+                musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
+            } else if (date.after(musicGroupPaymentCalender.getDeadlinePaymentDate())) {
+                musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OVER);
+            } else {
+                musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.NO);
+            }
+        }
+
+        // 设置批次号
+        String batchNo = idGeneratorService.generatorId() + "";
+        musicGroupPaymentCalender.setBatchNo(batchNo);
+        musicGroupPaymentCalenderDao.insert(musicGroupPaymentCalender);
+        Long calenderId = musicGroupPaymentCalender.getId();
+        //保存会员缴费信息
+        MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentBaseCalender.getCalenderMember();
+        if (calenderMember != null) {
+            calenderMember = musicGroupPaymentCalenderMemberService.initBean(calenderMember);
+            calenderMember.setOriginalAmount(memberOriginalAmount);
+            calenderMember.setCalenderId(calenderId);
+            if (musicGroupPaymentBaseCalender.getPayUserType() == SCHOOL) {
+                calenderMember.setActualAmount(BigDecimal.ZERO);
+            }
+            musicGroupPaymentCalenderMemberService.insert(calenderMember);
+        }
+        //保存乐保缴费信息
+        MusicGroupPaymentCalenderRepair musicRepair = musicGroupPaymentBaseCalender.getMusicRepair();
+        if (musicRepair != null) {
+            musicRepair.setOriginalAmount(repairOriginalAmount);
+            musicRepair.setCalenderId(calenderId);
+            if (musicGroupPaymentBaseCalender.getPayUserType() == SCHOOL) {
+                musicRepair.setActualAmount(BigDecimal.ZERO);
+            }
+            musicGroupPaymentCalenderRepairService.insert(musicRepair);
+        }
+        //保存活动缴费信息
+        List<MusicGroupPaymentCalenderActivity> calenderActivityList = musicGroupPaymentBaseCalender.getCalenderActivityList();
+        if (calenderActivityList != null && calenderActivityList.size() > 0) {
+            musicGroupPaymentCalenderActivityService.initBean(calenderActivityList);
+            if (musicGroupPaymentBaseCalender.getPayUserType() == SCHOOL) {
+                calenderActivityList.forEach(e -> e.setActualAmount(BigDecimal.ZERO));
+            }
+            musicGroupPaymentCalenderActivityService.batchInsert(musicGroupPaymentBaseCalender, calenderId);
+        }
+        //保存课程费用列表
+        musicGroupPaymentCalender.setMusicGroupPaymentCalenderCourseSettingsList(musicGroupPaymentBaseCalender.getMusicGroupPaymentCalenderCourseSettingsList());
+        musicGroupPaymentCalenderCourseSettingsService.batchInsert(musicGroupPaymentCalender);
+
+        // 如果是报名,需要修改乐团状态
+        if (musicGroupPaymentBaseCalender.getPaymentType() == MUSIC_APPLY) {
+            if (status != AUDITING) {
+                musicGroup.setStatus(MusicGroupStatusEnum.APPLY);
+                // 记录操作日志
+                musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "报名缴费项目创建成功(创建缴费中 -> 报名中)", sysUser.getId(), ""));
+            } else {
+                musicGroup.setStatus(MusicGroupStatusEnum.FEE_AUDIT);
+                // 记录操作日志
+                musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "报名缴费项目创建成功(创建缴费 -> 费用审核中)", sysUser.getId(), ""));
+            }
+            musicGroup.setUpdateTime(date);
+            musicGroupDao.update(musicGroup);
+        }
+        if (status == AUDITING) {
+            // 如果是审核中
+            Organization organization = organizationDao.get(musicGroup.getOrganId());
+            sendSeoMessageSource.sendSeoMessage(musicGroup.getOrganId(), new SysUserRoleEnum[]{ORGAN_MANAGER},
+                    null, null, MessageTypeEnum.BACKSTAGE_PAYMENT_CALENDER_AUDIT, organization.getName(), musicGroup.getName());
+        } else {
+            if (musicGroupPaymentCalender.getPaymentType() == PaymentType.ADD_STUDENT) {
+                addStudent(musicGroupPaymentCalender, musicGroupPaymentCalender.getMusicGroupPaymentCalenderCourseSettingsList(), musicGroup);
+                //将0元未缴费学员缴费状态更新为已缴费
+                this.updateNoPaymentAndZeroPaymentStatus(musicGroupPaymentCalender, true);
+                // 学生加到班级
+                classGroupService.addStudentToClassGroupAndCourseArranging(calenderAddStudent.getStudentIds(), calenderAddStudent.getClassGroupIds(),
+                        batchNo, musicGroupPaymentBaseCalender.getMusicGroupPaymentCalenderCourseSettingsList(), musicGroup);
+                ExecutorService executor = Executors.newFixedThreadPool(5);
+                CompletableFuture.runAsync(() -> {
+                    imUserFriendService.refreshGroupImUserFriend(musicGroupId, GroupType.MUSIC);
+                }, executor);
+                executor.shutdown();
+            }
+        }
+        return batchNo;
+    }
+
+    //校验缴费项目进行中加学员
+    public void checkAddStudent(CalenderAddStudent calenderAddStudent, MusicGroup musicGroup) {
+        //获取缴费状态在审核中或者已拒绝的缴费项目的学员
+        Integer userId = calenderAddStudent.getStudentIds();
+        if (musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE) {
+            //该学员是否在其他的会员团
+            boolean hasMemberGroup = studentRegistrationDao.checkHasMemberGroup(musicGroup.getId(), userId);
+            if (hasMemberGroup) {
+                throw new BizException("操作失败:学员已在其他系统收费乐团中,不可报名该乐团请联系教务老师");
+            }
+        }
+
+        String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroup.getId(), null);
+        if (StringUtils.isNotEmpty(studentIds)) {
+            if (studentIds.contains(userId.toString())) {
+                throw new BizException("创建缴费失败:所选学员有待审核或已拒绝的缴费项目");
+            }
+        }
+        List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList = musicGroupPaymentCalenderDetailDao.queryNotPaymentStudentByUserIdAndMusicGroupId(userId, musicGroup.getId());
+        if (musicGroupPaymentCalenderDetailList != null && musicGroupPaymentCalenderDetailList.size() > 0) {
+            throw new BizException("创建缴费失败:已存在缴费项目");
+        }
+    }
+
+    public Map<String, Object> getCalenderDetail(Map<String, Object> result, Long calenderId) {
+        //课程
+        result.put("course", musicGroupPaymentCalenderCourseSettingsService.queryCalenderCourseSettings(calenderId));
+        //乐保
+        result.put("repair", musicGroupPaymentCalenderRepairService.findByCalenderId(calenderId));
+        MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberService.findByCalenderId(calenderId);
+        //会员信息
+        result.put("member", calenderMember);
+        //活动相关信息
+        result.put("activity", musicGroupPaymentCalenderActivityService.findByCalenderId(calenderId));
+        if (calenderMember != null) {
+            result.put("memberPrivilegesItemList", memberRankPrivilegesService.queryByMemberRankId(calenderMember.getMemberRankSettingId()));
+        }
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> getDetail(Long id) {
+        Map<String, Object> result = new HashMap<>(10);
+        //获取缴费项目详情
+        MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(id);
+        //统计预计缴费人数
+        Map<Long, Long> expectNumMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.countExpectNum(id));
+        if (expectNumMap != null) {
+            calender.setExpectNum(expectNumMap.get(id) == null ? 0 : expectNumMap.get(id).intValue());
+        }
+        //统计实际缴费人数
+        Map<Long, Long> actualNumMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.countActualNum(id));
+        if (actualNumMap != null) {
+            calender.setActualNum(actualNumMap.get(id) == null ? 0 : actualNumMap.get(id).intValue());
+        }
+
+        if (calender.getOrganId() != null) {
+            Organization organization = organizationDao.get(calender.getOrganId());
+            calender.setOrganName(organization.getName());
+        }
+        if (StringUtils.isNotEmpty(calender.getMusicGroupId())) {
+            MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
+            calender.setMusicGroupName(musicGroup.getName());
+        }
+        result.put("calender", calender);
+        //汇总收款金额
+        BigDecimal sumActualAmount = musicGroupPaymentCalenderDetailDao.sumActualAmount(id);
+        result.put("sumActualAmount", sumActualAmount);
+        //进行中加学员
+        if (calender.getPaymentType() == ADD_STUDENT) {
+            String studentIds = calender.getStudentIds();
+            if (StringUtils.isNotEmpty(studentIds)) {
+                SysUser sysUser = studentDao.getUser(Integer.parseInt(studentIds));
+                result.put("phone", sysUser.getPhone());
+                result.put("username", sysUser.getUsername());
+            }
+        }
+        //获取跨团合班学员缴费详情
+        result.put("musicMerger", musicGroupPaymentCalenderStudentDetailDao.findByBatchNo(calender.getBatchNo()));
+        return getCalenderDetail(result, id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String merge(MusicGroupPaymentCalenderDto musicGroupPaymentCalenderDto) {
+
+        String batchNo = musicGroupPaymentCalenderDto.getBatchNo();
+
+        List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+        if (musicGroupPaymentCalenderList == null || musicGroupPaymentCalenderList.size() == 0) {
+            throw new BizException("[批次号]参数错误");
+        }
+        PaymentCalenderStatusEnum status = musicGroupPaymentCalenderList.get(0).getStatus();
+        if (status != PaymentCalenderStatusEnum.REJECT && status != PaymentCalenderStatusEnum.DRAFT) {
+            throw new BizException("{}的缴费状态不允许修改", status.getDesc());
+        }
+        PaymentType paymentType = musicGroupPaymentCalenderDto.getPaymentType();
+        if (paymentType != SPAN_GROUP_CLASS_ADJUST) {
+            throw new BizException("操作失败:该入口不支持{}", paymentType.getDesc());
+        }
+        List<MusicGroupPaymentDateRange> musicGroupPaymentDateRangeList = musicGroupPaymentCalenderDto.getMusicGroupPaymentDateRangeList();
+        if (musicGroupPaymentDateRangeList.size() > 1) {
+            throw new BizException("创建缴费失败:不支持多周期缴费");
+        }
+        String musicGroupId = musicGroupPaymentCalenderDto.getMusicGroupId();
+
+        MusicGroup musicGroup = musicGroupDao.getLocked(musicGroupId);
+        if (musicGroup == null) {
+            throw new BizException("乐团查询失败,请检查参数");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("请登录");
+        }
+
+        List<Long> calenderIds = musicGroupPaymentCalenderList.stream().map(MusicGroupPaymentCalender::getId).collect(Collectors.toList());
+        //删除原来数据
+        musicGroupPaymentCalenderDao.delByIds(calenderIds);
+        musicGroupPaymentCalenderCourseSettingsService.deleteByMusicGroupPaymentCalenderId(calenderIds);
+
+        status = PaymentCalenderStatusEnum.NO;
+
+        Date date = new Date();
+
+        MusicGroupStudentClassAdjust adjust = musicGroupStudentClassAdjustDao.findByBatchNo(batchNo);
+        //获取默认的学员缴费详情
+        List<Integer> studentIdList = JSON.parseArray(adjust.getStudentIds(), Integer.class);
+        //获取欠费学员列表
+        List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(musicGroup.getId(), studentIdList);
+        if (noPaymentUserIds.size() > 0) {
+            throw new BizException("操作失败:有欠费的学员不允许创建缴费");
+        }
+        //获取缴费状态在审核中或者已拒绝的缴费项目的学员
+        String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroupId, batchNo);
+        if (StringUtils.isNotEmpty(studentIds)) {
+            for (Integer integer : studentIdList) {
+                if (studentIds.contains(integer.toString())) {
+                    throw new BizException("操作失败:所选学员有待审核或已拒绝的缴费项目");
+                }
+            }
+        }
+
+        List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails = classGroupService.queryStudentPaymentCalenders(adjust.getMasterClassGroupId(),
+                adjust.getClassGroupStudents(), studentIdList);
+        List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = musicGroupPaymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails();
+
+        boolean containsAll = musicGroupPaymentCalenderStudentDetails.containsAll(calenderStudentDetails);
+        if (!containsAll) {
+            status = AUDITING;
+        }
+        //删除之前的记录
+        musicGroupPaymentCalenderStudentDetailDao.delByBatchNo(batchNo);
+        //保存现有记录
+        musicGroupPaymentCalenderStudentDetailDao.batchInsert(calenderStudentDetails, batchNo);
+
+        MusicGroupPaymentDateRange musicGroupPaymentDateRange = musicGroupPaymentDateRangeList.get(0);
+        MusicGroupPaymentCalender musicGroupPaymentCalender = new MusicGroupPaymentCalender();
+        musicGroupPaymentCalender.setAttribute1(musicGroupPaymentCalenderDto.getAttribute1());
+        musicGroupPaymentCalender.setAttribute2(musicGroupPaymentCalenderDto.getAttribute2());
+        musicGroupPaymentCalender.setDeadlinePaymentDate(musicGroupPaymentDateRange.getDeadlinePaymentDate());
+        musicGroupPaymentCalender.setMemo(musicGroupPaymentCalenderDto.getMemo());
+        musicGroupPaymentCalender.setMusicGroupId(musicGroupId);
+        musicGroupPaymentCalender.setMusicGroupOrganizationCourseSettingId(musicGroupPaymentCalenderDto.getMusicGroupOrganizationCourseSettingId());
+        musicGroupPaymentCalender.setOriginalTotalAmount(calenderStudentDetails.stream().map(e -> e.getCourseOriginalPrice()).reduce(BigDecimal.ZERO, BigDecimal::add));
+        musicGroupPaymentCalender.setCurrentTotalAmount(calenderStudentDetails.stream().map(e -> e.getCourseCurrentPrice()).reduce(BigDecimal.ZERO, BigDecimal::add));
+        musicGroupPaymentCalender.setPaymentType(paymentType);
+        musicGroupPaymentCalender.setPayUserType(musicGroupPaymentCalenderDto.getPayUserType());
+        musicGroupPaymentCalender.setStartPaymentDate(musicGroupPaymentDateRange.getStartPaymentDate());
+        musicGroupPaymentCalender.setStudentIds(musicGroupPaymentCalenderDto.getStudentIds());
+        musicGroupPaymentCalender.setOperator(sysUser.getId());
+        musicGroupPaymentCalender.setCreateTime(date);
+        musicGroupPaymentCalender.setUpdateTime(date);
+        musicGroupPaymentCalender.setStatus(status);
+        musicGroupPaymentCalender.setOrganId(musicGroup.getOrganId());
+        if (musicGroupPaymentCalender.getStatus() != AUDITING) {
+            if (date.after(musicGroupPaymentCalender.getStartPaymentDate())) {
+                musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
+            } else if (date.after(musicGroupPaymentCalender.getDeadlinePaymentDate())) {
+                musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OVER);
+            } else {
+                musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.NO);
+            }
+        }
+        // 设置批次号
+        musicGroupPaymentCalender.setBatchNo(batchNo);
+        musicGroupPaymentCalenderDto.setBatchNo(batchNo);
+        musicGroupPaymentCalenderDao.insert(musicGroupPaymentCalender);
+        List<MusicGroupPaymentCalenderCourseSettings> currentMusicGroupPaymentCalenderCourseSettings = musicGroupPaymentCalender
+                .getMusicGroupPaymentCalenderCourseSettingsList();
+
+        if (musicGroupPaymentCalender.getStatus() != AUDITING) {
+            // 如果是进行中加学生
+            if (musicGroupPaymentCalender.getPaymentType() == PaymentType.ADD_STUDENT) {
+                addStudent(musicGroupPaymentCalender, currentMusicGroupPaymentCalenderCourseSettings, musicGroup);
+            } else if (musicGroupPaymentCalender.getPaymentType() == SPAN_GROUP_CLASS_ADJUST) {
+                //如果是跨团班级合并,添加学员
+                musicGroupPaymentCalenderDetailService.batchAdd(musicGroupPaymentCalender, musicGroupPaymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails());
+            }
+            //将0元未缴费学员缴费状态更新为已缴费
+            this.updateNoPaymentAndZeroPaymentStatus(musicGroupPaymentCalender, true);
+        }
+
+        if (status == AUDITING) {
+            // 如果是审核中
+            Organization organization = organizationDao.get(musicGroup.getOrganId());
+            sendSeoMessageSource.sendSeoMessage(musicGroup.getOrganId(), new SysUserRoleEnum[]{ORGAN_MANAGER},
+                    null, null, MessageTypeEnum.BACKSTAGE_PAYMENT_CALENDER_AUDIT, organization.getName(), musicGroup.getName());
+        } else {
+            //删除和解冻班级,课程信息
+            List<Map> classGroupStudents = JSON.parseArray(adjust.getClassGroupStudents(), Map.class);
+            List<Long> courseIds = JSON.parseArray(adjust.getSubLockCourseIds(), Long.class);
+            List<Long> allLockCourseIds = JSON.parseArray(adjust.getAllLockCourseIds(), Long.class);
+            classGroupService.spanGroupClassAdjustPass(adjust.getMasterClassGroupId()
+                    , studentIdList, courseIds, classGroupStudents, allLockCourseIds, batchNo, adjust.getMasterTotalPrice());
+        }
+        return batchNo;
+    }
+
+    //将0元未缴费学员缴费状态更新为已缴费
+    @Transactional(rollbackFor = Exception.class)
+    public void updateNoPaymentAndZeroPaymentStatus(MusicGroupPaymentCalender musicGroupPaymentCalender, Boolean updateFlag) {
+        if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
+            int j = musicGroupPaymentCalenderDetailDao.updateNoPaymentAndZeroPaymentStatus(musicGroupPaymentCalender.getId());
+            if (j > 0) {
+                musicGroupPaymentCalender.setActualNum((musicGroupPaymentCalender.getActualNum() == null ? 0 : musicGroupPaymentCalender.getActualNum()) + j);
+                if (updateFlag) {
+                    musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
+                }
+            }
+        }
+    }
+
+    @Override
+    public boolean makesureSchoolePaid(Long id, String memo) {
+        MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderDao.get(id);
+        if (musicGroupPaymentCalender == null) {
+            throw new BizException("查询缴费信息失败");
+        }
+
+        if (musicGroupPaymentCalender.getPayUserType() != PayUserType.SCHOOL) {
+            throw new BizException("只有学校缴费才能确认缴费状态");
+        }
+
+        musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.PAID);
+        musicGroupPaymentCalender.setMemo(memo);
+        musicGroupPaymentCalender.setUpdateTime(new Date());
+        musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
+
+        return true;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void addStudent(MusicGroupPaymentCalender musicGroupPaymentCalender,
+                           List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettingsList,
+                           MusicGroup musicGroup) {
+        //如果是进行中加学生
+        Date date = new Date();
+        String studentIdStr = musicGroupPaymentCalender.getStudentIds();
+        if (StringUtils.isNoneBlank(studentIdStr)) {
+            //当前乐团是否有预排课计划
+            MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroup.getId(), null, 0);
+            List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<MusicGroupPaymentStudentCourseDetail>();
+            MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;
+
+            List<MusicGroupPaymentCalenderActivity> calenderActivities = musicGroupPaymentCalenderActivityService.findByCalenderId(musicGroupPaymentCalender.getId());
+            MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberService.findByCalenderId(musicGroupPaymentCalender.getId());
+            for (String studentId : studentIdStr.split(",")) {
+                if (termCourseDetail != null) {
+                    //是否已经预排部分课程
+                    List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(musicGroup.getId());
+                    if (courseSchedules.size() > 0) {
+                        throw new BizException("操作失败:该乐团存在预排课课程,请优先完成预排课");
+                    } else {
+                        MusicGroupSchoolTermStudentCourseDetail studentCourseDetail = new MusicGroupSchoolTermStudentCourseDetail();
+                        studentCourseDetail.setMusicGroupSchoolTermCourseDetailId(termCourseDetail.getId());
+                        studentCourseDetail.setUserId(Integer.parseInt(studentId));
+                        studentCourseDetail.setMemberCourseMinutes(termCourseDetail.getTotalCourseTime());
+                        musicGroupSchoolTermStudentCourseDetailDao.insert(studentCourseDetail);
+                    }
+                }
+                // 学生加到calenderDetail
+                MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
+                musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
+                musicGroupPaymentCalenderDetail.setCreateTime(date);
+                musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.NON_PAYMENT);
+                musicGroupPaymentCalenderDetail.setUpdateTime(date);
+                musicGroupPaymentCalenderDetail.setUserId(Integer.parseInt(studentId));
+                musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
+                musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
+
+                musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
+                //如果是0元那么更新fee表和studentRegistration表
+                if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
+                    // 添加会员有效时长
+                    if (calenderMember != null) {
+                        CloudTeacherOrder cloudTeacherOrder = new CloudTeacherOrder();
+                        cloudTeacherOrder.setLevel(calenderMember.getMemberRankSettingId());
+                        cloudTeacherOrder.setOrganId(musicGroup.getOrganId());
+                        cloudTeacherOrder.setType(calenderMember.getPeriod());
+                        cloudTeacherOrder.setStudentId(Integer.parseInt(studentId));
+                        cloudTeacherOrder.setOrderId(musicGroup.getOrganId().longValue());
+                        cloudTeacherOrder.setTime(calenderMember.getNum().intValue());
+                        cloudTeacherOrder.setAmount(BigDecimal.ZERO);
+                        cloudTeacherOrder.setStatus(1);
+                        cloudTeacherOrder.setRemark("进行中乐团0元加学生");
+                        cloudTeacherOrder.setMusicGroupId(musicGroup.getId());
+                        cloudTeacherOrderDao.insert(cloudTeacherOrder);
+                    }
+                    //添加小课包
+                    if (calenderActivities != null && calenderActivities.size() > 0) {
+                        List<ActivityUserMapper> activityUserMapperList = new ArrayList<>();
+                        for (MusicGroupPaymentCalenderActivity calenderActivity : calenderActivities) {
+                            ActivityUserMapper activityUserMapper = new ActivityUserMapper();
+                            activityUserMapper.setActualPrice(BigDecimal.ZERO);
+                            activityUserMapper.setActivityId(calenderActivity.getActivityId());
+                            Student student = studentDao.get(Integer.parseInt(studentId));
+                            activityUserMapper.setUserId(Integer.parseInt(studentId));
+                            activityUserMapper.setTeacherId(student.getTeacherId());
+                            if ("网管课".equals(calenderActivity.getCategoryName())) {
+                                activityUserMapper.setPracticeFlag(1);
+                            } else {
+                                activityUserMapper.setVipFlag(1);
+                            }
+                            activityUserMapperList.add(activityUserMapper);
+                        }
+                        activityUserMapperService.batchInsert(activityUserMapperList);
+                    }
+                    //如果是进行中加学员
+                    StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(Integer.parseInt(studentId), musicGroupPaymentCalender.getMusicGroupId());
+                    studentRegistration.setPaymentStatus(YES);
+                    studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
+                    studentRegistrationDao.update(studentRegistration);
+
+                    //统计变更学员数
+                    groupEventSource.musicGroupStudentChangeEvent(musicGroupPaymentCalender.getMusicGroupId(), StudentMusicGroupStatusEnum.NORMAL, new ArrayList<>(Arrays.asList(Integer.parseInt(studentId))));
+                }
+                if (musicGroupPaymentCalenderCourseSettingsList != null && musicGroupPaymentCalenderCourseSettingsList.size() > 0) {
+                    // 学生加课程明细
+                    for (MusicGroupPaymentCalenderCourseSettings courseSettings : musicGroupPaymentCalenderCourseSettingsList) {
+                        if (courseSettings.getIsStudentOptional() == true) {
+                            continue;
+                        }
+                        musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
+                        musicGroupPaymentStudentCourseDetail.setCourseType(courseSettings.getCourseType());
+                        musicGroupPaymentStudentCourseDetail.setCreateTime(date);
+                        musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
+                        musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetail.getId());
+                        musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSettings.getCourseTotalMinuties());
+                        musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSettings.getCourseOriginalPrice());
+                        musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSettings.getCourseCurrentPrice());
+                        musicGroupPaymentStudentCourseDetail.setUpdateTime(date);
+                        musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(courseSettings.getCourseTotalMinuties());
+                        musicGroupPaymentStudentCourseDetail.setUserId(Integer.parseInt(studentId));
+                        musicGroupPaymentStudentCourseDetailList.add(musicGroupPaymentStudentCourseDetail);
+                    }
+
+                }
+                if (musicGroupPaymentStudentCourseDetailList.size() > 0) {
+                    musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetailList);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void autoUpdateMusicGroupStudentFeeStatus() {
+        Date date = new Date();
+        String format = DateUtil.format(date, DateUtil.DEFAULT_PATTERN);
+        // 获取距离缴费开启指定天数后的缴费明细
+        String configValue = sysConfigDao.findConfigValue("push_payment_detail");
+        Map<Long, Long> maps = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.queryCalenderByDay(configValue, format));
+        if (maps != null && maps.size() > 0) {
+            Set<Long> calenderId = maps.keySet();
+            List<CalenderPushDto> calenderPushDtos = musicGroupPaymentCalenderDao.getCalenderPushDto(calenderId);
+            Map<Long, List<CalenderPushDto>> collect = calenderPushDtos.stream().collect(Collectors.groupingBy(CalenderPushDto::getCalenderId));
+            calenderId.forEach(e -> {
+                CalenderPushDto calenderPushDto = collect.get(e).get(0);
+                Map<Integer, String> receivers = new HashMap<>(1);
+                receivers.put(calenderPushDto.getTeacherId(), calenderPushDto.getTeacherPhone());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_DETAIL, receivers, null, 0,
+                        null, null, calenderPushDto.getMusicGroupName(), calenderPushDto.getPaymentValidStartDate(), calenderPushDto.getPaymentValidEndDate(),
+                        maps.get(e));
+                Map<Integer, String> receivers1 = new HashMap<>(1);
+                receivers1.put(calenderPushDto.getTeacherId(), calenderPushDto.getTeacherId().toString());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_DETAIL, receivers1, null, 0,
+                        null, "SYSTEM", calenderPushDto.getMusicGroupName(), calenderPushDto.getPaymentValidStartDate(), calenderPushDto.getPaymentValidEndDate(),
+                        maps.get(e));
+            });
+        }
+        // 获取离截止还有指定时间的缴费项,并发送推送消息给指定老师
+        String configValue1 = sysConfigDao.findConfigValue("push_create_payment_calender");
+        List<Long> calenderIds = musicGroupPaymentCalenderDao.queryEndIds(configValue1, format, null);
+        if (calenderIds != null && calenderIds.size() > 0) {
+            List<CalenderPushDto> calenderPushDtos = musicGroupPaymentCalenderDao.getCalenderPushDto(calenderIds);
+            Map<Long, List<CalenderPushDto>> collect = calenderPushDtos.stream().collect(Collectors.groupingBy(CalenderPushDto::getCalenderId));
+            calenderIds.forEach(e -> {
+                CalenderPushDto calenderPushDto = collect.get(e).get(0);
+                Map<Integer, String> receivers = new HashMap<>(1);
+                receivers.put(calenderPushDto.getTeacherId(), calenderPushDto.getTeacherPhone());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_CREATE, receivers, null, 0,
+                        null, null, calenderPushDto.getMusicGroupName(), calenderPushDto.getPaymentValidStartDate(), calenderPushDto.getPaymentValidEndDate());
+                Map<Integer, String> receivers1 = new HashMap<>(1);
+                receivers1.put(calenderPushDto.getTeacherId(), calenderPushDto.getTeacherId().toString());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_CREATE, receivers1, null, 0,
+                        null, "SYSTEM", calenderPushDto.getMusicGroupName(), calenderPushDto.getPaymentValidStartDate(), calenderPushDto.getPaymentValidEndDate());
+            });
+        }
+
+        // 乐团报名到期,提醒教务老师创建缴费
+        List<CalenderPushDto> calenderPushDtos = musicGroupPaymentCalenderDao.getMusicCalenderPushDto(configValue1, format);
+        if (calenderPushDtos != null && calenderPushDtos.size() > 0) {
+            calenderPushDtos.forEach(e -> {
+                Map<Integer, String> receivers = new HashMap<>(1);
+                receivers.put(e.getTeacherId(), e.getTeacherPhone());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_CREATE, receivers, null, 0,
+                        null, null, e.getMusicGroupName(), e.getPaymentValidStartDate(), e.getPaymentValidEndDate());
+                Map<Integer, String> receivers1 = new HashMap<>(1);
+                receivers1.put(e.getTeacherId(), e.getTeacherId().toString());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SYSTEM_SMS_PUSH_PAYMENT_CREATE, receivers1, null, 0,
+                        null, "SYSTEM", e.getMusicGroupName(), e.getPaymentValidStartDate(), e.getPaymentValidEndDate());
+            });
+        }
+    }
+
+    @Override
+    public PageInfo<MusicGroupPaymentCalenderAuditDto> auditList(MusicGroupPaymentCalenderQueryInfo queryInfo) {
+        PageInfo<MusicGroupPaymentCalenderAuditDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<MusicGroupPaymentCalenderAuditDto> dataList = null;
+        int count = musicGroupPaymentCalenderDao.countAuditList(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = musicGroupPaymentCalenderDao.queryAuditList(params);
+            List<Integer> collect = dataList.stream().map(e -> e.getOrganId()).collect(Collectors.toList());
+            collect.removeAll(Collections.singleton(null));
+            Map<Integer, String> organNameMap = getMap("organization", "id_", "name_", collect, queryInfo.getTenantId(), Integer.class, String.class);
+            List<Integer> operatorIds = dataList.stream().map(e -> e.getOperator()).collect(Collectors.toList());
+            operatorIds.removeAll(Collections.singleton(null));
+            Map<Integer, String> realNameMap = getMap("sys_user", "id_", "real_name_", operatorIds, queryInfo.getTenantId(), Integer.class, String.class);
+            dataList.forEach(e -> {
+                e.setOrganName(organNameMap.get(e.getOrganId()));
+                e.setOperatorName(realNameMap.get(e.getOperator()));
+            });
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public MusicGroupPaymentCalenderAuditDetailDto auditListDetail(String batchNo) {
+        MusicGroupPaymentCalenderAuditDetailDto calenderAuditDetailDto = new MusicGroupPaymentCalenderAuditDetailDto();
+        MusicGroupPaymentCalenderAuditDto auditDto = musicGroupPaymentCalenderDao.getAuditDetail(batchNo);
+        calenderAuditDetailDto.setAuditDto(auditDto);
+        //获取缴费周期
+        List<MusicGroupPaymentCalender> groupPaymentCalenders = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+        if (groupPaymentCalenders == null || groupPaymentCalenders.size() == 0) {
+            throw new BizException("缴费项目异常,请联系管理员");
+        }
+        calenderAuditDetailDto.setMusicGroupPaymentCalenders(groupPaymentCalenders);
+        MusicGroupPaymentCalender paymentCalender = groupPaymentCalenders.get(0);
 //		if(paymentCalender.getMemberRankSettingId() != null){
 //			MemberRankSetting memberRankSetting = memberRankSettingDao.get(paymentCalender.getMemberRankSettingId());
 //			if(memberRankSetting != null){
 //				paymentCalender.setMemberRankSettingName(memberRankSetting.getName());
 //			}
 //		}
-		if(paymentCalender.getPaymentType() == ADD_STUDENT){
-			try {
-				String studentIds = groupPaymentCalenders.get(0).getStudentIds();
-				if(StringUtils.isNotEmpty(studentIds)){
-					SysUser sysUser = sysUserFeignService.queryUserById(Integer.parseInt(studentIds));
-					calenderAuditDetailDto.setPhone(sysUser.getPhone());
-					calenderAuditDetailDto.setUsername(sysUser.getUsername());
-				}
-			}catch (Exception e){
-				e.printStackTrace();
-			}
-		}
-		//获取收费标准
-		calenderAuditDetailDto.setMusicGroupPaymentCalenderCourseSettings(musicGroupPaymentCalenderCourseSettingsService.queryCalenderCourseSettingsByBatchNo(batchNo));
-		//获取跨团合班学员缴费详情
-		calenderAuditDetailDto.setMusicGroupPaymentCalenderStudentDetails(musicGroupPaymentCalenderStudentDetailDao.findByBatchNo(batchNo));
-		return calenderAuditDetailDto;
-	}
-
-	//审核通过后自动排课
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void autoClassGroupAdjust(MusicGroupStudentClassAdjust musicGroupStudentClassAdjust){
-		List<MusicGroupPaymentCalender> musicGroupPaymentCalenders = musicGroupPaymentCalenderDao.findByBatchNo(musicGroupStudentClassAdjust.getBatchNo());
-		for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
-			if(musicGroupPaymentCalender.getStatus() == AUDITING || musicGroupPaymentCalender.getStatus() == REJECT){
-				return;
-			}
-		}
-		List<ClassGroup4MixDto> classGroup4MixDtos = JSON.parseArray(musicGroupStudentClassAdjust.getNewClassGroupJson(), ClassGroup4MixDto.class);
-		String musicGroupId = musicGroupPaymentCalenders.get(0).getMusicGroupId();
-		MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-		for (MusicGroupPaymentCalender calender : musicGroupPaymentCalenders) {
-			//缴费项目添加学员
-			int[] ints = Arrays.stream(calender.getStudentIds().split(",")).mapToInt(Integer::parseInt).toArray();
-			Set<Integer> list2 = Arrays.stream(ints).boxed().collect(Collectors.toSet());
-			musicGroupPaymentCalenderDetailService.batchAdd(calender.getId(),list2,musicGroup,false);
-		}
-		//每种课程类型单独排课
-		ClassGroup classGroup = null;
-		for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
-			classGroup4MixDto.setClassGroup(classGroup);
-			classGroup4MixDto.setMusicGroupStudentClassAdjustId(musicGroupStudentClassAdjust.getId());
-			classGroup4MixDto.setClassCourseMinute(musicGroupStudentClassAdjust.getClassCourseMinute());
-			classGroup = classGroupService.classGroupAdjust2(classGroup4MixDto);
-		}
-		//排课完成后删除所选课程
-		List<Long> courseIds = JSON.parseArray(musicGroupStudentClassAdjust.getSubLockCourseIds(), Long.class);
-		List<Integer> studentIds = JSON.parseArray(musicGroupStudentClassAdjust.getStudentIds(), Integer.class);
-		courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds,studentIds);
-		//解冻课程
-		List<Long> allCourseIds = JSON.parseArray(musicGroupStudentClassAdjust.getAllLockCourseIds(), Long.class);
-		courseScheduleDao.batchUpdateLockByCourseIds(allCourseIds,0,null);
-		//解冻班级
-		List<Integer> classGroupIds = JSON.parseArray(musicGroupStudentClassAdjust.getClassGroupIds(), Integer.class);
-		classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds,0);
-		//删除班级学员
-		musicGroupStudentClassAdjustDao.update(musicGroupStudentClassAdjust);
-		String classGroupStudents = musicGroupStudentClassAdjust.getClassGroupStudents();
-		if(StringUtils.isNotEmpty(classGroupStudents)){
-			List<Map> maps = JSON.parseArray(classGroupStudents, Map.class);
-			for (Map<Integer, String> classGroupStudent : maps) {
-				Set<Integer> integers = classGroupStudent.keySet();
-				for (Integer integer : integers) {
-					List<Integer> collect = Arrays.asList(classGroupStudent.get(integer).split(",")).stream().map(e -> Integer.parseInt(e)).collect(Collectors.toList());
-					//学员退出群聊
-					imGroupMemberService.quit(integer.longValue(),collect);
-					classGroupStudentMapperDao.deleteByClassGroupIdAndStudents(integer,classGroupStudent.get(integer));
-				}
-			}
-		}
-		//获取没有学员的课程列表
-		List<Long> delCourseIds = courseScheduleDao.findNoStudentCourseIds(courseIds);
-		if(delCourseIds != null && delCourseIds.size() > 0){
-			//删除课程
-			courseScheduleDao.deleteCourseSchedulesByClassGroupIds(delCourseIds);
-			//删除教师考勤
-			teacherAttendanceDao.batchDeleteByCourseSchedules(delCourseIds);
-			//删除教师课酬
-			courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(delCourseIds);
-		}
-		classGroupService.batchUpdateTeacherSalary(classGroupIds);
-		imUserFriendService.refreshGroupImUserFriend(musicGroupId,GroupType.MUSIC);
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void auditPass(String batchNs,String auditMemo) {
-		String[] split = batchNs.split(",");
-		Date date = new Date();
-		for (String batchNo : split) {
-			List<MusicGroupPaymentCalender> musicGroupPaymentCalenders = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
-			if(musicGroupPaymentCalenders == null || musicGroupPaymentCalenders.size() == 0){
-				throw new BizException("缴费项目不存在");
-			}
-			MusicGroupPaymentCalender calender = musicGroupPaymentCalenders.get(0);
-			MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
-			for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
-				//如果是报名项目,将乐团改为审核中,缴费项目修改状态,审核状态改为审核通过
-				if(musicGroupPaymentCalender.getPayUserType() == SCHOOL){
-					if(musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) > 0){
-						musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
-					}else{
-						musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.PAID);
-					}
-				}else if (date.after(musicGroupPaymentCalender.getStartPaymentDate())) {
-					musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
-				}else if (date.after(musicGroupPaymentCalender.getDeadlinePaymentDate())) {
-					musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OVER);
-				}else {
-					musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.NO);
-				}
-				musicGroupPaymentCalender.setAuditMemo(auditMemo);
-				musicGroupPaymentCalender.setUpdateTime(date);
-
-				if (musicGroupPaymentCalender.getPaymentType() == PaymentType.ADD_STUDENT) {
-					musicGroupPaymentCalender.setExpectNum(1);
-					List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettings = musicGroupPaymentCalenderCourseSettingsService.queryCalenderCourseSettings(musicGroupPaymentCalender.getId());
-					addStudent(musicGroupPaymentCalender,musicGroupPaymentCalenderCourseSettings,musicGroup);
-				}
-			}
-			if(calender.getPaymentType() == ADD_STUDENT || calender.getPaymentType() == SPAN_GROUP_CLASS_ADJUST){
-				// 所有缴费项目已完成排课才能创建下一个缴费项目
-				List<String> batchNoList = new ArrayList<>();
-				batchNoList.add(batchNo);
-				String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(calender.getMusicGroupId(), null, null,batchNoList);
-				if (StringUtils.isNoneBlank(orignBatchNo)) {
-					throw new BizException("{} 存在未排课的缴费项目,请先完成排课再操作",musicGroup.getName());
-				}
-				List<Integer> userIds = Arrays.stream(calender.getStudentIds().split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toList());
-				//获取欠费学员列表
-				List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(calender.getMusicGroupId(),userIds);
-				if(noPaymentUserIds.size() > 0){
-					throw new BizException("{} 有欠费的学员不允许创建缴费",musicGroup.getName());
-				}
-				//获取缴费状态在审核中或者已拒绝的缴费项目的学员
-				String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(calender.getMusicGroupId(),batchNo);
-				if(StringUtils.isNotEmpty(studentIds)){
-					for (Integer integer : userIds) {
-						if(studentIds.contains(integer.toString())){
-							throw new BizException("{} 的 {} 缴费项目,所选学员有待审核或已拒绝的缴费项目",musicGroup.getName(),calender.getPaymentType().getCode());
-						}
-					}
-				}
-			}
-			//如果是报名,并且所有的报名都审核通过,需要修改乐团状态
-			if (calender.getPaymentType() == MUSIC_APPLY) {
-				//统计乐团还在审核中或者审核被拒的缴费
-				int count = musicGroupPaymentCalenderDao.countAuditReject(calender.getMusicGroupId(),calender.getId());
-				if(count == 0){
-					musicGroup.setStatus(MusicGroupStatusEnum.APPLY);
-					musicGroup.setUpdateTime(date);
-					musicGroupDao.update(musicGroup);
-					SysUser sysUser = sysUserFeignService.queryUserInfo();
-					if(sysUser == null || sysUser.getId() == null){
-						throw new BizException("请重新登录");
-					}
-					//记录操作日志
-					musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroup.getId(), "报名缴费项目通过(费用审核中 -> 报名中)", sysUser.getId(), ""));
-				}
-			} else if (calender.getPaymentType() == ADD_STUDENT) {
-				// 学生加到班级
-				String classGroupIdStr = calender.getAttribute1();
-				if (StringUtils.isNotBlank(classGroupIdStr)) {
-					classGroupService.addStudentToClassGroupAndCourseArranging(Integer.parseInt(calender.getStudentIds()), classGroupIdStr, batchNo,
-							musicGroupPaymentCalenderCourseSettingsService.queryCalenderCourseSettingsByBatchNo(batchNo),musicGroup);
-				}
-				MusicGroupStudentClassAdjust musicGroupStudentClassAdjust = musicGroupStudentClassAdjustDao.findByBatchNo(batchNo);
-				if(musicGroupStudentClassAdjust != null){
-					//如果是合班缴费
-					autoClassGroupAdjust(musicGroupStudentClassAdjust);
-				}
-			}else if(calender.getPaymentType() == SPAN_GROUP_CLASS_ADJUST){
-				//删除和解冻班级,课程信息
-				MusicGroupStudentClassAdjust adjust = musicGroupStudentClassAdjustDao.findByBatchNo(batchNo);
-				List<Map> classGroupStudents = JSON.parseArray(adjust.getClassGroupStudents(),Map.class);
-				List<Integer> studentIds = JSON.parseArray(adjust.getStudentIds(), Integer.class);
-				List<Long> courseIds = JSON.parseArray(adjust.getSubLockCourseIds(), Long.class);
-				List<Long> allLockCourseIds = JSON.parseArray(adjust.getAllLockCourseIds(), Long.class);
-				//如果是跨团班级合并,添加学员
-				musicGroupPaymentCalenderDetailService.batchAdd(calender,musicGroupPaymentCalenderStudentDetailDao.findByBatchNo(batchNo));
-				classGroupService.spanGroupClassAdjustPass(adjust.getMasterClassGroupId()
-						,studentIds,courseIds,classGroupStudents,allLockCourseIds,batchNo,adjust.getMasterTotalPrice());
-			}
-			for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
-				//将0元未缴费学员缴费状态更新为已缴费
-				this.updateNoPaymentAndZeroPaymentStatus(musicGroupPaymentCalender,false);
-			}
-			musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenders);
-			if (calender.getPaymentType() == ADD_STUDENT){
-				imUserFriendService.refreshGroupImUserFriend(calender.getMusicGroupId(),GroupType.MUSIC);
-			}
-		}
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void auditRefuse(String batchNs,String auditMemo) {
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if(sysUser == null || sysUser.getId() == null){
-			throw new BizException("请重新登录");
-		}
-		String[] split = batchNs.split(",");
-		Date date = new Date();
-		for (String batchNo : split) {
-			List<MusicGroupPaymentCalender> musicGroupPaymentCalenders = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
-			if(musicGroupPaymentCalenders == null || musicGroupPaymentCalenders.size() == 0){
-				throw new BizException("缴费项目不存在");
-			}
-			for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
-				musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.REJECT);
-				musicGroupPaymentCalender.setUpdateTime(date);
-				musicGroupPaymentCalender.setAuditMemo(auditMemo);
-			}
-			MusicGroupPaymentCalender calender = musicGroupPaymentCalenders.get(0);
-			//如果是报名,并且所有的报名都审核通过,需要修改乐团状态
-			if (calender.getPaymentType() == MUSIC_APPLY) {
-				MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
-				musicGroup.setStatus(MusicGroupStatusEnum.PRE_BUILD_FEE);
-				musicGroup.setUpdateTime(date);
-				musicGroupDao.update(musicGroup);
-				//记录操作日志
-				musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroup.getId(), "报名缴费项目失败(费用审核中 -> 审核拒绝)", sysUser.getId(), ""));
-			}
-			musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenders);
-		}
-	}
-
-	//推送待续费通知
-	public void pushWaitRenewMessage(Long calenderId,MusicGroup musicGroup,Set<Integer> studentIds){
-		if(studentIds == null){
-			studentIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentStudentIds(calenderId);
-		}
-		if (studentIds.size() > 0) {
-			String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-			StringBuffer memo = new StringBuffer("4?").append(baseUrl).append("/#/musicGroupRenew?calenderId=").append(calenderId).append("&id=").append(musicGroup.getId());
-			Map<Integer, String> push = new HashMap<>(studentIds.size());
-			studentIds.forEach(e->push.put(e,e.toString()));
-			// 发送续费通知
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
-					null, 0, memo.toString(), "STUDENT", musicGroup.getName());
-
-			//获取未缴费且不是0元的学员列表
-			Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calenderId,studentIds));
-			if(studentMaps.size() > 0){
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_WAIT_RENEW_MESSAGE, studentMaps,
-						null, 0, memo.toString(), null, musicGroup.getName());
-			}
-		}
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
-	public void revoke(String batchNo) {
-		List<MusicGroupPaymentCalender> calenders = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
-		if(calenders.size() == 0){
-			throw new BizException("缴费批次不存在");
-		}
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		Date date = new Date();
-		calenders.forEach(e->{
-			if(e.getPaymentType() == ADD_STUDENT || e.getPaymentType() == SPAN_GROUP_CLASS_ADJUST){
-				throw new BizException("{} 的缴费项目不允许撤回",e.getStatus().getDesc());
-			}
-			if(e.getStatus() != AUDITING){
-				throw new BizException("{} 的缴费状态不允许撤回",e.getStatus().getDesc());
-			}
-			if(e.getPaymentType() == MUSIC_APPLY){
-				//如果是报名,并且所有的报名都审核通过,需要修改乐团状态
-				MusicGroup musicGroup = musicGroupDao.get(e.getMusicGroupId());
-				musicGroup.setStatus(MusicGroupStatusEnum.PRE_BUILD_FEE);
-				musicGroup.setUpdateTime(date);
-				musicGroupDao.update(musicGroup);
-				//记录操作日志
-				musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroup.getId(), "报名缴费项目撤回(费用审核中 -> 撤回)", sysUser.getId(), ""));
-			}
-			e.setStatus(DRAFT);
-		});
-		musicGroupPaymentCalenderDao.batchUpdate(calenders);
-	}
-
-	@Override
-	public List<MusicGroupPaymentCalender> findByBatchNo(String batchNo) {
-		return musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
-	}
-
-	@Override
-	public PageInfo<MusicGroupPaymentCalenderResultDto> queryCalenderPage(MusicGroupPaymentCalenderQueryInfo queryInfo) {
-		PageInfo<MusicGroupPaymentCalenderResultDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<>();
-		MapUtil.populateMap(params, queryInfo);
-
-		List<MusicGroupPaymentCalenderResultDto> dataList = null;
-		int count = musicGroupPaymentCalenderDao.countCalender(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = musicGroupPaymentCalenderDao.queryCalenderPage(params);
-			Set<Integer> organIdList = dataList.stream().map(e -> e.getOrganId()).collect(Collectors.toSet());
-			Map<Integer, String> organNameMap = getMap("organization", "id_", "name_", organIdList,queryInfo.getTenantId(), Integer.class, String.class);
-			List<Integer> operatorIds = dataList.stream().map(e -> e.getOperator()).collect(Collectors.toList());
-			operatorIds.removeAll(Collections.singleton(null));
-			Map<Integer, String> realNameMap = getMap("sys_user", "id_", "real_name_", operatorIds,queryInfo.getTenantId(), Integer.class, String.class);
-			dataList.forEach(e->{
-				e.setOrganName(organNameMap.get(e.getOrganId()));
-				e.setOperatorName(realNameMap.get(e.getOperator()));
-			});
-		}
-		if (count == 0) {
-			dataList = new ArrayList<>();
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
-	}
+        if (paymentCalender.getPaymentType() == ADD_STUDENT) {
+            try {
+                String studentIds = groupPaymentCalenders.get(0).getStudentIds();
+                if (StringUtils.isNotEmpty(studentIds)) {
+                    SysUser sysUser = sysUserFeignService.queryUserById(Integer.parseInt(studentIds));
+                    calenderAuditDetailDto.setPhone(sysUser.getPhone());
+                    calenderAuditDetailDto.setUsername(sysUser.getUsername());
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        //获取收费标准
+        calenderAuditDetailDto.setMusicGroupPaymentCalenderCourseSettings(musicGroupPaymentCalenderCourseSettingsService.queryCalenderCourseSettingsByBatchNo(batchNo));
+        //获取跨团合班学员缴费详情
+        calenderAuditDetailDto.setMusicGroupPaymentCalenderStudentDetails(musicGroupPaymentCalenderStudentDetailDao.findByBatchNo(batchNo));
+        return calenderAuditDetailDto;
+    }
 
+    //审核通过后自动排课
     @Override
-	@Transactional(rollbackFor = Exception.class)
+    @Transactional(rollbackFor = Exception.class)
+    public void autoClassGroupAdjust(MusicGroupStudentClassAdjust musicGroupStudentClassAdjust) {
+        List<MusicGroupPaymentCalender> musicGroupPaymentCalenders = musicGroupPaymentCalenderDao.findByBatchNo(musicGroupStudentClassAdjust.getBatchNo());
+        for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
+            if (musicGroupPaymentCalender.getStatus() == AUDITING || musicGroupPaymentCalender.getStatus() == REJECT) {
+                return;
+            }
+        }
+        List<ClassGroup4MixDto> classGroup4MixDtos = JSON.parseArray(musicGroupStudentClassAdjust.getNewClassGroupJson(), ClassGroup4MixDto.class);
+        String musicGroupId = musicGroupPaymentCalenders.get(0).getMusicGroupId();
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        for (MusicGroupPaymentCalender calender : musicGroupPaymentCalenders) {
+            //缴费项目添加学员
+            int[] ints = Arrays.stream(calender.getStudentIds().split(",")).mapToInt(Integer::parseInt).toArray();
+            Set<Integer> list2 = Arrays.stream(ints).boxed().collect(Collectors.toSet());
+            musicGroupPaymentCalenderDetailService.batchAdd(calender.getId(), list2, musicGroup, false);
+        }
+        //每种课程类型单独排课
+        ClassGroup classGroup = null;
+        for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
+            classGroup4MixDto.setClassGroup(classGroup);
+            classGroup4MixDto.setMusicGroupStudentClassAdjustId(musicGroupStudentClassAdjust.getId());
+            classGroup4MixDto.setClassCourseMinute(musicGroupStudentClassAdjust.getClassCourseMinute());
+            classGroup = classGroupService.classGroupAdjust2(classGroup4MixDto);
+        }
+        //排课完成后删除所选课程
+        List<Long> courseIds = JSON.parseArray(musicGroupStudentClassAdjust.getSubLockCourseIds(), Long.class);
+        List<Integer> studentIds = JSON.parseArray(musicGroupStudentClassAdjust.getStudentIds(), Integer.class);
+        courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds, studentIds);
+        //解冻课程
+        List<Long> allCourseIds = JSON.parseArray(musicGroupStudentClassAdjust.getAllLockCourseIds(), Long.class);
+        courseScheduleDao.batchUpdateLockByCourseIds(allCourseIds, 0, null);
+        //解冻班级
+        List<Integer> classGroupIds = JSON.parseArray(musicGroupStudentClassAdjust.getClassGroupIds(), Integer.class);
+        classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 0);
+        //删除班级学员
+        musicGroupStudentClassAdjustDao.update(musicGroupStudentClassAdjust);
+        String classGroupStudents = musicGroupStudentClassAdjust.getClassGroupStudents();
+        if (StringUtils.isNotEmpty(classGroupStudents)) {
+            List<Map> maps = JSON.parseArray(classGroupStudents, Map.class);
+            for (Map<Integer, String> classGroupStudent : maps) {
+                Set<Integer> integers = classGroupStudent.keySet();
+                for (Integer integer : integers) {
+                    List<Integer> collect = Arrays.asList(classGroupStudent.get(integer).split(",")).stream().map(e -> Integer.parseInt(e)).collect(Collectors.toList());
+                    //学员退出群聊
+                    imGroupMemberService.quit(integer.longValue(), collect);
+                    classGroupStudentMapperDao.deleteByClassGroupIdAndStudents(integer, classGroupStudent.get(integer));
+                }
+            }
+        }
+        //获取没有学员的课程列表
+        List<Long> delCourseIds = courseScheduleDao.findNoStudentCourseIds(courseIds);
+        if (delCourseIds != null && delCourseIds.size() > 0) {
+            //删除课程
+            courseScheduleDao.deleteCourseSchedulesByClassGroupIds(delCourseIds);
+            //删除教师考勤
+            teacherAttendanceDao.batchDeleteByCourseSchedules(delCourseIds);
+            //删除教师课酬
+            courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(delCourseIds);
+        }
+        classGroupService.batchUpdateTeacherSalary(classGroupIds);
+        imUserFriendService.refreshGroupImUserFriend(musicGroupId, GroupType.MUSIC);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void auditPass(String batchNs, String auditMemo) {
+        String[] split = batchNs.split(",");
+        Date date = new Date();
+        for (String batchNo : split) {
+            List<MusicGroupPaymentCalender> musicGroupPaymentCalenders = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+            if (musicGroupPaymentCalenders == null || musicGroupPaymentCalenders.size() == 0) {
+                throw new BizException("缴费项目不存在");
+            }
+            MusicGroupPaymentCalender calender = musicGroupPaymentCalenders.get(0);
+            MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
+            for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
+                //如果是报名项目,将乐团改为审核中,缴费项目修改状态,审核状态改为审核通过
+                if (musicGroupPaymentCalender.getPayUserType() == SCHOOL) {
+                    if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) > 0) {
+                        musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
+                    } else {
+                        musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.PAID);
+                    }
+                } else if (date.after(musicGroupPaymentCalender.getStartPaymentDate())) {
+                    musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OPEN);
+                } else if (date.after(musicGroupPaymentCalender.getDeadlinePaymentDate())) {
+                    musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.OVER);
+                } else {
+                    musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.NO);
+                }
+                musicGroupPaymentCalender.setAuditMemo(auditMemo);
+                musicGroupPaymentCalender.setUpdateTime(date);
+
+                if (musicGroupPaymentCalender.getPaymentType() == PaymentType.ADD_STUDENT) {
+                    musicGroupPaymentCalender.setExpectNum(1);
+                    List<MusicGroupPaymentCalenderCourseSettings> musicGroupPaymentCalenderCourseSettings = musicGroupPaymentCalenderCourseSettingsService.queryCalenderCourseSettings(musicGroupPaymentCalender.getId());
+                    addStudent(musicGroupPaymentCalender, musicGroupPaymentCalenderCourseSettings, musicGroup);
+                }
+            }
+            if (calender.getPaymentType() == ADD_STUDENT || calender.getPaymentType() == SPAN_GROUP_CLASS_ADJUST) {
+                // 所有缴费项目已完成排课才能创建下一个缴费项目
+                List<String> batchNoList = new ArrayList<>();
+                batchNoList.add(batchNo);
+                String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(calender.getMusicGroupId(), null, null, batchNoList);
+                if (StringUtils.isNoneBlank(orignBatchNo)) {
+                    throw new BizException("{} 存在未排课的缴费项目,请先完成排课再操作", musicGroup.getName());
+                }
+                List<Integer> userIds = Arrays.stream(calender.getStudentIds().split(",")).mapToInt(Integer::valueOf).boxed().collect(Collectors.toList());
+                //获取欠费学员列表
+                List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(calender.getMusicGroupId(), userIds);
+                if (noPaymentUserIds.size() > 0) {
+                    throw new BizException("{} 有欠费的学员不允许创建缴费", musicGroup.getName());
+                }
+                //获取缴费状态在审核中或者已拒绝的缴费项目的学员
+                String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(calender.getMusicGroupId(), batchNo);
+                if (StringUtils.isNotEmpty(studentIds)) {
+                    for (Integer integer : userIds) {
+                        if (studentIds.contains(integer.toString())) {
+                            throw new BizException("{} 的 {} 缴费项目,所选学员有待审核或已拒绝的缴费项目", musicGroup.getName(), calender.getPaymentType().getCode());
+                        }
+                    }
+                }
+            }
+            //如果是报名,并且所有的报名都审核通过,需要修改乐团状态
+            if (calender.getPaymentType() == MUSIC_APPLY) {
+                //统计乐团还在审核中或者审核被拒的缴费
+                int count = musicGroupPaymentCalenderDao.countAuditReject(calender.getMusicGroupId(), calender.getId());
+                if (count == 0) {
+                    musicGroup.setStatus(MusicGroupStatusEnum.APPLY);
+                    musicGroup.setUpdateTime(date);
+                    musicGroupDao.update(musicGroup);
+                    SysUser sysUser = sysUserFeignService.queryUserInfo();
+                    if (sysUser == null || sysUser.getId() == null) {
+                        throw new BizException("请重新登录");
+                    }
+                    //记录操作日志
+                    musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroup.getId(), "报名缴费项目通过(费用审核中 -> 报名中)", sysUser.getId(), ""));
+                }
+            } else if (calender.getPaymentType() == ADD_STUDENT) {
+                // 学生加到班级
+                String classGroupIdStr = calender.getAttribute1();
+                if (StringUtils.isNotBlank(classGroupIdStr)) {
+                    classGroupService.addStudentToClassGroupAndCourseArranging(Integer.parseInt(calender.getStudentIds()), classGroupIdStr, batchNo,
+                            musicGroupPaymentCalenderCourseSettingsService.queryCalenderCourseSettingsByBatchNo(batchNo), musicGroup);
+                }
+                MusicGroupStudentClassAdjust musicGroupStudentClassAdjust = musicGroupStudentClassAdjustDao.findByBatchNo(batchNo);
+                if (musicGroupStudentClassAdjust != null) {
+                    //如果是合班缴费
+                    autoClassGroupAdjust(musicGroupStudentClassAdjust);
+                }
+            } else if (calender.getPaymentType() == SPAN_GROUP_CLASS_ADJUST) {
+                //删除和解冻班级,课程信息
+                MusicGroupStudentClassAdjust adjust = musicGroupStudentClassAdjustDao.findByBatchNo(batchNo);
+                List<Map> classGroupStudents = JSON.parseArray(adjust.getClassGroupStudents(), Map.class);
+                List<Integer> studentIds = JSON.parseArray(adjust.getStudentIds(), Integer.class);
+                List<Long> courseIds = JSON.parseArray(adjust.getSubLockCourseIds(), Long.class);
+                List<Long> allLockCourseIds = JSON.parseArray(adjust.getAllLockCourseIds(), Long.class);
+                //如果是跨团班级合并,添加学员
+                musicGroupPaymentCalenderDetailService.batchAdd(calender, musicGroupPaymentCalenderStudentDetailDao.findByBatchNo(batchNo));
+                classGroupService.spanGroupClassAdjustPass(adjust.getMasterClassGroupId()
+                        , studentIds, courseIds, classGroupStudents, allLockCourseIds, batchNo, adjust.getMasterTotalPrice());
+            }
+            for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
+                //将0元未缴费学员缴费状态更新为已缴费
+                this.updateNoPaymentAndZeroPaymentStatus(musicGroupPaymentCalender, false);
+            }
+            musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenders);
+            if (calender.getPaymentType() == ADD_STUDENT) {
+                imUserFriendService.refreshGroupImUserFriend(calender.getMusicGroupId(), GroupType.MUSIC);
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void auditRefuse(String batchNs, String auditMemo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || sysUser.getId() == null) {
+            throw new BizException("请重新登录");
+        }
+        String[] split = batchNs.split(",");
+        Date date = new Date();
+        for (String batchNo : split) {
+            List<MusicGroupPaymentCalender> musicGroupPaymentCalenders = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+            if (musicGroupPaymentCalenders == null || musicGroupPaymentCalenders.size() == 0) {
+                throw new BizException("缴费项目不存在");
+            }
+            for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenders) {
+                musicGroupPaymentCalender.setStatus(PaymentCalenderStatusEnum.REJECT);
+                musicGroupPaymentCalender.setUpdateTime(date);
+                musicGroupPaymentCalender.setAuditMemo(auditMemo);
+            }
+            MusicGroupPaymentCalender calender = musicGroupPaymentCalenders.get(0);
+            //如果是报名,并且所有的报名都审核通过,需要修改乐团状态
+            if (calender.getPaymentType() == MUSIC_APPLY) {
+                MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
+                musicGroup.setStatus(MusicGroupStatusEnum.PRE_BUILD_FEE);
+                musicGroup.setUpdateTime(date);
+                musicGroupDao.update(musicGroup);
+                //记录操作日志
+                musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroup.getId(), "报名缴费项目失败(费用审核中 -> 审核拒绝)", sysUser.getId(), ""));
+            }
+            musicGroupPaymentCalenderDao.batchUpdate(musicGroupPaymentCalenders);
+        }
+    }
+
+    //推送待续费通知
+    public void pushWaitRenewMessage(Long calenderId, MusicGroup musicGroup, Set<Integer> studentIds) {
+        if (studentIds == null) {
+            studentIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentStudentIds(calenderId);
+        }
+        if (studentIds.size() > 0) {
+            String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+            StringBuffer memo = new StringBuffer("4?").append(baseUrl).append("/#/musicGroupRenew?calenderId=").append(calenderId).append("&id=").append(musicGroup.getId());
+            Map<Integer, String> push = new HashMap<>(studentIds.size());
+            studentIds.forEach(e -> push.put(e, e.toString()));
+            // 发送续费通知
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
+                    null, 0, memo.toString(), "STUDENT", musicGroup.getName());
+
+            //获取未缴费且不是0元的学员列表
+            Map<Integer, String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calenderId, studentIds));
+            if (studentMaps.size() > 0) {
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_WAIT_RENEW_MESSAGE, studentMaps,
+                        null, 0, memo.toString(), null, musicGroup.getName());
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public void revoke(String batchNo) {
+        List<MusicGroupPaymentCalender> calenders = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+        if (calenders.size() == 0) {
+            throw new BizException("缴费批次不存在");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        Date date = new Date();
+        calenders.forEach(e -> {
+            if (e.getPaymentType() == ADD_STUDENT || e.getPaymentType() == SPAN_GROUP_CLASS_ADJUST) {
+                throw new BizException("{} 的缴费项目不允许撤回", e.getStatus().getDesc());
+            }
+            if (e.getStatus() != AUDITING) {
+                throw new BizException("{} 的缴费状态不允许撤回", e.getStatus().getDesc());
+            }
+            if (e.getPaymentType() == MUSIC_APPLY) {
+                //如果是报名,并且所有的报名都审核通过,需要修改乐团状态
+                MusicGroup musicGroup = musicGroupDao.get(e.getMusicGroupId());
+                musicGroup.setStatus(MusicGroupStatusEnum.PRE_BUILD_FEE);
+                musicGroup.setUpdateTime(date);
+                musicGroupDao.update(musicGroup);
+                //记录操作日志
+                musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroup.getId(), "报名缴费项目撤回(费用审核中 -> 撤回)", sysUser.getId(), ""));
+            }
+            e.setStatus(DRAFT);
+        });
+        musicGroupPaymentCalenderDao.batchUpdate(calenders);
+    }
+
+    @Override
+    public List<MusicGroupPaymentCalender> findByBatchNo(String batchNo) {
+        return musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+    }
+
+    @Override
+    public PageInfo<MusicGroupPaymentCalenderResultDto> queryCalenderPage(MusicGroupPaymentCalenderQueryInfo queryInfo) {
+        PageInfo<MusicGroupPaymentCalenderResultDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<MusicGroupPaymentCalenderResultDto> dataList = null;
+        int count = musicGroupPaymentCalenderDao.countCalender(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = musicGroupPaymentCalenderDao.queryCalenderPage(params);
+            Set<Integer> organIdList = dataList.stream().map(e -> e.getOrganId()).collect(Collectors.toSet());
+            Map<Integer, String> organNameMap = getMap("organization", "id_", "name_", organIdList, queryInfo.getTenantId(), Integer.class, String.class);
+            List<Integer> operatorIds = dataList.stream().map(e -> e.getOperator()).collect(Collectors.toList());
+            operatorIds.removeAll(Collections.singleton(null));
+            Map<Integer, String> realNameMap = getMap("sys_user", "id_", "real_name_", operatorIds, queryInfo.getTenantId(), Integer.class, String.class);
+            dataList.forEach(e -> {
+                e.setOrganName(organNameMap.get(e.getOrganId()));
+                e.setOperatorName(realNameMap.get(e.getOperator()));
+            });
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public String merge1(MusicGroupPaymentBaseCalender musicGroupPaymentBaseCalender) {
-		del(musicGroupPaymentBaseCalender.getCalenderId());
-		return create1(musicGroupPaymentBaseCalender);
+        del(musicGroupPaymentBaseCalender.getCalenderId());
+        return create1(musicGroupPaymentBaseCalender);
     }
 
     @Override
     public MusicGroupPaymentCalender getMusicGroupRegCalender(String musicGroupId) {
-		return musicGroupPaymentCalenderDao.getMusicGroupRegCalender(musicGroupId);
+        return musicGroupPaymentCalenderDao.getMusicGroupRegCalender(musicGroupId);
     }
 
-    private BigDecimal getActualAmount(MusicGroupPaymentCalenderBase baseCalender){
-		if(baseCalender != null){
-			return baseCalender.getActualAmount();
-		}
-		return BigDecimal.ZERO;
-	}
-
-	@Override
-	public BigDecimal getRepairAmount(Long calenderId) {
-		return getActualAmount(musicGroupPaymentCalenderRepairService.findByCalenderId(calenderId));
-	}
-
-	@Override
-	public BigDecimal getMemberAmount(Long calenderId) {
-		return getActualAmount(musicGroupPaymentCalenderMemberService.findByCalenderId(calenderId));
-	}
-
-	@Override
-	public BigDecimal getActivityAmount(List<Long> buyCalenderActivityIdList) {
-		List<MusicGroupPaymentCalenderActivity> activityList = musicGroupPaymentCalenderActivityService.findByIds(buyCalenderActivityIdList);
-		return activityList.stream().map(e->e.getActualAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
-	}
+    private BigDecimal getActualAmount(MusicGroupPaymentCalenderBase baseCalender) {
+        if (baseCalender != null) {
+            return baseCalender.getActualAmount();
+        }
+        return BigDecimal.ZERO;
+    }
+
+    @Override
+    public BigDecimal getRepairAmount(Long calenderId) {
+        return getActualAmount(musicGroupPaymentCalenderRepairService.findByCalenderId(calenderId));
+    }
+
+    @Override
+    public BigDecimal getMemberAmount(Long calenderId) {
+        return getActualAmount(musicGroupPaymentCalenderMemberService.findByCalenderId(calenderId));
+    }
+
+    @Override
+    public BigDecimal getActivityAmount(List<Long> buyCalenderActivityIdList) {
+        List<MusicGroupPaymentCalenderActivity> activityList = musicGroupPaymentCalenderActivityService.findByIds(buyCalenderActivityIdList);
+        return activityList.stream().map(e -> e.getActualAmount()).reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
 
     @Override
     public MusicGroupPaymentCalender getApplyCalenderByMusicId(String musicGroupId) {
-		return musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(musicGroupId);
+        return musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(musicGroupId);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public boolean autoUpdateMusicGroupPaymentCalenderStatus() {
+        Date date = new Date();
+        List<PaymentCalenderStatusEnum> statusList = new ArrayList<>();
+        statusList.add(PaymentCalenderStatusEnum.NO);
+        statusList.add(PaymentCalenderStatusEnum.OPEN);
+        List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.queryByPaymentStatus(null, statusList, PayUserType.STUDENT.getCode());
+
+        List<MusicGroupPaymentCalender> updateMusicGroupPaymentCalenderList = new ArrayList<MusicGroupPaymentCalender>();
+        for (MusicGroupPaymentCalender mgpc : musicGroupPaymentCalenderList) {
+            if (mgpc.getDeadlinePaymentDate() != null && date.after(mgpc.getDeadlinePaymentDate()) && mgpc.getStatus() == PaymentCalenderStatusEnum.OPEN) {
+                // “进行中”更新至“已结束”
+                mgpc.setUpdateTime(date);
+                mgpc.setStatus(PaymentCalenderStatusEnum.OVER);
+                //将0元未缴费学员缴费状态更新为已缴费
+                this.updateNoPaymentAndZeroPaymentStatus(mgpc, false);
+                updateMusicGroupPaymentCalenderList.add(mgpc);
+                //如果是进行中加学员,将报名表状态改为NORMAL
+                if (mgpc.getPaymentType() == MusicGroupPaymentCalender.PaymentType.ADD_STUDENT) {
+                    studentRegistrationDao.updatePaymentStatusByClaenderId(mgpc.getId());
+                }
+            } else if (mgpc.getStartPaymentDate() != null && date.after(mgpc.getStartPaymentDate()) && mgpc.getStatus() == PaymentCalenderStatusEnum.NO) {
+                MusicGroup musicGroup = musicGroupDao.get(mgpc.getMusicGroupId());
+                if (musicGroup == null) {
+                    continue;
+                }
+                //如果乐团还在审核中
+                if (musicGroup.getStatus() == MusicGroupStatusEnum.DRAFT || musicGroup.getStatus() == MusicGroupStatusEnum.AUDIT || musicGroup.getStatus() == MusicGroupStatusEnum.AUDIT_FAILED || musicGroup.getStatus() == MusicGroupStatusEnum.CLOSE) {
+                    continue;
+                }
+                // “未开始”更新至“进行中”
+                mgpc.setUpdateTime(date);
+                mgpc.setStatus(PaymentCalenderStatusEnum.OPEN);
+                //将0元未缴费学员缴费状态更新为已缴费
+                this.updateNoPaymentAndZeroPaymentStatus(mgpc, false);
+                updateMusicGroupPaymentCalenderList.add(mgpc);
+                if (mgpc.getPayUserType() == STUDENT) {
+                    //推送待续费通知
+                    pushWaitRenewMessage(mgpc.getId(), musicGroup, null);
+                }
+            }
+        }
+        if (updateMusicGroupPaymentCalenderList.size() > 0) {
+            musicGroupPaymentCalenderDao.batchUpdate(updateMusicGroupPaymentCalenderList);
+        }
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchInsert(List<MusicGroupPaymentCalender> musicGroupPaymentCalenders) {
+        if (musicGroupPaymentCalenders != null && musicGroupPaymentCalenders.size() > 0) {
+            musicGroupPaymentCalenderDao.delByGroupId(musicGroupPaymentCalenders.get(0).getMusicGroupId());
+            musicGroupPaymentCalenders.forEach(e -> {
+                musicGroupPaymentCalenderDao.insert(e);
+            });
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void del(Long id) {
+        if (id == null) {
+            throw new BizException("参数校验失败");
+        }
+        MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.getForLock(id);
+        if (calender == null) {
+            throw new BizException("缴费信息不存在");
+        }
+
+        //缴费项目中没有学生即可删除缴费项目
+        List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList = musicGroupPaymentCalenderDetailDao.queryByCalenderId(id, null);
+        if (musicGroupPaymentCalenderDetailList != null && musicGroupPaymentCalenderDetailList.size() > 0) {
+            throw new BizException("操作失败:缴费项目中已存在学员");
+        }
+        MusicGroupStudentClassAdjust byBatchNo = musicGroupStudentClassAdjustDao.findByBatchNo(calender.getBatchNo());
+        if (byBatchNo != null) {
+            throw new BizException("操作失败:班级调整的缴费项目不支持");
+        }
+
+        if (calender.getPaymentType() == PaymentType.MUSIC_APPLY) {
+            // 是否存在缴费中的
+            List<StudentPaymentOrder> studentPaymentOrderList = studentPaymentOrderDao.queryByDealStatus(calender.getMusicGroupId(), OrderTypeEnum.APPLY,
+                    DealStatusEnum.ING);
+            if (studentPaymentOrderList != null && studentPaymentOrderList.size() > 0) {
+                throw new BizException("操作失败:存在缴费中的学生");
+            }
+        }
+
+        musicGroupPaymentCalenderDao.delete(id);
+        musicGroupPaymentCalenderDetailDao.deleteByCalenderId(id);
+        musicGroupPaymentStudentCourseDetailDao.deleteByMusicGroupPaymentCalenderId(id);
+        musicGroupPaymentCalenderActivityService.delByCalenderId(id);
+        musicGroupPaymentCalenderMemberService.deleteByCalenderId(id);
+        musicGroupPaymentCalenderRepairService.deleteByCalenderId(id);
+        List<Long> calenderIds = new ArrayList<Long>();
+        calenderIds.add(id);
+        musicGroupPaymentCalenderCourseSettingsService.deleteByMusicGroupPaymentCalenderId(calenderIds);
+
+        //如果乐团是“费用审核”,则需要修改状态
+        MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
+        if (musicGroup != null) {
+            if (musicGroup.getStatus() == MusicGroupStatusEnum.FEE_AUDIT) {
+                musicGroup.setStatus(MusicGroupStatusEnum.PRE_BUILD_FEE);
+                musicGroup.setUpdateTime(new Date());
+                musicGroupDao.update(musicGroup);
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean deleteByBatchNo(String batchNo) {
+        if (StringUtils.isBlank(batchNo)) {
+            throw new BizException("参数错误");
+        }
+        List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+        for (MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenderList) {
+            del(musicGroupPaymentCalender.getId());
+        }
+        return true;
     }
 
     @Override
-	@Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
-	public boolean autoUpdateMusicGroupPaymentCalenderStatus() {
-		Date date = new Date();
-		List<PaymentCalenderStatusEnum> statusList = new ArrayList<>();
-		statusList.add(PaymentCalenderStatusEnum.NO);
-		statusList.add(PaymentCalenderStatusEnum.OPEN);
-		List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.queryByPaymentStatus(null, statusList,PayUserType.STUDENT.getCode());
-
-		List<MusicGroupPaymentCalender> updateMusicGroupPaymentCalenderList = new ArrayList<MusicGroupPaymentCalender>();
-		for (MusicGroupPaymentCalender mgpc : musicGroupPaymentCalenderList) {
-			if (mgpc.getDeadlinePaymentDate() != null && date.after(mgpc.getDeadlinePaymentDate()) && mgpc.getStatus() == PaymentCalenderStatusEnum.OPEN) {
-				// “进行中”更新至“已结束”
-				mgpc.setUpdateTime(date);
-				mgpc.setStatus(PaymentCalenderStatusEnum.OVER);
-				//将0元未缴费学员缴费状态更新为已缴费
-				this.updateNoPaymentAndZeroPaymentStatus(mgpc,false);
-				updateMusicGroupPaymentCalenderList.add(mgpc);
-				//如果是进行中加学员,将报名表状态改为NORMAL
-				if(mgpc.getPaymentType() == MusicGroupPaymentCalender.PaymentType.ADD_STUDENT){
-					studentRegistrationDao.updatePaymentStatusByClaenderId(mgpc.getId());
-				}
-			} else if (mgpc.getStartPaymentDate() != null && date.after(mgpc.getStartPaymentDate()) && mgpc.getStatus() == PaymentCalenderStatusEnum.NO) {
-				MusicGroup musicGroup = musicGroupDao.get(mgpc.getMusicGroupId());
-				if(musicGroup == null){
-					continue;
-				}
-				//如果乐团还在审核中
-				if(musicGroup.getStatus() == MusicGroupStatusEnum.DRAFT || musicGroup.getStatus() == MusicGroupStatusEnum.AUDIT|| musicGroup.getStatus() == MusicGroupStatusEnum.AUDIT_FAILED || musicGroup.getStatus() == MusicGroupStatusEnum.CLOSE){
-					continue;
-				}
-				// “未开始”更新至“进行中”
-				mgpc.setUpdateTime(date);
-				mgpc.setStatus(PaymentCalenderStatusEnum.OPEN);
-				//将0元未缴费学员缴费状态更新为已缴费
-				this.updateNoPaymentAndZeroPaymentStatus(mgpc,false);
-				updateMusicGroupPaymentCalenderList.add(mgpc);
-				if(mgpc.getPayUserType() == STUDENT){
-					//推送待续费通知
-					pushWaitRenewMessage(mgpc.getId(),musicGroup,null);
-				}
-			}
-		}
-		if (updateMusicGroupPaymentCalenderList.size() > 0) {
-			musicGroupPaymentCalenderDao.batchUpdate(updateMusicGroupPaymentCalenderList);
-		}
-		return true;
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void batchInsert(List<MusicGroupPaymentCalender> musicGroupPaymentCalenders) {
-		if (musicGroupPaymentCalenders != null && musicGroupPaymentCalenders.size() > 0) {
-			musicGroupPaymentCalenderDao.delByGroupId(musicGroupPaymentCalenders.get(0).getMusicGroupId());
-			musicGroupPaymentCalenders.forEach(e -> {
-				musicGroupPaymentCalenderDao.insert(e);
-			});
-		}
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void del(Long id) {
-		if (id == null) {
-			throw new BizException("参数校验失败");
-		}
-		MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.getForLock(id);
-		if (calender == null) {
-			throw new BizException("缴费信息不存在");
-		}
-
-		//缴费项目中没有学生即可删除缴费项目
-		List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList = musicGroupPaymentCalenderDetailDao.queryByCalenderId(id, null);
-		if (musicGroupPaymentCalenderDetailList != null && musicGroupPaymentCalenderDetailList.size() > 0) {
-			throw new BizException("操作失败:缴费项目中已存在学员");
-		}
-		MusicGroupStudentClassAdjust byBatchNo = musicGroupStudentClassAdjustDao.findByBatchNo(calender.getBatchNo());
-		if(byBatchNo != null){
-			throw new BizException("操作失败:班级调整的缴费项目不支持");
-		}
-
-		if (calender.getPaymentType() == PaymentType.MUSIC_APPLY) {
-			// 是否存在缴费中的
-			List<StudentPaymentOrder> studentPaymentOrderList = studentPaymentOrderDao.queryByDealStatus(calender.getMusicGroupId(), OrderTypeEnum.APPLY,
-					DealStatusEnum.ING);
-			if (studentPaymentOrderList != null && studentPaymentOrderList.size() > 0) {
-				throw new BizException("操作失败:存在缴费中的学生");
-			}
-		}
-		
-		musicGroupPaymentCalenderDao.delete(id);
-		musicGroupPaymentCalenderDetailDao.deleteByCalenderId(id);
-		musicGroupPaymentStudentCourseDetailDao.deleteByMusicGroupPaymentCalenderId(id);
-		musicGroupPaymentCalenderActivityService.delByCalenderId(id);
-		musicGroupPaymentCalenderMemberService.deleteByCalenderId(id);
-		musicGroupPaymentCalenderRepairService.deleteByCalenderId(id);
-		List<Long> calenderIds = new ArrayList<Long>();
-		calenderIds.add(id);
-		musicGroupPaymentCalenderCourseSettingsService.deleteByMusicGroupPaymentCalenderId(calenderIds);
-		
-		//如果乐团是“费用审核”,则需要修改状态
-		MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
-		if(musicGroup != null){
-			if(musicGroup.getStatus() == MusicGroupStatusEnum.FEE_AUDIT){
-				musicGroup.setStatus(MusicGroupStatusEnum.PRE_BUILD_FEE);
-				musicGroup.setUpdateTime(new Date());
-				musicGroupDao.update(musicGroup);
-			}
-		}
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public boolean deleteByBatchNo(String batchNo) {
-		if(StringUtils.isBlank(batchNo)){
-			throw new BizException("参数错误");
-		}
-		List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
-		for(MusicGroupPaymentCalender musicGroupPaymentCalender : musicGroupPaymentCalenderList){
-			del(musicGroupPaymentCalender.getId());
-		}
-		return true;
-	}
-
-	@Override
-	public MusicGroupPaymentCalender findByMusicGroupRegCalender(String musicGroupId) {
-		return musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(musicGroupId);
-	}
-
-	@Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
-	public MusicGroupStudentFee updateCalender(Long calenderDetailId,Integer userId){
-		Date date = new Date();
-		MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.get(calenderDetailId);
-		MusicGroupPaymentCalender calender = this.get(calenderDetail.getMusicGroupPaymentCalenderId());
-		MusicGroupStudentFee musicGroupStudentFee = musicGroupStudentFeeDao.findByUser(userId, calender.getMusicGroupId());
+    public MusicGroupPaymentCalender findByMusicGroupRegCalender(String musicGroupId) {
+        return musicGroupPaymentCalenderDao.findByMusicGroupRegCalender(musicGroupId);
+    }
+
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public MusicGroupStudentFee updateCalender(Long calenderDetailId, Integer userId) {
+        Date date = new Date();
+        MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.get(calenderDetailId);
+        MusicGroupPaymentCalender calender = this.get(calenderDetail.getMusicGroupPaymentCalenderId());
+        MusicGroupStudentFee musicGroupStudentFee = musicGroupStudentFeeDao.findByUser(userId, calender.getMusicGroupId());
 //		if(calender.getIsGiveMusicNetwork() && musicGroupStudentFee != null){
 //			//赠送网管课
 //			musicGroupStudentFee.setRemainNetworkClassTimes(musicGroupStudentFee.getRemainNetworkClassTimes() + 1);
 //		}
-		//更新学生的缴费记录状态
-		calenderDetail.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED);
+        //更新学生的缴费记录状态
+        calenderDetail.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED);
 //		calenderDetail.setActualAmount(calenderDetail.getExpectAmount().add(calenderDetail.getExpectMemberAmount()));
-		calenderDetail.setPayTime(date);
-		calenderDetail.setUpdateTime(date);
-		musicGroupPaymentCalenderDetailDao.update(calenderDetail);
-
-		//更新实际缴费人数
-		Integer actualNum = calender.getActualNum() == null ? 0 : calender.getActualNum();
-		calender.setActualNum(actualNum + 1);
-		calender.setUpdateTime(date);
-		musicGroupPaymentCalenderDao.update(calender);
-		return musicGroupStudentFee;
-	}
+        calenderDetail.setPayTime(date);
+        calenderDetail.setUpdateTime(date);
+        musicGroupPaymentCalenderDetailDao.update(calenderDetail);
+
+        //更新实际缴费人数
+        Integer actualNum = calender.getActualNum() == null ? 0 : calender.getActualNum();
+        calender.setActualNum(actualNum + 1);
+        calender.setUpdateTime(date);
+        musicGroupPaymentCalenderDao.update(calender);
+        return musicGroupStudentFee;
+    }
 
 }

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

@@ -687,6 +687,16 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     }
 
     private MusicGroupApplyGoodsDto getCalenderTotalAmount(RegisterPayDto registerPayDto, MusicGroupPaymentCalender calender) {
+    	
+    	String musicGroupId = calender.getMusicGroupId();
+    	MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+    	
+    	if(musicGroup == null){
+    		throw new BizException("乐团[{}]信息查询失败", musicGroupId);
+    	}
+    	
+    	boolean isGiveAccessories = musicGroup.getIsGiveAccessories();
+    	
         MusicGroupApplyGoodsDto goodsDto = new MusicGroupApplyGoodsDto();
         //乐器及打包辅件价格
         List<MusicGroupSubjectGoodsGroup> goodsGroups;
@@ -697,6 +707,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
                 Map<String, BigDecimal> groupType = JSONObject.parseObject(goodsGroup.getKitGroupPurchaseTypeJson(), new TypeReference<Map<String, BigDecimal>>() {
                 });
+                
+                if(isGiveAccessories && registerPayDto.getBuyCloudTeacher()){
+                	if (goodsGroup.getType().equals(GoodsType.ACCESSORIES)) {
+                		continue;
+                	}
+                }
 
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT)) {
                     String kitGroupPurchaseType = registerPayDto.getGoodsGroups().get(goodsGroup.getId());

+ 16 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PlatformServeServiceImpl.java

@@ -93,7 +93,7 @@ public class PlatformServeServiceImpl extends ServiceImpl<PlatformServeDao, Plat
 
         TenantProductInfo productInfo = tenantProductInfoService.getOne(new QueryWrapper<TenantProductInfo>()
                 .eq("serve_id_", id));
-        if(Objects.nonNull(productInfo)){
+        if (Objects.nonNull(productInfo)) {
             throw new BizException("该服务已关联机构无法删除!");
         }
 
@@ -116,11 +116,21 @@ public class PlatformServeServiceImpl extends ServiceImpl<PlatformServeDao, Plat
     public PageInfo<PlatformServePageVo> queryPage(String search, Integer page, Integer rows) {
         Page<PlatformServePageVo> pageInfo = PageUtil.getPage(page, rows);
         pageInfo.setAsc("a.id_");
-        IPage<PlatformServePageVo> pageData = baseMapper.queryPage(pageInfo, search);
+        IPage<PlatformServePageVo> pageData = baseMapper.queryPage(pageInfo, search,null);
         return PageUtil.pageInfo(pageData);
     }
 
     /**
+     * 根据服务id查询关联的产品名称(名称用逗号分割)
+     *
+     * @param id
+     */
+    @Override
+    public PlatformServePageVo queryProductNameById(Integer id) {
+        return baseMapper.queryPage(null, id);
+    }
+
+    /**
      * 查询单个服务的详情
      *
      * @param id 服务id
@@ -141,7 +151,10 @@ public class PlatformServeServiceImpl extends ServiceImpl<PlatformServeDao, Plat
     }
 
     private PlatformServeServiceInfo getServeInfo(PlatformServeDto obj) {
-        List<PlatformServeDetail> detailList = getDetailList(obj);
+        List<PlatformServeDetail> detailList = Optional.ofNullable(obj)
+                .filter(o -> CollectionUtils.isNotEmpty(obj.getDetailList()))
+                .map(PlatformServeDto::getDetailList)
+                .orElseThrow(() -> new BizException("请填入服务详情"));
 
         Integer userId = Optional.ofNullable(sysUserFeignService.queryUserInfo())
                 .map(SysUser::getId)
@@ -189,13 +202,6 @@ public class PlatformServeServiceImpl extends ServiceImpl<PlatformServeDao, Plat
         }
     }
 
-    private List<PlatformServeDetail> getDetailList(PlatformServeDto obj) {
-        return Optional.ofNullable(obj)
-                .filter(o -> CollectionUtils.isNotEmpty(obj.getDetailList()))
-                .map(PlatformServeDto::getDetailList)
-                .orElseThrow(() -> new BizException("请填入服务详情"));
-    }
-
     private void addDetail(List<PlatformServeDetail> detailList, Integer id) {
         detailList.forEach(detail -> {
             detail.setServeId(id);

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

@@ -2794,7 +2794,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             return BaseController.succeed(payMap);
         } catch (Exception e) {
             LOGGER.error("网管课购买失败:", e.getCause());
-            throw new BizException("订单提交超时,请尝试重新提交购买");
+            throw new BizException("网管课购买失败:", e.getMessage());
         }
     }
 
@@ -3261,7 +3261,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             return BaseController.succeed(payMap);
         } catch (Exception e) {
             LOGGER.error("网管课购买失败:", e.getCause());
-            throw new BizException("订单提交超时,请尝试重新提交购买");
+            throw new BizException("网管课购买失败:", e.getMessage());
         }
     }
 

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

@@ -7,12 +7,14 @@ import com.ym.mec.biz.dal.entity.SysArea;
 import com.ym.mec.biz.dal.page.OrganizationQueryInfo;
 import com.ym.mec.biz.service.SysAreaService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Optional;
 
 @Service
 public class SysAreaServiceImpl extends BaseServiceImpl<Integer, SysArea> implements SysAreaService {
@@ -44,7 +46,13 @@ public class SysAreaServiceImpl extends BaseServiceImpl<Integer, SysArea> implem
 		return sysAreaDao.getParentArea(id);
 	}
 
-	private SysArea getTree(SysArea area){
+    @Override
+    public SysArea queryByCode(String code) {
+        Optional.ofNullable(code).orElseThrow(() -> new BizException("区域code不能为空"));
+        return sysAreaDao.queryByCode(code);
+    }
+
+    private SysArea getTree(SysArea area){
 		//得到根节点对象
 		//获取子节点list
 		List<SysArea> sysAreas = sysAreaDao.findRootList(area.getId(), area.getDelFlag());

+ 85 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantApplyCallRecordServiceImpl.java

@@ -0,0 +1,85 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.TenantApplyCallRecordDao;
+import com.ym.mec.biz.dal.entity.TenantApply;
+import com.ym.mec.biz.dal.entity.TenantApplyCallRecord;
+import com.ym.mec.biz.service.TenantApplyCallRecordService;
+import com.ym.mec.biz.service.TenantApplyService;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.PageUtil;
+import com.ym.mec.common.page.WrapperUtil;
+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 java.util.Map;
+import java.util.Optional;
+
+/**
+ * 机构申请记录(TenantApplyCallRecord)表服务实现类
+ *
+ * @author hgw
+ * @since 2022-02-09 10:44:26
+ */
+@Service("tenantApplyCallRecordService")
+public class TenantApplyCallRecordServiceImpl extends ServiceImpl<TenantApplyCallRecordDao, TenantApplyCallRecord> implements TenantApplyCallRecordService {
+
+    private final static Logger log = LoggerFactory.getLogger(TenantApplyCallRecordServiceImpl.class);
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private TenantApplyService tenantApplyService;
+
+    @Override
+    public PageInfo<TenantApplyCallRecord> queryPage(Map<String, Object> param) {
+        int pageSize = PageUtil.getPage(param, "rows").orElse(50);
+        int pageIndex = PageUtil.getPage(param, "page").orElse(1);
+        Page<TenantApplyCallRecord> pageInfo = new Page<>(pageIndex, pageSize);
+        pageInfo.setDesc("create_time_");
+        IPage<TenantApplyCallRecord> page = this.page(pageInfo,
+                new WrapperUtil<TenantApplyCallRecord>()
+                        .hasEq("tenant_apply_id_", param.get("applyId"))
+                        .hasGe("create_time_", param.get("startTime"))
+                        .hasLe("create_time_", param.get("endTime"))
+                        .queryWrapper());
+        return PageUtil.pageInfo(page);
+    }
+
+    @Override
+    public int insert(TenantApplyCallRecord obj) {
+        Optional<TenantApplyCallRecord> optional = Optional.ofNullable(obj);
+        optional.orElseThrow(() -> new BizException("参数异常!"));
+        optional.map(TenantApplyCallRecord::getTenantApplyId)
+                .orElseThrow(() -> new BizException("参数异常"));
+        optional.map(TenantApplyCallRecord::getCallBackLog)
+                .filter(a -> StringUtils.isNotBlank(a) && a.length() <= 140)
+                .orElseThrow(() -> new BizException("请填写小于140字的沟通记录!"));
+        obj.setCallBackPeople(getUser().getRealName());
+        //修改申请表数据
+        TenantApply tenantApply = new TenantApply();
+        tenantApply.setId(Long.parseLong(obj.getTenantApplyId().toString()));
+        tenantApply.setCallBackPeople(getUser().getRealName());
+        tenantApply.setCallBackTime(obj.getCreateTime());
+        tenantApplyService.update(tenantApply);
+
+        return baseMapper.insert(obj);
+    }
+
+    private SysUser getUser() {
+        //修改机构基础信息
+        return Optional.ofNullable(sysUserFeignService.queryUserInfo())
+                .orElseThrow(() -> new BizException("用户信息获取失败,请刷新页面或者重新登录!"));
+    }
+
+
+}
+

+ 2 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantAssetsInfoServiceImpl.java

@@ -75,7 +75,7 @@ public class TenantAssetsInfoServiceImpl extends ServiceImpl<TenantAssetsInfoDao
             //获取总人数 (算上老师
             String totalPeople = getTotalPeople(record.getType(), record.getCourseId());
             //获取云教室规则  String人数-BigDecimal每分钟扣费标准
-            Map<String, BigDecimal> rule = getRule(record.getTenantId());
+            Map<String, BigDecimal> rule = tenantConfigService.getRule(record.getTenantId());
             if (Objects.isNull(rule)) {
                 throw new BizException("未查询到该机构的课程收费标准!");
             }
@@ -124,7 +124,7 @@ public class TenantAssetsInfoServiceImpl extends ServiceImpl<TenantAssetsInfoDao
             //获取总人数 ,+1算上老师
             String totalPeople = getTotalPeople(course.getType().getCode(), course.getId().intValue());
             //获取云教室规则  String人数-BigDecimal每分钟扣费标准
-            Map<String, BigDecimal> rule = getRule(course.getTenantId());
+            Map<String, BigDecimal> rule = tenantConfigService.getRule(course.getTenantId());
             if (Objects.isNull(rule)) {
                 //没有这个扣费标准,写未扣费流水记录
                 insertRecord(course, BigDecimal.ZERO, 3);
@@ -273,20 +273,6 @@ public class TenantAssetsInfoServiceImpl extends ServiceImpl<TenantAssetsInfoDao
         return result;
     }
 
-    private Map<String, BigDecimal> getRule(Integer tenantId) {
-        //查询云教室扣费标准
-        TenantConfig tenantConfig = tenantConfigService.getOne(new WrapperUtil<TenantConfig>()
-                .hasEq("tenant_id_", tenantId).queryWrapper());
-        if (Objects.isNull(tenantConfig)) {
-            return null;
-        }
-        return Optional.ofNullable(tenantConfig.getConfig())
-                .map(c -> JSON.parseObject(c, TenantConfigDetail.class))
-                .map(TenantConfigDetail::getCloud_room_rule)
-                .map(CloudRoomRule::getCloud_room_config)
-                .orElse(null);
-    }
-
     private BigDecimal getCourseDate(Date date, Date startTime, Date endTime) {
         String dateStr = DateUtils.formatDate(date, DateUtils.YYYY_MM_DD_DEF);
         int durationMinute = 0;

+ 38 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantConfigServiceImpl.java

@@ -1,24 +1,27 @@
 package com.ym.mec.biz.service.impl;
 
-import java.util.Date;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.function.Consumer;
-
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.TenantConfigDao;
 import com.ym.mec.biz.dal.dto.TenantConfigDto;
 import com.ym.mec.biz.dal.entity.TenantConfig;
+import com.ym.mec.biz.dal.entity.TenantConfigDetail;
 import com.ym.mec.biz.service.TenantConfigService;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.WrapperUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.function.Consumer;
 
 /**
  * @author hgw
@@ -50,12 +53,32 @@ public class TenantConfigServiceImpl extends ServiceImpl<TenantConfigDao, Tenant
     }
 
     @Override
-	public TenantConfig queryByTenantId(Integer tenantId) {
-		return getOne(new WrapperUtil<TenantConfig>().hasEq("tenant_id_", tenantId)
-				.queryWrapper());
-	}
+    public TenantConfig queryByTenantId(Integer tenantId) {
+        return getOne(new WrapperUtil<TenantConfig>().hasEq("tenant_id_", tenantId)
+                .queryWrapper());
+    }
+
+    @Override
+    public Map<String, BigDecimal> getRule(Integer tenantId) {
+        //查询云教室扣费标准
+        TenantConfig tenantConfig = this.getOne(new WrapperUtil<TenantConfig>()
+                .hasEq("tenant_id_", tenantId).queryWrapper());
+        if (Objects.isNull(tenantConfig)) {
+            return null;
+        }
+        return getCloudRoomRule(tenantConfig.getConfig());
+    }
+
+    @Override
+    public Map<String, BigDecimal> getCloudRoomRule(String config) {
+        return Optional.ofNullable(config)
+                .map(c -> JSON.parseObject(c, TenantConfigDetail.class))
+                .map(TenantConfigDetail::getCloud_room_rule)
+                .map(TenantConfigDetail.CloudRoomRule::getCloud_room_config)
+                .orElse(null);
+    }
 
-	private void setUserId(Integer id, Consumer<Integer> setOption) {
+    private void setUserId(Integer id, Consumer<Integer> setOption) {
         if (Objects.isNull(id)) {
             Integer userId = Optional.ofNullable(sysUserFeignService.queryUserInfo())
                     .map(SysUser::getId)

+ 83 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantContractRecordServiceImpl.java

@@ -0,0 +1,83 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.TenantContractRecordDao;
+import com.ym.mec.biz.dal.entity.TenantContractRecord;
+import com.ym.mec.biz.dal.entity.TenantContractRecord.TenantContractRecordEnum;
+import com.ym.mec.biz.service.TenantContractRecordService;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.PageUtil;
+import com.ym.mec.common.page.WrapperUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * 机构协议记录表(TenantContractRecord)表服务实现类
+ *
+ * @author hgw
+ * @since 2022-02-12 16:16:41
+ */
+@Service("tenantContractRecordService")
+public class TenantContractRecordServiceImpl extends ServiceImpl<TenantContractRecordDao, TenantContractRecord> implements TenantContractRecordService {
+
+    private final static Logger log = LoggerFactory.getLogger(TenantContractRecordServiceImpl.class);
+
+    /**
+     * 写入协议记录
+     *
+     * @param tenantId     机构id
+     * @param contractPath 文件地址
+     * @param en           文件类型
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int insertContractRecord(Integer tenantId, String contractPath, TenantContractRecordEnum en) {
+        if(en.equals(TenantContractRecordEnum.OPEN)){
+            //一个机构只能创建一个开通协议
+            TenantContractRecord open = this.getOne(new QueryWrapper<>(new TenantContractRecord())
+                    .eq("tenant_id_", tenantId)
+                    .eq("type_", TenantContractRecordEnum.OPEN.getType()));
+            if (Objects.nonNull(open)) {
+                return 1;
+            }
+        }
+
+        Date now = new Date();
+        TenantContractRecord record = new TenantContractRecord();
+        record.setContractName(en.getMsg());
+        record.setType(en.getType());
+        record.setTenantId(tenantId);
+        record.setUrl(contractPath);
+        record.setBizDate(now);
+        record.setCreateTime(now);
+        return baseMapper.insert(record);
+    }
+
+    /**
+     * 分页查询
+     *
+     * @param param 条件
+     */
+    @Override
+    public PageInfo<TenantContractRecord> queryPage(Map<String, Object> param) {
+        Page<TenantContractRecord> pageInfo = PageUtil.getPageInfo(param);
+        //分页查询
+        IPage<TenantContractRecord> page = this.page(pageInfo,
+                new WrapperUtil<TenantContractRecord>()
+                        .hasEq("type_", param.get("type"))
+                        .hasEq("tenant_id_", param.get("tenantId"))
+                        .queryWrapper());
+        return PageUtil.pageInfo(page);
+    }
+
+}
+

+ 142 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantContractTemplateServiceImpl.java

@@ -0,0 +1,142 @@
+package com.ym.mec.biz.service.impl;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.ym.mec.biz.dal.dao.TenantContractTemplateDao;
+import com.ym.mec.biz.dal.dao.TenantInfoDao;
+import com.ym.mec.biz.dal.dto.TenantContractTemplateDto;
+import com.ym.mec.biz.dal.entity.TenantContractTemplate;
+import com.ym.mec.biz.service.TenantContractTemplateService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
+
+@Service
+public class TenantContractTemplateServiceImpl extends BaseServiceImpl<Integer, TenantContractTemplate>  implements TenantContractTemplateService {
+	
+	@Autowired
+	private TenantContractTemplateDao tenantContractTemplateDao;
+	
+	@Autowired
+	private TenantInfoDao tenantInfoDao;
+
+	@Override
+	public BaseDAO<Integer, TenantContractTemplate> getDAO() {
+		return tenantContractTemplateDao;
+	}
+
+	@Override
+	public PageInfo<TenantContractTemplateDto> queryPageList(QueryInfo queryInfo) {
+		PageInfo<TenantContractTemplateDto> pageInfo = new PageInfo<TenantContractTemplateDto>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+		
+		List<TenantContractTemplateDto> dataList = null;
+		int count = this.findCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = tenantContractTemplateDao.queryPageList(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<TenantContractTemplateDto>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+	@Override
+	@Transactional
+	public boolean enableContract(Integer id, Integer userId) {
+		TenantContractTemplate tenantContractTemplate = tenantContractTemplateDao.get(id);
+		
+		if(tenantContractTemplate == null){
+			throw new BizException("未查询到协议模板");
+		}
+		
+		if(tenantContractTemplate.getStatus()){
+			return true;
+		}
+		
+		tenantInfoDao.getLocked(tenantContractTemplate.getTenantId());
+		
+		Integer maxVersion = tenantContractTemplateDao.queryMaxVersion();
+		int version = maxVersion == null ? 1 : maxVersion + 1;
+		
+		tenantContractTemplate.setVersion(version);
+		
+		tenantContractTemplateDao.disableContract(tenantContractTemplate.getOwner(), tenantContractTemplate.getType(), tenantContractTemplate.getTenantId());
+		
+		Date date = new Date();
+		
+		tenantContractTemplate.setStatus(true);
+		tenantContractTemplate.setUpdateTime(date);
+		tenantContractTemplate.setModifyBy(userId);
+		
+		tenantContractTemplateDao.update(tenantContractTemplate);
+		
+		return true;
+	}
+
+	@Override
+	public boolean updateContractVersion() {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public TenantContractTemplate queryLatestContractTemplate(Integer tenantId, String owner, String type) {
+		TenantContractTemplate tenantContractTemplate = tenantContractTemplateDao.queryLatestContractTemplate(owner, type, tenantId);
+		
+		return tenantContractTemplate;
+	}
+
+	@Override
+	@Transactional
+	public boolean createContractTemplate(TenantContractTemplate tenantContractTemplate) {
+		
+		Integer tenantId = tenantContractTemplate.getTenantId();
+		tenantInfoDao.getLocked(tenantId);
+		
+		Integer maxVersion = tenantContractTemplateDao.queryMaxVersion();
+		int version = maxVersion == null ? 1 : maxVersion + 1;
+		
+		tenantContractTemplate.setVersion(version);
+		Date date = new Date();
+		tenantContractTemplate.setCreateTime(date);
+		tenantContractTemplate.setUpdateTime(date);
+		insert(tenantContractTemplate);
+		
+		return true;
+	}
+
+	@Override
+	@Transactional
+	public boolean updateContractTempalte(TenantContractTemplate tenantContractTemplate) {
+		
+		Integer tenantId = tenantContractTemplate.getTenantId();
+		tenantInfoDao.getLocked(tenantId);
+		
+		Integer maxVersion = tenantContractTemplateDao.queryMaxVersion();
+		int version = maxVersion == null ? 1 : maxVersion + 1;
+		
+		tenantContractTemplate.setVersion(version);
+		Date date = new Date();
+		tenantContractTemplate.setUpdateTime(date);
+		
+		update(tenantContractTemplate);
+		return true;
+	}
+	
+}

+ 349 - 95
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java

@@ -1,40 +1,5 @@
 package com.ym.mec.biz.service.impl;
 
-import static com.ym.mec.biz.dal.enums.MessageTypeEnum.EMAIL_TENANT_EXPIRATION_REMINDERS;
-import static com.ym.mec.biz.dal.enums.MessageTypeEnum.EMAIL_TENANT_RENEWAL_SUCCESSFUL;
-import static com.ym.mec.biz.dal.enums.MessageTypeEnum.SMS_TENANT_EXPIRATION_REMINDERS;
-import static com.ym.mec.biz.dal.enums.MessageTypeEnum.SMS_TENANT_RENEWAL_SUCCESSFUL;
-
-import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.joda.time.LocalDate;
-import org.joda.time.LocalDateTime;
-import org.redisson.api.RBucket;
-import org.redisson.api.RedissonClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.dao.DuplicateKeyException;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -44,43 +9,17 @@ import com.ym.mec.auth.api.entity.SysRole;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.enums.SysUserType;
 import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.TenantContractTemplateDao;
 import com.ym.mec.biz.dal.dao.TenantInfoDao;
 import com.ym.mec.biz.dal.dto.TenantConfigDto;
 import com.ym.mec.biz.dal.dto.TenantInfoDto;
 import com.ym.mec.biz.dal.dto.TenantProductInfoDto;
-import com.ym.mec.biz.dal.entity.Employee;
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.entity.PlatformServe;
-import com.ym.mec.biz.dal.entity.PlatformServeDetail;
-import com.ym.mec.biz.dal.entity.SysConfig;
-import com.ym.mec.biz.dal.entity.SysUserTsign;
-import com.ym.mec.biz.dal.entity.TenantAssetsInfo;
-import com.ym.mec.biz.dal.entity.TenantConfig;
-import com.ym.mec.biz.dal.entity.TenantInfo;
-import com.ym.mec.biz.dal.entity.TenantOrderRecord;
-import com.ym.mec.biz.dal.entity.TenantProductInfo;
-import com.ym.mec.biz.dal.entity.TenantProductSumm;
-import com.ym.mec.biz.dal.enums.GradeTypeEnum;
-import com.ym.mec.biz.dal.enums.JobNatureEnum;
-import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
-import com.ym.mec.biz.dal.enums.TenantOrderRecordEnum;
-import com.ym.mec.biz.dal.enums.YesOrNoEnum;
-import com.ym.mec.biz.dal.vo.TenantInfoInfoPageVo;
-import com.ym.mec.biz.service.ContractService;
-import com.ym.mec.biz.service.EmployeeService;
-import com.ym.mec.biz.service.PayService;
-import com.ym.mec.biz.service.PlatformProductService;
-import com.ym.mec.biz.service.PlatformServeDetailService;
-import com.ym.mec.biz.service.PlatformServeService;
-import com.ym.mec.biz.service.StudentService;
-import com.ym.mec.biz.service.SysConfigService;
-import com.ym.mec.biz.service.SysMessageService;
-import com.ym.mec.biz.service.SysUserTsignService;
-import com.ym.mec.biz.service.TenantAssetsInfoService;
-import com.ym.mec.biz.service.TenantConfigService;
-import com.ym.mec.biz.service.TenantInfoService;
-import com.ym.mec.biz.service.TenantOrderRecordService;
-import com.ym.mec.biz.service.TenantProductInfoService;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.entity.TenantContractRecord.TenantContractRecordEnum;
+import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.vo.PlatformServePageVo;
+import com.ym.mec.biz.dal.vo.TenantInfoPageVo;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
@@ -88,17 +27,51 @@ import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
+import com.ym.mec.thirdparty.storage.StoragePluginContext;
+import com.ym.mec.thirdparty.storage.provider.KS3StoragePlugin;
 import com.ym.mec.thirdparty.yqpay.DateUtils;
 import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.freemarker.FreemarkerTemplateEngine;
+import com.ym.mec.util.pdf.PDFUtil;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.LocalDate;
+import org.joda.time.LocalDateTime;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.nio.charset.Charset;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static com.ym.mec.biz.dal.enums.MessageTypeEnum.*;
 
 @Service
 public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo> implements TenantInfoService {
     private static final Logger log = LoggerFactory.getLogger(TenantInfoServiceImpl.class);
 
-    public TenantInfoDao baseMapper() {
-        return baseMapper;
-    }
-
     @Autowired
     private SysUserFeignService sysUserFeignService;
     @Autowired
@@ -136,6 +109,29 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
     @Autowired
     @Lazy
     private ContractService contractService;
+    @Autowired
+    private SysAreaService sysAreaService;
+    @Autowired
+    private StoragePluginContext storagePluginContext;
+    @Autowired
+    private TenantPreJoinService tenantPreJoinService;
+    @Autowired
+    private TenantContractRecordService tenantContractRecordService;
+    @Autowired
+    private TenantContractTemplateDao tenantContractTemplateDao;
+
+    @Value("${contract.baseDir:/var/pdf}")
+    private String contractBaseDir;
+    //乐小雅协议名称
+    public static final String lexiaoyaContract = "lexiaoyaContract";
+    //云教室每分钟价格
+    public static final String cloudAmount = "${cloudAmount}";
+    //云教室人数
+    public static final String cloudCount = "${cloudCount}";
+    //协议中云教室价格动态的样式 默认一个人的价格
+    public static final String defSpan = "<td style='text-align: center;'>" + cloudAmount + "/分钟/1V" + cloudCount + "</td>";
+    //超过1人的则需要这样的样式
+    public static final String rowspan = "<tr>" + defSpan + "</tr>";
 
     /**
      * 新增机构
@@ -168,15 +164,24 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         setIdByApply(tenantId, dto.getProductInfo(), dto.getProductInfo()::setTenantId,
                 tenantProductInfoService::addTenantProduct);
         //新建机构是0元时,直接默认支付成功
-        if (dto.getProductInfo().getPayAmount().compareTo(BigDecimal.ZERO) == 0) {
-            //修机构相关的改付款时间
-            tenantOpen(tenantId);
-            String orderNo = idGenerator.generatorId("payment") + "";
-            //写入付款记录
-            createOrderRecord(tenantId, BigDecimal.ZERO, orderNo, TenantOrderRecordEnum.TENANT_OPEN, 1, null);
-        }
+        //2022年2月10日 根据需求进行变更,0元要走缴费流程,因为缴费之前要弹协议给客户看
+//        if (dto.getProductInfo().getPayAmount().compareTo(BigDecimal.ZERO) == 0) {
+//            //修机构相关的改付款时间
+//            tenantOpen(tenantId);
+//            String orderNo = idGenerator.generatorId("payment") + "";
+//            //写入付款记录
+//            createOrderRecord(tenantId, BigDecimal.ZERO, orderNo, TenantOrderRecordEnum.TENANT_OPEN, 1, null);
+//        }
         //添加机构配置
         setIdByApply(tenantId, dto.getConfig(), dto.getConfig()::setTenantId, tenantConfigService::addConfig);
+        //查询机构入驻表如果公司全称和联系电话相同则把入驻表修改为已入驻
+        TenantPreJoin preJoin = tenantPreJoinService.getOne(new QueryWrapper<TenantPreJoin>()
+                .eq("tsign_code_", dto.getTsignCode())
+                .eq("state_", 0));
+        if (Objects.nonNull(preJoin)) {
+            preJoin.setState(1);
+            tenantPreJoinService.updateById(preJoin);
+        }
         //释放
         bucket.delete();
     }
@@ -193,6 +198,28 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
                 .map(this::getById)
                 .orElseThrow(() -> new BizException("未找到该机构信息,机构信息不能为空!"));
 
+        Integer tenantId = tenantInfo.getId();
+
+        //是否修改了机构名称或机构编码
+        if (!StringUtils.equals(dto.getTsignName(), tenantInfo.getTsignName()) || !StringUtils.equals(dto.getTsignCode(), tenantInfo.getTsignCode())) {
+            //升级机构协议版本号
+            TenantContractTemplate tenantContractTemplate = tenantContractTemplateDao.queryLatestContractTemplate(null, null, tenantId);
+            if (tenantContractTemplate != null) {
+                baseMapper.getLocked(tenantId);
+
+                Integer maxVersion = tenantContractTemplateDao.queryMaxVersion();
+                int version = maxVersion == null ? 1 : maxVersion + 1;
+
+                tenantContractTemplate.setVersion(version);
+                Date date = new Date();
+                tenantContractTemplate.setUpdateTime(date);
+
+                tenantContractTemplateDao.update(tenantContractTemplate);
+            }
+            //添加签章信息
+            contractService.addTsign(tenantInfo.getUserId(), dto.getTsignCode(), dto.getTsignName(), tenantId);
+        }
+
         //机构状态 1已缴费,并且 机构注册的手机号与本次修改后的手机号不同,就证明本次修改了手机号 则需要修改机构的账号信息
         if (1 == tenantInfo.getPayState() && !Objects.equals(tenantInfo.getPhone(), dto.getPhone())) {
             //校验修改后的手机号是否是唯一
@@ -400,6 +427,8 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         Date expiryDate = getExpiryDate(productInfo.getExpiryCount(), productInfo.getExpiryUnit(), now);
         productInfo.setExpiryDate(expiryDate);
         tenantProductInfoService.updateById(productInfo);
+        //关联精彩活动等数据
+        baseMapper.openInitNewsInformation(tenantId, orgId.toString());
         //释放锁
         bucket.delete();
 
@@ -484,8 +513,8 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
      * @return
      */
     @Override
-    public PageInfo<TenantInfoInfoPageVo> queryPage(Map<String, Object> param) {
-        Page<TenantInfoInfoPageVo> pageInfo = PageUtil.getPageInfo(param);
+    public PageInfo<TenantInfoPageVo> queryPage(Map<String, Object> param) {
+        Page<TenantInfoPageVo> pageInfo = PageUtil.getPageInfo(param);
         pageInfo.setAsc("a.id_");
         return PageUtil.pageInfo(baseMapper.queryPage(pageInfo, param));
     }
@@ -496,6 +525,194 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
     }
 
     /**
+     * 预览协议
+     *
+     * @param tenantId 机构id
+     * @param en       协议类型 开通还是续费
+     * @param val      续费的时间长度
+     */
+    @Override
+    public String getContract(Integer tenantId, TenantContractRecordEnum en, Integer val) {
+        List<TenantInfoPageVo> tenantInfoList = baseMapper.queryPage(new HashMap<String, Object>() {{
+            put("tenantId", tenantId);
+        }});
+        //查询协议中的信息
+        TenantInfoPageVo tenantInfo = Optional.ofNullable(tenantInfoList)
+                .filter(CollectionUtils::isNotEmpty)
+                .map(a -> a.get(0))
+                .orElseThrow(() -> new BizException("未查询到机构信息"));
+        Date now = new Date();
+        Date startDate = now;
+        Date expiryDate;
+        //如果本次协议是开通服务则直接取开通时的价格并在现在的时间计算到期时间
+        if (TenantContractRecordEnum.OPEN.equals(en)) {
+            val = tenantInfo.getExpiryCount();
+            tenantInfo.setContractPrice(tenantInfo.getOpenPrice());
+            expiryDate = getExpiryDate(val, tenantInfo.getExpiryUnit(), now);
+        } else {
+            //修改续费时间
+            if (tenantInfo.getExpireDate().compareTo(now) > 0) {
+                //在上一个到期时间节点上做增加时间的操作
+                expiryDate = getExpiryDate(val, tenantInfo.getExpiryUnit(), tenantInfo.getExpireDate());
+                //协议开始时间为上一个到期时间节点+1天
+                startDate = DateUtils.addDays(tenantInfo.getExpireDate(), 1);
+            } else {
+                //如果上一个时间已经到期则 取现在时间
+                expiryDate = getExpiryDate(val, tenantInfo.getExpiryUnit(), now);
+            }
+            //续费时 取合同价
+            BigDecimal contractAmount = tenantInfo.getContractPrice().multiply(new BigDecimal(val), new MathContext(1, RoundingMode.HALF_UP));
+            tenantInfo.setContractPrice(contractAmount);
+            tenantInfo.setExpiryCount(val);
+        }
+        //获取协议变量参数
+        Map<String, Object> param = getContractParam(tenantInfo);
+        //设置协议服务开始的时间和到期时间
+        Function<Date, String> getStrDate = (date) -> DateUtils.formatDate(date, "yyyy年MM月dd日");
+        //协议中服务开始时间
+        param.put("startDate", getStrDate.apply(startDate));
+        //协议中服务过期时间
+        param.put("expireDate", getStrDate.apply(expiryDate));
+        //当前时间
+        param.put("nowDate", getStrDate.apply(now));
+        //生成模版
+        FreemarkerTemplateEngine templateEngine = FreemarkerTemplateEngine.getInstance();
+        templateEngine.setClassForTemplateLoading(TenantInfoServiceImpl.class, "/config/contracts/");
+        //文件地址验证
+        String srcPath = contractBaseDir + "/" + lexiaoyaContract + "/" + tenantId + "-" + tenantInfo.getServeName() + DateUtils.formatDate(new Date(), "yyyyMMddHHmmss") + ".html";
+        File srcFile = new File(srcPath);
+        if (!srcFile.getParentFile().exists()) {
+            srcFile.getParentFile().mkdirs();
+        }
+        //读取模版并替换模版内容
+        templateEngine.render(param, lexiaoyaContract + ".ftl", srcPath);
+        try {
+            return FileUtils.readFileToString(srcFile, Charset.defaultCharset());
+        } catch (IOException e) {
+            log.error("读取产品协议出错", e.getCause());
+            throw new BizException("读取产品协议出错");
+        } finally {
+            //删除文件
+            FileUtils.deleteQuietly(srcFile);
+        }
+    }
+
+    /**
+     * 获取协议变量参数
+     */
+    private Map<String, Object> getContractParam(TenantInfoPageVo tenantInfo) {
+        Date now = new Date();
+        //将数据转换为Map
+        Map<String, Object> param = WrapperUtil.toMap(tenantInfo);
+        //购买服务的时长单位
+        param.put("expiryUnit", TenantProductInfo.MONTH.equals(tenantInfo.getExpiryUnit()) ? "个月" : "年");
+        //乙方公章
+        param.put("officialSealB", "https://daya.ks3-cn-beijing.ksyun.com/202202/Sx6rzWm.png");
+        //获取产品名称
+        opsContractData(tenantInfo.getServeId(), platformServeService::queryProductNameById,
+                "未查询到产品信息!",
+                param::put, "productName", PlatformServePageVo::getProductName);
+        //获取城市
+        SysArea city = opsContractData(tenantInfo.getAreaId(), sysAreaService::get,
+                "未查询到城市信息!",
+                param::put, "city", SysArea::getName);
+        //获取省份
+        opsContractData(city.getId(), sysAreaService::getParentArea,
+                "未查询到省份信息!",
+                param::put, "province", SysArea::getName);
+        //查询机构配置信息
+        TenantConfig tenantConfig = opsContractData(tenantInfo.getId(), tenantConfigService::queryByTenantId,
+                "未查询到机构配置信息!",
+                param::put, "chargeRate", TenantConfig::getChargeRate);
+        //甲方企业公章
+        param.put("officialSealA", tenantConfig.getCorporateChops());
+        //获取云教室规则  String人数 BigDecimal每分钟扣费标准
+        Map<String, BigDecimal> rule = opsContractData(tenantConfig.getConfig(), tenantConfigService::getCloudRoomRule,
+                "未查询到云教室的价格配置!",
+                param::put, "rowspan", Map::size);
+
+        AtomicReference<String> rowspanData = new AtomicReference<>("");
+        //生成云教室扣费的样式
+        rule.forEach((k, v) -> {
+            //人数
+            int count = Integer.parseInt(k) - 1;
+            if (count == 1) {
+                param.put("defRowspanData", replaceTemplate(defSpan, count, v));
+            } else {
+                rowspanData.set(rowspanData.get() + replaceTemplate(rowspan, count, v));
+            }
+        });
+        param.put("rowspanData", rowspanData.get());
+        return param;
+    }
+
+    private static <O, T, S> T opsContractData(O param, Function<O, T> fun, String msg,
+                                               BiConsumer<String, Object> putC, String key, Function<T, S> val) {
+        Optional<T> optional = Optional.ofNullable(fun.apply(param));
+        optional.orElseThrow(() -> new BizException(msg));
+        optional.ifPresent(a -> {
+            S apply = val.apply(a);
+            if (apply instanceof BigDecimal) {
+                putC.accept(key, ((BigDecimal) apply).setScale(2, RoundingMode.HALF_UP).toString());
+            } else {
+                putC.accept(key, apply);
+            }
+        });
+        return optional.get();
+    }
+
+    private String replaceTemplate(String tem, Integer count, BigDecimal v) {
+        return tem.replace(cloudCount, count + "")
+                .replace(cloudAmount, v.toString());
+    }
+
+    /**
+     * 生成PDF协议上传到服务器并返回协议地址
+     *
+     * @param tenantId 机构id
+     * @param en       协议类型 开通还是续费
+     * @param val      续费的时间长度-续费才有值
+     * @return 协议地址
+     */
+    private String getContractAndUpLoad(Integer tenantId, TenantContractRecordEnum en, Integer val) {
+        String key = "getContractAndUpLoad:" + tenantId + ":" + en.getMsg();
+        log.info("getContractAndUpLoad >>>>key:{}", key);
+        RBucket<Object> bucket = redissonClient.getBucket(key);
+        if (!bucket.trySet(tenantId, 15L, TimeUnit.SECONDS)) {
+            return null;
+        }
+        log.info("getContractAndUpLoad >>>>ok  tenantId:{} en:{} val:{}", tenantId, en, val);
+        Date now = new Date();
+        //创建PDF本次缓存地址
+        String srcPdfPath = contractBaseDir + lexiaoyaContract + DateUtils.formatDate(now, "yyyyMMddHHmmss") + "/" + tenantId + "_" + java.time.LocalDateTime.now().getSecond() + ".pdf";
+        //生成文件
+        File srcFile = new File(srcPdfPath);
+        if (!srcFile.getParentFile().exists()) {
+            srcFile.getParentFile().mkdirs();
+        }
+        //获取协议内容
+        String contractHtml = getContract(tenantId, en, val);
+        // 生成PDF格式协议
+        try {
+            PDFUtil.renderToPDFByData(TenantInfoServiceImpl.class.getResource("/").getFile(), contractHtml, srcPdfPath, "simsun.ttc");
+        } catch (IOException e) {
+            FileUtils.deleteQuietly(srcFile);
+            throw new BizException("生成产品协议失败");
+        }
+        //上传到云服务器后获取上传地址
+        String dateStrOss = DateUtils.formatDate(now, "yyyy/MM/dd");
+        dateStrOss = "oa/" + dateStrOss + "/" + DateUtil.getHour(now);
+        String pdfFilePath = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, dateStrOss, srcFile);
+        //删除本次PDF生成的文件缓存
+        FileUtils.deleteQuietly(srcFile);
+        //删除缓存
+        if (en.equals(TenantContractRecordEnum.RENEW)) {
+            redissonClient.getBucket(key).delete();
+        }
+        return pdfFilePath;
+    }
+
+    /**
      * 机构开通缴费
      */
     public Map<String, Object> tenantOpenPay(Integer tenantId) throws Exception {
@@ -525,7 +742,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         } else {
             //已支付
             orderState = 1;
-            tenantOpen(tenantId);
+            tenantOpenSuccess(tenantId);
             Map<String, Object> payMap = new HashMap<>();
             payMap.put("orderNo", orderNo);
             result.put("payMap", payMap);
@@ -543,13 +760,15 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
      * @param tenantId 机构id
      * @param val      购买周期
      */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public Map<String, Object> tenantRenewPay(Integer tenantId, Integer val) throws Exception {
 
         TenantOrderRecordEnum tenantEnum = TenantOrderRecordEnum.TENANT_RENEW;
         Map<String, Object> result = new HashMap<>();
         TenantProductInfo productInfo = getProductInfo(tenantId);
         //续费时 取合同价
-        BigDecimal amount = productInfo.getContractPrice().multiply(new BigDecimal(val));
+        BigDecimal amount = productInfo.getContractPrice().multiply(new BigDecimal(val), new MathContext(1, RoundingMode.HALF_UP));
         //生成订单编号
         String orderNo = idGenerator.generatorId("payment") + "";
         int orderState = 0;
@@ -611,13 +830,23 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         productInfo.setExpiryDate(expiryDate);
         productInfo.setPayAmount(productInfo.getPayAmount().add(amount));
         productInfo.setExpiryCount(productInfo.getExpiryCount() + val);
-        tenantProductInfoService.updateById(productInfo);
 
+        //生成协议并上传得到地址
+        TenantContractRecordEnum renew = TenantContractRecordEnum.RENEW;
+        String contractPath = getContractAndUpLoad(tenantId, renew, val);
+        if (StringUtils.isBlank(contractPath)) {
+            return;
+        }
+        //写入协议记录
+        tenantContractRecordService.insertContractRecord(tenantId, contractPath, renew);
+        //更新产品信息
+        tenantProductInfoService.updateById(productInfo);
+        //发送邮件短信
         Map<String, Object> par = new HashMap<>();
         par.put("tenantId", tenantId);
-        List<TenantInfoInfoPageVo> tenantInfos = baseMapper.queryPage(par);
+        List<TenantInfoPageVo> tenantInfos = baseMapper.queryPage(par);
         if (CollectionUtils.isNotEmpty(tenantInfos)) {
-            TenantInfoInfoPageVo tenantInfo = tenantInfos.get(0);
+            TenantInfoPageVo tenantInfo = tenantInfos.get(0);
             //邮件
             if (StringUtils.isNotBlank(tenantInfo.getEmail())) {
                 //机构名称 服务名称 学员上限 有效期
@@ -762,17 +991,42 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         }
     }
 
-    //修机构相关的改付款时间
-    private void tenantOpen(Integer tenantId) {
+
+    /**
+     * 机构开通需修机构相关的改付款时间和状态
+     *
+     * @param tenantId 机构id
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void tenantOpenSuccess(Integer tenantId) {
+        //修改机构状态
         TenantInfo tenantInfo = new TenantInfo();
         tenantInfo.setId(tenantId);
         tenantInfo.setPayState(1);
         baseMapper.updateById(tenantInfo);
 
+        Date now = new Date();
+        //修改机构正在使用的产品的付款时间
         TenantProductInfo productInfo = new TenantProductInfo();
-        productInfo.setPayDate(new Date());
+        productInfo.setPayDate(now);
         productInfo.setTenantId(tenantId);
-        tenantProductInfoService.updateById(productInfo);
+        tenantProductInfoService.updateByTenantId(productInfo);
+        //一个机构只能创建一个开通协议
+        TenantContractRecord openRecord = tenantContractRecordService.getOne(new QueryWrapper<>(new TenantContractRecord())
+                .eq("tenant_id_", tenantId)
+                .eq("type_", TenantContractRecordEnum.OPEN.getType()));
+        if (Objects.nonNull(openRecord)) {
+            return;
+        }
+        //生成协议并上传得到地址
+        TenantContractRecordEnum open = TenantContractRecordEnum.OPEN;
+        String contractPath = getContractAndUpLoad(tenantId, open, null);
+        if (StringUtils.isBlank(contractPath)) {
+            return;
+        }
+        //写入协议记录
+        tenantContractRecordService.insertContractRecord(tenantId, contractPath, open);
     }
 
     @Override
@@ -901,7 +1155,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         Map<String, Object> par = new HashMap<>();
         par.put("expiryDate", maturity);
         par.put("state", 1);
-        List<TenantInfoInfoPageVo> maturityTenant = baseMapper.queryPage(par);
+        List<TenantInfoPageVo> maturityTenant = baseMapper.queryPage(par);
         maturityTenant.forEach(t -> {
             TenantInfo tenantInfo = baseMapper.selectById(t.getId());
             tenantInfo.setState(2);
@@ -918,11 +1172,12 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         Map<String, Object> par = new HashMap<>();
         par.put("state", 1);
         par.put("expiryDate", expiryDate);
-        List<TenantInfoInfoPageVo> oneTenant = baseMapper.queryPage(par);
-        send(oneTenant, DateUtils.formatDate(expiryDate, "yyyy年MM月dd日"), i);
+        List<TenantInfoPageVo> tenantList = baseMapper.queryPage(par);
+        expiringSend(tenantList, DateUtils.formatDate(expiryDate, "yyyy年MM月dd日"), i);
     }
 
-    private void send(List<TenantInfoInfoPageVo> infoList, String dateStr, int i) {
+    //向即将到期的机构发送信息
+    private void expiringSend(List<TenantInfoPageVo> infoList, String dateStr, int i) {
         infoList.forEach(t -> {
             //邮件
             if (StringUtils.isNotBlank(t.getEmail())) {
@@ -948,7 +1203,6 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
                         sendPar2, null, 0, null,
                         "SYSTEM", phoneMsg);
             }
-
         });
     }
 

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

@@ -182,18 +182,7 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
 
     //开通成功
     private void open(TenantOrderRecord record) {
-        //机构产品信息
-        TenantProductInfo productInfo = tenantProductInfoService.getOne(new WrapperUtil<TenantProductInfo>()
-                .hasEq("tenant_id_", record.getTenantId()).queryWrapper().eq("using_", 0));
-        //修改机构信息
-        TenantInfo tenantInfo = new TenantInfo();
-        tenantInfo.setId(record.getTenantId());
-        tenantInfo.setPayState(1);
-        tenantInfoService.updateById(tenantInfo);
-        //修改机构产品信息
-        productInfo.setPayDate(new Date());
-        productInfo.setTenantId(record.getTenantId());
-        tenantProductInfoService.updateById(productInfo);
+        tenantInfoService.tenantOpenSuccess(record.getTenantId());
     }
 
     //续费成功

+ 106 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantPreJoinServiceImpl.java

@@ -0,0 +1,106 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.TenantPreJoinDao;
+import com.ym.mec.biz.dal.dto.TenantPreJoinDto;
+import com.ym.mec.biz.dal.entity.SysArea;
+import com.ym.mec.biz.dal.entity.SysUserTsign;
+import com.ym.mec.biz.dal.entity.TenantPreJoin;
+import com.ym.mec.biz.service.SysUserTsignService;
+import com.ym.mec.biz.service.TenantPreJoinService;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.PageUtil;
+import com.ym.mec.common.page.WrapperUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+/**
+ * 机构入驻表(预加入)(TenantPreJoin)表服务实现类
+ *
+ * @author hgw
+ * @since 2022-02-09 14:38:28
+ */
+@Service("tenantPreJoinService")
+public class TenantPreJoinServiceImpl extends ServiceImpl<TenantPreJoinDao, TenantPreJoin> implements TenantPreJoinService {
+
+    private final static Logger log = LoggerFactory.getLogger(TenantPreJoinServiceImpl.class);
+
+    @Autowired
+    private SysAreaServiceImpl sysAreaService;
+    @Autowired
+    private SysUserTsignService sysUserTsignService;
+
+    /**
+     * 分页查询
+     *
+     * @param param 条件
+     */
+    @Override
+    public PageInfo<TenantPreJoin> queryPage(Map<String, Object> param) {
+        Page<TenantPreJoin> pageInfo = PageUtil.getPageInfo(param);
+        //模糊搜索的字段
+        Object search = param.get("search");
+        //分页查询
+        IPage<TenantPreJoin> page = this.page(pageInfo,
+                new WrapperUtil<TenantPreJoin>()
+                        .hasEq("state_", param.get("state"))
+                        .hasGe("created_time_", param.get("startTime"))
+                        .hasLe("created_time_", param.get("endTime"))
+                        .queryWrapper()
+                        .and(Objects.nonNull(search),
+                                o -> o.eq("tsign_name_", search)
+                                        .or().eq("enterprise_liable_name_", search)
+                                        .or().eq("contacts_", search)
+                        ));
+        return PageUtil.pageInfo(page);
+    }
+
+    @Override
+    public int insert(TenantPreJoinDto dto) {
+        //校验营业信息
+        SysUserTsign sysUserTsign = sysUserTsignService.queryByCardNo(dto.getTsignCode());
+        if (Objects.nonNull(sysUserTsign)) {
+            throw new BizException("营业执照编号已被注册!");
+        }
+        TenantPreJoin obj = new TenantPreJoin();
+        BeanUtils.copyProperties(dto, obj);
+        //根据code获取市级数据
+        opsAreaData(dto.getAreaCode(), sysAreaService::queryByCode,
+                () -> new BizException("未查询到区域编号为 [" + dto.getAreaCode() + "]的数据!"),
+                obj::setAreaId, obj::setAreaName);
+
+        //根据市级数据获取省级数据
+        opsAreaData(obj.getAreaId(), sysAreaService::getParentArea,
+                () -> new BizException("未查询到区域id为 [" + obj.getAreaId() + "]的数据!"),
+                obj::setProvinceId, obj::setProvinceName);
+        obj.setState(0);
+        obj.setCreatedTime(new Date());
+        return baseMapper.insert(obj);
+    }
+
+    private <O> void opsAreaData(O param, Function<O, SysArea> fun, Supplier<BizException> supplier,
+                                 Consumer<Integer> setId, Consumer<String> setName) {
+        Optional<SysArea> optional = Optional.ofNullable(fun.apply(param));
+        optional.orElseThrow(supplier);
+        optional.ifPresent(a -> {
+            setId.accept(a.getId());
+            setName.accept(a.getName());
+        });
+    }
+
+}
+

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

@@ -46,6 +46,14 @@ public class TenantProductInfoServiceImpl extends ServiceImpl<TenantProductInfoD
         baseMapper.updateById(info);
     }
 
+    /**
+     * 根据机构id修改正在使用的机构产品信息
+     */
+    @Override
+    public void updateByTenantId(TenantProductInfo obj) {
+        baseMapper.updateByTenantId(obj);
+    }
+
     private void checkServe(Integer id, Integer detailId) {
         Optional.ofNullable(id)
                 .map(platformServeService::getById)

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

@@ -1838,7 +1838,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         PageInfo pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<String, Object>();
         MapUtil.populateMap(params, queryInfo);
-
         List dataList = null;
         int count = vipGroupDao.countVipGorups(params);
         if (count > 0) {
@@ -4527,6 +4526,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                     sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getExpectAmount());
                     SysUserCashAccount sysUserCashAccount = sysUserCashAccountService.get(studentPaymentOrder.getUserId());
                     SysUserCashAccountDetail sysUserIncomeCashAccountDetail = new SysUserCashAccountDetail();
+                    sysUserIncomeCashAccountDetail.setTenantId(studentPaymentOrder.getTenantId());
                     sysUserIncomeCashAccountDetail.setUserId(studentPaymentOrder.getUserId());
                     sysUserIncomeCashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
                     sysUserIncomeCashAccountDetail.setStatus(DealStatusEnum.SUCCESS);

+ 140 - 0
mec-biz/src/main/resources/config/contracts/latest_contract_template.ftl

@@ -0,0 +1,140 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
+    <meta http-equiv="Pragma" content="no-cache" />
+    <meta http-equiv="Cache-Control" content="no-cache" />
+    <meta http-equiv="Expires" content="0" />
+    <title>产品与服务协议</title>
+    <style>
+        body { margin: 0; }
+        header {
+            height: 40px;
+            line-height: .40px;
+            color: #000;
+            font-size: 17px;
+            background: #fff;
+            box-shadow: 0px 1px 8px 0px rgba(0, 0, 0, 0.07);
+            text-align: center;
+        }
+        header .back {
+            width: 20px;
+            height: 20px;
+            position: absolute;
+            left: 12px;
+            top: 10px;
+        }
+        .container {
+            padding: 22px 20px 3px;
+            font-size: 14px;
+        }
+        h1 {
+            font-size: 18px;
+            text-align: center;
+            margin-bottom: 8px;
+        }
+        h2 {
+            font-size: 16px;
+            font-weight: bold;
+            padding-top: 15px;
+        }
+        h3 {
+            font-size: 14px;
+            font-weight: bold;
+        }
+        .signature {
+            padding-top: 50px;
+        }
+        .signature .sign {
+            position: relative;
+            width: 49%;
+            display: inline-block;
+        }
+        .signature span {
+            display: block;
+        }
+        .signature .cachet {
+            position: absolute;
+            top: -60px;
+            left: 0;
+            width: 150px;
+            height: 150px;
+        }
+        .iInfo {
+            display: flex;
+        }
+        .iInfo span {
+            flex: 1;
+        }
+        .iInfoContent, .iInfoContent span {
+            display: block;
+        }
+
+        .underline {
+            text-decoration: underline;
+        }
+        .bold {
+            font-weight: bold;
+        }
+    </style>
+</head>
+<body style="font-family:'SimSun'">
+    <div class="container">
+        <h1>《产品与服务协议》</h1>
+                            甲方:${companyName} <br/>
+
+        <div style="display: flex;">乙方:
+            <div style="flex: 1 auto;">
+                <div class="iInfo">
+                    <span>家长姓名:${studentInfo.realName!}</span>
+                    <span>电话:${studentInfo.phone!}</span>
+                </div>
+                <#if studentInfo.certificateType == 'IDENTITY'>
+                    <div class="iInfo">
+                        <span>身份证号:${studentInfo.idCardNo!}</span>
+                    </div>
+                </#if>
+                <div class="iInfo">
+                    <span>学生姓名:${studentInfo.username!}</span>
+                </div>
+                <#if studentInfo.grade?default("")?trim?length gt 1>
+                <div class="iInfo">
+                    <span>所在班级:${studentInfo.grade!} ${studentInfo.clazz!}</span>
+                </div>
+                </#if>
+                <#if studentInfo.subject.name?default("")?trim?length gt 1>
+                <div class="iInfo">
+                    <span>所在声部:${studentInfo.subject.name!}</span>
+                </div>
+                </#if>
+            </div>
+        </div>
+        <div>(本协议中“乙方“指学员及家长;”乙方学员“指购买甲方产品或服务的学员;”乙方家长“仅指乙方学员的法定监护人。)</div>
+
+        <p class="underline bold">重要须知:在注册或购买使用甲方提供的产品、服务之前,请您务必审慎阅读、充分理解本使用协议各条款内容, 特别是免除或者限制甲方责任的条款、对您权利进行限制的条款、约定争议解决方式和司法管辖的条款等。 限制、免责条款或者其他涉及您重大权益的条款可能以加粗、加下划线等形式提示您重点注意。您注册或购买使用甲方提供的产品和服务,均视为您同意本使用协议,以及同意接受本使用协议的约束。</p>
+        <p class="underline bold">如无特别说明 ,下列术语在本协议中的定义为:管乐迷平台(下称“本平台”),即管乐迷APP;(下称“本平台”)指由甲方提供的器乐教学全流程辅助系统,包括媒体资料,教师点评,课前、课中、课后管理等服务;乐器练习云教练 (下称“本系统”),指由甲方提供和维护的器乐辅助练习系统;具体以该系统实际提供为准。该系统将根据实际需要进行调整和增减,乙方使用平台时需遵守本服务协议。</p>
+
+		${contractMainContent!}
+        
+        <div class="signature">
+        	<#if isShowVisualSeal>
+            <div class="sign">甲方签章:${companyName}<img class="cachet" src="${sealPicture!}" alt="" />
+                <span>日期:${.now?string("yyyy年MM月dd日")}</span>
+            </div>
+            <div class="sign">乙方签章:${studentInfo.realName!}
+                <span>日期:${.now?string("yyyy年MM月dd日")} </span>
+            </div>
+        	<#else>
+            <div class="sign">甲方签章:${companyName}
+                <span>日期:${.now?string("yyyy年MM月dd日")}</span>
+            </div>
+            <div class="sign">乙方签章:
+                <span>日期:${.now?string("yyyy年MM月dd日")} </span>
+            </div>
+        	</#if>
+        </div>
+    </div>
+</body>
+</html>

+ 419 - 0
mec-biz/src/main/resources/config/contracts/lexiaoyaContract.ftl

@@ -0,0 +1,419 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"/>
+    <meta http-equiv="Pragma" content="no-cache"/>
+    <meta http-equiv="Cache-Control" content="no-cache"/>
+    <meta http-equiv="Expires" content="0"/>
+    <title>管乐迷产品服务协议</title>
+    <style>
+        body {
+            margin: 0;
+        }
+
+        header {
+            height: 40px;
+            line-height: .40px;
+            color: #000;
+            font-size: 17px;
+            background: #fff;
+            box-shadow: 0px 1px 8px 0px rgba(0, 0, 0, 0.07);
+            text-align: center;
+        }
+
+        header .back {
+            width: 20px;
+            height: 20px;
+            position: absolute;
+            left: 12px;
+            top: 10px;
+        }
+
+        .container {
+            padding: 22px 20px 3px;
+            font-size: 14px;
+        }
+
+        h1 {
+            font-size: 16px;
+            text-align: center;
+        }
+
+        h2 {
+            font-size: 16px;
+            font-weight: bold;
+            padding-top: 15px;
+        }
+
+        h3 {
+            font-size: 14px;
+            font-weight: bold;
+        }
+
+        .sign {
+            position: relative;
+            /* width: 49%; */
+            /* display: inline-block; */
+        }
+
+        .cachet {
+            position: absolute;
+            top: -60px;
+            left: 50%;
+            width: 140px;
+            height: 140px;
+            margin-left: -90px;
+        }
+
+        .iInfo {
+            display: flex;
+        }
+
+        .iInfo span {
+            flex: 1;
+        }
+
+        .iInfoContent, .iInfoContent span {
+            display: block;
+        }
+
+        .thStyle {
+            background: #cdcdcd;
+        }
+    </style>
+</head>
+<body style="font-family:'SimSun'">
+<div class="container">
+    <h1>管乐迷产品服务协议</h1>
+    <table border="1" style="width: 100%; border-collapse: collapse;">
+        <tr>
+            <th class="thStyle" style="text-align: left;" colspan="2">甲方信息:</th>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">名称:</td>
+            <td style="text-align: center;">${tsignName}</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">通讯地址:</td>
+            <td style="text-align: center;">${address}</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">电子邮箱:</td>
+            <td style="text-align: center;">${email}</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">联系人:</td>
+            <td style="text-align: center;">${contacts}</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">联系电话:</td>
+            <td style="text-align: center;">${phone}</td>
+        </tr>
+        <!--  -->
+        <tr>
+            <th class="thStyle" style="text-align: left;" colspan="2">乙方信息:</th>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">名称:</td>
+            <td style="text-align: center;">武汉乐小雅网络科技有限公司</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">通讯地址:</td>
+            <td style="text-align: center;">武昌区水果湖街中北路与东沙大道交汇处武汉中央文化区K1地块一期一区K1-2栋16层7室-18</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">电子邮箱:</td>
+            <td style="text-align: center;">lexiaoyaVIP@163.com</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">联系人:</td>
+            <td style="text-align: center;">潘彤彤</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">联系电话:</td>
+            <td style="text-align: center;">13296657052</td>
+        </tr>
+
+    </table>
+    武汉乐小雅网络科技有限公司(以下称为“乙方”)系专业的乐团运营管理综合服务提供方。甲、乙双方本着互惠互利、共同发展的原则,在平等、公平、自愿、诚信的基础上,经友好协商,就甲方向已方提供乐团运营管理综合服务相关事宜达成一致,同意按照下述协议条款及相关附件执行:
+
+
+    <h2>第一条 产品与服务项</h2>
+    在授权区域 ${province} ${city} (区/县)范围内,乙方向甲方提供基于提高乐团管理效率、提升乐团训练水平、增强乐团运营能力为目的的管乐迷系列产品,具体包括:<br/>
+    (1)“团控宝”,即乐团管理工具。提供即时通讯基础能力和云端服务;同时针对甲方使用场景,通过Saas平台提供乐团运营管理系统解决方案;<br/>
+    (2)“团易宝”,即乐团收费工具。提供可配置的收费模式,覆盖报名、续费、加课、零星收费、特殊课程收费等全场景,实时监控收款进度,同时可根据需要出具营收报表;<br/>
+    (3)“团运宝”,即乐团经营工具。提供基于乐团服务与运营管理规则的实时监控后台,同时可根据需要出具多维度经营报表;<br/>
+    (4)“团练宝”,即乐团训练工具。根据乐团训练所需的声部、合奏、独奏、考级等曲目,借助先进的互联网技术,帮助机构定制专属品牌的AI智能乐团练习系统。建立直观、可视的乐团训练标准,同时能够实现课后练习布置、回传、点评一键操作,深度解决学生在家不会练习、家长无法辅导的痛点,从而全面提升乐团训练质量。<br/>
+    (5)“云教室”,即线上教学工具。提供包括互动白板、教学伴奏、音乐模式、学员展示、课堂节拍器等丰富功能的高保真、低延时的网络直播教室。<br/>
+
+    <h2>第二条 协议有效期</h2>
+    2.1本协议的服务期限为 ${expiryCount} ${expiryUnit},即自 ${startDate} 起至 ${expireDate}止。<br/>
+    2.2协议期满前30天内,如果双方未就续签事项达成一致,则本协议到期后自动终止。<br/>
+
+    <h2>第三条 产品服务收费方式</h2>
+    3.1本协议所称产品与服务以甲方选购为准,由甲方自行确定需要采购的功能或服务并记载于本协议附件1《产品服务清单》中。<br/>
+    3.2乙方按照本协议附件 1《产品服务清单》所列项目向甲方提供产品和服务,甲方应在附件1规定的有效期内使用,因甲方原因超过有效期尚未使用的部分不能退款。<br/>
+
+    <h2>第四条 双方的权利和义务</h2>
+    4.1甲方的权利和义务<br/>
+    4.1.1在协议有效期内,甲方拥有授权区域乙方团练宝产品的经营权。甲方独立经营,自负盈亏;<br/>
+    4.1.2在协议有效期内,甲方有权优先获得同城其它区域的经营权;<br/>
+    4.1.3甲方拥有协议期满后续约的优先权;<br/>
+    4.1.4在使用乙方提供的服务之前,甲方须与乙方完成相关账户的注册,取得乙方提供给甲方的后台账户,甲方同意并保证:<br/>
+    (1)甲方所填写的信息是真实、准确、完整、及时的,且保证乙方可以通过甲方所填写的联系方式与甲方取得联系。<br/>
+    (2)甲方应根据乙方对于服务的要求及时提供相应的身份证明等资料,否则乙方有权拒绝向甲方提供相关服务。<br/>
+    (3)如果甲方提供的资料或信息包含有不正确、不真实的信息,乙方有权在书面通知相关情况后,取消甲方注册账户并随时结束服务。<br/>
+    (4)甲方应对所注册的账户负责,该账户只有甲方可以使用,不可转让、不可赠与、不可继承。<br/>
+    (5)乙方将通过甲方的用户名和密码识别甲方的指示,甲方应对使用其账户及密码进行的一切行为负完全的责任。<br/>
+    (6)甲方应自行妥善保管用户名和密码,对于因甲方原因导致其用户名和密码泄露而产生的损失,由甲方自行承担。<br/>
+    (7)如甲方发现有他人冒用或盗用其账户及密码或任何其他未经合法授权使用其用户名和密码之情形时,应立即以有效方式通知乙方,要求乙方暂停相关服务。同时,甲方理解乙方对甲方的请求采取行动需要合理期限,此合理期限为24小时,在此之前,乙方对已执行的指令及所导致的甲方的损失不承担任何责任。<br/>
+    4.1.5甲方需自行对其发送信息的行为承担一切责任,乙方及其合作方均没有对甲方及甲方客户所发送的内容进行过滤或审核的义务,亦没有任何审查、监督的责任或其他连带责任。<br/>
+    4.1.6甲方仅有权在本协议所约定的区域使用乙方所提供的产品与服务,除非获得乙方书面授权并另行签署补充协议,否则不得用于其他目的或以任何方式擅自提供给第三方使用。<br/>
+    4.1.7甲方保证其为合法成立并有效存续的主体,有资质和能力签署和履行本协议,其签署及履行本协议不侵犯任何第三方的合法权益。否则乙方将终止提供服务,因此产生的一切法律责任,均由甲方自行承担。同时,甲方应对乙方因此而遭受的损失承担赔偿责任。<br/>
+    4.1.8对由于甲方提供的联络方式有误以及甲方用于接收乙方邮件的电子邮箱安全性、稳定性不佳而导致的一切后果,甲方应自行承担责任。<br/>
+    4.1.9甲方保证使用乙方服务时将遵从国家法律、法规、行业惯例和社会公共道德,不得利用乙方提供的服务进行存储、发布、传播如下信息和内容:<br/>
+    (1)违反国家法律、法规及政策的任何内容(信息);<br/>
+    (2)违反国家规定的政治宣传或新闻信息,损坏国家荣誉和利益的;<br/>
+    (3)涉及国家秘密或安全的信息,泄露国家秘密,颠覆国家政权,破坏国家统一的;封建迷信或淫秽、色情等违反公序良俗的信息或教唆犯罪的信息;<br/>
+    (4)博彩有奖、赌博游戏;<br/>
+    (5)违反国家民族和宗教政策的信息;<br/>
+    (6)妨碍互联网运行安全的信息;<br/>
+    (7)侮辱或者诽谤他人,侵害他人合法权益的信息或其他有损于社会秩序、社会治安、公共道德的信息或内容。<br/>
+    4.1.10甲方同时应确保甲方用户在自愿的情形下接受实时音视频服务,且所有用户在接入实时音视频服务时应在法律法规规定范围内发布信息,确保该等信息不违反网络信息服务行业的各项法律法规。不利用实时音视频服务查阅、保存、制作、复制、发布、传播含有下列内容的信息:<br/>
+    (1)违反宪法所确定的基本原则的;<br/>
+    (2)危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;<br/>
+    (3)损坏国家荣誉和利益的;<br/>
+    (4)煽动民族仇恨、民族歧视,破坏民族团结的;<br/>
+    (5)破坏国家民族宗教政策,宣扬邪教和封建迷信的;<br/>
+    (6)散布谣言,扰乱社会秩序,破坏社会稳定的;<br/>
+    (7)散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;<br/>
+    (8)侮辱或者诽谤他人,侵害他人合法权益的;<br/>
+    (9)含有法律、法规禁止的其他内容的。<br/>
+    乙方如发现用户所发布、传送或储存的信息明显属本协议所列的禁止发布的信息的,乙方有权立即停止该用户的数据传输,对涉嫌违禁的信息直接予以删除或屏蔽,并根据事态的严重程度决定是否停止向甲方提供实时音视频通话服务。乙方将向国家有关机关报告该等情况,甲方应通过向其用户索偿等方式确保乙方及乙方合作方免于因此承担损失或责任。<br/>
+
+    4.2乙方的权利和义务<br/>
+    4.2.1乙方应根据甲方选择的服务内容向甲方提供服务,并做好相关培训。<br/>
+    4.2.2乙方网站有权使用本协议规定用途所需的甲方的资料和信息(该等资料和信息仅指甲方自有的资料和信息,不包括甲方及甲方用户的各类隐私信息)。未经甲方事先书面允许,乙方不得擅自将甲方各类隐私信息透露给任何第三方。<br/>
+    4.2.3乙方有权对甲方提交的应用信息进行审查,如甲方提供的应用信息违反法律法规规定的,乙方有权拒绝提供服务。<br/>
+    4.2.4若甲方违反国家法律法规规定的,乙方将终止为甲方提供服务。乙方对因甲方违反国家法律法规规定所导致的的损害不承担任何责任。<br/>
+    4.2.5对于甲方利用即时通讯通道所发布的信息,乙方保留依据国家相关法律法规对其通讯的信息进行关键词过滤的权利,如发现甲方发送内容违反国家相关法律法规的,乙方有权作出包括但不限于劝阻、拦截、向有关部门举报等行为。<br/>
+    4.2.6乙方有义务运用各种安全技术和程序建立完善的管理制度来保护甲方的账户信息。<br/>
+    4.2.7如甲方的应用存在滥用系统资源的情形,引发大量不合理的系统资源消耗行为;或者使用乙方系统发布、传播违反法律法规、社会道德的内容;脱离正常业务模型大量发送消息或者持续连接服务器等,乙方应及时书面通知甲方,在甲方同意的前提下,乙方可以强制关闭服务及冻结账户。<br/>
+    4.2.8因国家政策调整或因电信运营商业务调整所造成的费用或通道服务代码变化的,乙方及乙方合作方将根据调整后的新政策为用户提供相应服务。因电信运营商的基础设备或基础电信系统发生故障、公共区域网络或电力主干线路被他人破坏、有关部门对网络或电力资源进行维护改造,或者乙方系统遭受网络安全事故冲击(如计算机病毒、木马软件、恶意代码或其他恶意攻击,但因乙方未采取行业普遍采用的安全防护标准所导致的网络安全事故除外)等原因造成甲方用户使用实时音视频通话服务期间的相关数据发送延时、数据丢失、服务中断或者遭受其他损失的,乙方及乙方合作方不承担任何赔偿责任。<br/>
+    4.2.9乙方因系统或服务升级,需要甲方强制升级应用,应提前通知甲方联络人或负责人,并告知甲方系统或服务的暂停时间,以便甲方采取合理的应对措施,且升级后不得影响甲方现有服务使用。<br/>
+    4.2.10乙方承诺乙方提供的服务符合法律法规规定及本协议约定,不含有任何恶意程序,不影响甲方产品的正常使用。 <br/>
+    4.2.11除本协议另有明确约定外,乙方不承担甲方在使用乙方合作方产品服务当中的任何风险及相关违约责任,但在合作方系统服务升级时、官方对外价格调整时有提前7日书面通知的义务。在非不可抗力因素导致的服务异常时,有义务与乙方合作方沟通解决,且在必要时协助甲方向乙方合作方追责。<br/>
+    4.2.12如甲方账号有未消耗的现金余额,乙方有权无需另行通知,直接将预付费用和现金余额用于抵扣拖欠款项。如涉及违约金,乙方有权从甲方的预付费用和现金余额中扣除。<br/>
+
+    <h2>第五条 知识产权</h2>
+    5.1乙方产品所拥有的服务著作权、商标权、专利权等所有知识产权及相关利益,甲方将采取所有合理的方法保护乙方的上述权利。如甲方发现有第三人侵犯乙方产品的知识产权或其他合法权益,应及时通知乙方,并采取措施,协助乙方追究侵权者的法律责任。<br/>
+    5.2除非乙方书面明确授权,甲方不得更改、演绎、拆分、反解乙方的技术和程序或以其它任何方式进行可能损害乙方知识产权的行为。<br/>
+    5.3甲方拥有自有企业产品的商标,著作权以及其他所有知识产权及相关利益。双方合作过程中由甲方提供的教材或谱面,如涉及到版权纠纷均由甲方负责。<br/>
+    5.4除因本协议规定的用途所需外,未经对方事先同意,任何一方不得擅自使用、复制对方的商标、标志、商业信息、技术及其他资料。<br/>
+    5.5本协议终止后,本条款仍然有效。<br/>
+
+    <h2>第六条 保密条款</h2>
+    6.1未经对方书面许可或本协议另有约定,任何一方不得向与履行本协议无关的第三方泄露本协议条款的任何内容,以及通过签订和履行本协议而获知的对方的任何信息,或将上述信息用作其他商业用途。但为本协议履行之需任何一方可向其法律、会计、商业及其它顾问、授权雇员(以下统称为“接受方代表”)披露前述信息,接受方应保证其代表承担与其同等的保密义务,并对其代表违反保密义务的行为承担连带责任。<br/>
+    6.2尽管有上述规定,但本条款不适用以下信息:<br/>
+    (1)依据法律法规的规定应当提供,行政、司法等职权部门要求提供的信息;<br/>
+    (2)披露方同意接受方向第三方提供的信息;<br/>
+    (3)不违反本协议的情况下,接受方从第三方合法正当接受不受保密限制的信息;<br/>
+    (4)接受方未违反本协议的情况下即已公开或可以公开获得的信息;<br/>
+    (5)法律法规所要求披露的信息<br/>
+    6.3在本协议期满或终止后,按披露方的要求,接受方应当立即返还或者销毁披露方的保密文件。<br/>
+    6.4在本协议终止之后,本条款仍然有效,直到另一方同意其解除此项义务。<br/>
+
+    <h2>第七条 违约责任</h2>
+    7.1除本协议另有明确约定外,任何一方直接或间接违反本协议的任何条款,或不及时承担或不及时、充分地承担本协议项下其应承担的义务即构成为违约行为,守约方有权以书面方式通知违约方纠正其违约行为并采取合理的补救措施消除违约后果,并赔偿相应损失,同时,守约方还有权主张法律赋予的相关抗辩权,暂停履行守约方相应的合同义务直至违约方纠正违约行为并承担违约责任为止。违约方在收到守约方要求其纠正违约行为的书面通知之日后30日内未纠正其违约行为,守约方有权在做出书面通知情况下提前解除本协议。<br/>
+    7.2除本协议另有约定外,在违约事实发生以后,经守约方的合理及客观的判断,该等违约事实已造成守约方签署本协议的根本目的无法实现,则守约方有权在做出书面通知情况下提前解除本协议,违约方应赔偿守约方因违约方之违约行为而遭致的所有损失。<br/>
+    7.3一方违约的,另一方有权向对方主张因维权而支出的诉讼费用、律师费用、公证费用、差旅费用等实际支出的维权费用。<br/>
+
+    <h2>第八条 争议解决和法律适用</h2>
+    8.1本协议的订立、效力、解释、履行和争议的解决均应适用中华人民共和国法律。<br/>
+    8.2本协议在履行过程中,若发生争议,由双方协商解决;协商不成的,可向乙方所在地有管辖权的人民法院提起诉讼解决。<br/>
+
+    <h2>第九条 协议终止</h2>
+    9.1若甲方未及时向乙方支付服务费用,且在乙方书面催促后超过7日仍不予支付的,乙方有权终止本协议并停止向甲方提供服务。<br/>
+    9.2若一方存在下述情况,另一方有权经书面通知后终止本协议:<br/>
+    (1)一方违反本协议的约定,经另一方书面通知7日后一方仍继续进行违约行为或不履行其义务;<br/>
+    (2)一方停业、清算、解散、破产或关闭;<br/>
+    (3)一方签订、履行本协议的资质被依法吊销;<br/>
+    (4)其他本协议所约定的情形。<br/>
+    9.3除本协议另有明确约定及发生不可抗力情况外,在本协议所约定的服务期限内,未经另一方的书面同意,任何一方不得单方面终止本协议。<br/>
+
+    <h2>第十条 不可抗力</h2>
+    10.1不可抗力是指双方不能合理控制、不可预见或即使预见亦无法避免的事件,该事件妨碍、影响或延误任何一方根据协议履行其全部或部分义务。
+    鉴于互联网的特殊性质,本协议项下的不可抗力亦包括但不限于下列影响互联网正常运行的情形:<br/>
+    (1)黑客攻击;<br/>
+    (2)电信部门技术调整导致之重大影响;<br/>
+    (3)因政府管制而造成之暂时关闭;<br/>
+    (4)电信运营商造成的基础通讯网络瘫痪、延迟。;<br/>
+    (5)任何其他类似事件。<br/>
+    10.2声称遭受不可抗力的一方应在不可抗力发生后15日内书面通知另一方,并随附经有关部门确认的不可抗力之书面证明,且应尽可能减少不可抗力所产生之影响。<br/>
+    10.3由于以上所述不可抗力事件致使本协议的部分或全部不能履行或延迟履行,则双方于彼此间不承担任何违约责任,如该不可抗力事件持续30日以上的,则任何一方有权单方解除本协议。<br/>
+
+    <h2>第十一条 通知送达</h2>
+    11.1任何一方发给对方的通知,应以书面形式并应通过电子邮件、传真或专人递送、特快专递、挂号邮件的形式送到文首所示的通讯地址。如任何一方的地址有变更时,须在变更前10日以书面形式通知对方。<br/>
+    11.2双方将按如下约定确定通知被视为送达的日期:<br/>
+    A)以电子邮件或专人递送的,接收人签收之日视为送达;<br/>
+    B)以传真方式发出的,以发件方发送后打印出的发送确认单所示时间视为送达;<br/>
+    C)以特快专递形式发出的,发往本市内的,发出后第5日视为送达。发往国内其他地区的,发出后第10日视为送达。发往港、澳、台地区的,发出后第15日视为送达。发往境外其他国家或地区的,发出后第20日视为送达。<br/>
+
+    <h2>第十二条 其他</h2>
+    12.1本协议任何部分被视作无效或不可执行,将不会因此而影响本协议其他条款及附件的有效性与可执行性。<br/>
+    12.2本协议一式二份,自双方法定代表人或授权代表签字并加盖公章(含合同章)之日起生效,双方各执一份,具有同等法律效力。<br/>
+    12.3无论何种原因(包括但不限于违反适用的法律法定)导致本协议任何条款完全或部分无效或不具有执行力,不影响本协议任何其他条款的效力、合法和可执行性。此种情况下,双方将以有效的约定替换该约定,且该有效约定应尽可能接近原约定和本协议相应的精神和宗旨。<br/>
+    12.4本协议的附件是本协议不可分割的组成部份,与本协议正文互为补充并具有同等的法律效力,本协议附件与本协议正文冲突的,以本协议附件约定为准。本协议包括如下附件:<br/>
+    本协议附件一:【管乐迷产品服务清单】
+
+    <table border="1" style="width: 100%; border-collapse: collapse;">
+        <tr>
+            <td style="text-align: center;">
+                甲方盖章:<div class="sign"><img class="cachet" src="${officialSealA}" alt="" /></div>
+            </td>
+            <td style="text-align: center;">
+                乙方盖章:<div class="sign"><img class="cachet" src="${officialSealB}" alt="" /></div>
+            </td>
+        </tr>
+        <tr>
+            <td style="text-align: center;">授权代表人:${contacts}</td>
+            <td style="text-align: center;">授权代表人:潘彤彤</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;">签订日期: ${nowDate}</td>
+            <td style="text-align: center;">签订日期: ${nowDate}</td>
+        </tr>
+    </table>
+
+    <h2>附件1: 管乐迷产品服务清单 </h2>
+    <table border="1" style="width: 100%; border-collapse: collapse;">
+        <tr>
+            <th class="thStyle" style="text-align: left;" colspan="2">甲方信息:</th>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">名称:</td>
+            <td style="text-align: center;">${tsignName}</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">地址:</td>
+            <td style="text-align: center;">${address}</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">联系人:</td>
+            <td style="text-align: center;">${contacts}</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">联系电话:</td>
+            <td style="text-align: center;">${phone}</td>
+        </tr>
+        <!--  -->
+        <tr>
+            <th class="thStyle" style="text-align: left;" colspan="2">乙方信息:</th>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">名称:</td>
+            <td style="text-align: center;">武汉乐小雅网络科技有限公司</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">地址:</td>
+            <td style="text-align: center;">武昌区水果湖街中北路与东沙大道交汇处武汉中央文化区K1地块一期一区K1-2栋16层7室-18</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">联系人:</td>
+            <td style="text-align: center;">潘彤彤</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;width: 90px;">联系电话:</td>
+            <td style="text-align: center;">13296657052</td>
+        </tr>
+    </table>
+    <table border="1" style="width: 100%; border-collapse: collapse;">
+        <tr>
+            <th class="thStyle" style="text-align: left;" colspan="4">产品和服务详细信息:</th>
+        </tr>
+        <tr>
+            <th>服务名称</th>
+            <th>数量</th>
+            <th>有效期</th>
+            <th>结算标准</th>
+        </tr>
+        <tr>
+            <td style="text-align: center;">${serveName}(含:${productName})</td>
+            <td style="text-align: center;">${expiryCount}</td>
+            <td style="text-align: center;">${expiryUnit}</td>
+            <td style="text-align: center;">${contractPrice}元(0~${studentUpLimit}人)</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;">团练宝</td>
+            <td style="text-align: center;">/</td>
+            <td style="text-align: center;">/</td>
+            <td style="text-align: center;">单独签订协议开放使用</td>
+        </tr>
+        <tr>
+            <!--    rowspan 里面的数字是动态的  如果要调试就修改${rowspan}为1 -->
+            <td style="text-align: center;" rowspan="${rowspan}">云教室</td>
+            <td style="text-align: center;" rowspan="${rowspan}">/</td>
+            <td style="text-align: center;" rowspan="${rowspan}">/</td>
+            ${defRowspanData}
+            <!--            <td style="text-align: center;">0.2元/分钟/1V1</td>-->
+        </tr>
+        <!--    rowspan 里面的数字大于1 则在这里加一个  -->
+        ${rowspanData}
+        <!--        <tr>-->
+        <!--            <td style="text-align: center;">0.2元/分钟/1V2</td>-->
+        <!--        </tr>-->
+        <!--        <tr>-->
+        <!--            <td style="text-align: center;">0.2元/分钟/1V3</td>-->
+        <!--        </tr>-->
+        <!--        <tr>-->
+        <!--            <td style="text-align: center;">0.2元/分钟/1V4</td>-->
+        <!--        </tr>-->
+        <tr>
+            <td style="text-align: left;" colspan="4">
+                备注:
+                1.Saas平台及产品定制,甲方需在协议签订后3日内将相关费用汇款至乙方指定银行账户;乙方在收到款项后21个工作日内完成定制开发;<br/>
+                2.${serveName}服务采用付费购买方式,有效期内使用,超期未续费将导致停止服务;团易宝按照实际收款金额的${chargeRate}‰即时结算手续费;<br/>
+                3.云教室产品采用预付款开通、实时结算方式,首次开通预付金额不低于1000元,根据乙方实际课时消耗后按照相应标准扣费,甲方应保持足额预付,欠费将导致停止服务;<br/>
+                所有产品一旦投入使用,均不予退费;<br/>
+            </td>
+        </tr>
+    </table>
+    <br/>
+    <table border="1" style="width: 100%; border-collapse: collapse;">
+        <tr>
+            <td class="thStyle">乙方指定银行账户:</td>
+        </tr>
+        <tr>
+            <td>
+                ① 开户名:武汉乐小雅网络科技有限公司<br/>
+                ② 户行:湖北省武汉市招商银行汉街支行<br/>
+                ③ 账户:127915876910501<br/>
+                ④ 税号:91420106MA4F3W1H7K<br/>
+            </td>
+        </tr>
+    </table>
+    <br/>
+    <table border="1" style="width: 100%; border-collapse: collapse;margin-bottom: 50px;">
+        <tr>
+            <td style="text-align: center;">甲方:${tsignName}</td>
+            <td style="text-align: center;">乙方:武汉乐小雅网络科技有限公司</td>
+        </tr>
+        <tr>
+            <td style="text-align: center;">
+                甲方盖章:<div class="sign"><img class="cachet" src="${officialSealA}" alt="" /></div>
+            </td>
+            <td style="text-align: center;">
+                乙方盖章:<div class="sign"><img class="cachet" src="${officialSealB}" alt="" /></div>
+            </td>
+        </tr>
+        <tr>
+            <td style="text-align: center;"> ${nowDate}</td>
+            <td style="text-align: center;"> ${nowDate}</td>
+        </tr>
+    </table>
+</div>
+</body>
+</html>

+ 3 - 3
mec-biz/src/main/resources/config/contracts/product4.ftl

@@ -83,7 +83,7 @@
 <body style="font-family:'SimSun'">
     <div class="container">
         <h1>《产品与服务协议》</h1>
-                            甲方:${compayName} <br/>
+                            甲方:${companyName} <br/>
         <!-- <#if ownershipType == 'OWN'>
 		甲方:深圳大雅乐盟网络教育股份有限公司
 		<#else>
@@ -179,14 +179,14 @@
 
         <div class="signature">
         	<#if isShowVisualSeal>
-            <div class="sign">甲方签章:${compayName}<img class="cachet" src="${sealPicture!}" alt="" />
+            <div class="sign">甲方签章:${companyName}<img class="cachet" src="${sealPicture!}" alt="" />
                 <span>日期:${.now?string("yyyy年MM月dd日")}</span>
             </div>
             <div class="sign">乙方签章:${studentInfo.realName!}
                 <span>日期:${.now?string("yyyy年MM月dd日")} </span>
             </div>
         	<#else>
-            <div class="sign">甲方签章:${compayName}
+            <div class="sign">甲方签章:${companyName}
                 <span>日期:${.now?string("yyyy年MM月dd日")}</span>
             </div>
             <div class="sign">乙方签章:

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

@@ -47,6 +47,7 @@
         <result column="member_course_show_flag_" property="memberCourseShowFlag"/>
         <result column="homework_push_flag_" property="homeworkPushFlag"/>
         <result column="tenant_id_" property="tenantId"/>
+        <result column="is_give_accessories_" property="isGiveAccessories"/>
     </resultMap>
     
     <resultMap type="com.ym.mec.biz.dal.dto.MusicGroupBasicDto" id="MusicGroupBasicDto" extends="MusicGroup">
@@ -106,7 +107,7 @@
                  settlement_type_, cooperation_organ_id_, enlightenment_course_time_,
                  parent_meeting_time_, img_, director_user_id_, is_classroom_lessons_, memo_, expect_start_group_date_,
                  ownership_type_, repair_user_id_, del_flag_, payment_valid_start_date_, payment_valid_end_date_,
-                 payment_pattern_, course_view_type_, transaction_teacher_id_,homework_push_flag_,member_course_show_flag_,tenant_id_)
+                 payment_pattern_, course_view_type_, transaction_teacher_id_,homework_push_flag_,member_course_show_flag_,tenant_id_,is_give_accessories_)
         VALUES (#{id}, #{name}, #{organId}, #{schoolId}, #{applyExpireDate}, #{preApplyExpireDate}, #{teamTeacherId},
                 #{educationalTeacherId},
                 #{chargeTypeId}, #{courseForm}, now(), now(),
@@ -118,7 +119,7 @@
                 #{isClassroomLessons}, #{memo}, #{expectStartGroupDate},
                 #{ownershipType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{repairUserId},
                 #{delFlag}, #{paymentValidStartDate}, #{paymentValidEndDate}, #{paymentPattern},
-                #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{transactionTeacherId},#{homeworkPushFlag},#{memberCourseShowFlag},#{tenantId})
+                #{courseViewType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{transactionTeacherId},#{homeworkPushFlag},#{memberCourseShowFlag},#{tenantId},#{isGiveAccessories})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -230,6 +231,9 @@
             <if test="memberCourseShowFlag != null">
                 member_course_show_flag_ = #{memberCourseShowFlag},
             </if>
+            <if test="isGiveAccessories != null">
+                is_give_accessories_ = #{isGiveAccessories},
+            </if>
         </set>
         WHERE id_ = #{id}
     </update>

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

@@ -62,7 +62,7 @@
         where id_ = #{id,jdbcType=INTEGER}
     </update>
 
-    <select id="queryPage" resultType="com.ym.mec.biz.dal.vo.PlatformServePageVo">
+    <select id="queryPage" parameterType="object" resultType="com.ym.mec.biz.dal.vo.PlatformServePageVo">
         SELECT
         a.id_ AS id,
         a.`name_` AS serveName,
@@ -76,6 +76,9 @@
             <if test="search != null">
                and a.`name_` like CONCAT('%',#{search},'%')
             </if>
+            <if test="id != null">
+                and a.id_ = #{id}
+            </if>
         </where>
         GROUP BY a.`id_`
     </select>

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/SysAreaMapper.xml

@@ -83,4 +83,8 @@
     <select id="getParentArea" resultMap="SysArea">
         SELECT * FROM sys_area WHERE id_ = (SELECT parent_organ_id_ FROM sys_area WHERE id_ = #{id})
     </select>
+
+    <select id="queryByCode" resultMap="SysArea">
+       SELECT * FROM sys_area WHERE code_ = #{code}
+    </select>
 </mapper>

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

@@ -128,7 +128,7 @@
 		LEFT JOIN sys_music_score_categories smsc ON smsc.id_ = ses.music_score_categories_id_
 		<include refid="queryPageSql"/>
 		GROUP BY ses.id_
-		ORDER BY ses.music_score_categories_id_ DESC,ses.order_ ASC,ses.create_time_ DESC
+		ORDER BY ses.music_score_categories_id_ DESC,ses.order_ ASC,ses.create_time_ DESC,ses.id_ desc
 		<include refid="global.limit"/>
 	</select>
 	

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

@@ -205,7 +205,7 @@
         FROM sys_payment_config spc
         LEFT JOIN organization o on spc.organ_id_ = o.id_
         <where>
-        	spc.tenant_id_ = #{tenantId}
+        	<!-- spc.tenant_id_ = #{tenantId} -->
             <if test="payType == null">
                 and pay_type_ IS NOT NULL
                 AND (spc.yq_mer_no_ !='' OR spc.hf_mer_no_ !='')

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

@@ -56,6 +56,7 @@
         <result column="subject_name_" property="splitSubjectName"/>
         <result column="id_card_no_" property="idCardNo"/>
         <result column="is_settlement_salary_" property="isSettlementSalary"/>
+        <result column="contract_url_" property="contractUrl"/>
         <result column="tenant_id_" property="tenantId"/>
     </resultMap>
     
@@ -375,9 +376,10 @@
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="Teacher" parameterType="map">
         SELECT t.id_,su.real_name_,su.lock_flag_,t.subject_id_,su.phone_,t.organ_id_ teacher_organ_id_,t.organ_id_,t.is_support_extra_practice_lesson_,
-        t.job_nature_,t.demission_date_,t.formal_staff_date_,t.is_probation_period_,t.memo_,GROUP_CONCAT(s.name_) subject_name_,su.del_flag_,t.is_settlement_salary_
+        t.job_nature_,t.demission_date_,t.formal_staff_date_,t.is_probation_period_,t.memo_,GROUP_CONCAT(s.name_) subject_name_,su.del_flag_,t.is_settlement_salary_,tc.url_ contract_url_
         FROM teacher t
         LEFT JOIN sys_user su ON t.id_ = su.id_
+        left join teacher_contracts tc on tc.user_id_ = t.id_
         LEFT JOIN `subject` s ON FIND_IN_SET(s.id_,t.subject_id_)
         <include refid="queryPageMap"/>
         GROUP BY t.id_

+ 25 - 0
mec-biz/src/main/resources/config/mybatis/TenantApplyCallRecordMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ym.mec.biz.dal.dao.TenantApplyCallRecordDao">
+    <resultMap id="BaseResultMap" type="com.ym.mec.biz.dal.entity.TenantApplyCallRecord">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="tenant_apply_id_" jdbcType="INTEGER" property="tenantApplyId"/>
+        <result column="call_back_people_" jdbcType="VARCHAR" property="callBackPeople"/>
+        <result column="call_back_log_" jdbcType="VARCHAR" property="callBackLog"/>
+        <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_, tenant_apply_id_, call_back_people_, call_back_log_, create_time_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.ym.mec.biz.dal.entity.TenantApplyCallRecord">
+        insert into tenant_apply_call_record(tenant_apply_id_, call_back_people_, call_back_log_, create_time_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.tenantApplyId}, #{entity.callBackPeople}, #{entity.callBackLog}, #{entity.createTime})
+        </foreach>
+    </insert>
+
+</mapper>

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

@@ -14,6 +14,8 @@
 		<result column="create_time_" property="createTime" />
 		<result column="call_back_time_" property="callBackTime" />
 		<result column="call_back_log_" property="callBackLog" />
+		<result column="call_back_people_" property="callBackPeople" />
+		<result column="recommender_" property="recommender" />
 	</resultMap>
 
 	<!-- 根据主键查询一条记录 -->
@@ -34,8 +36,8 @@
 		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
 			AS ID FROM DUAL </selectKey> -->
 		INSERT INTO tenant_apply
-		(id_,name_,city_,linkman_,mobile_no_,student_num_level_,name_of_referrer_,create_time_,call_back_time_,call_back_log_)
-		VALUES(#{id},#{name},#{city},#{linkman},#{mobileNo},#{studentNumLevel},#{nameOfReferrer},#{createTime},#{callBackTime},#{callBackLog})
+		(id_,name_,city_,linkman_,mobile_no_,student_num_level_,name_of_referrer_,create_time_,call_back_time_,call_back_log_,call_back_people_,recommender_)
+		VALUES(#{id},#{name},#{city},#{linkman},#{mobileNo},#{studentNumLevel},#{nameOfReferrer},#{createTime},#{callBackTime},#{callBackLog},#{callBackPeople},#{recommender})
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -72,6 +74,12 @@
 			<if test="createTime != null">
 				create_time_ = #{createTime},
 			</if>
+            <if test="callBackPeople != null">
+                call_back_people_ = #{callBackPeople},
+            </if>
+            <if test="recommender != null">
+                recommender_ = #{recommender},
+            </if>
 		</set>
 		WHERE id_ = #{id}
 	</update>

+ 29 - 0
mec-biz/src/main/resources/config/mybatis/TenantContractRecordMapper.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ym.mec.biz.dal.dao.TenantContractRecordDao">
+    <resultMap id="BaseResultMap" type="com.ym.mec.biz.dal.entity.TenantContractRecord">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="tenant_id_" jdbcType="INTEGER" property="tenantId"/>
+        <result column="contract_name_" jdbcType="VARCHAR" property="contractName"/>
+        <result column="url_" jdbcType="VARCHAR" property="url"/>
+        <result column="type_" jdbcType="INTEGER" property="type"/>
+        <result column="biz_date_" jdbcType="TIMESTAMP" property="bizDate"/>
+        <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_
+        , tenant_id_, contract_name_, url_, type_, biz_date_, create_time_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.ym.mec.biz.dal.entity.TenantContractRecord">
+        insert into tenant_contract_record(tenant_id_, contract_name_, url_, type_, biz_date_, create_time_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.tenantId}, #{entity.contractName}, #{entity.url}, #{entity.type}, #{entity.bizDate},
+            #{entity.createTime})
+        </foreach>
+    </insert>
+
+</mapper>

+ 156 - 0
mec-biz/src/main/resources/config/mybatis/TenantContractTemplateMapper.xml

@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- 这个文件是自动生成的。 不要修改此文件。所有改动将在下次重新自动生成时丢失。 -->
+<mapper namespace="com.ym.mec.biz.dal.dao.TenantContractTemplateDao">
+
+	<resultMap type="com.ym.mec.biz.dal.entity.TenantContractTemplate"
+		id="TenantContractTemplate">
+		<result column="id_" property="id" />
+		<result column="name_" property="name" />
+		<result column="type_" property="type" />
+		<result column="contract_template_content_" property="contractTemplateContent" />
+		<result column="origanal_file_url_" property="origanalFileUrl" />
+		<result column="contract_no_" property="contractNo" />
+		<result column="status_" property="status" />
+		<result column="version_" property="version" />
+		<result column="modify_by_" property="modifyBy" />
+		<result column="update_time_" property="updateTime" />
+		<result column="create_time_" property="createTime" />
+		<result column="owner_" property="owner" />
+		<result column="tenant_id_" property="tenantId" />
+	</resultMap>
+	
+	<resultMap type="com.ym.mec.biz.dal.dto.TenantContractTemplateDto"
+		id="TenantContractTemplateDto">
+		<result column="latest_operator_" property="latestOperator" />
+	</resultMap>
+
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="TenantContractTemplate">
+		SELECT * FROM tenant_contract_template WHERE id_ = #{id}
+	</select>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="TenantContractTemplate">
+		SELECT * FROM tenant_contract_template ORDER BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.TenantContractTemplate"
+		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
+			AS ID FROM DUAL </selectKey> -->
+		INSERT INTO tenant_contract_template
+		(id_,name_,type_,contract_template_content_,origanal_file_url_,contract_no_,status_,version_,modify_by_,update_time_,create_time_,owner_,tenant_id_)
+		VALUES(#{id},#{name},#{type},#{contractTemplateContent},#{origanalFileUrl},#{contractNo},#{status},#{version},#{modifyBy},#{updateTime},#{createTime},#{owner},#{tenantId})
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.TenantContractTemplate">
+		UPDATE tenant_contract_template
+		<set>
+			<if test="contractTemplateContent != null">
+				contract_template_content_ = #{contractTemplateContent},
+			</if>
+			<if test="status != null">
+				status_ = #{status},
+			</if>
+			<if test="type != null">
+				type_ = #{type},
+			</if>
+			<if test="origanalFileUrl != null">
+				origanal_file_url_ = #{origanalFileUrl},
+			</if>
+			<if test="id != null">
+				id_ = #{id},
+			</if>
+			<if test="updateTime != null">
+				update_time_ = #{updateTime},
+			</if>
+			<if test="version != null">
+				version_ = #{version},
+			</if>
+			<if test="modifyBy != null">
+				modify_by_ = #{modifyBy},
+			</if>
+			<if test="contractNo != null">
+				contract_no_ = #{contractNo},
+			</if>
+			<if test="name != null">
+				name_ = #{name},
+			</if>
+			<if test="createTime != null">
+				create_time_ = #{createTime},
+			</if>
+			<if test="owner != null">
+				owner_ = #{owner},
+			</if>
+		</set>
+		WHERE id_ = #{id} and tenant_id_ = #{tenantId}
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete">
+		DELETE FROM tenant_contract_template WHERE id_ = #{id}
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPageList" resultMap="TenantContractTemplateDto"
+		parameterType="map">
+		SELECT tct.*,u.real_name_ latest_operator_ FROM tenant_contract_template tct left join sys_user u on tct.modify_by_ = u.id_ 
+		<where>
+			tct.tenant_id_ = #{tenantId}
+			<if test="status != null">
+				and tct.status_ = #{status}
+			</if>
+			<if test="type != null">
+				and tct.type_ = #{type}
+			</if>
+			<if test="owner != null">
+				and tct.owner_ = #{owner}
+			</if>
+		</where>
+		ORDER BY id_
+		<include refid="global.limit" />
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(tct.id_) FROM tenant_contract_template tct
+		<where>
+			<if test="status != null">
+				and tct.status_ = #{status}
+			</if>
+			<if test="type != null">
+				and tct.type_ = #{type}
+			</if>
+			<if test="owner != null">
+				and tct.owner_ = #{owner}
+			</if>
+		</where>
+	</select>
+	
+	<select id="queryLatestContractTemplate" resultMap="TenantContractTemplate" parameterType="map">
+		SELECT * FROM tenant_contract_template where status_ = 1 and tenant_id_ = #{tenantId}
+		<if test="type != null">
+			and type_ = #{type}
+		</if>
+		<if test="owner != null">
+			and owner_ = #{owner}
+		</if>
+	</select>
+	
+	<update id="disableContract" parameterType="map">
+		update tenant_contract_template set status_ = 0 where status_ = 1 and tenant_id_ = #{tenantId}
+		<if test="type != null">
+			and type_ = #{type}
+		</if>
+		<if test="owner != null">
+			and owner_ = #{owner}
+		</if>
+	</update>
+	
+	<select id="queryMaxVersion" resultType="java.lang.Integer">
+		SELECT max(version_) FROM tenant_contract_template 
+	</select>
+</mapper>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 54 - 4
mec-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml


+ 58 - 0
mec-biz/src/main/resources/config/mybatis/TenantPreJoinMapper.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ym.mec.biz.dal.dao.TenantPreJoinDao">
+    <resultMap id="BaseResultMap" type="com.ym.mec.biz.dal.entity.TenantPreJoin">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="tsign_name_" jdbcType="VARCHAR" property="tsignName"/>
+        <result column="name_" jdbcType="VARCHAR" property="name"/>
+        <result column="area_id_" jdbcType="INTEGER" property="areaId"/>
+        <result column="area_name_" jdbcType="VARCHAR" property="areaName"/>
+        <result column="email_" jdbcType="VARCHAR" property="email"/>
+        <result column="customer_service_phone_" jdbcType="VARCHAR" property="customerServicePhone"/>
+        <result column="tsign_code_" jdbcType="VARCHAR" property="tsignCode"/>
+        <result column="address_" jdbcType="VARCHAR" property="address"/>
+        <result column="remark_" jdbcType="VARCHAR" property="remark"/>
+        <result column="enterprise_liable_name_" jdbcType="VARCHAR" property="enterpriseLiableName"/>
+        <result column="enterprise_liable_phone_" jdbcType="VARCHAR" property="enterpriseLiablePhone"/>
+        <result column="legal_person_id_front_pic_" jdbcType="VARCHAR" property="legalPersonIdFrontPic"/>
+        <result column="legal_person_id_reverse_pic_" jdbcType="VARCHAR" property="legalPersonIdReversePic"/>
+        <result column="contacts_" jdbcType="VARCHAR" property="contacts"/>
+        <result column="phone_" jdbcType="VARCHAR" property="phone"/>
+        <result column="tsign_pic_" jdbcType="VARCHAR" property="tsignPic"/>
+        <result column="tax_register_pic_" jdbcType="VARCHAR" property="taxRegisterPic"/>
+        <result column="company_account_info_pic_" jdbcType="VARCHAR" property="companyAccountInfoPic"/>
+        <result column="logo_" jdbcType="VARCHAR" property="logo"/>
+        <result column="corporate_chops_" jdbcType="VARCHAR" property="corporateChops"/>
+        <result column="corporate_finance_chops_" jdbcType="VARCHAR" property="corporateFinanceChops"/>
+        <result column="state_" jdbcType="INTEGER" property="state"/>
+        <result column="created_time_" jdbcType="TIMESTAMP" property="createdTime"/>
+        <result column="province_id_" jdbcType="INTEGER" property="provinceId"/>
+        <result column="province_name_" jdbcType="VARCHAR" property="provinceName"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_
+        , tsign_name_, name_, area_id_, area_name_, email_, customer_service_phone_
+        , tsign_code_, address_, remark_, enterprise_liable_name_, enterprise_liable_phone_, legal_person_id_front_pic_
+        , legal_person_id_reverse_pic_, contacts_, phone_, tsign_pic_, tax_register_pic_, company_account_info_pic_
+        , logo_, corporate_chops_, corporate_finance_chops_, state_, created_time_, province_id_, province_name_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.ym.mec.biz.dal.entity.TenantPreJoin">
+        insert into tenant_pre_join(tsign_name_, name_, area_id_, area_name_, email_, customer_service_phone_,
+        tsign_code_, address_, remark_, enterprise_liable_name_, enterprise_liable_phone_, legal_person_id_front_pic_,
+        legal_person_id_reverse_pic_, contacts_, phone_, tsign_pic_, tax_register_pic_, company_account_info_pic_,
+        logo_, corporate_chops_, corporate_finance_chops_, state_, created_time_, province_id_, province_name_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.tsignName}, #{entity.name}, #{entity.areaId}, #{entity.areaName}, #{entity.email},
+            #{entity.customerServicePhone}, #{entity.tsignCode}, #{entity.address}, #{entity.remark},
+            #{entity.enterpriseLiableName}, #{entity.enterpriseLiablePhone}, #{entity.legalPersonIdFrontPic},
+            #{entity.legalPersonIdReversePic}, #{entity.contacts}, #{entity.phone}, #{entity.tsignPic},
+            #{entity.taxRegisterPic}, #{entity.companyAccountInfoPic}, #{entity.logo}, #{entity.corporateChops},
+            #{entity.corporateFinanceChops}, #{entity.state}, #{entity.createdTime}, #{entity.provinceId},
+            #{entity.provinceName})
+        </foreach>
+    </insert>
+</mapper>

+ 37 - 0
mec-biz/src/main/resources/config/mybatis/TenantProductInfoMapper.xml

@@ -22,4 +22,41 @@
         , tenant_id_, serve_id_, serve_detail_id_, original_price_, contract_price_, pay_amount_, pay_date_, expiry_count_, expiry_unit_, expiry_date_, using_
     </sql>
 
+    <update id="updateByTenantId" parameterType="com.ym.mec.biz.dal.entity.TenantProductInfo">
+        update tenant_product_info
+        <set>
+            <if test="serveId != null">
+                serve_id_ = #{serveId,jdbcType=INTEGER},
+            </if>
+            <if test="serveDetailId != null">
+                serve_detail_id_ = #{serveDetailId,jdbcType=INTEGER},
+            </if>
+            <if test="originalPrice != null">
+                original_price_ = #{originalPrice,jdbcType=VARCHAR},
+            </if>
+            <if test="contractPrice != null">
+                contract_price_ = #{contractPrice,jdbcType=VARCHAR},
+            </if>
+            <if test="payAmount != null">
+                pay_amount_ = #{payAmount,jdbcType=VARCHAR},
+            </if>
+            <if test="payDate != null">
+                pay_date_ = #{payDate,jdbcType=TIMESTAMP},
+            </if>
+            <if test="expiryCount != null">
+                expiry_count_ = #{expiryCount,jdbcType=INTEGER},
+            </if>
+            <if test="expiryUnit != null">
+                expiry_unit_ = #{expiryUnit,jdbcType=VARCHAR},
+            </if>
+            <if test="expiryDate != null">
+                expiry_date_ = #{expiryDate,jdbcType=TIMESTAMP},
+            </if>
+            <if test="using != null">
+                using_ = #{using,jdbcType=INTEGER},
+            </if>
+        </set>
+        where tenant_id_ = #{tenantId,jdbcType=INTEGER} and using_ = 0
+    </update>
+
 </mapper>

+ 1 - 1
mec-common/common-core/pom.xml

@@ -13,7 +13,7 @@
 	<url>http://maven.apache.org</url>
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <mybatis-plus.version>3.0.3</mybatis-plus.version>
+        <mybatis-plus.version>3.0.7.1</mybatis-plus.version>
 	</properties>
 
 	<dependencies>

+ 40 - 2
mec-common/common-core/src/main/java/com/ym/mec/common/page/WrapperUtil.java

@@ -1,5 +1,6 @@
 package com.ym.mec.common.page;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ym.mec.common.exception.BizException;
 import org.apache.commons.collections.CollectionUtils;
@@ -76,6 +77,28 @@ public class WrapperUtil<T> {
         return this.hasIn(column, WrapperUtil.toList(val));
     }
 
+    /**
+     * 大于等于 >=
+     *
+     * @param column 列名称
+     * @param val    条件
+     */
+    public WrapperUtil<T> hasGe(String column, Object val) {
+        queryWrapper.ge(ObjPredicate.test(val), column, val);
+        return this;
+    }
+
+    /**
+     * 小于等于 <=
+     *
+     * @param column 列名称
+     * @param val    条件
+     */
+    public WrapperUtil<T> hasLe(String column, Object val) {
+        queryWrapper.le(ObjPredicate.test(val), column, val);
+        return this;
+    }
+
     public static <S, O> Integer toInt(Map<S, O> map, S str, String exMsg) {
         Optional<O> o = Optional.ofNullable(map)
                 .map(m -> m.get(str));
@@ -151,7 +174,10 @@ public class WrapperUtil<T> {
     }
 
     public static List<String> collectToList(String[] b) {
-        return Arrays.stream(b).filter(StrPredicate).distinct().collect(Collectors.toList());
+        return Arrays.stream(b)
+                .filter(StrPredicate)
+                .distinct()
+                .collect(Collectors.toList());
     }
 
     /**
@@ -210,12 +236,13 @@ public class WrapperUtil<T> {
     /**
      * 对比a,b集和
      * <p> 示例
-     * <p>  传入a -> [1, 3,4,6]
+     * <p>  传入a -> [1,3,4,6]
      * <p>  传入b -> [1,2,4]
      * <p> 执行该方法后a,b会被修改为
      * <p> a -> [3,6]
      * <p> b -> [2]
      */
+    @SuppressWarnings("unchecked")
     public static <O> void listDifference(List<O> a, List<O> b) {
         //将ab并集
         Collection<O> abUn = CollectionUtils.retainAll(a, b);
@@ -225,4 +252,15 @@ public class WrapperUtil<T> {
         b.removeAll(abUn);
     }
 
+    @SuppressWarnings("unchecked")
+    public static Map<String, Object> toMap(Object obj) {
+        if (obj instanceof Map) {
+            return (Map<String, Object>) obj;
+        }
+        return Optional.ofNullable(obj)
+                .map(JSONObject::toJSON)
+                .map(o -> JSONObject.toJavaObject((JSONObject) o, Map.class))
+                .orElse(new HashMap<String, Object>());
+    }
+
 }

+ 3 - 8
mec-common/common-core/src/main/java/com/ym/mec/common/service/BaseService.java

@@ -8,17 +8,12 @@ package com.ym.mec.common.service;
  * @create 2015年7月13日
  */
 import java.io.Serializable;
-import java.math.BigDecimal;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.*;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
 
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.ibatis.session.SqlSession;
-import org.springframework.util.CollectionUtils;
 
 public interface BaseService<PK extends Serializable, T> {
 	/**

+ 5 - 1
mec-common/common-core/src/main/java/com/ym/mec/common/service/impl/BaseServiceImpl.java

@@ -82,7 +82,11 @@ public abstract class BaseServiceImpl<PK extends Serializable, T> implements Bas
 	 */
 	public List<T> findAll(Map<String, Object> params) {
 		
-		params.put("tenantId", TenantContextHolder.getTenantId());
+		final String TENANT_ID = "tenantId";
+		
+		if(!params.containsKey(TENANT_ID)){
+			params.put(TENANT_ID, TenantContextHolder.getTenantId());
+		}
 		return this.getDAO().findAll(params);
 	}
 

+ 1 - 1
mec-im/src/main/java/com/ym/job/ScheduleManager.java

@@ -45,7 +45,7 @@ public class ScheduleManager implements SchedulingConfigurer {
     @Autowired
     RedissonClient redissonClient;
 
-//    private ConcurrentHashMap<String, ScheduledTask> schedulingTasks = new ConcurrentHashMap<>();
+    //    private ConcurrentHashMap<String, ScheduledTask> schedulingTasks = new ConcurrentHashMap<>();
     private ConcurrentHashMap<String, ScheduledTask> roomCacheTasks = new ConcurrentHashMap<>();
     private ConcurrentHashMap<String, Date> userIMOfflineMap = new ConcurrentHashMap<>();
     private ScheduledDelayTask userIMOfflineKickTask = new ScheduledDelayTask(new Runnable() {

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

@@ -52,7 +52,7 @@ public class TeacherContractController extends BaseController {
 			//判断分部
 			Teacher teacher = teacherService.get(sysUser.getId());
 			
-			if(teacher == null || (teacher.getOrganId() == 55 ||teacher.getOrganId() == 59)){
+			if(teacher == null || teacher.getTeacherOrganId() == null || (teacher.getTeacherOrganId() == 55 ||teacher.getTeacherOrganId() == 59)){
 				return succeed(false);
 			}
 			

+ 20 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/ESealPlugin.java

@@ -11,6 +11,16 @@ public interface ESealPlugin {
      * @return 账户唯一标识
      */
     public String createUserAccount(String realName, String idcard, String mobile);
+    
+    /**
+     * 更新用户账户(个人)
+     * @param accountId 账户唯一标识
+     * @param realName 姓名
+     * @param idcard 身份证号码
+     * @param mobile 手机号码
+     * @return
+     */
+    public boolean updateUserAccount(String accountId, String realName, String idcard, String mobile);
 
     /**
      * 创建用户账户(企业)
@@ -22,6 +32,16 @@ public interface ESealPlugin {
     public String createOrganAccount(String orgName, String organCode);
 
     /**
+     * 修改用户账户(企业)
+     *
+     * @param accountId   账户唯一标识
+     * @param orgName   机构名称
+     * @param organCode 统一社会信用代码
+     * @return
+     */
+    public boolean updateOrganAccount(String accountId, String orgName, String organCode);
+
+    /**
      * 创建个人印章
      *
      * @param accountId 账户唯一标识

+ 38 - 1
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/provider/TsignPlugin.java

@@ -10,6 +10,8 @@ import com.timevale.esign.sdk.tech.bean.OrganizeBean;
 import com.timevale.esign.sdk.tech.bean.PersonBean;
 import com.timevale.esign.sdk.tech.bean.PosBean;
 import com.timevale.esign.sdk.tech.bean.SignPDFFileBean;
+import com.timevale.esign.sdk.tech.bean.UpdateOrganizeBean;
+import com.timevale.esign.sdk.tech.bean.UpdatePersonBean;
 import com.timevale.esign.sdk.tech.bean.result.AddAccountResult;
 import com.timevale.esign.sdk.tech.bean.result.AddSealResult;
 import com.timevale.esign.sdk.tech.bean.result.FileDigestSignResult;
@@ -32,6 +34,9 @@ import com.timevale.tech.sdk.bean.ProjectConfig;
 import com.ym.mec.thirdparty.eseal.ESealPlugin;
 import com.ym.mec.thirdparty.exception.ThirdpartyException;
 
+/**
+ * 接口文档地址  https://open.esign.cn/doc/detail?id=opendoc%2Fpaas_sdk%2Fbzu9e8&namespace=opendoc%2Fpaas_sdk&searchText=
+ */
 @Service
 public class TsignPlugin implements ESealPlugin, InitializingBean, DisposableBean {
 
@@ -97,7 +102,23 @@ public class TsignPlugin implements ESealPlugin, InitializingBean, DisposableBea
         throw new ThirdpartyException(result.getMsg());
     }
 
-    /**
+    @Override
+	public boolean updateUserAccount(String accountId, String realName, String idcard, String mobile) {
+    	
+    	UpdatePersonBean updatePersonBean = new UpdatePersonBean();
+        updatePersonBean.setMobile(mobile);// 手机号码,可空
+        updatePersonBean.setName(realName);// 姓名,可空
+        
+        AccountService service = serviceClient.accountService();
+        Result result = service.updateAccount(accountId, updatePersonBean, null);
+        
+        if (result.getErrCode() == 0) {
+            return true;
+        }
+        throw new ThirdpartyException(result.getMsg());
+	}
+
+	/**
      * 创建用户账户(企业)
      *
      * @param orgName   机构名称
@@ -119,6 +140,22 @@ public class TsignPlugin implements ESealPlugin, InitializingBean, DisposableBea
         throw new ThirdpartyException("创建企业账户接口调用失败code=" + result.getErrCode() + "msg=" + result.getMsg());
     }
 
+	@Override
+	public boolean updateOrganAccount(String accountId, String orgName, String organCode) {
+		
+		UpdateOrganizeBean updateOrganizeBean = new UpdateOrganizeBean();
+        updateOrganizeBean.setName(orgName);//机构名称,可空
+
+        AccountService service = serviceClient.accountService();
+        Result result = service.updateAccount(accountId, updateOrganizeBean, null);
+        
+        if (result.getErrCode() == 0) {
+            return true;
+        }
+        throw new ThirdpartyException(result.getMsg());
+		
+	}
+
     /**
      * 创建印章
      *

+ 1 - 1
mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java

@@ -332,7 +332,7 @@ public class DateUtil {
 		return calendar.get(Calendar.HOUR_OF_DAY);
 	}
 
-	public static int geMinute(Date date) {
+	public static int getMinute(Date date) {
 		if (date == null) {
 			return -1;
 		}

+ 36 - 1
mec-util/src/main/java/com/ym/mec/util/freemarker/FreemarkerTemplateEngine.java

@@ -9,6 +9,7 @@ import java.util.Map;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import freemarker.cache.StringTemplateLoader;
 import freemarker.template.Configuration;
 import freemarker.template.DefaultObjectWrapper;
 import freemarker.template.Template;
@@ -17,7 +18,7 @@ public class FreemarkerTemplateEngine {
 	private static final Logger LOGGER = LoggerFactory.getLogger(FreemarkerTemplateEngine.class);
 
 	private final static FreemarkerTemplateEngine templateEngine = new FreemarkerTemplateEngine();
-
+	
 	private static Configuration cfg;
 
 	private FreemarkerTemplateEngine() {
@@ -94,4 +95,38 @@ public class FreemarkerTemplateEngine {
 		}
 	}
 
+	public void renderByString(Map<String, Object> data, String templateStr, File outputFile) {
+
+		FileWriter fw = null;
+		BufferedWriter bw = null;
+		String templateFileName = outputFile.getName();
+		try {
+			StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
+			stringTemplateLoader.putTemplate(templateFileName, templateStr);
+			cfg.setTemplateLoader(stringTemplateLoader);
+			Template temp = cfg.getTemplate(templateFileName);
+			fw = new FileWriter(outputFile);
+			bw = new BufferedWriter(fw);
+			temp.process(data, bw);
+			bw.flush();
+		} catch (Exception e) {
+			LOGGER.warn("模板渲染失败", e);
+		} finally {
+			if (bw != null) {
+				try {
+					bw.close();
+				} catch (IOException e) {
+					LOGGER.warn("BufferedWriter关闭异常");
+				}
+			}
+			if (fw != null) {
+				try {
+					fw.close();
+				} catch (IOException e) {
+					LOGGER.warn("FileWriter关闭异常");
+				}
+			}
+		}
+	}
+
 }

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

@@ -38,8 +38,8 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                         "/eduSubject/findSubSubjects", "/eduFinancialExpenditure/batchAdd", "/eduSendNotice/*",
                         "/oaContracts/*", "/eduStudent/organStudentOverView", "/activity/countCloudTeacherActive",
                         "/activity/organDoubleEleven2021Statis", "/activity/doubleEleven2021Statis", "/questionnaireTopic/getDetail", "/questionnaireUserResult/add",
-                        "/tenantInfo/info/*", "/tenantInfo/checkInfo/*", "/tenantInfo/pay/*", "/tenantInfo/notify",
-                             "/tenantInfo/testCheck"
+                        "/tenantInfo/info/*", "/tenantInfo/checkInfo/*", "/tenantInfo/pay/*","/tenantInfo/testCheck", "/tenantInfo/getContract/*",
+                        "/tenantPreJoin/add"
                 )
                 .permitAll().anyRequest().authenticated().and().httpBasic();
     }

+ 58 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TenantApplyCallRecordController.java

@@ -0,0 +1,58 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.dal.entity.TenantApplyCallRecord;
+import com.ym.mec.biz.service.TenantApplyCallRecordService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 机构申请记录(TenantApplyCallRecord)表控制层
+ *
+ * @author hgw
+ * @since 2022-02-09 10:44:00
+ */
+@Api(tags = "机构申请记录")
+@RestController
+@RequestMapping("/tenantApplyCallRecord")
+public class TenantApplyCallRecordController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private TenantApplyCallRecordService tenantApplyCallRecordService;
+
+    @ApiOperation("分页查询")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "applyId", value = "申请表id", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "startTime", value = "开始时间-年月日时分秒", dataType = "String"),
+            @ApiImplicitParam(name = "endTime", value = "开始时间-年月日时分秒", dataType = "String"),
+    })
+    @PostMapping("/queryPage")
+    @PreAuthorize("@pcs.hasPermissions('tenantApplyCallRecord/queryPage')")
+    public HttpResponseResult<PageInfo<TenantApplyCallRecord>> queryPage(@RequestBody Map<String, Object> param) {
+        return succeed(tenantApplyCallRecordService.queryPage(param));
+    }
+
+    @ApiOperation("添加")
+    @PostMapping("/add")
+    @PreAuthorize("@pcs.hasPermissions('tenantApplyCallRecord/add')")
+    public HttpResponseResult add(@RequestBody TenantApplyCallRecord obj) {
+        tenantApplyCallRecordService.insert(obj);
+        return succeed();
+    }
+
+}
+

+ 52 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TenantContractRecordController.java

@@ -0,0 +1,52 @@
+package com.ym.mec.web.controller;
+
+
+import com.ym.mec.biz.dal.entity.TenantContractRecord;
+import com.ym.mec.biz.service.TenantContractRecordService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 机构协议记录表(TenantContractRecord)表控制层
+ *
+ * @author hgw
+ * @since 2022-02-12 16:16:40
+ */
+@Api(tags = "机构协议记录表")
+@RestController
+@RequestMapping("/tenantContractRecord")
+public class TenantContractRecordController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private TenantContractRecordService tenantContractRecordService;
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tenantId", dataType = "Integer", value = "机构Id"),
+            @ApiImplicitParam(name = "type", dataType = "Integer", value = "协议类型 0机构开通 1机构续费 待补充"),
+            @ApiImplicitParam(name = "page", dataType = "Integer", value = "页数"),
+            @ApiImplicitParam(name = "rows", dataType = "Integer", value = "每页数量"),
+    })
+    @ApiOperation("分页查询")
+    @PostMapping("/queryPage")
+    @PreAuthorize("@pcs.hasPermissions('tenantContractRecord/queryPage')")
+    public HttpResponseResult<PageInfo<TenantContractRecord>> queryPage(@RequestBody Map<String, Object> param) {
+        return succeed(tenantContractRecordService.queryPage(param));
+    }
+
+}
+

+ 100 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TenantContractTemplateController.java

@@ -0,0 +1,100 @@
+package com.ym.mec.web.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.TenantContractTemplateDto;
+import com.ym.mec.biz.dal.entity.TenantContractTemplate;
+import com.ym.mec.biz.dal.page.TenantContractTemplateQueryInfo;
+import com.ym.mec.biz.service.TenantContractTemplateService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.tenant.TenantContextHolder;
+
+@RequestMapping("tenantContractTemplate")
+@Api(tags = "机构协议模板")
+@RestController
+public class TenantContractTemplateController extends BaseController {
+
+	@Autowired
+	private TenantContractTemplateService tenantContractTemplateService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+	@ApiOperation("分页查询")
+	@GetMapping(value = "/list")
+	@PreAuthorize("@pcs.hasPermissions('tenantContractTemplate/list')")
+	public HttpResponseResult<PageInfo<TenantContractTemplateDto>> getList(TenantContractTemplateQueryInfo queryInfo) {
+		return succeed(tenantContractTemplateService.queryPageList(queryInfo));
+	}
+
+	@ApiOperation("单查询")
+	@ApiImplicitParam(name = "id", value = "ID编号", required = true, dataType = "Integer", paramType = "path")
+	@GetMapping(value = "/query")
+	@PreAuthorize("@pcs.hasPermissions('tenantContractTemplate/query')")
+	public HttpResponseResult<TenantContractTemplate> query(Integer id) {
+		return succeed(tenantContractTemplateService.get(id));
+	}
+
+	@ApiOperation("查询最新启用的协议模板")
+	@GetMapping(value = "/queryLatestContractTemplate")
+	@PreAuthorize("@pcs.hasPermissions('tenantContractTemplate/queryLatestContractTemplate')")
+	public HttpResponseResult<TenantContractTemplate> queryLatestContractTemplate() {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+
+		if (sysUser == null || sysUser.getId() == null) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
+		}
+		return succeed(tenantContractTemplateService.queryLatestContractTemplate(TenantContextHolder.getTenantId(), null, null));
+	}
+
+	@ApiOperation("新增")
+	@PostMapping(value = "/add", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+	@PreAuthorize("@pcs.hasPermissions('tenantContractTemplate/add')")
+	public Object add(TenantContractTemplate tenantContractTemplate) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        
+        if(sysUser == null || sysUser.getId() == null){
+        	return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+		
+		tenantContractTemplate.setStatus(false);
+		tenantContractTemplate.setModifyBy(sysUser.getId());
+		tenantContractTemplate.setTenantId(TenantContextHolder.getTenantId());
+		tenantContractTemplateService.createContractTemplate(tenantContractTemplate);
+		return succeed();
+	}
+
+	@ApiOperation("更新")
+	@PostMapping(value = "/update", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+	@PreAuthorize("@pcs.hasPermissions('tenantContractTemplate/update')")
+	public Object update(TenantContractTemplate tenantContractTemplate) {
+		tenantContractTemplateService.update(tenantContractTemplate);
+		return succeed();
+	}
+
+	@ApiOperation("启用协议")
+	@PostMapping(value = "/updateStatus", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+	@PreAuthorize("@pcs.hasPermissions('tenantContractTemplate/updateStatus')")
+	public Object enableContract(int id) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        
+		tenantContractTemplateService.enableContract(id, sysUser.getId());
+		return succeed();
+	}
+
+}

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

@@ -3,6 +3,7 @@ package com.ym.mec.web.controller;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.TenantInfoDto;
+import com.ym.mec.biz.dal.entity.TenantContractRecord;
 import com.ym.mec.biz.dal.entity.TenantInfo;
 import com.ym.mec.biz.dal.entity.TenantProductSumm;
 import com.ym.mec.biz.service.TenantInfoSendMsgService;
@@ -11,7 +12,6 @@ import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.tenant.TenantContextHolder;
-import com.ym.mec.thirdparty.yqpay.Msg;
 import com.ym.mec.util.validator.ValidationKit;
 import io.swagger.annotations.*;
 import org.apache.commons.lang3.StringUtils;
@@ -25,6 +25,7 @@ import javax.validation.Valid;
 import java.math.BigDecimal;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 
 import static com.ym.mec.biz.service.impl.TenantInfoSendMsgServiceImpl.OPEN;
 
@@ -70,7 +71,7 @@ public class TenantInfoController extends BaseController {
         Map<String, Object> openPar = tenantInfoService.opsTenantState(id, state);
         //有返回密码(第一次开通机构会生成登录密码并返回)就发送邮件及短信提醒
         String pw = WrapperUtil.toStr(openPar, "pw");
-        TenantInfo tenantInfo =(TenantInfo) openPar.get("tenantInfo");
+        TenantInfo tenantInfo = (TenantInfo) openPar.get("tenantInfo");
         if (StringUtils.isNotBlank(pw) && Objects.nonNull(tenantInfo)) {
             Object[] msg = {tenantInfo.getName(), tenantInfo.getPhone(), pw, "https://online.dayaedu.com"};
             tenantInfoSendMsgService.platformSendToAll(OPEN, tenantInfo.getUserId(), tenantInfo.getEmail(), tenantInfo.getPhone(), msg);
@@ -124,6 +125,21 @@ public class TenantInfoController extends BaseController {
         return succeed(tenantInfoService.queryPage(param));
     }
 
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", dataType = "Integer", value = "机构id"),
+            @ApiImplicitParam(name = "type", dataType = "Integer", value = "0开通 1续费"),
+            @ApiImplicitParam(name = "renewCount", dataType = "Integer", value = "若是续费,则需要传入续费时长"),
+    })
+    @ApiOperation("获取机构付款及续费时需要预览的协议")
+    @GetMapping(value = "/getContract/{id}")
+    public Object getContract(@PathVariable("id") Integer id, Integer type, Integer renewCount) {
+        TenantContractRecord.TenantContractRecordEnum en = Optional.ofNullable(type)
+                .filter(t -> TenantContractRecord.TenantContractRecordEnum.RENEW.getType().equals(t))
+                .map(t -> TenantContractRecord.TenantContractRecordEnum.RENEW)
+                .orElse(TenantContractRecord.TenantContractRecordEnum.OPEN);
+        return succeed(tenantInfoService.getContract(id, en, renewCount));
+    }
+
     @ApiOperation("机构支付")
     @GetMapping(value = "/pay/{id}")
     public Object pay(@ApiParam(value = "机构ID", required = true) @PathVariable("id") Integer id) throws Exception {

+ 53 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TenantPreJoinController.java

@@ -0,0 +1,53 @@
+package com.ym.mec.web.controller;
+
+
+import com.ym.mec.biz.dal.dto.TenantPreJoinDto;
+import com.ym.mec.biz.dal.entity.TenantPreJoin;
+import com.ym.mec.biz.service.TenantPreJoinService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.Map;
+
+/**
+ * 机构入驻表(预加入)(TenantPreJoin)表控制层
+ *
+ * @author hgw
+ * @since 2022-02-09 14:38:08
+ */
+@Api(tags = "机构入驻")
+@RestController
+@RequestMapping("/tenantPreJoin")
+public class TenantPreJoinController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private TenantPreJoinService tenantPreJoinService;
+
+    @ApiOperation("分页查询")
+    @PostMapping("/queryPage")
+    @PreAuthorize("@pcs.hasPermissions('tenantPreJoin/queryPage')")
+    public HttpResponseResult<PageInfo<TenantPreJoin>> queryPage(@RequestBody Map<String, Object> param) {
+        return succeed(tenantPreJoinService.queryPage(param));
+    }
+
+    @ApiOperation("添加")
+    @PostMapping("/add")
+    public HttpResponseResult add(@Valid  @RequestBody TenantPreJoinDto dto) {
+        tenantPreJoinService.insert(dto);
+        return succeed();
+    }
+
+}
+

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

@@ -52,6 +52,10 @@ public class EduMusicScoreController extends BaseController {
         
         TenantConfig tenantConfig = tenantConfigService.getOne(new QueryWrapper<TenantConfig>().eq("tenant_id_", sysUser.getTenantId()));
         
+        if(tenantConfig == null){
+        	return failed("当前用户所在机构信息查询失败");
+        }
+        
         return succeed(sysMusicScoreCategoriesService.queryCategoriesTreeList(tenantConfig.getTeachingMaterialId()));
     }
 

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

@@ -66,6 +66,7 @@ public class EduStudentRegistrationController extends BaseController {
     	
     	Map<String, Object> params = new HashMap<String, Object>();
 		params.put("musicGroupId", queryInfo.getMusicGroupId());
+		params.put("tenantId", queryInfo.getTenantId());
     	List<StudentPreRegistration> studentPreRegistrationList = studentPreRegistrationService.findAll(params);
     	
     	int instrument = 0;

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است