Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
Joburgess před 5 roky
rodič
revize
6091fd3563
81 změnil soubory, kde provedl 2139 přidání a 562 odebrání
  1. 12 19
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/PhoneLoginAuthenticationFilter.java
  2. 18 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  3. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  4. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  5. 44 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentManageDao.java
  6. 28 13
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java
  7. 35 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDetailDao.java
  8. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  9. 7 5
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysAccountDao.java
  10. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  11. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/BasicUserDto.java
  12. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupStudentsDto.java
  13. 63 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentHasCourseDto.java
  14. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java
  15. 43 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentRegisterPerDto.java
  16. 117 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/musicalListDetailDto.java
  17. 40 5
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrder.java
  18. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysAccount.java
  19. 24 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserCashAccountDetail.java
  20. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupStudentQueryInfo.java
  21. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java
  22. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentPaymentOrderQueryInfo.java
  23. 15 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  24. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/service/PayService.java
  25. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  26. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderDetailService.java
  27. 1 4
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  28. 8 6
      mec-biz/src/main/java/com/ym/mec/biz/service/SysAccountService.java
  29. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  30. 100 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  31. 70 23
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  32. 189 60
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  33. 147 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PayServiceImpl.java
  34. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java
  35. 41 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  36. 48 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java
  37. 7 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  38. 19 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  39. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysAccountServiceImpl.java
  40. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  41. 12 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  42. 34 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  43. 27 25
      mec-biz/src/main/resources/config/contracts/courses.ftl
  44. 28 24
      mec-biz/src/main/resources/config/contracts/goods.ftl
  45. binární
      mec-biz/src/main/resources/config/fonts/simsun.ttc
  46. 37 5
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  47. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  48. 8 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  49. 132 6
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  50. 40 0
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderDetailMapper.xml
  51. 28 3
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  52. 30 1
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  53. 25 8
      mec-biz/src/main/resources/config/mybatis/SysAccountMapper.xml
  54. 12 0
      mec-biz/src/main/resources/config/mybatis/SysUserCashAccountDetailMapper.xml
  55. 9 2
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  56. 1 3
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  57. 5 2
      mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java
  58. 5 2
      mec-common/common-core/src/main/java/com/ym/mec/common/redis/config/RedisConfig.java
  59. 2 0
      mec-common/common-core/src/main/java/com/ym/mec/common/service/impl/RedisIdGeneratorService.java
  60. 1 2
      mec-education/src/main/java/com/ym/mec/education/controller/SmsCodeController.java
  61. 1 1
      mec-student/src/main/java/com/ym/mec/student/config/ResourceServerConfig.java
  62. 0 3
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  63. 3 2
      mec-student/src/main/java/com/ym/mec/student/controller/SmsCodeController.java
  64. 9 0
      mec-student/src/main/java/com/ym/mec/student/controller/StudentManageController.java
  65. 66 138
      mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
  66. 1 4
      mec-student/src/main/java/com/ym/mec/student/controller/StudentVipGroupController.java
  67. binární
      mec-student/src/main/resources/config/fonts/simsun.ttc
  68. binární
      mec-student/src/main/resources/config/fonts/simsun.ttf
  69. 1 2
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SmsCodeController.java
  70. 0 43
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMessageController.java
  71. 2 2
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/provider/TsignPlugin.java
  72. 15 5
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/JiguangPushPlugin.java
  73. 26 19
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/YimeiSmsPlugin.java
  74. 36 2
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/yqpay/YqPayUtil.java
  75. 16 1
      mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java
  76. 124 39
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  77. 97 16
      mec-web/src/main/java/com/ym/mec/web/controller/StudentPaymentOrderController.java
  78. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/SysPaymentConfigController.java
  79. 17 12
      mec-web/src/main/java/com/ym/mec/web/controller/SysUserCashAccountDetailController.java
  80. 1 0
      mec-web/src/main/java/com/ym/mec/web/controller/TeacherAttendanceController.java
  81. 19 4
      pom.xml

+ 12 - 19
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/filter/PhoneLoginAuthenticationFilter.java

@@ -1,27 +1,24 @@
 package com.ym.mec.auth.core.filter;
 
-import java.io.IOException;
-
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import com.ym.mec.auth.api.dto.SysUserInfo;
+import com.ym.mec.auth.api.enums.SysUserType;
+import com.ym.mec.auth.config.token.PhoneAuthenticationToken;
+import com.ym.mec.auth.service.SysUserService;
+import com.ym.mec.common.security.SecurityConstants;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.security.authentication.AbstractAuthenticationToken;
 import org.springframework.security.authentication.AuthenticationServiceException;
 import org.springframework.security.authentication.LockedException;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
 import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
 
-import com.ym.mec.auth.api.dto.SysUserInfo;
-import com.ym.mec.auth.api.enums.SysUserType;
-import com.ym.mec.auth.config.token.PhoneAuthenticationToken;
-import com.ym.mec.auth.service.SysUserService;
-import com.ym.mec.common.security.SecurityConstants;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 
 public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
 
@@ -45,17 +42,13 @@ public class PhoneLoginAuthenticationFilter extends AbstractAuthenticationProces
 		}
 
 		AbstractAuthenticationToken authRequest;
-		String principal;
-		String credentials;
-
 		// 手机验证码登陆
-		principal = obtainParameter(request, SPRING_SECURITY_RESTFUL_PHONE_KEY);
-		credentials = obtainParameter(request, SPRING_SECURITY_RESTFUL_VERIFY_CODE_KEY);
+		String principal = obtainParameter(request, SPRING_SECURITY_RESTFUL_PHONE_KEY);
+		String credentials = obtainParameter(request, SPRING_SECURITY_RESTFUL_VERIFY_CODE_KEY);
 
 		SysUserInfo userInfo = sysUserService.queryUserInfoByPhone(principal);
 
 		String clientId = request.getParameter(clientIdParameter);
-
 		if (userInfo == null) {
 			userInfo = sysUserService.initUser(principal,clientId);
 		}

+ 18 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java

@@ -298,7 +298,7 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
     List<Map<Integer, Integer>> countQuitNum(@Param("classGroupIds") String classGroupIds);
 
     /**
-     * 获取乐团详情---课表详情列表
+     * 获取乐团详情---课酬调整
      *
      * @param params
      * @return
@@ -306,7 +306,7 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
     List<MusicGroupCourseScheduleDto> queryMusicGroupCourseSchedule(Map<String, Object> params);
 
     /**
-     * COUNT乐团详情---课表详情列表
+     * COUNT乐团详情---课酬调整
      *
      * @param params
      * @return
@@ -314,6 +314,22 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
     int countMusicGroupCourseSchedule(Map<String, Object> params);
 
     /**
+     * 获取乐团详情---课表详情列表
+     *
+     * @param params
+     * @return
+     */
+    List<MusicGroupCourseScheduleDto> queryMusicGroupCourseScheduleDetail(Map<String, Object> params);
+
+    /**
+     * COUNT乐团详情---课表详情列表
+     *
+     * @param params
+     * @return
+     */
+    int countMusicGroupCourseScheduleDetail(Map<String, Object> params);
+
+    /**
      * 根据班级编号列表获取班级名称
      *
      * @param classGroupIds

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

@@ -862,7 +862,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @param classGroupIds
      * @return
      */
-    List<Map<Integer, Long>> countTotalNumByClassGroupId(@Param("classGroupIds") Set<Integer> classGroupIds, @Param("classDate") Date classDate);
+    List<Map<Integer, Long>> countTotalNumByClassGroupId(@Param("classGroupIds") List<Integer> classGroupIds, @Param("classDate") Date classDate);
 
     /**
      * 根据班级编号count剩余课时
@@ -870,7 +870,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @param classDate
      * @return
      */
-    List<Map<Integer, Long>> countCurrentNumByClassGroupId(@Param("classGroupIds") Set<Integer> classGroupIds, @Param("classDate") Date classDate);
+    List<Map<Integer, Long>> countCurrentNumByClassGroupId(@Param("classGroupIds") List<Integer> classGroupIds, @Param("classDate") Date classDate);
 
     /**
      * @describe 获取乐团下剩余课程计划

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java

@@ -187,4 +187,10 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
      */
     MusicGroup findMusicGroup(List<Long> list);
 
+    /**
+     * 获取乐团名称
+     * @param musicGroupIds
+     * @return
+     */
+    List<Map<String, String>> queryMusicGroupNameMap(@Param("musicGroupIds") Set<String> musicGroupIds);
 }

+ 44 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentManageDao.java

@@ -168,4 +168,48 @@ public interface StudentManageDao {
      * @return
      */
     int countStudentVipGroupClass(Map<String, Object> params);
+
+    /**
+     * 查询有课的学员
+     * @return
+     */
+    List<Integer> queryHasCourse(Map<String, Object> params);
+
+    /**
+     * 查询没课的学员
+     * @return
+     */
+    List<Integer> queryNotCourse(Map<String, Object> params);
+
+    /**
+     * 查询有课的学员
+     * @return
+     */
+    Integer countHasCourse(Map<String, Object> params);
+
+    /**
+     * 查询没课的学员
+     * @return
+     */
+    Integer countNotCourse(Map<String, Object> params);
+
+    /**
+     * 获取用户是否有课
+     * @param userIds
+     * @return
+     */
+    List<Map<Integer, Boolean>> queryStudentHasCourse(@Param("userIds") List<Integer> userIds);
+
+    /**
+     * 获取未激活,有课的列表
+     * @return
+     */
+    List<StudentHasCourseDto> queryHasCourseStudent(@Param("organId") String organId);
+
+    /**
+     * 当前用户是否有课
+     * @param userId
+     * @return
+     */
+    Long getHasCourse(Integer userId);
 }

+ 28 - 13
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.UserGoodsDto;
+import com.ym.mec.biz.dal.dto.musicalListDetailDto;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
@@ -12,6 +13,7 @@ import org.apache.ibatis.annotations.Param;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrder> {
 
@@ -34,12 +36,12 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
                                               @Param("status") String status);
 
     /**
-     * @describe 统计学员剩余课时的课程费用
-     * @author Joburgess
-     * @date 2019/12/3
      * @param vipGroupId:
      * @param userId:
      * @return java.math.BigDecimal
+     * @describe 统计学员剩余课时的课程费用
+     * @author Joburgess
+     * @date 2019/12/3
      */
     BigDecimal sumSurplusCourseFee(@Param("vipGroupId") String vipGroupId,
                                    @Param("userId") Integer userId);
@@ -50,14 +52,14 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
      * 根据学生vip课获取非失败缴费订单
      */
     StudentPaymentOrder findNotFailedOrderByStudentVipGroup(@Param("vipGroupId") Long vipGroupId,
-                                              @Param("userId") Integer userId);
+                                                            @Param("userId") Integer userId);
 
     /**
+     * @param musicGroupId: 乐团编号/vip课编号
+     * @return java.lang.Integer
      * @describe 统计报名人数
      * @author Joburgess
      * @date 2019/11/13
-     * @param musicGroupId: 乐团编号/vip课编号
-     * @return java.lang.Integer
      */
     Integer countStudentPaymentNum(@Param("musicGroupId") String musicGroupId);
 
@@ -118,6 +120,7 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
 
     /**
      * 查询支付中超时的订单
+     *
      * @param orderNoList
      * @param status
      * @param beforeTime
@@ -126,30 +129,31 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
     List<StudentPaymentOrder> findOrdersOverTime(@Param("orderNoList") List<String> orderNoList, @Param("status") DealStatusEnum status, @Param("beforeTime") Date beforeTime);
 
     /**
+     * @param musicGroupId: 乐团编号
+     * @param userId:       用户编号
+     * @return int
      * @describe 根据乐团和用户编号统计剩余课时
      * @author Joburgess
      * @date 2019/12/4
-     * @param musicGroupId: 乐团编号
-     * @param userId: 用户编号
-     * @return int
      */
     int countSurplusCourseByMusicGroupAndUser(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId);
 
     /**
-     * @describe 统计乐团或vip课的收入金额
-     * @author Joburgess
-     * @date 2019/12/4
      * @param musicGroupId: 乐团或小课金额
      * @param groupType:
      * @return java.math.BigDecimal
+     * @describe 统计乐团或vip课的收入金额
+     * @author Joburgess
+     * @date 2019/12/4
      */
     BigDecimal sumGroupIncomeFee(@Param("musicGroupId") String musicGroupId,
                                  @Param("groupType") String groupType);
 
-    List<StudentPaymentOrder> findStudentPaymentOrder(@Param("groupType") String groupType,@Param("musicGroupId") String musicGroupId);
+    List<StudentPaymentOrder> findStudentPaymentOrder(@Param("groupType") String groupType, @Param("musicGroupId") String musicGroupId);
 
     /**
      * 获取零星订单
+     *
      * @param userId
      * @param sporadicId
      * @param groupType
@@ -157,4 +161,15 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
      * @return
      */
     Integer findOrderByGroupType(@Param("userId") Integer userId, @Param("sporadicId") Integer sporadicId, @Param("groupType") String groupType, @Param("status") DealStatusEnum status);
+
+    /**
+     * 获取订单金额map
+     *
+     * @param paymentOrderNo
+     * @return
+     */
+    List<Map<Long, BigDecimal>> queryActualAmount(@Param("paymentOrderNo") List<Long> paymentOrderNo);
+
+
+    List<StudentPaymentOrder> findFixOrder(@Param("status") DealStatusEnum status, @Param("paymentChannel") String paymentChannel);
 }

+ 35 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDetailDao.java

@@ -1,11 +1,14 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.biz.dal.dto.musicalListDetailDto;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 public interface StudentPaymentOrderDetailDao extends BaseDAO<Long, StudentPaymentOrderDetail> {
 
@@ -43,4 +46,36 @@ public interface StudentPaymentOrderDetailDao extends BaseDAO<Long, StudentPayme
      * @return
      */
     List<StudentPaymentOrderDetail> findUserApplyOrder(@Param("userId") Integer userId, @Param("status") DealStatusEnum status);
+
+    /**
+     * 乐器采购清单明细
+     *
+     * @param musicGroupId
+     * @return
+     */
+    List<musicalListDetailDto> getMusicalListDetail(String musicGroupId);
+
+    /**
+     * 获取商品名称列表
+     *
+     * @param paymentOrderNo
+     * @return
+     */
+    List<Map<Long, String>> queryGoodsNames(@Param("paymentOrderNo") List<Long> paymentOrderNo);
+
+    /**
+     * 获取对应商品类型总价
+     *
+     * @param paymentOrderNo
+     * @param type
+     * @return
+     */
+    List<Map<Long, BigDecimal>> queryGoodsPrice(@Param("paymentOrderNo") List<Long> paymentOrderNo, @Param("type") String type);
+
+    /**
+     * 获取订单商品
+     * @param orderId
+     * @return
+     */
+    StudentPaymentOrderDetail findApplyOrderMusical(@Param("orderId") Long orderId);
 }

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

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.dao;
 import java.util.List;
 import java.util.Map;
 
+import com.ym.mec.biz.dal.dto.StudentRegisterPerDto;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import org.apache.ibatis.annotations.Param;
 
@@ -284,4 +285,17 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      * @param studentRegistration
      */
     void updateCurrentClass(StudentRegistration studentRegistration);
+
+    /**
+     * 获取乐团学员购买方式
+     * @param musicGroupId
+     * @return
+     */
+    List<Map<Long, String>> queryPurchaseTypeMap(String musicGroupId);
+
+    /**
+     * 获取学员注册比例
+     * @return
+     */
+    List<StudentRegisterPerDto> queryStudentPer();
 }

+ 7 - 5
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysAccountDao.java

@@ -10,21 +10,23 @@ import java.util.List;
 public interface SysAccountDao extends BaseDAO<Integer, SysAccount> {
 
     /**
-     * 获取一个私
+     * 获取支付账
      *
+     * @param company
+     * @param channel
+     * @param type
      * @param amount
      * @return
      */
-    SysAccount getPerAccount(@Param("amount") BigDecimal amount);
+    List<SysAccount> getAccount(@Param("company") String company, @Param("channel") String channel, @Param("type") String type, @Param("amount") BigDecimal amount);
 
     /**
-     * 获取一个支付账户
+     * 获取一个支付
      * @param company
      * @param channel
      * @param type
      * @param amount
      * @return
      */
-    SysAccount getAccount(@Param("company") String company, @Param("channel") String channel, @Param("type") String type, @Param("amount") BigDecimal amount);
-
+    SysAccount getOneAccount(@Param("company") String company, @Param("channel") String channel, @Param("type") String type, @Param("amount") BigDecimal amount);
 }

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

@@ -44,7 +44,7 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
     List<BasicUserDto> queryGroupStudents(@Param("teacherId") Integer teacherId, @Param("search") String search);
 
     /**
-     * 根据用户编号列表获取用户名称
+     * 根据用户编号列表获取用户realName
      *
      * @param userIds
      * @return
@@ -195,4 +195,11 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
      * @return
      */
     List<Teacher> findTeacherByOrganId(@Param("organId")String organId);
+
+    /**
+     * 获取用户username
+     * @param userIds
+     * @return
+     */
+    List<Map<Integer, String>> queryUsernameByIds(@Param("userIds") List<Integer> userIds);
 }

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

@@ -12,6 +12,26 @@ public class BasicUserDto {
 
     private Integer gender;
 
+    private String musicGroupId;
+
+    private String musicGroupName;
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
     public String getSubjectName() {
         return subjectName;
     }

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

@@ -46,6 +46,16 @@ public class MusicGroupStudentsDto{
     @ApiModelProperty(value = "是否新增学员(1是0否)",required = false)
     private Integer isNewStudent;
 
+    private Boolean isActive = false;
+
+    public Boolean getIsActive() {
+        return isActive;
+    }
+
+    public void setIsActive(Boolean active) {
+        isActive = active;
+    }
+
     public Date getNextPaymentDate() {
         return nextPaymentDate;
     }

+ 63 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentHasCourseDto.java

@@ -0,0 +1,63 @@
+package com.ym.mec.biz.dal.dto;
+
+public class StudentHasCourseDto{
+    private String organName;
+
+    private String userName;
+
+    private String musicGroupName;
+
+    private String vipGroupName;
+
+    private String subjectName;
+
+    private Integer userId;
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
+    public String getVipGroupName() {
+        return vipGroupName;
+    }
+
+    public void setVipGroupName(String vipGroupName) {
+        this.vipGroupName = vipGroupName;
+    }
+}

+ 11 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java

@@ -44,7 +44,17 @@ public class StudentManageListDto {
     @ApiModelProperty(value = "课程余额")
     private BigDecimal courseBalance;
     
-    private Boolean isActive = false;
+    private Boolean isActive;
+
+    private Long hasCourse;
+
+    public Long getHasCourse() {
+        return hasCourse;
+    }
+
+    public void setHasCourse(Long hasCourse) {
+        this.hasCourse = hasCourse;
+    }
 
     public String getNation() {
         return nation;

+ 43 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentRegisterPerDto.java

@@ -0,0 +1,43 @@
+package com.ym.mec.biz.dal.dto;
+
+public class StudentRegisterPerDto {
+    private String organName;
+
+    private Integer studentNum;
+
+    private Integer perNum;
+
+    private float per;
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public Integer getStudentNum() {
+        return studentNum;
+    }
+
+    public void setStudentNum(Integer studentNum) {
+        this.studentNum = studentNum;
+    }
+
+    public Integer getPerNum() {
+        return perNum;
+    }
+
+    public void setPerNum(Integer perNum) {
+        this.perNum = perNum;
+    }
+
+    public float getPer() {
+        return per;
+    }
+
+    public void setPer(float per) {
+        this.per = per;
+    }
+}

+ 117 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/musicalListDetailDto.java

@@ -0,0 +1,117 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
+
+import java.math.BigDecimal;
+
+public class musicalListDetailDto {
+    private Long paymentOrderId;
+
+    private Integer userId;
+
+    private String goodsNames;
+
+    private String musicGroupName;
+
+    private String username;
+
+    private String organName;
+
+    private KitGroupPurchaseTypeEnum kitGroupPurchaseTypeEnum;
+
+    private BigDecimal musicalAmount;
+
+    private BigDecimal accessoriesAmount;
+
+    private BigDecimal courseAmount;
+
+    private BigDecimal orderAmount;
+
+    public Long getPaymentOrderId() {
+        return paymentOrderId;
+    }
+
+    public void setPaymentOrderId(Long paymentOrderId) {
+        this.paymentOrderId = paymentOrderId;
+    }
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getGoodsNames() {
+        return goodsNames;
+    }
+
+    public void setGoodsNames(String goodsNames) {
+        this.goodsNames = goodsNames;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public KitGroupPurchaseTypeEnum getKitGroupPurchaseTypeEnum() {
+        return kitGroupPurchaseTypeEnum;
+    }
+
+    public void setKitGroupPurchaseTypeEnum(KitGroupPurchaseTypeEnum kitGroupPurchaseTypeEnum) {
+        this.kitGroupPurchaseTypeEnum = kitGroupPurchaseTypeEnum;
+    }
+
+    public BigDecimal getMusicalAmount() {
+        return musicalAmount;
+    }
+
+    public void setMusicalAmount(BigDecimal musicalAmount) {
+        this.musicalAmount = musicalAmount;
+    }
+
+    public BigDecimal getAccessoriesAmount() {
+        return accessoriesAmount;
+    }
+
+    public void setAccessoriesAmount(BigDecimal accessoriesAmount) {
+        this.accessoriesAmount = accessoriesAmount;
+    }
+
+    public BigDecimal getCourseAmount() {
+        return courseAmount;
+    }
+
+    public void setCourseAmount(BigDecimal courseAmount) {
+        this.courseAmount = courseAmount;
+    }
+
+    public BigDecimal getOrderAmount() {
+        return orderAmount;
+    }
+
+    public void setOrderAmount(BigDecimal orderAmount) {
+        this.orderAmount = orderAmount;
+    }
+}

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

@@ -42,6 +42,14 @@ public class StudentPaymentOrder {
 	/** 实际金额 */
 	@ApiModelProperty(value = "实际金额",required = true)
 	private BigDecimal actualAmount;
+
+	/** 公户金额 */
+	@ApiModelProperty(value = "公户金额",required = true)
+	private BigDecimal comAmount;
+
+	/** 私户金额 */
+	@ApiModelProperty(value = "私户金额",required = true)
+	private BigDecimal perAmount;
 	
 	@ApiModelProperty(value = "余额付款金额",required = true)
 	private BigDecimal balancePaymentAmount;
@@ -90,11 +98,15 @@ public class StudentPaymentOrder {
 
 	private Date payTime;
 
-	private Integer accountId;
+	//收款账户
+	private String merNos;
 
 	private PaymentChannelTypeEnum paymentChannelType;
 	
 	private SysUser user = new SysUser();
+
+
+	private BigDecimal sporadicAmount;
 	
 	public void setId(Long id){
 		this.id = id;
@@ -255,12 +267,12 @@ public class StudentPaymentOrder {
 	public void setPayTime(Date payTime) {
 		this.payTime = payTime;
 	}
-    public Integer getAccountId() {
-        return accountId;
+    public String getMerNos() {
+        return merNos;
     }
 
-    public void setAccountId(Integer accountId) {
-        this.accountId = accountId;
+    public void setMerNos(String merNos) {
+        this.merNos = merNos;
     }
 
     public PaymentChannelTypeEnum getPaymentChannelType() {
@@ -279,9 +291,32 @@ public class StudentPaymentOrder {
 		this.user = user;
 	}
 
+	public BigDecimal getComAmount() {
+		return comAmount;
+	}
+
+	public void setComAmount(BigDecimal comAmount) {
+		this.comAmount = comAmount;
+	}
+
+	public BigDecimal getPerAmount() {
+		return perAmount;
+	}
+
+	public void setPerAmount(BigDecimal perAmount) {
+		this.perAmount = perAmount;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
 	}
 
+	public BigDecimal getSporadicAmount() {
+		return sporadicAmount;
+	}
+
+	public void setSporadicAmount(BigDecimal sporadicAmount) {
+		this.sporadicAmount = sporadicAmount;
+	}
 }

+ 26 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysAccount.java

@@ -45,6 +45,16 @@ public class SysAccount {
     */
     private String type;
 
+    /**
+     * 状态 0-停用 1-使用
+     */
+    private Integer status;
+
+    /**
+    * 分佣金额
+    */
+    private BigDecimal routingFee;
+
 
     public Integer getId() {
         return id;
@@ -117,4 +127,20 @@ public class SysAccount {
     public void setRoutingMerNo(String routingMerNo) {
         this.routingMerNo = routingMerNo;
     }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public BigDecimal getRoutingFee() {
+        return routingFee;
+    }
+
+    public void setRoutingFee(BigDecimal routingFee) {
+        this.routingFee = routingFee;
+    }
 }

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

@@ -43,6 +43,14 @@ public class SysUserCashAccountDetail {
 	@ApiModelProperty(value = "交易金额",required = false)
 	private BigDecimal amount;
 
+	/** 公户金额 */
+	@ApiModelProperty(value = "公户金额",required = false)
+	private BigDecimal comAmount;
+
+	/** 私户金额 */
+	@ApiModelProperty(value = "私户金额",required = false)
+	private BigDecimal perAmount;
+
 	/** 账户可用余额 */
 	@ApiModelProperty(value = "账户可用余额",required = false)
 	private BigDecimal balance;
@@ -191,9 +199,24 @@ public class SysUserCashAccountDetail {
 		this.platformAccountNo = platformAccountNo;
 	}
 
+	public BigDecimal getComAmount() {
+		return comAmount;
+	}
+
+	public void setComAmount(BigDecimal comAmount) {
+		this.comAmount = comAmount;
+	}
+
+	public BigDecimal getPerAmount() {
+		return perAmount;
+	}
+
+	public void setPerAmount(BigDecimal perAmount) {
+		this.perAmount = perAmount;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
 	}
-
 }

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

@@ -14,12 +14,23 @@ public class MusicGroupStudentQueryInfo extends QueryInfo {
   @ApiModelProperty(value = "乐团编号")
   private String musicGroupId;
 
+  @ApiModelProperty(value = "是否激活")
+  private Boolean isActive;
+
   @ApiModelProperty(value = "学员状态 NORMAL(NORMAL, 在读), LEAVE(LEAVE, 请假), QUIT(QUIT, 退班)",required = false)
   private String studentStatus;
 
   @ApiModelProperty(value = "缴费状态  PAID_COMPLETED(完成缴费), NON_PAYMENT(未缴费), PROCESSING(缴费中)",required = false)
   private String paymentStatus;
 
+  public Boolean getIsActive() {
+    return isActive;
+  }
+
+  public void setIsActive(Boolean active) {
+    isActive = active;
+  }
+
   public String getStudentName() {
     return studentName;
   }

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java

@@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty;
 import com.ym.mec.biz.dal.enums.ClassGroupStudentStatusEnum;
 import com.ym.mec.common.page.QueryInfo;
 
+import java.util.List;
+
 /**
  * @Author Joburgess
  * @Date 2019/9/19
@@ -14,6 +16,9 @@ public class StudentManageQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "部门ID")
     private String organId;
 
+    @ApiModelProperty(value = "学员编号")
+    private List<Integer> userIds;
+
     @ApiModelProperty(value = "乐团ID")
     private String musicGroupId;
 
@@ -25,6 +30,24 @@ public class StudentManageQueryInfo extends QueryInfo {
     
     private Boolean isActive;
 
+    private Boolean hasCourse;
+
+    public List<Integer> getUserIds() {
+        return userIds;
+    }
+
+    public void setUserIds(List<Integer> userIds) {
+        this.userIds = userIds;
+    }
+
+    public Boolean getHasCourse() {
+        return hasCourse;
+    }
+
+    public void setHasCourse(Boolean hasCourse) {
+        this.hasCourse = hasCourse;
+    }
+
     public String getStudentName() {
         return studentName;
     }

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

@@ -29,6 +29,9 @@ public class StudentPaymentOrderQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "支付方式",required = false)
     private String paymentChannel;
 
+    @ApiModelProperty(value = "订单类型",required = false)
+    private String orderType;
+
     public String getOrganId() {
         return organId;
     }
@@ -92,4 +95,12 @@ public class StudentPaymentOrderQueryInfo extends QueryInfo {
     public void setPaymentChannel(String paymentChannel) {
         this.paymentChannel = paymentChannel;
     }
+
+    public String getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(String orderType) {
+        this.orderType = orderType;
+    }
 }

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

@@ -271,11 +271,18 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
     PageInfo<MusicGroupClassGroupDto> queryMusicGroupClassGroup(QueryInfo queryInfo);
 
     /**
-     * 乐团详情-----课表详情
+     * 乐团详情-----课酬调整
      * @param queryInfo
      * @return
      */
     PageInfo<MusicGroupCourseScheduleDto> queryMusicGroupCourseSchedule(queryMusicGroupCourseScheduleQueryInfo queryInfo);
+
+    /**
+     * 乐团详情-----课表详情
+     * @param queryInfo
+     * @return
+     */
+    PageInfo<MusicGroupCourseScheduleDto> queryMusicGroupCourseScheduleDetail(queryMusicGroupCourseScheduleQueryInfo queryInfo);
     
     /**
      * 批量新增班级上的课次数
@@ -359,4 +366,11 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      */
     void updateClassGroupInfo(Integer classGroupId);
 
+    /**
+     * 清除班级未开始课程
+     * @param classGroupId
+     * @return
+     */
+    boolean delClassNoStartCourse(Integer classGroupId);
+
 }

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

@@ -1,9 +1,16 @@
 package com.ym.mec.biz.service;
 
 
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.SysAccount;
+import com.ym.mec.biz.dal.enums.PaymentChannelTypeEnum;
+import com.ym.mec.thirdparty.adapay.Pay;
 import com.ym.mec.thirdparty.yqpay.Msg;
+import com.ym.mec.thirdparty.yqpay.YqPayUtil;
 
 import java.math.BigDecimal;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -28,6 +35,9 @@ public interface PayService {
     Map<String, Object> getPayMap(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, Integer userId) throws Exception;
 
 
+    Map<String, Object> getPayMap(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, Integer userId,Map<String,BigDecimal> fee,Integer organId) throws Exception;
+
+
     Map query(String orderNo) throws Exception;
 
 }

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java

@@ -124,4 +124,17 @@ public interface StudentManageService {
      * @return
      */
     int studentUpdate(SysUser sysUser);
+
+    /**
+     * 获取激活比例
+     * @return
+     */
+    List<StudentRegisterPerDto> queryStudentPer();
+
+    /**
+     * 获取有课没有激活的列表
+     * @return
+     */
+    List<StudentHasCourseDto> queryHasCourseStudent(String organId);
+
 }

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderDetailService.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.musicalListDetailDto;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
@@ -57,4 +58,17 @@ public interface StudentPaymentOrderDetailService extends BaseService<Long, Stud
      */
     List<StudentPaymentOrderDetail>findUserApplyOrder(Integer userId,DealStatusEnum status);
 
+    /**
+     * 乐器采购清单明细
+     * @param musicGroupId
+     * @return
+     */
+    List<musicalListDetailDto> getMusicalListDetail(String musicGroupId);
+
+    /**
+     * 获取订单的乐器信息
+     * @param orderId
+     * @return
+     */
+    StudentPaymentOrderDetail findApplyOrderMusical(Long orderId);
 }

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

@@ -1,9 +1,6 @@
 package com.ym.mec.biz.service;
 
-import com.ym.mec.biz.dal.dto.StudentAddDto;
-import com.ym.mec.biz.dal.dto.StudentApplyDetailDto;
-import com.ym.mec.biz.dal.dto.StudentFeeDetailDto;
-import com.ym.mec.biz.dal.dto.StudentInfo;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
 import com.ym.mec.biz.dal.page.StudentRegistrationQueryInfo;

+ 8 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/SysAccountService.java

@@ -10,21 +10,23 @@ import java.util.List;
 public interface SysAccountService extends BaseService<Integer, SysAccount> {
 
     /**
-     * 获取一个私户
-     *
+     * 获取收款账户
+     * @param company
+     * @param channel
+     * @param type
+     * @param amount
      * @return
      */
-    SysAccount getPerAccount(BigDecimal amount);
-
+    List<SysAccount> getAccount(String company, String channel, String type,  BigDecimal amount);
 
     /**
-     * 获取一个收款账户
+     * 获取一个支付账户
      * @param company
      * @param channel
      * @param type
      * @param amount
      * @return
      */
-    SysAccount getAccount(String company, String channel, String type,  BigDecimal amount);
+    SysAccount getOneAccount(String company, String channel, String type,  BigDecimal amount);
 
 }

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

@@ -4,6 +4,8 @@ import com.ym.mec.biz.dal.entity.SysConfig;
 import com.ym.mec.common.service.BaseService;
 
 public interface SysConfigService extends BaseService<Long, SysConfig> {
+	
+	public static final String BASE_API_URL = "base_api_url";
 
     /**
      * 缴费状态提前{}天刷新

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

@@ -880,13 +880,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         Map<Long, Integer> vipGroupOverCourseMaps = MapUtil.convertIntegerMap(vipGroupOverCourses);
 
         List<ClassGroup> byClassGroupIds = classGroupDao.findByClassGroupIds(classGroupIds);
-        Map<Integer, ClassGroup> classGorupIdMap = byClassGroupIds.stream()
-                .collect(Collectors.toMap(ClassGroup::getId, classGroup -> classGroup));
+        Map<Integer, ClassGroup> classGorupIdMap = byClassGroupIds.stream().collect(Collectors.toMap(ClassGroup::getId, classGroup -> classGroup));
+
+
 
         //统计班级人数
         List<Map<Integer, Integer>> classGroupStudentNumMaps = classGroupStudentMapperDao.countClassGroupsStudentNum(classGroupIds);
         Map<Integer, Long> classGroupStudentNumMap = MapUtil.convertIntegerMap(classGroupStudentNumMaps);
-
+        Map<Integer, Long> currentClassTimes = MapUtil.convertIntegerMap(courseScheduleDao.countCurrentNumByClassGroupId(classGroupIds,null));
         teacherMusicClassGroup.forEach(teacherClassGroupDto -> {
 
             if (teacherClassGroupDto.getType() == ClassGroupTypeEnum.VIP) {
@@ -919,8 +920,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             }
 
             ClassGroup classGroup = classGorupIdMap.get(teacherClassGroupDto.getClassGroupId().intValue());
-
-            teacherClassGroupDto.setSurplusClassTimes(classGroup.getTotalClassTimes() - classGroup.getCurrentClassTimes());
+//            teacherClassGroupDto.setSurplusClassTimes(classGroup.getTotalClassTimes() - classGroup.getCurrentClassTimes());
+            Long aLong = currentClassTimes.get(teacherClassGroupDto.getClassGroupId().intValue());
+            teacherClassGroupDto.setSurplusClassTimes(aLong==null?0:aLong.intValue());
             Long studentNum = classGroupStudentNumMap.get(teacherClassGroupDto.getClassGroupId().intValue());
             teacherClassGroupDto.setStudentNum(Objects.isNull(studentNum) ? 0 : studentNum.intValue());
 
@@ -1056,6 +1058,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (musicGroup == null) {
             throw new BizException("乐团不存在");
         }
+        if(classGroup4MixDto.getCourseTimes().compareTo(0) <= 0){
+            throw new BizException("排课次数必须大于0");
+        }
         Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(),"yyyy-MM-dd");
         Integer schoolId = musicGroup.getSchoolId();
 
@@ -1307,6 +1312,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (classGroup == null) {
             throw new BizException("班级不存在");
         }
+        if(classGroup4MixDto.getCourseTimes().compareTo(0) <= 0){
+            throw new BizException("排课次数必须大于0");
+        }
         Integer courseTimes = classGroup4MixDto.getCourseTimes();
 
         Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(),"yyyy-MM-dd");
@@ -1546,6 +1554,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (musicGroup == null) {
             throw new BizException("乐团不存在");
         }
+        if(classGroup4MixDto.getCourseTimes().compareTo(0) <= 0){
+            throw new BizException("排课次数必须大于0");
+        }
         Integer schoolId = musicGroup.getSchoolId();
 
         Date entryDate = DateUtil.stringToDate(sysConfigDao.findByParamName(SysConfigService.TEACHER_ENTRY_DATE).getParanValue(),"yyyy-MM-dd");
@@ -1795,7 +1806,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             pageInfo.setTotal(count);
             params.put("offset", pageInfo.getOffset());
             dataList = classGroupDao.queryMusicGroupClassGroup(params);
-            Set<Integer> classGroups = dataList.stream().map(e -> e.getClassGroupId()).collect(Collectors.toSet());
+            List<Integer> classGroups = dataList.stream().map(e -> e.getClassGroupId()).collect(Collectors.toList());
             Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroups, null));
             Map<Integer, Long> currentNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countCurrentNumByClassGroupId(classGroups, null));
             String join = StringUtils.join(classGroups, ",");
@@ -1836,6 +1847,54 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             pageInfo.setTotal(count);
             params.put("offset", pageInfo.getOffset());
             dataList = classGroupDao.queryMusicGroupCourseSchedule(params);
+            //所有课程编号的列表
+            List<Integer> couseScheduleIds = dataList.stream().map(MusicGroupCourseScheduleDto::getCourseScheduleId).distinct().collect(Collectors.toList());
+
+            //主教老师
+            List<CourseScheduleTeacherSalary> bishopTeachers = courseScheduleTeacherSalaryDao.findByCourseScheduleIdsAndTeacherRole(couseScheduleIds, "BISHOP");
+            Map<Long, List<CourseScheduleTeacherSalary>> courseScheduleBishopTeacherMaps = bishopTeachers.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getCourseScheduleId));
+
+            //助教老师
+            List<CourseScheduleTeacherSalary> teachingTeachers = courseScheduleTeacherSalaryDao.findByCourseScheduleIdsAndTeacherRole(couseScheduleIds, "TEACHING");
+            Map<Long, List<CourseScheduleTeacherSalary>> courseScheduleTeachingTeacherMaps = teachingTeachers.stream().collect(Collectors.groupingBy(CourseScheduleTeacherSalary::getCourseScheduleId));
+
+            dataList.forEach(e -> {
+                List<CourseScheduleTeacherSalary> currentBishopTeacher = courseScheduleBishopTeacherMaps.get(e.getCourseScheduleId().longValue());
+                List<CourseScheduleTeacherSalary> TeachingTeachers = new ArrayList<>();
+                if (!Objects.isNull(currentBishopTeacher) && !CollectionUtils.isEmpty(currentBishopTeacher)) {
+                    e.setMasterTeacherId(currentBishopTeacher.get(0).getUserId());
+                    e.setMasterTeacherName(currentBishopTeacher.get(0).getUserName());
+                } else {
+                    currentBishopTeacher = new ArrayList<>();
+                }
+                TeachingTeachers.addAll(currentBishopTeacher);
+                List<CourseScheduleTeacherSalary> currentCourseTeachingTeachers = courseScheduleTeachingTeacherMaps.get(e.getCourseScheduleId().longValue());
+                if (Objects.isNull(currentCourseTeachingTeachers) || CollectionUtils.isEmpty(currentCourseTeachingTeachers)) {
+                    currentCourseTeachingTeachers = new ArrayList<>();
+                }
+                TeachingTeachers.addAll(currentCourseTeachingTeachers);
+                e.setTeachingTeachers(TeachingTeachers);
+                e.setTeacherNum(TeachingTeachers.size());
+            });
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public PageInfo<MusicGroupCourseScheduleDto> queryMusicGroupCourseScheduleDetail(queryMusicGroupCourseScheduleQueryInfo queryInfo) {
+        PageInfo<MusicGroupCourseScheduleDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        List<MusicGroupCourseScheduleDto> dataList = null;
+        int count = classGroupDao.countMusicGroupCourseScheduleDetail(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = classGroupDao.queryMusicGroupCourseScheduleDetail(params);
             //获取当前合奏班班级编号列表
 //            Set<Integer> mixClassGroupIds = dataList.stream().map(e -> e.getMixClassGroupId()).collect(Collectors.toSet());
 //            String mixClassGroupIdsStr = StringUtils.join(mixClassGroupIds, ",");
@@ -1968,10 +2027,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             return null;
         }
         String classGroupIds = classGroups.stream().map(classGroup -> classGroup.getId().toString()).collect(Collectors.joining(","));
+        List<Integer> classGroupSet = classGroups.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.countCurrentNumByClassGroupId(classGroupSet, null));
+
         for (ClassGroupTeachersDto classGroup : classGroups) {
             List<ClassGroupTeacherMapper> classGroupTeacherMappers = new ArrayList<>();
             for (ClassGroupTeacherMapper classGroupTeacher : classGroupTeachers) {
@@ -1980,6 +2043,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             }
             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);
         }
         return classGroups;
     }
@@ -2106,4 +2179,25 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
         classGroupDao.update(classGroup);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean delClassNoStartCourse(Integer classGroupId) {
+        Date date = new Date();
+        ClassGroup classGroup = classGroupDao.get(classGroupId);
+        if (classGroup == null) {
+            throw new BizException("班级不存在");
+        }
+
+        List<CourseSchedule> noStartCourses = courseScheduleService.findNoStartCoursesByClassGroupId(classGroup.getId());
+        if (noStartCourses == null || noStartCourses.size() <= 0) {
+            return true;
+        }
+        List<Long> courseScheduleIds = noStartCourses.stream().map(courseSchedule -> courseSchedule.getId()).collect(Collectors.toList());
+        courseScheduleDao.batchDeleteCourseSchedules(courseScheduleIds);
+        courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
+        teacherAttendanceDao.batchDeleteByCourseSchedules(courseScheduleIds);
+        courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
+        return true;
+    }
 }

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

@@ -8,6 +8,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.stream.Collectors;
 
 import org.apache.commons.io.FileUtils;
@@ -23,6 +24,7 @@ import com.ym.mec.biz.dal.dao.MusicGroupPaymentCalenderDao;
 import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
 import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
 import com.ym.mec.biz.dal.dto.StudentInfo;
+import com.ym.mec.biz.dal.entity.CooperationOrgan.OwnershipType;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
@@ -52,6 +54,7 @@ import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.thirdparty.eseal.ESealPlugin;
 import com.ym.mec.thirdparty.storage.StoragePlugin;
+import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.freemarker.FreemarkerTemplateEngine;
 import com.ym.mec.util.money.MoneyUtil;
 import com.ym.mec.util.pdf.PDFUtil;
@@ -108,33 +111,42 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 	private String contractBaseDir;
 
 	private DateFormat dateFormatOss = new SimpleDateFormat("yyyy/MM/dd");
+	
+	private DateFormat dateFormat1 = new SimpleDateFormat("yyMMddHHmmSS");
 
 	@Override
 	public void afterPropertiesSet() throws Exception {
 		// 注册企业账户
-		String orgName = "武汉长乐长风乐器销售有限公司";
-		String organCode = "91420106333619290A";
+		Map<String, String> organList = new HashMap<String, String>();
+		organList.put("91420106333619290A", "武汉长乐长风乐器销售有限公司");
+		organList.put("91440300326364429H", "深圳大雅乐盟网络教育股份有限公司");
 
-		SysUserTsign sysUserTsign = sysUserTsignService.queryByCardNo(organCode);
+		for (Entry<String, String> organ : organList.entrySet()) {
 
-		if (sysUserTsign == null) {
+			String organCode = organ.getKey();
+			String orgName = organ.getValue();
 
-			String accountId = eSealPlugin.createOrganAccount(orgName, organCode);
+			SysUserTsign sysUserTsign = sysUserTsignService.queryByCardNo(organCode);
 
-			if (StringUtils.isBlank(accountId)) {
-				throw new BizException("创建企业电子存证账户失败");
-			}
+			if (sysUserTsign == null) {
 
-			String sealData = eSealPlugin.createOrganSeal(accountId, "", "");
+				String accountId = eSealPlugin.createOrganAccount(orgName, organCode);
 
-			if (StringUtils.isBlank(sealData)) {
-				throw new BizException("创建电子存证印章失败");
-			}
+				if (StringUtils.isBlank(accountId)) {
+					throw new BizException("创建企业电子存证账户失败");
+				}
 
-			sysUserTsign = new SysUserTsign(-1, accountId, sealData, orgName, organCode);
+				String sealData = eSealPlugin.createOrganSeal(accountId, "", "");
 
-			sysUserTsignService.insert(sysUserTsign);
+				if (StringUtils.isBlank(sealData)) {
+					throw new BizException("创建电子存证印章失败");
+				}
+
+				sysUserTsign = new SysUserTsign(-1, accountId, sealData, orgName, organCode);
+
+				sysUserTsignService.insert(sysUserTsign);
 
+			}
 		}
 	}
 
@@ -209,6 +221,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		Date date = new Date();
 		// 上传到oss
 		String dateStrOss = dateFormatOss.format(date);
+		dateStrOss = dateStrOss + "/" + DateUtil.getHour(date);
 		String pdfFilePath = storagePlugin.uploadFile(dateStrOss, srcFile);
 
 		SysUserContracts sysUserContracts = new SysUserContracts();
@@ -266,9 +279,10 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			}
 			sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
 		}
+		Date date = new Date();
 
 		// 合成freemarker
-		String srcPdfPath = contractBaseDir + "/courses/" + userId + ".pdf";
+		String srcPdfPath = contractBaseDir + "/courses/" + dateFormat1.format(date) + "/" + userId + ".pdf";
 
 		File srcFile = new File(srcPdfPath);
 
@@ -330,16 +344,27 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		// 生成借款协议PDF
 		try {
 			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath,
-					"config/fonts/simsun.ttc");
+					"config/fonts/simsun.ttf");
 		} catch (IOException e) {
 			throw new BizException("生成pdf协议失败", e);
 		}
-
+		String organCode = "";
+		if(musicGroup.getOwnershipType() == OwnershipType.OWN){
+			organCode = "91440300326364429H";
+		}else{
+			organCode = "91420106333619290A";
+		}
+		SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
+		if(organTsign == null){
+			throw new BizException("甲方未创建签章");
+		}
+		
+		eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
 		eSealPlugin.userSign(sysUserTsign.getAccountId(), sysUserTsign.getSealData(), srcPdfPath, srcPdfPath);
 
-		Date date = new Date();
 		// 上传到oss
 		String dateStrOss = dateFormatOss.format(date);
+		dateStrOss = dateStrOss + "/" + DateUtil.getHour(date);
 		String pdfFilePath = storagePlugin.uploadFile(dateStrOss, srcFile);
 
 		SysUserContracts sysUserContracts = new SysUserContracts();
@@ -441,9 +466,10 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			}
 			sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
 		}
+		Date date = new Date();
 
 		// 合成freemarker
-		String srcPdfPath = contractBaseDir + "/courses/" + userId + ".pdf";
+		String srcPdfPath = contractBaseDir + "/courses/" + dateFormat1.format(date) + "/" + userId + ".pdf";
 
 		File srcFile = new File(srcPdfPath);
 
@@ -487,12 +513,19 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		} catch (IOException e) {
 			throw new BizException("生成pdf协议失败", e);
 		}
+		String organCode = "91440300326364429H";
+		SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
+		if(organTsign == null){
+			throw new BizException("甲方未创建签章");
+		}
+		
+		eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
 
 		eSealPlugin.userSign(sysUserTsign.getAccountId(), sysUserTsign.getSealData(), srcPdfPath, srcPdfPath);
 
-		Date date = new Date();
 		// 上传到oss
 		String dateStrOss = dateFormatOss.format(date);
+		dateStrOss = dateStrOss + "/" + DateUtil.getHour(date);
 		String pdfFilePath = storagePlugin.uploadFile(dateStrOss, srcFile);
 
 		SysUserContracts sysUserContracts = new SysUserContracts();
@@ -570,9 +603,10 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 			}
 			sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
 		}
+		Date date = new Date();
 
 		// 合成freemarker
-		String srcPdfPath = contractBaseDir + "/goods/" + userId + ".pdf";
+		String srcPdfPath = contractBaseDir + "/courses/" + dateFormat1.format(date) + "/" + userId + ".pdf";
 
 		File srcFile = new File(srcPdfPath);
 
@@ -639,12 +673,24 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		} catch (IOException e) {
 			throw new BizException("生成pdf协议失败", e);
 		}
+		String organCode = "";
+		if(musicGroup.getOwnershipType() == OwnershipType.OWN){
+			organCode = "91440300326364429H";
+		}else{
+			organCode = "91420106333619290A";
+		}
+		SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
+		if(organTsign == null){
+			throw new BizException("甲方未创建签章");
+		}
+		
+		eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);
 
 		eSealPlugin.userSign(sysUserTsign.getAccountId(), sysUserTsign.getSealData(), srcPdfPath, srcPdfPath);
 
-		Date date = new Date();
 		// 上传到oss
 		String dateStrOss = dateFormatOss.format(date);
+		dateStrOss = dateStrOss + "/" + DateUtil.getHour(date);
 		String pdfFilePath = storagePlugin.uploadFile(dateStrOss, srcFile);
 
 		SysUserContracts sysUserContracts = new SysUserContracts();
@@ -693,7 +739,8 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 
 		double depositFee = 0d;
 		if (kitGroupPurchaseTypeEnum == KitGroupPurchaseTypeEnum.LEASE) {
-			StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, musicGroupId, DealStatusEnum.WAIT_PAY);
+			StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService
+					.findMusicGroupApplyOrderByStatus(userId, musicGroupId, DealStatusEnum.WAIT_PAY);
 
 			if (studentPaymentOrder == null) {
 				MusicGroupSubjectPlan musicGroupSubjectPlan = musicGroupSubjectPlanService.findSubjectPlan(musicGroupId, subjectId);

+ 189 - 60
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -128,13 +128,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Autowired
     private CourseScheduleTeacherSalaryDao courseScheduleTeacherSalaryDao;
-    
+
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 
     @Autowired
     private CooperationOrganDao cooperationOrganDao;
-    
+
     @Autowired
     private TeacherAttendanceDao teacherAttendanceDao;
 
@@ -152,19 +152,19 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Autowired
     private EmployeeDao employeeDao;
-	
+
 	@Autowired
 	private SysMessageService sysMessageService;
 
 	@Autowired
 	private SysConfigDao sysConfigDao;
-	
+
 	@Autowired
 	private ClassGroupService classGroupService;
-	
+
 	@Autowired
     private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
-	
+
     @Autowired
     private MusicGroupSubjectPlanService musicGroupSubjectPlanService;
     @Autowired
@@ -175,12 +175,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     private MusicGroupSubjectGoodsGroupService musicGroupSubjectGoodsGroupService;
     @Autowired
     private GoodsService goodsService;
-    
+
     @Autowired
     private ImFeignService imFeignService;
-    
+
     private SimpleDateFormat sdf_ymd = new SimpleDateFormat("yyyy-MM-dd");
-    
+
     private SimpleDateFormat sdf_hms=new SimpleDateFormat("HH:mm:ss");
 
     @Override
@@ -358,6 +358,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentPaymentOrder.setVersion(studentPaymentOrder.getVersion()+1);
 
         String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+
+        Map<String, BigDecimal> classFee = new HashMap<>();
+        classFee.put("course",BigDecimal.ZERO);
+        classFee.put("instrument",BigDecimal.ZERO);
+        classFee.put("accessories",BigDecimal.ZERO);
+        classFee.put("other",amount);
+
         Map payMap = payService.getPayMap(
                 amount,
                 orderNo,
@@ -365,8 +372,15 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 baseApiUrl+"/#/paymentresult?orderNo=" + orderNo,
                 chargeInfo.getTitle(),
                 chargeInfo.getTitle(),
-                userId);
-
+                userId,
+                classFee,
+                chargeInfo.getOrganId()
+        );
+
+        Map<String,BigDecimal> routingFee = (Map<String,BigDecimal>)payMap.get("routingFee");
+        studentPaymentOrder.setComAmount(routingFee.get("COM"));
+        studentPaymentOrder.setPerAmount(routingFee.get("PER"));
+        studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
         studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
         studentPaymentOrder.setUpdateTime(date);
         studentPaymentOrderService.update(studentPaymentOrder);
@@ -395,10 +409,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
         orderAmount = orderAmount.add(courseFee);
 
+        BigDecimal instrumentFee = BigDecimal.ZERO;
+        BigDecimal accessoriesFee = BigDecimal.ZERO;
+        BigDecimal otherFee = BigDecimal.ZERO;
 
         //乐器及打包辅件
         List<MusicGroupSubjectGoodsGroup> goodsGroups = new ArrayList<>();
-
         if (studentRegistration.getTemporaryCourseFee() != null) {
             List<StudentPaymentOrderDetail> orderDetails = studentPaymentOrderDetailService.findUserApplyOrder(studentRegistration.getUserId(), DealStatusEnum.WAIT_PAY);
             for (StudentPaymentOrderDetail orderDetail : orderDetails) {
@@ -415,6 +431,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 musicGroupSubjectGoodsGroup.setPrice(orderDetail.getPrice());
 
                 goodsGroups.add(musicGroupSubjectGoodsGroup);
+                if(musicGroupSubjectGoodsGroup.getType().equals(GoodsType.INSTRUMENT)){
+                    instrumentFee = instrumentFee.add(orderDetail.getPrice());
+                }else if(musicGroupSubjectGoodsGroup.getType().equals(GoodsType.ACCESSORIES)) {
+                    accessoriesFee = accessoriesFee.add(orderDetail.getPrice());
+                }else {
+                    otherFee = otherFee.add(orderDetail.getPrice());
+                }
 
                 orderAmount = orderAmount.add(orderDetail.getPrice());
             }
@@ -422,18 +445,23 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             goodsGroups = musicGroupSubjectGoodsGroupService.findGoodsGroupByIds(registerPayDto.getGoodsGroupIds());
             for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && musicOneSubjectClassPlan.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
-                    orderAmount = orderAmount.add(musicOneSubjectClassPlan.getDepositFee());
                     goodsGroup.setPrice(musicOneSubjectClassPlan.getDepositFee());
-                    continue;
                 }
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && musicOneSubjectClassPlan.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.FREE)) {
                 	goodsGroup.setPrice(new BigDecimal(0));
-                	continue;
                 }
                 orderAmount = orderAmount.add(goodsGroup.getPrice());
+                if(goodsGroup.getType().equals(GoodsType.INSTRUMENT)){
+                    instrumentFee = instrumentFee.add(goodsGroup.getPrice());
+                }else if(goodsGroup.getType().equals(GoodsType.ACCESSORIES)) {
+                    accessoriesFee = accessoriesFee.add(goodsGroup.getPrice());
+                }else {
+                    otherFee = otherFee.add(goodsGroup.getPrice());
+                }
                 //团购乐器减免课程费用
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && goodsGroup.getRemissionCourseFee() != null && musicOneSubjectClassPlan.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.GROUP)) {//团购
                     orderAmount = orderAmount.subtract(goodsGroup.getRemissionCourseFee());
+                    courseFee.subtract(goodsGroup.getRemissionCourseFee());
                 }
             }
         }
@@ -444,6 +472,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             goodsList = goodsService.findGoodsByIds(registerPayDto.getGoodsIds());
             for (Goods goods : goodsList) {
                 orderAmount = orderAmount.add(goods.getGroupPurchasePrice());
+                accessoriesFee = accessoriesFee.add(goods.getGroupPurchasePrice());
             }
         }
 
@@ -453,14 +482,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             otherGoodsList = goodsService.findGoodsByIds(registerPayDto.getOtherGoodsIds());
             for (Goods goods : otherGoodsList) {
                 orderAmount = orderAmount.add(goods.getGroupPurchasePrice());
+                otherFee = otherFee.add(goods.getGroupPurchasePrice());
             }
         }
         if (amount.compareTo(orderAmount) != 0) {
             throw new BizException("商品价格不符");
         }
-
         String orderNo = idGeneratorService.generatorId("payment") + "";
-        
+
         String channelType = "";
 
         StudentPaymentOrder studentPaymentOrder = studentRegistrationService.addOrder(studentRegistration, amount, orderNo, channelType, courseFee, goodsGroups, goodsList, otherGoodsList);
@@ -504,6 +533,28 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         studentPaymentOrder.setVersion(studentPaymentOrder.getVersion()+1);
 
+        MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
+        //分类费用 course,instrument,accessories,other
+        Map<String, BigDecimal> classFee = new HashMap<>();
+        classFee.put("course",courseFee);
+        classFee.put("instrument",instrumentFee);
+        classFee.put("accessories",accessoriesFee);
+        classFee.put("other",otherFee);
+        BigDecimal classFeeAmount = courseFee.add(instrumentFee).add(accessoriesFee).add(otherFee);
+
+        if(amount.compareTo(classFeeAmount) < 0){
+            BigDecimal subAmount = classFeeAmount.subtract(amount);
+            for (Map.Entry<String, BigDecimal> feeEntry : classFee.entrySet()) {
+                if(subAmount.compareTo(feeEntry.getValue()) > 0){
+                    classFee.put(feeEntry.getKey(),BigDecimal.ZERO);
+                    subAmount = subAmount.subtract(feeEntry.getValue());
+                }else {
+                    classFee.put(feeEntry.getKey(),feeEntry.getValue().subtract(subAmount));
+                    break;
+                }
+            }
+        }
+
         String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
         Map payMap = payService.getPayMap(
                 amount,
@@ -512,8 +563,15 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 baseApiUrl+"/#/paymentresult?orderNo=" + orderNo,
                 "乐团报名缴费",
                 "乐团报名缴费",
-                userId);
-
+                userId,
+                classFee,
+                musicGroup.getOrganId()
+        );
+
+        Map<String,BigDecimal> routingFee = (Map<String,BigDecimal>)payMap.get("routingFee");
+        studentPaymentOrder.setComAmount(routingFee.get("COM"));
+        studentPaymentOrder.setPerAmount(routingFee.get("PER"));
+        studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
         studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
         studentPaymentOrder.setUpdateTime(date);
         studentPaymentOrderService.update(studentPaymentOrder);
@@ -529,7 +587,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
 
         Integer userId = studentRegistration.getUserId();
-        
+
         StudentPaymentOrder ApplyOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.ING);
         if (ApplyOrder == null) {
             throw new BizException("没有支付中的订单,请勿非法请求");
@@ -546,6 +604,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
         orderAmount = orderAmount.add(courseFee);
 
+        BigDecimal instrumentFee = BigDecimal.ZERO;
+        BigDecimal accessoriesFee = BigDecimal.ZERO;
+        BigDecimal otherFee = BigDecimal.ZERO;
+
 
         //乐器及打包辅件
         List<MusicGroupSubjectGoodsGroup> goodsGroups = new ArrayList<>();
@@ -564,23 +626,38 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 musicGroupSubjectGoodsGroup.setGoodsIdList(orderDetail.getGoodsIdList());
                 musicGroupSubjectGoodsGroup.setPrice(orderDetail.getPrice());
                 goodsGroups.add(musicGroupSubjectGoodsGroup);
+
+                if(musicGroupSubjectGoodsGroup.getType().equals(GoodsType.INSTRUMENT)){
+                    instrumentFee = instrumentFee.add(orderDetail.getPrice());
+                }else if(musicGroupSubjectGoodsGroup.getType().equals(GoodsType.ACCESSORIES)) {
+                    accessoriesFee = accessoriesFee.add(orderDetail.getPrice());
+                }else {
+                    otherFee = otherFee.add(orderDetail.getPrice());
+                }
                 orderAmount = orderAmount.add(orderDetail.getPrice());
             }
         } else if (studentRegistration.getTemporaryCourseFee() == null && !registerPayDto.getGoodsGroupIds().equals("")) {
             goodsGroups = musicGroupSubjectGoodsGroupService.findGoodsGroupByIds(registerPayDto.getGoodsGroupIds());
             for (MusicGroupSubjectGoodsGroup goodsGroup : goodsGroups) {
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && musicOneSubjectClassPlan.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
-                    orderAmount = orderAmount.add(musicOneSubjectClassPlan.getDepositFee());
-                    continue;
+                    goodsGroup.setPrice(musicOneSubjectClassPlan.getDepositFee());
                 }
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && musicOneSubjectClassPlan.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.FREE)) {
-                    continue;
+                    goodsGroup.setPrice(new BigDecimal(0));
                 }
 
                 orderAmount = orderAmount.add(goodsGroup.getPrice());
+                if(goodsGroup.getType().equals(GoodsType.INSTRUMENT)){
+                    instrumentFee = instrumentFee.add(goodsGroup.getPrice());
+                }else if(goodsGroup.getType().equals(GoodsType.ACCESSORIES)) {
+                    accessoriesFee = accessoriesFee.add(goodsGroup.getPrice());
+                }else {
+                    otherFee = otherFee.add(goodsGroup.getPrice());
+                }
                 //团购乐器减免课程费用
                 if (goodsGroup.getType().equals(GoodsType.INSTRUMENT) && goodsGroup.getRemissionCourseFee() != null && musicOneSubjectClassPlan.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.GROUP)) {//团购
                     orderAmount = orderAmount.subtract(goodsGroup.getRemissionCourseFee());
+                    courseFee.subtract(goodsGroup.getRemissionCourseFee());
                 }
             }
         }
@@ -591,6 +668,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             goodsList = goodsService.findGoodsByIds(registerPayDto.getGoodsIds());
             for (Goods goods : goodsList) {
                 orderAmount = orderAmount.add(goods.getGroupPurchasePrice());
+                accessoriesFee = accessoriesFee.add(goods.getGroupPurchasePrice());
             }
         }
 
@@ -600,6 +678,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             otherGoodsList = goodsService.findGoodsByIds(registerPayDto.getOtherGoodsIds());
             for (Goods goods : otherGoodsList) {
                 orderAmount = orderAmount.add(goods.getGroupPurchasePrice());
+                otherFee = otherFee.add(goods.getGroupPurchasePrice());
             }
         }
         if (amount.compareTo(orderAmount) != 0) {
@@ -607,13 +686,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
 
         String orderNo = idGeneratorService.generatorId("payment") + "";
-        
+
         String channelType = "";
 
         StudentPaymentOrder studentPaymentOrder = studentRegistrationService.reAddOrder(userId, amount, orderNo, channelType, courseFee, goodsGroups, goodsList, otherGoodsList, studentRegistration.getMusicGroupId(), ApplyOrder);
         studentPaymentOrder.setVersion(0);
         Date date = new Date();
-        
+
         if(registerPayDto.getIsUseBalancePayment() || amount.doubleValue() == 0){
         	SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(userId);
         	if(userCashAccount == null){
@@ -648,6 +727,28 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
         studentPaymentOrder.setVersion(studentPaymentOrder.getVersion()+1);
 
+        MusicGroup musicGroup = musicGroupDao.get(studentRegistration.getMusicGroupId());
+        //分类费用 course,instrument,accessories,other
+        Map<String, BigDecimal> classFee = new HashMap<>();
+        classFee.put("course",courseFee);
+        classFee.put("instrument",instrumentFee);
+        classFee.put("accessories",accessoriesFee);
+        classFee.put("other",otherFee);
+        BigDecimal classFeeAmount = courseFee.add(instrumentFee).add(accessoriesFee).add(otherFee);
+
+        if(amount.compareTo(classFeeAmount) < 0){
+            BigDecimal subAmount = classFeeAmount.subtract(amount);
+            for (Map.Entry<String, BigDecimal> feeEntry : classFee.entrySet()) {
+                if(subAmount.compareTo(feeEntry.getValue()) > 0){
+                    classFee.put(feeEntry.getKey(),BigDecimal.ZERO);
+                    subAmount = subAmount.subtract(feeEntry.getValue());
+                }else {
+                    classFee.put(feeEntry.getKey(),feeEntry.getValue().subtract(subAmount));
+                    break;
+                }
+            }
+        }
+
         String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
         Map payMap = payService.getPayMap(
                 amount,
@@ -656,12 +757,18 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 baseApiUrl+"/#/paymentresult?orderNo=" + orderNo,
                 "乐团报名缴费",
                 "乐团报名缴费",
-                userId);
-        
+                userId,
+                classFee,
+                musicGroup.getOrganId()
+        );
+
+        Map<String,BigDecimal> routingFee = (Map<String,BigDecimal>)payMap.get("routingFee");
+        studentPaymentOrder.setComAmount(routingFee.get("COM"));
+        studentPaymentOrder.setPerAmount(routingFee.get("PER"));
+        studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
         studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
         studentPaymentOrder.setUpdateTime(date);
         studentPaymentOrderService.update(studentPaymentOrder);
-        
 		return payMap;
 	}
 
@@ -846,7 +953,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if(new Integer(3).equals(musicGroup.getChargeTypeId())){
             Map<Integer,String> studentMap = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertMybatisMap(studentRegistrationDao.findIdMapByMusicGroupId(musicGroupId,2))),HashMap.class);
             if(studentMap != null && studentMap.size() > 0){
-                String url = "http://mstudev.dayaedu.com/#/smallRegister?musicGroupId=" + musicGroupId;
+                String baseURL = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+                String url = baseURL + "/#/smallRegister?musicGroupId=" + musicGroupId;
                 String serverPhone = sysConfigDao.findConfigValue(SysConfigService.SERVER_PHONE);
                 sysMessageService.batchSendMessage(MessageSender.JIGUANG,MessageTypeEnum.SMS_BASICS_SKILL_APPLY_MESSAGE,
                         studentMap,null,0,"5?" + url,musicGroup.getName(),HttpUtil.getSortUrl(url),serverPhone);
@@ -874,7 +982,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         Map<String,String> paymentStatus = MapUtil.convertMybatisMap(musicGroupStudentFeeDao.queryUserPaymentStatus(userId,StringUtils.join(musicGroupIds,",")));
         // 获取学员在该乐团续费状态
         musicCardDtos.forEach(e -> {
-            e.setPaymentStatus(paymentStatus.get(e.getMusicGroupId()) == null?"NON_PAYMENT":paymentStatus.get(e.getMusicGroupId()));
+            e.setPaymentStatus(paymentStatus.get(e.getMusicGroupId()));
         });
         return musicCardDtos;
     }
@@ -926,7 +1034,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         if (studentPaymentOrders != null && studentPaymentOrders.size() > 0) {
             throw new BizException("缴费存在交易中的数据,不能取消乐团");
         }
-        
+
         //删除续费记录
         musicGroupStudentFeeDao.deleteByMusicGroupId(musicGroupId);
 
@@ -935,7 +1043,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 		// 删除每节课的课酬
 		courseScheduleStudentPaymentDao.deleteByMusicGroupId(musicGroupId, GroupType.MUSIC);
 		courseScheduleTeacherSalaryDao.deleteByMusicGroupId(musicGroupId, GroupType.MUSIC);
-        
+
         //删除考勤
 		teacherAttendanceDao.deleteByMusicGroupId(musicGroupId, GroupType.MUSIC);
 
@@ -992,10 +1100,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         // 清除下次缴费时间
         musicGroupStudentFeeDao.updateNextPaymentDate(musicGroupId, null);
         musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId,"暂停乐团",sysUser.getId(),""));
-        
+
         //删除课表
         courseScheduleDao.logicDeleteCourseSchedulesByMusicGroupID(musicGroup.getId());
-        
+
         return true;
     }
 
@@ -1022,10 +1130,10 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         // 重新设置下次缴费时间
         musicGroupStudentFeeDao.updateNextPaymentDate(musicGroupId, musicGroupPaymentCalenderService.getNextPaymentDate(musicGroupId));
         musicGroupBuildLogDao.insert(new MusicGroupBuildLog(musicGroupId,"恢复乐团",sysUser.getId(),""));
-        
+
         //恢复课表
         courseScheduleDao.resumeCourseScheduleByMusicGroupId(musicGroup.getId());
-        
+
         return true;
     }
 
@@ -1121,7 +1229,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 			}
 			//更新学员在班级的状态
 			classGroupStudentMapperDao.deleteStudentByMusicGroupId(musicGroupId, userId);
-			
+
 			List<Integer> classGroupIdList = classGroupStudentMapperDao.queryClassGroupIdList(musicGroupId, userId, GroupType.MUSIC);
 			if (classGroupIdList != null && classGroupIdList.size() > 0) {
 				//更新班级人数
@@ -1134,21 +1242,21 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 }
                 imFeignService.groupBatchQuit(imGroupModels);
 			}
-			
+
 			List<CourseSchedule> musicGroupCourseSchedules = courseScheduleDao.findMusicGroupCourseSchedulesWithStudent(musicGroupId,GroupType.MUSIC.getCode(), CourseStatusEnum.NOT_START.getCode(),userId);
 			if(!CollectionUtils.isEmpty(musicGroupCourseSchedules)){
 				List<Long> courseScheduleIds = musicGroupCourseSchedules.stream().map(courseSchedule -> courseSchedule.getId()).collect(Collectors.toList());
 
 				// 删除未上课
 	            courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudent(courseScheduleIds,userId);
-				
+
 				//删除学生缴费表
 				courseScheduleStudentPaymentDao.deleteStudentCourseSchedule(userId, musicGroupCourseSchedules);
 			}
-			
+
 			//删除续费周期
 			musicGroupStudentFeeDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
-			
+
 			// 退团
 			studentRegistration.setMusicGroupStatus(ClassGroupStudentStatusEnum.QUIT);
 			studentRegistration.setUpdateTime(date);
@@ -1229,7 +1337,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 		}
 		//更新学员在班级的状态
 		classGroupStudentMapperDao.deleteStudentByMusicGroupId(musicGroupId, userId);
-		
+
 		List<Integer> classGroupIdList = classGroupStudentMapperDao.queryClassGroupIdList(musicGroupId, userId, GroupType.MUSIC);
 		if (classGroupIdList != null && classGroupIdList.size() > 0) {
 			//更新班级人数
@@ -1243,21 +1351,21 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 			}
             imFeignService.groupBatchQuit(imGroupModels);
 		}
-		
+
 		List<CourseSchedule> musicGroupCourseSchedules = courseScheduleDao.findMusicGroupCourseSchedulesWithStudent(musicGroupId,GroupType.MUSIC.getCode(), CourseStatusEnum.NOT_START.getCode(),userId);
 		if(!CollectionUtils.isEmpty(musicGroupCourseSchedules)){
 			List<Long> courseScheduleIds = musicGroupCourseSchedules.stream().map(courseSchedule -> courseSchedule.getId()).collect(Collectors.toList());
 
 			// 删除未上课
             courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudent(courseScheduleIds,userId);
-			
+
 			// 删除学生缴费表
 			courseScheduleStudentPaymentDao.deleteStudentCourseSchedule(userId, musicGroupCourseSchedules);
 		}
-		
+
 		//删除续费周期
 		musicGroupStudentFeeDao.deleteByUserIdAndMusicGroupId(userId, musicGroupId);
-		
+
 		// 退团
 		studentRegistration.setMusicGroupStatus(ClassGroupStudentStatusEnum.QUIT);
 		studentRegistration.setUpdateTime(date);
@@ -1356,7 +1464,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentPaymentOrderDetailList.add(studentPaymentOrderDetail);
 
         studentPaymentOrderDetailService.batchAdd(studentPaymentOrderDetailList);
-        
+
         if(isUseBalancePayment || amount.doubleValue() == 0){
         	SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(userId);
         	if(userCashAccount == null){
@@ -1369,9 +1477,9 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 studentPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
                 studentPaymentOrder.setUpdateTime(date);
                 studentPaymentOrderService.update(studentPaymentOrder);
-                
+
         		sysUserCashAccountService.updateBalance(userId, amount.negate(),PlatformCashAccountDetailTypeEnum.PAY_FEE,"乐团续费");
-        		
+
         		//更新下次续费时间
         		musicGroupStudentFee.setUpdateTime(date);
                 musicGroupStudentFee.setLatestPaidTime(date);
@@ -1392,12 +1500,29 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
         String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
 
+        //分类费用 course,instrument,accessories,other
+        Map<String, BigDecimal> classFee = new HashMap<>();
+        classFee.put("course",amount);
+        classFee.put("instrument",BigDecimal.ZERO);
+        classFee.put("accessories",BigDecimal.ZERO);
+        classFee.put("other",BigDecimal.ZERO);
+
         try {
 
             Map<String, Object> payMap = payService.getPayMap(amount, studentPaymentOrder.getOrderNo(),
                     baseApiUrl+"/api-student/studentOrder/notify",
                     baseApiUrl+"/#/paymentresult?orderNo=" + studentPaymentOrder.getOrderNo(),
-                    "续费", "乐团续费",userId);
+                    "续费",
+                    "乐团续费",
+                    userId,
+                    classFee,
+                    musicGroup.getOrganId()
+            );
+
+            Map<String,BigDecimal> routingFee = (Map<String,BigDecimal>)payMap.get("routingFee");
+            studentPaymentOrder.setComAmount(routingFee.get("COM"));
+            studentPaymentOrder.setPerAmount(routingFee.get("PER"));
+            studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
             studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
             studentPaymentOrder.setUpdateTime(date);
             studentPaymentOrderService.update(studentPaymentOrder);
@@ -1412,7 +1537,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean renewForCallback(StudentPaymentOrder studentPaymentOrder) throws IOException {
 
-        studentPaymentOrderDao.update(studentPaymentOrder);
+        studentPaymentOrderService.update(studentPaymentOrder);
 
         Integer userId = studentPaymentOrder.getUserId();
         String musicGroupId = studentPaymentOrder.getMusicGroupId();
@@ -1436,7 +1561,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             musicGroupStudentFee.setTemporaryCourseFee(new BigDecimal(0));
             musicGroupStudentFee.setNextPaymentDate(musicGroupPaymentCalenderService.getNextPaymentDate(musicGroupId));
             musicGroupStudentFeeDao.update(musicGroupStudentFee);
-            
+
             //插入交易明细
             SysUserCashAccount cashAccount = sysUserCashAccountService.get(userId);
             BigDecimal amount = studentPaymentOrder.getActualAmount();
@@ -1451,21 +1576,27 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             rechargeDetail.setType(PlatformCashAccountDetailTypeEnum.RECHARGE);
             rechargeDetail.setUpdateTime(date);
             rechargeDetail.setUserId(userId);
+            rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
+            rechargeDetail.setComAmount(studentPaymentOrder.getComAmount());
+            rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount());
             sysUserCashAccountDetailService.insert(rechargeDetail);
-            
+
             //缴费
             SysUserCashAccountDetail paymentDetail = new SysUserCashAccountDetail();
-            paymentDetail.setAmount(amount);
+            paymentDetail.setAmount(amount.negate());
             paymentDetail.setBalance(cashAccount.getBalance());
-            paymentDetail.setComment("费");
+            paymentDetail.setComment("费");
             paymentDetail.setCreateTime(date);
             paymentDetail.setStatus(DealStatusEnum.SUCCESS);
             paymentDetail.setTransNo(studentPaymentOrder.getTransNo());
             paymentDetail.setType(PlatformCashAccountDetailTypeEnum.PAY_FEE);
             paymentDetail.setUpdateTime(date);
             paymentDetail.setUserId(userId);
+            rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
+            rechargeDetail.setComAmount(studentPaymentOrder.getComAmount().negate());
+            rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount().negate());
             sysUserCashAccountDetailService.insert(paymentDetail);
-            
+
             // 发送续费结果通知
             sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SMS_MUSIC_GROUP_RENEW_SUCCESS, push, null, 0, "1",
                     studentRegistration.getParentsName(),studentPaymentOrder.getActualAmount());
@@ -1474,13 +1605,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             return true;
         }
         if(studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED){
-//            String studentApplyUrl = sysConfigDao.findConfigValue(SysConfigService.STUDENT_APPLY_URL) + musicGroupId;
-            String memo = "http://mstudev.dayaedu.com/#/renew?musicGroupId=" + musicGroupId;
+            String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+            String memo = baseUrl + "/#/renew?musicGroupId=" + musicGroupId;
             //4?http://mstudev.dayaedu.com/#/renew?musicGroupId=" +musicGroupId
             sysMessageService.batchSendMessage(MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_MUSIC_GROUP_RENEW_FAILED, push, null, 0, "4?" + memo,
                     HttpUtil.getSortUrl(memo));
-            sysMessageService.batchSendMessage(MessageSender.YIMEI, MessageTypeEnum.STUDENT_PUSH_MUSIC_GROUP_RENEW_FAILED, yimei, null, 0, "4?" + memo,
-                    HttpUtil.getSortUrl(memo));
             return false;
         }
         return false;

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

@@ -5,10 +5,12 @@ import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.SysAccount;
+import com.ym.mec.biz.dal.entity.SysPaymentConfig;
 import com.ym.mec.biz.dal.enums.PaymentChannelTypeEnum;
 import com.ym.mec.biz.service.PayService;
 import com.ym.mec.biz.service.StudentPaymentOrderService;
 import com.ym.mec.biz.service.SysAccountService;
+import com.ym.mec.biz.service.SysPaymentConfigService;
 import com.ym.mec.thirdparty.adapay.Pay;
 import com.ym.mec.thirdparty.union.UnionPay;
 import com.ym.mec.thirdparty.union.UnionPayFeignService;
@@ -17,8 +19,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 支付服务类
@@ -36,6 +41,8 @@ public class PayServiceImpl implements PayService {
     private MusicGroupDao musicGroupDao;
     @Autowired
     private SysConfigDao sysConfigDao;
+    @Autowired
+    private SysPaymentConfigService sysPaymentConfigService;
 
 
     /**
@@ -50,6 +57,7 @@ public class PayServiceImpl implements PayService {
      * @return
      * @throws Exception
      */
+    @Override
     public Map<String, Object> getPayMap(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, Integer userId) throws Exception {
 
         String company = "daya";
@@ -85,6 +93,53 @@ public class PayServiceImpl implements PayService {
     }
 
     @Override
+    public Map<String, Object> getPayMap(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, Integer userId, Map<String, BigDecimal> fee, Integer organId) throws Exception {
+        String company = "daya";
+        if (userId != null) {
+            MusicGroup musicGroup = musicGroupDao.findUserMusicGroup(userId);
+            if (musicGroup != null && musicGroup.getOwnershipType().equals(CooperationOrgan.OwnershipType.COOPERATION)) {
+                company = "yadie";
+            }
+        }
+
+        //支付通道决策
+        Map unionPay = new HashMap();
+        Map<String, BigDecimal> routingFee = getRoutingFee(company, amount, fee, organId);
+        List<SysAccount> accounts = getRoutingAccount(routingFee, company);
+        SysAccount routingAccount = accounts.get(0);
+
+        Map payMap = null;
+        String type = null;
+        if (routingAccount.getChannel().equals("YQPAY")) {
+            List<Map> tempRoutingList = new ArrayList();
+            for (SysAccount account : accounts) {
+                Map<String, Object> routingList = new HashMap<>();
+                routingList.put("routingMerNo", account.getRoutingMerNo());//分佣账户
+                routingList.put("routingFee", account.getRoutingFee().subtract((account.getRoutingFee().multiply(new BigDecimal(0.28)).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_UP))); //分佣金额
+                tempRoutingList.add(routingList);
+            }
+            if(accounts.size() ==1 && routingAccount.getMerNo().equals(routingAccount.getRoutingMerNo())){
+                tempRoutingList = null;
+            }
+
+            payMap = YqPayUtil.getPayMap(amount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody, routingAccount.getMerNo(), tempRoutingList);
+            type = "YQPAY";
+        } else {
+            payMap = new Pay().getPayMap(amount, orderNo, notifyUrl, orderSubject, orderBody);
+            type = "ADAPAY";
+        }
+
+        String routingMerNos = accounts.stream().map(sysAccount -> sysAccount.getRoutingMerNo()).collect(Collectors.joining(","));
+
+        unionPay.put("orderNo", orderNo);
+        unionPay.put("type", type);
+        unionPay.put("payMap", payMap);
+        unionPay.put("routingFee",routingFee);
+        unionPay.put("routingMerNos",routingMerNos);
+        return unionPay;
+    }
+
+    @Override
     public Map<String, Object> query(String orderNo) throws Exception {
         return new UnionPay(unionPayFeignService).query(orderNo);
     }
@@ -115,9 +170,99 @@ public class PayServiceImpl implements PayService {
         if (company.equals("yadie")) {
             type = "PER";
         }
-        routingAccount = sysAccountService.getAccount(company, channel, type, null);
+        SysAccount account = sysAccountService.getOneAccount(company, channel, type, null);
 
-        return routingAccount;
+        return account;
     }
 
+    /**
+     * 获取收款账户
+     *
+     * @param routingFee
+     * @param company
+     * @return
+     */
+    private List<SysAccount> getRoutingAccount(Map<String, BigDecimal> routingFee, String company) {
+        String channel = "";
+        String type = "";
+
+        if (routingFee.get("COM").compareTo(BigDecimal.ZERO) > 0 && routingFee.get("PER").compareTo(BigDecimal.ZERO) > 0) {
+            channel = "YQPAY";
+            type = "COM,PER";
+        } else if (routingFee.get("COM").compareTo(BigDecimal.ZERO) > 0 && routingFee.get("PER").compareTo(BigDecimal.ZERO) == 0) {
+            channel = sysConfigDao.findConfigValue("com_account_channel");
+            type = "COM";
+        } else if (routingFee.get("COM").compareTo(BigDecimal.ZERO) == 0 && routingFee.get("PER").compareTo(BigDecimal.ZERO) > 0) {
+            channel = sysConfigDao.findConfigValue("per_account_channel");
+            type = "PER";
+        }
+        List<SysAccount> accounts = sysAccountService.getAccount(company, channel, type, null);
+
+        for (SysAccount account : accounts) {
+            if (account.getType().equals("COM")) {
+                account.setRoutingFee(routingFee.get("COM"));
+            } else {
+                account.setRoutingFee(routingFee.get("PER"));
+            }
+        }
+        return accounts;
+    }
+
+    /**
+     * 获取分佣金额
+     *
+     * @param fee
+     * @param organId
+     * @return
+     */
+    private Map<String, BigDecimal> getRoutingFee(String company, BigDecimal amount, Map<String, BigDecimal> fee, Integer organId) {
+        Map<String, BigDecimal> routingFee = new HashMap<>(2);
+        routingFee.put("COM", BigDecimal.ZERO);
+        routingFee.put("PER", BigDecimal.ZERO);
+        if (company.equals("yadie")) {
+            routingFee.put("PER", amount);
+            return routingFee;
+        }
+
+        SysPaymentConfig paymentConfig = sysPaymentConfigService.findPaymentConfigByOrganId(organId);
+
+        int payOrderNums = studentPaymentOrderService.findPayOrderNum(); //获取支付中和成功的订单数
+        //前几笔收入私户
+        Integer nums = Integer.parseInt(sysConfigDao.findConfigValue("per_account_nums"));
+        if (paymentConfig != null && paymentConfig.getType().equals(1)) {
+            nums = paymentConfig.getPerScale();
+        }
+
+        String type = null;
+        int rem = (payOrderNums + 1) % 10;
+        if (rem > 0 && rem <= nums) { //私人账户
+            type = "PER";
+        } else {
+            type = "COM";
+        }
+        routingFee.put(type, amount);
+
+        if (paymentConfig == null || !paymentConfig.getType().equals(2)) {
+            return routingFee;
+        }
+        routingFee.put(type, BigDecimal.ZERO);
+        for (Map.Entry<String, BigDecimal> feeEntry : fee.entrySet()) {
+            if (feeEntry.getKey().equals("course")) {
+                BigDecimal RoutingFee = routingFee.get(paymentConfig.getCourseFee()).add(feeEntry.getValue());
+                routingFee.put(paymentConfig.getCourseFee(), RoutingFee);
+            } else if (feeEntry.getKey().equals("instrument")) {
+                BigDecimal RoutingFee = routingFee.get(paymentConfig.getInstrumentFee()).add(feeEntry.getValue());
+                routingFee.put(paymentConfig.getInstrumentFee(), RoutingFee);
+            } else if (feeEntry.getKey().equals("accessories")) {
+                BigDecimal RoutingFee = routingFee.get(paymentConfig.getAccessoriesFee()).add(feeEntry.getValue());
+                routingFee.put(paymentConfig.getAccessoriesFee(), RoutingFee);
+            } else if (feeEntry.getKey().equals("other")) {
+                BigDecimal RoutingFee = routingFee.get(paymentConfig.getOtherFee()).add(feeEntry.getValue());
+                routingFee.put(paymentConfig.getOtherFee(), RoutingFee);
+            }
+        }
+        return routingFee;
+    }
+
+
 }

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

@@ -52,7 +52,10 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
 	@Override
 	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
 	public Boolean renewForCallback(StudentPaymentOrder studentPaymentOrder) {
-		studentPaymentOrderDao.update(studentPaymentOrder);
+		int updateCount = studentPaymentOrderDao.update(studentPaymentOrder);
+		if(updateCount <= 0){
+			throw new BizException("订单更新失败");
+		}
 		Integer userId = studentPaymentOrder.getUserId();
 		SysUser sysUser = sysUserFeignService.queryUserById(userId);
 		SporadicChargeInfo info = sporadicChargeInfoDao.get(Integer.parseInt(studentPaymentOrder.getMusicGroupId()));

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

@@ -5,6 +5,7 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.enums.SysUserType;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
@@ -58,23 +59,47 @@ public class StudentManageServiceImpl implements StudentManageService {
     @Override
     public PageInfo findStudentsByOrganId(StudentManageQueryInfo queryInfo) {
         PageInfo<StudentManageListDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Boolean hasCourse = queryInfo.getHasCourse();
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
-
+        params.put("offset", pageInfo.getOffset());
+        int count = 0;
+        if(hasCourse != null){
+            List<Integer> userIds;
+            if(hasCourse){
+                userIds = studentManageDao.queryHasCourse(params);
+                count = studentManageDao.countHasCourse(params);
+            }else {
+                userIds = studentManageDao.queryNotCourse(params);
+                count = studentManageDao.countNotCourse(params);
+            }
+            params.remove("offset");
+            params.put("userIds",userIds);
+        }else {
+            count = studentManageDao.countStudentByOrganId(params);
+        }
         List<StudentManageListDto> dataList = null;
-        int count = studentManageDao.countStudentByOrganId(params);
         if (count > 0) {
             pageInfo.setTotal(count);
-            params.put("offset", pageInfo.getOffset());
             dataList = studentManageDao.findStudentsByOrganId(params);
             List<Integer> userIds = dataList.stream()
                     .map(StudentManageListDto::getUserId).collect(Collectors.toList());
             List<SysUserCashAccount> byUserIds = sysUserCashAccountDao.findByUserIds(userIds);
+//            Map<Integer,Long> hasCourseMap = MapUtil.convertIntegerMap(studentManageDao.queryStudentHasCourse(userIds));
             Map<Integer, SysUserCashAccount> collect = byUserIds.stream()
                     .collect(Collectors.toMap(SysUserCashAccount::getUserId, sysUserCashAccount -> sysUserCashAccount));
-            dataList.forEach(studentManageListDto -> {
-                if(collect.get(studentManageListDto.getUserId()) != null){
-                    studentManageListDto.setCourseBalance(collect.get(studentManageListDto.getUserId()).getCourseBalance());
+            dataList.forEach(e -> {
+                if(hasCourse == null){
+                    e.setHasCourse(studentManageDao.getHasCourse(e.getUserId()));
+                }else {
+                    if(hasCourse){
+                        e.setHasCourse(1L);
+                    }else {
+                        e.setHasCourse(0L);
+                    }
+                }
+                if(collect.get(e.getUserId()) != null){
+                    e.setCourseBalance(collect.get(e.getUserId()).getCourseBalance());
                 }
             });
         }
@@ -319,4 +344,14 @@ public class StudentManageServiceImpl implements StudentManageService {
         teacherDao.updateUser(sysUser);
         return userId;
     }
+
+    @Override
+    public List<StudentRegisterPerDto> queryStudentPer() {
+        return studentRegistrationDao.queryStudentPer();
+    }
+
+    @Override
+    public List<StudentHasCourseDto> queryHasCourseStudent(String organId) {
+        return studentManageDao.queryHasCourseStudent(organId);
+    }
 }

+ 48 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java

@@ -1,21 +1,23 @@
 package com.ym.mec.biz.service.impl;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.musicalListDetailDto;
 import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
 import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import com.ym.mec.biz.dal.dao.MusicGroupPurchaseListDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.service.GoodsService;
 import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
@@ -31,11 +33,17 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
     @Autowired
     private GoodsService goodsService;
     @Autowired
+    private TeacherDao teacherDao;
+    @Autowired
     private MusicGroupDao musicGroupDao;
     @Autowired
     private OrganizationDao organizationDao;
     @Autowired
     private MusicGroupPurchaseListDao musicGroupPurchaseListDao;
+    @Autowired
+    private StudentPaymentOrderDao studentPaymentOrderDao;
+    @Autowired
+    private StudentRegistrationDao studentRegistrationDao;
 
     @Override
     public BaseDAO<Long, StudentPaymentOrderDetail> getDAO() {
@@ -158,4 +166,40 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
     public List<StudentPaymentOrderDetail> findUserApplyOrder(Integer userId, DealStatusEnum status) {
         return studentPaymentOrderDetailDao.findUserApplyOrder(userId, status);
     }
+
+    @Override
+    public List<musicalListDetailDto> getMusicalListDetail(String musicGroupId) {
+        List<musicalListDetailDto> musicalListDetailDtos = studentPaymentOrderDetailDao.getMusicalListDetail(musicGroupId);
+        if(musicalListDetailDtos != null && musicalListDetailDtos.size() > 0){
+            List<Long> paymentOrderNo = musicalListDetailDtos.stream().map(e -> e.getPaymentOrderId()).collect(Collectors.toList());
+            List<Integer> userIds = musicalListDetailDtos.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+            //商品名称
+            MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+            Organization organization = organizationDao.get(musicGroup.getOrganId());
+            Map<Long,String> goodsNameMap = MapUtil.convertIntegerMap(studentPaymentOrderDetailDao.queryGoodsNames(paymentOrderNo));
+            Map<Integer,String> usernameMap = MapUtil.convertIntegerMap(teacherDao.queryUsernameByIds(userIds));
+            Map<Long, BigDecimal> actualAmountMap = MapUtil.convertIntegerMap(studentPaymentOrderDao.queryActualAmount(paymentOrderNo));
+            Map<Long, BigDecimal> musicalAmountMap = MapUtil.convertIntegerMap(studentPaymentOrderDetailDao.queryGoodsPrice(paymentOrderNo,"MUSICAL"));
+            Map<Long, BigDecimal> accessoriesAmountMap = MapUtil.convertIntegerMap(studentPaymentOrderDetailDao.queryGoodsPrice(paymentOrderNo,"ACCESSORIES"));
+            Map<Long, BigDecimal> courseAmountMap = MapUtil.convertIntegerMap(studentPaymentOrderDetailDao.queryGoodsPrice(paymentOrderNo,"COURSE"));
+            Map<Long, String> purchaseTypeMap = MapUtil.convertIntegerMap(studentRegistrationDao.queryPurchaseTypeMap(musicGroupId));
+            musicalListDetailDtos.forEach(e->{
+                e.setGoodsNames(goodsNameMap.get(e.getPaymentOrderId()));
+                e.setMusicGroupName(musicGroup.getName());
+                e.setUsername(usernameMap.get(e.getUserId()));
+                e.setOrganName(organization.getName());
+                e.setMusicalAmount(musicalAmountMap.get(e.getPaymentOrderId()));
+                e.setAccessoriesAmount(accessoriesAmountMap.get(e.getPaymentOrderId()));
+                e.setOrderAmount(actualAmountMap.get(e.getPaymentOrderId()));
+                e.setCourseAmount(courseAmountMap.get(e.getPaymentOrderId()));
+                e.setKitGroupPurchaseTypeEnum(KitGroupPurchaseTypeEnum.valueOf(purchaseTypeMap.get(e.getUserId())));
+            });
+        }
+        return musicalListDetailDtos;
+    }
+
+    @Override
+    public StudentPaymentOrderDetail findApplyOrderMusical(Long orderId) {
+        return studentPaymentOrderDetailDao.findApplyOrderMusical(orderId);
+    }
 }

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

@@ -10,6 +10,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.service.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -21,10 +22,6 @@ import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
-import com.ym.mec.biz.service.MusicGroupService;
-import com.ym.mec.biz.service.StudentPaymentOrderService;
-import com.ym.mec.biz.service.StudentRegistrationService;
-import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.adapay.Pay;
@@ -46,6 +43,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private VipGroupService vipGroupService;
     @Autowired
     private MusicGroupService musicGroupService;
+    @Autowired
+    private SporadicChargeInfoService sporadicChargeInfoService;
 
     @Override
     public BaseDAO<Long, StudentPaymentOrder> getDAO() {
@@ -186,6 +185,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             vipGroupService.orderCallback(order);
         } else if (order.getType().equals(OrderTypeEnum.RENEW)) {
             musicGroupService.renewForCallback(order);
+        }else if (order.getType().equals(OrderTypeEnum.SPORADIC)){
+            sporadicChargeInfoService.renewForCallback(order);
         }
     }
 
@@ -214,6 +215,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                     vipGroupService.orderCallback(order);
                 } else if (order.getType().equals(OrderTypeEnum.RENEW)) {
                     musicGroupService.renewForCallback(order);
+                }else if (order.getType().equals(OrderTypeEnum.SPORADIC)){
+                    sporadicChargeInfoService.renewForCallback(order);
                 }
             } catch (Exception e) {
                 e.printStackTrace();

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

@@ -6,10 +6,7 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
 import com.ym.mec.auth.api.enums.SysUserType;
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.StudentAddDto;
-import com.ym.mec.biz.dal.dto.StudentApplyDetailDto;
-import com.ym.mec.biz.dal.dto.StudentFeeDetailDto;
-import com.ym.mec.biz.dal.dto.StudentInfo;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.StudentRegistrationQueryInfo;
@@ -755,11 +752,13 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             rechargeDetail.setUpdateTime(nowDate);
             rechargeDetail.setUserId(studentRegistration.getUserId());
             rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
+            rechargeDetail.setComAmount(studentPaymentOrder.getComAmount());
+            rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount());
             sysUserCashAccountDetailService.insert(rechargeDetail);
 
             //缴费
             SysUserCashAccountDetail paymentDetail = new SysUserCashAccountDetail();
-            paymentDetail.setAmount(amount);
+            paymentDetail.setAmount(amount.negate());
             paymentDetail.setBalance(cashAccount.getBalance());
             paymentDetail.setComment("报名缴费");
             paymentDetail.setCreateTime(nowDate);
@@ -769,6 +768,11 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             paymentDetail.setUpdateTime(nowDate);
             paymentDetail.setUserId(studentRegistration.getUserId());
             rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
+            if(studentPaymentOrder.getComAmount() != null){
+                rechargeDetail.setComAmount(studentPaymentOrder.getComAmount().negate());
+                rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount().negate());
+            }
+
             sysUserCashAccountDetailService.insert(paymentDetail);
 
             //发送缴费成功通知(短信 + push)
@@ -783,6 +787,16 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
                     MessageTypeEnum.STUDENT_SMS_PAYMENT_SUCCESS, map1, null, 0, "1",
                     studentRegistration.getParentsName(), studentPaymentOrder.getActualAmount());
+
+//            //生成课程协议
+            /*contractService.transferMusicGroupCoursesContract(studentRegistration.getUserId(),studentRegistration.getMusicGroupId());
+            //商品协议(租赁时候有)
+            if(musicOneSubjectClassPlan.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)){
+                StudentPaymentOrderDetail applyOrderMusical = studentPaymentOrderDetailService.findApplyOrderMusical(studentPaymentOrder.getId());
+                if(applyOrderMusical != null && applyOrderMusical.getGoodsIdList() != null && !applyOrderMusical.getGoodsIdList().equals("")){
+                    contractService.transferGoodsContract(studentPaymentOrder.getUserId(),studentPaymentOrder.getMusicGroupId(),applyOrderMusical.getGoodsIdList(),musicOneSubjectClassPlan.getKitGroupPurchaseType());
+                }
+            }*/
         }
 
 

+ 4 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysAccountServiceImpl.java

@@ -25,13 +25,13 @@ public class SysAccountServiceImpl extends BaseServiceImpl<Integer, SysAccount>
     }
 
     @Override
-    public SysAccount getPerAccount(BigDecimal money) {
-        return sysAccountDao.getPerAccount(money);
+    public List<SysAccount> getAccount(String company, String channel, String type, BigDecimal amount) {
+        return sysAccountDao.getAccount(company, channel, type, amount);
     }
 
     @Override
-    public SysAccount getAccount(String company, String channel, String type, BigDecimal amount) {
-        return sysAccountDao.getAccount(company, channel, type, amount);
+    public SysAccount getOneAccount(String company, String channel, String type, BigDecimal amount) {
+        return sysAccountDao.getOneAccount(company,channel,type,amount);
     }
 
 }

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

@@ -304,8 +304,8 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		Map<Integer, String> receivers = new HashMap<>(1);
 		receivers.put(userId, receiver);
 		batchSendMessage(messageSender, messageType, receivers, null, 1, "", code);
-		redisCache.put(key, code, CODE_EXPIRE);
-		redisCache.put(key1, code, CODE_INTERVAL_TIME);
+		redisCache.put(key, code + "", CODE_EXPIRE);
+		redisCache.put(key1, code + "", CODE_INTERVAL_TIME);
 		return true;
 	}
 

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

@@ -189,7 +189,18 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 			}
 		}
 		List<BasicUserDto> userDtos = teacherDao.queryGroupStudents(teacherId, search);
-		teachers.addAll(userDtos);
+		if(userDtos != null && userDtos.size() > 0){
+			teachers.addAll(userDtos);
+			Set<String> musicGroupIds = userDtos.stream().map(e -> e.getMusicGroupId()).collect(Collectors.toSet());
+			if(musicGroupIds != null && musicGroupIds.size() > 0){
+				Map<String, String> musicGroupNameMap = MapUtil.convertIntegerMap(musicGroupDao.queryMusicGroupNameMap(musicGroupIds));
+				userDtos.forEach(e->{
+					if(StringUtils.isNotEmpty(musicGroupNameMap.get(e.getMusicGroupId()))){
+						e.setName(musicGroupNameMap.get(e.getMusicGroupId()) + " " + e.getName());
+					}
+				});
+			}
+		}
 		return teachers;
 	}
 

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

@@ -1050,7 +1050,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 				throw new BizException("用户账户找不到");
 			}
 			studentPaymentOrder.setPaymentChannel("BALANCE");
-			if(userCashAccount.getBalance().subtract(vipGroup.getTotalPrice()).doubleValue() > 0){
+			if(userCashAccount.getBalance().subtract(vipGroup.getTotalPrice()).doubleValue() >= 0){
 				// 更新订单信息
 				studentPaymentOrder.setActualAmount(new BigDecimal(0));
 				studentPaymentOrder.setBalancePaymentAmount(amount);
@@ -1085,6 +1085,12 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		}
 
 		String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+		//分类费用 course,instrument,accessories,other
+		Map<String, BigDecimal> classFee = new HashMap<>();
+		classFee.put("course",amount);
+		classFee.put("instrument",BigDecimal.ZERO);
+		classFee.put("accessories",BigDecimal.ZERO);
+		classFee.put("other",BigDecimal.ZERO);
 		try {
 			Map<String,Object> payMap = payService.getPayMap(
 					amount,
@@ -1093,7 +1099,15 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 					baseApiUrl+"/#/paymentresult?orderNo=" + orderNo,
 					"vip课购买",
 					vipGroup.getName(),
-					user.getId());
+					user.getId(),
+					classFee,
+					vipGroup.getOrganId()
+			);
+
+			Map<String,BigDecimal> routingFee = (Map<String,BigDecimal>)payMap.get("routingFee");
+			studentPaymentOrder.setComAmount(routingFee.get("COM"));
+			studentPaymentOrder.setPerAmount(routingFee.get("PER"));
+			studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
 			studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
 			studentPaymentOrder.setUpdateTime(date);
 			studentPaymentOrderService.update(studentPaymentOrder);
@@ -1149,6 +1163,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		sysUserIncomeCashAccountDetail.setAmount(order.getActualAmount());
 		sysUserIncomeCashAccountDetail.setBalance(sysUserCashAccount.getBalance().add(order.getActualAmount()));
 		sysUserIncomeCashAccountDetail.setAttribute(order.getTransNo());
+		sysUserIncomeCashAccountDetail.setChannel(studentPaymentOrder.getPaymentChannel());
+		sysUserIncomeCashAccountDetail.setComAmount(studentPaymentOrder.getComAmount());
+		sysUserIncomeCashAccountDetail.setPerAmount(studentPaymentOrder.getPerAmount());
 
 		//支出
 		SysUserCashAccountDetail sysUserExpendCashAccountDetail = new SysUserCashAccountDetail();
@@ -1158,6 +1175,13 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		sysUserExpendCashAccountDetail.setAmount(order.getActualAmount().negate());
 		sysUserExpendCashAccountDetail.setBalance(sysUserCashAccount.getBalance());
 		sysUserExpendCashAccountDetail.setAttribute(order.getTransNo());
+		sysUserExpendCashAccountDetail.setChannel(studentPaymentOrder.getPaymentChannel());
+		if(studentPaymentOrder.getComAmount() != null){
+			sysUserExpendCashAccountDetail.setComAmount(studentPaymentOrder.getComAmount().negate());
+		}
+		if(studentPaymentOrder.getPerAmount() != null){
+			sysUserExpendCashAccountDetail.setPerAmount(studentPaymentOrder.getPerAmount().negate());
+		}
 
 		sysUserCashAccountDetailService.insert(sysUserIncomeCashAccountDetail);
 		sysUserCashAccountDetailService.insert(sysUserExpendCashAccountDetail);
@@ -1911,14 +1935,18 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			offlineTeacherSalary = new BigDecimal(0);
 		}
 
-		if(onlineTeacherSalary.compareTo(zero)<=0
-                &&offlineTeacherSalary.compareTo(zero)<=0){
-            TeacherDefaultVipGroupSalary byTeacherAndCategory = teacherDefaultVipGroupSalaryDao.findByTeacherAndCategory(vipGroup.getUserId(), vipGroup.getVipGroupCategoryId());
+		TeacherDefaultVipGroupSalary byTeacherAndCategory = teacherDefaultVipGroupSalaryDao.findByTeacherAndCategory(vipGroup.getUserId(), vipGroup.getVipGroupCategoryId());
+
+		if(onlineTeacherSalary.compareTo(zero)<=0){
             if(Objects.nonNull(byTeacherAndCategory)){
                 onlineTeacherSalary=byTeacherAndCategory.getOnlineClassesSalary();
-                offlineTeacherSalary=byTeacherAndCategory.getOfflineClassesSalary();
             }
 		}
+		if(offlineTeacherSalary.compareTo(zero)<=0){
+			if(Objects.nonNull(byTeacherAndCategory)){
+				offlineTeacherSalary=byTeacherAndCategory.getOfflineClassesSalary();
+			}
+		}
 
 		//创建老师单节课课酬信息
 		courseScheduleTeacherSalaryService.createCourseScheduleTeacherVipSalary(vipGroup,

+ 27 - 25
mec-biz/src/main/resources/config/contracts/courses.ftl

@@ -1,5 +1,5 @@
 <!DOCTYPE html>
-<html lang="en" style="font-size: 100px;">
+<html lang="en">
 <head>
     <meta charset="utf-8" />
     <meta http-equiv="X-UA-Compatible" content="IE=edge" />
@@ -11,55 +11,55 @@
     <style>
         body { margin: 0; }
         header {
-            height: .40rem;
-            line-height: .40rem;
+            height: 40px;
+            line-height: .40px;
             color: #000;
-            font-size: .17rem;
+            font-size: 17px;
             background: #fff;
             box-shadow: 0px 1px 8px 0px rgba(0, 0, 0, 0.07);
             text-align: center;
         }
         header .back {
-            width: .2rem;
-            height: .2rem;
+            width: 20px;
+            height: 20px;
             position: absolute;
-            left: .12rem;
-            top: .1rem;
+            left: 12px;
+            top: 10px;
         }
         .container {
-            padding: .22rem .2rem .3rem;
-            font-size: .14rem;
+            padding: 22px 20px 3px;
+            font-size: 14px;
         }
         h1 {
-            font-size: .16rem;
+            font-size: 16px;
             text-align: center;
         }
         h2 {
-            font-size: .16rem;
+            font-size: 16px;
             font-weight: bold;
-            padding-top: .15rem;
+            padding-top: 15px;
         }
         h3 {
-            font-size: .14rem;
+            font-size: 14px;
             font-weight: bold;
         }
         .signature {
-            display: flex;
-            padding-top: .5rem;
+            padding-top: 50px;
         }
         .signature .sign {
-            flex: 1;
             position: relative;
+            width: 49%;
+            display: inline-block;
         }
         .signature span {
             display: block;
         }
         .signature .cachet {
             position: absolute;
-            top: -.6rem;
+            top: -60px;
             left: 0;
-            width: 1.5rem;
-            height: 1.5rem;
+            width: 150px;
+            height: 150px;
         }
         .iInfo {
             display: flex;
@@ -84,23 +84,25 @@
         <div style="display: flex;">乙方:
             <div style="flex: 1 auto;">
                 <div class="iInfo">
-                    <span>家长姓名 :${studentInfo.parentsName!}</span>
+                    <span>家长姓名 :${studentInfo.realName!}</span>
                     <span>电话: ${studentInfo.phone!}</span>
                 </div>
                 <div class="iInfo">
                     <span>身份证号:${studentInfo.idCardNo!}</span>
                 </div>
                 <div class="iInfo">
-                    <span>学生姓名:${studentInfo.name!}</span>
+                    <span>学生姓名:${studentInfo.username!}</span>
                 </div>
-                <#if studentInfo.grade??>
+                <#if studentInfo.grade?default("")?trim?length gt 1>
                 <div class="iInfo">
                     <span>所在班级:${studentInfo.grade!} ${studentInfo.clazz!}</span>
                 </div>
                 </#if>
+                <#if studentInfo.subject.name?default("")?trim?length gt 1>
                 <div class="iInfo">
                     <span>所在声部:${studentInfo.subject.name!}</span>
                 </div>
+                </#if>
             </div>
         
             
@@ -174,7 +176,7 @@
                 <span>日期:${.now?string("yyyy年MM月dd日")}</span>
             </div>
             </#if>
-            <div class="sign">乙方签字:${studentInfo.parentsName!}
+            <div class="sign">乙方签字:${studentInfo.realName!}
                 <span>日期:${.now?string("yyyy年MM月dd日")} </span>
             </div>
         	<#else>
@@ -187,7 +189,7 @@
                 <span>日期:${.now?string("yyyy年MM月dd日")}</span>
             </div>
             </#if>
-            <div class="sign">乙方签
+            <div class="sign">乙方签
                 <span>日期:${.now?string("yyyy年MM月dd日")} </span>
             </div>
         	</#if>

+ 28 - 24
mec-biz/src/main/resources/config/contracts/goods.ftl

@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" style="font-size: 100px;">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
     <meta charset="utf-8" />
     <meta http-equiv="X-UA-Compatible" content="IE=edge" />
@@ -11,55 +11,55 @@
     <style>
         body { margin: 0; }
         header {
-            height: .40rem;
-            line-height: .40rem;
+            height: 40px;
+            line-height: .40px;
             color: #000;
-            font-size: .17rem;
+            font-size: 17px;
             background: #fff;
             box-shadow: 0px 1px 8px 0px rgba(0, 0, 0, 0.07);
             text-align: center;
         }
         header .back {
-            width: .2rem;
-            height: .2rem;
+            width: 20px;
+            height: 20px;
             position: absolute;
-            left: .12rem;
-            top: .1rem;
+            left: 12px;
+            top: 10px;
         }
         .container {
-            padding: .22rem .2rem .3rem;
-            font-size: .14rem;
+            padding: 22px 20px 3px;
+            font-size: 14px;
         }
         h1 {
-            font-size: .16rem;
+            font-size: 16px;
             text-align: center;
         }
         h2 {
-            font-size: .16rem;
+            font-size: 16px;
             font-weight: bold;
-            padding-top: .15rem;
+            padding-top: 15px;
         }
         h3 {
-            font-size: .14rem;
+            font-size: 14px;
             font-weight: bold;
         }
         .signature {
-            display: flex;
-            padding-top: .5rem;
+            padding-top: 50px;
         }
         .signature .sign {
-            flex: 1;
             position: relative;
+            width: 49%;
+            display: inline-block;
         }
         .signature span {
             display: block;
         }
         .signature .cachet {
             position: absolute;
-            top: -.6rem;
+            top: -60px;
             left: 0;
-            width: 1.5rem;
-            height: 1.5rem;
+            width: 150px;
+            height: 150px;
         }
         .iInfo {
             display: flex;
@@ -83,21 +83,25 @@
         <div style="display: flex;">乙方:
             <div style="flex: 1 auto;">
                 <div class="iInfo">
-                    <span>家长姓名: ${studentInfo.parentsName!}</span>
+                    <span>家长姓名: ${studentInfo.realName!}</span>
                     <span>电话: ${studentInfo.phone!}</span>
                 </div>
                 <div class="iInfo">
                     <span>身份证号:${studentInfo.idCardNo!}</span>
                 </div>
                 <div class="iInfo">
-                    <span>学生姓名:${studentInfo.name!}</span>
+                    <span>学生姓名:${studentInfo.username!}</span>
                 </div>
+                <#if studentInfo.grade?default("")?trim?length gt 1>
                 <div class="iInfo">
                     <span>所在班级:${studentInfo.grade!} ${studentInfo.clazz!}</span>
                 </div>
+                </#if>
+                <#if studentInfo.subject.name?default("")?trim?length gt 1>
                 <div class="iInfo">
                     <span>所在声部:${studentInfo.subject.name!}</span>
                 </div>
+                </#if>
             </div>
         </div>                     
         
@@ -151,7 +155,7 @@
                 <span>日期:${.now?string("yyyy年MM月dd日")}</span>
             </div>
             </#if>
-            <div class="sign">乙方签字:${studentInfo.parentsName!}
+            <div class="sign">乙方签字:${studentInfo.realName!}
                 <span>日期:${.now?string("yyyy年MM月dd日")} </span>
             </div>
         	<#else>
@@ -164,7 +168,7 @@
                 <span>日期:${.now?string("yyyy年MM月dd日")}</span>
             </div>
             </#if>
-            <div class="sign">乙方签
+            <div class="sign">乙方签
                 <span>日期:${.now?string("yyyy年MM月dd日")} </span>
             </div>
             </#if>

binární
mec-biz/src/main/resources/config/fonts/simsun.ttc


+ 37 - 5
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -537,7 +537,22 @@
 
     <sql id="queryMusicGroupCourseScheduleSql">
         <where>
-            cg.del_flag_ = 0 AND (ta.teacher_id_ = cs.actual_teacher_id_ OR ta.id_ IS NULL) AND cg.group_type_ = 'MUSIC'
+            cg.group_type_ = 'MUSIC'
+            <if test="startTime != null">
+                AND cs.class_date_ &gt;= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND cs.class_date_ &lt;= #{endTime}
+            </if>
+            <if test="musicGroupId != null">
+                AND cg.music_group_id_ = #{musicGroupId}
+            </if>
+        </where>
+    </sql>
+
+    <sql id="queryMusicGroupCourseScheduleDetailSql">
+        <where>
+            (ta.teacher_id_ = cs.actual_teacher_id_ OR ta.id_ IS NULL) AND cg.group_type_ = 'MUSIC'
             <if test="classScheduleType != null">
                 AND cs.type_ = #{classScheduleType}
             </if>
@@ -575,23 +590,40 @@
     </resultMap>
     <select id="queryMusicGroupCourseSchedule" resultMap="MusicGroupCourseScheduleDto">
         SELECT cs.id_ course_schedule_id_,cs.class_date_,cs.start_class_time_,cs.end_class_time_,cs.class_group_id_,
+        cs.type_ course_schedule_type_,cg.name_ course_schedule_name_
+        FROM course_schedule cs
+        LEFT JOIN class_group cg ON cg.id_ = cs.class_group_id_
+        <include refid="queryMusicGroupCourseScheduleSql"/>
+        ORDER BY cs.class_date_ ,cs.start_class_time_ ,cg.name_
+        <include refid="global.limit"/>
+    </select>
+
+    <select id="countMusicGroupCourseSchedule" resultType="java.lang.Integer">
+        SELECT COUNT(cs.id_)
+        FROM course_schedule cs
+        LEFT JOIN class_group cg ON cg.id_ = cs.class_group_id_
+        <include refid="queryMusicGroupCourseScheduleSql"/>
+    </select>
+
+    <select id="queryMusicGroupCourseScheduleDetail" resultMap="MusicGroupCourseScheduleDto">
+        SELECT cs.id_ course_schedule_id_,cs.class_date_,cs.start_class_time_,cs.end_class_time_,cs.class_group_id_,
         cs.type_ course_schedule_type_,cs.status_ course_schedule_status_,cg.name_ course_schedule_name_,
         IF(ta.sign_in_status_ IS NULL,3,ta.sign_in_status_) sign_in_status_,
         IF(ta.sign_out_status_ IS NULL,3,ta.sign_out_status_) sign_out_status_
         FROM course_schedule cs
         LEFT JOIN class_group cg ON cg.id_ = cs.class_group_id_
         LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
-        <include refid="queryMusicGroupCourseScheduleSql"/>
+        <include refid="queryMusicGroupCourseScheduleDetailSql"/>
         ORDER BY cs.class_date_ ,cs.start_class_time_ ,cg.name_
         <include refid="global.limit"/>
     </select>
 
-    <select id="countMusicGroupCourseSchedule" resultType="java.lang.Integer">
+    <select id="countMusicGroupCourseScheduleDetail" resultType="java.lang.Integer">
         SELECT COUNT(cs.id_)
         FROM course_schedule cs
         LEFT JOIN class_group cg ON cg.id_ = cs.class_group_id_
         LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
-        <include refid="queryMusicGroupCourseScheduleSql"/>
+        <include refid="queryMusicGroupCourseScheduleDetailSql"/>
     </select>
 
     <select id="findNameById" resultType="java.util.Map">
@@ -793,7 +825,7 @@
     </update>
 
     <select id="findClassGroupByType" resultMap="ClassGroupTeachers">
-        SELECT * FROM class_group WHERE music_group_id_=#{musicGroupId}
+        SELECT * FROM class_group WHERE music_group_id_=#{musicGroupId} AND group_type_ = 'MUSIC'
         <if test="type !=null ">
             AND type_=#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         </if>

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

@@ -1695,7 +1695,7 @@
         <if test="classDate != null">
             AND cs.class_date_ = DATE_FORMAT(#{classDate}, '%Y%m%d')
         </if>
-        AND cs.status_ != 'NOT_START'
+        AND cs.status_ = 'NOT_START'
         GROUP BY cs.class_group_id_
     </select>
 

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

@@ -239,6 +239,7 @@
 		<result column="user_id_" property="userId" />
 		<result column="head_url_" property="headUrl" />
 		<result column="gender_" property="gender"/>
+		<result column="music_group_id_" property="musicGroupId"/>
 	</resultMap>
 
 	<select id="findTeachersByStuId" resultMap="BasicUserDto">
@@ -395,4 +396,11 @@
 		</foreach>
 		AND mg.id_ IS NOT NULL LIMIT 1
 	</select>
+	<select id="queryMusicGroupNameMap" resultType="java.util.Map">
+		SELECT id_ 'key',name_ 'value' FROM music_group WHERE id_ IN
+		<foreach collection="musicGroupIds" open="(" close=")" item="item" separator=",">
+			#{item}
+		</foreach>
+		AND name_ IS NOT NULL
+	</select>
 </mapper>

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

@@ -121,7 +121,8 @@
     </update>
 
     <select id="findStudentsByOrganId" resultMap="studentManageListDto">
-        SELECT su.id_ user_id_,su.username_,su.gender_,su.phone_ parents_phone_,su.real_name_,su.birthdate_,su.nation_, case when su.password_ is null then 0 else 1 end isActive_
+        SELECT su.id_ user_id_,su.username_,su.gender_,su.phone_ parents_phone_,su.real_name_,su.birthdate_,su.nation_,
+        CASE WHEN su.password_ IS NULL THEN 0 ELSE 1 END isActive_
         FROM sys_user su
         <include refid="findStudentsByOrganIdSql"/>
         ORDER BY su.create_time_ DESC
@@ -137,10 +138,16 @@
                 AND (su.phone_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.id_ LIKE CONCAT('%',#{search},'%'))
             </if>
             <if test="isActive != null and isActive == true">
-            	and su.password_ is not null
+                AND su.password_ is not null
             </if>
             <if test="isActive != null and isActive == false">
-            	and su.password_ is null
+                AND su.password_ is null
+            </if>
+            <if test="userIds != null">
+                AND su.id_ IN
+                <foreach collection="userIds" open="(" close=")" separator="," item="item">
+                    #{item}
+                </foreach>
             </if>
         </where>
     </sql>
@@ -149,7 +156,8 @@
         SELECT COUNT(DISTINCT su.id_)
         FROM sys_user su
         LEFT JOIN student_registration sr ON su.id_ = sr.user_id_
-        <include refid="findStudentsByOrganIdSql"/>
+        WHERE su.user_type_ = 'STUDENT'
+        <include refid="queryHasCourseSql"/>
     </select>
     <select id="findStudentBaseInfoByUserID" resultMap="studentManageListDto">
         SELECT su.username_,su.gender_,su.birthdate_,su.real_name_,su.id_ user_id_,
@@ -375,6 +383,12 @@
             <if test="musicGroupId != null and musicGroupId != ''">
                 AND sr.music_group_id_ = #{musicGroupId}
             </if>
+            <if test="isActive != null and isActive == true">
+                and su.password_ is not null
+            </if>
+            <if test="isActive != null and isActive == false">
+                and su.password_ is null
+            </if>
         </where>
     </sql>
     <resultMap id="MusicGroupStudentsDto" type="com.ym.mec.biz.dal.dto.MusicGroupStudentsDto">
@@ -391,11 +405,12 @@
         <result property="isNewStudent" column="is_new_student_"/>
         <result property="courseFee" column="course_fee_"/>
         <result property="nextPaymentDate" column="next_payment_date_"/>
+        <result property="isActive" column="isActive_"/>
     </resultMap>
     <select id="queryMusicGroupStudent" resultMap="MusicGroupStudentsDto">
-        SELECT sr.user_id_,su.username_ real_name_,su.gender_,sr.parents_phone_,sr.current_grade_,
+        SELECT sr.user_id_,su.username_ real_name_,su.gender_,su.phone_ parents_phone_,sr.current_grade_,
         sr.current_class_,sr.music_group_status_,mgsf.next_payment_date_,mgsf.course_fee_,
-        s.name_ subject_name_,sr.music_group_id_,
+        s.name_ subject_name_,sr.music_group_id_,case when su.password_ is null then 0 else 1 end isActive_,
         IF(DATE_FORMAT(sr.create_time_,'%Y-%m-%d') > DATE_FORMAT(mg.payment_expire_date_,'%Y-%m-%d'),1,0) is_new_student_
         FROM student_registration sr
         LEFT JOIN sys_user su ON sr.user_id_ = su.id_
@@ -521,5 +536,116 @@
             AND vg.status_ = #{vipGroupStatus}
         </if>
     </select>
+    <sql id="queryHasCourseSql">
+        <if test="organId != null">
+            AND FIND_IN_SET(su.organ_id_,#{organId})
+        </if>
+        <if test="search != null and search != ''">
+            AND (su.phone_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.id_ LIKE CONCAT('%',#{search},'%'))
+        </if>
+        <if test="isActive != null and isActive == true">
+            and su.password_ is not null
+        </if>
+        <if test="isActive != null and isActive == false">
+            and su.password_ is null
+        </if>
+    </sql>
+    <select id="queryHasCourse" resultType="java.lang.Integer">
+        SELECT su.id_ FROM sys_user su
+        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = su.id_
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        WHERE su.user_type_ = 'STUDENT' AND cs.status_ != 'OVER'
+        <include refid="queryHasCourseSql"/>
+        GROUP BY su.id_
+        ORDER BY su.create_time_ DESC
+        <include refid="global.limit"/>
+    </select>
+    <select id="countHasCourse" resultType="java.lang.Integer">
+        SELECT COUNT(DISTINCT su.id_) FROM sys_user su
+        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = su.id_
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        WHERE su.user_type_ = 'STUDENT' AND cs.status_ != 'OVER'
+        <include refid="queryHasCourseSql"/>
+    </select>
+    <select id="queryNotCourse" resultType="java.lang.Integer">
+        SELECT su.id_ FROM sys_user su
+        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = su.id_
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND cs.status_ != 'OVER'
+        <include refid="queryNotCourseSql"/>
+        GROUP BY su.id_
+        HAVING COUNT(cs.id_) = 0
+        ORDER BY su.create_time_ DESC
+        <include refid="global.limit"/>
+    </select>
+    <select id="countNotCourse" resultType="java.lang.Integer">
+        SELECT COUNT(e.id_) FROM (SELECT su.id_ FROM sys_user su
+        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = su.id_
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND cs.status_ != 'OVER'
+        <include refid="queryNotCourseSql"/>
+        GROUP BY su.id_
+        HAVING COUNT(cs.id_) = 0)e
+    </select>
+    <sql id="queryNotCourseSql">
+        <where>
+            su.user_type_ = 'STUDENT'
+            <if test="organId != null">
+                AND FIND_IN_SET(su.organ_id_,#{organId})
+            </if>
+            <if test="search != null and search != ''">
+                AND (su.phone_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.id_ LIKE CONCAT('%',#{search},'%'))
+            </if>
+            <if test="isActive != null and isActive == true">
+                and su.password_ is not null
+            </if>
+            <if test="isActive != null and isActive == false">
+                and su.password_ is null
+            </if>
+        </where>
+    </sql>
+    <select id="queryStudentHasCourse" resultType="java.util.Map">
+        SELECT cssp.user_id_ 'key',CASE WHEN COUNT(cssp.id_ AND cs.status_ != 'OVER') = 0 THEN 0 ELSE 1 END 'value'
+        FROM course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        <where>
+            <if test="userIds != null">
+                cssp.user_id_ IN
+                <foreach collection="userIds" open="(" close=")" separator="," item="item">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+        GROUP BY cssp.user_id_
+    </select>
+    <resultMap id="StudentHasCourseDtoMap" type="com.ym.mec.biz.dal.dto.StudentHasCourseDto">
+        <result property="userName" column="username_"/>
+        <result property="musicGroupName" column="music_group_name_"/>
+        <result property="vipGroupName" column="vip_group_name_"/>
+        <result property="organName" column="organ_name_"/>
+        <result property="subjectName" column="music_group_subject_"/>
+        <result property="userId" column="id_"/>
+    </resultMap>
+    <select id="queryHasCourseStudent" resultMap="StudentHasCourseDtoMap">
+        SELECT su.id_,GROUP_CONCAT(DISTINCT su.username_) username_,GROUP_CONCAT(DISTINCT mg.name_) music_group_name_,
+        GROUP_CONCAT(DISTINCT vg.name_) vip_group_name_,GROUP_CONCAT(DISTINCT o.name_) organ_name_,GROUP_CONCAT(DISTINCT s.name_) music_group_subject_
+        FROM sys_user su
+        LEFT JOIN course_schedule_student_payment cssp ON su.id_ = cssp.user_id_
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        LEFT JOIN music_group mg ON cssp.music_group_id_ = mg.id_ AND cssp.group_type_ = 'MUSIC'
+        LEFT JOIN vip_group vg ON cssp.music_group_id_ = vg.id_ AND cssp.group_type_ = 'VIP'
+        LEFT JOIN organization o ON su.organ_id_ = o.id_
+        LEFT JOIN student_registration sr ON su.id_ = sr.user_id_ AND cssp.music_group_id_ = sr.music_group_id_
+        LEFT JOIN `subject` s ON s.id_ = sr.actual_subject_id_
+        WHERE cs.status_ != 'OVER' AND su.password_ IS NULL AND su.user_type_ = 'STUDENT'
+        <if test="organId != null and organId != ''">
+            AND FIND_IN_SET(su.organ_id_,#{organId})
+        </if>
+        GROUP BY su.id_
+    </select>
+    <select id="getHasCourse" resultType="java.lang.Long">
+        SELECT COUNT(DISTINCT su.id_) FROM sys_user su
+        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = su.id_
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        WHERE cs.status_ != 'OVER' AND su.id_ = #{userId}
+    </select>
 
 </mapper>

+ 40 - 0
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderDetailMapper.xml

@@ -112,4 +112,44 @@
         AND spo.status_=#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         AND spo.type_ = 'APPLY'
     </select>
+    <resultMap id="musicalListDetailDtoMap" type="com.ym.mec.biz.dal.dto.musicalListDetailDto">
+        <result property="paymentOrderId" column="payment_order_id_"/>
+        <result property="username" column="username_"/>
+        <result property="userId" column="user_id_"/>
+        <result property="musicGroupName" column="muaic_group_name_"/>
+        <result property="accessoriesAmount" column="accessories_amount_"/>
+        <result property="courseAmount" column="course_amount_"/>
+        <result property="kitGroupPurchaseTypeEnum" column="kit_group_purchase_type_"/>
+        <result property="musicalAmount" column="musical_amount_"/>
+        <result property="orderAmount" column="order_amount_"/>
+        <result property="organName" column="organ_name_"/>
+        <result property="goodsNames" column="goods_names_"/>
+    </resultMap>
+    <select id="getMusicalListDetail" resultMap="musicalListDetailDtoMap">
+        SELECT MAX(spo.id_) payment_order_id_,spo.user_id_  FROM student_payment_order spo
+        WHERE spo.music_group_id_ = #{musicGroupId}
+        GROUP BY spo.user_id_
+    </select>
+    <select id="queryGoodsNames" resultType="java.util.Map">
+        SELECT spod.payment_order_id_ 'key',GROUP_CONCAT(g.name_) 'value'
+        FROM student_payment_order_detail spod
+        LEFT JOIN goods g ON FIND_IN_SET(g.id_,spod.goods_id_list_)
+        WHERE spod.payment_order_id_ IN
+        <foreach collection="paymentOrderNo" open="(" close=")" separator="," item="item">
+            #{item}
+        </foreach>
+        GROUP BY spod.payment_order_id_
+    </select>
+    <select id="queryGoodsPrice" resultType="java.util.Map">
+        SELECT spod.payment_order_id_ 'key' ,SUM(price_) 'value' FROM student_payment_order_detail spod
+        WHERE spod.type_ = #{type} AND spod.payment_order_id_ IN
+        <foreach collection="paymentOrderNo" open="(" close=")" separator="," item="item">
+            #{item}
+        </foreach>
+        GROUP BY spod.payment_order_id_
+    </select>
+
+    <select id="findApplyOrderMusical" resultMap="StudentPaymentOrderDetail">
+        SELECT * FROM student_payment_order_detail WHERE payment_order_id_ = #{orderId} AND type_ = 'MUSICAL' LIMIT 1
+    </select>
 </mapper>

+ 28 - 3
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -13,6 +13,8 @@
         <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="expect_amount_" property="expectAmount"/>
         <result column="actual_amount_" property="actualAmount"/>
+        <result column="com_amount_" property="comAmount"/>
+        <result column="per_amount_" property="perAmount"/>
         <result column="balance_payment_amount_" property="balancePaymentAmount"/>
         <result column="trans_no_" property="transNo"/>
         <result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
@@ -22,6 +24,7 @@
         <result column="payment_channel_" property="paymentChannel"/>
         <result column="payment_business_channel_" property="paymentBusinessChannel"/>
         <result column="payment_account_no_" property="paymentAccountNo"/>
+        <result column="mer_nos_" property="merNos"/>
         <result column="order_no_" property="orderNo"/>
         <result column="music_group_id_" property="musicGroupId"/>
         <result column="class_group_id_" property="classGroupId"/>
@@ -75,12 +78,12 @@
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentPaymentOrder" useGeneratedKeys="true"
             keyColumn="id" keyProperty="id">
         INSERT INTO student_payment_order
-        (id_,group_type_,user_id_,type_,expect_amount_,actual_amount_,balance_payment_amount_,trans_no_,
+        (id_,group_type_,user_id_,type_,expect_amount_,actual_amount_,com_amount_,per_amount_,balance_payment_amount_,trans_no_,
         status_,memo_,create_time_,update_time_,payment_channel_,payment_business_channel_,
         payment_account_no_,order_no_,music_group_id_,class_group_id_)
         VALUES(#{id},#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
         #{userId},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-        #{expectAmount},#{actualAmount},#{balancePaymentAmount},#{transNo},
+        #{expectAmount},#{actualAmount},#{comAmount},#{perAmount},#{balancePaymentAmount},#{transNo},
         #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{memo},now(),now(),
         #{paymentChannel},#{paymentBusinessChannel},#{paymentAccountNo},#{orderNo},#{musicGroupId},#{classGroupId})
     </insert>
@@ -116,6 +119,9 @@
             <if test="paymentAccountNo != null">
                 payment_account_no_ = #{paymentAccountNo},
             </if>
+            <if test="merNos != null">
+                mer_nos_ = #{merNos},
+            </if>
             <if test="updateTime != null">
                 update_time_ = NOW(),
             </if>
@@ -128,6 +134,12 @@
             <if test="actualAmount != null">
                 actual_amount_ = #{actualAmount},
             </if>
+            <if test="comAmount != null">
+                com_amount_ = #{comAmount},
+            </if>
+            <if test="perAmount != null">
+                per_amount_ = #{perAmount},
+            </if>
             <if test="balancePaymentAmount != null">
                 balance_payment_amount_ = #{balancePaymentAmount},
             </if>
@@ -280,7 +292,7 @@
     <select id="findOrdersByStatus" resultMap="StudentPaymentOrder">
         SELECT * FROM student_payment_order
         WHERE status_=#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} AND payment_channel_ =
-        #{paymentChannel}
+        #{paymentChannel} LIMIT 100
     </select>
 
     <!-- 查询支付中超时订单 -->
@@ -332,5 +344,18 @@
             AND status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         </if>
     </select>
+    <select id="queryActualAmount" resultType="java.util.Map">
+        SELECT spo.actual_amount_ 'value',spo.id_ 'key'
+        FROM student_payment_order spo
+        WHERE spo.id_ IN
+        <foreach collection="paymentOrderNo" open="(" close=")" separator="," item="item">
+            #{item}
+        </foreach>
+    </select>
 
+    <select id="findFixOrder" resultMap="StudentPaymentOrder">
+        SELECT * FROM student_payment_order
+        WHERE status_=#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler} AND payment_channel_ =
+        #{paymentChannel} AND com_amount_ IS NULL LIMIT 100
+    </select>
 </mapper>

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

@@ -57,6 +57,7 @@
         <result column="email_" property="email"/>
         <result column="im_token_" property="imToken"/>
         <result column="id_card_no_" property="idCardNo"/>
+        <result column="real_name_" property="realName"/>
         <result column="wechat_id_" property="wechatId"/>
         <result column="name_" property="name"/>
         <result column="parents_name_" property="parentsName"/>
@@ -267,7 +268,7 @@
     <select id="queryStudentDetailPage" resultMap="studentApplyDetail">
         SELECT sr.id_, sr.user_id_,su.username_ username_,sr.parents_name_,sr.current_class_,sr.current_grade_,
         su.gender_,sr.is_allow_adjust_, s.name_ subject_name_,ss.name_
-        actual_subject_name_,sr.parents_phone_,sr.payment_status_,sr.remark_,sr.actual_subject_id_
+        actual_subject_name_,su.phone_ parents_phone_,sr.payment_status_,sr.remark_,sr.actual_subject_id_
         FROM student_registration sr
         LEFT JOIN sys_user su ON sr.user_id_ = su.id_
         LEFT JOIN `subject` s ON sr.subject_id_ = s.id_
@@ -543,6 +544,34 @@
         WHERE sr.parents_phone_ = #{mobile}
         LIMIT 1
     </select>
+    <select id="queryPurchaseTypeMap" resultType="java.util.Map">
+        SELECT sr.user_id_ 'key',mgsp.kit_group_purchase_type_ 'value' FROM student_registration sr
+        LEFT JOIN music_group_subject_plan mgsp ON sr.actual_subject_id_ = mgsp.subject_id_ AND sr.music_group_id_ = mgsp.music_group_id_
+        WHERE sr.music_group_id_ = #{musicGroupId}
+    </select>
+    <resultMap id="StudentRegisterPerDtoMap" type="com.ym.mec.biz.dal.dto.StudentRegisterPerDto">
+        <result property="organName" column="organ_name_"/>
+        <result property="studentNum" column="student_num_"/>
+        <result property="per" column="per_"/>
+        <result property="perNum" column="per_num_"/>
+    </resultMap>
+    <select id="queryStudentPer" resultMap="StudentRegisterPerDtoMap">
+        SELECT a.name_ organ_name_,a.num student_num_,b.num per_num_,ifnull(b.num,0)*100/a.num per_ FROM (
+        SELECT b.name_,COUNT(a.id_) num,b.id_ FROM sys_user a LEFT JOIN organization b on a.organ_id_=b.id_
+        WHERE a.id_ IN(
+        SELECT b.id_ FROM course_schedule_student_payment a LEFT JOIN sys_user b ON a.user_id_=b.id_ WHERE b.user_type_='STUDENT' GROUP BY a.user_id_,b.organ_id_ )
+        AND b.del_flag_ = 0
+        GROUP BY organ_id_) a
+        LEFT JOIN
+        (SELECT b.name_,COUNT(a.id_) num,b.id_ FROM sys_user a LEFT JOIN organization b on a.organ_id_=b.id_
+        WHERE a.id_ IN(
+        SELECT b.id_ FROM course_schedule_student_payment a LEFT JOIN sys_user b ON a.user_id_=b.id_ WHERE b.user_type_='STUDENT' AND password_ IS NOT NULL GROUP BY a.user_id_,b.organ_id_ )
+        AND b.del_flag_ = 0
+        GROUP BY organ_id_) b
+        ON a.id_=b.id_
+        WHERE a.name_ IS NOT NULL
+        ORDER BY per_ DESC
+    </select>
 
     <update id="updateUser">
         UPDATE sys_user SET real_name_ = #{realName},id_card_no_=#{idCardNo} WHERE id_=#{id}

+ 25 - 8
mec-biz/src/main/resources/config/mybatis/SysAccountMapper.xml

@@ -11,6 +11,7 @@
         <result column="has_receipt_" jdbcType="DECIMAL" property="hasReceipt"/>
         <result column="channel_" jdbcType="VARCHAR" property="channel"/>
         <result column="type_" jdbcType="CHAR" property="type"/>
+        <result column="status_" jdbcType="TINYINT" property="status"/>
         <result column="version" jdbcType="INTEGER" property="version"/>
     </resultMap>
     <sql id="Base_Column_List">
@@ -22,6 +23,7 @@
             has_receipt_,
             channel_,
             type_,
+            status_,
             version
     </sql>
     <select id="get" parameterType="java.lang.Integer" resultMap="SysAccount">
@@ -62,6 +64,9 @@
             <if test="type != null">
                 type_,
             </if>
+            <if test="status != null">
+                status_,
+            </if>
             <if test="version != null">
                 version,
             </if>
@@ -88,6 +93,9 @@
             <if test="type != null">
                 #{type,jdbcType=CHAR},
             </if>
+            <if test="status != null">
+                #{status,jdbcType=TINYINT},
+            </if>
             <if test="version != null">
                 #{version,jdbcType=INTEGER},
             </if>
@@ -118,22 +126,31 @@
             <if test="type != null">
                 type_ = #{type,jdbcType=CHAR},
             </if>
+            <if test="status != null">
+                status_ = #{status,jdbcType=TINYINT},
+            </if>
             <if test="version != null">
                 version = version+1,
             </if>
         </set>
         where id_ = #{id,jdbcType=INTEGER} AND version =#{version}
     </update>
-    <!-- 获取一个私户账户 -->
-    <select id="getPerAccount" resultMap="SysAccount">
-        SELECT *
-        FROM sys_account
-        WHERE channel_ = 'YQPAY'
-          AND type_ = 'PER'
-    </select>
 
     <select id="getAccount" resultMap="SysAccount">
-        SELECT * FROM sys_account WHERE company_=#{company}
+        SELECT * FROM sys_account WHERE status_=1 AND company_=#{company}
+        <if test="channel != null">
+            AND channel_ = #{channel}
+        </if>
+        <if test="type != null">
+            AND FIND_IN_SET(type_,#{type})
+        </if>
+        <if test="amount != null">
+            <![CDATA[AND max_receipt_ < has_receipt_+ #{amount}]]>
+        </if>
+    </select>
+
+    <select id="getOneAccount" resultMap="SysAccount">
+        SELECT * FROM sys_account WHERE status_ =1 AND company_=#{company}
         <if test="channel != null">
             AND channel_ = #{channel}
         </if>

+ 12 - 0
mec-biz/src/main/resources/config/mybatis/SysUserCashAccountDetailMapper.xml

@@ -14,6 +14,8 @@
         <result column="trans_type_" property="transType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="amount_" property="amount"/>
+        <result column="com_amount_" property="comAmount"/>
+        <result column="per_amount_" property="perAmount"/>
         <result column="balance_" property="balance"/>
         <result column="description_" property="description"/>
         <result column="comment_" property="comment"/>
@@ -48,6 +50,8 @@
             <if test="transType!=null">trans_type_,</if>
             <if test="status!=null">status_,</if>
             <if test="amount!=null">amount_,</if>
+            <if test="comAmount!=null">com_amount_,</if>
+            <if test="perAmount!=null">per_amount_,</if>
             <if test="balance!=null">balance_,</if>
             <if test="description!=null">description_,</if>
             <if test="comment!=null">comment_,</if>
@@ -66,6 +70,8 @@
             <if test="transType!=null">#{transType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},</if>
             <if test="status!=null">#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},</if>
             <if test="amount!=null">#{amount},</if>
+            <if test="comAmount!=null">#{comAmount},</if>
+            <if test="perAmount!=null">#{perAmount},</if>
             <if test="balance!=null">#{balance},</if>
             <if test="description!=null">#{description},</if>
             <if test="comment!=null">#{comment},</if>
@@ -109,6 +115,12 @@
             <if test="amount != null">
                 amount_ = #{amount},
             </if>
+            <if test="comAmount != null">
+                com_amount_ = #{comAmount},
+            </if>
+            <if test="perAmount != null">
+                per_amount_ = #{perAmount},
+            </if>
             <if test="description != null">
                 description_ = #{description},
             </if>

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

@@ -250,7 +250,7 @@
         SELECT * FROM teacher WHERE certificate_num_ = #{certificateNum} LIMIT 1
     </select>
     <select id="queryGroupStudents" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.BasicUserDto">
-        SELECT su.username_,su.id_ user_id_,su.avatar_ head_url_,su.gender_,s.name_ subject_name_
+        SELECT su.username_,su.id_ user_id_,su.avatar_ head_url_,su.gender_,s.name_ subject_name_,sr.music_group_id_
         FROM class_group_teacher_mapper cgtm
         LEFT JOIN class_group_student_mapper cgsm ON cgtm.class_group_id_ = cgsm.class_group_id_
         LEFT JOIN sys_user su ON cgsm.user_id_ = su.id_
@@ -260,7 +260,7 @@
         <if test="search != null">
             AND su.username_ LIKE CONCAT('%',#{search},'%')
         </if>
-        GROUP BY su.id_,s.id_
+        GROUP BY su.id_,s.id_,sr.id_
     </select>
     <select id="queryNameByIds" resultType="java.util.Map" parameterType="list">
         select id_ `key`,IF(real_name_ IS NUll,'',real_name_) `value` FROM sys_user s WHERE FIND_IN_SET(id_,#{userIds})
@@ -568,4 +568,11 @@
             AND FIND_IN_SET(t.organ_id_,#{organId})
         </if>
     </select>
+    <select id="queryUsernameByIds" resultType="java.util.Map" parameterType="list">
+        select id_ `key`,username_ `value` FROM sys_user s
+        WHERE s.id_ IN
+        <foreach collection="userIds" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+    </select>
 </mapper>

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

@@ -307,15 +307,13 @@
             AND vg.courses_expire_date_ &gt;= DATE_FORMAT(NOW(),'%Y%m%d')
             AND vg.courses_start_date &gt; NOW()
             AND (select count(1) as num from student_payment_order where vg.id_ = music_group_id_ AND user_id_=#{userId} AND status_='SUCCESS') = 0
+            AND vg.organ_id_ = #{organId}
             <if test="subjectId!=null">
                AND FIND_IN_SET(#{subjectId},cg.subject_id_list_)
             </if>
             <if test="categoryId!=null">
                 AND FIND_IN_SET(vg.vip_group_category_id_,#{categoryId})
             </if>
-            <if test="organId != null">
-                AND vg.organ_id_ = #{organId}
-            </if>
             <if test="classType!=null and classType.toString()=='0'.toString()">
                 AND vg.offline_classes_num_>0
             </if>

+ 5 - 2
mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java

@@ -2,15 +2,16 @@ package com.ym.mec.common.controller;
 
 import javax.servlet.http.HttpServletRequest;
 
-import com.ym.mec.common.exception.BizException;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpStatus;
+import org.springframework.security.access.AccessDeniedException;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
 
 @ControllerAdvice
 public class BaseController {
@@ -69,8 +70,10 @@ public class BaseController {
 		}
 		logger.error("System Error", e);
 //		return failed(e.getMessage());
-		if(ex instanceof BizException){
+		if(e instanceof BizException){
 			return failed(e.getMessage());
+		}else if(e instanceof AccessDeniedException){
+			return failed("禁止访问");
 		}
 		return failed("系统繁忙");
 	}

+ 5 - 2
mec-common/common-core/src/main/java/com/ym/mec/common/redis/config/RedisConfig.java

@@ -43,8 +43,11 @@ public class RedisConfig {
 	@Bean
 	public RedisTemplate<String, Serializable> redisTemplate(JedisConnectionFactory connectionFactory) {
 		RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
-		redisTemplate.setKeySerializer(new StringRedisSerializer());
-		redisTemplate.setHashKeySerializer(new StringRedisSerializer());
+
+		StringRedisSerializer stringSerializer = new StringRedisSerializer();
+
+		redisTemplate.setKeySerializer(stringSerializer);
+		redisTemplate.setHashKeySerializer(stringSerializer);
 		redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
 		redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
 		redisTemplate.setConnectionFactory(jedisConnectionFactory());

+ 2 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/service/impl/RedisIdGeneratorService.java

@@ -1,6 +1,7 @@
 package com.ym.mec.common.service.impl;
 
 import com.google.common.base.Strings;
+import com.timevale.tgtext.text.au;
 import com.ym.mec.common.redis.service.RedisCache;
 import com.ym.mec.common.service.IdGeneratorService;
 
@@ -97,6 +98,7 @@ public class RedisIdGeneratorService implements IdGeneratorService {
 		}
 		String key = "verificationCodeSMS_VERIFY_CODE_LOGIN" + mobile;
 		Object object = redisCache.get(key);
+		log.info("*********************mobile:{} smsCode:{} inutCode:{}******************", key, object, authCode);
 		String verifyCode = object == null ? null : object.toString();
 		if(StringUtils.isNoneEmpty(verifyCode) && StringUtils.equalsIgnoreCase(verifyCode,authCode)){
 			return true;

+ 1 - 2
mec-education/src/main/java/com/ym/mec/education/controller/SmsCodeController.java

@@ -101,9 +101,8 @@ public class SmsCodeController extends BaseController {
         KaptchaServlet kaptchaServlet = new KaptchaServlet();
         kaptchaServlet.init();
         ServletOutputStream out = response.getOutputStream();
-        // write the data out
-        ImageIO.write(bi, "jpg", out);
         try {
+            ImageIO.write(bi, "jpg", out);
             out.flush();
         } finally {
             out.close();

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

@@ -25,7 +25,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 	@Override
 	public void configure(HttpSecurity http) throws Exception {
 		http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
-				.authorizeRequests().antMatchers("/v2/api-docs","/code/*","/register/*","/studentOrder/*","/musicGroup/getSubjectGoodsAndInfo","/musicGroup/getMusicGroupStatus","/musicGroup/getOrderStatus","/musicGroup/pay","/musicGroup/rePay").permitAll().anyRequest().authenticated().and().httpBasic();
+				.authorizeRequests().antMatchers("/v2/api-docs","/code/*","/register/*","/studentOrder/*","/musicGroup/getSubjectGoodsAndInfo","/musicGroup/getMusicGroupStatus","/musicGroup/getOrderStatus","/musicGroup/pay","/musicGroup/rePay","/studentManage/queryStudentPer").permitAll().anyRequest().authenticated().and().httpBasic();
 	}
 
 	@Override

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

@@ -2,10 +2,8 @@ package com.ym.mec.student.controller;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.auth.api.enums.SysUserType;
 import com.ym.mec.biz.dal.dao.MusicGroupStudentFeeDao;
 import com.ym.mec.biz.dal.dto.RegisterPayDto;
-import com.ym.mec.biz.dal.dto.SporadicPayDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
@@ -23,7 +21,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
-
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.HashMap;

+ 3 - 2
mec-student/src/main/java/com/ym/mec/student/controller/SmsCodeController.java

@@ -5,6 +5,7 @@ import com.google.code.kaptcha.Producer;
 import com.google.code.kaptcha.servlet.KaptchaServlet;
 import com.ym.mec.biz.service.SmsCodeService;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.security.SecurityConstants;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -80,7 +81,7 @@ public class SmsCodeController extends BaseController {
     @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String")
     public void getKaptchaImage(HttpServletResponse response,String phone) throws Exception {
         if(StringUtils.isEmpty(phone)){
-            return;
+            throw new BizException("请输入手机号");
         }
         response.setDateHeader("Expires", 0);
 
@@ -102,8 +103,8 @@ public class SmsCodeController extends BaseController {
         kaptchaServlet.init();
         ServletOutputStream out = response.getOutputStream();
         // write the data out
-        ImageIO.write(bi, "jpg", out);
         try {
+            ImageIO.write(bi, "jpg", out);
             out.flush();
         } finally {
             out.close();

+ 9 - 0
mec-student/src/main/java/com/ym/mec/student/controller/StudentManageController.java

@@ -154,4 +154,13 @@ public class StudentManageController extends BaseController {
         }
         return failed("获取用户失败");
     }
+
+    /**
+     * 学员注册激活比例列表
+     * @return
+     */
+    @GetMapping(value = "studentManage/queryStudentPer")
+    public Object queryStudentPer() {
+        return succeed(studentManageService.queryStudentPer());
+    }
 }

+ 66 - 138
mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java

@@ -3,6 +3,7 @@ package com.ym.mec.student.controller;
 import com.alibaba.fastjson.JSON;
 import com.huifu.adapay.model.payment.PayChannelEnum;
 import com.huifu.adapay.model.payment.Payment;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
 import com.ym.mec.biz.dal.dto.VipBuyResultDto;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.MusicGroup;
@@ -50,11 +51,11 @@ public class StudentOrderController extends BaseController {
     @Autowired
     private MusicGroupService musicGroupService;
     @Autowired
-    private SporadicChargeInfoService sporadicChargeInfoService;
+    private StudentPaymentOrderDetailService studentPaymentOrderDetailService;
     @Autowired
-    private YqPayFeignService yqQueryService;
+    private YqPayFeignService yqPayFeignService;
     @Autowired
-    private StudentPaymentOrderDetailService studentPaymentOrderDetailService;
+    private StudentPaymentOrderDao studentPaymentOrderDao;
 
     @PostMapping("/notify")
     public Msg notify(@ModelAttribute Msg msg) throws Exception {
@@ -79,7 +80,7 @@ public class StudentOrderController extends BaseController {
             notifyMap.put("totalMoney", notifyMap.get("payAmount"));
             notifyMap.put("merOrderNo", notifyMap.get("merMerOrderNo"));
             notifyMap.put("channelType", channelType);
-            updateOrder(notifyMap);
+            studentPaymentOrderService.updateOrder(notifyMap);
             msg.setCode("000000");
             msg.setMsg("success");
         }
@@ -98,16 +99,16 @@ public class StudentOrderController extends BaseController {
             return failed("未找到指定订单");
         }
         HashMap<String, Object> orderDetail = new HashMap<>();
-        orderDetail.put("order",orderByOrderNo);
-        orderDetail.put("groupType",orderByOrderNo.getGroupType());
-        if(orderByOrderNo.getGroupType().equals(GroupType.MUSIC)){
+        orderDetail.put("order", orderByOrderNo);
+        orderDetail.put("groupType", orderByOrderNo.getGroupType());
+        if (orderByOrderNo.getGroupType().equals(GroupType.MUSIC)) {
             MusicGroup musicGroup = musicGroupService.get(orderByOrderNo.getMusicGroupId());
             List<Goods> goodsList = studentPaymentOrderDetailService.findApplyOrderGoods(orderByOrderNo.getId());
-            orderDetail.put("goods",goodsList);
-            orderDetail.put("course",musicGroup.getCourseForm());
-        }else if(orderByOrderNo.getGroupType().equals(GroupType.VIP)){
+            orderDetail.put("goods", goodsList);
+            orderDetail.put("course", musicGroup.getCourseForm());
+        } else if (orderByOrderNo.getGroupType().equals(GroupType.VIP)) {
             VipBuyResultDto vipBuyResultInfo = vipGroupService.findVipBuyResultInfo(Integer.valueOf(orderByOrderNo.getMusicGroupId()));
-            orderDetail.put("detail",vipBuyResultInfo);
+            orderDetail.put("detail", vipBuyResultInfo);
         }
 
         return succeed(orderDetail);
@@ -154,129 +155,6 @@ public class StudentOrderController extends BaseController {
         return succeed(payment);
     }
 
-
-    //@Scheduled(cron = "0 */1 * * * ?")
-    public void getOrderStatus() throws Exception {
-        List<StudentPaymentOrder> payingOrders = studentPaymentOrderService.findOrdersByStatus(DealStatusEnum.ING, "YQPAY");
-
-        if(payingOrders.size() ==0){
-            return;
-        }
-        List<String> orderNoList = payingOrders.stream().map(StudentPaymentOrder::getOrderNo).collect(Collectors.toList());
-        String merOrderNos = payingOrders.stream().map(StudentPaymentOrder::getOrderNo).collect(Collectors.joining(","));
-
-        String notifyUrl = ""; //回调地址
-        Map<String, Object> resultMap = new LinkedHashMap<>();
-        resultMap.put("merOrderNoList", merOrderNos);
-        Map<String, Object> requestMap = YqPayUtil.getRequestMap(notifyUrl, resultMap);
-
-        RsqMsg rsqMsg = new RsqMsg(requestMap);
-
-        Msg queryRs = yqQueryService.orderQuery(rsqMsg);
-
-        if (queryRs.getCode().equals("88")) {
-            //更新订单状态
-            String[] statusArr = {"0", "1", "7"};
-            String responseParameters = queryRs.getResponseParameters();
-            List<Map<String, String>> responseList = JSON.parseObject(responseParameters, List.class);
-            for (Map<String, String> response : responseList) {
-                Map<String, String> rpMap = response;
-                String channelType = rpMap.get("channelType").equals("1") ? "WXPay" : (rpMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
-                rpMap.put("channelType", channelType);
-
-                if (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
-                    updateOrder(rpMap); //更新订单
-                }
-                if (orderNoList.contains(rpMap.get("merOrderNo"))) {
-                    orderNoList.remove(rpMap.get("merOrderNo"));
-                }
-            }
-            closeOrders(orderNoList); //关闭订单
-        }
-    }
-
-    public void updateOrder(Map<String, String> rpMap) throws Exception {
-        DealStatusEnum status = rpMap.get("tradeState").equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
-        StudentPaymentOrder order = studentPaymentOrderService.findOrderByOrderNo(rpMap.get("merOrderNo"));
-        if (order == null || !order.getStatus().equals(DealStatusEnum.ING)) {
-            return;
-        }
-
-        if (status.equals(DealStatusEnum.SUCCESS)) {
-            order.setPayTime(new Date());
-        } else {
-            order.setMemo(rpMap.get("remarks"));
-        }
-        order.setStatus(status);
-        order.setTransNo(rpMap.get("orderNo"));
-        order.setPaymentBusinessChannel(rpMap.get("channelType"));
-
-        if (order.getType().equals(OrderTypeEnum.APPLY)) { //报名订单
-            studentRegistrationService.updateApplyOrder(order);
-        } else if (order.getType().equals(OrderTypeEnum.SMALL_CLASS_TO_BUY)) {
-            vipGroupService.orderCallback(order);
-        } else if (order.getType().equals(OrderTypeEnum.RENEW)) {
-            musicGroupService.renewForCallback(order);
-        } else if (order.getType().equals(OrderTypeEnum.SPORADIC)) {
-            sporadicChargeInfoService.renewForCallback(order);
-        }
-    }
-
-    public void closeOrders(List<String> orderNoList) throws Exception {
-        if (orderNoList.size() == 0) {
-            return;
-        }
-
-        Calendar beforeTime = Calendar.getInstance();
-        beforeTime.add(Calendar.MINUTE, -30);// 30分钟之前的时间
-        Date beforeDate = beforeTime.getTime();
-
-        List<StudentPaymentOrder> ordersOverTime = studentPaymentOrderService.findOrdersOverTime(orderNoList, DealStatusEnum.ING, beforeDate);
-        for (StudentPaymentOrder order : ordersOverTime) {
-            order.setStatus(DealStatusEnum.FAILED);
-            order.setMemo("超时未支付关闭");
-            if (order.getType().equals(OrderTypeEnum.APPLY)) { //报名订单
-                studentRegistrationService.updateApplyOrder(order);
-            } else if (order.getType().equals(OrderTypeEnum.SMALL_CLASS_TO_BUY)) {
-                vipGroupService.orderCallback(order);
-            } else if (order.getType().equals(OrderTypeEnum.RENEW)) {
-                musicGroupService.renewForCallback(order);
-            }
-        }
-
-    }
-
-    // @Scheduled(cron = "0/5 * * * * ?")
-    public void adaPayQuery() throws Exception {
-        List<StudentPaymentOrder> payingOrders = studentPaymentOrderService.findOrdersByStatus(DealStatusEnum.ING, "ADAPAY");
-
-        List<String> orderNoList = new ArrayList<String>();
-
-        for (StudentPaymentOrder payingOrder : payingOrders) {
-            if (payingOrder.getTransNo() == null) {
-                orderNoList.add(payingOrder.getOrderNo());
-                continue;
-            }
-            Payment payment = new Pay().queryPayment(payingOrder.getTransNo());
-            Map<String, String> rpMap = new HashMap<>();
-            rpMap.put("merOrderNo", payingOrder.getOrderNo());
-            rpMap.put("remarks", payment.getReason());
-            rpMap.put("orderNo", payment.getId());
-            rpMap.put("channelType", payment.getPayChannel());
-            if (payment.getStatus().equals("succeeded")) {
-                rpMap.put("tradeState", "1");
-            }
-            if (payment.getStatus().equals("failed")) {
-                rpMap.put("tradeState", "0");
-            }
-            if (payment.getStatus().equals("pending")) {
-                orderNoList.add(payingOrder.getOrderNo());
-            }
-        }
-        closeOrders(orderNoList);
-    }
-
-
     @PostMapping("/adaNotify")
     public void adaNotify(@ModelAttribute NotifyEvent notifyEvent) throws Exception {
         logger.info(notifyEvent.toString());
@@ -294,7 +172,7 @@ public class StudentOrderController extends BaseController {
             notifyMap.put("merOrderNo", notifyMap.get("order_no"));
             notifyMap.put("merOrderNo", notifyMap.get("order_no"));
             notifyMap.put("remarks", notifyMap.get("description"));
-            updateOrder(notifyMap);
+            studentPaymentOrderService.updateOrder(notifyMap);
         }
     }
 
@@ -329,7 +207,7 @@ public class StudentOrderController extends BaseController {
 
     }
 
-//    @Scheduled(cron = "0/30 * * * * ?")
+    //    @Scheduled(cron = "0/30 * * * * ?")
     @GetMapping("/setSuccessStatus")
     public void setSuccessStatus() throws Exception {
         List<StudentPaymentOrder> payingOrders = studentPaymentOrderService.findOrdersByStatus(DealStatusEnum.ING, "YQPAY");
@@ -347,8 +225,8 @@ public class StudentOrderController extends BaseController {
             rpMap.put("channelType", channelType);
             if (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
                 try {
-                    updateOrder(rpMap); //更新订单
-                }catch (Exception e){
+                    studentPaymentOrderService.updateOrder(rpMap); //更新订单
+                } catch (Exception e) {
                     e.printStackTrace();
                     continue;
                 }
@@ -357,4 +235,54 @@ public class StudentOrderController extends BaseController {
 
     }
 
+    @GetMapping("/fixOrder")
+    private int fixOrder() throws Exception {
+        List<StudentPaymentOrder> payingOrders = studentPaymentOrderDao.findFixOrder(DealStatusEnum.SUCCESS, "YQPAY");
+
+        if (payingOrders.size() == 0) {
+            return 0;
+        }
+        String merOrderNos = payingOrders.stream().map(StudentPaymentOrder::getOrderNo).collect(Collectors.joining(","));
+
+        String notifyUrl = ""; //回调地址
+        Map<String, Object> resultMap = new LinkedHashMap<>();
+        resultMap.put("merOrderNoList", merOrderNos);
+        Map<String, Object> requestMap = YqPayUtil.getRequestMap(notifyUrl, resultMap);
+
+        RsqMsg rsqMsg = new RsqMsg(requestMap);
+
+        Msg queryRs = yqPayFeignService.orderQuery(rsqMsg);
+
+        if (queryRs.getCode().equals("88")) {
+            String responseParameters = queryRs.getResponseParameters();
+            List<Map<String, Object>> responseList = JSON.parseObject(responseParameters, List.class);
+            for (Map<String, Object> response : responseList) {
+                String type = "per";
+                String orderNo = (String) response.get("merOrderNo");
+                String tempRoutingResultList = response.get("tempRoutingResultList").toString();
+                System.out.println(tempRoutingResultList);
+
+                if (tempRoutingResultList.contains("武汉大雅乐盟教育咨询有限公司")) {
+                    type = "com";
+                }
+                fixUpdateOrder(orderNo,type);
+            }
+        }
+        return payingOrders.size();
+    }
+
+    void fixUpdateOrder(String orderNo,String type) {
+        StudentPaymentOrder order = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+        if(type.equals("com")){
+            order.setComAmount(order.getActualAmount());
+            order.setPerAmount(BigDecimal.ZERO);
+            order.setMerNos("0023115");
+        }else {
+            order.setComAmount(BigDecimal.ZERO);
+            order.setPerAmount(order.getActualAmount());
+            order.setMerNos("0031215");
+        }
+        studentPaymentOrderService.update(order);
+    }
+
 }

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

@@ -60,10 +60,7 @@ public class StudentVipGroupController extends BaseController {
         if (null == sysUser) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        String organId = sysUser.getOrganId();
-        if("36".equals(organId)){
-            queryInfo.setOrganId(organId);
-        }
+        queryInfo.setOrganId(sysUser.getOrganId());
         queryInfo.setUserId(sysUser.getId());
         Map<String,Object> result=new HashMap<>();
         result.put("recommendVipGroups",new ArrayList<>());

binární
mec-student/src/main/resources/config/fonts/simsun.ttc


binární
mec-student/src/main/resources/config/fonts/simsun.ttf


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

@@ -101,9 +101,8 @@ public class SmsCodeController extends BaseController {
         KaptchaServlet kaptchaServlet = new KaptchaServlet();
         kaptchaServlet.init();
         ServletOutputStream out = response.getOutputStream();
-        // write the data out
-        ImageIO.write(bi, "jpg", out);
         try {
+            ImageIO.write(bi, "jpg", out);
             out.flush();
         } finally {
             out.close();

+ 0 - 43
mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMessageController.java

@@ -86,49 +86,6 @@ public class SysMessageController extends BaseController {
 		}
 		return succeed(map);
 	}
-/*
-	@ApiOperation(value = "发送短信验证码")
-	@PostMapping("/sendSmsCode")
-	public Object sendSmsCode(String sendCodeType, String mobileNo) {
-
-		SysUser sysUser;
-
-		if (StringUtils.isBlank(mobileNo)) {
-			sysUser = sysUserFeignService.queryUserInfo();
-		} else {
-			sysUser = sysUserFeignService.queryUserByMobile(mobileNo);
-		}
-		if (sysUser == null) {
-			return failed(HttpStatus.FORBIDDEN, "请登录");
-		}
-		Integer userId = sysUser.getId();
-
-		mobileNo = sysUser.getPhone();
-
-		MessageType messageType = MessageType.getMessageType(sendCodeType);
-		if (messageType == null) {
-			throw new BizException("消息类型参数错误");
-		}
-		if (StringUtils.isBlank(mobileNo) || !CommonValidator.isMobileNo(mobileNo)) {
-			throw new BizException("请输入正确的手机号");
-		}
-		sysMessageService.sendSecurityCode(MessageSender.YIMEI, userId, MessageSendMode.SMS, messageType, mobileNo);
-		return succeed();
-	}
-
-	@ApiOperation(value = "发送短信验证码")
-	@PostMapping("/noAuth/sendSmsCode")
-	public Object noAuthSendSmsCode(String sendCodeType, String mobileNo) {
-		MessageType messageType = MessageType.getMessageType(sendCodeType);
-		if (messageType == null) {
-			throw new BizException("消息类型参数错误");
-		}
-		if (StringUtils.isBlank(mobileNo) || !CommonValidator.isMobileNo(mobileNo)) {
-			throw new BizException("请输入正确的手机号");
-		}
-//		sysMessageService.sendSecurityCode(MessageSender.YIMEI, userId, MessageSendMode.SMS, messageType, mobileNo);
-		return succeed();
-	}*/
 
 	@ApiOperation(value = "发送消息")
 	@PostMapping("/sendMessage")

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

@@ -159,7 +159,7 @@ public class TsignPlugin implements ESealPlugin, InitializingBean, DisposableBea
 		int sealId = 0;
 		// 设置接口调用方(平台方)签章位置信息
 		posBean.setPosPage("1");// 签署页码,若为多页签章,支持页码格式“1-3,5,8“,若为坐标定位时,不可空
-		posBean.setKey("甲方(签字)");
+		posBean.setKey("甲方签章");
 		// 签署位置X坐标,默认值为0,以pdf页面的左下角作为原点,控制距离页面左端的横向移动距离,单位为px
 		posBean.setPosX(100);
 		// 签署位置Y坐标,默认值为0,以pdf页面的左下角作为原点,控制距离页面底端的纵向移动距离,单位为px
@@ -228,7 +228,7 @@ public class TsignPlugin implements ESealPlugin, InitializingBean, DisposableBea
 		posBean.setPosPage("1");
 		posBean.setPosType(1);
 		posBean.setWidth(80);
-		posBean.setKey("乙方签");
+		posBean.setKey("乙方签");
 		posBean.setPosX(100);
 		posBean.setPosY(0);
 

+ 15 - 5
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/JiguangPushPlugin.java

@@ -22,19 +22,19 @@ import com.ym.mec.util.http.HttpUtil;
 public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean {
 
 	@Value("${push.jiguang.appKey:0e7422e1d6e73637e678716a}")
-	private String appKey;
+	private String appKey = "7e0282ca92c12c8c45a93bb3";
 
 	@Value("${push.jiguang.masterSecret:c2361016604eab56ab2db2ac}")
-	private String masterSecret;
+	private String masterSecret = "d47430e2f4755ef5dc050ac5";
 
 	@Value("${push.jiguang.apns_production:false}")
-	private boolean apns_production; // 推送环境 True 表示推送生产环境,False 表示要推送开发环境
+	private boolean apns_production = true; // 推送环境 True 表示推送生产环境,False 表示要推送开发环境
 
 	@Value("${push.jiguang.time_to_live:86400}")
-	private int time_to_live; // 离线保留时长 秒为单位 默认1天 最大10天
+	private int time_to_live = 86400; // 离线保留时长 秒为单位 默认1天 最大10天
 
 	@Value("${push.jiguang.reqURL:https://api.jpush.cn/v3/push}")
-	private String reqURL;// 请求极光地址
+	private String reqURL = "https://api.jpush.cn/v3/push";// 请求极光地址
 
 	public static String getName() {
 		return "Jiguang";
@@ -196,4 +196,14 @@ public class JiguangPushPlugin implements MessageSenderPlugin, InitializingBean
 		this.reqURL = reqURL;
 	}
 
+	public static void main(String[] args) throws IOException {
+		
+		String str = "1048953,1048955,1048958,1048959,1048960,1048961,1048965,1048967,1048970,1048974,1048977,1048981,1048983,1048990,1048993,1048996,1048998,1048999,1049000,1049003,1049005,1049006,1049008,1049009,1049013,1049019,1049024,1049034,1049036,1049038,1049039,1049040,1049042,1049043,1049045,1049048,1049049,1049051,1049053,1049057,1049062,1049066,1049076,1049077,1049079,1049090,1049117,1049118,1049122,1049123,1049149,1049251,1049363,1049368,1049524,1055861,1055862,1055863,1055865,1056784,1084443,1094555,1094575";
+		
+		
+		JiguangPushPlugin plugin = new JiguangPushPlugin();
+		
+		plugin.batchSend("基础技能训练报名通知", "家长您好:经五路小学比赛团乐团基础技能训练已经开始缴费。请您在收到本通知后,点击http://mstuonline.dayaedu.com/#/smallRegister?musicGroupId=19121912014300001 进行缴费,若有疑问请咨询800-8208820", str.split(","), "5?http://mstudev.dayaedu.com/#/smallRegister?musicGroupId=19121912014300001");
+	}
+
 }

+ 26 - 19
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/message/provider/YimeiSmsPlugin.java

@@ -1,24 +1,31 @@
 package com.ym.mec.thirdparty.message.provider;
 
-import com.alibaba.fastjson.JSONObject;
-import com.ym.mec.thirdparty.message.MessageSenderPlugin;
-import com.ym.mec.util.date.DateUtil;
-import com.ym.mec.util.http.HttpUtil;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
+import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.thirdparty.exception.ThirdpartyException;
+import com.ym.mec.thirdparty.message.MessageSenderPlugin;
+import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.http.HttpUtil;
 
 /**
  * 亿美短信
  */
 @Service
 public class YimeiSmsPlugin implements MessageSenderPlugin, InitializingBean {
+
+	private Logger logger = LoggerFactory.getLogger(YimeiSmsPlugin.class);
+
 	@Value("${com.properties.sms-appId:EUCP-EMY-SMS1-1AIHP}")
 	private String appId;
 	@Value("${com.properties.sms-secretKey:CBA790799C876DAD}")
@@ -30,30 +37,29 @@ public class YimeiSmsPlugin implements MessageSenderPlugin, InitializingBean {
 		return "yimei";
 	}
 
-	private String getParam(String subject, String content, String receiver,String host){
+	private String getParam(String subject, String content, String receiver, String host) {
 		try {
-			HashMap<String,Object> param = new HashMap();
-			param.put("appId",appId);
-			String timestamp = DateUtil.format(new Date(),new SimpleDateFormat("yyyyMMddHHmmss"));
+			HashMap<String, Object> param = new HashMap();
+			param.put("appId", appId);
+			String timestamp = DateUtil.format(new Date(), new SimpleDateFormat("yyyyMMddHHmmss"));
 			param.put("timestamp", timestamp);
 			param.put("sign", DigestUtils.md5Hex(appId + secretKey + timestamp));
-			param.put("content",content);
-			param.put("mobiles",receiver);
+			param.put("content", content);
+			param.put("mobiles", receiver);
 			return HttpUtil.postForHttp(host, param);
 		} catch (Exception e) {
-			e.printStackTrace();
+			throw new ThirdpartyException("调用发送短信接口出现异常", e);
 		}
-		return "";
 	}
 
 	@Override
 	public boolean send(String subject, String content, String receiver, String url) throws Exception {
 		String result = getParam(subject, content, receiver, host + "/simpleinter/sendSMS");
 		JSONObject json = JSONObject.parseObject(result);
-		if("SUCCESS".equals(json.get("code"))){
+		if ("SUCCESS".equals(json.get("code"))) {
 
 			return true;
-		}else {
+		} else {
 			throw new Exception(json.getString("code"));
 		}
 	}
@@ -62,10 +68,11 @@ public class YimeiSmsPlugin implements MessageSenderPlugin, InitializingBean {
 	public boolean batchSend(String subject, String content, String[] receivers, String url) throws Exception {
 		String join = StringUtils.join(receivers, ",");
 		String result = getParam(subject, content, join, host + "/simpleinter/sendSMS");
+		logger.info("调用短信接口返回:{}", result);
 		JSONObject json = JSONObject.parseObject(result);
-		if("SUCCESS".equals(json.get("code"))){
+		if ("SUCCESS".equals(json.get("code"))) {
 			return true;
-		}else {
+		} else {
 			throw new Exception(json.getString("code"));
 		}
 	}

+ 36 - 2
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/yqpay/YqPayUtil.java

@@ -15,7 +15,7 @@ public class YqPayUtil {
 
     public static Map<String, Object> getRequestMap(String notifyUrl, Map<String, Object> resultMap) throws Exception {
         Map<String, Object> rqMap = new LinkedHashMap<>();
-        rqMap.put("merNo",merNo);
+        rqMap.put("merNo", merNo);
         rqMap.put("version", version);
         rqMap.put("notifyUrl", notifyUrl);
         rqMap.put("timestamp", DateUtils.getDateTime());
@@ -40,7 +40,7 @@ public class YqPayUtil {
      * @return
      * @throws Exception
      */
-    public static Map<String, Object> getPayMap(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody,String sellerNo, String routingMerNo) throws Exception {
+    public static Map<String, Object> getPayMap(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, String sellerNo, String routingMerNo) throws Exception {
         List<Map> tempRoutingList = new ArrayList();
         Map<String, Object> routingList = new HashMap<>();
         routingList.put("routingMerNo", routingMerNo);//分佣账户
@@ -66,6 +66,40 @@ public class YqPayUtil {
     }
 
     /**
+     * 获取支付Map
+     *
+     * @param amount
+     * @param orderNo
+     * @param notifyUrl
+     * @param returnUrl
+     * @param orderSubject
+     * @param orderBody
+     * @param sellerNo
+     * @param tempRoutingList
+     * @return
+     * @throws Exception
+     */
+    public static Map<String, Object> getPayMap(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, String sellerNo, List<Map> tempRoutingList) throws Exception {
+        Map<String, Object> contentMap = new LinkedHashMap<>();
+        contentMap.put("sellerNo", sellerNo); //收款商户号
+        contentMap.put("payChannels", payChannels); //支付方式
+        contentMap.put("orderBody", orderBody); //订单信息
+        contentMap.put("payAmount", amount); //支付金额
+        contentMap.put("apiPayType", "1"); //*API支付类型1-即时支付,2-担保支付,3-预授权支付*/
+        contentMap.put("tradeType", "0"); //*交易类型1—充值,0—收款*
+        contentMap.put("merMerOrderNo", orderNo); //商户订单号
+        contentMap.put("orderSubject", orderSubject); //订单标题
+        contentMap.put("returnUrl", returnUrl); //前台页面地址
+        if (tempRoutingList != null) {
+            contentMap.put("tempRoutingList", JSON.toJSONString(tempRoutingList));//分账设置
+        }
+        Map<String, Object> payMap = getRequestMap(notifyUrl, contentMap);
+        payMap.put("host", payUrl);
+        return payMap;
+    }
+
+
+    /**
      * 验签
      *
      * @param rsMap

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

@@ -140,13 +140,20 @@ public class ClassGroupController extends BaseController {
         return succeed(classGroupService.queryMusicGroupClassGroup(queryInfo));
     }
 
-    @ApiOperation(value = "乐团详情--课表详情列表(课酬调整共用)")
+    @ApiOperation(value = "乐团详情--课酬调整列表(课酬调整)")
     @GetMapping("/queryMusicGroupCourseSchedule")
     @PreAuthorize("@pcs.hasPermissions('classGroup/queryMusicGroupCourseSchedule')")
     public HttpResponseResult queryMusicGroupCourseSchedule(queryMusicGroupCourseScheduleQueryInfo queryInfo) {
         return succeed(classGroupService.queryMusicGroupCourseSchedule(queryInfo));
     }
 
+    @ApiOperation(value = "乐团详情--课表详情列表(课表详情)")
+    @GetMapping("/queryMusicGroupCourseScheduleDetail")
+    @PreAuthorize("@pcs.hasPermissions('classGroup/queryMusicGroupCourseScheduleDetail')")
+    public HttpResponseResult queryMusicGroupCourseScheduleDetail(queryMusicGroupCourseScheduleQueryInfo queryInfo) {
+        return succeed(classGroupService.queryMusicGroupCourseScheduleDetail(queryInfo));
+    }
+
     @ApiOperation(value = "乐团班级老师设置")
     @PostMapping("/addClassGroupTeacher")
     @ApiParam(value = "乐团班级老师json", required = true)
@@ -279,4 +286,12 @@ public class ClassGroupController extends BaseController {
     public HttpResponseResult getClassGroupTeachers(Integer classGroupId){
         return succeed(classGroupTeacherMapperService.getClassGroupTeachers(classGroupId));
     }
+
+    @ApiOperation(value = "清除班级未上课程")
+    @PostMapping("/delClassNoStartCourse")
+    @PreAuthorize("@pcs.hasPermissions('classGroup/delClassNoStartCourse')")
+    @ApiImplicitParams({@ApiImplicitParam(name = "classGroupId", value = "班级id", required = true, dataType = "int")})
+    public HttpResponseResult delClassNoStartCourse(Integer classGroupId) throws Exception {
+        return succeed(classGroupService.delClassNoStartCourse(classGroupId));
+    }
 }

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

@@ -1,19 +1,29 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dto.StudentApplyDetailDto;
+import com.ym.mec.biz.dal.dto.StudentHasCourseDto;
 import com.ym.mec.biz.dal.dto.TeacherSalaryDto;
+import com.ym.mec.biz.dal.dto.musicalListDetailDto;
+import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.page.CourseScheduleTeacherSalaryQueryInfo;
+import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
 import com.ym.mec.biz.dal.page.StudentRegistrationQueryInfo;
-import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
-import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
-import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.excel.POIUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -22,8 +32,8 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 
@@ -35,36 +45,74 @@ public class ExportController extends BaseController {
     @Autowired
     private StudentRegistrationService studentRegistrationService;
     @Autowired
+    private StudentManageService studentManageService;
+    @Autowired
     private StudentPaymentOrderDetailService studentPaymentOrderDetailService;
     @Autowired
     private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private EmployeeDao employeeDao;
+    @Autowired
+    private StudentPaymentOrderService studentPaymentOrderService;
+
+    @ApiOperation(value = "导出学员是否有课")
+    @PostMapping("export/studentHasCourse")
+    @PreAuthorize("@pcs.hasPermissions('export/studentHasCourse')")
+    public void studentHasCourse(HttpServletResponse response){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            throw new BizException("获取用户信息失败");
+        }
+        List<StudentHasCourseDto> hasCourseDtos =  studentManageService.queryHasCourseStudent(sysUser.getOrganId());
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[] {"学员编号", "姓名","分部","所在乐团","乐团所属声部","所在vip课"}, new String[] {
+                    "userId","userName","organName","musicGroupName","subjectName","vipGroupName"}, hasCourseDtos);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            workbook.write(response.getOutputStream());
+            workbook.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
 
     @ApiOperation(value = "导出乐器采购清单")
     @PostMapping("order/musicalListExport")
+    @PreAuthorize("@pcs.hasPermissions('order/musicalListExport')")
     public void musicalListExport(HttpServletResponse response, String musicGroupId){
         List<Goods> musicalList = studentPaymentOrderDetailService.getMusicalList(musicGroupId);
-        if(musicalList == null || musicalList.size() < 1){
-            throw new BizException("数据为空");
-        }
-        OutputStream outputStream = null;
         try {
-            HSSFWorkbook workbook = POIUtil.exportExcel(new String[] {"乐团","分部","商品类型", "商品名称", "型号", "数量"}, new String[] {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[] {"分部","乐团","商品类型", "商品名称", "型号", "数量"}, new String[] {
                     "brief","memo","type.desc","name","specification","sellCount"}, musicalList);
-            response.setContentType("application/msexcel");
-            response.setHeader("Content-disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
-            outputStream = response.getOutputStream();
-            workbook.write(outputStream);
-            outputStream.flush();
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            workbook.write(response.getOutputStream());
+            workbook.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @ApiOperation(value = "导出学员采购清单明细")
+    @PostMapping("order/musicalListDetailExport")
+    @PreAuthorize("@pcs.hasPermissions('order/musicalListDetailExport')")
+    public void musicalListDetailExport(HttpServletResponse response, String musicGroupId){
+        List<musicalListDetailDto> musicalList = studentPaymentOrderDetailService.getMusicalListDetail(musicGroupId);
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[] {"分部", "乐团","学员编号","学员姓名","购买商品", "采购方式", "乐器金额", "教辅金额", "课程金额", "订单总价"}, new String[] {
+                    "organName","musicGroupName","userId","username","goodsNames","kitGroupPurchaseTypeEnum.msg","musicalAmount","accessoriesAmount","courseAmount","orderAmount"}, musicalList);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            workbook.write(response.getOutputStream());
+            workbook.close();
         } catch (Exception e) {
             e.printStackTrace();
-        } finally {
-            if (outputStream != null) {
-                try {
-                    outputStream.close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
         }
     }
 
@@ -73,9 +121,6 @@ public class ExportController extends BaseController {
     @PreAuthorize("@pcs.hasPermissions('studentRegistration/queryStudentApplyDetailExport')")
     public void queryStudentApplyDetailExport(StudentRegistrationQueryInfo queryInfo, HttpServletResponse response) {
         List<StudentApplyDetailDto> studentApplyDetail = studentRegistrationService.queryStudentDetailPage(queryInfo).getRows();
-        if(studentApplyDetail == null || studentApplyDetail.size() < 1){
-            throw new BizException("数据为空");
-        }
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[] { "学生姓名","家长姓名", "年级", "班级", "性别", "服从调剂","报名专业", "实际专业","联系电话", "学员缴费状态", "乐器购买方式"}, new String[] {
                     "studentName","parentsName", "currentGrade", "currentClass", "gender.description", "isAllowAdjust.msg", "subjectName", "actualSubjectName", "parentsPhone","paymentStatus.desc","kitGroupPurchaseTypeEnum.msg"}, studentApplyDetail);
@@ -91,28 +136,68 @@ public class ExportController extends BaseController {
 
     @ApiOperation(value = "分页导出教师薪酬列表")
     @RequestMapping("courseScheduleTeacherSalary/export")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleTeacherSalary/export')")
     public void export(CourseScheduleTeacherSalaryQueryInfo queryInfo, HttpServletResponse response) {
         List<TeacherSalaryDto> teacherSalaries = courseScheduleTeacherSalaryService.querySalaries(queryInfo).getRows();
-        OutputStream ouputStream = null;
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[] { "用户编号","用户名", "手机号", "课程类型", "实际薪水", "补助", "结算时间", "教师角色"}, new String[] {
                     "userId","username", "phone", "type.msg", "name", "actualSalary", "subsidy", "settlementTime", "teacherRole.msg"}, teacherSalaries);
-            response.setContentType("application/vnd.ms-excel");
-            response.setHeader("Content-disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
-            ouputStream = response.getOutputStream();
-            workbook.write(ouputStream);
-            ouputStream.flush();
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            workbook.write(response.getOutputStream());
+            workbook.close();
         } catch (Exception e) {
             e.printStackTrace();
-        } finally {
-            if (ouputStream != null) {
-                try {
-                    ouputStream.close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
+        }
+    }
+
+    @ApiOperation(value = "订单列表导出")
+    @RequestMapping("order/orderList")
+    @PreAuthorize("@pcs.hasPermissions('order/orderList')")
+    public void orderList(StudentPaymentOrderQueryInfo queryInfo, HttpServletResponse response) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (!sysUser.getIsSuperAdmin()) {
+            Employee employee = employeeDao.get(sysUser.getId());
+            if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+                queryInfo.setOrganId(employee.getOrganIdList());
             }
         }
+
+        PageInfo<StudentPaymentOrder> studentPaymentOrderPageInfo = studentPaymentOrderService.queryPage(queryInfo);
+
+        for (StudentPaymentOrder row : studentPaymentOrderPageInfo.getRows()) {
+            BigDecimal balancePaymentAmount = row.getBalancePaymentAmount() == null ? BigDecimal.ZERO : row.getBalancePaymentAmount();
+            if (queryInfo.getOrderType().equals(1)) {
+                BigDecimal comAmount = row.getComAmount() == null ? BigDecimal.ZERO : row.getComAmount();
+                row.setExpectAmount(comAmount.add(balancePaymentAmount));
+                row.setActualAmount(comAmount.add(balancePaymentAmount));
+            }else {
+                BigDecimal perAmount = row.getPerAmount() == null ? BigDecimal.ZERO : row.getPerAmount();
+                row.setExpectAmount(perAmount.add(balancePaymentAmount));
+                row.setActualAmount(perAmount.add(balancePaymentAmount));
+            }
+            if(row.getGroupType().equals(GroupType.SPORADIC)){
+                row.setSporadicAmount(row.getActualAmount());
+                row.setExpectAmount(BigDecimal.ZERO);
+                row.setActualAmount(BigDecimal.ZERO);
+            }
+        }
+
+        try {
+            String[] header = {"序号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "支付金额", "到账时间",
+            "关联乐团ID/VIP课ID","课程形态","押金","乐器","教辅费用","零星收款费用","零星收款类别","手续费","专业","分部","单位/学校","备注"};
+            String[] body = {"id", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "actualAmount", "payTime", "musicGroupId",
+            "groupType",    "groupType","groupType","groupType","SporadicAmount","SporadicAmount","groupType","groupType","groupType","groupType","memo"};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, studentPaymentOrderPageInfo.getRows());
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            workbook.write(response.getOutputStream());
+            workbook.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 
 }

+ 97 - 16
mec-web/src/main/java/com/ym/mec/web/controller/StudentPaymentOrderController.java

@@ -3,11 +3,14 @@ package com.ym.mec.web.controller;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
 import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
 import com.ym.mec.biz.service.StudentPaymentOrderService;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -20,6 +23,7 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.List;
 
@@ -28,12 +32,6 @@ import java.util.List;
 @RestController
 public class StudentPaymentOrderController extends BaseController {
 
-    @Value("${payment.hiddenMode}")
-    private Boolean hiddenMode;
-
-    @Value("${payment.channel}")
-    private String channel;
-
     @Autowired
     private StudentPaymentOrderService studentPaymentOrderService;
     @Autowired
@@ -42,39 +40,122 @@ public class StudentPaymentOrderController extends BaseController {
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private EmployeeDao employeeDao;
+    @Autowired
+    private SysConfigDao sysConfigDao;
 
     @ApiOperation(value = "获取订单列表")
     @GetMapping("/queryPage")
     @PreAuthorize("@pcs.hasPermissions('order/queryPage')")
-    public Object queryOrderPage(StudentPaymentOrderQueryInfo queryInfo){
+    public Object queryOrderPage(StudentPaymentOrderQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        if (!sysUser.getIsSuperAdmin()) {
+            Employee employee = employeeDao.get(sysUser.getId());
+            if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+                queryInfo.setOrganId(employee.getOrganIdList());
+            } else if (StringUtils.isEmpty(employee.getOrganIdList())) {
+                return failed("用户所在分部异常");
+            } else {
+                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+                if (!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))) {
+                    return failed("非法请求");
+                }
+            }
+        }
+
+        PageInfo<StudentPaymentOrder> studentPaymentOrderPageInfo = studentPaymentOrderService.queryPage(queryInfo);
+
+        int openHideMode = Integer.parseInt(sysConfigDao.findConfigValue("open_hide_mode"));
+        if (openHideMode == 1) {
+            for (StudentPaymentOrder row : studentPaymentOrderPageInfo.getRows()) {
+                if (row.getComAmount() != null) {
+                    BigDecimal balancePaymentAmount = row.getBalancePaymentAmount() == null ? BigDecimal.ZERO : row.getBalancePaymentAmount();
+                    BigDecimal comAmount = row.getComAmount() == null ? BigDecimal.ZERO : row.getComAmount();
+                    row.setExpectAmount(comAmount.add(balancePaymentAmount));
+                    row.setActualAmount(comAmount.add(balancePaymentAmount));
+                }
+            }
+        }
+        return succeed(studentPaymentOrderPageInfo);
+    }
+
+    @ApiOperation(value = "获取订单列表1")
+    @GetMapping("/queryPage1")
+    @PreAuthorize("@pcs.hasPermissions('order/queryPage1')")
+    public Object queryOrderPage1(StudentPaymentOrderQueryInfo queryInfo) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
-        if(!sysUser.getIsSuperAdmin()){
+        if (!sysUser.getIsSuperAdmin()) {
             Employee employee = employeeDao.get(sysUser.getId());
             if (StringUtils.isEmpty(queryInfo.getOrganId())) {
                 queryInfo.setOrganId(employee.getOrganIdList());
-            }else if(StringUtils.isEmpty(employee.getOrganIdList())){
+            } else if (StringUtils.isEmpty(employee.getOrganIdList())) {
                 return failed("用户所在分部异常");
-            }else {
+            } else {
                 List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
-                if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
+                if (!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))) {
                     return failed("非法请求");
                 }
             }
         }
-        if(hiddenMode){
-            queryInfo.setPaymentChannel(channel);
+
+        PageInfo<StudentPaymentOrder> studentPaymentOrderPageInfo = studentPaymentOrderService.queryPage(queryInfo);
+
+        for (StudentPaymentOrder row : studentPaymentOrderPageInfo.getRows()) {
+            BigDecimal balancePaymentAmount = row.getBalancePaymentAmount() == null ? BigDecimal.ZERO : row.getBalancePaymentAmount();
+            BigDecimal comAmount = row.getComAmount() == null ? BigDecimal.ZERO : row.getComAmount();
+            if (row.getComAmount() != null) {
+                row.setExpectAmount(comAmount.add(balancePaymentAmount));
+                row.setActualAmount(comAmount.add(balancePaymentAmount));
+            }
+        }
+        return succeed(studentPaymentOrderPageInfo);
+    }
+
+    @ApiOperation(value = "获取订单列表2")
+    @GetMapping("/queryPage2")
+    @PreAuthorize("@pcs.hasPermissions('order/queryPage2')")
+    public Object queryOrderPage2(StudentPaymentOrderQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        if (!sysUser.getIsSuperAdmin()) {
+            Employee employee = employeeDao.get(sysUser.getId());
+            if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+                queryInfo.setOrganId(employee.getOrganIdList());
+            } else if (StringUtils.isEmpty(employee.getOrganIdList())) {
+                return failed("用户所在分部异常");
+            } else {
+                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+                if (!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))) {
+                    return failed("非法请求");
+                }
+            }
+        }
+
+        PageInfo<StudentPaymentOrder> studentPaymentOrderPageInfo = studentPaymentOrderService.queryPage(queryInfo);
+
+        for (StudentPaymentOrder row : studentPaymentOrderPageInfo.getRows()) {
+            BigDecimal balancePaymentAmount = row.getBalancePaymentAmount() == null ? BigDecimal.ZERO : row.getBalancePaymentAmount();
+            BigDecimal perAmount = row.getPerAmount() == null ? BigDecimal.ZERO : row.getPerAmount();
+            if (row.getPerAmount() != null) {
+                row.setExpectAmount(perAmount.add(balancePaymentAmount));
+                row.setActualAmount(perAmount.add(balancePaymentAmount));
+            }
         }
-        return succeed(studentPaymentOrderService.queryPage(queryInfo));
+        return succeed(studentPaymentOrderPageInfo);
     }
 
     @ApiOperation(value = "获取乐器采购清单")
     @GetMapping("/getMusicalList")
     @PreAuthorize("@pcs.hasPermissions('order/getMusicalList')")
     @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团id", required = true, dataType = "String")})
-    public Object getMusicalList(String musicGroupId){
+    public Object getMusicalList(String musicGroupId) {
         return succeed(studentPaymentOrderDetailService.getMusicalList(musicGroupId));
     }
 
@@ -82,7 +163,7 @@ public class StudentPaymentOrderController extends BaseController {
     @GetMapping("/verifyMusicalList")
     @PreAuthorize("@pcs.hasPermissions('order/verifyMusicalList')")
     @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团id", required = true, dataType = "String")})
-    public Object verifyMusicalListMusicalList(String musicGroupId){
+    public Object verifyMusicalListMusicalList(String musicGroupId) {
         return succeed(studentPaymentOrderDetailService.verifyMusicalList(musicGroupId));
     }
 

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

@@ -33,7 +33,7 @@ public class SysPaymentConfigController extends BaseController {
         }
         Date nowDate = new Date();
         sysPaymentConfig.setCreateTime(nowDate);
-        sysPaymentConfig.setCreateTime(nowDate);
+        sysPaymentConfig.setUpdateTime(nowDate);
         return succeed(sysPaymentConfigService.insert(sysPaymentConfig));
     }
 

+ 17 - 12
mec-web/src/main/java/com/ym/mec/web/controller/SysUserCashAccountDetailController.java

@@ -2,11 +2,14 @@ package com.ym.mec.web.controller;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.CashAccountDetail;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
 import com.ym.mec.biz.service.SysUserCashAccountDetailService;
 import com.ym.mec.common.controller.BaseController;
 
+import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
@@ -18,22 +21,18 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.math.BigDecimal;
+
 @RequestMapping("userCashAccountDetail")
 @Api(tags = "用户交易明细服务")
 @RestController
 public class SysUserCashAccountDetailController extends BaseController {
-
-    @Value("${payment.hiddenMode}")
-    private Boolean hiddenMode;
-
-    @Value("${payment.channel}")
-    private String channel;
-
-
     @Autowired
     private SysUserCashAccountDetailService sysUserCashAccountDetailService;
     @Autowired
     private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysConfigDao sysConfigDao;
 
     @ApiOperation(value = "新增用户交易明细")
     @PostMapping("/add")
@@ -51,11 +50,17 @@ public class SysUserCashAccountDetailController extends BaseController {
         if (user == null && user.getId() != null) {
             return failed("请重新登录");
         }
-        if (hiddenMode){
-            queryInfo.setChannel(channel);
-        }
         queryInfo.setUserId(user.getId());
-        return succeed(sysUserCashAccountDetailService.queryPage(queryInfo));
+        PageInfo<SysUserCashAccountDetail> sysUserCashAccountDetailPageInfo = sysUserCashAccountDetailService.queryPage(queryInfo);
+
+        int openHideMode = Integer.parseInt(sysConfigDao.findConfigValue("open_hide_mode"));
+        if(openHideMode == 1){
+            for (SysUserCashAccountDetail row : sysUserCashAccountDetailPageInfo.getRows()) {
+                BigDecimal comAmount = row.getComAmount() == null ? BigDecimal.ZERO : row.getComAmount();
+                row.setAmount(comAmount.add(comAmount));
+            }
+        }
+        return succeed(sysUserCashAccountDetailPageInfo);
     }
 
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.page.TeacherCloseQueryInfo;
 import com.ym.mec.biz.service.TeacherAttendanceService;
 import com.ym.mec.common.controller.BaseController;

+ 19 - 4
pom.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 
 	<groupId>com.ym</groupId>
@@ -257,6 +258,18 @@
 			<resource>
 				<directory>src/main/resources</directory>
 				<filtering>true</filtering>
+				<excludes>
+					<exclude>**/*.ttf</exclude>
+					<exclude>**/*.ttc</exclude>
+				</excludes>
+			</resource>
+			<resource>
+				<directory>src/main/resources</directory>
+				<filtering>false</filtering>
+				<includes>
+					<include>**/*.ttf</include>
+					<include>**/*.ttc</include>
+				</includes>
 			</resource>
 		</resources>
 		<pluginManagement>
@@ -298,12 +311,14 @@
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-resources-plugin</artifactId>
 				<configuration>
-          <encoding>UTF-8</encoding>
+					<encoding>UTF-8</encoding>
 					<!-- 过滤后缀为pem、pfx的证书文件 -->
 					<nonFilteredFileExtensions>
 						<nonFilteredFileExtension>cer</nonFilteredFileExtension>
 						<nonFilteredFileExtension>pem</nonFilteredFileExtension>
 						<nonFilteredFileExtension>pfx</nonFilteredFileExtension>
+						<nonFilteredFileExtension>ttc</nonFilteredFileExtension>
+						<nonFilteredFileExtension>ttf</nonFilteredFileExtension>
 					</nonFilteredFileExtensions>
 				</configuration>
 			</plugin>
@@ -331,6 +346,6 @@
 		<module>mec-teacher</module>
 		<module>mec-education</module>
 		<module>mec-biz</module>
-	  <module>data_migration</module>
-  </modules>
+		<module>data_migration</module>
+	</modules>
 </project>