ソースを参照

Merge branch 'master' of http://git.dayaedu.com/yonge/mec into origin_master

# Conflicts:
#	mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImGroupModel.java
yonge 4 年 前
コミット
7402a759c4
80 ファイル変更1748 行追加412 行削除
  1. 11 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUser.java
  2. 41 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/enums/CertificateTypeEnum.java
  3. 6 2
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  4. 17 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  5. 24 10
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeDao.java
  6. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/HfMemberDao.java
  7. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderStudentDetailDao.java
  8. 4 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentCourseFeeDetailDao.java
  9. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  10. 26 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  11. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SubjectDao.java
  12. 10 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysPaymentConfigDao.java
  13. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MergeClassSplitClassAffirmDto.java
  14. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderDto.java
  15. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupRegsDto.java
  16. 20 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SimpleUserDto.java
  17. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentRecoverInfoDto.java
  18. 5 5
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleTeacherSalary.java
  19. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/HfMember.java
  20. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalender.java
  21. 167 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderStudentDetail.java
  22. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupStudentClassAdjust.java
  23. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRecoverDto.java
  24. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRegistration.java
  25. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/ClassGroupQueryInfo.java
  26. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/EmployeeQueryInfo.java
  27. 38 6
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  28. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderDetailService.java
  29. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderStudentDetailService.java
  30. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupService.java
  31. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupSubjectPlanService.java
  32. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  33. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysPaymentConfigService.java
  34. 221 27
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  35. 15 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  36. 15 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  37. 28 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  38. 41 16
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  39. 50 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  40. 19 53
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  41. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderStudentDetailServiceImpl.java
  42. 114 107
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  43. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSubjectPlanServiceImpl.java
  44. 86 17
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PayServiceImpl.java
  45. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  46. 6 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  47. 5 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java
  48. 89 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  49. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  50. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysPaymentConfigServiceImpl.java
  51. 12 21
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  52. 5 3
      mec-biz/src/main/resources/config/contracts/product.ftl
  53. 50 21
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  54. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  55. 5 6
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  56. 27 12
      mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml
  57. 21 1
      mec-biz/src/main/resources/config/mybatis/HfMemberMapper.xml
  58. 2 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  59. 1 1
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml
  60. 115 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderStudentDetailMapper.xml
  61. 8 0
      mec-biz/src/main/resources/config/mybatis/StudentCourseFeeDetailMapper.xml
  62. 6 1
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  63. 1 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  64. 15 1
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  65. 1 1
      mec-biz/src/main/resources/config/mybatis/SubjectMapper.xml
  66. 3 0
      mec-biz/src/main/resources/config/mybatis/SysPaymentConfigMapper.xml
  67. 11 11
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  68. 0 2
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImGroupMember.java
  69. 13 2
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImGroupModel.java
  70. 4 0
      mec-common/common-core/src/main/java/com/ym/mec/common/page/PageInfo.java
  71. 0 6
      mec-im/src/main/java/com/ym/service/Impl/GroupServiceImpl.java
  72. 1 1
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  73. 36 7
      mec-web/src/main/java/com/ym/mec/web/controller/AdapayController.java
  74. 53 2
      mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java
  75. 2 2
      mec-web/src/main/java/com/ym/mec/web/controller/EmployeeController.java
  76. 2 2
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  77. 14 0
      mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupController.java
  78. 14 0
      mec-web/src/main/java/com/ym/mec/web/controller/SysPaymentConfigController.java
  79. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java
  80. BIN
      mec-web/src/main/resources/excelTemplate/财务支出导入模板.xls

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

@@ -1,5 +1,6 @@
 package com.ym.mec.auth.api.entity;
 
+import com.ym.mec.auth.api.enums.CertificateTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
@@ -130,6 +131,16 @@ public class SysUser implements Serializable{
 	@ApiModelProperty(value = "邮编",required = false)
 	private String postalCode;
 
+	private String certificateType;
+
+	public String getCertificateType() {
+		return certificateType;
+	}
+
+	public void setCertificateType(String certificateType) {
+		this.certificateType = certificateType;
+	}
+
 	public Integer getServiceTag() {
 		return serviceTag;
 	}

+ 41 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/enums/CertificateTypeEnum.java

@@ -0,0 +1,41 @@
+package com.ym.mec.auth.api.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/1/6 0006
+ **/
+public enum CertificateTypeEnum implements BaseEnum<String, CertificateTypeEnum> {
+
+    IDENTITY("IDENTITY", "身份证"),
+    HK_MAC("HK_MAC", "港澳居民往来内地通行证"),
+    TAIWAN("TAIWAN", "台湾居民往来内地通行证"),
+    FOREIGN_PASSPORT("FOREIGN_PASSPORT", "外国护照");
+
+    private String code;
+
+    private String msg;
+
+    CertificateTypeEnum(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

+ 6 - 2
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -32,6 +32,7 @@
         <result column="is_super_admin_" property="isSuperAdmin"/>
         <result column="current_grade_" property="currentGrade"/>
         <result column="current_class_" property="currentClass"/>
+        <result column="certificate_type_" property="certificateType"/>
     </resultMap>
 
     <!-- 查询条件 -->
@@ -67,9 +68,9 @@
             keyProperty="id">
         INSERT INTO sys_user
         (is_super_admin_,im_token_,id_,username_,salt_,phone_,avatar_,organ_id_,create_time_,update_time_,wx_openid_,qq_openid_,user_type_,
-        gender_,nation_,birthdate_,email_,id_card_no_,wechat_id_,real_name_)
+        gender_,nation_,birthdate_,email_,id_card_no_,wechat_id_,real_name_,certificate_type_)
         VALUES(#{isSuperAdmin},#{imToken},#{id},#{username},#{salt},#{phone},#{avatar},#{organId},now(),now(),#{wxOpenid},#{qqOpenid},#{userType},
-        #{gender},#{nation},#{birthdate},#{email},#{idCardNo},#{wechatId},#{realName})
+        #{gender},#{nation},#{birthdate},#{email},#{idCardNo},#{wechatId},#{realName},#{certificateType})
     </insert>
     <insert id="insertTeacher">
         INSERT INTO teacher
@@ -151,6 +152,9 @@
             <if test="isSuperAdmin != null">
                 is_super_admin_ = #{isSuperAdmin},
             </if>
+            <if test="certificateType != null">
+                certificate_type_ = #{certificateType},
+            </if>
         </set>
         WHERE id_ = #{id}
     </update>

+ 17 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java

@@ -240,7 +240,7 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @param userId
      * @return
      */
-    List<ImGroupModel> queryEducationGroups(@Param("userId") Integer userId, @Param("organId") Integer organId);
+    List<ImGroupModel> queryEducationGroups(@Param("transferUserId") Integer transferUserId, @Param("userId") Integer userId, @Param("organId") Integer organId);
 
     /**
      * 获取运营主管关联的群列表
@@ -248,7 +248,7 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @param userId
      * @return
      */
-    List<ImGroupModel> queryTeamTeacherGroups(@Param("userId") Integer userId, @Param("organId") Integer organId);
+    List<ImGroupModel> queryTeamTeacherGroups(@Param("transferUserId") Integer transferUserId, @Param("userId") Integer userId, @Param("organId") Integer organId);
 
     /**
      * 获取乐队指导关联的群列表
@@ -256,7 +256,7 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @param userId
      * @return
      */
-    List<ImGroupModel> queryDirectorGroups(@Param("userId") Integer userId, @Param("organId") Integer organId);
+    List<ImGroupModel> queryDirectorGroups(@Param("transferUserId") Integer transferUserId, @Param("userId") Integer userId, @Param("organId") Integer organId);
 
     /**
      * 获取未分配合奏的单技班列表
@@ -792,4 +792,18 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @return
      */
     Integer getMusicGroupHighClassNumBySubject(@Param("musicGroupId") String musicGroupId, @Param("subjectIds") String subjectIds, @Param("type") ClassGroupTypeEnum type);
+
+    /**
+     * count班级数量
+     * @param params
+     * @return
+     */
+    int countClassGroup(Map<String, Object> params);
+
+    /**
+     * 获取班级列表
+     * @param params
+     * @return
+     */
+    List<ClassGroupTeachersDto> queryClassGroupPage(Map<String, Object> params);
 }

+ 24 - 10
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/EmployeeDao.java

@@ -19,17 +19,18 @@ public interface EmployeeDao extends BaseDAO<Integer, Employee> {
      * @Date: 2019/9/17
      * 根据部门获取下面的员工
      */
-    List<EmployeeDto> queryEmployByOrganId(Map<String,Object> params);
+    List<EmployeeDto> queryEmployByOrganId(Map<String, Object> params);
 
     /**
      * @Author: Joburgess
      * @Date: 2019/9/17
      * 部门员工统计
      */
-    int queryEmployByOrganIdCount(Map<String,Object> params);
+    int queryEmployByOrganIdCount(Map<String, Object> params);
 
     /**
      * 修改密码
+     *
      * @param userID
      * @param password
      */
@@ -51,8 +52,10 @@ public interface EmployeeDao extends BaseDAO<Integer, Employee> {
      * 修改用户离职日期
      */
     int updateUserDemissionDate(@Param("userID") Integer userID);
+
     /**
      * 根据手机号查询对象
+     *
      * @param phone
      * @return
      */
@@ -60,46 +63,50 @@ public interface EmployeeDao extends BaseDAO<Integer, Employee> {
 
     /**
      * 删除用户角色
+     *
      * @param userId
      */
     void delEmployeeRole(Integer userId);
 
     /**
      * 批量新增用户角色
+     *
      * @param id
      * @param roleIds
      */
-    void batchAddEmployeeRole(@Param("userId") Integer id, @Param("roleIds")List<Integer> roleIds);
+    void batchAddEmployeeRole(@Param("userId") Integer id, @Param("roleIds") List<Integer> roleIds);
 
     /**
      * 获取用户权限列表
+     *
      * @param userId
      * @return
      */
     List<Integer> queryUserRole(Integer userId);
 
     /**
+     * @param roleIds:  角色编号列表
+     * @param organIds: 部门编号列表
+     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
      * @describe 根据角色和用户查找用户
      * @author Joburgess
      * @date 2020/3/12
-     * @param roleIds: 角色编号列表
-     * @param organIds: 部门编号列表
-     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
      */
     List<SimpleUserDto> findByRole(@Param("roleIds") String roleIds,
                                    @Param("organIds") String organIds);
 
     /**
+     * @param userIds:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
      * @describe 根据用户编号获取用户
      * @author Joburgess
      * @date 2020/3/12
-     * @param userIds:
-     * @return java.util.List<com.ym.mec.biz.dal.dto.SimpleUserDto>
      */
     List<SimpleUserDto> findByIds(@Param("userIds") List<Integer> userIds);
 
     /**
      * 是否有课程组关联的教务老师
+     *
      * @param employeeId
      * @return
      */
@@ -107,13 +114,15 @@ public interface EmployeeDao extends BaseDAO<Integer, Employee> {
 
     /**
      * 修改知道老师的教务老师关联
+     *
      * @param currentUserId
      * @param targetUserId
      */
     void updateEducationTeacherId(@Param("currentUserId") Integer currentUserId, @Param("targetUserId") Integer targetUserId);
 
     /**
-     *是否有未上的课
+     * 是否有未上的课
+     *
      * @param employeeId
      * @return
      */
@@ -121,6 +130,7 @@ public interface EmployeeDao extends BaseDAO<Integer, Employee> {
 
     /**
      * 获取维修技师所在分部
+     *
      * @param userId
      * @return
      */
@@ -128,6 +138,7 @@ public interface EmployeeDao extends BaseDAO<Integer, Employee> {
 
     /**
      * 教务老师所在分部列表
+     *
      * @param userId
      * @return
      */
@@ -135,6 +146,7 @@ public interface EmployeeDao extends BaseDAO<Integer, Employee> {
 
     /**
      * 运营主管所在分部列表
+     *
      * @param userId
      * @return
      */
@@ -142,6 +154,7 @@ public interface EmployeeDao extends BaseDAO<Integer, Employee> {
 
     /**
      * 乐队指导所在分部列表
+     *
      * @param userId
      * @return
      */
@@ -149,7 +162,8 @@ public interface EmployeeDao extends BaseDAO<Integer, Employee> {
 
     /**
      * 员工离职
+     *
      * @param employeeLevelDtos
      */
-    void employeeLevel(List<EmployeeLevelDto> employeeLevelDtos);
+    void employeeLevel(@Param("employeeLevelDtos") List<EmployeeLevelDto> employeeLevelDtos);
 }

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

@@ -18,8 +18,15 @@ public interface HfMemberDao extends BaseDAO<Integer, HfMember> {
 
     /**
      * 根据名字获取商户信息
+     *
      * @param name
      * @return
      */
     HfMember getByName(@Param("name") String name);
+
+    /**
+     * 获取分佣账户中需要验证每月收最大金额的账户
+     * @return
+     */
+    List<HfMember> getNeedRouteMerNos();
 }

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderStudentDetailDao.java

@@ -0,0 +1,14 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
+import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface MusicGroupPaymentCalenderStudentDetailDao extends BaseDAO<Integer, MusicGroupPaymentCalenderStudentDetail> {
+
+    void batchInsert(@Param("musicGroupPaymentCalenderStudentDetails") List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails, @Param("calenderId") Long calenderId);
+
+    void batchUpdate(@Param("musicGroupPaymentCalenderStudentDetails") List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails);
+}

+ 4 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentCourseFeeDetailDao.java

@@ -1,10 +1,12 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.biz.dal.entity.CourseHomework;
 import com.ym.mec.biz.dal.entity.StudentCourseFeeDetail;
 import com.ym.mec.common.dal.BaseDAO;
 
+import java.util.List;
+
 public interface StudentCourseFeeDetailDao extends BaseDAO<Long, StudentCourseFeeDetail>{
 
-	
+
+    void batchInsert(List<StudentCourseFeeDetail> studentCourseFeeDetails);
 }

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

@@ -98,6 +98,7 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     List<StudentServeCourseDto> getServeStudentCourseStartTimes(@Param("monday") String monday);
 
     List<StudentServeCourseDto> getStudentFutureCourseInfo(@Param("monday") String monday,
+                                                           @Param("nextMonday") String nextMonday,
                                                            @Param("studentIds") List<Integer> studentIds);
 
     /**

+ 26 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.dao;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -264,11 +265,14 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
     int findMusicGroupStudentNum(@Param("musicGroupId") String musicGroupId);
 
     /**
-     * 更新用户信息
+     * 更新用户证件信息
      *
      * @return
      */
-    int updateUser(@Param("id") Integer id, @Param("realName") String realName, @Param("idCardNo") String idCardNo);
+    int updateUser(@Param("id") Integer id,
+                   @Param("realName") String realName,
+                   @Param("idCardNo") String idCardNo,
+                   @Param("certificateType") String certificateType);
 
     /**
      * 获取乐团在读人数
@@ -393,11 +397,30 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      * @return
      */
     Integer getMusicGroupSubjectStudentNum(@Param("musicGroupId") String musicGroupId, @Param("subjectIds") String subjectIds);
-    
+
     /**
      * 查询用户所在乐团信息
+     *
      * @param userId
      * @return
      */
     List<StudentMusicGroupDto> queryStudentMusicGroupInfo(Integer userId);
+
+    /**
+     * 获取学员剩余课程费用
+     *
+     * @param classGroupId
+     * @param studentIds
+     * @return
+     */
+    List<Map<Integer, BigDecimal>> querySurplusCourseFeeByClassGroupId(@Param("classGroupId") Integer classGroupId, @Param("studentIds") String studentIds);
+
+    /**
+     * 根据学员编号列表和乐团编号获取学员注册列表
+     *
+     * @param studentIds
+     * @param oldMusicGroupId
+     * @return
+     */
+    List<StudentRegistration> queryByUserIdsAndMusicGroupId(@Param("studentIds") String studentIds, @Param("oldMusicGroupId") String oldMusicGroupId);
 }

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

@@ -144,7 +144,7 @@ public interface SubjectDao extends BaseDAO<Integer, Subject> {
      * @param studentInfos:
      * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.String>>
      */
-    List<Map<Integer, Integer>> findStudentSubjectIdMaps(@Param("studentInfos") List<StudentAttendanceViewDto> studentInfos);
+    List<Map<Integer, Long>> findStudentSubjectIdMaps(@Param("studentInfos") List<StudentAttendanceViewDto> studentInfos);
 
     /**
      * 获取声部名称

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

@@ -10,6 +10,7 @@ import java.util.List;
 public interface SysPaymentConfigDao extends BaseDAO<Integer, SysPaymentConfig> {
     /**
      * 获取分部的收费配置
+     *
      * @param organId
      * @return
      */
@@ -17,6 +18,7 @@ public interface SysPaymentConfigDao extends BaseDAO<Integer, SysPaymentConfig>
 
     /**
      * 根据分部ids获取收费配置
+     *
      * @param organIds
      * @return
      */
@@ -25,14 +27,21 @@ public interface SysPaymentConfigDao extends BaseDAO<Integer, SysPaymentConfig>
 
     /**
      * 根据支付渠道获取账户
+     *
      * @param payType
      * @return
      */
     List<SysPaymentConfig> getPaymentConfigs(@Param("payType") PaymentChannelEnum payType);
 
     /**
-     *
      * @return
      */
     List<SysPaymentConfig> getOutAccounts(@Param("payType") PaymentChannelEnum payType);
+
+    /**
+     * 根据汇付账户获取配置
+     * @param merNo
+     * @return
+     */
+    SysPaymentConfig findPaymentConfigByMerNo(@Param("merNo") String merNo);
 }

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MergeClassSplitClassAffirmDto.java

@@ -5,18 +5,35 @@ import java.util.List;
 import java.util.Map;
 
 public class MergeClassSplitClassAffirmDto {
+    //新建班级参数
     private List<ClassGroup4MixDto> classGroup4MixDtos;
 
+    //缴费项目参数
     private List<MusicGroupPaymentCalenderDto> musicGroupPaymentCalenderDtos;
 
+    //需要合并的班级列表
     private List<Integer> classGroupIds;
 
+    //主班
+    private Integer masterClassGroupId;
+
+    //所选学员列表
     private List<Integer> studentIds;
 
+    //班级和学员关联
     private List<Map<Integer,String>> classGroupStudents;
 
+    //最大的可排课时长
     private Map<String,Long> classCourseMinuteMap;
 
+    public Integer getMasterClassGroupId() {
+        return masterClassGroupId;
+    }
+
+    public void setMasterClassGroupId(Integer masterClassGroupId) {
+        this.masterClassGroupId = masterClassGroupId;
+    }
+
     public Map<String, Long> getClassCourseMinuteMap() {
         return classCourseMinuteMap;
     }

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupPaymentCalenderDto.java

@@ -8,6 +8,8 @@ import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
+import io.swagger.annotations.ApiModelProperty;
 
 public class MusicGroupPaymentCalenderDto {
 
@@ -37,6 +39,17 @@ public class MusicGroupPaymentCalenderDto {
 
 	private List<String> IgnoreBatchNoList = null;
 
+	@ApiModelProperty(value = "跨团合并时缴费项目中学员的缴费明细")
+	private List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails;
+
+	public List<MusicGroupPaymentCalenderStudentDetail> getMusicGroupPaymentCalenderStudentDetails() {
+		return musicGroupPaymentCalenderStudentDetails;
+	}
+
+	public void setMusicGroupPaymentCalenderStudentDetails(List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails) {
+		this.musicGroupPaymentCalenderStudentDetails = musicGroupPaymentCalenderStudentDetails;
+	}
+
 	public List<String> getIgnoreBatchNoList() {
 		return IgnoreBatchNoList;
 	}

+ 30 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupRegsDto.java

@@ -0,0 +1,30 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+public class MusicGroupRegsDto {
+
+    @ApiModelProperty(value = "乐团编号", required = true)
+    private String musicGroupId;
+
+    @ApiModelProperty(value = "学员注册ids", required = true)
+    private List<Long> registerIds;
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public List<Long> getRegisterIds() {
+        return registerIds;
+    }
+
+    public void setRegisterIds(List<Long> registerIds) {
+        this.registerIds = registerIds;
+    }
+}

+ 20 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SimpleUserDto.java

@@ -1,7 +1,6 @@
 package com.ym.mec.biz.dal.dto;
 
-import com.ym.mec.auth.api.entity.SysUser;
-import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.StringUtils;
 
 import java.math.BigDecimal;
 
@@ -29,8 +28,27 @@ public class SimpleUserDto {
 
     private String phone;
 
+    private String organIds;
+
+    private String[] organIdList;
+
     private BigDecimal actualAmount;
 
+    public String getOrganIds() {
+        return organIds;
+    }
+
+    public void setOrganIds(String organIds) {
+        this.organIds = organIds;
+        if(StringUtils.isNotEmpty(organIds)){
+            this.organIdList = organIds.split(",");
+        }
+    }
+
+    public String[] getOrganIdList() {
+        return organIdList;
+    }
+
     public BigDecimal getActualAmount() {
         return actualAmount;
     }

+ 4 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentRecoverInfoDto.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
 import java.time.LocalDate;
+import java.util.Date;
 
 /**
  * @Author Joburgess
@@ -20,13 +21,13 @@ public class StudentRecoverInfoDto {
 
     private int giveCourseTimes;
 
-    private LocalDate expireDate;
+    private Date expireDate;
 
-    public LocalDate getExpireDate() {
+    public Date getExpireDate() {
         return expireDate;
     }
 
-    public void setExpireDate(LocalDate expireDate) {
+    public void setExpireDate(Date expireDate) {
         this.expireDate = expireDate;
     }
 

+ 5 - 5
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseScheduleTeacherSalary.java

@@ -35,7 +35,7 @@ public class CourseScheduleTeacherSalary {
 	private String userName;
 	
 	/** 预计薪水 */
-	private java.math.BigDecimal expectSalary = BigDecimal.ZERO;
+	private java.math.BigDecimal expectSalary;
 	
 	/**  */
 	private java.util.Date createTime;
@@ -44,13 +44,13 @@ public class CourseScheduleTeacherSalary {
 	private java.util.Date updateTime;
 	
 	/** 补贴 */
-	private java.math.BigDecimal subsidy = BigDecimal.ZERO;
+	private java.math.BigDecimal subsidy;
 	
 	/** 实际薪水 */
-	private java.math.BigDecimal actualSalary = BigDecimal.ZERO;
+	private java.math.BigDecimal actualSalary;
 
 	/** 课酬结算时计算的课酬 */
-	private java.math.BigDecimal teacherActualSalary = BigDecimal.ZERO;
+	private java.math.BigDecimal teacherActualSalary;
 	
 	/** 结算时间 */
 	private java.util.Date settlementTime;
@@ -59,7 +59,7 @@ public class CourseScheduleTeacherSalary {
 	
 	private CourseSchedule courseSchedule = new CourseSchedule();
 
-	private BigDecimal reduceSalary = BigDecimal.ZERO;
+	private BigDecimal reduceSalary;
 
 	private TeacherSalaryConfirmStatus confirmStatus;
 

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/HfMember.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.entity;
 import io.swagger.annotations.ApiModelProperty;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 public class HfMember {
@@ -71,6 +72,15 @@ public class HfMember {
     @ApiModelProperty(value = "备注",required = true)
     private String memo;
 
+    @ApiModelProperty(value = "每月最大收款金额",required = true)
+    private BigDecimal monthMaxReceipt;
+
+    @ApiModelProperty(value = "满额后收款账户",required = true)
+    private String routeMemberId;
+
+    @ApiModelProperty(value = "满额后收款分部",required = true)
+    private Integer routeOrganId;
+
     public Integer getId() {
         return Id;
     }
@@ -246,4 +256,28 @@ public class HfMember {
     public void setMemo(String memo) {
         this.memo = memo;
     }
+
+    public BigDecimal getMonthMaxReceipt() {
+        return monthMaxReceipt;
+    }
+
+    public void setMonthMaxReceipt(BigDecimal monthMaxReceipt) {
+        this.monthMaxReceipt = monthMaxReceipt;
+    }
+
+    public String getRouteMemberId() {
+        return routeMemberId;
+    }
+
+    public void setRouteMemberId(String routeMemberId) {
+        this.routeMemberId = routeMemberId;
+    }
+
+    public Integer getRouteOrganId() {
+        return routeOrganId;
+    }
+
+    public void setRouteOrganId(Integer routeOrganId) {
+        this.routeOrganId = routeOrganId;
+    }
 }

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

@@ -57,7 +57,7 @@ public class MusicGroupPaymentCalender {
 	}
 
 	public enum PaymentType implements BaseEnum<String, PaymentType> {
-		ADD_STUDENT("新增学员"), ADD_COURSE("临时加课"), MUSIC_APPLY("乐团报名"),MUSIC_RENEW("乐团续费");
+		ADD_STUDENT("新增学员"), ADD_COURSE("临时加课"), MUSIC_APPLY("乐团报名"),MUSIC_RENEW("乐团续费"),SPAN_GROUP_CLASS_ADJUST("跨团班级调整");
 
 		private String desc;
 

+ 167 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalenderStudentDetail.java

@@ -0,0 +1,167 @@
+package com.ym.mec.biz.dal.entity;
+
+import java.util.Objects;
+
+/**
+ * 对应数据库表(music_group_payment_calender_student_detail):
+ */
+public class MusicGroupPaymentCalenderStudentDetail {
+
+	/**  */
+	private Integer id;
+	
+	/**  */
+	private Integer userId;
+	
+	/**  */
+	private String phone;
+	
+	/**  */
+	private String username;
+	
+	/** 原价 */
+	private java.math.BigDecimal courseOriginalPrice;
+	
+	/** 现价 */
+	private java.math.BigDecimal courseCurrentPrice;
+	
+	/** 课程类型 */
+	private String courseType;
+	
+	/** 课程时长 */
+	private Long courseTime;
+	
+	/** 班级编号 */
+	private Integer classGroupId;
+	
+	/** 缴费项目编号 */
+	private Long calenderId;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	/**  */
+	private java.util.Date updateTime;
+	
+	public void setId(Integer id){
+		this.id = id;
+	}
+	
+	public Integer getId(){
+		return this.id;
+	}
+			
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+	
+	public Integer getUserId(){
+		return this.userId;
+	}
+			
+	public void setPhone(String phone){
+		this.phone = phone;
+	}
+	
+	public String getPhone(){
+		return this.phone;
+	}
+			
+	public void setUsername(String username){
+		this.username = username;
+	}
+	
+	public String getUsername(){
+		return this.username;
+	}
+			
+	public void setCourseOriginalPrice(java.math.BigDecimal courseOriginalPrice){
+		this.courseOriginalPrice = courseOriginalPrice;
+	}
+	
+	public java.math.BigDecimal getCourseOriginalPrice(){
+		return this.courseOriginalPrice;
+	}
+			
+	public void setCourseCurrentPrice(java.math.BigDecimal courseCurrentPrice){
+		this.courseCurrentPrice = courseCurrentPrice;
+	}
+	
+	public java.math.BigDecimal getCourseCurrentPrice(){
+		return this.courseCurrentPrice;
+	}
+			
+	public void setCourseType(String courseType){
+		this.courseType = courseType;
+	}
+	
+	public String getCourseType(){
+		return this.courseType;
+	}
+
+	public Long getCourseTime() {
+		return courseTime;
+	}
+
+	public void setCourseTime(Long courseTime) {
+		this.courseTime = courseTime;
+	}
+
+	public void setClassGroupId(Integer classGroupId){
+		this.classGroupId = classGroupId;
+	}
+	
+	public Integer getClassGroupId(){
+		return this.classGroupId;
+	}
+			
+	public void setCalenderId(Long calenderId){
+		this.calenderId = calenderId;
+	}
+	
+	public Long getCalenderId(){
+		return this.calenderId;
+	}
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	public void setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
+	}
+	
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
+	}
+
+	@Override
+	public String toString() {
+		return "MusicGroupPaymentCalenderStudentDetail{" +
+				"userId=" + userId +
+				", courseCurrentPrice=" + courseCurrentPrice +
+				", courseType='" + courseType + '\'' +
+				", classGroupId=" + classGroupId +
+				'}';
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (o == null || getClass() != o.getClass()) return false;
+		MusicGroupPaymentCalenderStudentDetail that = (MusicGroupPaymentCalenderStudentDetail) o;
+		return userId.equals(that.userId) &&
+				courseCurrentPrice.equals(that.courseCurrentPrice) &&
+				courseType.equals(that.courseType) &&
+				classGroupId.equals(that.classGroupId);
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(userId, courseCurrentPrice, courseType, classGroupId);
+	}
+}

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

@@ -43,12 +43,23 @@ public class MusicGroupStudentClassAdjust {
 	@ApiModelProperty(value = "每个班级对应的学员", required = false)
 	private String classGroupStudents;
 
+	@ApiModelProperty(value = "学员的缴费详情", required = false)
+	private String studentPaymentCalender;
+
 	private Integer operatorId;
 
 	private Date createTime;
 
 	private Date updateTime;
 
+	public String getStudentPaymentCalender() {
+		return studentPaymentCalender;
+	}
+
+	public void setStudentPaymentCalender(String studentPaymentCalender) {
+		this.studentPaymentCalender = studentPaymentCalender;
+	}
+
 	public String getDefaultCourseTypeMinute() {
 		return defaultCourseTypeMinute;
 	}

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRecoverDto.java

@@ -2,6 +2,8 @@ package com.ym.mec.biz.dal.entity;
 
 import io.swagger.annotations.ApiModelProperty;
 
+import java.util.Date;
+
 /**
  * @Author Joburgess
  * @Date 2019/12/23
@@ -16,6 +18,27 @@ public class StudentRecoverDto extends CourseGenerateDto{
     @ApiModelProperty(value = "教师编号")
     private Integer teacherId;
 
+    @ApiModelProperty(value = "课程截至时间")
+    private Date expireDate;
+
+    private int days;
+
+    public int getDays() {
+        return days;
+    }
+
+    public void setDays(int days) {
+        this.days = days;
+    }
+
+    public Date getExpireDate() {
+        return expireDate;
+    }
+
+    public void setExpireDate(Date expireDate) {
+        this.expireDate = expireDate;
+    }
+
     public Integer getTeacherId() {
         return teacherId;
     }

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

@@ -34,6 +34,9 @@ public class StudentRegistration {
     @ApiModelProperty(value = "身份证号", required = false)
     private String idCardNo;
 
+    @ApiModelProperty(value = "证件类型")
+    private String certificateType;
+
     @ApiModelProperty(value = "所属乐团(对应 music_group 表id)", required = false)
     private String musicGroupId;
 
@@ -118,6 +121,14 @@ public class StudentRegistration {
     
     private Integer chargeTypeId;
 
+    public String getCertificateType() {
+        return certificateType;
+    }
+
+    public void setCertificateType(String certificateType) {
+        this.certificateType = certificateType;
+    }
+
     public BigDecimal getBalance() {
         return balance;
     }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ClassGroupQueryInfo.java

@@ -22,9 +22,20 @@ public class ClassGroupQueryInfo extends QueryInfo {
     
     @ApiModelProperty(value = "班级名称", required = false)
     private String name;
+
+    @ApiModelProperty(value = "分部", required = false)
+    private String organIdList;
     
     private Integer delFlag;
 
+	public String getOrganIdList() {
+		return organIdList;
+	}
+
+	public void setOrganIdList(String organIdList) {
+		this.organIdList = organIdList;
+	}
+
 	public Integer getId() {
 		return id;
 	}

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/EmployeeQueryInfo.java

@@ -21,6 +21,18 @@ public class EmployeeQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "用户名或电话",required = false)
     private Long userNameOrPhone;
 
+    /** 是否离职 */
+    @ApiModelProperty(value = "是否离职",required = false)
+    private Boolean demissionflag;
+
+    public Boolean getDemissionflag() {
+        return demissionflag;
+    }
+
+    public void setDemissionflag(Boolean demissionflag) {
+        this.demissionflag = demissionflag;
+    }
+
     public String getJobNature() {
         return jobNature;
     }

+ 38 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java

@@ -1,10 +1,7 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.ClassGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupOrganizationCourseSettingsDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
@@ -16,6 +13,7 @@ import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
 import java.lang.reflect.InvocationTargetException;
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -373,6 +371,13 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
     List<ClassGroupTeachersDto> getClassGroupAndTeacherByType(String musicGroupId, ClassGroupTypeEnum type);
 
     /**
+     * 根据乐团id,班级类型获取班级和老师
+     * @param queryInfo
+     * @return
+     */
+    PageInfo<ClassGroupTeachersDto> queryClassGroupPage(ClassGroupQueryInfo queryInfo);
+
+    /**
      * 添加IM群组
      * @param classGroup
      * @param userIds
@@ -468,7 +473,7 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
     Map<String,Integer> classGroupSubCourseNum(Integer classGroupId);
 
     /**
-     * 进行中乐团-修改-班级详情-学员班级调整-生成默认缴费信息
+     * 进行中乐团-修改-班级详情-学员班级调整-获取所选班级最大可排课时长
      * @author zouxuan
      * @param classGroupIds
      * @return
@@ -501,4 +506,31 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      */
     HighClassGroupNumDto getSubjectMaxHighClassGroupNum(String musicGroupId,ClassGroupTypeEnum type,String subjectIds);
 
-    }
+    /**
+     * 进行中乐团-修改-班级详情-班级合并-获取学员需要补交的费用以及需要退还的课程余额
+     * @param mergeClassSplitClassAffirmDto
+     * @return
+     */
+    List<MusicGroupPaymentCalenderStudentDetail> queryStudentPaymentCalenders(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto);
+
+    /**
+     * 获取主班课程类型剩余价值
+     * @param masterClassGroupId
+     * @return
+     */
+    BigDecimal getMasterTotalPrice(Integer masterClassGroupId);
+
+    /**
+     * 获取班级列表最大可排课时长
+     * @param classGroupId
+     * @return
+     */
+    Map<String,Long> querySubCourseTime(Integer classGroupId);
+
+    /**
+     * 跨团班级合并提交
+     * @param mergeClassSplitClassAffirmDto
+     * @return
+     */
+    void spanGroupMergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto);
+}

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

@@ -6,7 +6,9 @@ import java.util.Set;
 
 import com.ym.mec.biz.dal.dto.FeeStudentDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
 import com.ym.mec.common.service.BaseService;
 
 public interface MusicGroupPaymentCalenderDetailService extends BaseService<Long, MusicGroupPaymentCalenderDetail> {
@@ -54,6 +56,13 @@ public interface MusicGroupPaymentCalenderDetailService extends BaseService<Long
 
     /**
      * 乐团缴费记录新增学员
+     * @param musicGroupPaymentCalender
+     * @param musicGroupPaymentCalenderStudentDetails
+     */
+    void batchAdd(MusicGroupPaymentCalender musicGroupPaymentCalender, List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails);
+
+    /**
+     * 乐团缴费记录新增学员
      * @param batchNo
      * @param userIdList
      */

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

@@ -0,0 +1,9 @@
+package com.ym.mec.biz.service;
+
+
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
+import com.ym.mec.common.service.BaseService;
+
+public interface MusicGroupPaymentCalenderStudentDetailService extends BaseService<Integer, MusicGroupPaymentCalenderStudentDetail> {
+
+}

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

@@ -17,6 +17,7 @@ import com.ym.mec.biz.dal.dto.UpdateExpectedNumDto;
 import com.ym.mec.biz.dal.entity.ApprovalStatus;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.page.MusicGroupQueryInfo;
 import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.page.PageInfo;
@@ -316,4 +317,12 @@ public interface MusicGroupService extends BaseService<String, MusicGroup> {
 	 * @param musicGroupIds
 	 */
 //	void musicGroupStudentFeePatch(List<String> musicGroupIds);
+
+	/**
+	 * 给乐团添加报名学生
+	 * @param musicGroupId
+	 * @param registerIds
+	 * @return
+	 */
+	List<StudentRegistration> addMusicGroupRegs(String musicGroupId,List<Long> registerIds);
 }

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

@@ -47,7 +47,7 @@ public interface MusicGroupSubjectPlanService extends BaseService<Integer, Music
      * @param musicGroupId
      * @param subjectId
      */
-    void addApplyStudentNum(String musicGroupId, Integer subjectId,int num) throws Exception;
+    void addApplyStudentNum(String musicGroupId, Integer subjectId,int num);
 
     /**
      * 批量修改声部规划费用

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java

@@ -137,6 +137,16 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
     Integer insertStudent(StudentAddDto studentAddDto) throws Exception;
 
     /**
+     * 跨团合班进行中加学员
+     * @param studentIds 学员列表
+     * @param oldMusicGroupId 原乐团
+     * @param newMusicGroupId 主乐团
+     * @param masterTotalPrice 主乐团剩余课程价值
+     * @return
+     */
+    void insertStudent(String studentIds,String oldMusicGroupId,String newMusicGroupId,BigDecimal masterTotalPrice);
+
+    /**
      * 获取班级学生
      *
      * @param musicGroupId

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

@@ -39,4 +39,11 @@ public interface SysPaymentConfigService extends BaseService<Integer, SysPayment
      * @return
      */
     AccountType checkAccountType(PaymentChannelEnum payType, String merNos);
+
+    /**
+     * 根据汇付获取配置
+     * @param merNo
+     * @return
+     */
+    SysPaymentConfig findPaymentConfigByMerNo(String merNo);
 }

+ 221 - 27
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -1,6 +1,8 @@
 package com.ym.mec.biz.service.impl;
 
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum.AUDITING;
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum.NO;
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.SPAN_GROUP_CLASS_ADJUST;
 import static com.ym.mec.biz.dal.enums.GroupType.COMM;
 import static com.ym.mec.biz.dal.enums.GroupType.MUSIC;
 import static com.ym.mec.biz.dal.enums.GroupType.PRACTICE;
@@ -30,7 +32,6 @@ import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.service.*;
-import com.ym.mec.common.service.IdGeneratorService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -100,6 +101,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Autowired
     private ClassGroupStudentMapperDao classGroupStudentMapperDao;
     @Autowired
+    private ClassGroupStudentMapperService classGroupStudentMapperService;
+    @Autowired
     private ClassGroupRelationDao classGroupRelationDao;
     @Autowired
     private ClassGroupTeacherMapperService classGroupTeacherMapperService;
@@ -165,8 +168,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Autowired
     private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
     @Autowired
-    private IdGeneratorService idGeneratorService;
-    @Autowired
     private MusicGroupStudentClassAdjustDao musicGroupStudentClassAdjustDao;
 
     @Override
@@ -907,7 +908,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     public List<ImGroupModel> queryUserGroups(Integer userId, String search) {
         List<ImGroupModel> imGroupModels = classGroupDao.queryUserMusicGroups(userId, search);
         imGroupModels.addAll(classGroupDao.queryUserVipGroups(userId, search));
-//        imGroupModels.addAll(classGroupDao.queryUserPracticeGroups(userId, search));
         imGroupModels.addAll(classGroupDao.queryUserCommGroups(userId, search));
         if (imGroupModels != null && imGroupModels.size() > 0) {
             imGroupModels.forEach(e -> {
@@ -1629,11 +1629,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             if (!CollectionUtils.isEmpty(tempIds)&&schedule.getGroupType() == MUSIC) {
                 List<Map<Integer, String>> studentSubjectNameMaps = subjectDao.findStudentSubjectNameMaps(tempIds);
                 Map<Integer, String> studentSubjectNameMap = MapUtil.convertIntegerMap(studentSubjectNameMaps);
-                List<Map<Integer, Integer>> studentSubjectIdMaps = subjectDao.findStudentSubjectIdMaps(tempIds);
-                Map<Integer, Integer> studentSubjectIdMap = MapUtil.convertIntegerMap(studentSubjectIdMaps);
+                List<Map<Integer, Long>> studentSubjectIdMaps = subjectDao.findStudentSubjectIdMaps(tempIds);
+                Map<Integer, Long> studentSubjectIdMap = MapUtil.convertIntegerMap(studentSubjectIdMaps);
                 truantStudent.forEach(studentAttendanceViewDto -> {
                     studentAttendanceViewDto.setSubjectName(studentSubjectNameMap.get(studentAttendanceViewDto.getStudentId().intValue()));
-                    studentAttendanceViewDto.setSubjectId(studentSubjectIdMap.get(studentAttendanceViewDto.getStudentId().intValue()).longValue());
+                    studentAttendanceViewDto.setSubjectId(studentSubjectIdMap.get(studentAttendanceViewDto.getStudentId().intValue()));
                 });
             }else if(schedule.getGroupType() != MUSIC){
                 ClassGroup classGroup = classGroupDao.get(schedule.getClassGroupId());
@@ -2916,6 +2916,53 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
+    public PageInfo<ClassGroupTeachersDto> queryClassGroupPage(ClassGroupQueryInfo queryInfo) {
+        PageInfo<ClassGroupTeachersDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<ClassGroupTeachersDto> dataList = null;
+        int count = classGroupDao.countClassGroup(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = classGroupDao.queryClassGroupPage(params);
+            String classGroupIds = dataList.stream().map(classGroup -> classGroup.getId().toString()).collect(Collectors.joining(","));
+            List<Integer> classGroupSet = dataList.stream().map(classGroup -> classGroup.getId()).collect(Collectors.toList());
+
+            List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperDao.findClassGroupTeachers(classGroupIds);
+            Map<Integer, Integer> studyNums = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(classGroupDao.countStudyNum(classGroupIds))), HashMap.class);
+
+            Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroupSet, null));
+            Map<Integer, Long> currentNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countExpendNumByClassGroupId(classGroupSet));
+            for (ClassGroupTeachersDto classGroup : dataList) {
+                List<ClassGroupTeacherMapper> classGroupTeacherMappers = new ArrayList<>();
+                for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
+                    if (!classGroup.getId().equals(classGroupTeacher.getClassGroupId())) continue;
+                    classGroupTeacherMappers.add(classGroupTeacher);
+                }
+                classGroup.setClassGroupTeacherMapperList(classGroupTeacherMappers);
+                classGroup.setStudentNum(studyNums.get(classGroup.getId()));
+                int totalClassTimes = 0;
+                int currentClassTimes = 0;
+                if (totalNumMap.containsKey(classGroup.getId())) {
+                    totalClassTimes = totalNumMap.get(classGroup.getId()).intValue();
+                }
+                if (currentNumMap.containsKey(classGroup.getId())) {
+                    currentClassTimes = currentNumMap.get(classGroup.getId()).intValue();
+                }
+                classGroup.setTotalClassTimes(totalClassTimes);
+                classGroup.setCurrentClassTimes(currentClassTimes);
+            }
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
     public Boolean addImGroup(ClassGroup classGroup, List<Integer> userIds) {
         MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
         List<Integer> userIdList = new ArrayList<>();
@@ -3253,34 +3300,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Override
     public Map<String, Integer> classGroupSubCourseNum(Integer classGroupId) {
         return MapUtil.convertIntegerMap(courseScheduleDao.querySubCourseNumMap(classGroupId));
-
-//        List<Map<String,Object>> result = new ArrayList<>();
-//        //获取班级列表
-//        List<ClassGroup> classGroups = classGroupDao.queryClassGroups(musicGroupId, null);
-//        for (ClassGroup classGroup : classGroups) {
-//            Map<String,Object> resultMap = new HashMap();
-//            resultMap.put("classGroup",classGroup);
-//            //获取班级剩余的课程类型和课程数量
-//            List<Map<String,Integer>> courseTypeNumMap = courseScheduleDao.querySubCourseNumMap(classGroup.getId());
-//            resultMap.put("courseTypeNumMap",courseTypeNumMap);
-//            //获取班级里学员列表
-//            resultMap.put("students",classGroupStudentMapperDao.findCourseStudentNameAndPhoneByClassGroupId(classGroup.getId()));
-//            result.add(resultMap);
-//        }
-//        return result;
     }
 
-    @Override
     public Map<String, Object> getDefaultPaymentCalender(List<Integer> classGroupIds) {
         if (classGroupIds == null || classGroupIds.size() == 0) {
             throw new BizException("参数校验失败");
         }
         Map<String, Object> result = new HashMap<>();
         Map<Integer, Map<String, MusicGroupOrganizationCourseSettingsDetail>> resultMap = new HashMap<>();
-        //获取默认的排课时长
-//        JSONObject jsonObject = JSON.parseObject(classAdjust.getDefaultCourseTypeMinute());
-//        String courseDefaultMinutes = sysConfigDao.findConfigValue("music_course_default_minutes");
-//        JSONObject jsonObject = JSON.parseObject(courseDefaultMinutes);
         //获取所选班级最大剩余课时
         Map<String, Long> map = MapUtil.convertIntegerMap(courseScheduleDao.findClassMaxCourseNumMap(classGroupIds));
         //获取分布默认的课程类型单价
@@ -3543,4 +3570,171 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         highClassGroupNumDto.setMaxHighClassGroupNum(maxClassGroupNum);
         return highClassGroupNumDto;
     }
+
+    @Override
+    public List<MusicGroupPaymentCalenderStudentDetail> queryStudentPaymentCalenders(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) {
+        //获取主班剩余时长
+        Map<String, Long> masterMap = MapUtil.convertIntegerMap(courseScheduleDao.querySubCourseNumMap(mergeClassSplitClassAffirmDto.getMasterClassGroupId()));
+        if(masterMap.size() <= 0){
+            throw new BizException("所选主班没有剩余课程,请重新选择");
+        }
+        //获取学员列表
+        Map<Integer, String> userNames = MapUtil.convertMybatisMap(teacherDao.queryUsernameByIds(mergeClassSplitClassAffirmDto.getStudentIds()));
+        Map<Integer, String> phoneMaps = MapUtil.convertMybatisMap(teacherDao.queryPhoneByIds(StringUtils.join(mergeClassSplitClassAffirmDto.getStudentIds(),",")));
+
+        Map<Integer, Integer> studentCLassMap = new HashMap<>();
+        List<Map<Integer, BigDecimal>> surplusCourseFeeMapList = new ArrayList<>();
+        List<Map<Integer, String>> classGroupStudents = mergeClassSplitClassAffirmDto.getClassGroupStudents();
+        for (Map<Integer, String> classGroupStudent : classGroupStudents) {
+            for (Integer integer : classGroupStudent.keySet()) {
+                //获取学员剩余课程费用
+                surplusCourseFeeMapList.addAll(studentRegistrationDao.querySurplusCourseFeeByClassGroupId(integer,classGroupStudent.get(integer)));
+                String[] s = classGroupStudent.get(integer).split(",");
+                for (String s1 : s) {
+                    studentCLassMap.put(Integer.parseInt(s1),integer);
+                }
+            }
+        }
+        //学员剩余课程费用
+        Map<Integer, BigDecimal> surplusCourseFeeMap = MapUtil.convertIntegerMap(surplusCourseFeeMapList);
+        //获取分布默认的课程类型单价
+        MusicGroup musicGroup = musicGroupDao.findByClassGroupId(mergeClassSplitClassAffirmDto.getMasterClassGroupId());
+        Map<String, BigDecimal> unitPriceMap = MapUtil.convertIntegerMap(organizationCourseUnitPriceSettingsDao.queryMapByOrganIdAndChargeTypeId(musicGroup.getChargeTypeId(), musicGroup.getOrganId()));
+        Set<String> masterKeySet = masterMap.keySet();
+        //计算主班课程类型剩余价值
+        Map<String, BigDecimal> masterTotalPriceMap = new HashMap<>(masterKeySet.size());
+        //学员缴费项目列表
+        List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails = new ArrayList<>();
+        for (String s : masterKeySet) {
+            BigDecimal unitPrice = unitPriceMap.get(s);
+            if (unitPrice == null) {
+                throw new BizException("分部默认课程类型单价不存在,请设置");
+            }
+            Long courseTime = masterMap.get(s);
+            //获取主班剩余课程价值,按分部默认单价计算
+            if(courseTime == 0l){
+                masterTotalPriceMap.put(s,BigDecimal.ZERO);
+            }
+            //总价四舍五入取整
+            BigDecimal totalPrice = unitPrice.multiply(new BigDecimal(courseTime)).setScale(0, BigDecimal.ROUND_HALF_UP);
+            masterTotalPriceMap.put(s,totalPrice);
+            //课程余额转移
+            for (Integer studentId : studentCLassMap.keySet()) {
+                //学员剩余课程余额
+                BigDecimal bigDecimal = surplusCourseFeeMap.get(studentId);
+                //创建学员缴费项目
+                MusicGroupPaymentCalenderStudentDetail calenderDto = new MusicGroupPaymentCalenderStudentDetail();
+                calenderDto.setClassGroupId(studentCLassMap.get(studentId));
+                //如果剩余课程余额小于等于0
+                if(bigDecimal.doubleValue() <= 0d){
+                    calenderDto.setCourseCurrentPrice(totalPrice);
+                    calenderDto.setCourseOriginalPrice(totalPrice);
+                }else {
+                    //如果剩余课程余额大于等于总价值,那么补交0元
+                    if(bigDecimal.doubleValue() >= totalPrice.doubleValue()){
+                        calenderDto.setCourseCurrentPrice(BigDecimal.ZERO);
+                        calenderDto.setCourseOriginalPrice(BigDecimal.ZERO);
+                    }else {
+                        calenderDto.setCourseCurrentPrice(totalPrice.subtract(bigDecimal));
+                        calenderDto.setCourseOriginalPrice(totalPrice.subtract(bigDecimal));
+                    }
+                    //剩余课程余额减去主班对应课程类型总的课程价值,负数就是需要补交的金额
+//                    bigDecimal = bigDecimal.subtract(totalPrice);
+                    surplusCourseFeeMap.put(studentId,bigDecimal.subtract(totalPrice));
+                }
+                calenderDto.setCourseTime(courseTime);
+                calenderDto.setCourseType(s);
+
+                calenderDto.setPhone(phoneMaps.get(studentId));
+                calenderDto.setUserId(studentId);
+                calenderDto.setUsername(userNames.get(studentId));
+                musicGroupPaymentCalenderStudentDetails.add(calenderDto);
+            }
+        }
+        return musicGroupPaymentCalenderStudentDetails;
+    }
+
+
+    @Override
+    public BigDecimal getMasterTotalPrice(Integer masterClassGroupId) {
+        //获取主班剩余时长
+        Map<String, Long> masterMap = MapUtil.convertIntegerMap(courseScheduleDao.querySubCourseNumMap(masterClassGroupId));
+        if(masterMap.size() <= 0){
+            throw new BizException("所选主班没有剩余课程,请重新选择");
+        }
+        //获取分布默认的课程类型单价
+        MusicGroup musicGroup = musicGroupDao.findByClassGroupId(masterClassGroupId);
+        Map<String, BigDecimal> unitPriceMap = MapUtil.convertIntegerMap(organizationCourseUnitPriceSettingsDao.queryMapByOrganIdAndChargeTypeId(musicGroup.getChargeTypeId(), musicGroup.getOrganId()));
+        Set<String> masterKeySet = masterMap.keySet();
+        //计算主班课程类型剩余价值
+        BigDecimal masterTotalPrice = BigDecimal.ZERO;
+        for (String s : masterKeySet) {
+            BigDecimal unitPrice = unitPriceMap.get(s);
+            if (unitPrice == null) {
+                throw new BizException("分部默认课程类型单价不存在,请设置");
+            }
+            Long courseTime = masterMap.get(s);
+            //获取主班剩余课程价值,按分部默认单价计算
+            //总价四舍五入取整
+            BigDecimal totalPrice = unitPrice.multiply(new BigDecimal(courseTime)).setScale(0, BigDecimal.ROUND_HALF_UP);
+            masterTotalPrice = masterTotalPrice.add(totalPrice);
+        }
+        return masterTotalPrice;
+    }
+
+    @Override
+    public Map<String, Long> querySubCourseTime(Integer classGroupId) {
+        return MapUtil.convertIntegerMap(courseScheduleDao.querySubCourseNumMap(classGroupId));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void spanGroupMergeClassSplitClassAffirm(MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) {
+        //缴费项目
+        List<MusicGroupPaymentCalenderDto> paymentCalenderDtos = mergeClassSplitClassAffirmDto.getMusicGroupPaymentCalenderDtos();
+        //主班
+        Integer masterClassGroupId = mergeClassSplitClassAffirmDto.getMasterClassGroupId();
+        //学员列表
+        List<Integer> studentIds = mergeClassSplitClassAffirmDto.getStudentIds();
+        //班级和学员关联
+        List<Map<Integer, String>> classGroupStudents = mergeClassSplitClassAffirmDto.getClassGroupStudents();
+        //获取默认的学员缴费详情
+        List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails = queryStudentPaymentCalenders(mergeClassSplitClassAffirmDto);
+        //创建缴费项目
+        MusicGroup musicGroup = musicGroupDao.findByClassGroupId(masterClassGroupId);
+        MusicGroupPaymentCalender.PaymentCalenderStatusEnum status = null;
+        StringBuffer batchNos = new StringBuffer();
+        List<String> batchNoList = new ArrayList<>();
+        if (paymentCalenderDtos != null && paymentCalenderDtos.size() > 0) {
+            BigDecimal masterTotalPrice = getMasterTotalPrice(masterClassGroupId);
+            //是否有需要审核的缴费项目
+            for (MusicGroupPaymentCalenderDto calenderDto : paymentCalenderDtos) {
+                //将学员加入新乐团、扣除原乐团剩余课程余额、补充到现有乐团
+                studentRegistrationService.insertStudent(calenderDto.getStudentIds(),calenderDto.getMusicGroupId(),musicGroup.getId(),masterTotalPrice);
+                calenderDto.setMusicGroupId(musicGroup.getId());
+                List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = calenderDto.getMusicGroupPaymentCalenderStudentDetails();
+                boolean containsAll = musicGroupPaymentCalenderStudentDetails.containsAll(calenderStudentDetails);
+                if(!containsAll){
+                    calenderDto.setStatus(AUDITING);
+                }else {
+                    calenderDto.setStatus(NO);
+                }
+                calenderDto.setPaymentType(SPAN_GROUP_CLASS_ADJUST);
+                //生成缴费项目
+                musicGroupPaymentCalenderService.create(calenderDto);
+                if (batchNos.length() > 0) {
+                    batchNos.append(",");
+                }
+                batchNoList.add(calenderDto.getBatchNo());
+                batchNos.append(calenderDto.getBatchNo());
+                if (status == null || status != AUDITING) {
+                    if(!containsAll){
+                        status = AUDITING;
+                    }
+                }
+            }
+            //将学员加进班级未开始的课程,以及班级关联、加群
+            classGroupStudentMapperService.updateClassGroupStudents(masterClassGroupId.longValue(),new HashSet<>(studentIds));
+        }
+    }
 }

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

@@ -8,6 +8,7 @@ import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.Map.Entry;
 
+import com.ym.mec.auth.api.enums.CertificateTypeEnum;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -220,7 +221,8 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			if (user == null) {
 				throw new BizException("用户信息查询失败");
 			}
-			sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
+			if(CertificateTypeEnum.IDENTITY.getCode().equals(user.getCertificateType()))
+				sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
 		}
 
 		// 合成freemarker
@@ -315,7 +317,8 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			if (user == null) {
 				throw new BizException("用户信息查询失败");
 			}
-			sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
+			if(CertificateTypeEnum.IDENTITY.getCode().equals(user.getCertificateType()))
+				sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
 		}
 		Date date = new Date();
 
@@ -511,7 +514,8 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			if (user == null) {
 				throw new BizException("用户信息查询失败");
 			}
-			sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
+			if(CertificateTypeEnum.IDENTITY.getCode().equals(user.getCertificateType()))
+				sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
 		}
 		Date date = new Date();
 
@@ -654,7 +658,8 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			if (user == null) {
 				throw new BizException("用户信息查询失败");
 			}
-			sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
+			if(CertificateTypeEnum.IDENTITY.getCode().equals(user.getCertificateType()))
+				sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
 		}
 		Date date = new Date();
 
@@ -889,7 +894,8 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			if (user == null) {
 				throw new BizException("用户信息查询失败");
 			}
-			sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
+			if(CertificateTypeEnum.IDENTITY.getCode().equals(user.getCertificateType()))
+				sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
 		}
 
 		Date date = new Date();
@@ -976,7 +982,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		}
 
 		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
-		if (sysUserTsign == null) {
+		if (sysUserTsign == null && CertificateTypeEnum.IDENTITY.getCode().equals(user.getCertificateType())) {
 			try {
 				sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
 			} catch (Exception e) {
@@ -1085,6 +1091,9 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		if(Objects.isNull(studentInfo)){
 			studentInfo = new StudentInfo();
 		}
+		if(StringUtils.isEmpty(studentInfo.getCertificateType())){
+			studentInfo.setCertificateType(CertificateTypeEnum.IDENTITY.getCode());
+		}
 		params.put("studentInfo", studentInfo);
 		params.put("isShowVisualSeal", true);
 

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

@@ -2786,6 +2786,11 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				teacherSalary=vipGroupCourseAdjustInfo.getTeachMode().equals(TeachModeEnum.OFFLINE)?salaryMap.get("offlineTeacherSalary"):salaryMap.get("onlineTeacherSalary");
 			}
 
+			if(courseSchedule.getEndClassTime().compareTo(vipGroup.getCoursesExpireDate())>0){
+				vipGroup.setCoursesExpireDate(courseSchedule.getEndClassTime());
+				vipGroupDao.update(vipGroup);
+			}
+
 			courseScheduleTeacherSalaryDao.batchUpdateCourseSalarys(courseScheduleIds, teacherSalary);
 
 		}
@@ -3256,6 +3261,9 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			}
 
 			if(Objects.nonNull(vipGroup) && newCourseSchedule.getStartClassTime().after(date)){
+				if(newCourseSchedule.getEndClassTime().compareTo(vipGroup.getCoursesExpireDate())>0){
+					vipGroup.setCoursesExpireDate(newCourseSchedule.getEndClassTime());
+				}
 				vipGroup.setStatus(VipGroupStatusEnum.PROGRESS);
 				vipGroup.setUpdateTime(date);
 				vipGroupDao.update(vipGroup);
@@ -4384,7 +4392,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         }
         if (count > 0) {
             pageInfo.setTotal(count);
-            params.put("offset", pageInfo.getOffset());
+			params.put("offset", pageInfo.getOffset());
             results = courseScheduleDao.endFindCourseSchedules(params);
             List<Long> courseScheduleIds = results.stream().map(CourseScheduleEndDto::getId).collect(Collectors.toList());
             //Map<Long, String> studentIdMap = MapUtil.convertIntegerMap(courseScheduleStudentPaymentDao.getStudentIdMap(courseScheduleIds));
@@ -4636,7 +4644,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		Date date = new Date();
 		List<Long> courseIds1 = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toList());
 		//获取修改日志
-		List<CourseScheduleModifyLog> modifyLogs = getModifyLogs(courseIds1, courseSchedules, user.getId(), date);
+		List<CourseScheduleModifyLog> modifyLogs = new ArrayList<>();
+		if(!CollectionUtils.isEmpty(courseIds1)){
+			modifyLogs = getModifyLogs(courseIds1, courseSchedules, user.getId(), date);
+		}
 
 		PracticeGroup practiceGroup = practiceGroupDao.get(Long.valueOf(practiceGroupId));
 
@@ -4710,7 +4721,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		//清除考勤申述
 		teacherAttendanceDao.clearAttendanceComplaints(courseScheduleIds);
 		//保存修改记录
-		saveModifyLog(modifyLogs,courseIds1);
+		if(!CollectionUtils.isEmpty(modifyLogs))
+			saveModifyLog(modifyLogs,courseIds1);
 
         if (teacherIdMap != null && teacherIdMap.size() > 0) {
             sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT,

+ 28 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java

@@ -250,7 +250,12 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }
 
             Teacher teacher = idTeacherMap.get(courseScheduleTeacherSalary.getUserId());
-            if(Objects.isNull(teacher)||Objects.isNull(teacher.getFormalStaffDate())||courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getFormalStaffDate())<0){
+
+            boolean notPositive = Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getFormalStaffDate())<0;
+            boolean isProbationPeriod = Objects.nonNull(teacher)&&Objects.isNull(teacher.getFormalStaffDate())&&ProbationPeriodEnum.TRY.equals(teacher.getIsProbationPeriod());
+
+            //如果上课日期在转正日期之前的按80%结算
+            if(Objects.isNull(teacher)||notPositive||isProbationPeriod){
                 expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
                 deductReasons.add("未转正");
             }
@@ -387,7 +392,11 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             }
 
             Teacher teacher = idTeacherMap.get(courseScheduleTeacherSalary.getUserId());
-            if(Objects.isNull(teacher)||Objects.isNull(teacher.getFormalStaffDate())||courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getFormalStaffDate())<0){
+
+            boolean notPositive = Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseScheduleTeacherSalary.getCourseSchedule().getClassDate().compareTo(teacher.getFormalStaffDate())<0;
+            boolean isProbationPeriod = Objects.nonNull(teacher)&&Objects.isNull(teacher.getFormalStaffDate())&&ProbationPeriodEnum.TRY.equals(teacher.getIsProbationPeriod());
+
+            if(Objects.isNull(teacher)||notPositive||isProbationPeriod){
                 expectSalary = expectSalary.multiply(new BigDecimal("0.8"));
                 deductReasons.add("未转正");
             }
@@ -396,14 +405,14 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
             BigDecimal deductCost = new BigDecimal(0);
             List<TeacherAttendance> courseTeacherAttendances = teacherCourseAttendanceMap.get(org.apache.commons.lang3.StringUtils.joinWith(":", courseScheduleTeacherSalary.getCourseScheduleId(), courseScheduleTeacherSalary.getUserId()));
 
-            TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
-            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignInStatus())){
+//            TeacherAttendance teacherAttendance = courseTeacherAttendances.get(0);
+            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(courseTeacherAttendances.get(0).getSignInStatus())){
                 //未签到扣除全部课酬
                 deductCost = deductCost.add(expectSalary);
                 deductReasons.add("未签到扣除全部课酬");
-            }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignInStatus())){
+            }else if(YesOrNoEnum.NO.equals(courseTeacherAttendances.get(0).getSignInStatus())){
                 //异常签到
-                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignInTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
+                int signCourseTimeBetweenSeconds = DateUtil.secondsBetween(courseTeacherAttendances.get(0).getSignInTime(), courseScheduleTeacherSalary.getCourseSchedule().getStartClassTime());
                 float signCourseTimeBetween = (float)signCourseTimeBetweenSeconds/(float)60;
                 if(signCourseTimeBetween<=1&&signCourseTimeBetween>-3){
                     //课程开始前1分钟至开始后3分钟进入教室
@@ -421,13 +430,13 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 }
             }
 
-            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(teacherAttendance.getSignOutStatus())){
+            if(CollectionUtils.isEmpty(courseTeacherAttendances)||Objects.isNull(courseTeacherAttendances.get(0).getSignOutStatus())){
                 //未签退扣除全部课酬
                 deductCost = deductCost.add(expectSalary);
                 deductReasons.add("未签退扣除全部课酬");
-            }else if(YesOrNoEnum.NO.equals(teacherAttendance.getSignOutStatus())){
+            }else if(YesOrNoEnum.NO.equals(courseTeacherAttendances.get(0).getSignOutStatus())){
                 //异常签退
-                int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(teacherAttendance.getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getEndClassTime());
+                int signOutCourseTimeBetweenSeconds = DateUtil.secondsBetween(courseTeacherAttendances.get(0).getSignOutTime(), courseScheduleTeacherSalary.getCourseSchedule().getEndClassTime());
                 float signOutCourseTimeBetween = (float)signOutCourseTimeBetweenSeconds/(float)60;
 
                 if(signOutCourseTimeBetween>3){
@@ -594,8 +603,13 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                     deductReasons.add("教学点补贴:" + subsidy);
                 }
 
+                //未转正
+                boolean notPositive = Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())<0;
+                //试用期
+                boolean isProbationPeriod = Objects.nonNull(teacher)&&Objects.isNull(teacher.getFormalStaffDate())&&ProbationPeriodEnum.TRY.equals(teacher.getIsProbationPeriod());
+
                 //如果上课日期在转正日期之前的按80%结算
-                if(Objects.isNull(teacher)||Objects.isNull(teacher.getFormalStaffDate())||courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())<0){
+                if(Objects.isNull(teacher)||notPositive||isProbationPeriod){
                     teacherSalary = teacherSalary.multiply(new BigDecimal("0.8"));
                     deductReasons.add("未转正");
                 }
@@ -710,7 +724,10 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
                 deductReasons.add("教学点补贴:" + subsidy);
             }
 
-            if(Objects.isNull(teacher)||Objects.isNull(teacher.getFormalStaffDate())||courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())<0){
+            boolean notPositive = Objects.nonNull(teacher)&&Objects.nonNull(teacher.getFormalStaffDate())&&courseSchedule.getClassDate().compareTo(teacher.getFormalStaffDate())<0;
+            boolean isProbationPeriod = Objects.nonNull(teacher)&&Objects.isNull(teacher.getFormalStaffDate())&&ProbationPeriodEnum.TRY.equals(teacher.getIsProbationPeriod());
+
+            if(Objects.isNull(teacher)||notPositive||isProbationPeriod){
                 teacherSalary = teacherSalary.multiply(new BigDecimal("0.8"));
                 deductReasons.add("未转正");
             }

+ 41 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java

@@ -18,6 +18,7 @@ import com.ym.mec.biz.dal.enums.ParamEnum;
 import com.ym.mec.biz.dal.page.EmployeeQueryInfo;
 import com.ym.mec.biz.service.EmployeeService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.entity.ImGroupMember;
 import com.ym.mec.common.entity.ImGroupModel;
 import com.ym.mec.common.entity.ImResult;
 import com.ym.mec.common.entity.ImUserModel;
@@ -201,17 +202,17 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 	public Map<String, Object> levelDetail(Integer userId) {
 		Map<String,Object> resultMap = new HashMap<>(4);
 		//维修技师所在分部列表
-		List<Integer> repairOrgans = employeeDao.queryRepairOrganList(userId);
-		resultMap.put("repairOrgans",repairOrgans);
+		List<Integer> repair = employeeDao.queryRepairOrganList(userId);
+		resultMap.put("repair",repair);
 		//教务老师所在分部列表
-		List<Integer> educationOrgans = employeeDao.queryEducationOrganList(userId);
-		resultMap.put("educationOrgans",educationOrgans);
+		List<Integer> education = employeeDao.queryEducationOrganList(userId);
+		resultMap.put("education",education);
 		//运营主管所在分部列表
-		List<Integer> teamTeacherOrgans = employeeDao.queryTeamTeacherOrganList(userId);
-		resultMap.put("teamTeacherOrgans",teamTeacherOrgans);
+		List<Integer> teamTeacher = employeeDao.queryTeamTeacherOrganList(userId);
+		resultMap.put("teamTeacher",teamTeacher);
 		//乐队指导所在分部列表
-		List<Integer> directorOrgans = employeeDao.queryDirectorOrganList(userId);
-		resultMap.put("directorOrgans",directorOrgans);
+		List<Integer> director = employeeDao.queryDirectorOrganList(userId);
+		resultMap.put("director",director);
 		return resultMap;
 	}
 
@@ -230,30 +231,54 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 			for (Integer organId : organIds) {
 				List<EmployeeLevelDto> levelDtoList = organIdMap.get(organId);
 				for (EmployeeLevelDto employeeLevelDto : levelDtoList) {
+					if(employeeLevelDto.getLevelUserId() == employeeLevelDto.getTransferUserId()){
+						throw new BizException("交接人校验失败,请重新填写");
+					}
 					switch (roleName){
 						case "education":
 							//教务老师所需加入的群组
-							imGroupModels.addAll(classGroupDao.queryEducationGroups(levelUserId,organId));
+							imGroupModels.addAll(classGroupDao.queryEducationGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
 							break;
 						case "teamTeacher":
 							//运营主管所需加入的群组
-							imGroupModels.addAll(classGroupDao.queryTeamTeacherGroups(levelUserId,organId));
+							imGroupModels.addAll(classGroupDao.queryTeamTeacherGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
 							break;
 						case "director":
 							//乐队指导所需加入的群组
-							imGroupModels.addAll(classGroupDao.queryDirectorGroups(levelUserId,organId));
+							imGroupModels.addAll(classGroupDao.queryDirectorGroups(employeeLevelDto.getTransferUserId(),levelUserId,organId));
 							break;
 					}
 				}
 			}
 		}
-		//❤️用户加群
-//		imFeignService.groupBatchJoin(imGroupModels);
+		if(imGroupModels.size() > 0){
+			//❤️用户加群
+			for (ImGroupModel imGroupModel : imGroupModels) {
+				List<ImGroupMember> memberList = imGroupModel.getMemberList();
+				if(memberList != null && memberList.size() > 0){
+					ImGroupMember[] imGroupMembers = new ImGroupMember[memberList.size()];
+					imGroupModel.setMembers(memberList.toArray(imGroupMembers));
+				}
+			}
+		imFeignService.groupBatchJoin(imGroupModels);
+		}
 		//原有员工退群
 		List<ImGroupModel> groupModels = classGroupDao.queryTeacherQuitGroups(levelUserId);
-//		imFeignService.groupBatchQuit(groupModels);
-//		employeeDao.employeeLevel(employeeLevelDtos);
-		//用户退群和加群
+		if(groupModels.size() > 0){
+			for (ImGroupModel imGroupModel : groupModels) {
+				List<ImGroupMember> memberList = imGroupModel.getMemberList();
+				if(memberList != null && memberList.size() > 0){
+					ImGroupMember[] imGroupMembers = new ImGroupMember[memberList.size()];
+					imGroupModel.setMembers(memberList.toArray(imGroupMembers));
+				}
+			}
+			imFeignService.groupBatchQuit(groupModels);
+		}
+		//更换教务老师等数据
+		employeeDao.employeeLevel(employeeLevelDtos);
+		//新增离职时间
 		employeeDao.updateUserDemissionDate(levelUserId);
+		//冻结用户
+		employeeDao.updateUserLock(levelUserId,1);
 	}
 }

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service.impl;
 
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType.STUDENT;
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum.AUDITING;
 import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.NON_PAYMENT;
 
 import java.math.BigDecimal;
@@ -15,6 +16,7 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.entity.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -29,13 +31,7 @@ import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.FeeStudentDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
-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.MusicGroupPaymentCalenderCourseSettings;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.service.MusicGroupPaymentCalenderDetailService;
@@ -379,6 +375,54 @@ public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
+	public void batchAdd(MusicGroupPaymentCalender musicGroupPaymentCalender,List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails) {
+		Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect = musicGroupPaymentCalenderStudentDetails.stream().collect(Collectors.groupingBy(e -> e.getUserId()));
+		//生成music_group_payment_calender_detail
+		List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<MusicGroupPaymentStudentCourseDetail>();
+		MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;
+		MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
+		Long musicGroupPaymentCalenderId = musicGroupPaymentCalender.getId();
+		for (Integer studentId : collect.keySet()) {
+			musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
+			musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
+			musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.NON_PAYMENT);
+			List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = collect.get(studentId);
+			BigDecimal totalPrice = calenderStudentDetails.stream().map(e->e.getCourseCurrentPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+			musicGroupPaymentCalenderDetail.setExpectAmount(totalPrice);
+			if(musicGroupPaymentCalender.getStatus() != AUDITING){
+				if (totalPrice.doubleValue() == 0d) {
+					musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
+				}
+			}
+			musicGroupPaymentCalenderDetail.setUserId(studentId);
+			musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
+			musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
+			musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
+			musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
+			Long musicGroupPaymentCalenderDetailId = musicGroupPaymentCalenderDetail.getId();
+			for (MusicGroupPaymentCalenderStudentDetail calenderStudentDetail : calenderStudentDetails) {
+				//创建学生课排课分钟数
+				musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
+				musicGroupPaymentStudentCourseDetail.setCourseType(CourseSchedule.CourseScheduleType.valueOf(calenderStudentDetail.getCourseType()));
+				musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
+				musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetailId);
+				musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(0);
+				musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(calenderStudentDetail.getCourseTime().intValue());
+				musicGroupPaymentStudentCourseDetail.setUserId(studentId);
+				musicGroupPaymentStudentCourseDetailList.add(musicGroupPaymentStudentCourseDetail);
+			}
+		}
+		musicGroupPaymentCalender.setExpectNum(collect.keySet().size());
+		musicGroupPaymentCalenderService.update(musicGroupPaymentCalender);
+		musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetailList);
+		//给学员推送缴费通知
+		if(musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN){
+			musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalenderId,musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId()),collect.keySet());
+		}
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public void batchAdd(String batchNo, Set<Integer> userIdList) {
 		
 		List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);

+ 19 - 53
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -4,10 +4,7 @@ import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType.SC
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType.STUDENT;
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum.AUDITING;
 import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentCalenderStatusEnum.REJECT;
-import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.ADD_COURSE;
-import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.ADD_STUDENT;
-import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY;
-import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.MUSIC_RENEW;
+import static com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PaymentType.*;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -23,6 +20,9 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.*;
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,50 +34,12 @@ import com.alibaba.fastjson.JSON;
 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.ClassGroupDao;
-import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
-import com.ym.mec.biz.dal.dao.MusicGroupBuildLogDao;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.MusicGroupOrganizationCourseSettingsDao;
-import com.ym.mec.biz.dal.dao.MusicGroupOrganizationCourseSettingsDetailDao;
-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.MusicGroupStudentClassAdjustDao;
-import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
-import com.ym.mec.biz.dal.dao.OrganizationCourseUnitPriceSettingsDao;
-import com.ym.mec.biz.dal.dao.OrganizationDao;
-import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
-import com.ym.mec.biz.dal.dto.CalenderPushDto;
-import com.ym.mec.biz.dal.dto.ClassGroup4MixDto;
-import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDetailDto;
-import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDto;
-import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderDto;
 import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderDto.MusicGroupPaymentDateRange;
-import com.ym.mec.biz.dal.entity.ClassGroup;
 import com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupBuildLog;
-import com.ym.mec.biz.dal.entity.MusicGroupOrganizationCourseSettings;
-import com.ym.mec.biz.dal.entity.MusicGroupOrganizationCourseSettingsDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 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;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentStudentCourseDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupStudentClassAdjust;
-import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.entity.OrganizationCourseUnitPriceSettings;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.biz.dal.page.MusicGroupPaymentCalenderQueryInfo;
@@ -140,9 +102,6 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 
 	@Autowired
 	private TeacherAttendanceDao teacherAttendanceDao;
-
-	@Autowired
-	private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 	@Autowired
 	private MusicGroupBuildLogDao musicGroupBuildLogDao;
 	@Autowired
@@ -150,19 +109,17 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	@Autowired
 	private OrganizationDao organizationDao;
 	@Autowired
-	private StudentRegistrationDao studentRegistrationDao;
-	@Autowired
 	private SysMessageService sysMessageService;
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
 	@Autowired
-	private CourseScheduleStudentPaymentServiceImpl courseScheduleStudentPaymentService;
-	@Autowired
 	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 	@Autowired
 	private MusicGroupStudentClassAdjustDao musicGroupStudentClassAdjustDao;
 	@Autowired
 	private MusicGroupPaymentCalenderDetailService musicGroupPaymentCalenderDetailService;
+	@Autowired
+	private MusicGroupPaymentCalenderStudentDetailDao musicGroupPaymentCalenderStudentDetailDao;
 
 	@Override
 	public BaseDAO<Long, MusicGroupPaymentCalender> getDAO() {
@@ -366,7 +323,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			if (musicGroupPaymentCalender.getDeadlinePaymentDate() == null && payUserType == PayUserType.STUDENT) {
 				musicGroupPaymentCalender.setDeadlinePaymentDate(DateUtil.addDays(musicGroupPaymentCalender.getStartPaymentDate(), 3));
 			}
-			if (paymentType != ADD_STUDENT && paymentType != ADD_COURSE) {
+			if (paymentType != ADD_STUDENT && paymentType != ADD_COURSE && paymentType != SPAN_GROUP_CLASS_ADJUST) {
 				int count = musicGroupPaymentCalenderDao.queryIntersectionByValidDate(musicGroupId, musicGroupPaymentCalender.getPayUserType(),
 						musicGroupPaymentCalender.getPaymentValidStartDate(), musicGroupPaymentCalender.getPaymentValidEndDate(), null);
 				if (count > 0) {
@@ -411,11 +368,20 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 				}
 				musicGroupPaymentCalenderCourseSettingsDao.batchInsert(currentMusicGroupPaymentCalenderCourseSettings);
 			}
-
+			//如果是跨团班级合并,保存用户缴费详情
+			List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails = null;
+			if (musicGroupPaymentCalender.getPaymentType() == SPAN_GROUP_CLASS_ADJUST){
+				musicGroupPaymentCalenderStudentDetails = musicGroupPaymentCalenderDto.getMusicGroupPaymentCalenderStudentDetails();
+				//记录学员缴费详情
+				musicGroupPaymentCalenderStudentDetailDao.batchInsert(musicGroupPaymentCalenderStudentDetails,musicGroupPaymentCalender.getId());
+			}
 			if (musicGroupPaymentCalender.getStatus() != AUDITING) {
 				// 如果是进行中加学生
 				if (musicGroupPaymentCalender.getPaymentType() == PaymentType.ADD_STUDENT) {
 					addStudent(musicGroupPaymentCalender, currentMusicGroupPaymentCalenderCourseSettings);
+				}else if(musicGroupPaymentCalender.getPaymentType() == SPAN_GROUP_CLASS_ADJUST){
+					//如果是跨团班级合并,添加学员
+					musicGroupPaymentCalenderDetailService.batchAdd(musicGroupPaymentCalender,musicGroupPaymentCalenderStudentDetails);
 				}else if(musicGroupPaymentCalenderDto.getMergeClassFlag()){
 					//缴费项目添加学员
 					int[] ints = Arrays.stream(musicGroupPaymentCalenderDto.getStudentIds().split(",")).mapToInt(Integer::parseInt).toArray();
@@ -673,7 +639,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 			if (musicGroupPaymentCalender.getDeadlinePaymentDate() == null && payUserType == PayUserType.STUDENT) {
 				musicGroupPaymentCalender.setDeadlinePaymentDate(DateUtil.addDays(musicGroupPaymentCalender.getStartPaymentDate(), 3));
 			}
-			if (paymentType != ADD_STUDENT && paymentType != ADD_COURSE) {
+			if (paymentType != ADD_STUDENT && paymentType != ADD_COURSE && paymentType != SPAN_GROUP_CLASS_ADJUST) {
 				int count = musicGroupPaymentCalenderDao.queryIntersectionByValidDate(musicGroupId, musicGroupPaymentCalender.getPayUserType(),
 						musicGroupPaymentCalender.getPaymentValidStartDate(), musicGroupPaymentCalender.getPaymentValidEndDate(), null);
 				if (count > 0) {
@@ -1260,7 +1226,7 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.get(calenderDetailId);
 		MusicGroupPaymentCalender calender = this.get(calenderDetail.getMusicGroupPaymentCalenderId());
 		MusicGroupStudentFee musicGroupStudentFee = musicGroupStudentFeeDao.findByUser(userId, calender.getMusicGroupId());
-		if(calender.getIsGiveMusicNetwork()){
+		if(calender.getIsGiveMusicNetwork() && musicGroupStudentFee != null){
 			//赠送网管课
 			musicGroupStudentFee.setRemainNetworkClassTimes(musicGroupStudentFee.getRemainNetworkClassTimes() + 1);
 		}

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

@@ -0,0 +1,23 @@
+package com.ym.mec.biz.service.impl;
+
+
+import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderStudentDetailDao;
+import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderStudentDetailService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class MusicGroupPaymentCalenderStudentDetailServiceImpl extends BaseServiceImpl<Integer, MusicGroupPaymentCalenderStudentDetail> implements MusicGroupPaymentCalenderStudentDetailService {
+	
+	@Autowired
+	private MusicGroupPaymentCalenderStudentDetailDao musicGroupPaymentCalenderStudentDetailDao;
+
+	@Override
+	public BaseDAO<Integer, MusicGroupPaymentCalenderStudentDetail> getDAO() {
+		return musicGroupPaymentCalenderStudentDetailDao;
+	}
+	
+}

+ 114 - 107
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -18,6 +18,8 @@ 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.entity.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -30,38 +32,6 @@ import com.alibaba.fastjson.TypeReference;
 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.ChargeTypeDao;
-import com.ym.mec.biz.dal.dao.ClassGroupDao;
-import com.ym.mec.biz.dal.dao.ClassGroupStudentMapperDao;
-import com.ym.mec.biz.dal.dao.CooperationOrganDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.ym.mec.biz.dal.dao.CourseScheduleTeacherSalaryDao;
-import com.ym.mec.biz.dal.dao.EmployeeDao;
-import com.ym.mec.biz.dal.dao.MusicGroupBuildLogDao;
-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.MusicGroupPaymentEntitiesDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPaymentStudentCourseDetailDao;
-import com.ym.mec.biz.dal.dao.MusicGroupPurchaseListDao;
-import com.ym.mec.biz.dal.dao.MusicGroupQuitDao;
-import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
-import com.ym.mec.biz.dal.dao.MusicGroupSubjectGoodsGroupDao;
-import com.ym.mec.biz.dal.dao.MusicGroupSubjectPlanDao;
-import com.ym.mec.biz.dal.dao.OrganizationDao;
-import com.ym.mec.biz.dal.dao.SchoolDao;
-import com.ym.mec.biz.dal.dao.SporadicChargeInfoDao;
-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.StudentRegistrationDao;
-import com.ym.mec.biz.dal.dao.StudentVisitDao;
-import com.ym.mec.biz.dal.dao.SubjectChangeDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dao.TeacherAttendanceDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.CourseFormDto;
 import com.ym.mec.biz.dal.dto.CourseScheduleTeachersDto;
@@ -72,34 +42,7 @@ import com.ym.mec.biz.dal.dto.SporadicPayDto;
 import com.ym.mec.biz.dal.dto.SubFeeSettingDto;
 import com.ym.mec.biz.dal.dto.SubjectRegisterDto;
 import com.ym.mec.biz.dal.dto.UpdateExpectedNumDto;
-import com.ym.mec.biz.dal.entity.ApprovalStatus;
-import com.ym.mec.biz.dal.entity.ChargeType;
-import com.ym.mec.biz.dal.entity.ClassGroup;
-import com.ym.mec.biz.dal.entity.CooperationOrgan;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.CourseScheduleTeacherSalary;
-import com.ym.mec.biz.dal.entity.Goods;
-import com.ym.mec.biz.dal.entity.MusicGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupBuildLog;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderCourseSettings;
-import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
-import com.ym.mec.biz.dal.entity.MusicGroupPurchaseList;
-import com.ym.mec.biz.dal.entity.MusicGroupQuit;
-import com.ym.mec.biz.dal.entity.MusicGroupStudentFee;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectGoodsGroup;
-import com.ym.mec.biz.dal.entity.MusicGroupSubjectPlan;
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.entity.School;
-import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
-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.entity.SubjectChange;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
-import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.GoodsType;
@@ -272,6 +215,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     private SubjectChangeDao subjectChangeDao;
     @Autowired
     private StudentVisitDao studentVisitDao;
+    @Autowired
+    private SubjectDao subjectDao;
 
     private SimpleDateFormat sdf_ymd = new SimpleDateFormat("yyyy-MM-dd");
 
@@ -391,7 +336,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                         || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().equals("{}"))) {
                     throw new BizException(musicGroupSubjectGoodsGroup.getName() + " 请选择提供方式");
                 }
-                if(musicGroupSubjectGoodsGroup.getGroupRemissionCourseFee() == null){
+                if (musicGroupSubjectGoodsGroup.getGroupRemissionCourseFee() == null) {
                     musicGroupSubjectGoodsGroup.setGroupRemissionCourseFee(0);
                 }
             }
@@ -612,8 +557,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                     }
                     if (!kitGroupPurchaseType.equals("GROUP")) {
                         goodsGroup.setPrice(kitGroupPurchaseType.equals("FREE") ? new BigDecimal(0) : goodsGroup.getDepositFee());
-                    }else{
-                        remitCourseRFeeFlag  = goodsGroup.getGroupRemissionCourseFee().equals(1);
+                    } else {
+                        remitCourseRFeeFlag = goodsGroup.getGroupRemissionCourseFee().equals(1);
                     }
                     goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.valueOf(kitGroupPurchaseType));
                     remitFee = groupType.get(kitGroupPurchaseType) == null ? BigDecimal.ZERO : groupType.get(kitGroupPurchaseType);
@@ -667,7 +612,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (registerPayDto.getNewCourse() != null && registerPayDto.getNewCourse().size() > 0) {
             newCourses = musicGroupPaymentCalenderCourseSettingsDao.getCalenderCourseSettings(registerPayDto.getNewCourse());
             for (MusicGroupPaymentCalenderCourseSettings calenderCourseSetting : newCourses) {
-                if(remitCourseRFeeFlag && !calenderCourseSetting.getIsStudentOptional()){
+                if (remitCourseRFeeFlag && !calenderCourseSetting.getIsStudentOptional()) {
                     courseRemitFee = courseRemitFee.add(calenderCourseSetting.getCourseCurrentPrice());
                     continue;
                 }
@@ -832,7 +777,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                     }
                     if (!kitGroupPurchaseType.equals("GROUP")) {
                         goodsGroup.setPrice(kitGroupPurchaseType.equals("FREE") ? new BigDecimal(0) : goodsGroup.getDepositFee());
-                    }else {
+                    } else {
                         remitCourseRFeeFlag = goodsGroup.getGroupRemissionCourseFee().equals(1);
                     }
                     goodsGroup.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.valueOf(kitGroupPurchaseType));
@@ -887,7 +832,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (registerPayDto.getNewCourse() != null && registerPayDto.getNewCourse().size() > 0) {
             newCourses = musicGroupPaymentCalenderCourseSettingsDao.getCalenderCourseSettings(registerPayDto.getNewCourse());
             for (MusicGroupPaymentCalenderCourseSettings calenderCourseSetting : newCourses) {
-                if(remitCourseRFeeFlag && !calenderCourseSetting.getIsStudentOptional()){
+                if (remitCourseRFeeFlag && !calenderCourseSetting.getIsStudentOptional()) {
                     courseRemitFee = courseRemitFee.add(calenderCourseSetting.getCourseCurrentPrice());
                     continue;
                 }
@@ -1021,7 +966,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                             || musicGroupSubjectGoodsGroup.getKitGroupPurchaseTypeJson().equals("{}"))) {
                         throw new BizException(musicGroupSubjectGoodsGroup.getName() + " 请选择提供方式");
                     }
-                    if(musicGroupSubjectGoodsGroup.getGroupRemissionCourseFee()==null){
+                    if (musicGroupSubjectGoodsGroup.getGroupRemissionCourseFee() == null) {
                         musicGroupSubjectGoodsGroup.setGroupRemissionCourseFee(0);
                     }
                 }
@@ -1562,23 +1507,23 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroup == null) {
             throw new BizException("乐团不存在");
         }
-        
-        if(musicGroup.getStatus() == MusicGroupStatusEnum.CANCELED || musicGroup.getStatus() == MusicGroupStatusEnum.PAUSE){
-        	throw new BizException("申请失败,乐团状态[已取消]或[已暂停]");
+
+        if (musicGroup.getStatus() == MusicGroupStatusEnum.CANCELED || musicGroup.getStatus() == MusicGroupStatusEnum.PAUSE) {
+            throw new BizException("申请失败,乐团状态[已取消]或[已暂停]");
         }
         Integer userId = sysUser.getId();
-        
+
         StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
         if (studentRegistration == null) {
             throw new BizException("用户注册信息不存在");
         }
-        
+
         MusicGroupQuit musicGroupQuit = musicGroupQuitDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
-    	if(musicGroupQuit != null){
-    		if(musicGroupQuit.getStatus() == ApprovalStatus.PROCESSING){
-    			throw new BizException("申请失败,存在[申请中]的记录");
-    		}
-    	}
+        if (musicGroupQuit != null) {
+            if (musicGroupQuit.getStatus() == ApprovalStatus.PROCESSING) {
+                throw new BizException("申请失败,存在[申请中]的记录");
+            }
+        }
 
         musicGroupQuit = new MusicGroupQuit();
         musicGroupQuit.setCreateTime(new Date());
@@ -1598,18 +1543,18 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()),
                 MessageTypeEnum.BACKSTAGE_STUDENT_APPLY_QUIT_GROUP, JSONObject.toJSONString(memo), sysUser.getUsername());
         Map<Integer, String> receivers = new HashMap<>(1);
-        receivers.put(musicGroup.getEducationalTeacherId(),musicGroup.getEducationalTeacherId().toString());
-        sysMessageService.batchSendMessage(MessageSender.JIGUANG,MessageTypeEnum.PUSH_STUDENT_COMMIT_QUIT_MUSIC_APPLY,
-                receivers,null,0,null,"SYSTEM",musicGroup.getName(),sysUser.getUsername());
+        receivers.put(musicGroup.getEducationalTeacherId(), musicGroup.getEducationalTeacherId().toString());
+        sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.PUSH_STUDENT_COMMIT_QUIT_MUSIC_APPLY,
+                receivers, null, 0, null, "SYSTEM", musicGroup.getName(), sysUser.getUsername());
         return true;
     }
 
     @Override
-	public boolean cancelQuitMusicGroup(Integer userId, String musicGroupId, String reason) {
-    	MusicGroupQuit musicGroupQuit = musicGroupQuitDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
-    	if(musicGroupQuit == null){
-    		throw new BizException("操作失败,没有查询到退团记录");
-    	}
+    public boolean cancelQuitMusicGroup(Integer userId, String musicGroupId, String reason) {
+        MusicGroupQuit musicGroupQuit = musicGroupQuitDao.queryByUserIdAndMusicGroupId(userId, musicGroupId);
+        if (musicGroupQuit == null) {
+            throw new BizException("操作失败,没有查询到退团记录");
+        }
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             throw new BizException("用户信息获取失败");
@@ -1618,19 +1563,19 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroup == null) {
             throw new BizException("乐团不存在");
         }
-    	musicGroupQuit.setStatus(ApprovalStatus.CANCELED);
+        musicGroupQuit.setStatus(ApprovalStatus.CANCELED);
         musicGroupQuit.setReason(reason);
         musicGroupQuit.setQuitDate(new Date());
         musicGroupQuitDao.update(musicGroupQuit);
 
         Map<Integer, String> receivers = new HashMap<>(1);
-        receivers.put(musicGroup.getEducationalTeacherId(),musicGroup.getEducationalTeacherId().toString());
-        sysMessageService.batchSendMessage(MessageSender.JIGUANG,MessageTypeEnum.PUSH_STUDENT_REVOKE_QUIT_MUSIC_APPLY,
-                receivers,null,0,null,"SYSTEM",musicGroup.getName(),sysUser.getUsername());
-    	return true;
-	}
+        receivers.put(musicGroup.getEducationalTeacherId(), musicGroup.getEducationalTeacherId().toString());
+        sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.PUSH_STUDENT_REVOKE_QUIT_MUSIC_APPLY,
+                receivers, null, 0, null, "SYSTEM", musicGroup.getName(), sysUser.getUsername());
+        return true;
+    }
 
-	@Override
+    @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean approveQuitMusicGroup(Long id, ApprovalStatus status, String reason, boolean isRefundCourseFee, boolean isRefundInstrumentFee,
                                          boolean isRefundTeachingAssistantsFee) {
@@ -1642,14 +1587,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         String musicGroupId = musicGroupQuit.getMusicGroupId();
         Integer userId = musicGroupQuit.getUserId();
-        
+
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
         if (musicGroup == null) {
             throw new BizException("乐团不存在");
         }
-        
-        if(musicGroup.getStatus() == MusicGroupStatusEnum.CANCELED || musicGroup.getStatus() == MusicGroupStatusEnum.PAUSE){
-        	throw new BizException("申请失败,乐团状态[已取消]或[已暂停]");
+
+        if (musicGroup.getStatus() == MusicGroupStatusEnum.CANCELED || musicGroup.getStatus() == MusicGroupStatusEnum.PAUSE) {
+            throw new BizException("申请失败,乐团状态[已取消]或[已暂停]");
         }
 
         musicGroupQuit.setStatus(status);
@@ -1740,7 +1685,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
             if (isRefundCourseFee) {
                 // 退课程费用
-            	amount = amount.add(studentRegistration.getSurplusCourseFee());
+                amount = amount.add(studentRegistration.getSurplusCourseFee());
             }
 
             SubjectChange studentLastChange = null;
@@ -1797,9 +1742,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (musicGroup == null) {
             throw new BizException("乐团不存在");
         }
-        
-        if(musicGroup.getStatus() == MusicGroupStatusEnum.CANCELED || musicGroup.getStatus() == MusicGroupStatusEnum.PAUSE){
-        	throw new BizException("申请失败,乐团状态[已取消]或[已暂停]");
+
+        if (musicGroup.getStatus() == MusicGroupStatusEnum.CANCELED || musicGroup.getStatus() == MusicGroupStatusEnum.PAUSE) {
+            throw new BizException("申请失败,乐团状态[已取消]或[已暂停]");
         }
 
         // 判断乐器是否是租赁
@@ -1807,7 +1752,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (studentRegistration == null) {
             throw new BizException("用户注册信息不存在");
         }
-        
+
         Date date = new Date();
 
         MusicGroupQuit musicGroupQuit = new MusicGroupQuit();
@@ -1896,7 +1841,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         if (isRefundCourseFee) {
             // 退课程费用
-        	amount = amount.add(studentRegistration.getSurplusCourseFee());
+            amount = amount.add(studentRegistration.getSurplusCourseFee());
         }
 
         SubjectChange studentLastChange = null;
@@ -1936,7 +1881,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             sysUserCashAccountDetailService.addCashAccountDetail(userId, amount, SysUserCashAccountDetailService.MUSIC_GROUP + musicGroupId, "",
                     PlatformCashAccountDetailTypeEnum.REFUNDS, null, SUCCESS, "退出乐团", null);
         }
-        
+
         return true;
     }
 
@@ -2085,16 +2030,19 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             //当前乐团报名是否赠送乐团网管课
             MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.findByOrderId(studentPaymentOrder.getId());
             MusicGroupStudentFee musicGroupStudentFee = musicGroupPaymentCalenderService.updateCalender(calenderDetail.getId(), studentRegistration.getUserId());
-            musicGroupStudentFee.setUpdateTime(date);
-            musicGroupStudentFee.setLatestPaidTime(date);
-            musicGroupStudentFee.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
-            musicGroupStudentFee.setTemporaryCourseFee(new BigDecimal(0));
+            if (musicGroupStudentFee != null) {
+                musicGroupStudentFee.setUpdateTime(date);
+                musicGroupStudentFee.setLatestPaidTime(date);
+                musicGroupStudentFee.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
+                musicGroupStudentFee.setTemporaryCourseFee(new BigDecimal(0));
+                musicGroupStudentFeeDao.update(musicGroupStudentFee);
+            }
             /*if (musicGroupPaymentCalender.getType().equals(MusicGroupPaymentCalender.FeeType.ONLINE)) {
                 Integer getRemainNetworkClassTimes = musicGroupStudentFee.getRemainNetworkClassTimes() == null ? 0 : musicGroupStudentFee.getRemainNetworkClassTimes();
                 musicGroupStudentFee.setRemainNetworkClassTimes(getRemainNetworkClassTimes + 1);
             }*/
 //            musicGroupStudentFee.setNextPaymentDate(musicGroupPaymentCalenderService.getNextPaymentDate(musicGroupId, musicGroupStudentFee.getNextPaymentDate(), musicGroupStudentFee));
-            musicGroupStudentFeeDao.update(musicGroupStudentFee);
+
 
             //插入交易明细
             SysUserCashAccount cashAccount = sysUserCashAccountService.get(userId);
@@ -2625,4 +2573,63 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         roleIds.add(SysUserRole.SECTION_MANAGER);
         sysMessageService.batchSeoMessage(musicGroupDao.queryUserIdByRoleId(roleIds, musicGroup.getOrganId()), MessageTypeEnum.BACKSTAGE_MUSIC_GROUP_MARKING, "", musicGroup.getName());
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<StudentRegistration> addMusicGroupRegs(String musicGroupId, List<Long> registerIds) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || sysUser.getId() == null) {
+            throw new BizException("获取用户信息失败");
+        }
+        List<StudentRegistration> studentRegistrations = studentRegistrationDao.findStudentListByIdList(registerIds);
+        List<Integer> subjectIds = studentRegistrations.stream().map(StudentRegistration::getActualSubjectId).collect(Collectors.toList());
+        List<Subject> subjects = subjectDao.findBySubjectIds(subjectIds);
+        Map<Integer, List<Subject>> subjectMap = subjects.stream().collect(Collectors.groupingBy(Subject::getId));
+        List<MusicGroupSubjectPlan> musicSubjectClassPlans = musicGroupSubjectPlanDao.getMusicSubjectClassPlan(musicGroupId);
+
+        Map<Integer, List<StudentRegistration>> regsMap = studentRegistrations.stream().collect(Collectors.groupingBy(StudentRegistration::getActualSubjectId));
+        List<StudentRegistration> studentRegistrationList = new ArrayList<>();
+        regsMap.forEach((subjectId, regs) -> {
+            boolean hasSubject = false;
+            MusicGroupSubjectPlan subjectPlan = null;
+            for (MusicGroupSubjectPlan musicGroupSubjectPlan : musicSubjectClassPlans) {
+                if (!subjectId.equals(musicGroupSubjectPlan.getSubjectId())) continue;
+                hasSubject = true;
+                musicGroupSubjectPlan.setApplyStudentNum(regs.size());
+                subjectPlan = musicGroupSubjectPlan;
+            }
+            if (!hasSubject) {
+                String name = subjectMap.get(subjectId).get(0).getName();
+                throw new BizException("当前乐团没有学员包含的声部(" + name + ")");
+            }
+            //更新乐团声部计划信息
+            musicGroupSubjectPlanDao.update(subjectPlan);
+
+            for (StudentRegistration studentRegistration : regs) {
+                studentRegistration.setId(null);
+                studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.APPLY);
+                studentRegistration.setPaymentStatus(PaymentStatusEnum.NO);
+                studentRegistration.setMusicGroupId(musicGroupId);
+                studentRegistration.setSubjectId(subjectId);
+                studentRegistration.setActualSubjectId(subjectId);
+                studentRegistration.setTemporaryCourseFee(null);
+            }
+            studentRegistrationList.addAll(regs);
+        });
+
+        //添加的学生
+        if (studentRegistrationList.size() > 0) {
+            studentRegistrationDao.batchInsert(studentRegistrationList);
+        }
+
+        //修改乐团信息
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        musicGroup.setIsExtraClass(YesOrNoEnum.YES);
+        musicGroupDao.update(musicGroup);
+
+        musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId, "添加报名学员", sysUser.getId(), ""));
+
+        return studentRegistrationList;
+    }
+
 }

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

@@ -144,7 +144,7 @@ public class MusicGroupSubjectPlanServiceImpl extends BaseServiceImpl<Integer, M
     }
 
     @Override
-    public void addApplyStudentNum(String musicGroupId, Integer subjectId, int num) throws Exception {
+    public void addApplyStudentNum(String musicGroupId, Integer subjectId, int num){
         boolean flag = false;
         for (int i = 10; i >= 1; i--) {
             MusicGroupSubjectPlan musicOneSubjectClassPlan = musicGroupSubjectPlanDao.getMusicOneSubjectClassPlan(musicGroupId, subjectId);

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

@@ -1,33 +1,30 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.HfMemberDao;
 import com.ym.mec.biz.dal.dao.StudentPaymentRouteOrderDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.AmountChannelDto;
 import com.ym.mec.biz.dal.dto.RouteScaleDto;
-import com.ym.mec.biz.dal.entity.Group;
-import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
-import com.ym.mec.biz.dal.entity.SysAccount;
-import com.ym.mec.biz.dal.entity.SysPaymentConfig;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.FeeTypeEnum;
 import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
-import com.ym.mec.biz.dal.enums.PaymentChannelTypeEnum;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.redis.service.RedisCache;
 import com.ym.mec.thirdparty.adapay.ConfigInit;
 import com.ym.mec.thirdparty.adapay.Payment;
-import com.ym.mec.thirdparty.union.UnionPay;
-import com.ym.mec.thirdparty.union.UnionPayFeignService;
 import com.ym.mec.thirdparty.yqpay.YqPayUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -45,6 +42,10 @@ public class PayServiceImpl implements PayService {
     private StudentPaymentRouteOrderDao studentPaymentRouteOrderDao;
     @Autowired
     private SellOrderService sellOrderService;
+    @Autowired
+    private HfMemberDao hfMemberDao;
+    @Autowired
+    private RedisCache<String, Object> redisCache;
 
     @Override
     public Map<String, Object> getPayMap(BigDecimal amount, BigDecimal balanceAmount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, Integer organId, String receiver) throws Exception {
@@ -73,6 +74,11 @@ public class PayServiceImpl implements PayService {
             routeScaleDtos = getPaymentConfigChannel(organId, amount);
         }
 
+        //验证最大收款金额
+        for (RouteScaleDto routeScaleDto : routeScaleDtos) {
+            checkMaxReceipt(routeScaleDto, routeScaleDto.getMerNo());
+        }
+
         return getPayRoute(amount, balanceAmount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody, routeScaleDtos);
     }
 
@@ -290,6 +296,24 @@ public class PayServiceImpl implements PayService {
     }
 
     private Map<String, Object> getPayRoute(BigDecimal amount, BigDecimal balanceAmount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, List<RouteScaleDto> routeScaleDtos) throws Exception {
+        Map<String, List<RouteScaleDto>> routeScaleDtosMap = routeScaleDtos.stream().collect(Collectors.groupingBy(RouteScaleDto::getMerNo));
+
+        //合并同账号的数据
+        List<RouteScaleDto> newRouteScaleDtos = new ArrayList<>();
+        for (Map.Entry<String, List<RouteScaleDto>> groupRouteScaleDtos : routeScaleDtosMap.entrySet()) {
+            RouteScaleDto routeScaleDto = null;
+            for (RouteScaleDto scaleDto : groupRouteScaleDtos.getValue()) {
+                if (routeScaleDto == null) {
+                    routeScaleDto = scaleDto;
+                } else {
+                    routeScaleDto.setAmount(routeScaleDto.getAmount().add(scaleDto.getAmount()));
+                    routeScaleDto.setBalance(routeScaleDto.getBalance().add(scaleDto.getBalance()));
+                }
+            }
+            newRouteScaleDtos.add(routeScaleDto);
+        }
+        routeScaleDtos = newRouteScaleDtos;
+
         Map<String, Object> unionPay = new HashMap<>();
         Map<String, Object> payMap = null;
 
@@ -345,16 +369,9 @@ public class PayServiceImpl implements PayService {
             routingList.put("routingMerNo", routeScaleDto.getMerNo());//分佣账户
             routingList.put("routingFee", routingFee); //分佣金额
             tempRoutingList.add(routingList);
-            if (routeScaleDto.getFeeFlag().equals("Y")) {
-                feeFlag = true;
-            }
-            if (i == routeScaleDtos.size() && !feeFlag) {
-                routeScaleDto.setFeeFlag("Y");
-            }
+
             //ADAPAY 采用延迟分账模式,手续费各自承担(2021-01-01号正式执行)
-            String delayRouteStartDate = sysConfigDao.findConfigValue("delay_route_start_date");
-            if (routeScaleDto.getPayType().equals(PaymentChannelEnum.ADAPAY) &&
-                    new Date().after(Objects.requireNonNull(DateUtil.stringToDate(delayRouteStartDate, "yyyy-MM-dd HH:mm:ss")))) {
+            if (routeScaleDto.getPayType().equals(PaymentChannelEnum.ADAPAY)) {
                 routeScaleDto.setFeeFlag("Y");
             }
 
@@ -505,4 +522,56 @@ public class PayServiceImpl implements PayService {
         }
         return newRouteScaleDtos;
     }
+
+
+    /**
+     * 收款已满转到其他收款账户
+     *
+     * @param routeScaleDto
+     * @param merNo
+     * @return
+     */
+    private RouteScaleDto checkMaxReceipt(RouteScaleDto routeScaleDto, String merNo) {
+        HfMember hfmember = hfMemberDao.getByMemberId(routeScaleDto.getMerNo());
+        if (hfmember == null || hfmember.getMonthMaxReceipt().compareTo(BigDecimal.ZERO) <= 0) {
+            return routeScaleDto;
+        }
+
+        BigDecimal monthMaxReceipt = hfmember.getMonthMaxReceipt(); //每月限定金额
+        Date dayStartTime = DateUtil.trunc(new Date());
+
+        //已收金额
+        List<PaymentChannelEnum> paymentChannelList = new ArrayList<>();
+        paymentChannelList.add(PaymentChannelEnum.ADAPAY);
+
+//        String key = "month_max_receipt_"+routeScaleDto.getOrganId();
+//        if(redisCache.exists(key)){
+//            RedisTemplate<String, Object> redisTemplate = redisCache.getRedisTemplate();
+//            try {
+//                ValueOperations<String, Object> valueOper = redisTemplate.opsForValue();
+//                Long index = valueOper.increment(key, 1);
+//            } catch (Exception ex) {
+//                log.error("分布式订单号生成失败异常。。。。。", ex);
+//            } finally {
+//                redisTemplate.expire(key, 600, TimeUnit.SECONDS);// 保留10分钟内的key
+//            }
+//        }else {
+            BigDecimal monthHasReceipt = studentPaymentRouteOrderDao.getRouteOrderAmount(routeScaleDto.getOrganId(), paymentChannelList, dayStartTime);
+            monthHasReceipt = monthHasReceipt == null ? BigDecimal.ZERO : monthHasReceipt;
+//            monthHasReceipt.multiply(new BigDecimal(100));
+//
+//        }
+
+
+
+        if (routeScaleDto.getAmount().add(monthHasReceipt).compareTo(monthMaxReceipt) > 0) {
+            routeScaleDto.setMerNo(hfmember.getRouteMemberId());
+            routeScaleDto.setOrganId(hfmember.getRouteOrganId());
+            if (routeScaleDto.getMerNo().equals(merNo)) {
+                return routeScaleDto;
+            }
+            return checkMaxReceipt(routeScaleDto, merNo);
+        }
+        return routeScaleDto;
+    }
 }

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

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

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

@@ -262,7 +262,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         callOrderCallBack(order);
     }
 
-    private Boolean confirmOrder(StudentPaymentOrder order) throws Exception {
+    private Boolean confirmOrder(StudentPaymentOrder order) {
         String delayRouteStartDate = sysConfigDao.findConfigValue("delay_route_start_date");
         if (order.getCreateTime().before(Objects.requireNonNull(DateUtil.stringToDate(delayRouteStartDate, "yyyy-MM-dd HH:mm:ss")))) {
             return true;
@@ -284,7 +284,11 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             confirm.put("order_no", idGeneratorService.generatorId("payment"));
             confirm.put("confirm_amt", routeOrder.getRouteAmount());
             confirm.put("div_members", divMembers);
-            Payment.createConfirm(confirm);
+            try {
+                Payment.createConfirm(confirm);
+            } catch (Exception e) {
+                continue;
+            }
         }
         return true;
     }

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

@@ -130,11 +130,11 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
     @Override
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public StudentPaymentRouteOrder addOutOrder(StudentPaymentRouteOrder studentPaymentRouteOrder) {
-        Map<String, Object> params = new HashMap<>();
-        params.put("transNo", studentPaymentRouteOrder.getTransNo());
-        if (studentPaymentRouteOrderDao.queryAuditCount(params) > 0) {
-            throw new BizException("流水号不能重复");
-        }
+//        Map<String, Object> params = new HashMap<>();
+//        params.put("transNo", studentPaymentRouteOrder.getTransNo());
+//        if (studentPaymentRouteOrderDao.queryAuditCount(params) > 0) {
+//            throw new BizException("流水号不能重复");
+//        }
         if (studentPaymentRouteOrder.getCalenderId() != null) {
             MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderDao.getSchoolCalender(studentPaymentRouteOrder.getCalenderId());
             if (musicGroupPaymentCalender == null) {

+ 89 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -16,6 +16,7 @@ import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 
+import com.ym.mec.auth.api.enums.CertificateTypeEnum;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -122,6 +123,10 @@ import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
 
+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;
+
 @Service
 public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, StudentRegistration> implements StudentRegistrationService {
 
@@ -785,9 +790,9 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             BigDecimal reduce = studentPaymentOrderDetails.stream().map(StudentPaymentOrderDetail::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
             MusicGroupStudentFee.PaymentStatus paymentStatus = MusicGroupStudentFee.PaymentStatus.NON_PAYMENT;
             if (reduce.compareTo(BigDecimal.ZERO) == 0) {
-                paymentStatus = MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED;
+                paymentStatus = PAID_COMPLETED;
                 studentPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
-                studentRegistration.setPaymentStatus(PaymentStatusEnum.YES);
+                studentRegistration.setPaymentStatus(YES);
                 studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
                 studentPaymentOrder.setActualAmount(reduce);
                 studentPaymentOrder.setPayTime(date);
@@ -833,6 +838,75 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void insertStudent(String studentIds,String oldMusicGroupId,String newMusicGroupId,BigDecimal masterTotalPrice){
+        SysUser sysUser1 = sysUserFeignService.queryUserInfo();
+        //获取旧乐团学员注册信息
+        List<StudentRegistration> studentRegistrations = studentRegistrationDao.queryByUserIdsAndMusicGroupId(studentIds,oldMusicGroupId);
+        List<StudentCourseFeeDetail> studentCourseFeeDetails = new ArrayList<>();
+        for (StudentRegistration studentRegistration : studentRegistrations) {
+            //用户是否在主乐团
+            StudentRegistration phoneAndMusicGroupId = studentRegistrationDao.getByPhoneAndMusicGroupId(newMusicGroupId, studentRegistration.getParentsPhone());
+            if (phoneAndMusicGroupId != null && phoneAndMusicGroupId.getMusicGroupStatus() != StudentMusicGroupStatusEnum.QUIT && phoneAndMusicGroupId.getMusicGroupStatus() != StudentMusicGroupStatusEnum.APPLY) {
+                //该学员已存在
+                continue;
+            }
+            SysUser sysUser = studentRegistrationDao.getSysUserByPhone(studentRegistration.getParentsPhone());
+            if (StringUtils.isNotEmpty(sysUser.getUsername())) {
+                if (!sysUser.getUsername().equals(studentRegistration.getName())) {
+                    //账户已被注册
+                    continue;
+                }
+            }
+            //记录课程余额消费日志
+            if(studentRegistration.getSurplusCourseFee().doubleValue() > 0d){
+                StudentCourseFeeDetail studentCourseFeeDetail = new StudentCourseFeeDetail();
+                if(studentRegistration.getSurplusCourseFee().doubleValue() > masterTotalPrice.doubleValue()){
+                    studentCourseFeeDetail.setAmount(masterTotalPrice);
+                    studentCourseFeeDetail.setSurplusCourseFee(studentRegistration.getSurplusCourseFee().subtract(masterTotalPrice));
+                }else {
+                    studentCourseFeeDetail.setAmount(studentRegistration.getSurplusCourseFee());
+                    studentCourseFeeDetail.setSurplusCourseFee(BigDecimal.ZERO);
+                }
+                studentRegistration.setSurplusCourseFee(studentCourseFeeDetail.getSurplusCourseFee());
+                studentCourseFeeDetail.setMemo("跨团合班消费");
+                studentCourseFeeDetail.setOperator(sysUser1.getId());
+                studentCourseFeeDetails.add(studentCourseFeeDetail);
+            }
+            //当前学员是否以前存在过当前乐团
+            studentRegistration.setMusicGroupId(newMusicGroupId);
+            if (phoneAndMusicGroupId != null) {
+                studentRegistration.setId(phoneAndMusicGroupId.getId());
+                studentRegistrationDao.update(studentRegistration);
+            } else {
+                studentRegistrationDao.insertBasic(studentRegistration);
+            }
+            MusicGroupStudentFee studentFeeDaoByUser = musicGroupStudentFeeDao.findByUser(studentRegistration.getUserId(), newMusicGroupId);
+            if (studentFeeDaoByUser != null) {
+//                该学员已存在
+                continue;
+            }
+            //增加报名学生数
+            musicGroupSubjectPlanService.addApplyStudentNum(newMusicGroupId, studentRegistration.getSubjectId(), 1);
+            //新增Fee表
+            MusicGroupStudentFee musicGroupStudentFee = null;
+            musicGroupStudentFee = musicGroupStudentFeeDao.findByUser(studentRegistration.getUserId(),oldMusicGroupId);
+            if(musicGroupStudentFee != null){
+                musicGroupStudentFee.setMusicGroupId(newMusicGroupId);
+                musicGroupStudentFeeDao.update(musicGroupStudentFee);
+            }else {
+                musicGroupStudentFee = new MusicGroupStudentFee(newMusicGroupId,
+                        studentRegistration.getUserId(), studentRegistration.getSubjectId(),BigDecimal.ZERO,
+                        null, studentRegistration.getTemporaryCourseFee(), studentRegistration.getPaymentStatus()==YES?PAID_COMPLETED:NON_PAYMENT);
+                musicGroupStudentFeeDao.insert(musicGroupStudentFee);
+            }
+        }
+        if(studentCourseFeeDetails.size() > 0){
+            studentCourseFeeDetailDao.batchInsert(studentCourseFeeDetails);
+        }
+    }
+
     private List<CourseSchedule> addStudent(Integer classGroupId, Integer userId, Date date, List<CourseSchedule> courseScheduleList) {
         ClassGroup classGroup = classGroupDao.get(classGroupId);
         ClassGroupStudentMapper classGroupStudentMapper = classGroupStudentMapperDao.findClassStudentMapperByUserIdAndClassGroupId(userId, classGroupId, null);
@@ -932,7 +1006,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             musicGroupStudentFee.setRemainNetworkClassTimes(musicGroupStudentFee.getRemainNetworkClassTimes() + 1);
         }
         //更新学生的缴费记录状态
-        calenderDetail.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED);
+        calenderDetail.setPaymentStatus(PAID_COMPLETED);
         calenderDetail.setActualAmount(calenderDetail.getExpectAmount());
         calenderDetail.setPayTime(date);
         calenderDetail.setUpdateTime(date);
@@ -958,7 +1032,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         //成功报名状态变更
         StudentRegistration studentRegistration = studentRegistrationDao.queryByUserIdAndMusicGroupId(studentPaymentOrder.getUserId(), studentPaymentOrder.getMusicGroupId());
 
-        if (studentRegistration.getPaymentStatus().equals(PaymentStatusEnum.YES)) {
+        if (studentRegistration.getPaymentStatus().equals(YES)) {
             return studentPaymentOrder;
         }
         MusicGroupSubjectPlan musicOneSubjectClassPlan = musicGroupSubjectPlanService.getMusicOneSubjectClassPlan(studentRegistration.getMusicGroupId(), studentRegistration.getActualSubjectId());
@@ -969,7 +1043,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             if (studentRegistration.getTemporaryCourseFee() != null) {
                 studentRegistration.setTemporaryCourseFee(new BigDecimal(0));
             }
-            studentRegistration.setPaymentStatus(PaymentStatusEnum.YES);
+            studentRegistration.setPaymentStatus(YES);
             studentRegistration.setMusicGroupStatus(StudentMusicGroupStatusEnum.NORMAL);
 
             List<StudentPaymentOrderDetail> orderDetails = studentPaymentOrderDetailService.getOrderDetail(studentPaymentOrder.getId());
@@ -999,7 +1073,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 waitPayOrder.setStatus(DealStatusEnum.CLOSE);
                 studentPaymentOrderService.update(waitPayOrder);
                 musicGroupStudentFee.setLatestPaidTime(nowDate);
-                musicGroupStudentFee.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED);
+                musicGroupStudentFee.setPaymentStatus(PAID_COMPLETED);
                 musicGroupStudentFee.setTemporaryCourseFee(BigDecimal.ZERO);
                 musicGroupStudentFee.setUpdateTime(nowDate);
             }
@@ -1110,7 +1184,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         Date nowDate = new Date();
         MusicGroupStudentFee musicGroupStudentFee = new MusicGroupStudentFee();
         musicGroupStudentFee.setLatestPaidTime(nowDate);
-        musicGroupStudentFee.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED);
+        musicGroupStudentFee.setPaymentStatus(PAID_COMPLETED);
         musicGroupStudentFee.setUpdateTime(nowDate);
         musicGroupStudentFee.setContinuousAbsenteeismTimes(0);
         musicGroupStudentFee.setSubjectId(studentRegistration.getActualSubjectId());
@@ -1178,7 +1252,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 } else {
                     musicGroupPaymentCalenderDetail.setActualAmount(courseTotalPrice);
                 }
-                musicGroupPaymentCalenderDetail.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED);
+                musicGroupPaymentCalenderDetail.setPaymentStatus(PAID_COMPLETED);
                 musicGroupPaymentCalenderDetail.setPayTime(nowDate);
                 musicGroupPaymentCalenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
                 musicGroupPaymentCalenderDetail.setUseInCourse(0);
@@ -1316,6 +1390,9 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     @Override
     @Transactional
     public StudentRegistration updateStudent(StudentRegistration studentRegistration) {
+        if(StringUtils.isBlank(studentRegistration.getCertificateType())){
+            studentRegistration.setCertificateType(CertificateTypeEnum.IDENTITY.getCode());
+        }
         StudentRegistration student = get(studentRegistration.getId());
         if (student == null) {
             throw new BizException("用户注册信息不存在,无法更新");
@@ -1323,9 +1400,11 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         student.setParentsName(studentRegistration.getParentsName());
         student.setIdCardNo(studentRegistration.getIdCardNo());
         update(student);
-        studentRegistrationDao.updateUser(student.getUserId(), student.getParentsName(), student.getIdCardNo());
+        studentRegistrationDao.updateUser(student.getUserId(), student.getParentsName(), student.getIdCardNo(), studentRegistration.getCertificateType());
         // 添加用户电子签章账户
-        contractService.register(student.getUserId(), student.getParentsName(), student.getIdCardNo(), student.getParentsPhone());
+        if(CertificateTypeEnum.IDENTITY.getCode().equals(studentRegistration.getCertificateType())){
+            contractService.register(student.getUserId(), student.getParentsName(), student.getIdCardNo(), student.getParentsPhone());
+        }
         return student;
     }
 

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

@@ -312,7 +312,7 @@ public class StudentServeServiceImpl implements StudentServeService {
 //            return;
 //        }
 
-        List<StudentServeCourseDto> studentFutureCourseInfo = studentDao.getStudentFutureCourseInfo(monDayDate.toString(), studentIds);
+        List<StudentServeCourseDto> studentFutureCourseInfo = studentDao.getStudentFutureCourseInfo(monDayDate.toString(), DateUtil.dateToString(nextMonday, "yyyy-MM-dd"), studentIds);
         if(CollectionUtils.isEmpty(studentFutureCourseInfo)){
             return;
         }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysPaymentConfigServiceImpl.java

@@ -63,4 +63,9 @@ public class SysPaymentConfigServiceImpl extends BaseServiceImpl<Integer, SysPay
         }
         return accountType;
     }
+
+    @Override
+    public SysPaymentConfig findPaymentConfigByMerNo(String merNo) {
+        return sysPaymentConfigDao.findPaymentConfigByMerNo(merNo);
+    }
 }

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

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 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.auth.api.enums.CertificateTypeEnum;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
@@ -1570,7 +1571,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				}
 			}
 		}
-		if(!"36".equals(user.getOrganId())){
+		if(!"36".equals(user.getOrganId())&& CertificateTypeEnum.IDENTITY.getCode().equals(user.getCertificateType())){
 			try {
 				contractService.register(user.getId(),user.getRealName(),user.getIdCardNo(),user.getPhone());
 			} catch (Exception e) {
@@ -1919,13 +1920,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		//学生剩余课时
         List<StudentCourseInfoDto> userSurplusCourseInfoByGroup = courseScheduleDao.findUserSurplusCourseInfoByGroup(GroupType.VIP, vipGroupId.toString(), studentId);
 
-		int days = 0;
-        if(!CollectionUtils.isEmpty(userSurplusCourseInfoByGroup)){
-        	LocalDate nowDate = LocalDate.now(DateUtil.zoneId);
-			StudentCourseInfoDto studentCourseInfoDto = userSurplusCourseInfoByGroup.stream().max(Comparator.comparing(StudentCourseInfoDto::getClassDate)).get();
-			days = (int) nowDate
-					.until((LocalDateTime.ofInstant(studentCourseInfoDto.getClassDate().toInstant(), DateUtil.zoneId).toLocalDate()), ChronoUnit.DAYS);
-		}
         int[] teachModeSequence=new int[userSurplusCourseInfoByGroup.size()];
         List<BigDecimal> coursePrices = new ArrayList<>();
         List<Long> courseScheduleIds=new ArrayList<>();
@@ -1936,7 +1930,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         }
         pauseInfos.put("teaChModeSequence", teachModeSequence);
         pauseInfos.put("coursePriceInfo",coursePrices);
-//        pauseInfos.put("days", days);
 
         StudentPauseInfo  studentPauseInfo=new StudentPauseInfo();
 		studentPauseInfo.setUserId(studentId);
@@ -2071,14 +2064,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				newCourseSchedules.get(i).setOrganId(vipGroup.getOrganId());
 			}
 
-			if(courseInfo1.containsKey("days")){
-				int surplusDays = Integer.valueOf(courseInfo1.get("days").toString());
-				LocalDate nowDate = LocalDate.now();
-				CourseSchedule courseSchedule = newCourseSchedules.stream().max(Comparator.comparing(CourseSchedule::getClassDate)).get();
-				int days = (int) nowDate.until(LocalDateTime.ofInstant(courseSchedule.getClassDate().toInstant(), DateUtil.zoneId), ChronoUnit.DAYS);
-				if(days>surplusDays){
-					throw new BizException("您必须在{}天内完成剩余课程", surplusDays);
-				}
+			CourseSchedule courseSchedule = newCourseSchedules.stream().max(Comparator.comparing(CourseSchedule::getClassDate)).get();
+			if(vipGroup.getCoursesExpireDate().compareTo(courseSchedule.getEndClassTime())<=0&&!DateUtil.isSameDay(vipGroup.getCoursesExpireDate(), courseSchedule.getEndClassTime())){
+				throw new BizException("排课时间不可超过{}", DateUtil.dateToString(vipGroup.getCoursesExpireDate(), "yyyy年MM月dd日"));
 			}
 
 			courseScheduleService.batchAddCourseSchedule(newCourseSchedules);
@@ -2112,6 +2100,12 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			throw new BizException("剩余课时不足,无法与现有课时对齐");
 		}
 
+
+		CourseSchedule lastCourseSchedule = surplusCourseWithGroup.stream().max(Comparator.comparing(CourseSchedule::getClassDate)).get();
+		if(vipGroup.getCoursesExpireDate().compareTo(lastCourseSchedule.getEndClassTime())<=0&&!DateUtil.isSameDay(vipGroup.getCoursesExpireDate(), lastCourseSchedule.getEndClassTime())){
+			throw new BizException("排课时间不可超过{}", DateUtil.dateToString(vipGroup.getCoursesExpireDate(), "yyyy年MM月dd日"));
+		}
+
 		List<CourseScheduleStudentPayment> courseScheduleStudentPaymentList = new ArrayList<>();
 		for (int i=0;i<surplusCourseWithGroup.size();i++) {
 			CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
@@ -2182,11 +2176,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		Map<BigDecimal, Long> collect = coursePrices.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
 		studentRecoverInfoDto.setGiveCourseTimes(Objects.isNull(collect.get(new BigDecimal("0.00")))?0:collect.get(new BigDecimal("0.00")).intValue());
 		studentRecoverInfoDto.setTotalCourseTimes(coursePrices.size()-studentRecoverInfoDto.getGiveCourseTimes());
+		studentRecoverInfoDto.setExpireDate(vipGroup.getCoursesExpireDate());
 
-		if(courseInfo.containsKey("days")){
-			int surplusDays = Integer.valueOf(courseInfo.get("days").toString());
-			studentRecoverInfoDto.setExpireDate(LocalDate.now().plusDays(surplusDays));
-		}
 		return studentRecoverInfoDto;
     }
 

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

@@ -99,9 +99,11 @@
                     <span>家长姓名:${studentInfo.realName!}</span>
                     <span>电话:${studentInfo.phone!}</span>
                 </div>
-                <div class="iInfo">
-                    <span>身份证号:${studentInfo.idCardNo!}</span>
-                </div>
+                <#if studentInfo.certificateType == 'IDENTITY'>
+                    <div class="iInfo">
+                        <span>身份证号:${studentInfo.idCardNo!}</span>
+                    </div>
+                </#if>
                 <div class="iInfo">
                     <span>学生姓名:${studentInfo.username!}</span>
                 </div>

+ 50 - 21
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -282,6 +282,7 @@
     <resultMap type="com.ym.mec.biz.dal.dto.ClassGroupTeachersDto" id="ClassGroupTeachers">
         <result column="id_" property="id"/>
         <result column="music_group_id_" property="musicGroupId"/>
+        <result column="music_group_name_" property="musicGroupName"/>
         <result column="subject_id_list_" property="subjectIdList"/>
         <result column="memo_" property="memo"/>
         <result column="name_" property="name"/>
@@ -312,7 +313,7 @@
         <result column="img_" property="img"/>
         <result column="teacher_ids_" property="teacherIds"/>
         <result column="group_name_" property="groupName"/>
-        <collection property="members" ofType="com.ym.mec.common.entity.ImGroupMember">
+        <collection property="memberList" ofType="com.ym.mec.common.entity.ImGroupMember">
             <result property="id" column="user_id_"/>
         </collection>
     </resultMap>
@@ -323,7 +324,7 @@
         LEFT JOIN class_group cg ON cgsm.class_group_id_ = cg.id_
         LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_
         <where>
-            cg.del_flag_ = 0 AND cgsm.status_ != 'QUIT' AND mg.status_ = 'PROGRESS' AND cgsm.group_type_ = 'MUSIC'
+            cg.del_flag_ = 0 AND cgsm.status_ != 'QUIT' AND mg.status_ IN ('PROGRESS','PAUSE') AND cgsm.group_type_ = 'MUSIC'
             <if test="userId != null">
                 AND cgsm.user_id_ = #{userId}
             </if>
@@ -341,7 +342,7 @@
         LEFT JOIN class_group cg ON cgsm.class_group_id_ = cg.id_
         LEFT JOIN vip_group vg ON vg.id_ = cg.music_group_id_
         <where>
-            cg.del_flag_ = 0 AND cgsm.status_ != 'QUIT' AND vg.group_status_ = 2 AND cgsm.group_type_ = 'VIP'
+            cg.del_flag_ = 0 AND cgsm.status_ != 'QUIT' AND vg.group_status_ IN (2,6) AND cgsm.group_type_ = 'VIP'
             <if test="userId != null">
                 AND cgsm.user_id_ = #{userId}
             </if>
@@ -473,12 +474,13 @@
         cg.student_num_,cg.img_,mg.name_ group_name_
         FROM class_group_teacher_mapper cgtm
         LEFT JOIN class_group cg ON cgtm.class_group_id_ = cg.id_
-        LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_ AND cg.group_type_ = 'MUSIC'
-        LEFT JOIN vip_group vg ON vg.id_ = cg.music_group_id_ AND cg.group_type_ = 'VIP'
-        LEFT JOIN courses_group csg ON csg.id_ = cg.music_group_id_ AND cg.group_type_ = 'COMM'
-        WHERE (cgtm.user_id_ = #{userId} OR mg.team_teacher_id_ = #{userId} OR mg.educational_teacher_id_ = #{userId} OR mg.director_user_id_ = #{userId})
-        AND cg.del_flag_ = 0 AND ((mg.status_ = 'PROGRESS' OR vg.group_status_ = 2 OR csg.status_ = 'NORMAL')
-        OR (vg.group_status_ = 2 AND vg.educational_teacher_id_ =  #{userId}) OR (csg.status_ = 'NORMAL' AND csg.educational_teacher_id_ =  #{userId}))
+        LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_
+        LEFT JOIN vip_group vg ON vg.id_ = cg.music_group_id_
+        LEFT JOIN courses_group csg ON csg.id_ = cg.music_group_id_
+        WHERE cg.del_flag_ = 0 AND
+        ((mg.status_ IN ('PROGRESS','PAUSE') AND cg.group_type_ = 'MUSIC' AND (cgtm.user_id_ = #{userId} OR mg.team_teacher_id_ = #{userId} OR mg.educational_teacher_id_ = #{userId} OR mg.director_user_id_ = #{userId}))
+        OR (vg.group_status_ IN (2,6) AND cg.group_type_ = 'VIP' AND vg.educational_teacher_id_ =  #{userId})
+        OR (csg.status_ = 'NORMAL' AND cg.group_type_ = 'COMM' AND csg.educational_teacher_id_ =  #{userId}))
         <if test="search != null">
             AND (cg.name_ LIKE CONCAT('%',#{search},'%') OR cg.group_name_ LIKE CONCAT('%',#{search},'%')
              OR mg.name_ LIKE CONCAT('%',#{search},'%'))
@@ -494,42 +496,42 @@
         LEFT JOIN vip_group vg ON vg.id_ = cg.music_group_id_
         LEFT JOIN courses_group csg ON csg.id_ = cg.music_group_id_
         WHERE cgtm.user_id_ != #{userId} AND cg.del_flag_ = 0
-        AND ((vg.group_status_ = 2 AND vg.educational_teacher_id_ =  #{userId} AND vg.organ_id_ = #{organId} AND cg.group_type_ = 'VIP')
-        OR (mg.status_ = 'PROGRESS' AND (mg.team_teacher_id_ = #{userId} OR mg.educational_teacher_id_ = #{userId} OR mg.director_user_id_ = #{userId})
-        AND mg.organ_id_ = #{organId} AND cg.group_type_ = 'MUSIC')
-        OR (csg.status_ = 'NORMAL' AND csg.educational_teacher_id_ =  #{userId} AND csg.organ_id_ = #{organId} AND cg.group_type_ = 'COMM'))
+        AND ((vg.educational_teacher_id_ =  #{userId} AND cg.group_type_ = 'VIP')
+        OR (cg.group_type_ = 'MUSIC' AND (mg.team_teacher_id_ = #{userId} OR mg.educational_teacher_id_ = #{userId} OR mg.director_user_id_ = #{userId}))
+        OR (csg.educational_teacher_id_ =  #{userId} AND cg.group_type_ = 'COMM'))
         GROUP BY cg.id_
     </select>
 
     <select id="queryEducationGroups" resultMap="imGroupModel">
-        SELECT cg.id_,CASE WHEN cg.group_name_ IS NULL OR cg.group_name_ = '' THEN cg.name_ ELSE cg.group_name_ END name_,#{userId} user_id_
+        SELECT cg.id_,CASE WHEN cg.group_name_ IS NULL OR cg.group_name_ = '' THEN cg.name_ ELSE cg.group_name_ END name_,#{transferUserId} user_id_
         FROM class_group_teacher_mapper cgtm
         LEFT JOIN class_group cg ON cgtm.class_group_id_ = cg.id_
         LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_
         LEFT JOIN vip_group vg ON vg.id_ = cg.music_group_id_
         LEFT JOIN courses_group csg ON csg.id_ = cg.music_group_id_
-        WHERE cg.del_flag_ = 0 AND ((vg.group_status_ = 2 AND vg.educational_teacher_id_ =  #{userId} AND vg.organ_id_ = #{organId} AND cg.group_type_ = 'VIP')
-        OR (mg.status_ = 'PROGRESS' AND mg.educational_teacher_id_ =  #{userId} AND mg.organ_id_ = #{organId} AND cg.group_type_ = 'MUSIC')
-        OR (csg.status_ = 'NORMAL' AND csg.educational_teacher_id_ =  #{userId} AND csg.organ_id_ = #{organId} AND cg.group_type_ = 'COMM'))
+        WHERE cg.del_flag_ = 0 AND
+        ((vg.group_status_ IN (2,6) AND cg.group_type_ = 'VIP' AND vg.educational_teacher_id_ =  #{userId} AND vg.organ_id_ = #{organId})
+        OR (mg.status_ IN ('PROGRESS','PAUSE') AND cg.group_type_ = 'MUSIC' AND mg.educational_teacher_id_ =  #{userId} AND mg.organ_id_ = #{organId})
+        OR (csg.status_ = 'NORMAL' AND cg.group_type_ = 'COMM' AND csg.educational_teacher_id_ =  #{userId} AND csg.organ_id_ = #{organId}))
         GROUP BY cg.id_
     </select>
 
     <select id="queryTeamTeacherGroups" resultMap="imGroupModel">
         SELECT cg.id_,CASE WHEN cg.group_name_ IS NULL OR cg.group_name_ = '' THEN cg.name_ ELSE cg.group_name_ END name_,
-               mg.team_teacher_id_ user_id_
+               #{transferUserId} user_id_
         FROM class_group_teacher_mapper cgtm
         LEFT JOIN class_group cg ON cgtm.class_group_id_ = cg.id_
         LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_
-        WHERE mg.team_teacher_id_ = #{userId} AND cg.del_flag_ = 0 AND mg.status_ = 'PROGRESS' AND cg.group_type_ = 'MUSIC'
+        WHERE mg.team_teacher_id_ = #{userId} AND cg.del_flag_ = 0 AND mg.status_ IN ('PROGRESS','PAUSE')  AND cg.group_type_ = 'MUSIC'
         GROUP BY cg.id_
     </select>
 
     <select id="queryDirectorGroups" resultMap="imGroupModel">
-        SELECT cg.id_,CASE WHEN cg.group_name_ IS NULL OR cg.group_name_ = '' THEN cg.name_ ELSE cg.group_name_ END name_,mg.director_user_id_ user_id_
+        SELECT cg.id_,CASE WHEN cg.group_name_ IS NULL OR cg.group_name_ = '' THEN cg.name_ ELSE cg.group_name_ END name_,#{transferUserId} user_id_
         FROM class_group_teacher_mapper cgtm
         LEFT JOIN class_group cg ON cgtm.class_group_id_ = cg.id_
         LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_ AND cg.group_type_ = 'MUSIC'
-        WHERE mg.director_user_id_ = #{userId} AND cg.del_flag_ = 0 AND mg.status_ = 'PROGRESS'
+        WHERE mg.director_user_id_ = #{userId} AND cg.del_flag_ = 0 AND mg.status_ IN ('PROGRESS','PAUSE')
         GROUP BY cg.id_
     </select>
 
@@ -1401,4 +1403,31 @@
         AND type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} AND del_flag_ = '0'
         AND INTE_ARRAY(subject_id_list_,#{subjectIds})
     </select>
+
+    <sql id="queryClassGroupPageSql">
+        <where>
+            cg.group_type_ = 'MUSIC' AND cg.del_flag_ = 0
+            <if test="type != null">
+                AND type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            </if>
+            <if test="organIdList != null and organIdList != ''">
+                AND FIND_IN_SET(mg.organ_id_,#{organIdList})
+            </if>
+            <if test="search != null and search != ''">
+                AND (mg.name_ LIKE CONCAT('%',#{search},'%') OR cg.music_group_id_ LIKE CONCAT('%',#{search},'%'))
+            </if>
+        </where>
+    </sql>
+    <select id="countClassGroup" resultType="int">
+        SELECT COUNT(cg.id_) FROM class_group cg
+        LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_
+        <include refid="queryClassGroupPageSql"/>
+    </select>
+    <select id="queryClassGroupPage" resultMap="ClassGroupTeachers">
+        SELECT cg.*,mg.name_ music_group_name_ FROM class_group cg
+        LEFT JOIN music_group mg ON mg.id_ = cg.music_group_id_
+        <include refid="queryClassGroupPageSql"/>
+        ORDER BY cg.id_ DESC
+        <include refid="global.limit"/>
+    </select>
 </mapper>

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

@@ -3380,7 +3380,7 @@
         SELECT COUNT(id_) FROM course_schedule WHERE new_course_id_=#{courseId}
     </select>
     <select id="querySubCourseNumMap" resultType="java.util.Map">
-        SELECT cs.type_ 'key',COUNT(CASE WHEN (CONCAT(cs.class_date_," ",cs.start_class_time_) > NOW()) THEN 1 ELSE NULL END) 'value' FROM course_schedule cs
+        SELECT cs.type_ 'key',COUNT(CASE WHEN (CONCAT(cs.class_date_,' ',cs.start_class_time_) > NOW()) THEN 1 ELSE NULL END) 'value' FROM course_schedule cs
         WHERE cs.class_group_id_ = #{classGroupId}
         GROUP BY cs.type_
     </select>

+ 5 - 6
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -664,11 +664,10 @@
 		CASE WHEN ta.complaints_status_=0 THEN '拒绝' WHEN ta.complaints_status_ = 1 THEN '通过'
 		WHEN ta.complaints_status_=2 THEN '待处理' WHEN ta.complaints_status_ = 3 THEN '已撤销' END complaints_status_,ta.dispose_content_,
 		ROUND((UNIX_TIMESTAMP(ta.sign_out_time_)-UNIX_TIMESTAMP(ta.sign_in_time_))/60) currentTime,
-		ta.sign_in_time_ signInTime,ta.sign_out_time_ signOutTime,COUNT(DISTINCT sp.id_) studentNum,COUNT(DISTINCT sa.id_) realStudentNum,ts.deduction_reason_
+		ta.sign_in_time_ signInTime,ta.sign_out_time_ signOutTime,COUNT(DISTINCT sp.id_) studentNum,ts.deduction_reason_
 		FROM course_schedule_teacher_salary ts
 		LEFT JOIN course_schedule cs ON ts.course_schedule_id_ = cs.id_
 		LEFT JOIN `teacher_attendance` ta ON ta.`teacher_id_` = ts.`user_id_` AND ta.`course_schedule_id_` = ts.`course_schedule_id_`
-		LEFT JOIN `student_attendance` sa ON sa.`course_schedule_id_` = ts.`course_schedule_id_` AND sa.status_ = 'NORMAL'
 		LEFT JOIN class_group cg ON cs.class_group_id_ = cg.id_
 		LEFT JOIN sys_user u ON ts.user_id_= u.id_
 		LEFT JOIN teacher t ON t.id_ = ts.user_id_
@@ -700,7 +699,7 @@
 		CASE WHEN ta.complaints_status_=0 THEN '拒绝' WHEN ta.complaints_status_ = 1 THEN '通过'
 		WHEN ta.complaints_status_=2 THEN '待处理' WHEN ta.complaints_status_ = 3 THEN '已撤销' END complaints_status_,ta.dispose_content_,
 		ROUND((UNIX_TIMESTAMP(ta.sign_out_time_)-UNIX_TIMESTAMP(ta.sign_in_time_))/60) currentTime,
-		ta.sign_in_time_ signInTime,ta.sign_out_time_ signOutTime,COUNT(DISTINCT sp.id_) studentNum,COUNT(DISTINCT sa.id_) realStudentNum,
+		ta.sign_in_time_ signInTime,ta.sign_out_time_ signOutTime,COUNT(DISTINCT sp.id_) studentNum,
 		vg.online_classes_unit_price_,vg.offline_classes_unit_price_,
 		GROUP_CONCAT(sa.sign_in_time_) studentSignInTime,GROUP_CONCAT(sa.sign_out_time_) studentSignOutTime,ts.deduction_reason_
 		FROM course_schedule_teacher_salary ts
@@ -712,7 +711,7 @@
 		LEFT JOIN organization o ON o.id_ = t.organ_id_
 		LEFT JOIN school s ON s.id_ = cs.schoole_id_
 		LEFT JOIN course_schedule_student_payment sp ON sp.course_schedule_id_ = ts.course_schedule_id_
-		LEFT JOIN `student_attendance` sa ON sa.`course_schedule_id_` = ts.`course_schedule_id_` AND sa.status_ = 'NORMAL'
+		LEFT JOIN `student_attendance` sa ON sa.`course_schedule_id_` = ts.`course_schedule_id_`
 		LEFT JOIN vip_group vg ON (vg.id_ = ts.music_group_id_ AND ts.group_type_ = 'VIP')
 		LEFT JOIN vip_group_activity vga ON vg.vip_group_activity_id_ = vga.id_
 		LEFT JOIN organization vgo ON vgo.id_ = vg.organ_id_
@@ -743,7 +742,7 @@
 		CASE WHEN ta.complaints_status_=0 THEN '拒绝' WHEN ta.complaints_status_ = 1 THEN '通过'
 		WHEN ta.complaints_status_=2 THEN '待处理' WHEN ta.complaints_status_ = 3 THEN '已撤销' END complaints_status_,ta.dispose_content_,
 		ROUND((UNIX_TIMESTAMP(ta.sign_out_time_)-UNIX_TIMESTAMP(ta.sign_in_time_))/60) currentTime,
-		ta.sign_in_time_ signInTime,ta.sign_out_time_ signOutTime,COUNT(DISTINCT sp.id_) studentNum,COUNT(DISTINCT sa.id_) realStudentNum,
+		ta.sign_in_time_ signInTime,ta.sign_out_time_ signOutTime,COUNT(DISTINCT sp.id_) studentNum,
 		GROUP_CONCAT(sa.sign_in_time_) studentSignInTime,GROUP_CONCAT(sa.sign_out_time_) studentSignOutTime,ts.deduction_reason_
 		FROM course_schedule_teacher_salary ts
 		LEFT JOIN course_schedule cs ON ts.course_schedule_id_ = cs.id_
@@ -754,7 +753,7 @@
 		LEFT JOIN organization o ON o.id_ = t.organ_id_
 		LEFT JOIN school s ON s.id_ = cs.schoole_id_
 		LEFT JOIN course_schedule_student_payment sp ON sp.course_schedule_id_ = ts.course_schedule_id_
-		LEFT JOIN `student_attendance` sa ON sa.`course_schedule_id_` = ts.`course_schedule_id_` AND sa.status_ = 'NORMAL'
+		LEFT JOIN `student_attendance` sa ON sa.`course_schedule_id_` = ts.`course_schedule_id_`
 		LEFT JOIN practice_group pg ON (pg.id_ = ts.music_group_id_ AND ts.group_type_ = 'PRACTICE')
 		LEFT JOIN organization pgo ON pgo.id_ = pg.organ_id_
 		WHERE cs.class_date_ BETWEEN #{firstDayOfMonth} AND #{lastDayOfMonth} AND cs.`del_flag_` != 1 AND cs.group_type_ = 'PRACTICE' AND ts.settlement_time_ IS NOT NULL

+ 27 - 12
mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml

@@ -208,6 +208,12 @@
             LEFT JOIN sys_user_role sur ON sur.user_id_ = e.user_id_
         </if>
         <where>
+            <if test="demissionflag != null and demissionflag == 1">
+                AND e.demission_date_ IS NOT NULL
+            </if>
+            <if test="demissionflag != null and demissionflag == 0">
+                AND e.demission_date_ IS NULL
+            </if>
             <if test="organId != null">
                 AND INTE_ARRAY(e.organ_id_list_,#{organId})
             </if>
@@ -238,6 +244,15 @@
             <if test="organId != null">
                 AND INTE_ARRAY(e.organ_id_list_,#{organId})
             </if>
+            <if test="demissionflag != null and demissionflag == 1">
+                AND e.demission_date_ IS NOT NULL
+            </if>
+            <if test="demissionflag != null and demissionflag == 0">
+                AND e.demission_date_ IS NULL
+            </if>
+            <if test="jobNature != null">
+                AND e.job_nature_ = #{jobNature}
+            </if>
             <if test="search != null">
                 AND (su.real_name_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
             </if>
@@ -251,10 +266,10 @@
     </select>
 
     <select id="findByRole" resultType="com.ym.mec.biz.dal.dto.SimpleUserDto">
-        SELECT
-          DISTINCT su.id_ userId,
+        SELECT DISTINCT su.id_ userId,
           su.real_name_ userName,
-          su.avatar_ avatar
+          su.avatar_ avatar,
+            e.organ_id_list_ organIds
         FROM
             sys_user su
             LEFT JOIN sys_user_role sur ON su.id_ = sur.user_id_
@@ -314,20 +329,20 @@
     </select>
 
     <update id="employeeLevel">
-        <foreach collection="employeeLevelDtos" item="item" open="(" close=")" separator=";">
-            <if test="employeeLevelDto.roleName == 'repair'">
-                UPDATE music_group SET repair_user_id_ = #{item.transferUserId} WHERE repair_user_id_ = #{item.levelUserId} AND organ_id_ = #{item.organId}
+        <foreach collection="employeeLevelDtos" item="item">
+            <if test="item.roleName == 'repair'">
+                UPDATE music_group SET repair_user_id_ = #{item.transferUserId} WHERE repair_user_id_ = #{item.levelUserId} AND organ_id_ = #{item.organId};
             </if>
-            <if test="employeeLevelDto.roleName == 'education'">
+            <if test="item.roleName == 'education'">
                 UPDATE music_group SET educational_teacher_id_ = #{item.transferUserId} WHERE educational_teacher_id_ = #{item.levelUserId} AND organ_id_ = #{item.organId};
                 UPDATE practice_group SET educational_teacher_id_ = #{item.transferUserId} WHERE educational_teacher_id_ = #{item.levelUserId} AND organ_id_ = #{item.organId};
-                UPDATE vip_group SET educational_teacher_id_ = #{item.transferUserId} WHERE educational_teacher_id_ = #{item.levelUserId} AND organ_id_ = #{item.organId}
+                UPDATE vip_group SET educational_teacher_id_ = #{item.transferUserId} WHERE educational_teacher_id_ = #{item.levelUserId} AND organ_id_ = #{item.organId};
             </if>
-            <if test="employeeLevelDto.roleName == 'teamTeacher'">
-                UPDATE music_group SET team_teacher_id_ = #{item.transferUserId} WHERE team_teacher_id_ = #{item.levelUserId} AND organ_id_ = #{item.organId}
+            <if test="item.roleName == 'teamTeacher'">
+                UPDATE music_group SET team_teacher_id_ = #{item.transferUserId} WHERE team_teacher_id_ = #{item.levelUserId} AND organ_id_ = #{item.organId};
             </if>
-            <if test="employeeLevelDto.roleName == 'director'">
-                UPDATE music_group SET director_user_id_ = #{item.transferUserId} WHERE director_user_id_ = #{item.levelUserId} AND organ_id_ = #{item.organId}
+            <if test="item.roleName == 'director'">
+                UPDATE music_group SET director_user_id_ = #{item.transferUserId} WHERE director_user_id_ = #{item.levelUserId} AND organ_id_ = #{item.organId};
             </if>
         </foreach>
     </update>

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

@@ -21,6 +21,9 @@
         <result column="settle_account_id_" property="settleAccountId"/>
         <result column="status_" property="status"/>
         <result column="memo_" property="memo"/>
+        <result column="month_max_receipt_" property="monthMaxReceipt"/>
+        <result column="route_member_id_" property="routeMemberId"/>
+        <result column="route_organ_id_" property="routeOrganId"/>
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
     </resultMap>
@@ -28,7 +31,9 @@
         <!--@mbg.generated-->
         id_, name_, member_id_, prov_code_, area_code_, social_credit_code_, social_credit_code_expires_,
         business_scope_, legal_person_, legal_cert_id_, legal_cert_id_expires_, legal_mp_,
-        address_, zip_code_, card_no_, bank_code_,settle_account_id_,status_, create_time_, update_time_
+        address_, zip_code_, card_no_,
+        bank_code_,settle_account_id_,status_,month_max_receipt_,route_member_id_,route_organ_id_, create_time_,
+        update_time_
     </sql>
     <select id="get" parameterType="java.lang.Integer" resultMap="hfMember">
         <!--@mbg.generated-->
@@ -116,6 +121,15 @@
             <if test="status != null">
                 status_ = #{status},
             </if>
+            <if test="monthMaxReceipt != null">
+                month_max_receipt_ = #{monthMaxReceipt},
+            </if>
+            <if test="routeMemberId != null">
+                route_member_id_ = #{routeMemberId},
+            </if>
+            <if test="routeOrganId != null">
+                route_organ_id_ = #{routeOrganId},
+            </if>
             <if test="createTime != null">
                 create_time_ = #{createTime},
             </if>
@@ -167,4 +181,10 @@
         WHERE name_ = #{name}
         LIMIT 1
     </select>
+
+    <select id="getNeedRouteMerNos" resultMap="hfMember">
+        SELECT *
+        FROM hf_member
+        WHERE month_max_receipt_ > 0
+    </select>
 </mapper>

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

@@ -327,7 +327,7 @@
         LEFT JOIN class_group cg ON mg.id_ = cg.music_group_id_
         LEFT JOIN class_group_teacher_mapper cgtm ON cg.id_ = cgtm.class_group_id_
         WHERE (cgtm.user_id_ = #{userId} OR mg.team_teacher_id_ = #{userId} OR mg.educational_teacher_id_ = #{userId}
-        OR director_user_id_ = #{userId}) AND mg.status_ = 'PROGRESS'
+        OR director_user_id_ = #{userId}) AND mg.status_ IN ('PROGRESS','PAUSE')
         <if test="search != null and search != ''">
             AND mg.name_ LIKE CONCAT('%',#{search},'%')
         </if>
@@ -462,7 +462,7 @@
                  LEFT JOIN music_group mg ON cg.music_group_id_ = mg.id_
         WHERE cg.id_ = #{groupId}
           AND cg.group_type_ = 'MUSIC'
-          AND mg.status_ = 'PROGRESS'
+          AND mg.status_ IN ('PROGRESS','PAUSE')
           AND cg.del_flag_ = 0
     </select>
     <select id="queryUserMusicNames" resultType="java.util.Map">

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

@@ -323,7 +323,7 @@
         WHERE music_group_id_ = #{musicGroupId}
         AND (payment_valid_end_date_ IS NULL OR payment_valid_start_date_ BETWEEN #{paymentValidStartDate} AND #{paymentValidEndDate}
         OR payment_valid_end_date_ BETWEEN #{paymentValidStartDate} AND #{paymentValidEndDate}) AND payment_valid_start_date_ IS NOT NULL
-        AND mgpc.payment_type_ != 'ADD_STUDENT' AND mgpc.payment_type_ != 'ADD_COURSE' AND mgpc.batch_no_ IS NOT NULL
+        AND mgpc.payment_type_ NOT IN ('SPAN_GROUP_CLASS_ADJUST','ADD_STUDENT','ADD_COURSE') AND mgpc.batch_no_ IS NOT NULL
         <if test="payUserType != null">
         	and pay_user_type_ = #{payUserType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         </if>

+ 115 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderStudentDetailMapper.xml

@@ -0,0 +1,115 @@
+<?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.MusicGroupPaymentCalenderStudentDetailDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail" id="MusicGroupPaymentCalenderStudentDetail">
+		<result column="id_" property="id" />
+		<result column="user_id_" property="userId" />
+		<result column="phone_" property="phone" />
+		<result column="username_" property="username" />
+		<result column="course_original_price_" property="courseOriginalPrice" />
+		<result column="course_current_price_" property="courseCurrentPrice" />
+		<result column="course_type_" property="courseType" />
+		<result column="course_time_" property="courseTime" />
+		<result column="class_group_id_" property="classGroupId" />
+		<result column="calender_id_" property="calenderId" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="MusicGroupPaymentCalenderStudentDetail" >
+		SELECT * FROM music_group_payment_calender_student_detail WHERE id_ = #{id} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="MusicGroupPaymentCalenderStudentDetail">
+		SELECT * FROM music_group_payment_calender_student_detail ORDER BY id_
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO music_group_payment_calender_student_detail (id_,user_id_,phone_,username_,course_original_price_,
+																 course_current_price_,course_type_,course_time_,class_group_id_,calender_id_,create_time_,update_time_)
+		VALUES(#{id},#{userId},#{phone},#{username},#{courseOriginalPrice},#{courseCurrentPrice},
+			   #{courseType},#{courseTime},#{classGroupId},#{calenderId},NOW(),NOW())
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderStudentDetail">
+		UPDATE music_group_payment_calender_student_detail <set>
+		<if test="userId != null">
+		user_id_ = #{userId},
+		</if>
+		<if test="classGroupId != null">
+		class_group_id_ = #{classGroupId},
+		</if>
+		<if test="courseCurrentPrice != null">
+		course_current_price_ = #{courseCurrentPrice},
+		</if>
+		<if test="courseType != null">
+		course_type_ = #{courseType},
+		</if>
+		<if test="courseOriginalPrice != null">
+		course_original_price_ = #{courseOriginalPrice},
+		</if>
+		<if test="calenderId != null">
+		calender_id_ = #{calenderId},
+		</if>
+		<if test="phone != null">
+		phone_ = #{phone},
+		</if>
+		<if test="courseTime != null">
+		course_time_ = #{courseTime},
+		</if>
+		<if test="username != null">
+		username_ = #{username},
+		</if>
+		update_time_ = NOW()
+		</set> WHERE id_ = #{id}
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM music_group_payment_calender_student_detail WHERE id_ = #{id} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="MusicGroupPaymentCalenderStudentDetail" parameterType="map">
+		SELECT * FROM music_group_payment_calender_student_detail ORDER BY id_ <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM music_group_payment_calender_student_detail
+	</select>
+	<insert id="batchInsert">
+		INSERT INTO music_group_payment_calender_student_detail (id_,user_id_,phone_,username_,course_original_price_,
+		course_current_price_,course_type_,course_time_,class_group_id_,calender_id_,create_time_,update_time_)
+		VALUES
+		<foreach collection="musicGroupPaymentCalenderStudentDetails" item="item" index="index" separator=",">
+			(#{item.userId},#{item.phone},#{item.username},#{item.courseOriginalPrice},#{item.courseCurrentPrice},
+			#{item.courseType},#{item.courseTime},#{item.classGroupId},#{calenderId},NOW(),NOW())
+		</foreach>
+	</insert>
+
+	<update id="batchUpdate">
+		<foreach collection="musicGroupPaymentCalenderStudentDetails" item="item" index="index" open="" close="" separator=";">
+			UPDATE music_group_payment_calender_student_detail
+		<set>
+			<if test="item.courseCurrentPrice != null">
+				course_current_price_ = #{item.courseCurrentPrice},
+			</if>
+			<if test="item.courseOriginalPrice != null">
+				course_original_price_ = #{item.courseOriginalPrice},
+			</if>
+			update_time_ = NOW()
+		</set>
+			WHERE id_ = #{item.id}
+		</foreach>
+	</update>
+</mapper>

+ 8 - 0
mec-biz/src/main/resources/config/mybatis/StudentCourseFeeDetailMapper.xml

@@ -56,4 +56,12 @@
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(*) FROM student_course_fee_detail
 	</select>
+
+	<insert id="batchInsert">
+		INSERT INTO student_course_fee_detail (student_registration_id_,amount_,surplus_course_fee_,memo_,operator_,create_time_,update_time_)
+		VALUES
+		<foreach collection="replies" item="item" separator=",">
+			(#{item.studentRegistrationId},#{item.amount},#{item.surplusCourseFee},#{item.memo},#{item.operator},NOW(),NOW())
+		</foreach>
+    </insert>
 </mapper>

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

@@ -181,7 +181,12 @@
                 AND s.operating_tag_ = #{operatingTag}
             </if>
             <if test="serviceTag != null">
-                AND s.service_tag_ = #{serviceTag}
+                <if test="serviceTag == 0">
+                    AND s.service_tag_ IN (0, 2)
+                </if>
+                <if test="serviceTag == 1">
+                    AND s.service_tag_ = 1
+                </if>
             </if>
             <if test="teacherId != null">
                 AND s.teacher_id_ = #{teacherId}

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

@@ -500,6 +500,7 @@
         WHERE stu.service_tag_=1
             AND cs.class_date_&gt;=#{monday}
             AND cs.type_ IN ('SINGLE','VIP','MIX','PRACTICE')
+            AND cssp.create_time_&lt;#{nextMonday}
             <if test="studentIds!=null and studentIds.size()>0">
                 AND cssp.user_id_ IN
                 <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">

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

@@ -72,6 +72,7 @@
         <result column="id_card_no_" property="idCardNo"/>
         <result column="real_name_" property="realName"/>
         <result column="wechat_id_" property="wechatId"/>
+        <result column="certificate_type_" property="certificateType"/>
         <result column="name_" property="name"/>
         <result column="parents_name_" property="parentsName"/>
         <result column="current_grade_" property="grade"/>
@@ -618,7 +619,7 @@
     </select>
 
     <update id="updateUser">
-        UPDATE sys_user SET real_name_ = #{realName},id_card_no_=#{idCardNo} WHERE id_=#{id}
+        UPDATE sys_user SET real_name_ = #{realName},id_card_no_=#{idCardNo},certificate_type_=#{certificateType},update_time_=NOW() WHERE id_=#{id}
     </update>
     <update id="updateCurrentClass" parameterType="com.ym.mec.biz.dal.entity.StudentRegistration">
         UPDATE student_registration sr SET sr.current_grade_ = #{currentGrade},sr.current_class_ = #{currentClass},sr.current_grade_date_= NOW(),sr.update_time_ = NOW()
@@ -728,4 +729,17 @@
     	where sr.user_id_ = #{userId} 
     	order by sr.id_ 
     </select>
+
+    <select id="querySurplusCourseFeeByClassGroupId" resultType="java.util.Map">
+        SELECT sr.user_id_ 'key',sr.surplus_course_fee_ 'value' FROM student_registration sr
+        LEFT JOIN class_group cg ON cg.music_group_id_ = sr.music_group_id_
+        WHERE cg.id_ = #{classGroupId} AND FIND_IN_SET(sr.user_id_,#{studentIds})
+        AND sr.music_group_status_ != 'QUIT'
+    </select>
+
+    <select id="queryByUserIdsAndMusicGroupId" resultMap="StudentRegistration">
+        SELECT sr.*,su.id_card_no_,su.organ_id_ FROM student_registration sr
+        LEFT JOIN sys_user su ON su.id_ = sr.user_id_
+        WHERE sr.music_group_id_ = #{musicGroupId} AND FIND_IN_SET(sr.user_id_,#{studentIds}) AND sr.music_group_status_ != 'QUIT'
+    </select>
 </mapper>

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

@@ -226,7 +226,7 @@
     <select id="findStudentSubjectIdMaps" resultType="java.util.Map">
         SELECT
             sr.user_id_ as 'key',
-            sr.subject_id_ as 'value'
+            sr.actual_subject_id_ as 'value'
         FROM
             student_registration sr
         WHERE 1=1

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

@@ -230,4 +230,7 @@
             AND hf_mer_no_ != ''
         </if>
     </select>
+    <select id="findPaymentConfigByMerNo" resultMap="SysPaymentConfig">
+        SELECT * FROM sys_payment_config WHERE hf_mer_no_ = #{merNo} LIMIT 1
+    </select>
 </mapper>

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

@@ -936,13 +936,13 @@
         SELECT DISTINCT cgtm.user_id_ FROM class_group_student_mapper cgsm
         LEFT JOIN class_group_teacher_mapper cgtm ON cgsm.class_group_id_ = cgtm.class_group_id_
         LEFT JOIN music_group mg ON cgsm.music_group_id_ = mg.id_
-        WHERE mg.status_ = 'PROGRESS' AND cgsm.user_id_ = #{studentId}
+        WHERE mg.status_ IN ('PROGRESS','PAUSE') AND cgsm.user_id_ = #{studentId}
     </select>
     <select id="findVipTeacherIds" resultType="java.lang.Integer">
         SELECT DISTINCT cgtm.user_id_ FROM class_group_student_mapper cgsm
         LEFT JOIN class_group_teacher_mapper cgtm ON cgsm.class_group_id_ = cgtm.class_group_id_
         LEFT JOIN vip_group vg ON vg.id_ = cgsm.music_group_id_
-        WHERE vg.group_status_ IN (2,3,4) AND cgsm.user_id_ = #{studentId}
+        WHERE vg.group_status_ IN (2,3,4,6) AND cgsm.user_id_ = #{studentId}
     </select>
     <select id="findPracticeTeacherIds" resultType="java.lang.Integer">
         SELECT DISTINCT cgtm.user_id_ FROM class_group_student_mapper cgsm
@@ -1061,11 +1061,11 @@
         SELECT cssp.user_id_ FROM music_group mg
         LEFT JOIN course_schedule_student_payment cssp ON mg.id_ = cssp.music_group_id_
         WHERE (mg.educational_teacher_id_ = #{teacherId} OR mg.director_user_id_ = #{teacherId} OR mg.team_teacher_id_ = #{teacherId})
-        AND cssp.group_type_ = 'MUSIC' AND mg.status_ = 'PROGRESS'
+        AND cssp.group_type_ = 'MUSIC' AND mg.status_ IN ('PROGRESS','PAUSE')
         UNION ALL
         SELECT cgsm.user_id_ FROM vip_group vg
         LEFT JOIN class_group_student_mapper cgsm ON vg.id_ = cgsm.music_group_id_
-        WHERE vg.educational_teacher_id_ = #{teacherId} AND cgsm.group_type_ = 'VIP' AND vg.group_status_ IN (2,3,4)
+        WHERE vg.educational_teacher_id_ = #{teacherId} AND cgsm.group_type_ = 'VIP' AND vg.group_status_ IN (2,3,4,6)
         UNION ALL
         SELECT cssp.user_id_ FROM courses_group cg
         LEFT JOIN course_schedule_student_payment cssp ON cg.id_ = cssp.music_group_id_
@@ -1085,7 +1085,7 @@
         UNION ALL
         SELECT csts.user_id_ FROM vip_group vg 
         LEFT JOIN course_schedule_teacher_salary csts ON vg.id_ = csts.music_group_id_
-        WHERE vg.educational_teacher_id_ = #{teacherId} AND csts.group_type_ = 'VIP' AND vg.group_status_ IN (2,3,4)
+        WHERE vg.educational_teacher_id_ = #{teacherId} AND csts.group_type_ = 'VIP' AND vg.group_status_ IN (2,3,4,6)
         GROUP BY csts.user_id_
         UNION ALL
         SELECT csts.user_id_ FROM courses_group cg 
@@ -1100,13 +1100,13 @@
         UNION ALL
         SELECT cgtm.user_id_ FROM music_group mg
         LEFT JOIN class_group_teacher_mapper cgtm ON mg.id_ = cgtm.music_group_id_
-        WHERE cgtm.group_type_ = 'MUSIC' AND mg.status_ = 'PROGRESS'
+        WHERE cgtm.group_type_ = 'MUSIC' AND mg.status_ IN ('PROGRESS','PAUSE')
         AND (mg.educational_teacher_id_ = #{teacherId} OR mg.director_user_id_ = #{teacherId} OR mg.team_teacher_id_ = #{teacherId})
         GROUP BY cgtm.user_id_
         UNION ALL
         SELECT cgtm.user_id_ FROM vip_group vg 
         LEFT JOIN class_group_teacher_mapper cgtm ON vg.id_ = cgtm.music_group_id_
-        WHERE vg.educational_teacher_id_ = #{teacherId} AND cgtm.group_type_ = 'VIP' AND vg.group_status_ IN (2,3,4)
+        WHERE vg.educational_teacher_id_ = #{teacherId} AND cgtm.group_type_ = 'VIP' AND vg.group_status_ IN (2,3,4,6)
         GROUP BY cgtm.user_id_
         UNION ALL
         SELECT cgtm.user_id_ FROM courses_group cg 
@@ -1121,7 +1121,7 @@
         UNION ALL
         SELECT vg.educational_teacher_id_ FROM class_group_teacher_mapper cgtm
         LEFT JOIN vip_group vg ON vg.id_ = cgtm.music_group_id_
-        WHERE cgtm.user_id_ = #{teacherId} AND cgtm.group_type_ = 'VIP' AND vg.group_status_ IN (2,3,4)
+        WHERE cgtm.user_id_ = #{teacherId} AND cgtm.group_type_ = 'VIP' AND vg.group_status_ IN (2,3,4,6)
         GROUP BY vg.educational_teacher_id_
         UNION ALL
         SELECT cg.educational_teacher_id_ FROM class_group_teacher_mapper cgtm
@@ -1136,7 +1136,7 @@
         UNION ALL
         SELECT vg.educational_teacher_id_ FROM course_schedule_teacher_salary csts
         LEFT JOIN vip_group vg ON vg.id_ = csts.music_group_id_
-        WHERE csts.user_id_ = #{teacherId} AND csts.group_type_ = 'VIP' AND vg.group_status_ IN (2,3,4)
+        WHERE csts.user_id_ = #{teacherId} AND csts.group_type_ = 'VIP' AND vg.group_status_ IN (2,3,4,6)
         GROUP BY vg.educational_teacher_id_
         UNION ALL
         SELECT cg.educational_teacher_id_ FROM course_schedule_teacher_salary csts
@@ -1152,12 +1152,12 @@
     <select id="queryMusicLeaderIds" resultType="java.lang.String">
         SELECT DISTINCT CONCAT(mg.educational_teacher_id_,',',mg.director_user_id_,',',mg.team_teacher_id_) FROM course_schedule_teacher_salary csts
         LEFT JOIN music_group mg ON mg.id_ = csts.music_group_id_
-        WHERE csts.user_id_ = #{teacherId} AND csts.group_type_ = 'MUSIC' AND mg.status_ = 'PROGRESS'
+        WHERE csts.user_id_ = #{teacherId} AND csts.group_type_ = 'MUSIC' AND mg.status_ IN ('PROGRESS','PAUSE')
         GROUP BY mg.id_
         UNION ALL
         SELECT DISTINCT CONCAT(mg.educational_teacher_id_,',',mg.director_user_id_,',',mg.team_teacher_id_) FROM class_group_teacher_mapper cgtm
         LEFT JOIN music_group mg ON mg.id_ = cgtm.music_group_id_
-        WHERE cgtm.user_id_ = #{teacherId} AND cgtm.group_type_ = 'MUSIC' AND mg.status_ = 'PROGRESS'
+        WHERE cgtm.user_id_ = #{teacherId} AND cgtm.group_type_ = 'MUSIC' AND mg.status_ IN ('PROGRESS','PAUSE')
         GROUP BY mg.id_
     </select>
     <select id="queryStudent" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.BasicUserDto">

+ 0 - 2
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImGroupMember.java

@@ -12,8 +12,6 @@ public class ImGroupMember {
         this.id = id;
     }
 
-
-
     public ImGroupMember(String id, String groupId, Integer munite) {
         this.id = id;
         this.groupId = groupId;

+ 13 - 2
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImGroupModel.java

@@ -1,10 +1,11 @@
 package com.ym.mec.common.entity;
 
-public class ImGroupModel  {
     //群组编号
     private String id;
     //用户列表
     private ImGroupMember[] members;
+    //用户列表
+    private List<ImGroupMember> memberList;
     //群名称
     private String name;
     private String teacherIds;
@@ -32,6 +33,14 @@ public class ImGroupModel  {
         this.name = name;
     }
 
+    public List<ImGroupMember> getMemberList() {
+        return memberList;
+    }
+
+    public void setMemberList(List<ImGroupMember> memberList) {
+        this.memberList = memberList;
+    }
+
     public String getGroupName() {
         return groupName;
     }
@@ -90,7 +99,9 @@ public class ImGroupModel  {
     }
 
     public ImGroupModel setMembers(ImGroupMember[] members) {
-        this.members = members;
+        if(members != null && members.length > 0){
+            this.members = members;
+        }
         return this;
     }
 

+ 4 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/page/PageInfo.java

@@ -132,6 +132,10 @@ public class PageInfo<T> implements Serializable {
 	public void setTotal(int total) {
 		this.total = total;
 		this.totalPage=new BigDecimal(total).divide(new BigDecimal(limit),0,BigDecimal.ROUND_CEILING).intValue();
+		if(this.pageNo>total){
+			this.pageNo = total;
+			this.offset = (this.pageNo - 1) * this.limit;
+		}
 	}
 
 	public List<T> getRows() {

+ 0 - 6
mec-im/src/main/java/com/ym/service/Impl/GroupServiceImpl.java

@@ -163,10 +163,8 @@ public class GroupServiceImpl implements GroupService {
     public void groupBatchDismiss(List<GroupModel> groupModels) {
         if(groupModels != null && groupModels.size() > 0){
             Group group = getGroup();
-            GroupMember[] groupMember = {new GroupMember("1",null,null)};
             groupModels.forEach(e->{
                 try {
-                    e.setMembers(groupMember);
                     group.dismiss(e);
                 } catch (Exception e1) {
                     e1.printStackTrace();
@@ -179,10 +177,8 @@ public class GroupServiceImpl implements GroupService {
     public void groupBatchQuit(List<GroupModel> groupModels) {
         if(groupModels != null && groupModels.size() > 0){
             Group group = getGroup();
-            GroupMember[] groupMember = {new GroupMember("1",null,null)};
             groupModels.forEach(e->{
                 try {
-                    e.setMembers(groupMember);
                     group.quit(e);
                 } catch (Exception e1) {
                     e1.printStackTrace();
@@ -195,10 +191,8 @@ public class GroupServiceImpl implements GroupService {
     public void groupBatchJoin(List<GroupModel> groupModels){
         if(groupModels != null && groupModels.size() > 0){
             Group group = getGroup();
-            GroupMember[] groupMember = {new GroupMember("1",null,null)};
             groupModels.forEach(e->{
                 try {
-                    e.setMembers(groupMember);
                     group.join(e);
                 } catch (Exception e1) {
                     e1.printStackTrace();

+ 1 - 1
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java

@@ -102,7 +102,7 @@ public class MusicGroupController extends BaseController {
         return succeed(musicGroupService.queryPersonalMusicGroups(sysUser.getId()));
     }
 
-    @ApiOperation(value = "根据学员编号,获取有关联的老师列表")
+    @ApiOperation(value = "根据学员编号,获取有关联的老师列表,获取学员通讯录列表")
     @GetMapping("/findTeachersByStuId")
     public Object findTeachersByStuId(String search) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();

+ 36 - 7
mec-web/src/main/java/com/ym/mec/web/controller/AdapayController.java

@@ -148,6 +148,9 @@ public class AdapayController extends BaseController {
             if (payments != null && payments.size() > 0) {
                 for (Object payment : payments) {
                     Map<String, Object> paymentMap = (Map<String, Object>) payment;
+                    if (!paymentMap.get("status").equals("succeeded")) {
+                        continue;
+                    }
                     paymentMap.put("created_time", DateUtil.timeStamp2Date(paymentMap.get("created_time").toString(), null));
                     if (paymentMap.get("pay_channel").equals("alipay_qr")) {
                         paymentMap.put("pay_channel", "支付宝正扫");
@@ -165,10 +168,21 @@ public class AdapayController extends BaseController {
                         paymentMap.put("status", "交易失败");
                     }
                     if (paymentMap.get("pay_mode").equals("delay")) {
-                        Map<String, Object> confirmMap = Payment.queryConfirmList(paymentMap.get("id").toString());
-                        JSONArray confirms = (JSONArray) confirmMap.get("payment_confirms");
+                        if (!paymentMap.containsKey("payment_confirms")) {
+                            Map<String, Object> confirmMap = Payment.queryConfirmList(paymentMap.get("id").toString());
+                            if (confirmMap.containsKey("payment_confirms")) {
+                                paymentMap.put("payment_confirms", confirmMap.get("payment_confirms"));
+                            }
+                        }
+                        if (!paymentMap.containsKey("payment_confirms")) {
+                            paymentMap.put("memo", "没有提交分账信息,请联系技术核查");
+                            data.add(paymentMap);
+                            continue;
+                        }
+                        JSONArray confirms = (JSONArray) paymentMap.get("payment_confirms");
                         for (Object confirm : confirms) {
                             Map<String, Object> divMemberMap = (Map<String, Object>) confirm;
+                            paymentMap.put("fee_amt", divMemberMap.get("fee_amt"));
                             divMemberMap.putAll(paymentMap);
 
                             JSONArray divMembers = (JSONArray) divMemberMap.get("div_members");
@@ -177,11 +191,8 @@ public class AdapayController extends BaseController {
                             if (divMemberMap.get("member_id").equals("0")) {
                                 divMemberMap.put("member_id", ConfigInit.merNo);
                             }
-                            BigDecimal feeAmt = (new BigDecimal(divMemberMap.get("amount").toString())).multiply(new BigDecimal("0.28")).divide(new BigDecimal(100),2, BigDecimal.ROUND_HALF_UP);
-                            divMemberMap.put("fee_amt", feeAmt);
                             data.add(divMemberMap);
                         }
-
                     } else {
                         JSONArray divMembers = (JSONArray) paymentMap.get("div_members");
                         for (Object divMember : divMembers) {
@@ -206,8 +217,8 @@ public class AdapayController extends BaseController {
 
         OutputStream outputStream = response.getOutputStream();
         try {
-            String[] header = {"支付流水号", "订单号", "支付渠道", "交易金额", "商户号", "分润金额", "是否承担手续费", "手续费", "第三方订单号", "支付宝/微信订单号", "交易时间", "交易状态"};
-            String[] body = {"id", "order_no", "pay_channel", "pay_amt", "member_id", "amount", "fee_flag", "fee_amt", "party_order_id", "out_trans_id", "created_time", "status"};
+            String[] header = {"支付流水号", "订单号", "支付渠道", "交易金额", "商户号", "分润金额", "是否承担手续费", "手续费", "第三方订单号", "支付宝/微信订单号", "交易时间", "交易状态", "备注"};
+            String[] body = {"id", "order_no", "pay_channel", "pay_amt", "member_id", "amount", "fee_flag", "fee_amt", "party_order_id", "out_trans_id", "created_time", "status", ""};
 
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, data);
             response.setContentType("application/octet-stream");
@@ -228,4 +239,22 @@ public class AdapayController extends BaseController {
             }
         }
     }
+
+    @ApiOperation("修改每月最大收款金额(succeeded 状态才能使用)")
+    @PostMapping(value = "updateMonthMaxReceipt")
+    @PreAuthorize("@pcs.hasPermissions('adapay/updateMonthMaxReceipt')")
+    public HttpResponseResult<HfMember> updateMonthMaxReceipt(Integer id, BigDecimal monthMaxReceipt, String routeMemberId,Integer organId) throws Exception {
+        HfMember hfMember = hfMemberService.get(id);
+        if (hfMember == null) {
+            return failed("您修改的数据不存在");
+        }
+        hfMember.setMonthMaxReceipt(monthMaxReceipt);
+        hfMember.setRouteMemberId(routeMemberId);
+        hfMember.setRouteOrganId(organId);
+        hfMember.setUpdateTime(new Date());
+        if (hfMemberService.update(hfMember) <= 0) {
+            return failed("修改失败,请重试");
+        }
+        return succeed(hfMember);
+    }
 }

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

@@ -1,6 +1,8 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.common.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -8,8 +10,10 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -50,6 +54,8 @@ public class ClassGroupController extends BaseController {
     private ClassGroupTeacherMapperService classGroupTeacherMapperService;
     @Autowired
     private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private EmployeeDao employeeDao;
 
     @ApiOperation(value = "分页查询班级列表")
     @GetMapping("/queryPage")
@@ -280,6 +286,30 @@ public class ClassGroupController extends BaseController {
         return succeed(classGroupService.getClassGroupAndTeacherByType(musicGroupId, type));
     }
 
+    @ApiOperation(value = "获取所有班级列表")
+    @GetMapping("/queryClassGroupPage")
+    @PreAuthorize("@pcs.hasPermissions('classGroup/queryClassGroupPage')")
+    public HttpResponseResult queryClassGroupPage(ClassGroupQueryInfo queryInfo) throws Exception {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        if(!sysUser.getIsSuperAdmin()){
+            Employee employee = employeeDao.get(sysUser.getId());
+            if (org.apache.commons.lang3.StringUtils.isEmpty(queryInfo.getOrganIdList())) {
+                queryInfo.setOrganIdList(employee.getOrganIdList());
+            }else if(org.apache.commons.lang3.StringUtils.isEmpty(employee.getOrganIdList())){
+                return failed("用户所在分部异常");
+            }else {
+                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+                if(!list.containsAll(Arrays.asList(queryInfo.getOrganIdList().split(",")))){
+                    return failed("非法请求");
+                }
+            }
+        }
+        return succeed(classGroupService.queryClassGroupPage(queryInfo));
+    }
+
     @ApiOperation(value = "查询是否设置课酬")
     @GetMapping("/checkSetSalary")
     @PreAuthorize("@pcs.hasPermissions('classGroup/checkSetSalary')")
@@ -330,7 +360,6 @@ public class ClassGroupController extends BaseController {
     @GetMapping("/queryRemainCourseTypeDuration")
     @PreAuthorize("@pcs.hasPermissions('classGroup/queryRemainCourseTypeDuration')")
     public HttpResponseResult queryRemainCourseTypeDuration(String classGroupIdList) {
-
         return succeed(classGroupService.queryRemainCourseTypeDuration(classGroupIdList));
     }
 
@@ -341,7 +370,29 @@ public class ClassGroupController extends BaseController {
         return succeed(classGroupService.classGroupSubCourseNum(classGroupId));
     }
 
-    @ApiOperation(value = "进行中乐团-修改-班级详情-学员班级调整-生成默认缴费信息")
+    @ApiOperation(value = "进行中乐团-修改-班级详情-学员班级调整-获取班级最大剩余可排课时长")
+    @PostMapping("/querySubCourseTime")
+    @PreAuthorize("@pcs.hasPermissions('classGroup/querySubCourseTime')")
+    public HttpResponseResult querySubCourseTime(Integer classGroupId) {
+        return succeed(classGroupService.querySubCourseTime(classGroupId));
+    }
+
+    @ApiOperation(value = "进行中乐团-修改-班级详情-班级合并-获取学员需要补交的费用以及需要退还的课程余额")
+    @PostMapping("/queryStudentPaymentCalenders")
+    @PreAuthorize("@pcs.hasPermissions('classGroup/queryStudentPaymentCalenders')")
+    public HttpResponseResult queryStudentPaymentCalenders(@RequestBody MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) {
+        return succeed(classGroupService.queryStudentPaymentCalenders(mergeClassSplitClassAffirmDto).stream().collect(Collectors.groupingBy(e -> e.getClassGroupId())));
+    }
+
+    @ApiOperation(value = "跨团班级合并提交")
+    @PostMapping("/spanGroupMergeClassSplitClassAffirm")
+    @PreAuthorize("@pcs.hasPermissions('classGroup/spanGroupMergeClassSplitClassAffirm')")
+    public HttpResponseResult spanGroupMergeClassSplitClassAffirm(@RequestBody MergeClassSplitClassAffirmDto mergeClassSplitClassAffirmDto) throws Exception {
+        classGroupService.spanGroupMergeClassSplitClassAffirm(mergeClassSplitClassAffirmDto);
+        return succeed();
+    }
+
+    @ApiOperation(value = "进行中乐团-修改-班级详情-学员班级调整-获取所选班级最大可排课时长")
     @PostMapping("/getDefaultPaymentCalender")
     @PreAuthorize("@pcs.hasPermissions('classGroup/getDefaultPaymentCalender')")
     public HttpResponseResult studentClassAuditDetail(@RequestBody List<Integer> classGroupIds) {

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

@@ -192,7 +192,7 @@ public class EmployeeController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('employee/findTechnician')")
     public HttpResponseResult findTechnician(){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        String organIds=new String();
+        String organIds = new String();
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
@@ -217,7 +217,7 @@ public class EmployeeController extends BaseController {
     }
 
     @ApiOperation(value = "员工离职交接")
-    @GetMapping("/level")
+    @PostMapping("/level")
     @PreAuthorize("@pcs.hasPermissions('employee/level')")
     public HttpResponseResult level(@RequestBody List<EmployeeLevelDto> employeeLevelDtos){
         employeeService.level(employeeLevelDtos);

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

@@ -537,11 +537,11 @@ public class ExportController extends BaseController {
                     "课程分部", "课程组编号", "课程班名称", "乐团模式", "vip活动名称", "Vip课程类型", "阶梯奖励名称", "线上课/线下课", "线上课单价", "线下课单价",
                     "课程类别", "课时时长", "实际上课时长", "上课日期",
                     "上课时间", "教师签到状态", "教师签退状态", "教师签到时间", "教师签退时间", "考勤申诉处理状态", "处理意见",
-                    "主辅", "上课地点", "应到学员", "实际到课学员", "学员签到时间", "学员签退时间", "课时课酬", "阶梯奖励", "扣款原因"}, new String[]{
+                    "主辅", "上课地点", "应到学员","学员签到时间", "学员签退时间", "课时课酬", "阶梯奖励", "扣款原因"}, new String[]{
                     "courseScheduleId", "teacherId", "teacherName", "teacherOrganName", "jobType",
                     "courseScheduleOrganName", "groupId", "groupName", "changeType", "vipActiveName", "vipCategoryName", "activeName", "teachMode", "onlineClassesUnitPrice", "offlineClassesUnitPrice",
                     "courseScheduleType", "signCourseScheduleTime", "currentTime", "classDate", "courseScheduleStartTime", "signInStatus",
-                    "signOutStatus", "signInTime", "signOutTime","complaintsStatus", "disposeContent", "teacherRole", "address", "studentNum", "realStudentNum",
+                    "signOutStatus", "signInTime", "signOutTime","complaintsStatus", "disposeContent", "teacherRole", "address", "studentNum",
                     "studentSignInTime", "studentSignOutTime", "price", "rewards", "deductionReason"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");

+ 14 - 0
mec-web/src/main/java/com/ym/mec/web/controller/MusicGroupController.java

@@ -1,5 +1,8 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.biz.dal.dto.MusicGroupRegsDto;
+import com.ym.mec.biz.dal.entity.StudentRegistration;
+import com.ym.mec.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -276,4 +279,15 @@ public class MusicGroupController extends BaseController {
 		return succeed(musicGroupService.queryOrganMusicInfos(organId));
 	}
 
+
+	@ApiOperation(value = "乐团添加报名学员")
+	@PostMapping("/addMusicGroupRegs")
+	@PreAuthorize("@pcs.hasPermissions('musicGroup/addMusicGroupRegs')")
+	public HttpResponseResult<List<StudentRegistration>> addMusicGroupRegs(@RequestBody MusicGroupRegsDto musicGroupRegsDto) throws Exception {
+		if(musicGroupRegsDto.getRegisterIds().size() <=0){
+			return failed("请选择要添加的学员");
+		}
+		return succeed(musicGroupService.addMusicGroupRegs(musicGroupRegsDto.getMusicGroupId(),musicGroupRegsDto.getRegisterIds()));
+	}
+
 }

+ 14 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SysPaymentConfigController.java

@@ -34,6 +34,13 @@ public class SysPaymentConfigController extends BaseController {
         if (paymentConfig != null) {
             return failed("此分部配置已经存在");
         }
+        if(StringUtils.isNotBlank(sysPaymentConfig.getHfMerNo())){
+            SysPaymentConfig nowConfig = sysPaymentConfigService.findPaymentConfigByMerNo(sysPaymentConfig.getHfMerNo());
+            if(nowConfig != null){
+                return failed("汇付商户号已配置,不同分部请勿配置相同商户号");
+            }
+        }
+
         Date nowDate = new Date();
         sysPaymentConfig.setCreateTime(nowDate);
         sysPaymentConfig.setUpdateTime(nowDate);
@@ -56,6 +63,13 @@ public class SysPaymentConfigController extends BaseController {
     @PostMapping("/update")
     @PreAuthorize("@pcs.hasPermissions('paymentConfig/update')")
     public Object update(SysPaymentConfig sysPaymentConfig) {
+        if(StringUtils.isNotBlank(sysPaymentConfig.getHfMerNo())){
+            SysPaymentConfig nowConfig = sysPaymentConfigService.findPaymentConfigByMerNo(sysPaymentConfig.getHfMerNo());
+            if(nowConfig != null && !nowConfig.getOrganId().equals(sysPaymentConfig.getOrganId())){
+                return failed("汇付商户号已配置,不同分部请勿配置相同商户号");
+            }
+        }
+
         sysPaymentConfig.setUpdateTime(new Date());
         sysPaymentConfigService.update(sysPaymentConfig);
         return succeed();

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

@@ -73,7 +73,7 @@ public class VipGroupManageController extends BaseController {
             if(Objects.isNull(oldVipGroup)){
                 throw new BizException("此课程组不存在");
             }
-            if(!VipGroupStatusEnum.PROGRESS.equals(oldVipGroup.getStatus())){
+            if(!VipGroupStatusEnum.PROGRESS.equals(oldVipGroup.getStatus())&&!VipGroupStatusEnum.PAUSE.equals(oldVipGroup.getStatus())){
                 throw new BizException("此课程组状态暂不支持修改");
             }
         }

BIN
mec-web/src/main/resources/excelTemplate/财务支出导入模板.xls