Sfoglia il codice sorgente

Merge branch 'online1' into Joburgess

Joburgess 5 anni fa
parent
commit
d97589478b
100 ha cambiato i file con 4601 aggiunte e 1191 eliminazioni
  1. 0 1
      cms/src/main/java/com/ym/mec/cms/controller/NewsController.java
  2. 8 8
      codegen/src/main/resources/generateConfigration.xml
  3. 9 6
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java
  4. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  5. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  6. 35 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  7. 38 5
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDao.java
  8. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupStudentFeeDao.java
  9. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SellOrderDao.java
  10. 11 8
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java
  11. 49 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentGoodsSellDao.java
  12. 18 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDetailDao.java
  13. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  14. 33 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRepairDao.java
  15. 68 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SubjectChangeDao.java
  16. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java
  17. 64 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CalenderPushDto.java
  18. 62 16
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/GoodsSellDto.java
  19. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PracticeBuyResultDto.java
  20. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentApplyDetailDto.java
  21. 58 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentGoodsSellDto.java
  22. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java
  23. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroup.java
  24. 48 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicGroupPaymentCalender.java
  25. 28 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SellOrder.java
  26. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentAttendance.java
  27. 205 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentGoodsSell.java
  28. 5 5
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentOrder.java
  29. 558 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SubjectChange.java
  30. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java
  31. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/GroupType.java
  32. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  33. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java
  34. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/SubjectChangeStatusEnum.java
  35. 40 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/GoodsSellQueryInfo.java
  36. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/OperatingReportQueryInfo.java
  37. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentPaymentOrderQueryInfo.java
  38. 67 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SubjectChangeQueryInfo.java
  39. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  40. 13 4
      mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderService.java
  41. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SellOrderService.java
  42. 15 4
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentAttendanceService.java
  43. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentGoodsSellService.java
  44. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRegistrationService.java
  45. 28 7
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentRepairService.java
  46. 75 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SubjectChangeService.java
  47. 23 11
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherAttendanceService.java
  48. 33 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  49. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  50. 17 15
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursesGroupServiceImpl.java
  51. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/FinancialExpenditureServiceImpl.java
  52. 75 14
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java
  53. 0 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  54. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OperatingReportServiceImpl.java
  55. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  56. 15 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SellOrderServiceImpl.java
  57. 1 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java
  58. 96 127
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java
  59. 52 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentGoodsSellServiceImpl.java
  60. 153 67
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java
  61. 13 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  62. 86 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  63. 324 63
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java
  64. 496 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java
  65. 106 122
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  66. 7 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  67. 0 4
      mec-biz/src/main/resources/config/mybatis/ClassGroupStudentMapperMapper.xml
  68. 7 7
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  69. 12 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  70. 28 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  71. 78 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderMapper.xml
  72. 14 4
      mec-biz/src/main/resources/config/mybatis/MusicGroupStudentFeeMapper.xml
  73. 6 0
      mec-biz/src/main/resources/config/mybatis/OperatingReportMapper.xml
  74. 36 6
      mec-biz/src/main/resources/config/mybatis/SellOrderMapper.xml
  75. 16 10
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  76. 139 0
      mec-biz/src/main/resources/config/mybatis/StudentGoodsSellMapper.xml
  77. 80 24
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderDetailMapper.xml
  78. 17 5
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  79. 8 1
      mec-biz/src/main/resources/config/mybatis/StudentPaymentRouteOrderMapper.xml
  80. 4 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  81. 47 0
      mec-biz/src/main/resources/config/mybatis/StudentRepairMapper.xml
  82. 304 0
      mec-biz/src/main/resources/config/mybatis/SubjectChangeMapper.xml
  83. 15 6
      mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  84. 4 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  85. 5 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  86. 1 1
      mec-im/src/main/java/com/ym/common/ErrorEnum.java
  87. 48 57
      mec-im/src/main/java/com/ym/controller/RoomController.java
  88. 0 2
      mec-im/src/main/java/com/ym/dao/HereWhiteDao.java
  89. 5 13
      mec-im/src/main/java/com/ym/dao/RoomDao.java
  90. 17 31
      mec-im/src/main/java/com/ym/dao/RoomMemberDao.java
  91. 0 2
      mec-im/src/main/java/com/ym/dao/SpeechDao.java
  92. 2 5
      mec-im/src/main/java/com/ym/dao/UserDao.java
  93. 9 10
      mec-im/src/main/java/com/ym/dao/WhiteboardDao.java
  94. 6 1
      mec-im/src/main/java/com/ym/service/Impl/HereWhiteServiceImpl.java
  95. 271 365
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  96. 28 36
      mec-im/src/main/java/com/ym/service/RoomService.java
  97. 36 31
      mec-student/src/main/java/com/ym/mec/student/config/ResourceServerConfig.java
  98. 8 5
      mec-student/src/main/java/com/ym/mec/student/controller/ContractsController.java
  99. 0 3
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  100. 47 17
      mec-student/src/main/java/com/ym/mec/student/controller/RepairController.java

+ 0 - 1
cms/src/main/java/com/ym/mec/cms/controller/NewsController.java

@@ -45,7 +45,6 @@ public class NewsController extends BaseController {
 	@ApiOperation("资讯列表分页查询")
 	@GetMapping(value = "/homeList")
 	public Object getHomeList(NewsInformationQueryInfo queryInfo) {
-		queryInfo.setRows(5);
 		SysUser user = sysUserFeignService.queryUserInfo();
 		return succeed(sysNewsInformationService.getHomeList(user, queryInfo));
 	}

+ 8 - 8
codegen/src/main/resources/generateConfigration.xml

@@ -2,16 +2,16 @@
 <GenerateConfiguration>
 	<dbConfiguration>
 		<driverClass>com.mysql.jdbc.Driver</driverClass>
-		<url>jdbc:mysql://47.114.176.40:3306/edu_saas</url>
-		<username>edu_saas</username>
+		<url>jdbc:mysql://47.114.1.200:3306/mec_dev</url>
+		<username>mec_dev</username>
 		<password>dayaDataOnline@2019</password>
-		<catalog>edu_saas</catalog>
-		<schema>edu_saas</schema>
+		<catalog>mec_dev</catalog>
+		<schema>mec_dev</schema>
 	</dbConfiguration>
-	<srcBase>e:/javabean</srcBase>
-	<pojoPackageName>com.keao.edu.datasource.dal.entity</pojoPackageName>
-	<daoPackageName>com.keao.edu.datasource.dal.dao</daoPackageName>
-	<servicePackageName>com.keao.edu.datasource.service</servicePackageName>
+	<srcBase>d:/javabean</srcBase>
+	<pojoPackageName>com.ym.mec.biz.dal.entity</pojoPackageName>
+	<daoPackageName>com.ym.mec.biz.dal.dao</daoPackageName>
+	<servicePackageName>com.ym.mec.biz.service</servicePackageName>
 	<sqlmapPackageName>resources</sqlmapPackageName>
 	<sqlmapConfigPackageName>resources/config</sqlmapConfigPackageName>
 </GenerateConfiguration>

+ 9 - 6
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java

@@ -15,6 +15,8 @@ import com.ym.mec.common.security.SecurityUtils;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.thirdparty.eseal.ESealPlugin;
+import com.ym.mec.thirdparty.user.realname.RealnameAuthenticationPluginContext;
+import com.ym.mec.thirdparty.user.realname.provider.LinkfaceRealnameAuthenticationPlugin;
 import com.ym.mec.util.date.DateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -23,6 +25,7 @@ import io.swagger.annotations.ApiOperation;
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.MediaType;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@@ -48,6 +51,10 @@ public class UserController extends BaseController {
 	private IdGeneratorService smsCodeService;
 	@Autowired
 	private ESealPlugin eSealPlugin;
+	@Value("${message.debugMode}")
+	private boolean debugMode;
+	@Autowired
+	private RealnameAuthenticationPluginContext realnameAuthenticationPluginContext;
 
 	@ApiOperation(value = "分页查询用户信息")
 	@ApiImplicitParams({ @ApiImplicitParam(name = "userType", value = "用户类型", required = false, dataType = "String"),
@@ -231,12 +238,8 @@ public class UserController extends BaseController {
 				throw new BizException("出生日期不可超过当前时间");
 			}
 
-			String accountId = eSealPlugin.createUserAccount(
-					sysUser.getRealName(),
-					sysUser.getIdCardNo(),
-					user.getUsername().split(":")[1]);
-			if (StringUtils.isBlank(accountId)) {
-				throw new BizException("用户信息错误");
+			if(!debugMode){
+				realnameAuthenticationPluginContext.getRealnameAuthenticationPlugin(LinkfaceRealnameAuthenticationPlugin.getName()).verify(sysUser.getRealName(), sysUser.getIdCardNo());
 			}
 
 			sysUserService.updateBaseInfo(sysUser);

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

@@ -820,7 +820,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @param courseScheduleId
      * @return
      */
-    List<Map<Integer, String>> findStudentMap(Integer courseScheduleId);
+    List<Map<Integer, String>> findStudentMap(Long courseScheduleId);
 
     List<CourseSchedule> findAllCourseSches();
 
@@ -1241,7 +1241,7 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @param courseSchedule
      * @return
      */
-    CourseSchedule queryContinueCourse(@Param("courseSchedule") CourseSchedule courseSchedule,
+    CourseSchedule queryStudentContinueCourse(@Param("courseSchedule") CourseSchedule courseSchedule,
                                        @Param("continueCourseTime") String continueCourseTime, @Param("endDateTime") String endDateTime);
 
     /**
@@ -1251,8 +1251,8 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @param courseSchedule
      * @return
      */
-    CourseSchedule queryRepairContinueCourse(@Param("courseSchedule") CourseSchedule courseSchedule,
-                                             @Param("continueCourseTime") String continueCourseTime, @Param("endDateTime") String endDateTime);
+    CourseSchedule queryTeacherContinueCourse(@Param("courseSchedule") CourseSchedule courseSchedule,
+                                       @Param("continueCourseTime") String continueCourseTime, @Param("endDateTime") String endDateTime);
 
     /**
      * 获取单节课时长

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -115,6 +115,17 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
                                                                               @Param("userId") Integer userId);
 
     /**
+     * @describe 统计团体下为开始课程学生数量
+     * @author Joburgess
+     * @date 2020.09.27
+     * @param groupId:
+     * @param groupType:
+     * @return int
+     */
+    int countNotStartCourseStudentNumWithGroup(@Param("groupId") String groupId,
+                                      @Param("groupType") GroupType groupType);
+
+    /**
      * @param vipGroupId: 小课编号
      * @param teachMode:  教学形式
      * @return java.math.BigDecimal

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

@@ -1,6 +1,6 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.CalenderPushDto;
 import com.ym.mec.biz.dal.dto.MusicCardDto;
 import com.ym.mec.biz.dal.dto.MusicGroupRegisterDto;
 import com.ym.mec.biz.dal.dto.RegisterSubjectDto;
@@ -282,4 +282,38 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
      * @return java.util.List<com.ym.mec.biz.dal.dto.MusicCardDto>
      */
     List<MusicCardDto> queryOrganMusicInfos(@Param("organId") Integer organId);
+
+    /**
+     * @describe 获取学员第一个教务老师
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/24
+     * @time 10:27
+     * @param userId:
+     * @return java.lang.Integer
+     */
+    Integer getFirstEduTeacherId(@Param("userId") Integer userId);
+
+    /**
+     * @describe 获取学员关联的乐团
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/28
+     * @time 13:47
+     * @param studentId:
+     * @return com.ym.mec.biz.dal.entity.MusicGroup
+     */
+    MusicGroup getStuMusic(Integer studentId);
+
+    /**
+     * @describe 获取学员和乐团关联的乐团
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/28
+     * @time 13:54
+     * @param studentId:
+     * @param educationalTeacherId:
+     * @return com.ym.mec.biz.dal.entity.MusicGroup
+     */
+    MusicGroup getStuEduMusic(@Param("studentId") Integer studentId, @Param("educationalTeacherId") Integer educationalTeacherId);
 }

+ 38 - 5
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentCalenderDao.java

@@ -1,10 +1,8 @@
 package com.ym.mec.biz.dal.dao;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
+import com.ym.mec.biz.dal.dto.CalenderPushDto;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
@@ -69,7 +67,7 @@ public interface MusicGroupPaymentCalenderDao extends BaseDAO<Long, MusicGroupPa
      * @return
      */
     int queryIntersectionByPaymentDate(@Param("musicGroupId") String musicGroupId, @Param("startPaymentDate") Date startPaymentDate,
-                                       @Param("deadlinePaymentDate") Date deadlinePaymentDate);
+                                       @Param("deadlinePaymentDate") Date deadlinePaymentDate,@Param("calenderId") Long calenderId);
 
     /**
      * 统计预计缴费人数
@@ -95,4 +93,39 @@ public interface MusicGroupPaymentCalenderDao extends BaseDAO<Long, MusicGroupPa
     MusicGroupPaymentCalender getLastStartOne(@Param("musicGroupId") String musicGroupId);
 
     int queryIntersectionByDate(@Param("musicGroupId") String musicGroupId, @Param("startTime") String startTime, @Param("endTime") String endTime);
+
+    /**
+     * @describe 根据指定乐团的有效日期查询交集
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/21
+     * @time 10:46
+     * @param musicGroupId:
+     * @param paymentValidStartDate:
+     * @param paymentValidEndDate:
+     * @return int
+     */
+    int queryIntersectionByValidDate(@Param("musicGroupId") String musicGroupId,
+                                     @Param("paymentValidStartDate") String paymentValidStartDate,
+                                     @Param("paymentValidEndDate") String paymentValidEndDate,
+                                     @Param("calenderId") Long calenderId);
+
+    /**
+     * @describe 获取指定时间后的缴费信息
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/21
+     * @time 17:35
+     * @param configValue:
+     * @return void
+     */
+    List<Map<Long, Long>> queryCalenderByDay(@Param("configValue") String configValue, @Param("format") String format);
+
+    List<MusicGroupPaymentCalender> queryByIds(@Param("calenderId") Set<Long> calenderId);
+
+    List<Long> queryEndIds(@Param("configValue") String configValue, @Param("format") String format);
+
+    List<CalenderPushDto> getCalenderPushDto(@Param("calenderIds") Collection<Long> calenderIds);
+
+    List<CalenderPushDto> getMusicCalenderPushDto(@Param("configValue") String configValue, @Param("format") String format);
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupStudentFeeDao.java

@@ -209,4 +209,14 @@ public interface MusicGroupStudentFeeDao extends BaseDAO<Long, MusicGroupStudent
 	 * @param paymentStatus
 	 */
 	void updatePaymentStatus(@Param("calenderId") Long calenderId, @Param("paymentStatus") String paymentStatus);
+
+	/**
+	 * @describe 将缴费截止的缴费状态更改为未缴费
+	 * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+	 * @author zouxuan
+	 * @date 2020/9/21
+	 * @time 14:34
+	 * @return void
+	 */
+    void updateFeeStatus();
 }

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SellOrderDao.java

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.entity.SellOrder;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -110,4 +111,20 @@ public interface SellOrderDao extends BaseDAO<Integer, SellOrder> {
      * @return
      */
     List<OperatingReport> getOutOrderIncome(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
+
+    /**
+     * 获取订单的销售成本
+     *
+     * @param orderId
+     * @return
+     */
+    BigDecimal getOrderSellCost(@Param("orderId") Long orderId);
+
+    /**
+     * 获取声部更换的销售、总收入
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<OperatingReport> getSubjectChangeMonthReport(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
 }

+ 11 - 8
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java

@@ -271,14 +271,6 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
                       @Param("groupType")GroupType groupType);
 
     /**
-     * 连堂课签到,签退
-     * @param courseScheduleId
-     * @param startDateTime
-     * @param endDateTime
-     */
-    void cuntinueCourseSign(@Param("courseScheduleId")Long courseScheduleId,@Param("startDateTime")Date startDateTime,@Param("endDateTime")Date endDateTime);
-
-    /**
      * 清除学员签退信息
      * @param courseId
      * @param userId
@@ -293,4 +285,15 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
      * @return java.util.List<com.ym.mec.biz.dal.entity.StudentAttendance>
      */
     List<StudentAttendance> getWithCoursesAndExcludeQuitStudent(@Param("courseIds") List<Long> courseIds);
+
+    /**
+     * @describe 获取学员连堂课第一次签到的课程
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/27
+     * @time 10:00
+     * @param courseScheduleId:
+     * @return java.lang.Long
+     */
+    Long findFirstSign(@Param("courseScheduleId") Long courseScheduleId, @Param("userId") Integer userId);
 }

+ 49 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentGoodsSellDao.java

@@ -0,0 +1,49 @@
+package com.ym.mec.biz.dal.dao;
+
+
+import com.ym.mec.biz.dal.dto.StudentGoodsSellDto;
+import com.ym.mec.biz.dal.entity.StudentGoodsSell;
+import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface StudentGoodsSellDao extends BaseDAO<Integer, StudentGoodsSell> {
+
+
+    /**
+     * @describe 获取教务老师关联的学员商品订单
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/23
+     * @time 14:00
+     * @param params:
+     * @return int
+     */
+    int countStudentGoodsOrders(Map<String, Object> params);
+
+    /**
+     * @describe 获取教务老师关联的学员商品订单
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/23
+     * @time 14:01
+     * @param params:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentGoodsSellDto>
+     */
+    List<StudentGoodsSellDto> queryStudentGoodsOrders(Map<String, Object> params);
+
+    /**
+     * @describe 根据订单编号获取学员商品订单
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/23
+     * @time 17:04
+     * @param orderNo:
+     * @return com.ym.mec.biz.dal.entity.StudentGoodsSell
+     */
+    StudentGoodsSell findByOrderNo(@Param("orderNo") String orderNo);
+
+    StudentGoodsSellDto getStudentGoodsSellDto(String orderNo);
+}

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

@@ -74,6 +74,7 @@ public interface StudentPaymentOrderDetailDao extends BaseDAO<Long, StudentPayme
 
     /**
      * 获取订单商品
+     *
      * @param orderId
      * @return
      */
@@ -81,15 +82,31 @@ public interface StudentPaymentOrderDetailDao extends BaseDAO<Long, StudentPayme
 
     /**
      * 获取订单详细
+     *
      * @param orderId
      * @return
      */
     List<StudentPaymentOrderDetail> getOrderDetail(@Param("orderId") Long orderId);
 
     /**
-     *
      * @param orderId
      * @return
      */
     List<String> getOrderDetailType(@Param("orderId") Long orderId);
+
+    /**
+     * 获取学生乐团报名购买的乐器信息
+     *
+     * @param studentId
+     * @param musicGroupId
+     * @return
+     */
+    List<StudentPaymentOrderDetail> getStudentApplyDetail(@Param("studentId") Integer studentId, @Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 获取购买乐器的方式
+     * @param paymentOrderNo
+     * @return
+     */
+    List<Map<Long, String>> queryPurchaseTypeMap(@Param("paymentOrderNo") List<Long> paymentOrderNo);
 }

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

@@ -347,9 +347,12 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
 
     /**
      * 获取老师对应乐团的学生
+     *
      * @param musicGroupId
      * @param teacherId
      * @return
      */
     List<StudentRegistration> getMusicGroupStu4Teacher(@Param("musicGroupId") String musicGroupId, @Param("teacherId") Integer teacherId);
+
+    StudentRegistration getStudentRegister(@Param("musicGroupId") String musicGroupId, @Param("studentId") Integer studentId);
 }

+ 33 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRepairDao.java

@@ -65,4 +65,37 @@ public interface StudentRepairDao extends com.ym.mec.common.dal.BaseDAO<Integer,
      * @return
      */
     BasicUserDto getStudentOrganRepairer(@Param("organId") Integer organId);
+
+    /**
+     * @describe 获取商品购买教务老师关联的学员列表
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/28
+     * @time 11:29
+     * @param params:
+     * @return int
+     */
+    int countEduStudents(Map<String, Object> params);
+
+    /**
+     * @describe 获取商品购买教务老师关联的学员列表
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/28
+     * @time 11:30
+     * @param params:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.BasicUserDto>
+     */
+    List<BasicUserDto> queryEduStudents(Map<String, Object> params);
+
+    /**
+     * @describe 获取学生关联的所有教务老师列表
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/28
+     * @time 13:35
+     * @param studentId:
+     * @return int
+     */
+    List<Integer> countStuEducation(@Param("studentId") Integer studentId);
 }

+ 68 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SubjectChangeDao.java

@@ -0,0 +1,68 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.SubjectChange;
+import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface SubjectChangeDao extends BaseDAO<Integer, SubjectChange> {
+
+
+    /**
+     * 获取学生最后一次乐器替换记录
+     *
+     * @param studentId
+     * @param musicGroupId
+     * @return
+     */
+    SubjectChange getStudentLastChange(@Param("studentId") Integer studentId, @Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 获取更换详情
+     *
+     * @param id
+     * @return
+     */
+    SubjectChange getChangeInfo(@Param("id") Integer id);
+
+    /**
+     * 获取待支付的的声部更换列表
+     *
+     * @param musicGroupId
+     * @return
+     */
+    List<SubjectChange> getMusicGroupWaitPay(@Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 获取声部更换列表
+     *
+     * @param params
+     * @return
+     */
+    List<SubjectChange> getPageList(Map<String, Object> params);
+
+    /**
+     * 获取更换的乐器辅件
+     *
+     * @param musicGroupId
+     * @return
+     */
+    SubjectChange getChangeGoods(@Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 获取用户换取的乐器辅件
+     * @param musicGroupId
+     * @return
+     */
+    List<SubjectChange> getStudentGoods(@Param("musicGroupId") String musicGroupId);
+
+    /**
+     * 获取学生待支付的声部更改
+     * @param studentId
+     * @param musicGroupId
+     * @return
+     */
+    SubjectChange getStudentWaitPay(@Param("studentId") Integer studentId, @Param("musicGroupId") String musicGroupId);
+}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherAttendanceDao.java

@@ -246,4 +246,15 @@ public interface TeacherAttendanceDao extends BaseDAO<Long, TeacherAttendance> {
 	 * @return
 	 */
     Integer getAttendClassTime(Integer courseScheduleId);
+
+    /**
+     * @describe 获取连堂课里第一次签到的课程
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/26
+     * @time 16:58
+     * @param currentScheduleId:
+     * @return java.lang.Long
+     */
+	Long findFirstSign(@Param("currentScheduleId") Long currentScheduleId, @Param("userId") Integer userId);
 }

+ 64 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CalenderPushDto.java

@@ -0,0 +1,64 @@
+package com.ym.mec.biz.dal.dto;
+
+public class CalenderPushDto{
+
+    private Long calenderId;
+
+    private Integer teacherId;
+
+    private String teacherPhone;
+
+    private String musicGroupName;
+
+    private String paymentValidStartDate;
+
+    private String paymentValidEndDate;
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public Long getCalenderId() {
+        return calenderId;
+    }
+
+    public void setCalenderId(Long calenderId) {
+        this.calenderId = calenderId;
+    }
+
+    public String getTeacherPhone() {
+        return teacherPhone;
+    }
+
+    public void setTeacherPhone(String teacherPhone) {
+        this.teacherPhone = teacherPhone;
+    }
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
+    public String getPaymentValidStartDate() {
+        return paymentValidStartDate;
+    }
+
+    public void setPaymentValidStartDate(String paymentValidStartDate) {
+        this.paymentValidStartDate = paymentValidStartDate;
+    }
+
+    public String getPaymentValidEndDate() {
+        return paymentValidEndDate;
+    }
+
+    public void setPaymentValidEndDate(String paymentValidEndDate) {
+        this.paymentValidEndDate = paymentValidEndDate;
+    }
+}

+ 62 - 16
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/GoodsSellDto.java

@@ -2,37 +2,83 @@ package com.ym.mec.biz.dal.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 
+import java.math.BigDecimal;
+
 public class GoodsSellDto{
-	@ApiModelProperty(value = "使用余额", required = false)
-	private Boolean isUseBalancePayment;
+	@ApiModelProperty(value = "商品数量", required = false)
+	private Integer goodsNum = 1;
+
+	@ApiModelProperty(value = "商品编号", required = false)
+	private Integer goodsId;
+
+	@ApiModelProperty(value = "商品图片", required = false)
+	private String image;
+
+	@ApiModelProperty(value = "商品名称", required = false)
+	private String goodsName;
+
+	@ApiModelProperty(value = "商品销售类型", required = false)
+	private String goodsType;
+
+	@ApiModelProperty(value = "商品销售价", required = false)
+	private BigDecimal goodsPrice = BigDecimal.ZERO;
 
-	@ApiModelProperty(value = "商品列表", required = false)
-	String goodsId;
+	@ApiModelProperty(value = "商品销售总价", required = false)
+	private BigDecimal totalGoodsPrice = BigDecimal.ZERO;
 
-	@ApiModelProperty(value = "是否重复支付", required = false)
-	private boolean isRepeatPay;
+	public String getGoodsType() {
+		return goodsType;
+	}
+
+	public void setGoodsType(String goodsType) {
+		this.goodsType = goodsType;
+	}
+
+	public BigDecimal getTotalGoodsPrice() {
+		return totalGoodsPrice;
+	}
+
+	public void setTotalGoodsPrice(BigDecimal totalGoodsPrice) {
+		this.totalGoodsPrice = totalGoodsPrice;
+	}
+
+	public BigDecimal getGoodsPrice() {
+		return goodsPrice;
+	}
+
+	public void setGoodsPrice(BigDecimal goodsPrice) {
+		this.goodsPrice = goodsPrice;
+	}
+
+	public String getImage() {
+		return image;
+	}
+
+	public void setImage(String image) {
+		this.image = image;
+	}
 
-	public boolean getIsRepeatPay() {
-		return isRepeatPay;
+	public String getGoodsName() {
+		return goodsName;
 	}
 
-	public void setIsRepeatPay(boolean repeatPay) {
-		isRepeatPay = repeatPay;
+	public void setGoodsName(String goodsName) {
+		this.goodsName = goodsName;
 	}
 
-	public Boolean getIsUseBalancePayment() {
-		return isUseBalancePayment;
+	public Integer getGoodsNum() {
+		return goodsNum;
 	}
 
-	public void setIsUseBalancePayment(Boolean useBalancePayment) {
-		isUseBalancePayment = useBalancePayment;
+	public void setGoodsNum(Integer goodsNum) {
+		this.goodsNum = goodsNum;
 	}
 
-	public String getGoodsId() {
+	public Integer getGoodsId() {
 		return goodsId;
 	}
 
-	public void setGoodsId(String goodsId) {
+	public void setGoodsId(Integer goodsId) {
 		this.goodsId = goodsId;
 	}
 }

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

@@ -29,6 +29,8 @@ public class PracticeBuyResultDto {
 
     private String type;
 
+    private Object detail;
+
     public String getOrderNo() {
         return orderNo;
     }
@@ -100,4 +102,12 @@ public class PracticeBuyResultDto {
     public void setType(String type) {
         this.type = type;
     }
+
+    public Object getDetail() {
+        return detail;
+    }
+
+    public void setDetail(Object detail) {
+        this.detail = detail;
+    }
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentApplyDetailDto.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.dto;
 
+import com.ym.mec.biz.dal.entity.SubjectChange;
 import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
 import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
@@ -58,6 +59,9 @@ public class StudentApplyDetailDto{
     @ApiModelProperty(value = "备注",required = false)
     private String remark;
 
+    @ApiModelProperty(value = "声部更换详情",required = false)
+    private SubjectChange subjectChange;
+
     public KitGroupPurchaseTypeEnum getKitGroupPurchaseTypeEnum() {
         return kitGroupPurchaseTypeEnum;
     }
@@ -177,4 +181,12 @@ public class StudentApplyDetailDto{
     public void setId(Long id) {
         this.id = id;
     }
+
+    public SubjectChange getSubjectChange() {
+        return subjectChange;
+    }
+
+    public void setSubjectChange(SubjectChange subjectChange) {
+        this.subjectChange = subjectChange;
+    }
 }

+ 58 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentGoodsSellDto.java

@@ -0,0 +1,58 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+
+import java.math.BigDecimal;
+
+public class StudentGoodsSellDto extends StudentPaymentOrder {
+
+    private String goodsJson;
+
+    private String userName;
+
+    private Integer authorUser;
+
+    private BigDecimal totalAmount = BigDecimal.ZERO;
+
+    private BigDecimal marketAmount = BigDecimal.ZERO;
+
+    public Integer getAuthorUser() {
+        return authorUser;
+    }
+
+    public void setAuthorUser(Integer authorUser) {
+        this.authorUser = authorUser;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getGoodsJson() {
+        return goodsJson;
+    }
+
+    public void setGoodsJson(String goodsJson) {
+        this.goodsJson = goodsJson;
+    }
+
+    public BigDecimal getTotalAmount() {
+        return totalAmount;
+    }
+
+    public void setTotalAmount(BigDecimal totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+
+    public BigDecimal getMarketAmount() {
+        return marketAmount;
+    }
+
+    public void setMarketAmount(BigDecimal marketAmount) {
+        this.marketAmount = marketAmount;
+    }
+}

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

@@ -16,6 +16,8 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
 
     private BigDecimal courseFee;
 
+    private BigDecimal highOnlineCourseFee;
+
     //乐器费用
     private BigDecimal musicalFee;
 
@@ -183,4 +185,12 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     public void setRouteBalance(BigDecimal routeBalance) {
         this.routeBalance = routeBalance;
     }
+
+    public BigDecimal getHighOnlineCourseFee() {
+        return highOnlineCourseFee;
+    }
+
+    public void setHighOnlineCourseFee(BigDecimal highOnlineCourseFee) {
+        this.highOnlineCourseFee = highOnlineCourseFee;
+    }
 }

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

@@ -6,6 +6,7 @@ import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.biz.dal.enums.SalarySettlementTypeEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.util.Date;
@@ -86,6 +87,15 @@ public class MusicGroup {
 	/** 缴费截止日期 */
 	@ApiModelProperty(value = "乐团缴费截止日期",required = false)
 	private java.util.Date paymentExpireDate;
+
+	@ApiModelProperty(value = "缴费有效期开始时间", required = false)
+	private String paymentValidStartDate;
+
+	@ApiModelProperty(value = "缴费有效期结束时间", required = false)
+	private String paymentValidEndDate;
+
+	@ApiModelProperty(value = "缴费方式0按月,1按季,2一次性", required = false)
+	private Integer paymentPattern;
 	
 	/** 计费开始日期 */
 	@ApiModelProperty(value = "乐团计费开始日期 ",required = false)
@@ -156,6 +166,32 @@ public class MusicGroup {
 
 	private Boolean hasVerifyMusicalList = false;
 
+	public Integer getPaymentPattern() {
+		return paymentPattern;
+	}
+
+	public void setPaymentPattern(Integer paymentPattern) {
+		this.paymentPattern = paymentPattern;
+	}
+
+	public String getPaymentValidStartDate() {
+		return paymentValidStartDate;
+	}
+
+	public void setPaymentValidStartDate(String paymentValidStartDate) {
+		this.paymentValidStartDate = paymentValidStartDate;
+	}
+
+	public String getPaymentValidEndDate() {
+		return paymentValidEndDate;
+	}
+
+	public void setPaymentValidEndDate(String paymentValidEndDate) {
+		if(StringUtils.isNotEmpty(paymentValidEndDate)){
+			this.paymentValidEndDate = paymentValidEndDate;
+		}
+	}
+
 	public String getSubjectName() {
 		return subjectName;
 	}

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

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.entity;
 import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
 import com.ym.mec.common.enums.BaseEnum;
 import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.util.Date;
@@ -43,23 +44,32 @@ public class MusicGroupPaymentCalender implements Comparable<MusicGroupPaymentCa
 		}
 	}
 
-	/**  */
 	private Long id;
 
-	/**  */
 	@ApiModelProperty(value = "乐团编号", required = false)
 	private String musicGroupId;
 
-	/** 缴费月份 */
 	@ApiModelProperty(value = "缴费月份", required = false)
 	private Integer paymentMonth;
 
-	/** 开始缴费日期 */
 	@ApiModelProperty(value = "开始缴费日期", required = false)
 	private java.util.Date startPaymentDate;
 
+	@ApiModelProperty(value = "截止缴费日期", required = false)
 	private Date deadlinePaymentDate;
 
+	@ApiModelProperty(value = "缴费有效期开始时间", required = false)
+	private String paymentValidStartDate;
+
+	@ApiModelProperty(value = "缴费有效期截止时间", required = false)
+	private String paymentValidEndDate;
+
+	@ApiModelProperty(value = "缴费方式0按月,1按季,2一次性", required = false)
+	private Integer paymentPattern;
+
+	@ApiModelProperty(value = "缴费类型0续费,1报名", required = false)
+	private Integer paymentType;
+
 	private PaymentStatusEnum paymentStatus;
 
 	private Integer expectNum;
@@ -70,14 +80,46 @@ public class MusicGroupPaymentCalender implements Comparable<MusicGroupPaymentCa
 
 	private FeeType type;
 
-	/**  */
 	private java.util.Date createTime;
 
-	/**  */
 	private java.util.Date updateTime;
 
 	private String studentIds;
 
+	public Integer getPaymentType() {
+		return paymentType;
+	}
+
+	public void setPaymentType(Integer paymentType) {
+		this.paymentType = paymentType;
+	}
+
+	public Integer getPaymentPattern() {
+		return paymentPattern;
+	}
+
+	public void setPaymentPattern(Integer paymentPattern) {
+		this.paymentPattern = paymentPattern;
+	}
+
+	public String getPaymentValidStartDate() {
+		return paymentValidStartDate;
+	}
+
+	public void setPaymentValidStartDate(String paymentValidStartDate) {
+		this.paymentValidStartDate = paymentValidStartDate;
+	}
+
+	public String getPaymentValidEndDate() {
+		return paymentValidEndDate;
+	}
+
+	public void setPaymentValidEndDate(String paymentValidEndDate) {
+		if(StringUtils.isNotEmpty(paymentValidEndDate)){
+			this.paymentValidEndDate = paymentValidEndDate;
+		}
+	}
+
 	public String getStudentIds() {
 		return studentIds;
 	}

+ 28 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SellOrder.java

@@ -12,6 +12,15 @@ public class SellOrder {
     private Integer id;
 
     /**
+     * 教务id
+     */
+    @ApiModelProperty(value="教务id")
+    private Integer eduTeacherId;
+
+    @ApiModelProperty(value="教务老师")
+    private String eduTeacher;
+
+    /**
     * 分部id
     */
     @ApiModelProperty(value="分部id")
@@ -53,19 +62,19 @@ public class SellOrder {
     * 应付金额
     */
     @ApiModelProperty(value="应付金额")
-    private BigDecimal expectAmount;
+    private BigDecimal expectAmount = BigDecimal.ZERO;
 
     /**
     * 现金支付金额
     */
     @ApiModelProperty(value="现金支付金额")
-    private BigDecimal actualAmount;
+    private BigDecimal actualAmount = BigDecimal.ZERO;
 
     /**
     * 余额支付金额
     */
     @ApiModelProperty(value="余额支付金额")
-    private BigDecimal balanceAmount;
+    private BigDecimal balanceAmount = BigDecimal.ZERO;
 
     /**
     * 销售成本
@@ -342,4 +351,20 @@ public class SellOrder {
     public void setSchoolName(String schoolName) {
         this.schoolName = schoolName;
     }
+
+    public Integer getEduTeacherId() {
+        return eduTeacherId;
+    }
+
+    public void setEduTeacherId(Integer eduTeacherId) {
+        this.eduTeacherId = eduTeacherId;
+    }
+
+    public String getEduTeacher() {
+        return eduTeacher;
+    }
+
+    public void setEduTeacher(String eduTeacher) {
+        this.eduTeacher = eduTeacher;
+    }
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentAttendance.java

@@ -30,6 +30,10 @@ public class StudentAttendance {
 	/** 课程计划 */
 	@ApiModelProperty(value = "课程计划",required = false)
 	private Long courseScheduleId;
+
+	/** 课程计划 */
+	@ApiModelProperty(value = "课程计划",required = false)
+	private Long currentScheduleId;
 	
 	/**  */
 	@ApiModelProperty(value = "学生编号",required = false)
@@ -72,6 +76,14 @@ public class StudentAttendance {
 	@ApiModelProperty(value = "当前课时")
 	private Integer currentClassTimes;
 
+	public Long getCurrentScheduleId() {
+		return currentScheduleId;
+	}
+
+	public void setCurrentScheduleId(Long currentScheduleId) {
+		this.currentScheduleId = currentScheduleId;
+	}
+
 	public Date getSignInTime() {
 		return signInTime;
 	}

+ 205 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentGoodsSell.java

@@ -0,0 +1,205 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.ym.mec.biz.dal.dto.GoodsSellDto;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 对应数据库表(student_goods_sell):
+ */
+public class StudentGoodsSell {
+
+	private Integer id;
+	
+	@ApiModelProperty(value = "用户编号",required = true)
+	private Integer userId;
+
+	@ApiModelProperty(value = "学生名称",required = true)
+	private String userName;
+	
+	@ApiModelProperty(value = "教师编号",required = true)
+	private Integer teacherId;
+	
+	@ApiModelProperty(value = "商品列表",required = true)
+	private String goodsJson;
+
+	@ApiModelProperty(value = "订单编号",required = true)
+	private String orderNo;
+	
+	@ApiModelProperty(value = "总金额",required = true)
+	private java.math.BigDecimal totalAmount = BigDecimal.ZERO;
+	
+	@ApiModelProperty(value = "减免费用",required = true)
+	private java.math.BigDecimal marketAmount = BigDecimal.ZERO;
+
+	private Date createTime;
+
+	private Date updateTime;
+
+	@ApiModelProperty(value = "是否使用余额",required = true)
+	private boolean isUseBalancePayment = false;
+
+	@ApiModelProperty(value = "是否重复支付",required = true)
+	private boolean isRepeatPay;
+
+	@ApiModelProperty(value = "商品列表",required = true)
+	private List<GoodsSellDto> goodsSellDtos;
+
+	@ApiModelProperty(value = "支付类型",required = true)
+	private Integer type = 0;
+
+	@ApiModelProperty(value = "分部编号", required = false)
+	private Integer organId;
+
+	@ApiModelProperty(value = "创建人编号", required = false)
+	private Integer authorUser;
+
+	@ApiModelProperty(value = "合作单位编号", required = false)
+	private Integer cooperationOrganId;
+
+	public Integer getCooperationOrganId() {
+		return cooperationOrganId;
+	}
+
+	public void setCooperationOrganId(Integer cooperationOrganId) {
+		this.cooperationOrganId = cooperationOrganId;
+	}
+
+	public Integer getAuthorUser() {
+		return authorUser;
+	}
+
+	public void setAuthorUser(Integer authorUser) {
+		this.authorUser = authorUser;
+	}
+
+	public String getUserName() {
+		return userName;
+	}
+
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+
+	public Integer getOrganId() {
+		return organId;
+	}
+
+	public void setOrganId(Integer organId) {
+		this.organId = organId;
+	}
+
+	public Integer getType() {
+		return type;
+	}
+
+	public void setType(Integer type) {
+		this.type = type;
+	}
+
+	public List<GoodsSellDto> getGoodsSellDtos() {
+		return goodsSellDtos;
+	}
+
+	public void setGoodsSellDtos(List<GoodsSellDto> goodsSellDtos) {
+		this.goodsSellDtos = goodsSellDtos;
+	}
+
+	public String getOrderNo() {
+		return orderNo;
+	}
+
+	public void setOrderNo(String orderNo) {
+		this.orderNo = orderNo;
+	}
+
+	public boolean getIsRepeatPay() {
+		return isRepeatPay;
+	}
+
+	public void setIsRepeatPay(boolean repeatPay) {
+		isRepeatPay = repeatPay;
+	}
+
+	public boolean getIsUseBalancePayment() {
+		return isUseBalancePayment;
+	}
+
+	public void setIsUseBalancePayment(boolean useBalancePayment) {
+		isUseBalancePayment = useBalancePayment;
+	}
+
+	public Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public void setId(Integer id){
+		this.id = id;
+	}
+	
+	public Integer getId(){
+		return this.id;
+	}
+			
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+	
+	public Integer getUserId(){
+		return this.userId;
+	}
+			
+	public void setTeacherId(Integer teacherId){
+		this.teacherId = teacherId;
+	}
+	
+	public Integer getTeacherId(){
+		return this.teacherId;
+	}
+			
+	public void setGoodsJson(String goodsJson){
+		this.goodsJson = goodsJson;
+	}
+	
+	public String getGoodsJson(){
+		return this.goodsJson;
+	}
+			
+	public void setTotalAmount(java.math.BigDecimal totalAmount){
+		this.totalAmount = totalAmount;
+	}
+	
+	public java.math.BigDecimal getTotalAmount(){
+		return this.totalAmount;
+	}
+			
+	public void setMarketAmount(java.math.BigDecimal marketAmount){
+		this.marketAmount = marketAmount;
+	}
+	
+	public java.math.BigDecimal getMarketAmount(){
+		return this.marketAmount;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

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

@@ -43,22 +43,22 @@ public class StudentPaymentOrder {
 	
 	/** 预计金额 */
 	@ApiModelProperty(value = "预计金额",required = true)
-	private BigDecimal expectAmount;
+	private BigDecimal expectAmount = BigDecimal.ZERO;
 	
 	/** 实际金额 */
 	@ApiModelProperty(value = "实际金额",required = true)
-	private BigDecimal actualAmount;
+	private BigDecimal actualAmount = BigDecimal.ZERO;
 
 	/** 公户金额 */
 	@ApiModelProperty(value = "公户金额",required = true)
-	private BigDecimal comAmount;
+	private BigDecimal comAmount = BigDecimal.ZERO;
 
 	/** 私户金额 */
 	@ApiModelProperty(value = "私户金额",required = true)
-	private BigDecimal perAmount;
+	private BigDecimal perAmount = BigDecimal.ZERO;
 	
 	@ApiModelProperty(value = "余额付款金额",required = true)
-	private BigDecimal balancePaymentAmount;
+	private BigDecimal balancePaymentAmount = BigDecimal.ZERO;
 	
 	/** 交易流水号 */
 	@ApiModelProperty(value = "交易流水号",required = true)

+ 558 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SubjectChange.java

@@ -0,0 +1,558 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
+import com.ym.mec.biz.dal.enums.SubjectChangeStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@ApiModel(value = "com-ym-SubjectChange")
+public class SubjectChange {
+    @ApiModelProperty(value = "")
+    private Integer id;
+
+    @ApiModelProperty(value = "合作单位id")
+    private Integer cooperationOrganId;
+
+    @ApiModelProperty(value = "合作单位名称")
+    private String cooperationOrganName;
+
+    @ApiModelProperty(value = "教务id")
+    private Integer eduTeacherId;
+
+    @ApiModelProperty(value = "教务老师")
+    private String eduTeacher;
+
+    @ApiModelProperty(value = "学生id")
+    private Integer studentId;
+
+    private String studentName;
+
+    @ApiModelProperty(value = "分部id")
+    private Integer organId;
+
+    @ApiModelProperty(value = "分部名称")
+    private String organName;
+
+    @ApiModelProperty(value = "原始声部id")
+    private Integer originalSubjectId;
+
+    @ApiModelProperty(value = "乐团id")
+    private String musicGroupId;
+
+    @ApiModelProperty(value = "乐团名称")
+    private String musicGroupName;
+
+    /**
+     * 原始课程费用
+     */
+    @ApiModelProperty(value = "原始课程费用")
+    private BigDecimal originalCourseFee = BigDecimal.ZERO;
+
+    @ApiModelProperty(value = "乐器购买方式")
+    private KitGroupPurchaseTypeEnum kitGroupPurchaseType;
+
+    /**
+     * 原始乐器编号
+     */
+    @ApiModelProperty(value = "原始乐器编号")
+    private Integer originalMusical;
+
+    private Goods originalMusicalGoods;
+
+    /**
+     * 原始乐器价格
+     */
+    @ApiModelProperty(value = "原始乐器价格")
+    private BigDecimal originalMusicalPrice = BigDecimal.ZERO;
+
+    /**
+     * 辅件ids
+     */
+    @ApiModelProperty(value = "辅件ids")
+    private String originalAccessories;
+
+    private List<Goods> originalAccessoriesGoods;
+
+    /**
+     * 辅件价格
+     */
+    @ApiModelProperty(value = "辅件价格")
+    private BigDecimal originalAccessoriesPrice = BigDecimal.ZERO;
+
+    @ApiModelProperty(value = "替换声部id")
+    private Integer changeSubjectId;
+
+    /**
+     * 替换课程价格
+     */
+    @ApiModelProperty(value = "替换课程价格")
+    private BigDecimal changeCourseFee = BigDecimal.ZERO;
+
+    /**
+     * 替换乐器
+     */
+    @ApiModelProperty(value = "替换乐器")
+    private Integer changeMusical;
+
+    private Goods changeMusicalGoods;
+
+
+    /**
+     * 替换乐器价格
+     */
+    @ApiModelProperty(value = "替换乐器价格")
+    private BigDecimal changeMusicalPrice = BigDecimal.ZERO;
+
+    /**
+     * 替换辅件
+     */
+    @ApiModelProperty(value = "替换辅件")
+    private String changeAccessories;
+    private List<Goods> changeAccessoriesGoods;
+
+
+    /**
+     * 替换辅件价格
+     */
+    @ApiModelProperty(value = "替换辅件价格")
+    private BigDecimal changeAccessoriesPrice = BigDecimal.ZERO;
+
+    /**
+     * 乐器辅件差额
+     */
+    @ApiModelProperty(value = "乐器辅件差额")
+    private BigDecimal goodsMargin;
+
+    /**
+     * 课程差额
+     */
+    @ApiModelProperty(value = "课程差额")
+    private BigDecimal courseMargin;
+
+    /**
+     * 成本差额
+     */
+    @ApiModelProperty(value = "成本差额")
+    private BigDecimal costMargin;
+
+
+    /**
+     * 销售金额(计入销售的金额)
+     */
+    private BigDecimal sellAmount;
+
+    /**
+     * 状态
+     */
+    @ApiModelProperty(value = "状态")
+    private SubjectChangeStatusEnum status;
+
+    /**
+     * 订单id
+     */
+    private Integer orderId;
+
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 订单流水号
+     */
+    private String transNo;
+
+    /**
+     * 交易方式
+     */
+    @ApiModelProperty(value = "交易方式")
+    private String paymentChannel;
+
+    /**
+     * 收款账户
+     */
+    @ApiModelProperty(value = "收款账户")
+    private String merNo;
+
+    /**
+     * 销售时间
+     */
+    @ApiModelProperty(value = "销售时间")
+    private Date sellTime;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+
+    private Integer version;
+
+    @ApiModelProperty(value = "原始成本")
+    private BigDecimal originalCost = BigDecimal.ZERO;
+
+    @ApiModelProperty(value = "更改后成本")
+    private BigDecimal changeCost = BigDecimal.ZERO;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public BigDecimal getOriginalCourseFee() {
+        return originalCourseFee;
+    }
+
+    public void setOriginalCourseFee(BigDecimal originalCourseFee) {
+        this.originalCourseFee = originalCourseFee;
+    }
+
+    public Integer getOriginalMusical() {
+        return originalMusical;
+    }
+
+    public void setOriginalMusical(Integer originalMusical) {
+        this.originalMusical = originalMusical;
+    }
+
+    public BigDecimal getOriginalMusicalPrice() {
+        return originalMusicalPrice;
+    }
+
+    public void setOriginalMusicalPrice(BigDecimal originalMusicalPrice) {
+        this.originalMusicalPrice = originalMusicalPrice;
+    }
+
+    public String getOriginalAccessories() {
+        return originalAccessories;
+    }
+
+    public void setOriginalAccessories(String originalAccessories) {
+        this.originalAccessories = originalAccessories;
+    }
+
+    public BigDecimal getOriginalAccessoriesPrice() {
+        return originalAccessoriesPrice;
+    }
+
+    public void setOriginalAccessoriesPrice(BigDecimal originalAccessoriesPrice) {
+        this.originalAccessoriesPrice = originalAccessoriesPrice;
+    }
+
+    public BigDecimal getChangeCourseFee() {
+        return changeCourseFee;
+    }
+
+    public void setChangeCourseFee(BigDecimal changeCourseFee) {
+        this.changeCourseFee = changeCourseFee;
+    }
+
+    public Integer getChangeMusical() {
+        return changeMusical;
+    }
+
+    public void setChangeMusical(Integer changeMusical) {
+        this.changeMusical = changeMusical;
+    }
+
+    public BigDecimal getChangeMusicalPrice() {
+        return changeMusicalPrice;
+    }
+
+    public void setChangeMusicalPrice(BigDecimal changeMusicalPrice) {
+        this.changeMusicalPrice = changeMusicalPrice;
+    }
+
+    public String getChangeAccessories() {
+        return changeAccessories;
+    }
+
+    public void setChangeAccessories(String changeAccessories) {
+        this.changeAccessories = changeAccessories;
+    }
+
+    public BigDecimal getChangeAccessoriesPrice() {
+        return changeAccessoriesPrice;
+    }
+
+    public void setChangeAccessoriesPrice(BigDecimal changeAccessoriesPrice) {
+        this.changeAccessoriesPrice = changeAccessoriesPrice;
+    }
+
+    public BigDecimal getGoodsMargin() {
+        return goodsMargin;
+    }
+
+    public void setGoodsMargin(BigDecimal goodsMargin) {
+        this.goodsMargin = goodsMargin;
+    }
+
+    public BigDecimal getCourseMargin() {
+        return courseMargin;
+    }
+
+    public void setCourseMargin(BigDecimal courseMargin) {
+        this.courseMargin = courseMargin;
+    }
+
+    public SubjectChangeStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(SubjectChangeStatusEnum status) {
+        this.status = status;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public Integer getVersion() {
+        return version;
+    }
+
+    public void setVersion(Integer version) {
+        this.version = version;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public Goods getOriginalMusicalGoods() {
+        return originalMusicalGoods;
+    }
+
+    public void setOriginalMusicalGoods(Goods originalMusicalGoods) {
+        this.originalMusicalGoods = originalMusicalGoods;
+    }
+
+    public List<Goods> getOriginalAccessoriesGoods() {
+        return originalAccessoriesGoods;
+    }
+
+    public void setOriginalAccessoriesGoods(List<Goods> originalAccessoriesGoods) {
+        this.originalAccessoriesGoods = originalAccessoriesGoods;
+    }
+
+    public Goods getChangeMusicalGoods() {
+        return changeMusicalGoods;
+    }
+
+    public void setChangeMusicalGoods(Goods changeMusicalGoods) {
+        this.changeMusicalGoods = changeMusicalGoods;
+    }
+
+    public List<Goods> getChangeAccessoriesGoods() {
+        return changeAccessoriesGoods;
+    }
+
+    public void setChangeAccessoriesGoods(List<Goods> changeAccessoriesGoods) {
+        this.changeAccessoriesGoods = changeAccessoriesGoods;
+    }
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public Integer getCooperationOrganId() {
+        return cooperationOrganId;
+    }
+
+    public void setCooperationOrganId(Integer cooperationOrganId) {
+        this.cooperationOrganId = cooperationOrganId;
+    }
+
+    public BigDecimal getCostMargin() {
+        return costMargin;
+    }
+
+    public void setCostMargin(BigDecimal costMargin) {
+        this.costMargin = costMargin;
+    }
+
+    public BigDecimal getSellAmount() {
+        return sellAmount;
+    }
+
+    public void setSellAmount(BigDecimal sellAmount) {
+        this.sellAmount = sellAmount;
+    }
+
+    public Date getSellTime() {
+        return sellTime;
+    }
+
+    public void setSellTime(Date sellTime) {
+        this.sellTime = sellTime;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getTransNo() {
+        return transNo;
+    }
+
+    public void setTransNo(String transNo) {
+        this.transNo = transNo;
+    }
+
+    public KitGroupPurchaseTypeEnum getKitGroupPurchaseType() {
+        return kitGroupPurchaseType;
+    }
+
+    public void setKitGroupPurchaseType(KitGroupPurchaseTypeEnum kitGroupPurchaseType) {
+        this.kitGroupPurchaseType = kitGroupPurchaseType;
+    }
+
+    public BigDecimal getOriginalCost() {
+        return originalCost;
+    }
+
+    public void setOriginalCost(BigDecimal originalCost) {
+        this.originalCost = originalCost;
+    }
+
+    public BigDecimal getChangeCost() {
+        return changeCost;
+    }
+
+    public void setChangeCost(BigDecimal changeCost) {
+        this.changeCost = changeCost;
+    }
+
+    public String getCooperationOrganName() {
+        return cooperationOrganName;
+    }
+
+    public void setCooperationOrganName(String cooperationOrganName) {
+        this.cooperationOrganName = cooperationOrganName;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public Integer getOriginalSubjectId() {
+        return originalSubjectId;
+    }
+
+    public void setOriginalSubjectId(Integer originalSubjectId) {
+        this.originalSubjectId = originalSubjectId;
+    }
+
+    public Integer getChangeSubjectId() {
+        return changeSubjectId;
+    }
+
+    public void setChangeSubjectId(Integer changeSubjectId) {
+        this.changeSubjectId = changeSubjectId;
+    }
+
+    public Integer getEduTeacherId() {
+        return eduTeacherId;
+    }
+
+    public void setEduTeacherId(Integer eduTeacherId) {
+        this.eduTeacherId = eduTeacherId;
+    }
+
+    public String getPaymentChannel() {
+        return paymentChannel;
+    }
+
+    public void setPaymentChannel(String paymentChannel) {
+        this.paymentChannel = paymentChannel;
+    }
+
+    public String getMerNo() {
+        return merNo;
+    }
+
+    public void setMerNo(String merNo) {
+        this.merNo = merNo;
+    }
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
+    public String getEduTeacher() {
+        return eduTeacher;
+    }
+
+    public void setEduTeacher(String eduTeacher) {
+        this.eduTeacher = eduTeacher;
+    }
+}

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TeacherAttendance.java

@@ -33,6 +33,10 @@ public class TeacherAttendance {
 	/**  */
 	@ApiModelProperty(value = "课程计划编号",required = false)
 	private Long courseScheduleId;
+
+	/**  */
+	@ApiModelProperty(value = "实际教室编号",required = false)
+	private Long currentScheduleId;
 	
 	/** 签到时间 */
 	@ApiModelProperty(value = "签到时间",required = false)
@@ -85,6 +89,14 @@ public class TeacherAttendance {
 	//处理结果
 	private Integer operator;
 
+	public Long getCurrentScheduleId() {
+		return currentScheduleId;
+	}
+
+	public void setCurrentScheduleId(Long currentScheduleId) {
+		this.currentScheduleId = currentScheduleId;
+	}
+
 	public Date getComplaintsTime() {
 		return complaintsTime;
 	}

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/GroupType.java

@@ -11,7 +11,8 @@ public enum GroupType implements BaseEnum<String, GroupType> {
 	COMM("对外课程"),
 	REPAIR("乐器维修"),
 	GOODS_SELL("商品销售"),
-	OUTORDER("外部订单");
+	OUTORDER("外部订单"),
+	SUBJECT_CHANGE("声部更换");
 
 	private String desc;
 

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -154,6 +154,8 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     SMS_REPAIR_ONLINE_PAYMENT_SUCCESS("SMS_REPAIR_ONLINE_PAYMENT_SUCCESS","乐器线上维修支付成功"),
     SMS_REPAIR_OFFLINE_PAYMENT_SUCCESS("SMS_REPAIR_OFFLINE_PAYMENT_SUCCESS","乐器线下维修支付成功"),
     SMS_REPAIR_UNSEND_COMPLETED("SMS_REPAIR_UNSEND_COMPLETED","乐器维修完成自取"),
+    SMS_PAYMENT_DETAIL("SMS_PAYMENT_DETAIL","缴费项目缴费详情提醒"),
+    SMS_PAYMENT_CREATE("SMS_PAYMENT_CREATE","缴费项目创建提醒"),
     SMS_REPAIR_SEND_COMPLETED("SMS_REPAIR_SEND_COMPLETED","乐器维修完成邮寄");
 
 

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java

@@ -18,7 +18,8 @@ public enum OrderTypeEnum implements BaseEnum<String, OrderTypeEnum> {
 	TENANT_RECHARGE("TENANT_RECHARGE","租户充值"),
 	GOODS_SELL("GOODS_SELL","商品销售"),
 	OUTORDER("OUTORDER", "外部订单"),
-	REPAIR("REPAIR","乐器维修");
+	REPAIR("REPAIR","乐器维修"),
+	SUBJECT_CHANGE("SUBJECT_CHANGE","声部更换");
 
 
 	private String code;

+ 30 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/SubjectChangeStatusEnum.java

@@ -0,0 +1,30 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum SubjectChangeStatusEnum implements BaseEnum<Integer, SubjectChangeStatusEnum> {
+
+    CANCELED(-1, "已取消"),
+    WAIT_PAY(0, "待支付"),
+    ING(1, "支付中"),
+    SUCCESSED(2, "已支付");
+
+    private Integer code;
+
+    private String desc;
+
+    private SubjectChangeStatusEnum(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getCode() {
+        return code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+}

+ 40 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/GoodsSellQueryInfo.java

@@ -0,0 +1,40 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+public class GoodsSellQueryInfo extends QueryInfo {
+	
+	@ApiModelProperty(value = "教师编号", required = false)
+	private Integer teacherId;
+
+	@ApiModelProperty(value = "学员编号", required = false)
+	private Integer studentId;
+
+	@ApiModelProperty(value = "交易状态",required = true)
+	private String status;
+
+	public Integer getTeacherId() {
+		return teacherId;
+	}
+
+	public void setTeacherId(Integer teacherId) {
+		this.teacherId = teacherId;
+	}
+
+	public Integer getStudentId() {
+		return studentId;
+	}
+
+	public void setStudentId(Integer studentId) {
+		this.studentId = studentId;
+	}
+
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+}

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

@@ -7,6 +7,9 @@ import java.util.Date;
 
 public class OperatingReportQueryInfo extends QueryInfo {
 
+    @ApiModelProperty(value = "类型 organ-分部 school-学校", required = false)
+    private String type;
+
     @ApiModelProperty(value = "分部id", required = false)
     private String organIdList;
 
@@ -59,4 +62,12 @@ public class OperatingReportQueryInfo extends QueryInfo {
     public void setEndTime(Date endTime) {
         this.endTime = endTime;
     }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
 }

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

@@ -44,6 +44,12 @@ public class StudentPaymentOrderQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "余额支付金额",required = false)
     private BigDecimal balancePaymentAmount;
 
+    @ApiModelProperty(value = "现金支付金额(小于等于)",required = false)
+    private BigDecimal lessActualAmount;
+
+    @ApiModelProperty(value = "余额支付金额(小于等于)",required = false)
+    private BigDecimal lessBalancePaymentAmount;
+
     @ApiModelProperty(value = "订单号",required = false)
     private String orderNo;
 
@@ -192,4 +198,20 @@ public class StudentPaymentOrderQueryInfo extends QueryInfo {
     public void setUserIds(List<Integer> userIds) {
         this.userIds = userIds;
     }
+
+    public BigDecimal getLessActualAmount() {
+        return lessActualAmount;
+    }
+
+    public void setLessActualAmount(BigDecimal lessActualAmount) {
+        this.lessActualAmount = lessActualAmount;
+    }
+
+    public BigDecimal getLessBalancePaymentAmount() {
+        return lessBalancePaymentAmount;
+    }
+
+    public void setLessBalancePaymentAmount(BigDecimal lessBalancePaymentAmount) {
+        this.lessBalancePaymentAmount = lessBalancePaymentAmount;
+    }
 }

+ 67 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SubjectChangeQueryInfo.java

@@ -0,0 +1,67 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.biz.dal.enums.SubjectChangeStatusEnum;
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+public class SubjectChangeQueryInfo extends QueryInfo {
+
+    private String organIdList;
+
+
+    @ApiModelProperty(value = "合作单位id",required = false)
+    private Integer cooperationOrganId;
+
+    @ApiModelProperty(value = "状态",required = false)
+    private SubjectChangeStatusEnum status;
+
+    @ApiModelProperty(value = "开始时间",required = false)
+    private Date startTime;
+
+    @ApiModelProperty(value = "结束时间",required = false)
+    private Date endTime;
+
+
+    public String getOrganIdList() {
+        return organIdList;
+    }
+
+    public void setOrganIdList(String organIdList) {
+        this.organIdList = organIdList;
+    }
+
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getCooperationOrganId() {
+        return cooperationOrganId;
+    }
+
+    public void setCooperationOrganId(Integer cooperationOrganId) {
+        this.cooperationOrganId = cooperationOrganId;
+    }
+
+    public SubjectChangeStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(SubjectChangeStatusEnum status) {
+        this.status = status;
+    }
+}

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

@@ -302,7 +302,7 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 
 	/**
 	 * @describe 临时课检测
-	 * @author Joburgess
+	 * @author 周剑河
 	 * @date 2019/12/6
 	 * @param courseSchedules: 课程计划列表
 	 * @return void

+ 13 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/MusicGroupPaymentCalenderService.java

@@ -40,11 +40,9 @@ public interface MusicGroupPaymentCalenderService extends BaseService<Long, Musi
 
 	/**
 	 * 修改缴费日期
-	 * @param startTime
-	 * @param endTime
-	 * @param id
+	 * @param paymentCalender
 	 */
-    void updateStartTime(Date startTime,Date endTime,Long id);
+    void updateStartTime(MusicGroupPaymentCalender paymentCalender);
 
 	/**
 	 * 删除
@@ -73,4 +71,15 @@ public interface MusicGroupPaymentCalenderService extends BaseService<Long, Musi
 	 * @return
 	 */
 	void paymentPush(Long id, String userIds);
+
+	/**
+	 * @describe 更新乐团学员缴费状态
+	 * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+	 * @author zouxuan
+	 * @date 2020/9/21
+	 * @time 13:56
+	 * @param :
+	 * @return void
+	 */
+	void autoUpdateMusicGroupStudentFeeStatus();
 }

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

@@ -31,4 +31,5 @@ public interface SellOrderService extends BaseService<Integer, SellOrder> {
      */
     List<SellOrder> addOrderDetail2SellOrder(List<StudentPaymentOrderDetail> orderDetails, StudentPaymentOrder studentPaymentOrder, MusicGroup musicGroup);
 
+    void batchInsert(List<SellOrder> sellOrders);
 }

+ 15 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/StudentAttendanceService.java

@@ -75,12 +75,23 @@ public interface StudentAttendanceService extends BaseService<Long, StudentAtten
 	CourseScheduleResponse getStatisticsInfo(Integer classGroupId);
 
 	/**
-	 * 线上课学生考勤
-	 * @param courseScheduleId
+	 * 线上课学生签到
+	 * @param firstCourseId
 	 * @param userId
-	 * @param statusEnum
 	 */
-	void addStudentAttendanceRecord(Integer courseScheduleId, Integer userId, StudentAttendanceStatusEnum statusEnum,SignStatusEnum signStatusEnum);
+	void addStudentAttendanceSignIn(Long firstCourseId, Integer userId,Long currentScheduleId);
+
+	/**
+	 * @describe 线上课学员签退
+	 * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+	 * @author zouxuan
+	 * @date 2020/9/26
+	 * @time 22:48
+	 * @param firstCourseId:
+	 * @param userId:
+	 * @return void
+	 */
+	void addStudentAttendanceSignOut(Long firstCourseId, Integer userId);
 
 	/**
 	 * 某节课所有学员签到状态

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

@@ -0,0 +1,22 @@
+package com.ym.mec.biz.service;
+
+
+import com.ym.mec.biz.dal.dto.StudentGoodsSellDto;
+import com.ym.mec.biz.dal.entity.StudentGoodsSell;
+import com.ym.mec.biz.dal.page.GoodsSellQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.BaseService;
+
+public interface StudentGoodsSellService extends BaseService<Integer, StudentGoodsSell> {
+
+    /**
+     * @describe 分页查询教务老师关联的学员订单
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/23
+     * @time 11:51
+     * @param queryInfo:
+     * @return java.lang.Object
+     */
+    PageInfo<StudentGoodsSellDto> queryStudentGoodsOrders(GoodsSellQueryInfo queryInfo);
+}

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

@@ -250,4 +250,21 @@ public interface StudentRegistrationService extends BaseService<Long, StudentReg
 	 * @return
 	 */
 	StudentMusicDetailDto getStudentDetail(Integer studentId);
+
+	/**
+	 * 获取学生
+	 * @param studentId
+	 * @param musicGroupId
+	 * @return
+	 */
+	List<StudentPaymentOrderDetail> getStudentApplyDetail(Integer studentId,String musicGroupId);
+
+	/**
+	 * 更换学生声部
+	 * @param musicGroup
+	 * @param originalSubjectId
+	 * @param changeSubjectId
+	 * @return
+	 */
+	StudentRegistration changeStudentSubject(Integer studentId,String musicGroupId,Integer originalSubjectId,Integer changeSubjectId);
 }

+ 28 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/StudentRepairService.java

@@ -1,16 +1,15 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.BasicUserDto;
-import com.ym.mec.biz.dal.dto.GoodsSellDto;
+import com.ym.mec.biz.dal.dto.StudentGoodsSellDto;
+import com.ym.mec.biz.dal.entity.StudentGoodsSell;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.StudentRepair;
 import com.ym.mec.biz.dal.page.RepairStudentQueryInfo;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
-import org.springframework.stereotype.Service;
 
-import java.math.BigDecimal;
-import java.util.Date;
 import java.util.Map;
 
 public interface StudentRepairService extends BaseService<Integer, StudentRepair> {
@@ -75,10 +74,21 @@ public interface StudentRepairService extends BaseService<Integer, StudentRepair
      * @author zouxuan
      * @date 2020/9/16
      * @time 13:47
-     * @param goodsSellDto:
+     * @param studentGoodsSell:
      * @return java.util.Map
      */
-    Map addGoodsSellOrder(GoodsSellDto goodsSellDto) throws Exception;
+    Map addGoodsSellOrder(StudentGoodsSell studentGoodsSell) throws Exception;
+
+    /**
+     * @describe 学员扫码支付
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/16
+     * @time 13:47
+     * @param goodsSellId:
+     * @return java.util.Map
+     */
+    Map studentPaymentGoodsOrder(Integer goodsSellId) throws Exception;
 
     /**
      * @describe 商品销售订单回调
@@ -89,5 +99,16 @@ public interface StudentRepairService extends BaseService<Integer, StudentRepair
      * @param order:
      * @return void
      */
-    void goodsSellorderCallback(StudentPaymentOrder order);
+    void goodsSellOrderCallback(StudentPaymentOrder order);
+
+    /**
+     * @describe 获取商品购买教务老师关联的学员列表
+     * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+     * @author zouxuan
+     * @date 2020/9/28
+     * @time 11:27
+     * @param queryInfo:
+     * @return java.lang.Object
+     */
+    PageInfo<BasicUserDto> queryEduStudents(QueryInfo queryInfo);
 }

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

@@ -0,0 +1,75 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.dto.StudentVisitDto;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.SubjectChange;
+import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
+import com.ym.mec.biz.dal.page.SubjectChangeQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.BaseService;
+import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public interface SubjectChangeService extends BaseService<Integer, SubjectChange> {
+
+    SubjectChange getChangeInfo(Integer id);
+
+    /**
+     * 支付声部更换费用
+     *
+     * @param id
+     * @param amount
+     * @param isUseBalancePayment
+     * @return
+     */
+    Map payChange(Integer id, BigDecimal amount, Boolean isUseBalancePayment,Boolean isRepay) throws Exception;
+
+    /**
+     * 添加声部更换
+     * @param subjectChange
+     * @return
+     */
+    SubjectChange addChange(SubjectChange subjectChange);
+
+    /**
+     * 取消声部更换
+     * @param id
+     * @return
+     */
+    SubjectChange cancel(Integer id);
+
+    /**
+     *
+     * @param studentId
+     * @param musicGroupId
+     * @return
+     */
+    SubjectChange getStudentOriginal(Integer studentId,String musicGroupId);
+
+
+    /**
+     * 订单回调
+     * @param order
+     */
+    Boolean orderCallback(StudentPaymentOrder order);
+
+    /**
+     * 获取更换列表
+     * @param queryInfo
+     * @return
+     */
+    PageInfo<SubjectChange> getPageList(SubjectChangeQueryInfo queryInfo);
+
+    /**
+     * 更新成本差
+     * @param id
+     * @return
+     */
+    SubjectChange updateCostMargin(Integer id,BigDecimal costMargin);
+}

+ 23 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/TeacherAttendanceService.java

@@ -26,19 +26,31 @@ public interface TeacherAttendanceService extends BaseService<Long, TeacherAtten
 	Map<String, Object> addTeacherAttendanceRecord(TeacherSignOutDto teacherSignOutDto);
 
 	/**
-	 * @describe 调价教师签到记录
-	 * @author Joburgess
-	 * @date 2019/11/4
-	 * @param courseScheduleId: 课程编号
-	 * @param userId: 用户编号
-	 * @param signStatus: 签到or签退
-	 * @param updateCourseScheduleStatus: 是否更新课程状态
+	 * @describe 线上课老师签退
+	 * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+	 * @author zouxuan
+	 * @date 2020/9/27
+	 * @time 9:52
+	 * @param courseScheduleId:
+	 * @param userId:
+	 * @return void
+	 */
+	void addTeacherAttendanceSignOut(Long courseScheduleId,
+									Integer userId);
+
+
+
+	/**
+	 * @describe 教师线上课签到
+	 * @apiNote 时光荏苒,认真工作的时间总是过得很快,而我、享受这一刻!
+	 * @author zouxuan
+	 * @date 2020/9/26
+	 * @time 19:59
+	 * @param userId:
+	 * @param courseScheduleId:
 	 * @return void
 	 */
-	void addTeacherAttendanceRecord(Integer courseScheduleId,
-									Integer userId,
-									SignStatusEnum signStatus,
-									boolean updateCourseScheduleStatus);
+	void addTeacherAttendanceSignIn(Long firstCourseId,Integer userId, Long courseScheduleId);
 
 	/**
 	 * 获取教师个人的签到记录

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

@@ -10,8 +10,12 @@ import java.util.Map.Entry;
 import java.util.stream.Collectors;
 
 import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.thirdparty.user.realname.RealnameAuthenticationPluginContext;
+import com.ym.mec.thirdparty.user.realname.provider.LinkfaceRealnameAuthenticationPlugin;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -62,6 +66,7 @@ import com.ym.mec.util.freemarker.FreemarkerTemplateEngine;
 import com.ym.mec.util.money.MoneyUtil;
 import com.ym.mec.util.pdf.PDFUtil;
 import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
@@ -123,10 +128,18 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 	@Value("${contract.baseDir:/var/pdf}")
 	private String contractBaseDir;
 
+	@Value("${message.debugMode}")
+	private boolean debugMode;
+
+	@Autowired
+	private RealnameAuthenticationPluginContext realnameAuthenticationPluginContext;
+
 	private DateFormat dateFormatOss = new SimpleDateFormat("yyyy/MM/dd");
 
 	private DateFormat dateFormat1 = new SimpleDateFormat("yyMMddHHmmSS");
 
+	private final Logger logger = LoggerFactory.getLogger(ContractService.class);
+
 	@Override
 	public void afterPropertiesSet() throws Exception {
 		// 注册企业账户
@@ -173,6 +186,10 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
 		if (sysUserTsign == null) {
 
+			if(!debugMode){
+				realnameAuthenticationPluginContext.getRealnameAuthenticationPlugin(LinkfaceRealnameAuthenticationPlugin.getName()).verify(realName, idCardNo);
+			}
+
 			String accountId = eSealPlugin.createUserAccount(realName, idCardNo, mobileNo);
 
 			if (StringUtils.isBlank(accountId)) {
@@ -945,16 +962,23 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 	public boolean transferProduceContract(Integer userId,String musicGroupId) {
 		SysUser user = studentDao.lockUserReturnInfo(userId);
 
+		if (user == null) {
+			logger.error("用户不存在({})", userId);
+			return false;
+		}
+
 		List<SysUserContracts> userContracts = sysUserContractsService.getUserContractWithType(userId, ContractType.PRODUCT);
 		if(!CollectionUtils.isEmpty(userContracts)){
 			return true;
 		}
 
+		if(StringUtils.isBlank(user.getRealName())||StringUtils.isBlank(user.getIdCardNo())){
+			logger.error("身份信息缺失({})", userId);
+			return false;
+		}
+
 		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
 		if (sysUserTsign == null) {
-			if (user == null) {
-				throw new BizException("用户信息查询失败");
-			}
 			sysUserTsign = register(userId, user.getRealName(), user.getIdCardNo(), user.getPhone());
 		}
 		Date date = new Date();
@@ -985,7 +1009,8 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		}else{
 			MusicGroup musicGroup = musicGroupService.get(musicGroupId);
 			if (musicGroup == null) {
-				throw new BizException("乐团信息没找到");
+				logger.error("乐团信息没找到({})", musicGroupId);
+				return false;
 			}
 			params.put("ownershipType", musicGroup.getOwnershipType().name());
 		}
@@ -996,7 +1021,8 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		try {
 			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(srcFile), srcPdfPath, "simsun.ttc");
 		} catch (IOException e) {
-			throw new BizException("生成产品协议失败", e);
+			logger.error("生成产品协议失败", e);
+			return false;
 		}
 
 
@@ -1008,7 +1034,8 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
 		}
 		SysUserTsign organTsign = sysUserTsignService.queryByCardNo(organCode);
 		if (organTsign == null) {
-			throw new BizException("甲方未创建签章");
+			logger.error("甲方未创建签章");
+			return false;
 		}
 
 		eSealPlugin.organSign(organTsign.getSealData(), srcPdfPath, srcPdfPath);

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

@@ -2105,7 +2105,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 				}
 				newCourseSchedule.setTeachingTeacherIdList(classGroupTeachingTeacherMap.get(newCourseSchedule.getClassGroupId().longValue()).getIds());
 
-				if (!CollectionUtils.isEmpty(newCourseSchedule.getTeachingTeacherIdList())
+                if (!CollectionUtils.isEmpty(newCourseSchedule.getTeachingTeacherIdList())
                         && !CollectionUtils.isEmpty(existCourseSchedule.getTeachingTeacherIdList())) {
                     List<Integer> repeatIds = newCourseSchedule.getTeachingTeacherIdList()
                             .stream().filter(existCourseSchedule.getTeachingTeacherIdList()::contains)

+ 17 - 15
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursesGroupServiceImpl.java

@@ -154,21 +154,6 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
             newCourse.setName(courseGroup.getName());
             newCourse.setOrganId(courseGroup.getOrganId());
         }
-        try {
-            courseScheduleService.checkNewCourseSchedules(newCourses, false);
-        } catch (Exception e) {
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            String errMessage;
-            String courseName = e.getMessage().substring(e.getMessage().indexOf(")-") + 2);
-            courseName = courseName.substring(0, courseName.indexOf("("));
-            String courseTime = e.getMessage().substring(e.getMessage().indexOf("在") + 1);
-            courseTime = courseTime.substring(0, courseTime.indexOf("至"));
-            errMessage = "现在课程:";
-            errMessage += courseName;
-            errMessage += "<br/>冲突时间:";
-            errMessage += courseTime;
-            return BaseController.failed(HttpStatus.FOUND, errMessage);
-        }
 
         CourseSchedule firstCourseSchedule = newCourses.stream().min(Comparator.comparing(CourseSchedule::getStartClassTime)).get();
         if (firstCourseSchedule.getStartClassTime().before(now)) {
@@ -221,6 +206,23 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
             courseSchedule.setCreateTime(now);
             courseSchedule.setUpdateTime(now);
         }
+
+        try {
+            courseScheduleService.checkNewCourseSchedules(newCourses, false);
+        } catch (Exception e) {
+            LOGGER.error("检查课程冲突出现异常",e);
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            String errMessage;
+            String courseName = e.getMessage().substring(e.getMessage().indexOf(")-") + 2);
+            courseName = courseName.substring(0, courseName.indexOf("("));
+            String courseTime = e.getMessage().substring(e.getMessage().indexOf("在") + 1);
+            courseTime = courseTime.substring(0, courseTime.indexOf("至"));
+            errMessage = "现在课程:";
+            errMessage += courseName;
+            errMessage += "<br/>冲突时间:";
+            errMessage += courseTime;
+            return BaseController.failed(HttpStatus.FOUND, errMessage);
+        }
         courseScheduleDao.batchAddCourseSchedules(newCourses);
 
         for (CourseSchedule courseSchedule : newCourses) {

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

@@ -58,7 +58,7 @@ public class FinancialExpenditureServiceImpl extends BaseServiceImpl<Long, Finan
 		List<FinancialExpenditure> financialExpenditures = new ArrayList<>();
 		Map<String, Integer> organMap = getMap("organization", "name_", "id_", true, String.class, Integer.class);
 		Map<String, Integer> cooperationOrganMap = getMap("cooperation_organ", "name_", "id_", true, String.class, Integer.class);
-		Map<String, Integer> phoneMap = getMap("sys_user", "phone_", "id_", true, String.class, Integer.class);
+//		Map<String, Integer> phoneMap = getMap("sys_user", "phone_", "id_", true, String.class, Integer.class);
 		for (String e : sheetsListMap.keySet()) {
 			List<Map<String, Object>> sheet = sheetsListMap.get(e);
 			List<Object> collect = sheet.stream().map(m -> m.get("钉钉流程编号")).collect(Collectors.toList());

+ 75 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.CalenderPushDto;
 import com.ym.mec.biz.dal.entity.MusicGroup;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
 import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalenderDetail;
@@ -35,10 +36,8 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 
 	@Autowired
 	private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
-
 	@Autowired
 	private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
-
 	@Autowired
 	private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
 	@Autowired
@@ -70,13 +69,18 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		}
 		// 判断缴费开始时间、结束时间是否被其他缴费记录占用
 		int count = musicGroupPaymentCalenderDao.queryIntersectionByPaymentDate(musicGroupId, musicGroupPaymentCalender.getStartPaymentDate(),
-				musicGroupPaymentCalender.getDeadlinePaymentDate());
+				musicGroupPaymentCalender.getDeadlinePaymentDate(),null);
 
 //		String format = DateUtil.format(musicGroupPaymentCalender.getStartPaymentDate(), DateUtil.DEFAULT_PATTERN);
 //		String format1 = DateUtil.format(musicGroupPaymentCalender.getDeadlinePaymentDate(), DateUtil.DEFAULT_PATTERN);
 //		int count = musicGroupPaymentCalenderDao.queryIntersectionByDate(musicGroupId, format,format1);
 		if (count > 0) {
-			throw new BizException("缴费时间存在冲突,请修改缴费开始日期");
+			throw new BizException("缴费日期存在冲突,请修改缴费日期");
+		}
+		count = musicGroupPaymentCalenderDao.queryIntersectionByValidDate(musicGroupId, musicGroupPaymentCalender.getPaymentValidStartDate(),
+				musicGroupPaymentCalender.getPaymentValidEndDate(),null);
+		if (count > 0) {
+			throw new BizException("缴费有效期存在冲突,请修改缴费有效期");
 		}
 		if (date.after(musicGroupPaymentCalender.getDeadlinePaymentDate())) {
 			musicGroupPaymentCalender.setPaymentStatus(PaymentStatusEnum.YES);
@@ -149,6 +153,57 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 	}
 
 	@Override
+	public void autoUpdateMusicGroupStudentFeeStatus() {
+		Date date = new Date();
+		String format = DateUtil.format(date, DateUtil.DEFAULT_PATTERN);
+		//将有效期已截止的学员缴费信息修改为未缴费
+//		musicGroupStudentFeeDao.updateFeeStatus();
+		//获取距离缴费开启指定天数后的缴费明细
+		String configValue = sysConfigDao.findConfigValue("push_payment_detail");
+		Map<Long, Long> maps = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.queryCalenderByDay(configValue,format));
+		if(maps != null && maps.size() > 0){
+			Set<Long> calenderId = maps.keySet();
+			List<CalenderPushDto> calenderPushDtos = musicGroupPaymentCalenderDao.getCalenderPushDto(calenderId);
+			Map<Long, List<CalenderPushDto>> collect = calenderPushDtos.stream().collect(Collectors.groupingBy(CalenderPushDto::getCalenderId));
+			calenderId.forEach(e->{
+				CalenderPushDto calenderPushDto = collect.get(e).get(0);
+				Map<Integer, String> receivers = new HashMap<>(1);
+				receivers.put(calenderPushDto.getTeacherId(),calenderPushDto.getTeacherPhone());
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.SMS_PAYMENT_DETAIL,
+						receivers, null, 0, null, null,calenderPushDto.getMusicGroupName(),
+						calenderPushDto.getPaymentValidStartDate(),calenderPushDto.getPaymentValidEndDate(),maps.get(e));
+			});
+		}
+		//获取离截止还有指定时间的缴费项,并发送推送消息给指定老师
+		String configValue1 = sysConfigDao.findConfigValue("push_create_payment_calender");
+		List<Long> calenderIds = musicGroupPaymentCalenderDao.queryEndIds(configValue1,format);
+		if(calenderIds != null && calenderIds.size() > 0){
+			List<CalenderPushDto> calenderPushDtos = musicGroupPaymentCalenderDao.getCalenderPushDto(calenderIds);
+			Map<Long, List<CalenderPushDto>> collect = calenderPushDtos.stream().collect(Collectors.groupingBy(CalenderPushDto::getCalenderId));
+			calenderIds.forEach(e->{
+				CalenderPushDto calenderPushDto = collect.get(e).get(0);
+				Map<Integer, String> receivers = new HashMap<>(1);
+				receivers.put(calenderPushDto.getTeacherId(),calenderPushDto.getTeacherPhone());
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.SMS_PAYMENT_CREATE,
+						receivers, null, 0, null, null,calenderPushDto.getMusicGroupName(),
+						calenderPushDto.getPaymentValidStartDate(),calenderPushDto.getPaymentValidEndDate());
+			});
+		}
+
+		//乐团报名到期,提醒教务老师创建缴费
+		List<CalenderPushDto> calenderPushDtos = musicGroupPaymentCalenderDao.getMusicCalenderPushDto(configValue1,format);
+		if(calenderPushDtos != null && calenderPushDtos.size() > 0){
+			calenderPushDtos.forEach(e->{
+				Map<Integer, String> receivers = new HashMap<>(1);
+				receivers.put(e.getTeacherId(),e.getTeacherPhone());
+				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.SMS_PAYMENT_CREATE,
+						receivers, null, 0, null, null,e.getMusicGroupName(),
+						e.getPaymentValidStartDate(),e.getPaymentValidEndDate());
+			});
+		}
+	}
+
+	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public boolean autoUpdateMusicGroupPaymentCalenderStatus() {
 		// 获取当天创建且未缴费的数据,并推送
@@ -342,11 +397,11 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void updateStartTime(Date startTime,Date endTime,Long id) {
-		if (startTime == null || id == null || endTime == null) {
-			throw new BizException("参数校验失败");
-		}
-		MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(id);
+	public void updateStartTime(MusicGroupPaymentCalender paymentCalender) {
+//		if (startTime == null || id == null || endTime == null) {
+//			throw new BizException("参数校验失败");
+//		}
+		MusicGroupPaymentCalender calender = musicGroupPaymentCalenderDao.get(paymentCalender.getId());
 		if (calender == null) {
 			throw new BizException("缴费信息不存在");
 		}
@@ -355,19 +410,25 @@ public class MusicGroupPaymentCalenderServiceImpl extends BaseServiceImpl<Long,
 		}
 		Date date = new Date();
 		// 判断缴费开始时间、结束时间是否被其他缴费记录占用
-		int count = musicGroupPaymentCalenderDao.queryIntersectionByPaymentDate(calender.getMusicGroupId(), startTime,endTime);
+		int count = musicGroupPaymentCalenderDao.queryIntersectionByPaymentDate(calender.getMusicGroupId(), paymentCalender.getStartPaymentDate(),paymentCalender.getDeadlinePaymentDate(),paymentCalender.getId());
 //		String format = DateUtil.format(startTime, DateUtil.DEFAULT_PATTERN);
 //		String format1 = DateUtil.format(endTime, DateUtil.DEFAULT_PATTERN);
 //		int count = musicGroupPaymentCalenderDao.queryIntersectionByDate(calender.getMusicGroupId(), format,format1);
 		if (count > 0) {
 			throw new BizException("缴费时间存在冲突,请修改缴费开始日期");
 		}
-		calender.setStartPaymentDate(startTime);
-		calender.setDeadlinePaymentDate(endTime);
+		count = musicGroupPaymentCalenderDao.queryIntersectionByValidDate(calender.getMusicGroupId(), paymentCalender.getPaymentValidStartDate(),
+				paymentCalender.getPaymentValidEndDate(),paymentCalender.getId());
+		if (count > 0) {
+			throw new BizException("缴费有效期存在冲突,请修改缴费有效期");
+		}
+		calender.setStartPaymentDate(paymentCalender.getStartPaymentDate());
+		calender.setDeadlinePaymentDate(paymentCalender.getDeadlinePaymentDate());
+		calender.setPaymentPattern(paymentCalender.getPaymentPattern());
 		calender.setUpdateTime(date);
-		if (endTime.before(date) && !DateUtil.isSameDay(date,endTime)) {
+		if (paymentCalender.getDeadlinePaymentDate().before(date) && !DateUtil.isSameDay(date,paymentCalender.getDeadlinePaymentDate())) {
 			calender.setPaymentStatus(PaymentStatusEnum.YES);
-		} else if (date.after(startTime) || DateUtil.isSameDay(date,endTime)) {
+		} else if (date.after(paymentCalender.getStartPaymentDate()) || DateUtil.isSameDay(date,paymentCalender.getStartPaymentDate())) {
 			calender.setPaymentStatus(PaymentStatusEnum.OPEN);
 			//修改Fee缴费状态为未缴费
 			musicGroupStudentFeeDao.updatePaymentStatus(calender.getId(),"NON_PAYMENT");

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

@@ -26,7 +26,6 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
-
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -872,10 +871,6 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("用户信息获取失败");
         }
         MusicGroup musicGroup = saveLog(musicGroupId, MusicGroupStatusEnum.PREPARE);
-        int finishCourseNum = courseScheduleDao.countGroupFinishCourse(musicGroupId, GroupType.MUSIC.getCode());
-        if(finishCourseNum>0){
-            throw new BizException("此乐团存在已结束课程");
-        }
 
         //乐器采购清单是否确认
         Map<String, Object> param = new HashMap<>();

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

@@ -117,7 +117,9 @@ public class OperatingReportServiceImpl extends BaseServiceImpl<Integer, Operati
         reports.addAll(sellOrderDao.getRechargeMonthReport(startTime, endTime));
         //3.6、零星收费(不是充值部分的)
         reports.addAll(sellOrderDao.getSporadicMonthReport(startTime, endTime));
-        updateFee(organOperating,cooperationOperating,reports);
+        //乐器更换
+        //reports.addAll(sellOrderDao.getSubjectChangeMonthReport(startTime, endTime));
+        updateFee(organOperating, cooperationOperating, reports);
 
 //        Map<String, Object> params = new HashMap<>();
 //        params.put("startTime", startTime);

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

@@ -132,6 +132,8 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     private TeacherCourseRewardService teacherCourseRewardService;
     @Autowired
     private StudentPaymentRouteOrderService studentPaymentRouteOrderService;
+    @Autowired
+    private StudentGoodsSellDao studentGoodsSellDao;
 
     private static Map<Integer, Map<Integer, List<Integer>>> schoolSubjectTeachersMap;
 
@@ -3369,7 +3371,12 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         practiceBuyResult.setCreateTime(order.getCreateTime());
         practiceBuyResult.setPrice(order.getExpectAmount());
         practiceBuyResult.setType(order.getType().getCode());
-        if (order.getStatus().equals(DealStatusEnum.FAILED) || order.getGroupType().equals(GroupType.REPAIR)) {
+
+        if(order.getGroupType().equals(GroupType.GOODS_SELL)){
+            practiceBuyResult.setDetail(studentGoodsSellDao.getStudentGoodsSellDto(orderNo));
+        }
+
+        if (order.getStatus().equals(DealStatusEnum.FAILED) || order.getGroupType().equals(GroupType.REPAIR)||Objects.isNull(order.getMusicGroupId())) {
             return practiceBuyResult;
         }
         SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);

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

@@ -148,10 +148,6 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
             detailRouteBalance = detailRouteBalance.add(detailBalance);
             i++;
 
-            if (orderDetail.getType().equals(OrderDetailTypeEnum.MUSICAL) && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
-                continue;
-            }
-
             BigDecimal goodsTotalPrice = orderDetail.getGoodsList().stream().map(Goods::getGroupPurchasePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
             BigDecimal routePrice = BigDecimal.ZERO;
             BigDecimal routeBalance = BigDecimal.ZERO;
@@ -182,6 +178,7 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
                 sellOrder.setOrderId(studentPaymentOrder.getId());
                 if (musicGroup != null) {
                     sellOrder.setCooperationOrganId(musicGroup.getCooperationOrganId());
+                    sellOrder.setEduTeacherId(musicGroup.getEducationalTeacherId());
                 }
                 sellOrder.setOrderNo(studentPaymentOrder.getOrderNo());
                 sellOrder.setActualAmount(expectAmount.subtract(balance));
@@ -205,6 +202,15 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
                 } else {
                     sellOrder.setType(SellTypeEnum.OTHER);
                 }
+                //租赁、免费的没有销售收入,有销售成本
+                if (orderDetail.getType().equals(OrderDetailTypeEnum.MUSICAL) &&
+                        (orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE) ||
+                                orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.FREE)
+                        )) {
+                    sellOrder.setActualAmount(BigDecimal.ZERO);
+                    sellOrder.setBalanceAmount(BigDecimal.ZERO);
+                    sellOrder.setExpectAmount(BigDecimal.ZERO);
+                }
                 sellOrders.add(sellOrder);
             }
         }
@@ -214,4 +220,9 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
         return sellOrders;
     }
 
+    @Override
+    public void batchInsert(List<SellOrder> sellOrders) {
+        sellOrderDao.batchInsert(sellOrders);
+    }
+
 }

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

@@ -78,9 +78,7 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
         map.put(userId, userId.toString());
         if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
             try {
-                if(Objects.isNull(info.getUserId())){
-                    contractService.transferProduceContract(userId, null);
-                }
+                contractService.transferProduceContract(userId, null);
             } catch (Exception e) {
                 logger.error("产品协议生成失败", e);
             }

+ 96 - 127
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java

@@ -469,152 +469,121 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
-    public void addStudentAttendanceRecord(Integer courseScheduleId, Integer userId, StudentAttendanceStatusEnum statusEnum, SignStatusEnum signStatusEnum) {
-        CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId.longValue());
-        ClassGroup classGroup = classGroupDao.findByCourseSchedule(courseScheduleId, 0);
-        StudentAttendance studentAttendance = studentAttendanceDao.findByStatusAndCourseScheduleId(userId, courseScheduleId);
+    @Transactional(rollbackFor = Exception.class)
+    public void addStudentAttendanceSignIn(Long firstCourseId, Integer userId,Long currentScheduleId) {
         Date date = new Date();
+        ClassGroup classGroup = classGroupDao.findByCourseSchedule(currentScheduleId.intValue(), 0);
+        StudentAttendance studentAttendance = studentAttendanceDao.findByStatusAndCourseScheduleId(userId, currentScheduleId.intValue());
         if (studentAttendance == null) {
             studentAttendance = new StudentAttendance();
             studentAttendance.setClassGroupId(classGroup.getId());
-            studentAttendance.setCourseScheduleId(courseScheduleId.longValue());
+            studentAttendance.setCourseScheduleId(currentScheduleId);
             studentAttendance.setCurrentClassTimes(classGroup.getCurrentClassTimes() + 1);
             studentAttendance.setGroupType(classGroup.getGroupType());
             studentAttendance.setMusicGroupId(classGroup.getMusicGroupId());
             studentAttendance.setUserId(userId);
-            studentAttendance.setTeacherId(courseSchedule.getActualTeacherId());
-            if (signStatusEnum == SignStatusEnum.SIGN_IN) {
-                if (courseSchedule.getStudentNum() == null) {
-                    courseSchedule.setStudentNum(0);
-                }
-                courseSchedule.setStudentNum(courseSchedule.getStudentNum() + 1);
-            }
+            studentAttendance.setCurrentScheduleId(firstCourseId);
             studentAttendanceDao.insert(studentAttendance);
         } else {
-            studentAttendance.setTeacherId(courseSchedule.getActualTeacherId());
+            studentAttendance.setCurrentScheduleId(firstCourseId);
             studentAttendance.setUpdateTime(date);
         }
-//		Date signInTime = studentAttendance.getSignInTime();
-        //没有签到信息才会生成
-        if (signStatusEnum == SignStatusEnum.SIGN_IN && studentAttendance.getSignInTime() == null) {
-            //判断是否在签到时间段内(课程开始前20~结束前)
-//			int advanceSignMinutes = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_IN_MINUTES));
-//			String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
-//			String startClassTime = DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-//			String endClassTime = DateUtil.format(courseSchedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-            //上课时间
-//			Date classStartDateTime = DateUtil.stringToDate(classDate + " " + startClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-//			Date classEndDateTime = DateUtil.stringToDate(classDate + " " + endClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-//			Date addMinutes = DateUtil.addMinutes(classStartDateTime, -60);
+        if (studentAttendance.getSignInTime() == null){
+            CourseSchedule courseSchedule = courseScheduleDao.get(currentScheduleId);
+            if (courseSchedule.getStudentNum() == null) {
+                courseSchedule.setStudentNum(0);
+            }
+            courseSchedule.setStudentNum(courseSchedule.getStudentNum() + 1);
+            studentAttendance.setTeacherId(courseSchedule.getActualTeacherId());
             //课程结束前进入,算正常
-            studentAttendance.setStatus(statusEnum);
+            studentAttendance.setStatus(StudentAttendanceStatusEnum.NORMAL);
             studentAttendance.setSignInTime(date);
 
             courseSchedule.setUpdateTime(date);
-//				courseSchedule.setStudentNum((courseSchedule.getStudentNum() == null?0:courseSchedule.getStudentNum()) + 1);
             courseScheduleDao.update(courseSchedule);
-			/*if(DateUtil.minutesBetween(addMinutes,date) >= 0 && DateUtil.minutesBetween(date,classEndDateTime) > 0){
-
-			}*/
-        } else if (signStatusEnum == SignStatusEnum.SIGN_OUT) {
-            String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
-            String startClassTime = DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-            String endClassTime = DateUtil.format(courseSchedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-            //上课时间
-            Date classStartDateTime = DateUtil.stringToDate(classDate + " " + startClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-            Date classEndDateTime = DateUtil.stringToDate(classDate + " " + endClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-            if (DateUtil.minutesBetween(classEndDateTime, date) >= 0) {
-                String continueCourseTime = sysConfigDao.findConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME);
-                if (StringUtils.isEmpty(continueCourseTime)) {
-                    continueCourseTime = "5";
-                }
-                List<CourseSchedule> courseSchedules = new ArrayList<>();
-                CourseSchedule cs = courseSchedule;
-                while (true) {
-                    //获取当前课程的所有连堂课列表
-                    String courseClassDate = DateUtil.format(cs.getClassDate(), DateUtil.DEFAULT_PATTERN);
-                    String courseEndDateTime = DateUtil.format(cs.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-                    cs = courseScheduleDao.queryRepairContinueCourse(cs, continueCourseTime, courseClassDate + " " + courseEndDateTime);
-                    //存在连堂课
-                    if (cs != null) {
-                        courseSchedules.add(cs);
-                    } else {
-                        break;
-                    }
-                }
-                if (courseSchedules.size() > 0) {
-                    //获取总上课时长
-                    int totalMinutes = DateUtil.minutesBetween(classStartDateTime, date);
-                    //减去第一节课时长
-                    int firstMinutes = courseScheduleDao.getSingleClassMinutes(courseScheduleId.longValue());
-                    totalMinutes -= firstMinutes;
-                    if (totalMinutes > 0) {
-                        String courseClassDate;
-                        String courseStartDateTime;
-                        String courseEndDateTime;
-                        for (int i = 0; i < courseSchedules.size(); i++) {
-                            courseClassDate = DateUtil.format(courseSchedules.get(i).getClassDate(), DateUtil.DEFAULT_PATTERN);
-                            courseStartDateTime = DateUtil.format(courseSchedules.get(i).getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-                            courseEndDateTime = DateUtil.format(courseSchedules.get(i).getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-                            Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-                            Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-                            StudentAttendance byStatusAndCourseScheduleId = studentAttendanceDao.findByStatusAndCourseScheduleId(userId, courseSchedules.get(i).getId().intValue());
-                            Date signOutTime = date;
-                            if (date.before(startDateTime)) {
-                                continue;
-                            }
-                            if (i < courseSchedules.size() - 1 && date.after(endDateTime)) {
-                                //不是最后一节连堂课,并且签退时间大于课程结束时间,签退时间等于课程结束时间
-                                signOutTime = endDateTime;
-                            }
-                            if (byStatusAndCourseScheduleId != null) {
-                                if (byStatusAndCourseScheduleId.getSignOutTime() != null) {
-                                    continue;
-                                }
-                                if (byStatusAndCourseScheduleId.getSignInTime() != null) {
-                                    startDateTime = null;
-                                }
-                                byStatusAndCourseScheduleId.setSignInTime(startDateTime);
-                                byStatusAndCourseScheduleId.setSignOutTime(signOutTime);
-                                byStatusAndCourseScheduleId.setStatus(statusEnum);
-                                byStatusAndCourseScheduleId.setUpdateTime(date);
-                                studentAttendanceDao.update(byStatusAndCourseScheduleId);
-                            } else {
-                                byStatusAndCourseScheduleId = new StudentAttendance();
-                                byStatusAndCourseScheduleId.setSignOutTime(signOutTime);
-                                byStatusAndCourseScheduleId.setStatus(statusEnum);
-                                byStatusAndCourseScheduleId.setSignInTime(startDateTime);
-                                byStatusAndCourseScheduleId.setUpdateTime(date);
-                                byStatusAndCourseScheduleId.setUserId(userId);
-                                byStatusAndCourseScheduleId.setTeacherId(courseSchedule.getActualTeacherId());
-                                byStatusAndCourseScheduleId.setClassGroupId(courseSchedules.get(i).getClassGroupId());
-                                byStatusAndCourseScheduleId.setCourseScheduleId(courseSchedules.get(i).getId());
-                                byStatusAndCourseScheduleId.setMusicGroupId(courseSchedules.get(i).getMusicGroupId());
-                                byStatusAndCourseScheduleId.setGroupType(courseSchedules.get(i).getGroupType());
-                                byStatusAndCourseScheduleId.setCurrentClassTimes(classGroup.getCurrentClassTimes() + 1);
-                                studentAttendanceDao.insert(byStatusAndCourseScheduleId);
-                            }
-                            if (studentAttendance.getSignOutTime() == null) {
-                                studentAttendance.setStatus(statusEnum);
-                                studentAttendance.setSignOutTime(classEndDateTime);
-                            }
-                        }
-                    }
-                } else {
-                    studentAttendance.setStatus(statusEnum);
-                    studentAttendance.setSignOutTime(date);
-                }
-                if (studentAttendance.getSignOutTime() == null) {
-                    studentAttendance.setStatus(statusEnum);
-                    studentAttendance.setSignOutTime(date);
-                }
+            studentAttendanceDao.update(studentAttendance);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addStudentAttendanceSignOut(Long firstCourseId, Integer userId) {
+        Date date = new Date();
+        CourseSchedule courseSchedule = courseScheduleDao.get(firstCourseId);
+        String continueCourseTime = sysConfigDao.findConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME);
+        if (StringUtils.isEmpty(continueCourseTime)) {
+            continueCourseTime = "5";
+        }
+        List<CourseSchedule> courseSchedules = new ArrayList<>();
+        courseSchedules.add(courseSchedule);
+        CourseSchedule cs = courseSchedule;
+        while (true) {
+            //获取当前课程的所有连堂课列表
+            String courseClassDate = DateUtil.format(cs.getClassDate(), DateUtil.DEFAULT_PATTERN);
+            String courseEndDateTime = DateUtil.format(cs.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+            cs = courseScheduleDao.queryStudentContinueCourse(cs, continueCourseTime, courseClassDate + " " + courseEndDateTime);
+            //存在连堂课
+            if (cs != null) {
+                courseSchedules.add(cs);
             } else {
-                studentAttendance.setStatus(statusEnum);
-                studentAttendance.setSignOutTime(date);
+                break;
             }
         }
-        studentAttendanceDao.update(studentAttendance);
+        String courseClassDate;
+        String courseStartDateTime;
+        String courseEndDateTime;
+        Boolean isBreak = false;
+        //签退之前看是不是第一次进入这个连堂课
+        for (int i = courseSchedules.size() - 1; i >= 0; i--) {
+            if(isBreak){
+                break;
+            }
+            CourseSchedule schedule = courseSchedules.get(i);
+            courseClassDate = DateUtil.format(schedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
+            courseStartDateTime = DateUtil.format(schedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+            Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+            courseEndDateTime = DateUtil.format(schedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+            Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+            //不是最后一节课
+            if(i == courseSchedules.size() - 1){
+                isBreak = upsetAttendance(userId,startDateTime,date,schedule,firstCourseId);
+            }else {
+                isBreak = upsetAttendance(userId,startDateTime,endDateTime,schedule,firstCourseId);
+            }
+        }
+    }
+
+    public Boolean upsetAttendance(Integer userId,Date signInTime,Date signOutTime,CourseSchedule courseSchedule,Long courseScheduleId){
+        StudentAttendance studentAttendance = studentAttendanceDao.findByStatusAndCourseScheduleId(userId, courseSchedule.getId().intValue());
+        Boolean flag = false;
+        Long courseId = studentAttendanceDao.findFirstSign(courseScheduleId,userId);
+        //如果当前课程是第一次签到的课程那么不更新签到时间,并且退出下次循环
+        if(courseId != null && courseId.equals(courseSchedule.getId())){
+            flag = true;
+        }
+        if(studentAttendance == null){
+            studentAttendance = new StudentAttendance();
+            studentAttendance.setSignOutTime(signOutTime);
+            studentAttendance.setStatus(StudentAttendanceStatusEnum.NORMAL);
+            studentAttendance.setSignInTime(signInTime);
+            studentAttendance.setUserId(userId);
+            studentAttendance.setTeacherId(courseSchedule.getActualTeacherId());
+            studentAttendance.setClassGroupId(courseSchedule.getClassGroupId());
+            studentAttendance.setCourseScheduleId(courseSchedule.getId());
+            studentAttendance.setMusicGroupId(courseSchedule.getMusicGroupId());
+            studentAttendance.setGroupType(courseSchedule.getGroupType());
+            studentAttendance.setCurrentScheduleId(courseScheduleId);
+            studentAttendanceDao.insert(studentAttendance);
+        }else {
+            studentAttendance.setSignOutTime(signOutTime);
+            studentAttendance.setCurrentScheduleId(courseScheduleId);
+            studentAttendance.setStatus(StudentAttendanceStatusEnum.NORMAL);
+            if(!flag){
+                studentAttendance.setSignInTime(signInTime);
+            }
+            studentAttendanceDao.update(studentAttendance);
+        }
+        return flag;
     }
 
     @Override
@@ -660,7 +629,7 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
                 //获取当前课程的所有连堂课列表
                 String courseClassDate = DateUtil.format(cs.getClassDate(), DateUtil.DEFAULT_PATTERN);
                 String courseEndDateTime = DateUtil.format(cs.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-                cs = courseScheduleDao.queryRepairContinueCourse(cs, continueCourseTime, courseClassDate + " " + courseEndDateTime);
+                cs = courseScheduleDao.queryStudentContinueCourse(cs, continueCourseTime, courseClassDate + " " + courseEndDateTime);
                 //存在连堂课
                 if (cs != null) {
                     courseSchedules.add(cs);

+ 52 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentGoodsSellServiceImpl.java

@@ -0,0 +1,52 @@
+package com.ym.mec.biz.service.impl;
+
+
+import com.ym.mec.biz.dal.dao.StudentGoodsSellDao;
+import com.ym.mec.biz.dal.dto.StudentGoodsSellDto;
+import com.ym.mec.biz.dal.entity.StudentGoodsSell;
+import com.ym.mec.biz.dal.page.GoodsSellQueryInfo;
+import com.ym.mec.biz.service.StudentGoodsSellService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class StudentGoodsSellServiceImpl extends BaseServiceImpl<Integer, StudentGoodsSell> implements StudentGoodsSellService {
+	
+	@Autowired
+	private StudentGoodsSellDao studentGoodsSellDao;
+
+	@Override
+	public BaseDAO<Integer, StudentGoodsSell> getDAO() {
+		return studentGoodsSellDao;
+	}
+
+	@Override
+	public PageInfo<StudentGoodsSellDto> queryStudentGoodsOrders(GoodsSellQueryInfo queryInfo) {
+		//根据订单状态和教务老师获取订单列表
+		PageInfo<StudentGoodsSellDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+		List<StudentGoodsSellDto> dataList = null;
+		int count = studentGoodsSellDao.countStudentGoodsOrders(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = studentGoodsSellDao.queryStudentGoodsOrders(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+}

+ 153 - 67
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java

@@ -1,11 +1,7 @@
 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.*;
 import java.util.stream.Collectors;
 
 import com.ym.mec.biz.dal.dao.*;
@@ -45,6 +41,8 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
     private StudentRegistrationDao studentRegistrationDao;
     @Autowired
     private SubjectDao subjectDao;
+    @Autowired
+    private SubjectChangeDao subjectChangeDao;
 
     @Override
     public BaseDAO<Long, StudentPaymentOrderDetail> getDAO() {
@@ -62,41 +60,106 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
     }
 
     @Override
-	public List<Goods> getMusicalList(String musicGroupId) {
-		List<StudentPaymentOrderDetail> applyOrder = findApplyOrderSuccess(musicGroupId, DealStatusEnum.SUCCESS);
-		if (applyOrder == null || applyOrder.size() == 0) {
-			return null;
-		}
-		String goodsIdsStr = "";
-		for (StudentPaymentOrderDetail studentPaymentOrderDetail : applyOrder) {
-			if (studentPaymentOrderDetail.getGoodsIdList() != null && !studentPaymentOrderDetail.getGoodsIdList().isEmpty()) {
-				goodsIdsStr += studentPaymentOrderDetail.getGoodsIdList() + ",";
-			}
-		}
-		if (StringUtils.isNotBlank(goodsIdsStr)) {
-			goodsIdsStr = goodsIdsStr.substring(0, goodsIdsStr.length() - 1);
-
-			String[] goodSIdArr = goodsIdsStr.split(",");
-
-			List<Goods> goodies = goodsService.findGoodsByIds(goodsIdsStr);
-            MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-            Organization organization = organizationDao.get(musicGroup.getOrganId());
-            goodies.forEach(e->{
-                e.setSellCount(0);
-                //当作乐团名称字段处理
-                e.setMemo(musicGroup.getName());
-                //当作分部名称字段处理
-                e.setBrief(organization.getName());
-                for (String goodsIdStr : goodSIdArr) {
-                    if (e.getId().equals(Integer.parseInt(goodsIdStr))) {
-                        e.setSellCount(e.getSellCount() + 1);
+    public List<Goods> getMusicalList(String musicGroupId) {
+        List<StudentPaymentOrderDetail> applyOrder = findApplyOrderSuccess(musicGroupId, DealStatusEnum.SUCCESS);
+        if (applyOrder == null || applyOrder.size() == 0) {
+            return null;
+        }
+        String goodsIdsStr = "";
+        for (StudentPaymentOrderDetail studentPaymentOrderDetail : applyOrder) {
+            if (studentPaymentOrderDetail.getGoodsIdList() != null && !studentPaymentOrderDetail.getGoodsIdList().isEmpty()) {
+                goodsIdsStr += studentPaymentOrderDetail.getGoodsIdList() + ",";
+            }
+        }
+        if (StringUtils.isBlank(goodsIdsStr)) {
+            return null;
+        }
+        goodsIdsStr = goodsIdsStr.substring(0, goodsIdsStr.length() - 1);
+
+        String[] goodSIdArr = goodsIdsStr.split(",");
+
+        List<Goods> goodies = goodsService.findGoodsByIds(goodsIdsStr);
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        Organization organization = organizationDao.get(musicGroup.getOrganId());
+        goodies.forEach(e -> {
+            e.setSellCount(0);
+            //当作乐团名称字段处理
+            e.setMemo(musicGroup.getName());
+            //当作分部名称字段处理
+            e.setBrief(organization.getName());
+            for (String goodsIdStr : goodSIdArr) {
+                if (e.getId().equals(Integer.parseInt(goodsIdStr))) {
+                    e.setSellCount(e.getSellCount() + 1);
+                }
+            }
+        });
+        //乐器更换的
+        SubjectChange changeGoods = subjectChangeDao.getChangeGoods(musicGroupId);
+        if (changeGoods == null) {
+            return goodies;
+        }
+        String originalGoodsIds = "";
+        String changeGoodsIds = "";
+        if (StringUtils.isNotBlank(changeGoods.getMusicGroupName())) {
+            originalGoodsIds += StringUtils.isNotBlank(originalGoodsIds) ? "," + changeGoods.getMusicGroupName() : changeGoods.getMusicGroupName();
+        }
+        if (StringUtils.isNotBlank(changeGoods.getOriginalAccessories())) {
+            originalGoodsIds += StringUtils.isNotBlank(originalGoodsIds) ? "," + changeGoods.getOriginalAccessories() : changeGoods.getOriginalAccessories();
+        }
+        if (StringUtils.isNotBlank(changeGoods.getTransNo())) {
+            changeGoodsIds += StringUtils.isNotBlank(changeGoodsIds) ? "," + changeGoods.getTransNo() : changeGoods.getTransNo();
+        }
+        if (StringUtils.isNotBlank(changeGoods.getChangeAccessories())) {
+            changeGoodsIds += StringUtils.isNotBlank(changeGoodsIds) ? "," + changeGoods.getChangeAccessories() : changeGoods.getChangeAccessories();
+        }
+        if (StringUtils.isNotBlank(changeGoodsIds)) {
+            String[] changGoodsIdsArr = changeGoodsIds.split(",");
+            List<Goods> addGoodies = new ArrayList<>();
+            for (String goodsId : changGoodsIdsArr) {
+                boolean has = false;
+                for (Goods goods : goodies) {
+                    if (goodsId.equals(goods.getId().toString())) {
+                        goods.setSellCount(goods.getSellCount() + 1);
+                        has = true;
+                        break;
                     }
                 }
-            });
-			return goodies;
-		}
-		return null;
-	}
+
+                for (Goods addGoods : addGoodies) {
+                    if (goodsId.equals(addGoods.getId().toString())) {
+                        addGoods.setSellCount(addGoods.getSellCount() + 1);
+                        has = true;
+                        break;
+                    }
+                }
+                if (!has) {
+                    Goods goods = goodsService.get(Integer.parseInt(goodsId));
+                    goods.setSellCount(1);
+                    goods.setMemo(musicGroup.getName());
+                    //当作分部名称字段处理
+                    goods.setBrief(organization.getName());
+                    addGoodies.add(goods);
+                }
+            }
+            if (addGoodies.size() > 0) {
+                goodies.addAll(addGoodies);
+            }
+        }
+
+        if (StringUtils.isNotBlank(originalGoodsIds)) {
+            String[] originalGoodsIdsArr = originalGoodsIds.split(",");
+            for (String goodsId : originalGoodsIdsArr) {
+                for (Goods goods : goodies) {
+                    if (goodsId.equals(goods.getId().toString())) {
+                        goods.setSellCount(goods.getSellCount() - 1);
+                        break;
+                    }
+                }
+            }
+        }
+        goodies.removeIf(goods -> goods.getSellCount() <= 0);
+        return goodies;
+    }
 
     @Override
     public Boolean verifyMusicalList(String musicGroupId) throws BizException {
@@ -146,7 +209,7 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
                 goodsIdsStr += studentPaymentOrderDetail.getGoodsIdList() + ",";
             }
         }
-        if(goodsIdsStr.isEmpty()){
+        if (goodsIdsStr.isEmpty()) {
             return null;
         }
         goodsIdsStr = goodsIdsStr.substring(0, goodsIdsStr.length() - 1);
@@ -174,35 +237,58 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
     @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(MusicalListDetailDto::getPaymentOrderId).collect(Collectors.toList());
-            List<Integer> userIds = musicalListDetailDtos.stream().map(MusicalListDetailDto::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));
-            Map<Integer, String> userSubjectMap = subjectDao.getRegisterSubject(musicGroupId, userIds).stream().collect(Collectors.toMap(StudentRegistration::getUserId, StudentRegistration::getSubjectName));
-            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.setSubjectName(userSubjectMap.get(e.getUserId()));
-                String s = purchaseTypeMap.get(e.getUserId().longValue());
-                if(StringUtils.isNotEmpty(s)){
-                    e.setKitGroupPurchaseTypeEnum(KitGroupPurchaseTypeEnum.valueOf(purchaseTypeMap.get(e.getUserId().longValue())));
+        if (musicalListDetailDtos.size() <= 0) {
+            return musicalListDetailDtos;
+        }
+        List<Long> paymentOrderNo = musicalListDetailDtos.stream().map(MusicalListDetailDto::getPaymentOrderId).collect(Collectors.toList());
+        List<Integer> userIds = musicalListDetailDtos.stream().map(MusicalListDetailDto::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(studentPaymentOrderDetailDao.queryPurchaseTypeMap(paymentOrderNo));
+        Map<Integer, String> userSubjectMap = subjectDao.getRegisterSubject(musicGroupId, userIds).stream().collect(Collectors.toMap(StudentRegistration::getUserId, StudentRegistration::getSubjectName));
+
+        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.setSubjectName(userSubjectMap.get(e.getUserId()));
+            String s = purchaseTypeMap.get(e.getPaymentOrderId());
+            if (StringUtils.isNotEmpty(s)) {
+                e.setKitGroupPurchaseTypeEnum(KitGroupPurchaseTypeEnum.valueOf(purchaseTypeMap.get(e.getPaymentOrderId())));
+            }
+        });
+        List<SubjectChange> studentGoodies = subjectChangeDao.getStudentGoods(musicGroupId);
+        if (studentGoodies.size() <= 0) {
+            return musicalListDetailDtos;
+        }
+        for (MusicalListDetailDto musicalListDetailDto : musicalListDetailDtos) {
+            for (SubjectChange studentGoods : studentGoodies) {
+                if (!musicalListDetailDto.getUserId().equals(studentGoods.getStudentId())) continue;
+                String goodsNames = "";
+                if (studentGoods.getChangeMusicalGoods() != null) {
+                    goodsNames += studentGoods.getChangeMusicalGoods().getName();
                 }
-            });
+                if (studentGoods.getChangeAccessoriesGoods() != null) {
+                    String accessoriesNames = studentGoods.getChangeAccessoriesGoods().stream().map(Goods::getName).collect(Collectors.joining(","));
+                    goodsNames += StringUtils.isNotBlank(goodsNames) ? "," + accessoriesNames : accessoriesNames;
+                }
+                musicalListDetailDto.setGoodsNames(goodsNames);
+                musicalListDetailDto.setMusicalAmount(studentGoods.getChangeMusicalPrice());
+                musicalListDetailDto.setAccessoriesAmount(studentGoods.getChangeAccessoriesPrice());
+                musicalListDetailDto.setCourseAmount(studentGoods.getChangeCourseFee());
+            }
         }
         return musicalListDetailDtos;
     }

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

@@ -23,6 +23,7 @@ import com.ym.mec.thirdparty.yqpay.YqPayFeignService;
 import com.ym.mec.thirdparty.yqpay.YqPayUtil;
 import com.ym.mec.util.collection.MapUtil;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -56,6 +57,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private StudentRepairService studentRepairService;
     @Autowired
     private SysUserCashAccountService sysUserCashAccountService;
+    @Autowired
+    private SubjectChangeService subjectChangeService;
 
     @Override
     public BaseDAO<Long, StudentPaymentOrder> getDAO() {
@@ -167,7 +170,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             Map<String, Object> payment = Payment.queryPayment(payingOrder.getTransNo());
             Map<String, String> rpMap = new HashMap<>();
             rpMap.put("merOrderNo", payingOrder.getOrderNo());
-            rpMap.put("orderNo", (String) payment.get("id"));
+            rpMap.put("orderNo", payingOrder.getTransNo());
             rpMap.put("channelType", (String) payment.get("pay_channel"));
             String status = (String) payment.get("status");
             if (payment.containsKey("error_msg")) {
@@ -188,10 +191,6 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                     continue;
                 }
             }
-
-            if (status.equals("pending")) {
-                orderNoList.add(payingOrder.getOrderNo());
-            }
         }
         closeOrders(orderNoList);
     }
@@ -230,7 +229,9 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             order.setMemo(rpMap.get("remarks"));
         }
         order.setStatus(status);
-        order.setTransNo(rpMap.get("orderNo"));
+        if (StringUtils.isBlank(order.getTransNo())) {
+            order.setTransNo(rpMap.get("orderNo"));
+        }
         order.setPaymentBusinessChannel(rpMap.get("channelType"));
 
         if (order.getType().equals(OrderTypeEnum.APPLY)) { //报名订单
@@ -246,7 +247,9 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         } else if (order.getType().equals(OrderTypeEnum.REPAIR)) {
             studentRepairService.orderCallback(order);
         } else if (order.getType().equals(OrderTypeEnum.GOODS_SELL)) {
-            studentRepairService.goodsSellorderCallback(order);
+            studentRepairService.goodsSellOrderCallback(order);
+        } else if (order.getType().equals(OrderTypeEnum.SUBJECT_CHANGE)) {
+            subjectChangeService.orderCallback(order);
         }
     }
 
@@ -283,7 +286,9 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                 } else if (order.getType().equals(OrderTypeEnum.REPAIR)) {
                     studentRepairService.orderCallback(order);
                 } else if (order.getType().equals(OrderTypeEnum.GOODS_SELL)) {
-                    studentRepairService.goodsSellorderCallback(order);
+                    studentRepairService.goodsSellOrderCallback(order);
+                } else if (order.getType().equals(OrderTypeEnum.SUBJECT_CHANGE)) {
+                    subjectChangeService.orderCallback(order);
                 }
             } catch (Exception e) {
                 e.printStackTrace();

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

@@ -22,12 +22,15 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.thirdparty.eseal.ESealPlugin;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
+import com.ym.mec.thirdparty.user.realname.RealnameAuthenticationPluginContext;
+import com.ym.mec.thirdparty.user.realname.provider.LinkfaceRealnameAuthenticationPlugin;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.http.HttpUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -96,6 +99,12 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     private SellOrderService sellOrderService;
     @Autowired
     private ESealPlugin eSealPlugin;
+    @Autowired
+    private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
+    @Autowired
+    private SubjectChangeDao subjectChangeDao;
+    @Autowired
+    private GoodsDao goodsDao;
 
     @Override
     public BaseDAO<Long, StudentRegistration> getDAO() {
@@ -119,10 +128,15 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             dataList = studentRegistrationDao.queryStudentDetailPage(params);
             Set<Integer> subjectIds = dataList.stream().map(e -> e.getActualSubjectId()).collect(Collectors.toSet());
             Map<Integer, String> subjectMap = MapUtil.convertIntegerMap(musicGroupSubjectPlanDao.findSubjectMap(subjectIds, queryInfo.getMusicGroupId()));
+            List<SubjectChange> waitPayChange = subjectChangeDao.getMusicGroupWaitPay(queryInfo.getMusicGroupId());
+            Map<Integer, List<SubjectChange>> studentWaitPayChange = waitPayChange.stream().collect(Collectors.groupingBy(SubjectChange::getStudentId));
             dataList.forEach(e -> {
                 if (StringUtils.isNotBlank(subjectMap.get(e.getActualSubjectId()))) {
                     e.setKitGroupPurchaseTypeEnum(KitGroupPurchaseTypeEnum.valueOf(subjectMap.get(e.getActualSubjectId())));
                 }
+                if (studentWaitPayChange.containsKey(e.getStudentId())) {
+                    e.setSubjectChange(studentWaitPayChange.get(e.getStudentId()).get(0));
+                }
             });
         }
         if (count == 0) {
@@ -236,8 +250,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 ImResult register = imFeignService.register(new ImUserModel(userId.toString(), sysUser.getUsername(), sysUser.getAvatar()));
                 sysUser.setImToken(register.getToken());
             } else {
-                if(StringUtils.isNotEmpty(sysUser.getUsername())){
-                    if(!sysUser.getUsername().equals(studentRegistration.getName())){
+                if (StringUtils.isNotEmpty(sysUser.getUsername())) {
+                    if (!sysUser.getUsername().equals(studentRegistration.getName())) {
                         throw new BizException("操作失败:账户已被注册");
                     }
                 }
@@ -526,7 +540,6 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 studentPaymentOrderDetailList.add(studentPaymentOrderDetailCourse);
             }
         }
-
         studentPaymentOrderDetailService.batchAdd(studentPaymentOrderDetailList);
 
         return studentPaymentOrder;
@@ -592,8 +605,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
                 sysUser.setImToken(register.getToken());
                 teacherDao.updateUser(sysUser);
             } else {
-                if(StringUtils.isNotEmpty(sysUser.getUsername())){
-                    if(!sysUser.getUsername().equals(studentRegistration.getName())){
+                if (StringUtils.isNotEmpty(sysUser.getUsername())) {
+                    if (!sysUser.getUsername().equals(studentRegistration.getName())) {
                         throw new BizException("操作失败:账户已被注册");
                     }
                 }
@@ -698,6 +711,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             MusicGroupStudentFee musicGroupStudentFee = new MusicGroupStudentFee(musicGroupId,
                     userId, studentRegistration.getSubjectId(), studentAddDto.getCourseFee(),
                     null, studentAddDto.getTemporaryCourseFee(), paymentStatus);
+
             if (musicGroup.getFeeType() != null && musicGroup.getFeeType() != MusicGroupPaymentCalender.FeeType.OFFLINE && musicGroupStudentFee.getTemporaryCourseFee().doubleValue() * 100 == 0) {
                 musicGroupStudentFee.setRemainNetworkClassTimes(musicGroupStudentFee.getRemainNetworkClassTimes() + 1);
             }
@@ -912,7 +926,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             //销售订单详情
             List<StudentPaymentOrderDetail> orderDetails = studentPaymentOrderDetailService.getOrderDetail(studentPaymentOrder.getId());
             if (orderDetails.size() > 0) {
-                sellOrderService.addOrderDetail2SellOrder(orderDetails, studentPaymentOrder,musicGroup);
+                sellOrderService.addOrderDetail2SellOrder(orderDetails, studentPaymentOrder, musicGroup);
             }
 
             //三方乐团不发送缴费通知
@@ -1113,4 +1127,70 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     public StudentMusicDetailDto getStudentDetail(Integer studentId) {
         return studentRegistrationDao.getStudentDetail(studentId);
     }
+
+    @Override
+    public List<StudentPaymentOrderDetail> getStudentApplyDetail(Integer studentId, String musicGroupId) {
+        SubjectChange studentLastChange = subjectChangeDao.getStudentLastChange(studentId, musicGroupId);
+        List<StudentPaymentOrderDetail> details = new ArrayList<>();
+        if (studentLastChange != null) {
+            StudentPaymentOrderDetail course = new StudentPaymentOrderDetail();
+            course.setType(OrderDetailTypeEnum.COURSE);
+            course.setPrice(studentLastChange.getChangeCourseFee());
+            details.add(course);
+            if (studentLastChange.getChangeMusical() != null) {
+                StudentPaymentOrderDetail musical = new StudentPaymentOrderDetail();
+                musical.setType(OrderDetailTypeEnum.MUSICAL);
+                musical.setKitGroupPurchaseType(studentLastChange.getKitGroupPurchaseType());
+                musical.setPrice(studentLastChange.getChangeMusicalPrice());
+                musical.setGoodsList(goodsDao.findGoodsByIds(studentLastChange.getChangeMusical().toString()));
+                details.add(musical);
+            }
+
+            if (studentLastChange.getChangeAccessories() != null) {
+                StudentPaymentOrderDetail accessories = new StudentPaymentOrderDetail();
+                accessories.setType(OrderDetailTypeEnum.ACCESSORIES);
+                accessories.setPrice(studentLastChange.getChangeAccessoriesPrice());
+                accessories.setGoodsList(goodsDao.findGoodsByIds(studentLastChange.getChangeAccessories()));
+                details.add(accessories);
+            }
+        }
+        if (details.size() <= 0) {
+            details = studentPaymentOrderDetailDao.getStudentApplyDetail(studentId, musicGroupId);
+        }
+        return details;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public StudentRegistration changeStudentSubject(Integer studentId, String musicGroupId, Integer originalSubjectId, Integer changeSubjectId) {
+        studentDao.lockUser(studentId);
+        //1、更换学生的声部
+        StudentRegistration studentRegistration = studentRegistrationDao.getStudentRegister(musicGroupId,studentId);
+        studentRegistration.setActualSubjectId(changeSubjectId);
+        studentRegistrationDao.update(studentRegistration);
+
+        //2、减去原声部的已缴费数量,加上现声部的缴费人数
+        boolean updateFlag = false;
+        for (int i = 0; i < 10; i++) {
+            MusicGroupSubjectPlan originalSubjectPlan = musicGroupSubjectPlanService.getMusicOneSubjectClassPlan(musicGroupId, originalSubjectId);
+            int originalPaidNum = originalSubjectPlan.getPaidStudentNum() == null ? 0 : originalSubjectPlan.getPaidStudentNum();
+            int originalPaidCount = 1;
+            if (originalPaidNum > 0) {
+                originalSubjectPlan.setPaidStudentNum(originalPaidNum - 1);
+                originalPaidCount = musicGroupSubjectPlanService.update(originalSubjectPlan);
+            }
+            MusicGroupSubjectPlan changeSubjectPlan = musicGroupSubjectPlanService.getMusicOneSubjectClassPlan(musicGroupId, changeSubjectId);
+            int changelPaidNum = changeSubjectPlan.getPaidStudentNum() == null ? 0 : changeSubjectPlan.getPaidStudentNum();
+            changeSubjectPlan.setPaidStudentNum(changelPaidNum + 1);
+            int changePaidCount = musicGroupSubjectPlanService.update(changeSubjectPlan);
+            if (originalPaidCount > 0 && changePaidCount > 0) {
+                updateFlag = true;
+                break;
+            }
+        }
+        if (!updateFlag) {
+            throw new BizException("系统繁忙,更新学生声部失败,请重试");
+        }
+        return studentRegistration;
+    }
 }

+ 324 - 63
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java

@@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.SellOrderDao;
-import com.ym.mec.biz.dal.dao.StudentDao;
-import com.ym.mec.biz.dal.dao.StudentRepairDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.GoodsSellDto;
 import com.ym.mec.biz.dal.dto.RepairGoodsDto;
@@ -19,6 +16,7 @@ import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
@@ -51,7 +49,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
     @Autowired
     private StudentPaymentOrderService studentPaymentOrderService;
     @Autowired
-    private StudentPaymentOrderDetailService studentPaymentOrderDetailService;
+    private MusicGroupDao musicGroupDao;
     @Autowired
     private SysUserCashAccountService sysUserCashAccountService;
     @Autowired
@@ -61,15 +59,15 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
     @Autowired
     private StudentDao studentDao;
     @Autowired
-    private GoodsService goodsService;
-    @Autowired
     private StudentPaymentRouteOrderService studentPaymentRouteOrderService;
     @Autowired
     private SellOrderService sellOrderService;
     @Autowired
-    private SellOrderDao sellOrderDao;
+    private StudentGoodsSellDao studentGoodsSellDao;
     @Autowired
     private ContractService contractService;
+    @Autowired
+    private GoodsService goodsService;
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -106,12 +104,30 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Map addGoodsSellOrder(GoodsSellDto goodsSellDto) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        Integer studentId = sysUser.getId();
-        String goodsId = goodsSellDto.getGoodsId();
-        if (StringUtils.isEmpty(goodsId)) {
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public Map addGoodsSellOrder(StudentGoodsSell studentGoodsSell) throws Exception {
+        //关闭老订单
+        if(StringUtils.isNotEmpty(studentGoodsSell.getOrderNo())){
+            StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(studentGoodsSell.getOrderNo());
+            if(orderByOrderNo.getBalancePaymentAmount() != null){
+                studentGoodsSell.setIsUseBalancePayment(true);
+            }else {
+                studentGoodsSell.setIsUseBalancePayment(false);
+            }
+            orderByOrderNo.setStatus(DealStatusEnum.CLOSE);
+            studentPaymentOrderService.update(orderByOrderNo);
+            if (orderByOrderNo.getBalancePaymentAmount() != null && orderByOrderNo.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
+                sysUserCashAccountService.updateBalance(orderByOrderNo.getUserId(), orderByOrderNo.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "关闭订单");
+            }
+            StudentGoodsSell byOrderNo = studentGoodsSellDao.findByOrderNo(studentGoodsSell.getOrderNo());
+            if(byOrderNo != null){
+                studentGoodsSell = byOrderNo;
+                studentGoodsSell.setGoodsSellDtos(JSON.parseArray(byOrderNo.getGoodsJson(),GoodsSellDto.class));
+            }
+        }
+        Integer studentId = studentGoodsSell.getUserId();
+        List<GoodsSellDto> goodsSellDtos = studentGoodsSell.getGoodsSellDtos();
+        if(goodsSellDtos == null || goodsSellDtos.size() == 0){
             throw new BizException("请选择需要购买的商品");
         }
         if (studentId == null) {
@@ -119,15 +135,54 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         }
         studentDao.lockUser(studentId);
         SysUser student = sysUserFeignService.queryUserById(studentId);
-        String orderNo = idGeneratorService.generatorId("payment") + "";
+        //如果教务老师为空,代表学员自己创建的订单
+        if(studentGoodsSell.getTeacherId() == null){
+            //获取学生关联的所有教务老师列表
+            List<Integer> stuEducation = studentRepairDao.countStuEducation(studentId);
+            if (stuEducation != null && stuEducation.size() == 1){
+                //获取学员乐团关联的教务
+                MusicGroup musicGroup = musicGroupDao.getStuMusic(studentId);
+                studentGoodsSell.setTeacherId(stuEducation.get(0));
+                if(musicGroup != null){
+                    studentGoodsSell.setCooperationOrganId(musicGroup.getCooperationOrganId());
+                }
+            }
+        }else if(studentGoodsSell.getCooperationOrganId() == null){
+            //获取教务老师,学员关联的乐团
+            MusicGroup musicGroup = musicGroupDao.getStuEduMusic(studentId,studentGoodsSell.getTeacherId());
+            if(musicGroup != null){
+                studentGoodsSell.setCooperationOrganId(musicGroup.getCooperationOrganId());
+            }
+        }
+        List<Integer> goodsIds = goodsSellDtos.stream().map(e -> e.getGoodsId()).collect(Collectors.toList());
 
-        String[] goodsIds = goodsId.split(",");
-        Map<String, BigDecimal> map = getMap("goods", "id_", "group_purchase_price_", goodsId, String.class, BigDecimal.class);
+        Map<Integer, BigDecimal> map = getMap("goods", "id_", "market_price_", goodsIds, Integer.class, BigDecimal.class);
+        for (GoodsSellDto goodsSellDto : goodsSellDtos) {
+            goodsSellDto.setGoodsPrice(map.get(goodsSellDto.getGoodsId()));
+            goodsSellDto.setTotalGoodsPrice(map.get(goodsSellDto.getGoodsId()).multiply(new BigDecimal(goodsSellDto.getGoodsNum())));
+        }
+        Map<Integer, List<GoodsSellDto>> goodsMap = goodsSellDtos.stream().collect(Collectors.groupingBy(GoodsSellDto::getGoodsId));
         BigDecimal amount = BigDecimal.ZERO;
-        for (String id : goodsIds) {
-            amount.add(map.get(id));
+        for (Integer id : goodsIds) {
+            GoodsSellDto goodsSellDto = goodsMap.get(id).get(0);
+            amount = amount.add(goodsSellDto.getTotalGoodsPrice());
+        }
+        amount = amount.subtract(studentGoodsSell.getMarketAmount());
+        if(amount.signum() < 0){
+            throw new BizException("操作失败:订单金额异常");
+        }
+        studentGoodsSell.setOrganId(student.getOrganId());
+        studentGoodsSell.setTotalAmount(amount);
+        studentGoodsSell.setGoodsJson(JSONObject.toJSONString(goodsSellDtos));
+        String orderNo = idGeneratorService.generatorId("payment") + "";
+        studentGoodsSell.setOrderNo(orderNo);
+        studentGoodsSellDao.insert(studentGoodsSell);
+
+        if (studentGoodsSell.getType() == 1) {
+            Map<String, Object> repairInfoMap = new HashMap<>();
+            MapUtil.populateMap(repairInfoMap, studentGoodsSell);
+            return repairInfoMap;
         }
-        List<Goods> goods = goodsService.findGoodsByIds(goodsId);
 
         StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
         studentPaymentOrder.setUserId(studentId);
@@ -141,32 +196,119 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         studentPaymentOrder.setRoutingOrganId(student.getOrganId());
         studentPaymentOrderService.insert(studentPaymentOrder);
 
-        Map<Integer, List<Goods>> collect = goods.stream().collect(Collectors.groupingBy(Goods::getId));
-        List<StudentPaymentOrderDetail> studentPaymentOrderDetailList = new ArrayList<>();
-        for (String id : goodsIds) {
-            Goods e = collect.get(id).get(0);
-            StudentPaymentOrderDetail studentPaymentOrderDetail = new StudentPaymentOrderDetail();
-            studentPaymentOrderDetail.setRemitFee(BigDecimal.ZERO);
-            OrderDetailTypeEnum type = null;
-            if (e.getType() == GoodsType.INSTRUMENT) {
-                type = OrderDetailTypeEnum.MUSICAL;
-            } else if (e.getType() == GoodsType.ACCESSORIES) {
-                type = OrderDetailTypeEnum.ACCESSORIES;
-            } else if (e.getType() == GoodsType.OTHER) {
-                type = OrderDetailTypeEnum.TEACHING;
+        studentPaymentOrder.setVersion(0);
+        BigDecimal balance = BigDecimal.ZERO;
+        if (studentGoodsSell.getIsUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
+            SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(studentId);
+            if (userCashAccount == null) {
+                throw new BizException("用户账户不存在");
+            }
+            if (userCashAccount.getBalance() != null && userCashAccount.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+                balance = amount.compareTo(userCashAccount.getBalance()) >= 0 ? userCashAccount.getBalance() : amount;
+                amount = amount.subtract(balance);
+                studentPaymentOrder.setActualAmount(amount);
+                studentPaymentOrder.setBalancePaymentAmount(balance);
+                sysUserCashAccountService.updateBalance(studentId, balance.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "商品销售");
+            }
+        }
+        studentPaymentOrderService.update(studentPaymentOrder);
+        studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
+
+        if (amount.compareTo(BigDecimal.ZERO) == 0) {
+            studentPaymentRouteOrderService.addRouteOrder(orderNo, student.getOrganId(), balance);
+            Map<String, String> notifyMap = new HashMap<>();
+            notifyMap.put("tradeState", "1");
+            notifyMap.put("merOrderNo", studentPaymentOrder.getOrderNo());
+            studentPaymentOrderService.updateOrder(notifyMap);
+            notifyMap.put("orderNo", orderNo);
+            return notifyMap;
+        }
+
+        String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+
+        Map payMap = payService.getPayMap(
+                amount,
+                balance,
+                orderNo,
+                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/paymentResult?type=edu&orderNo=" + orderNo,
+                "商品销售",
+                "商品销售",
+                student.getOrganId(),
+                "goodsSell"
+        );
+
+        studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
+        studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
+        studentPaymentOrderService.update(studentPaymentOrder);
+        return payMap;
+    }
+
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public Map studentPaymentGoodsOrder(Integer goodsSellId) throws Exception {
+        StudentGoodsSell studentGoodsSell = studentGoodsSellDao.get(goodsSellId);
+        Integer studentId = studentGoodsSell.getUserId();
+        studentDao.lockUser(studentId);
+//        SysUser student = sysUserFeignService.queryUserById(studentId);
+        List<GoodsSellDto> goodsSellDtos = JSONObject.parseArray(studentGoodsSell.getGoodsJson(),GoodsSellDto.class);
+        List<Integer> goodsIds = goodsSellDtos.stream().map(e -> e.getGoodsId()).collect(Collectors.toList());
+
+        Map<Integer, BigDecimal> map = getMap("goods", "id_", "market_price_", goodsIds, Integer.class, BigDecimal.class);
+        for (GoodsSellDto goodsSellDto : goodsSellDtos) {
+            goodsSellDto.setGoodsPrice(map.get(goodsSellDto.getGoodsId()));
+            goodsSellDto.setTotalGoodsPrice(map.get(goodsSellDto.getGoodsId()).multiply(new BigDecimal(goodsSellDto.getGoodsNum())));
+        }
+        Map<Integer, List<GoodsSellDto>> goodsMap = goodsSellDtos.stream().collect(Collectors.groupingBy(GoodsSellDto::getGoodsId));
+        BigDecimal amount = BigDecimal.ZERO;
+        for (Integer id : goodsIds) {
+            GoodsSellDto goodsSellDto = goodsMap.get(id).get(0);
+            amount = amount.add(goodsSellDto.getTotalGoodsPrice());
+        }
+        amount = amount.subtract(studentGoodsSell.getMarketAmount());
+        if(amount.signum() < 0){
+            throw new BizException("操作失败:订单金额异常");
+        }
+        String orderNo1 = studentGoodsSell.getOrderNo();
+        String orderNo = idGeneratorService.generatorId("payment") + "";
+
+        studentGoodsSell.setOrderNo(orderNo);
+        StudentPaymentOrder studentPaymentOrder = null;
+        if(StringUtils.isNotEmpty(orderNo1)){
+            studentPaymentOrder = studentPaymentOrderService.findOrderByOrderNo(orderNo1);
+            if(studentPaymentOrder != null){
+                if(studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS){
+                    throw new BizException("该订单已支付");
+                }
+                //关闭老订单
+                if(studentPaymentOrder.getBalancePaymentAmount() != null){
+                    studentGoodsSell.setIsUseBalancePayment(true);
+                }else {
+                    studentGoodsSell.setIsUseBalancePayment(false);
+                }
+                studentPaymentOrder.setStatus(DealStatusEnum.CLOSE);
+                studentPaymentOrderService.update(studentPaymentOrder);
+                if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
+                    sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "关闭订单");
+                }
             }
-            studentPaymentOrderDetail.setType(type);
-            studentPaymentOrderDetail.setPrice(e.getGroupPurchasePrice());
-            studentPaymentOrderDetail.setGoodsIdList(id);
-            studentPaymentOrderDetail.setPaymentOrderId(studentPaymentOrder.getId());
-            studentPaymentOrderDetail.setKitGroupPurchaseType(KitGroupPurchaseTypeEnum.GROUP);
-            studentPaymentOrderDetailList.add(studentPaymentOrderDetail);
         }
-        studentPaymentOrderDetailService.batchAdd(studentPaymentOrderDetailList);
+        studentGoodsSellDao.update(studentGoodsSell);
+        studentPaymentOrder = new StudentPaymentOrder();
+        studentPaymentOrder.setUserId(studentId);
+        studentPaymentOrder.setGroupType(GroupType.GOODS_SELL);
+        studentPaymentOrder.setOrderNo(orderNo);
+        studentPaymentOrder.setType(OrderTypeEnum.GOODS_SELL);
+        studentPaymentOrder.setExpectAmount(amount);
+        studentPaymentOrder.setActualAmount(amount);
+        studentPaymentOrder.setStatus(DealStatusEnum.ING);
+        studentPaymentOrder.setOrganId(studentGoodsSell.getOrganId());
+        studentPaymentOrder.setRoutingOrganId(studentGoodsSell.getOrganId());
+        studentPaymentOrderService.insert(studentPaymentOrder);
 
         studentPaymentOrder.setVersion(0);
         BigDecimal balance = BigDecimal.ZERO;
-        if (goodsSellDto.getIsUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
+        if (studentGoodsSell.getIsUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
             SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(studentId);
             if (userCashAccount == null) {
                 throw new BizException("用户账户不存在");
@@ -183,7 +325,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
 
         if (amount.compareTo(BigDecimal.ZERO) == 0) {
-            studentPaymentRouteOrderService.addRouteOrder(orderNo, student.getOrganId(), balance);
+            studentPaymentRouteOrderService.addRouteOrder(orderNo, studentGoodsSell.getOrganId(), balance);
             Map<String, String> notifyMap = new HashMap<>();
             notifyMap.put("tradeState", "1");
             notifyMap.put("merOrderNo", studentPaymentOrder.getOrderNo());
@@ -202,7 +344,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                 baseApiUrl + "/api-student/studentOrder/paymentResult?type=edu&orderNo=" + orderNo,
                 "商品销售",
                 "商品销售",
-                student.getOrganId(),
+                studentGoodsSell.getOrganId(),
                 "goodsSell"
         );
 
@@ -509,7 +651,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
 
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public void goodsSellorderCallback(StudentPaymentOrder studentPaymentOrder) {
+    public void goodsSellOrderCallback(StudentPaymentOrder studentPaymentOrder) {
         Date nowDate = new Date();
         //更新订单信息
         studentPaymentOrder.setUpdateTime(nowDate);
@@ -524,6 +666,11 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         map.put(userId, userId.toString());
 
         if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
+            try {
+                contractService.transferProduceContract(userId, null);
+            } catch (Exception e) {
+                logger.error("产品协议生成失败", e);
+            }
             //插入交易明细
             BigDecimal amount = studentPaymentOrder.getActualAmount();
             SysUserCashAccount cashAccount = sysUserCashAccountService.get(userId);
@@ -537,8 +684,10 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
             rechargeDetail.setType(PlatformCashAccountDetailTypeEnum.RECHARGE);
             rechargeDetail.setUserId(userId);
             rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
-            rechargeDetail.setComAmount(studentPaymentOrder.getComAmount());
-            rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount());
+            if (studentPaymentOrder.getComAmount() != null) {
+                rechargeDetail.setComAmount(studentPaymentOrder.getComAmount().negate());
+                rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount().negate());
+            }
             sysUserCashAccountDetailService.insert(rechargeDetail);
             //缴费
             SysUserCashAccountDetail paymentDetail = new SysUserCashAccountDetail();
@@ -549,25 +698,139 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
             paymentDetail.setTransNo(studentPaymentOrder.getTransNo());
             paymentDetail.setType(PlatformCashAccountDetailTypeEnum.GOODS_SELL);
             paymentDetail.setUserId(userId);
-            rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
-            if (studentPaymentOrder.getComAmount() != null) {
-                rechargeDetail.setComAmount(studentPaymentOrder.getComAmount().negate());
-                rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount().negate());
-            }
             sysUserCashAccountDetailService.insert(paymentDetail);
-            //销售订单详情
-            List<StudentPaymentOrderDetail> orderDetails = studentPaymentOrderDetailService.getOrderDetail(studentPaymentOrder.getId());
-            if (orderDetails.size() > 0) {
-                sellOrderService.addOrderDetail2SellOrder(orderDetails, studentPaymentOrder, null);
-            }
+            saveSellOrder(studentPaymentOrder.getOrderNo());
         } else if (studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
-                sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "乐器维修支付失败");
+                sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "乐器购买支付失败");
             }
         }
     }
 
     @Override
+    public PageInfo<BasicUserDto> queryEduStudents(QueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("请登录");
+        }
+        PageInfo<BasicUserDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        params.put("teacherId",sysUser.getId());
+
+        List<BasicUserDto> dataList = null;
+        int count = studentRepairDao.countEduStudents(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentRepairDao.queryEduStudents(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    private void saveSellOrder(String orderNo){
+        StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+        StudentGoodsSell studentGoodsSell = studentGoodsSellDao.findByOrderNo(orderNo);
+        String goodsJson = studentGoodsSell.getGoodsJson();
+        List<GoodsSellDto> goodsSellDtos = JSONObject.parseArray(goodsJson, GoodsSellDto.class);
+        Map<Integer, List<GoodsSellDto>> collect = goodsSellDtos.stream().collect(Collectors.groupingBy(GoodsSellDto::getGoodsId));
+        List<Integer> goodsId = goodsSellDtos.stream().map(e -> e.getGoodsId()).collect(Collectors.toList());
+        List<Goods> goodsByIds = goodsService.findGoodsByIds(StringUtils.join(goodsId, ","));
+        Map<Integer, List<Goods>> goodsMap = goodsByIds.stream().collect(Collectors.groupingBy(Goods::getId));
+        Map<String, BigDecimal> costMap = new HashMap<>(2);
+        List<SellOrder> sellOrders = new ArrayList<>();
+        BigDecimal balancePaymentAmount = orderByOrderNo.getBalancePaymentAmount();
+        //可用余额
+        BigDecimal usableBalance = balancePaymentAmount;
+        BigDecimal marketAmount = studentGoodsSell.getMarketAmount();
+        //可用减免金额
+        BigDecimal usableMarketAmount = marketAmount;
+        //包含减免余额的总金额
+        BigDecimal totalAmount = goodsSellDtos.stream().map(e -> e.getTotalGoodsPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+        //应付总额
+        BigDecimal totalActual = totalAmount.subtract(marketAmount);
+        //可用应付
+        BigDecimal usableActual = totalActual;
+        //获取实付总额
+        BigDecimal realityAmount = totalActual.subtract(usableBalance);
+        //可用实付总额
+        BigDecimal usableAmount = realityAmount;
+        for (int i = 0; i < goodsId.size(); i++) {
+            Integer e = goodsId.get(i);
+            GoodsSellDto goodsSellDto = collect.get(e).get(0);
+            Goods goods = goodsMap.get(e).get(0);
+
+            costMap.put("sellCost", goods.getDiscountPrice());
+            if (goods.getAgreeCostPrice() != null) {
+                costMap.put("SellCost2", goods.getAgreeCostPrice());
+            }
+            SellOrder sellOrder = new SellOrder();
+            sellOrder.setOrganId(orderByOrderNo.getOrganId());
+            sellOrder.setTransNo(orderByOrderNo.getTransNo());
+            sellOrder.setOrderId(orderByOrderNo.getId());
+            sellOrder.setOrderNo(orderByOrderNo.getOrderNo());
+            //获取比例
+            BigDecimal ratioAmount = goodsSellDto.getTotalGoodsPrice().divide(totalAmount, 2, BigDecimal.ROUND_HALF_UP);
+
+            //如果有减免金额
+            if(marketAmount.doubleValue() > 0l){
+                //如果是最后一件商品
+                if(i == goodsId.size() - 1){
+                    goodsSellDto.setTotalGoodsPrice(goodsSellDto.getTotalGoodsPrice().subtract(usableMarketAmount));
+                }else {
+                    //获取分配的减免金额
+                    BigDecimal multiply = ratioAmount.multiply(usableMarketAmount).setScale(2,BigDecimal.ROUND_HALF_UP);
+                    goodsSellDto.setTotalGoodsPrice(goodsSellDto.getTotalGoodsPrice().subtract(multiply));
+                    usableMarketAmount = usableMarketAmount.subtract(multiply);
+                }
+            }
+
+            //如果没有使用余额,那么实际金额和预计金额一致
+            if(balancePaymentAmount.doubleValue() == 0l){
+                sellOrder.setActualAmount(goodsSellDto.getTotalGoodsPrice());
+                sellOrder.setBalanceAmount(BigDecimal.ZERO);
+            }else {
+                //如果是最后一件商品
+                if(i == goodsId.size() - 1){
+                    sellOrder.setActualAmount(usableAmount);
+                    sellOrder.setBalanceAmount(usableBalance);
+                }else {
+                    //获取分配的余额
+                    BigDecimal multiply = ratioAmount.multiply(balancePaymentAmount).setScale(2,BigDecimal.ROUND_HALF_UP);
+                    //分配的实际支付
+                    BigDecimal multiply1 = ratioAmount.multiply(realityAmount).setScale(2,BigDecimal.ROUND_HALF_UP);
+                    sellOrder.setActualAmount(multiply1);
+                    sellOrder.setBalanceAmount(multiply);
+                    usableAmount = usableAmount.subtract(multiply1);
+                    usableBalance = usableBalance.subtract(multiply);
+                    usableActual = usableActual.subtract(multiply1).subtract(multiply);
+                }
+            }
+            sellOrder.setExpectAmount(sellOrder.getActualAmount().add(sellOrder.getBalanceAmount()));
+            sellOrder.setSellCost(goods.getDiscountPrice());
+            sellOrder.setSellCost2(JSONObject.toJSONString(costMap));
+            sellOrder.setType(SellTypeEnum.valueOf(goods.getType().getCode()));
+            sellOrder.setGoodsId(e);
+            sellOrder.setGoodsName(goods.getName());
+            sellOrder.setNum(goodsSellDto.getGoodsNum());
+            sellOrder.setUserId(studentGoodsSell.getUserId());
+            sellOrder.setPaymentChannel(orderByOrderNo.getPaymentChannel());
+            sellOrder.setMerNo(orderByOrderNo.getMerNos());
+            sellOrder.setSellTime(orderByOrderNo.getPayTime());
+            sellOrder.setEduTeacherId(studentGoodsSell.getTeacherId());
+            sellOrder.setCooperationOrganId(studentGoodsSell.getCooperationOrganId());
+            sellOrders.add(sellOrder);
+        }
+        if(sellOrders.size() > 0){
+            sellOrderService.batchInsert(sellOrders);
+        }
+    }
+
+    @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public Boolean orderCallback(StudentPaymentOrder studentPaymentOrder) {
         Date nowDate = new Date();
@@ -592,12 +855,10 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
         map.put(userId, userId.toString());
 
         if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
-            if(repairInfo.getType()==1){
-                try {
-                    contractService.transferProduceContract(userId, null);
-                } catch (Exception e) {
-                    logger.error("产品协议生成失败", e);
-                }
+            try {
+                contractService.transferProduceContract(userId, null);
+            } catch (Exception e) {
+                logger.error("产品协议生成失败", e);
             }
 
             repairInfo.setPayStatus(2);

+ 496 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java

@@ -0,0 +1,496 @@
+package com.ym.mec.biz.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.StudentVisitDto;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
+import com.ym.mec.biz.dal.page.SubjectChangeQueryInfo;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.IdGeneratorService;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
+import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectChange> implements SubjectChangeService {
+
+    @Autowired
+    private SubjectChangeDao subjectChangeDao;
+    @Autowired
+    private GoodsDao goodsDao;
+    @Autowired
+    private StudentDao studentDao;
+    @Autowired
+    private IdGeneratorService idGeneratorService;
+    @Autowired
+    private StudentPaymentOrderService studentPaymentOrderService;
+    @Autowired
+    private SysUserCashAccountService sysUserCashAccountService;
+    @Autowired
+    private StudentPaymentRouteOrderService studentPaymentRouteOrderService;
+    @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
+    private PayService payService;
+    @Autowired
+    private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+    @Autowired
+    private SellOrderDao sellOrderDao;
+    @Autowired
+    private SysUserCashAccountDetailService sysUserCashAccountDetailService;
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
+    private StudentRegistrationService studentRegistrationService;
+    @Autowired
+    private ContractService contractService;
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Override
+    public BaseDAO<Integer, SubjectChange> getDAO() {
+        return subjectChangeDao;
+    }
+
+    @Override
+    public SubjectChange getChangeInfo(Integer id) {
+        SubjectChange subjectChange = subjectChangeDao.getChangeInfo(id);
+        if (subjectChange == null) {
+            return null;
+        }
+        if (subjectChange.getOriginalMusical() != null) {
+            subjectChange.setOriginalMusicalGoods(goodsDao.get(subjectChange.getOriginalMusical()));
+        }
+        if (subjectChange.getOriginalAccessories() != null) {
+            subjectChange.setOriginalAccessoriesGoods(goodsDao.findGoodsByIds(subjectChange.getOriginalAccessories()));
+        }
+
+        if (subjectChange.getChangeMusical() != null) {
+            subjectChange.setChangeMusicalGoods(goodsDao.get(subjectChange.getChangeMusical()));
+        }
+        if (subjectChange.getChangeAccessories() != null) {
+            subjectChange.setChangeAccessoriesGoods(goodsDao.findGoodsByIds(subjectChange.getChangeAccessories()));
+        }
+
+        return subjectChange;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map payChange(Integer id, BigDecimal viewAmount, Boolean isUseBalancePayment, Boolean isRepay) throws Exception {
+        Date date = new Date();
+        SubjectChange subjectChange = subjectChangeDao.get(id);
+        if (isRepay) {
+            StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.get(subjectChange.getOrderId().longValue());
+            studentPaymentOrder.setStatus(DealStatusEnum.CLOSE);
+            studentPaymentOrder.setUpdateTime(date);
+            studentPaymentOrderService.update(studentPaymentOrder);
+            subjectChange.setStatus(SubjectChangeStatusEnum.WAIT_PAY);
+        }
+
+        if (subjectChange.getStatus().equals(SubjectChangeStatusEnum.CANCELED)) {
+            throw new BizException("声部更改已取消,请勿缴费");
+        }
+        if (subjectChange.getStatus().equals(SubjectChangeStatusEnum.SUCCESSED)) {
+            throw new BizException("声部更改已缴费,请勿重复缴费");
+        }
+
+        MusicGroup musicGroup = musicGroupDao.get(subjectChange.getMusicGroupId());
+        if (!musicGroup.getStatus().equals(MusicGroupStatusEnum.APPLY) && !musicGroup.getStatus().equals(MusicGroupStatusEnum.PAY)) {
+            throw new BizException("乐团当前状态不能缴声部更改费用");
+        }
+        BigDecimal amount = subjectChange.getGoodsMargin().add(subjectChange.getCourseMargin());
+
+        studentDao.lockUser(subjectChange.getStudentId());
+
+        String orderNo = idGeneratorService.generatorId("payment") + "";
+
+        String channelType = "";
+
+        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+        studentPaymentOrder.setUserId(subjectChange.getStudentId());
+        studentPaymentOrder.setGroupType(GroupType.SUBJECT_CHANGE);
+        studentPaymentOrder.setOrderNo(orderNo);
+        studentPaymentOrder.setType(OrderTypeEnum.SUBJECT_CHANGE);
+        studentPaymentOrder.setExpectAmount(amount);
+        studentPaymentOrder.setActualAmount(amount);
+        studentPaymentOrder.setStatus(DealStatusEnum.ING);
+        studentPaymentOrder.setMusicGroupId(subjectChange.getId().toString());
+        studentPaymentOrder.setPaymentChannel("BALANCE");
+        studentPaymentOrder.setUpdateTime(date);
+        studentPaymentOrder.setOrganId(subjectChange.getOrganId());
+        studentPaymentOrder.setRoutingOrganId(subjectChange.getOrganId());
+
+        studentPaymentOrderService.insert(studentPaymentOrder);
+
+        subjectChange.setOrderId(studentPaymentOrder.getId().intValue());
+        subjectChange.setOrderNo(orderNo);
+        subjectChange.setOrganId(studentPaymentOrder.getOrganId());
+        subjectChange.setUpdateTime(date);
+        subjectChange.setStatus(SubjectChangeStatusEnum.ING);
+        if (subjectChangeDao.update(subjectChange) <= 0) {
+            throw new BizException("下单失败,请重试");
+        }
+
+        studentPaymentOrder.setVersion(0);
+        if (amount.compareTo(viewAmount) != 0) {
+            throw new BizException("价格异常");
+        }
+
+        BigDecimal balance = BigDecimal.ZERO;
+        if (isUseBalancePayment != null && isUseBalancePayment && amount.compareTo(BigDecimal.ZERO) > 0) {
+            SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(subjectChange.getStudentId());
+            if (userCashAccount == null) {
+                throw new BizException("用户账户找不到");
+            }
+            if (userCashAccount.getBalance() != null && userCashAccount.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+                balance = amount.compareTo(userCashAccount.getBalance()) >= 0 ? userCashAccount.getBalance() : amount;
+                amount = amount.subtract(balance);
+                studentPaymentOrder.setActualAmount(amount);
+                studentPaymentOrder.setBalancePaymentAmount(balance);
+                sysUserCashAccountService.updateBalance(subjectChange.getStudentId(), balance.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "乐器维修");
+            }
+        }
+        if (amount.compareTo(viewAmount) != 0) {
+            throw new BizException("价格异常");
+        }
+        studentPaymentOrderService.update(studentPaymentOrder);
+
+        studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
+
+        if (amount.compareTo(BigDecimal.ZERO) == 0) {
+            studentPaymentRouteOrderService.addRouteOrder(orderNo, subjectChange.getOrganId(), studentPaymentOrder.getExpectAmount());
+            Map<String, String> notifyMap = new HashMap<>();
+            notifyMap.put("tradeState", "1");
+            notifyMap.put("merOrderNo", studentPaymentOrder.getOrderNo());
+            notifyMap.put("channelType", channelType);
+            notifyMap.put("orderNo", "");
+            studentPaymentOrderService.updateOrder(notifyMap);
+            notifyMap.put("orderNo", orderNo);
+            return notifyMap;
+        }
+
+        String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+
+        Map<String, Object> payMap = payService.getPayMap(
+                amount,
+                balance,
+                orderNo,
+                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
+                "声部更换",
+                "声部更换",
+                subjectChange.getOrganId(),
+                "subjectChange"
+        );
+
+        studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
+        studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
+        studentPaymentOrder.setUpdateTime(date);
+        studentPaymentOrderService.update(studentPaymentOrder);
+        return payMap;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public SubjectChange addChange(SubjectChange subjectChange) {
+        SubjectChange studentWaitPay = subjectChangeDao.getStudentWaitPay(subjectChange.getStudentId(), subjectChange.getMusicGroupId());
+        if(studentWaitPay != null){
+            throw new BizException("已有未支付的声部更改,请勿重复创建");
+        }
+        Date nowDate = new Date();
+        SubjectChange studentOriginal = getStudentOriginal(subjectChange.getStudentId(), subjectChange.getMusicGroupId());
+        subjectChange.setOriginalCost(studentOriginal.getOriginalCost());
+        subjectChange.setStatus(SubjectChangeStatusEnum.WAIT_PAY);
+        MusicGroup musicGroup = musicGroupDao.get(subjectChange.getMusicGroupId());
+        subjectChange.setOrganId(musicGroup.getOrganId());
+        subjectChange.setEduTeacherId(musicGroup.getEducationalTeacherId());
+        subjectChange.setCourseMargin(subjectChange.getChangeCourseFee().subtract(subjectChange.getOriginalCourseFee()));
+        BigDecimal goodsMargin = subjectChange.getChangeMusicalPrice().add(subjectChange.getChangeAccessoriesPrice())
+                .subtract(subjectChange.getOriginalMusicalPrice()).subtract(subjectChange.getOriginalAccessoriesPrice());
+        subjectChange.setGoodsMargin(goodsMargin);
+        String goodsIds = "";
+        if (subjectChange.getChangeMusical() != null) {
+            goodsIds += subjectChange.getChangeMusical() + "";
+        }
+        if (subjectChange.getChangeAccessories() != null) {
+            goodsIds += StringUtils.isNotBlank(goodsIds) ? "," + subjectChange.getChangeAccessories() : subjectChange.getChangeAccessories();
+        }
+        BigDecimal goodsPrice = BigDecimal.ZERO;
+        List<Goods> goodies = goodsDao.findGoodsByIds(goodsIds);
+        for (Goods goods : goodies) {
+            goodsPrice = goodsPrice.add(goods.getDiscountPrice());
+        }
+        subjectChange.setChangeCost(goodsPrice);
+        subjectChange.setCostMargin(subjectChange.getChangeCost().subtract(subjectChange.getOriginalCost()));
+        //差价 <= 0
+        BigDecimal amountMargin = subjectChange.getGoodsMargin().add(subjectChange.getCourseMargin());
+        if (amountMargin.compareTo(BigDecimal.ZERO) <= 0) {
+            subjectChange.setStatus(SubjectChangeStatusEnum.SUCCESSED);
+            subjectChange.setSellAmount(BigDecimal.ZERO);
+            subjectChange.setSellTime(nowDate);
+        }
+        //差价小于0退到余额
+        if (amountMargin.compareTo(BigDecimal.ZERO) <= 0) {
+            sysUserCashAccountService.updateBalance(subjectChange.getStudentId(), amountMargin.negate(), PlatformCashAccountDetailTypeEnum.REFUNDS, "声部更换退还");
+            studentRegistrationService.changeStudentSubject(subjectChange.getStudentId(), subjectChange.getMusicGroupId(), subjectChange.getOriginalSubjectId(), subjectChange.getChangeSubjectId());
+        }
+        subjectChange.setCreateTime(nowDate);
+        subjectChange.setUpdateTime(nowDate);
+        subjectChange.setVersion(0);
+        subjectChangeDao.insert(subjectChange);
+        return subjectChange;
+    }
+
+    @Override
+    public SubjectChange cancel(Integer id) {
+        SubjectChange subjectChange = subjectChangeDao.get(id);
+        if (!subjectChange.getStatus().equals(SubjectChangeStatusEnum.WAIT_PAY)) {
+            throw new BizException("不是待支付状态,不能取消");
+        }
+        subjectChange.setStatus(SubjectChangeStatusEnum.CANCELED);
+        subjectChange.setUpdateTime(new Date());
+        if (subjectChangeDao.update(subjectChange) <= 0) {
+            throw new BizException("取消失败,请重试");
+        }
+        return subjectChange;
+    }
+
+    @Override
+    public SubjectChange getStudentOriginal(Integer studentId, String musicGroupId) {
+        //1、存在历史的更换
+        SubjectChange subjectChange = new SubjectChange();
+        SubjectChange studentLastChange = subjectChangeDao.getStudentLastChange(studentId, musicGroupId);
+        if (studentLastChange != null) {
+            subjectChange.setStudentId(studentLastChange.getStudentId());
+            subjectChange.setOrderId(studentLastChange.getOrderId());
+            subjectChange.setCooperationOrganId(studentLastChange.getCooperationOrganId());
+            subjectChange.setMusicGroupId(studentLastChange.getMusicGroupId());
+            subjectChange.setOriginalCourseFee(studentLastChange.getChangeCourseFee());
+            subjectChange.setKitGroupPurchaseType(studentLastChange.getKitGroupPurchaseType());
+            subjectChange.setOriginalCost(studentLastChange.getChangeCost());
+
+            if (studentLastChange.getChangeMusical() != null) {
+                subjectChange.setOriginalMusical(studentLastChange.getChangeMusical());
+                subjectChange.setOriginalMusicalGoods(goodsDao.get(studentLastChange.getChangeMusical()));
+                subjectChange.setOriginalMusicalPrice(studentLastChange.getChangeMusicalPrice());
+            }
+
+            if (studentLastChange.getChangeAccessories() != null) {
+                subjectChange.setOriginalAccessories(studentLastChange.getChangeAccessories());
+                subjectChange.setOriginalAccessoriesGoods(goodsDao.findGoodsByIds(studentLastChange.getChangeAccessories()));
+                subjectChange.setOriginalAccessoriesPrice(studentLastChange.getChangeAccessoriesPrice());
+            }
+            return subjectChange;
+        }
+        //2.1不存在历史的更换
+        List<StudentPaymentOrderDetail> details = studentPaymentOrderDetailDao.getStudentApplyDetail(studentId, musicGroupId);
+        if (details.size() <= 0) {
+            return null;
+        }
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        subjectChange.setStudentId(studentId);
+        subjectChange.setOrganId(musicGroup.getOrganId());
+        subjectChange.setCooperationOrganId(musicGroup.getCooperationOrganId());
+        subjectChange.setMusicGroupId(musicGroupId);
+        String accessoriesIds = "";
+        BigDecimal accessoriesPrice = BigDecimal.ZERO;
+        for (StudentPaymentOrderDetail detail : details) {
+            if (detail.getType().equals(OrderDetailTypeEnum.COURSE)) {
+                subjectChange.setOriginalCourseFee(detail.getPrice());
+            } else if (detail.getType().equals(OrderDetailTypeEnum.MUSICAL)) {
+                subjectChange.setKitGroupPurchaseType(detail.getKitGroupPurchaseType());
+                int goodsId = Integer.parseInt(detail.getGoodsIdList());
+                subjectChange.setOriginalMusical(goodsId);
+                subjectChange.setOriginalMusicalGoods(goodsDao.get(goodsId));
+                subjectChange.setOriginalMusicalPrice(detail.getPrice());
+            } else {
+                if (StringUtils.isNotBlank(detail.getGoodsIdList())) {
+                    accessoriesPrice = accessoriesPrice.add(detail.getPrice());
+                    accessoriesIds = accessoriesIds.length() > 0 ? accessoriesIds + "," + detail.getGoodsIdList() : detail.getGoodsIdList();
+                }
+            }
+        }
+        if (StringUtils.isNotBlank(accessoriesIds)) {
+            subjectChange.setOriginalAccessories(accessoriesIds);
+            subjectChange.setOriginalAccessoriesGoods(goodsDao.findGoodsByIds(accessoriesIds));
+            subjectChange.setOriginalAccessoriesPrice(accessoriesPrice);
+        }
+        Long orderId = details.get(0).getPaymentOrderId();
+        //2.2 计算销售成本
+        BigDecimal orderSellCost = sellOrderDao.getOrderSellCost(orderId);
+        subjectChange.setOriginalCost(orderSellCost == null ? BigDecimal.ZERO : orderSellCost);
+        return subjectChange;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean orderCallback(StudentPaymentOrder studentPaymentOrder) {
+        Date nowDate = new Date();
+        //更新订单信息
+        studentPaymentOrder.setUpdateTime(nowDate);
+        int updateCount = studentPaymentOrderService.update(studentPaymentOrder);
+        if (updateCount <= 0) {
+            throw new BizException("订单更新失败");
+        }
+
+        //更新声部更改信息状态
+        SubjectChange subjectChange = subjectChangeDao.get(Integer.parseInt(studentPaymentOrder.getMusicGroupId()));
+        if (subjectChange == null) {
+            throw new BizException("声部更换订单不存在");
+        }
+        if (!subjectChange.getStatus().equals(SubjectChangeStatusEnum.ING)) {
+            return true;
+        }
+
+        subjectChange.setUpdateTime(nowDate);
+        subjectChange.setTransNo(studentPaymentOrder.getTransNo());
+        subjectChange.setMerNo(studentPaymentOrder.getMerNos());
+        subjectChange.setPaymentChannel(studentPaymentOrder.getPaymentChannel());
+
+        Integer userId = studentPaymentOrder.getUserId();
+
+        Map<Integer, String> map = new HashMap<>();
+        map.put(userId, userId.toString());
+
+        if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
+            try {
+                contractService.transferProduceContract(userId, null);
+            } catch (Exception e) {
+                logger.error("产品协议生成失败", e);
+            }
+            //更新声部信息报名数量
+            studentRegistrationService.changeStudentSubject(subjectChange.getStudentId(), subjectChange.getMusicGroupId(), subjectChange.getOriginalSubjectId(), subjectChange.getChangeSubjectId());
+
+            subjectChange.setStatus(SubjectChangeStatusEnum.SUCCESSED);
+            subjectChange.setSellTime(nowDate);
+
+            //乐器辅件价差大于0时,有销售金额
+            if (subjectChange.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.GROUP) && studentPaymentOrder.getActualAmount().compareTo(BigDecimal.ZERO) > 0) {
+                BigDecimal sellAmount = studentPaymentOrder.getActualAmount().multiply(subjectChange.getGoodsMargin())
+                        .divide(studentPaymentOrder.getExpectAmount(), 2, BigDecimal.ROUND_HALF_UP);
+                subjectChange.setSellAmount(sellAmount);
+            }
+
+            if (this.update(subjectChange) <= 0) {
+                throw new BizException("维修单更新失败");
+            }
+
+            //插入交易明细
+            BigDecimal amount = studentPaymentOrder.getActualAmount();
+            SysUserCashAccount cashAccount = sysUserCashAccountService.get(userId);
+            //充值
+            SysUserCashAccountDetail rechargeDetail = new SysUserCashAccountDetail();
+            rechargeDetail.setAmount(amount);
+            rechargeDetail.setBalance(cashAccount.getBalance().add(amount));
+            rechargeDetail.setComment("缴费前充值");
+            rechargeDetail.setCreateTime(nowDate);
+            rechargeDetail.setStatus(DealStatusEnum.SUCCESS);
+            rechargeDetail.setTransNo(studentPaymentOrder.getTransNo());
+            rechargeDetail.setType(PlatformCashAccountDetailTypeEnum.RECHARGE);
+            rechargeDetail.setUpdateTime(nowDate);
+            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.negate());
+            paymentDetail.setBalance(cashAccount.getBalance());
+            paymentDetail.setComment("声部更改");
+            paymentDetail.setCreateTime(nowDate);
+            paymentDetail.setStatus(DealStatusEnum.SUCCESS);
+            paymentDetail.setTransNo(studentPaymentOrder.getTransNo());
+            paymentDetail.setType(PlatformCashAccountDetailTypeEnum.PAY_FEE);
+            paymentDetail.setUpdateTime(nowDate);
+            paymentDetail.setUserId(userId);
+            rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
+            if (studentPaymentOrder.getComAmount() != null) {
+                rechargeDetail.setComAmount(studentPaymentOrder.getComAmount().negate());
+                rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount().negate());
+            }
+            sysUserCashAccountDetailService.insert(paymentDetail);
+        }
+
+        if (studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
+            subjectChange.setStatus(SubjectChangeStatusEnum.WAIT_PAY);
+            if (this.update(subjectChange) <= 0) {
+                throw new BizException("声部更改订单更新失败");
+            }
+            if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
+                sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "声部更改支付失败");
+            }
+
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_SPORADIC_PAYMENT_FAILED, map, null, 0, "", "STUDENT",
+                    studentPaymentOrder.getActualAmount(), "声部更换");
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public PageInfo<SubjectChange> getPageList(SubjectChangeQueryInfo queryInfo) {
+        if (queryInfo.getEndTime() != null) {
+            queryInfo.setEndTime(DateUtil.getLastTimeWithDay(queryInfo.getEndTime()));
+        }
+        PageInfo<SubjectChange> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<SubjectChange> dataList = new ArrayList<>();
+        int count = subjectChangeDao.queryCount(params);
+
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = subjectChangeDao.getPageList(params);
+            for (SubjectChange subjectChange : dataList) {
+                if (subjectChange.getOriginalMusical() != null) {
+                    subjectChange.setOriginalMusicalGoods(goodsDao.get(subjectChange.getOriginalMusical()));
+                }
+                if (subjectChange.getOriginalAccessories() != null) {
+                    subjectChange.setOriginalAccessoriesGoods(goodsDao.findGoodsByIds(subjectChange.getOriginalAccessories()));
+                }
+                if (subjectChange.getChangeMusical() != null) {
+                    subjectChange.setChangeMusicalGoods(goodsDao.get(subjectChange.getChangeMusical()));
+                }
+                if (subjectChange.getChangeAccessories() != null) {
+                    subjectChange.setChangeAccessoriesGoods(goodsDao.findGoodsByIds(subjectChange.getChangeAccessories()));
+                }
+            }
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public SubjectChange updateCostMargin(Integer id, BigDecimal costMargin) {
+        SubjectChange subjectChange = subjectChangeDao.get(id);
+        subjectChange.setCostMargin(costMargin);
+        subjectChange.setUpdateTime(new Date());
+        if (subjectChangeDao.update(subjectChange) <= 0) {
+            throw new BizException("更新成本差失败,请重试");
+        }
+        return subjectChange;
+    }
+}

+ 106 - 122
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -246,44 +246,85 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void addTeacherAttendanceRecord(Integer courseScheduleId, Integer userId, SignStatusEnum signStatus, boolean updateCourseScheduleStatus) {
-		TeacherAttendance teacherAttendance=teacherAttendanceDao.findByTeacherAttendanceInfo(userId.longValue(),courseScheduleId.longValue());
-		ClassGroup classGroup = classGroupDao.findByCourseSchedule(courseScheduleId,0);
-		CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId.longValue());
+	public void addTeacherAttendanceSignOut(Long firstCourseId, Integer userId) {
+		Date date = new Date();
+		//签退
+		CourseSchedule courseSchedule = courseScheduleDao.get(firstCourseId);
+		List<CourseSchedule> courseSchedules = new ArrayList<>();
+		courseSchedules.add(courseSchedule);
+		CourseSchedule cs = courseSchedule;
+		String continueCourseTime = sysConfigDao.findConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME);
+		if(StringUtils.isEmpty(continueCourseTime)){
+			continueCourseTime = "5";
+		}
+		while (true){
+			//获取当前课程的所有连堂课列表
+			String courseClassDate = DateUtil.format(cs.getClassDate(), DateUtil.DEFAULT_PATTERN);
+			String courseEndDateTime = DateUtil.format(cs.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+			cs = courseScheduleDao.queryTeacherContinueCourse(cs,continueCourseTime,courseClassDate + " " + courseEndDateTime);
+			//存在连堂课
+			if(cs != null){
+				courseSchedules.add(cs);
+			}else {
+				break;
+			}
+		}
+		String courseClassDate;
+		String courseStartDateTime;
+		String courseEndDateTime;
+		Boolean isBreak = false;
+		for (int i = courseSchedules.size() - 1; i >= 0; i--) {
+			if(isBreak){
+				break;
+			}
+			CourseSchedule schedule = courseSchedules.get(i);
+			courseClassDate = DateUtil.format(schedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
+			courseStartDateTime = DateUtil.format(schedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+			Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+			courseEndDateTime = DateUtil.format(schedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+			Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
+			//不是最后一节课
+			if(i == courseSchedules.size() - 1){
+				if(date.after(endDateTime)){
+					isBreak = upsetAttendance(userId,startDateTime,date,YesOrNoEnum.YES,schedule,firstCourseId);
+				}else {
+					isBreak = upsetAttendance(userId,startDateTime,date,YesOrNoEnum.NO,schedule,firstCourseId);
+				}
+			}else {
+				isBreak = upsetAttendance(userId,startDateTime,endDateTime,YesOrNoEnum.YES,schedule,firstCourseId);
+			}
+		}
+	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void addTeacherAttendanceSignIn(Long firstCourseId, Integer userId, Long courseScheduleId) {
+		ClassGroup classGroup = classGroupDao.findByCourseSchedule(courseScheduleId.intValue(),0);
+		TeacherAttendance teacherAttendance=teacherAttendanceDao.findByTeacherAttendanceInfo(userId.longValue(),courseScheduleId);
 		if(Objects.isNull(teacherAttendance)){
 			teacherAttendance=new TeacherAttendance();
-			teacherAttendance.setGroupType(courseSchedule.getGroupType());
-			teacherAttendance.setCourseScheduleId(courseScheduleId.longValue());
+			teacherAttendance.setGroupType(classGroup.getGroupType());
+			teacherAttendance.setCourseScheduleId(courseScheduleId);
 			teacherAttendance.setTeacherId(userId);
 			teacherAttendance.setMusicGroupId(classGroup.getMusicGroupId());
 			teacherAttendance.setClassGroupId(classGroup.getId());
 			teacherAttendance.setTeacherId(userId);
+			teacherAttendance.setCurrentScheduleId(firstCourseId);
 			teacherAttendanceDao.insert(teacherAttendance);
 		}else {
-			teacherAttendance.setGroupType(courseSchedule.getGroupType());
+			teacherAttendance.setCurrentScheduleId(firstCourseId);
+			teacherAttendance.setGroupType(classGroup.getGroupType());
 			teacherAttendance.setTeacherId(userId);
 			teacherAttendance.setClassGroupId(classGroup.getId());
 			teacherAttendance.setMusicGroupId(classGroup.getMusicGroupId());
 		}
-//		int advanceSignMinutes = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_IN_MINUTES));
-		Date date = new Date();
-		String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
-		String startClassTime = DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-		String endClassTime = DateUtil.format(courseSchedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-		//上课时间
-		Date classStartDateTime = DateUtil.stringToDate(classDate + " " + startClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-		Date classEndDateTime = DateUtil.stringToDate(classDate + " " + endClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-//		Date classEndDateAdd60Minutes = DateUtil.addMinutes(classEndDateTime, 60);
-//		Date classEndDateCut10Minutes = DateUtil.addMinutes(classEndDateTime, -10);
-		Date add1Minutes = DateUtil.addMinutes(classStartDateTime, -1);
-//		Date add60Minutes = DateUtil.addMinutes(classStartDateTime, -60);
 		//签到
-		String continueCourseTime = sysConfigDao.findConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME);
-		if(StringUtils.isEmpty(continueCourseTime)){
-			continueCourseTime = "5";
-		}
-		if(teacherAttendance.getSignInTime() == null && SignStatusEnum.SIGN_IN.equals(signStatus)){
+		if(teacherAttendance.getSignInTime() == null){
+			Date date = new Date();
+			CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
+			String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
+			String startClassTime = DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
+			Date classStartDateTime = DateUtil.stringToDate(classDate + " " + startClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 			YesOrNoEnum yesOrNoEnum = courseScheduleService.enableOnlyNormalAttendance(courseSchedule.getStartClassTime(),
 					userId.longValue(),
 					false,
@@ -291,112 +332,55 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 			teacherAttendance.setSignInTime(date);
 			teacherAttendance.setSignInStatus(YesOrNoEnum.YES);
 			teacherAttendance.setCurrentClassTimes(classGroup.getCurrentClassTimes() + 1);
-			boolean isSign = false;
-			if(yesOrNoEnum == YesOrNoEnum.YES){
-				isSign = true;
-			}else if(DateUtil.minutesBetween(date,add1Minutes) > 0){
-				//正常签到范围(开始之前)
-				isSign = true;
-			}else {
-				//异常签到范围(开始之后)
-				isSign = true;
+			Date add1Minutes = DateUtil.addMinutes(classStartDateTime, -1);
+			if(yesOrNoEnum != YesOrNoEnum.YES && DateUtil.minutesBetween(date,add1Minutes) <= 0){
 				teacherAttendance.setSignInStatus(YesOrNoEnum.NO);
 			}
-			if(isSign){
-				teacherAttendanceDao.update(teacherAttendance);
-				if(courseSchedule.getTeachMode() == TeachModeEnum.ONLINE){
-					//获取所有当前课程的学生列表
-					Map<Integer,String> userMap = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertMybatisMap(courseScheduleDao.findStudentMap(courseScheduleId))),HashMap.class);
-					if(userMap != null && userMap.size() > 0){
-						String name = subjectDao.findNames(classGroup.getSubjectIdList());
-						sysMessageService.batchSendMessage(MessageSender.JIGUANG,MessageTypeEnum.STUDENT_PUSH_ONLINE_COURSE_ACTION,userMap,
-								null,0,"6?sealClassId=" + courseScheduleId + "&subjectName=" + name ,"STUDENT",courseSchedule.getName());
-					}
+			teacherAttendanceDao.update(teacherAttendance);
+			if(courseSchedule.getTeachMode() == TeachModeEnum.ONLINE){
+				//获取所有当前课程的学生列表
+				Map<Integer,String> userMap = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertMybatisMap(courseScheduleDao.findStudentMap(courseScheduleId))),HashMap.class);
+				if(userMap != null && userMap.size() > 0){
+					String name = subjectDao.findNames(classGroup.getSubjectIdList());
+					sysMessageService.batchSendMessage(MessageSender.JIGUANG,MessageTypeEnum.STUDENT_PUSH_ONLINE_COURSE_ACTION,userMap,
+							null,0,"6?sealClassId=" + courseScheduleId + "&subjectName=" + name ,"STUDENT",courseSchedule.getName());
 				}
 			}
 		}
-		//签退
-		if(SignStatusEnum.SIGN_OUT.equals(signStatus)){
-			if(DateUtil.minutesBetween(classEndDateTime,date) >= 0){
-				List<CourseSchedule> courseSchedules = new ArrayList<>();
-				CourseSchedule cs = courseSchedule;
-				while (true){
-					//获取当前课程的所有连堂课列表
-					String courseClassDate = DateUtil.format(cs.getClassDate(), DateUtil.DEFAULT_PATTERN);
-					String courseEndDateTime = DateUtil.format(cs.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-//					Date toDate = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-					cs = courseScheduleDao.queryContinueCourse(cs,continueCourseTime,courseClassDate + " " + courseEndDateTime);
-					//存在连堂课
-					if(cs != null){
-						courseSchedules.add(cs);
-					}else {
-						break;
-					}
-				}
-				if(courseSchedules.size() > 0){
-					//获取总上课时长
-					int totalMinutes = DateUtil.minutesBetween(classStartDateTime, date);
-					//减去第一节课时长
-					int firstMinutes = courseScheduleDao.getSingleClassMinutes(courseScheduleId.longValue());
-					totalMinutes -= firstMinutes;
-					if(totalMinutes > 0){
-						String courseClassDate;
-						String courseStartDateTime;
-						String courseEndDateTime;
-						for (int i = 0; i < courseSchedules.size(); i++) {
-							courseClassDate = DateUtil.format(courseSchedules.get(i).getClassDate(), DateUtil.DEFAULT_PATTERN);
-							courseStartDateTime = DateUtil.format(courseSchedules.get(i).getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-							courseEndDateTime = DateUtil.format(courseSchedules.get(i).getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-							Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-							Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
-							Date signOutTime = date;
-							if(date.before(startDateTime)){
-								continue;
-							}
-							if(i < courseSchedules.size() - 1 && date.after(endDateTime)){
-								//不是最后一节连堂课,并且签退时间大于课程结束时间,签退时间等于课程结束时间
-								signOutTime = endDateTime;
-							}
-							//如果签退时间大于课程结束时间
-							//如果当前课程没有签退记录,那么正常更新
-							TeacherAttendance personalAttendance = teacherAttendanceDao.findByTeacherAttendanceInfo(userId.longValue(),courseSchedules.get(i).getId());
-							if(personalAttendance != null && personalAttendance.getSignOutStatus() == YesOrNoEnum.NO){
-								continue;
-							}
-							//如果当前课程有签到时间,那么只更新签退时间和状态
-							if(personalAttendance.getSignInTime() != null){
-								startDateTime = null;
-							}
-							if(personalAttendance.getSignOutTime() != null){
-								continue;
-							}
-							if(date.after(endDateTime)){
-								teacherAttendanceDao.cuntinueCourseSign(courseSchedules.get(i).getId(),startDateTime,signOutTime,1);
-							}else if (date.equals(endDateTime)){
-								teacherAttendanceDao.cuntinueCourseSign(courseSchedules.get(i).getId(),startDateTime,signOutTime,1);
-							}else {
-								teacherAttendanceDao.cuntinueCourseSign(courseSchedules.get(i).getId(),startDateTime,signOutTime,0);
-							}
-							if(teacherAttendance.getSignOutTime() == null){
-								teacherAttendance.setSignOutStatus(YesOrNoEnum.YES);
-								teacherAttendance.setSignOutTime(classEndDateTime);
-							}
-						}
-					}
-				}else {
-					teacherAttendance.setSignOutStatus(YesOrNoEnum.YES);
-					teacherAttendance.setSignOutTime(date);
-				}
-				if(teacherAttendance.getSignOutTime() == null){
-					teacherAttendance.setSignOutStatus(YesOrNoEnum.YES);
-					teacherAttendance.setSignOutTime(date);
-				}
-			}else {
-				teacherAttendance.setSignOutStatus(YesOrNoEnum.NO);
-				teacherAttendance.setSignOutTime(date);
+	}
+
+	public Boolean upsetAttendance(Integer userId,Date signInTime,Date signOutTime,YesOrNoEnum status,CourseSchedule courseSchedule,Long courseScheduleId){
+		TeacherAttendance teacherAttendance = teacherAttendanceDao.findByTeacherAttendanceInfo(userId.longValue(),courseSchedule.getId());
+		Boolean flag = false;
+		Long courseId = teacherAttendanceDao.findFirstSign(courseScheduleId,userId);
+		//如果当前课程是第一次签到的课程那么不更新签到时间,并且退出下次循环
+		if(courseId != null && courseId.equals(courseSchedule.getId())){
+			flag = true;
+		}
+		if(teacherAttendance == null){
+			teacherAttendance = new TeacherAttendance();
+			teacherAttendance.setGroupType(courseSchedule.getGroupType());
+			teacherAttendance.setTeacherId(userId);
+			teacherAttendance.setMusicGroupId(courseSchedule.getMusicGroupId());
+			teacherAttendance.setClassGroupId(courseSchedule.getClassGroupId());
+			teacherAttendance.setCourseScheduleId(courseSchedule.getId());
+			teacherAttendance.setSignInStatus(YesOrNoEnum.YES);
+			teacherAttendance.setSignOutStatus(status);
+			teacherAttendance.setSignOutTime(signOutTime);
+			teacherAttendance.setSignInTime(signInTime);
+			teacherAttendance.setCurrentScheduleId(courseScheduleId);
+			teacherAttendanceDao.insert(teacherAttendance);
+		}else {
+			teacherAttendance.setSignOutStatus(status);
+			teacherAttendance.setSignOutTime(signOutTime);
+			teacherAttendance.setCurrentScheduleId(courseScheduleId);
+			if(!flag){
+				teacherAttendance.setSignInTime(signInTime);
+				teacherAttendance.setSignInStatus(YesOrNoEnum.YES);
 			}
 			teacherAttendanceDao.update(teacherAttendance);
 		}
+		return flag;
 	}
 
 	@Override

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

@@ -1805,10 +1805,13 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		int studentCourseNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroup.getId());
 		if(studentCourseNum<=0&&classGroup.getStudentNum().equals(classGroup.getExpectStudentNum())){
 			vipGroup.setStatus(VipGroupStatusEnum.PAUSE);
-			if(!CollectionUtils.isEmpty(courseScheduleIds)){
-				courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(courseScheduleIds);
-				courseScheduleDao.batchDeleteCourseSchedules(courseScheduleIds);
-				teacherAttendanceDao.batchDeleteByCourseSchedules(courseScheduleIds);
+			int notStartCourseStudentNum = courseScheduleStudentPaymentDao.countNotStartCourseStudentNumWithGroup(vipGroupId.toString(), GroupType.VIP);
+			if(notStartCourseStudentNum<=0){
+				List<CourseSchedule> groupNotFinishCourses = courseScheduleDao.findGroupNotFinishCourses(vipGroupId.toString(), GroupType.VIP);
+				List<Long> csIds = groupNotFinishCourses.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+				courseScheduleTeacherSalaryDao.batchDeleteByCourseScheduleIds(csIds);
+				courseScheduleDao.batchDeleteCourseSchedules(csIds);
+				teacherAttendanceDao.batchDeleteByCourseSchedules(csIds);
 			}
 			vipGroupDao.update(vipGroup);
 		}

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

@@ -206,13 +206,11 @@
             course_schedule_student_payment cssp
             LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
             LEFT JOIN student_attendance sa ON cssp.course_schedule_id_ = sa.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
-            LEFT JOIN class_group_student_mapper cgsm ON cssp.user_id_=cgsm.user_id_ AND cssp.class_group_id_=cgsm.class_group_id_
             LEFT JOIN student_registration sr ON sr.user_id_=cssp.user_id_ AND cssp.music_group_id_=sr.music_group_id_
             LEFT JOIN `subject` s ON sr.subject_id_=s.id_
         WHERE
             cssp.course_schedule_id_ =#{courseScheduleId}
             AND su.id_ IS NOT NULL
-            AND cgsm.status_!='QUIT' AND cgsm.status_!='QUIT_SCHOOL'
         ORDER BY cssp.user_id_
         <include refid="global.limit"/>
     </select>
@@ -224,11 +222,9 @@
             course_schedule_student_payment cssp
             LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
             LEFT JOIN student_attendance sa ON cssp.course_schedule_id_ = sa.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
-            LEFT JOIN class_group_student_mapper cgsm ON cssp.user_id_=cgsm.user_id_ AND cssp.class_group_id_=cgsm.class_group_id_
         WHERE
             cssp.course_schedule_id_ =#{courseScheduleId}
             AND su.id_ IS NOT NULL
-            AND cgsm.status_!='QUIT' AND cgsm.status_!='QUIT_SCHOOL'
     </select>
 
     <update id="deleteStudentByMusicGroupId" parameterType="map">

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

@@ -2619,24 +2619,26 @@
           AND #{startTime} &lt; CONCAT(cs.class_date_, ' ', cs.end_class_time_)
           AND #{endTime} &gt; CONCAT(cs.class_date_, ' ', cs.start_class_time_);
     </select>
-    <select id="queryContinueCourse" resultMap="CourseSchedule">
+    <select id="queryStudentContinueCourse" resultMap="CourseSchedule">
         SELECT cs.*
         FROM course_schedule cs
-                 LEFT JOIN teacher_attendance ta ON cs.id_ = ta.course_schedule_id_
+        LEFT JOIN student_attendance sa ON cs.id_ = sa.course_schedule_id_
         WHERE TIMESTAMPDIFF(MINUTE, #{endDateTime}, CONCAT(cs.class_date_, ' ', cs.start_class_time_)) >= 0
           AND TIMESTAMPDIFF(MINUTE, #{endDateTime}, CONCAT(cs.class_date_, ' ', cs.start_class_time_)) &lt;= #{continueCourseTime}
           AND cs.teacher_id_ = #{courseSchedule.teacherId}
           AND cs.class_group_id_ = #{courseSchedule.classGroupId}
+          AND (NOW() > CONCAT(cs.class_date_,' ', cs.start_class_time_) OR sa.sign_in_time_ IS NOT NULL)
         LIMIT 1
     </select>
-    <select id="queryRepairContinueCourse" resultMap="CourseSchedule">
+    <select id="queryTeacherContinueCourse" resultMap="CourseSchedule">
         SELECT cs.*
         FROM course_schedule cs
-                 LEFT JOIN teacher_attendance ta ON cs.id_ = ta.course_schedule_id_
+        LEFT JOIN teacher_attendance ta ON cs.id_ = ta.course_schedule_id_
         WHERE TIMESTAMPDIFF(MINUTE, #{endDateTime}, CONCAT(cs.class_date_, ' ', cs.start_class_time_)) >= 0
           AND TIMESTAMPDIFF(MINUTE, #{endDateTime}, CONCAT(cs.class_date_, ' ', cs.start_class_time_)) &lt;= #{continueCourseTime}
           AND cs.teacher_id_ = #{courseSchedule.teacherId}
           AND cs.class_group_id_ = #{courseSchedule.classGroupId}
+          AND (NOW() > CONCAT(cs.class_date_,' ', cs.start_class_time_) OR ta.sign_in_time_ IS NOT NULL)
         LIMIT 1
     </select>
     <select id="getSingleClassMinutes" resultType="java.lang.Integer">
@@ -3109,12 +3111,10 @@
 
     <select id="getLastCourse" resultMap="CourseSchedule">
         SELECT cs.* FROM course_schedule cs
-        LEFT JOIN teacher_attendance ta ON cs.id_ = ta.course_schedule_id_ AND ta.teacher_id_ = cs.actual_teacher_id_
-        LEFT JOIN student_attendance sa ON cs.id_ = sa.course_schedule_id_
         WHERE cs.class_group_id_ = #{classGroupId}
         AND TIMESTAMPDIFF(MINUTE, CONCAT(cs.class_date_," ",cs.end_class_time_),#{startTime}) &lt;= #{continueCourseTime}
         AND TIMESTAMPDIFF(MINUTE, CONCAT(cs.class_date_," ",cs.end_class_time_),#{startTime}) >= 0
-        AND cs.actual_teacher_id_ = #{teacherId} AND ta.sign_in_time_ IS NOT NULL AND sa.id_ IS NOT NULL
+        AND cs.actual_teacher_id_ = #{teacherId}
         ORDER BY cs.class_date_ DESC,cs.end_class_time_ DESC
         LIMIT 1
     </select>

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

@@ -495,4 +495,16 @@
 		WHERE cssp.course_schedule_id_ = #{courseScheduleId}
 		AND NOT EXISTS (SELECT * FROM rongyun_room_member rrm WHERE rrm.rid = #{roomId} AND rrm.uid = cssp.user_id_)
 	</select>
+
+	<select id="countNotStartCourseStudentNumWithGroup" resultType="int">
+		SELECT
+			COUNT( cssp.user_id_ )
+		FROM
+			course_schedule_student_payment cssp
+			LEFT JOIN course_schedule cs ON cssp.course_schedule_id_ = cs.id_
+		WHERE
+			cssp.group_type_ = #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			AND cssp.music_group_id_ = #{groupId}
+			AND CONCAT( cs.class_date_, ' ', cs.start_class_time_ ) > NOW( )
+	</select>
 </mapper>

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

@@ -36,6 +36,9 @@
                 typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="fee_type_" property="feeType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="del_flag_" property="delFlag"/>
+        <result column="payment_valid_start_date_" property="paymentValidStartDate"/>
+        <result column="payment_valid_end_date_" property="paymentValidEndDate"/>
+        <result column="payment_pattern_" property="paymentPattern"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -68,7 +71,7 @@
          bill_start_date_, improvent_classes_num_, enroll_classes_, payment_expire_date_, is_extra_class_,
          settlement_type_, cooperation_organ_id_, enlightenment_course_time_,
          parent_meeting_time_, img_, director_user_id_, is_classroom_lessons_, memo_, expect_start_group_date_,
-         ownership_type_, repair_user_id_, fee_type_, del_flag_)
+         ownership_type_, repair_user_id_, fee_type_, del_flag_,payment_valid_start_date_,payment_valid_end_date_,payment_pattern_)
         VALUES (#{id}, #{name}, #{organId}, #{schoolId}, #{applyExpireDate}, #{teamTeacherId}, #{educationalTeacherId},
                 #{chargeTypeId}, #{courseForm}, now(), now(),
                 #{status, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{billStartDate},
@@ -78,13 +81,20 @@
                 #{cooperationOrganId}, #{enlightenmentCourseTime}, #{parentMeetingTime}, #{img}, #{directorUserId},
                 #{isClassroomLessons}, #{memo}, #{expectStartGroupDate},
                 #{ownershipType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{repairUserId},
-                #{feeType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{delFlag})
+                #{feeType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{delFlag},#{paymentValidStartDate},#{paymentValidEndDate},#{paymentPattern})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.MusicGroup">
         UPDATE music_group
         <set>
+            <if test="paymentPattern != null">
+                payment_pattern_ = #{paymentPattern},
+            </if>
+            <if test="paymentValidStartDate != null">
+                payment_valid_start_date_ = #{paymentValidStartDate},
+                payment_valid_end_date_ = #{paymentValidEndDate},
+            </if>
             <if test="ownershipType != null">
                 ownership_type_ = #{ownershipType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
@@ -597,4 +607,20 @@
         </if>
         ORDER BY mg.create_time_ DESC
     </select>
+    <select id="getFirstEduTeacherId" resultType="java.lang.Integer">
+        SELECT mg.educational_teacher_id_ FROM student_registration sr
+        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
+        WHERE user_id_ = #{userId} AND mg.status_ != 'CANCELED' AND sr.music_group_status_ != 'QUIT' AND mg.educational_teacher_id_ IS NOT NULL LIMIT 1
+    </select>
+    <select id="getStuMusic" resultMap="MusicGroup">
+        SELECT mg.* FROM music_group mg
+        LEFT JOIN student_registration sr ON mg.id_ = sr.music_group_id_
+        WHERE mg.status_ != 'CANCELED' AND sr.music_group_status_ != 'QUIT' AND sr.user_id_ = #{studentId} LIMIT 1
+    </select>
+    <select id="getStuEduMusic" resultMap="MusicGroup">
+        SELECT mg.* FROM music_group mg
+        LEFT JOIN student_registration sr ON mg.id_ = sr.music_group_id_
+        WHERE mg.status_ != 'CANCELED' AND sr.music_group_status_ != 'QUIT'
+        AND sr.user_id_ = #{studentId} AND mg.educational_teacher_id_ = #{educationalTeacherId} LIMIT 1
+    </select>
 </mapper>

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

@@ -19,6 +19,10 @@
         <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
+        <result column="payment_valid_start_date_" property="paymentValidStartDate"/>
+        <result column="payment_valid_end_date_" property="paymentValidEndDate"/>
+        <result column="payment_pattern_" property="paymentPattern"/>
+        <result column="payment_type_" property="paymentType"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -35,9 +39,11 @@
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender" useGeneratedKeys="true"
             keyColumn="id" keyProperty="id">
         INSERT INTO music_group_payment_calender
-        (music_group_id_,payment_month_,start_payment_date_,deadline_payment_date_,payment_status_,expect_num_,actual_num_,memo_,type_,create_time_,update_time_)
+        (music_group_id_,payment_month_,start_payment_date_,deadline_payment_date_,payment_status_,expect_num_,
+        actual_num_,memo_,type_,create_time_,update_time_,payment_valid_start_date_,payment_valid_end_date_,payment_pattern_,payment_type_)
         VALUES(#{musicGroupId},#{paymentMonth},#{startPaymentDate},#{deadlinePaymentDate},#{paymentStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-        #{expectNum},#{actualNum},#{memo},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),now())
+        #{expectNum},#{actualNum},#{memo},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),now(),
+        #{paymentValidStartDate},#{paymentValidEndDate},#{paymentPattern},#{paymentType})
     </insert>
     <insert id="batchAdd">
         INSERT INTO music_group_payment_calender
@@ -52,6 +58,16 @@
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender">
         UPDATE music_group_payment_calender
         <set>
+            <if test="paymentType != null">
+                payment_type_ = #{paymentType},
+            </if>
+            <if test="paymentValidStartDate != null">
+                payment_valid_start_date_ = #{paymentValidStartDate},
+                payment_valid_end_date_ = #{paymentValidEndDate},
+            </if>
+            <if test="paymentPattern != null">
+                payment_pattern_ = #{paymentPattern},
+            </if>
             <if test="type != null">
                 type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
@@ -90,6 +106,9 @@
 	    <foreach collection="list" item="item" index="index" open="" close="" separator=";">
 	        UPDATE music_group_payment_calender
 	        <set>
+                <if test="paymentPattern != null">
+                    payment_pattern_ = #{paymentPattern},
+                </if>
 	            <if test="item.type != null">
 	                type_ = #{item.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
 	            </if>
@@ -175,6 +194,9 @@
         WHERE music_group_id_ = #{musicGroupId} 
         and (start_payment_date_ between #{startPaymentDate} and #{deadlinePaymentDate}
         or deadline_payment_date_ between #{startPaymentDate} and #{deadlinePaymentDate})
+        <if test="calenderId != null">
+            AND mgpc.id_ != #{calenderId}
+        </if>
     </select>
     <select id="countExpectNum" resultType="java.util.Map">
         SELECT mgpcd.music_group_payment_calender_id_ 'key',COUNT(DISTINCT mgpcd.user_id_) 'value' FROM music_group_payment_calender_detail mgpcd
@@ -204,4 +226,58 @@
         AND (DATE_FORMAT(mgpcd.start_payment_date_,'%Y-%m-%d') between #{startTime} AND #{endTime}
         OR DATE_FORMAT(mgpcd.deadline_payment_date_,'%Y-%m-%d') between #{startTime} AND #{endTime})
     </select>
+    <select id="queryIntersectionByValidDate" resultType="java.lang.Integer">
+        SELECT COUNT(*) FROM music_group_payment_calender mgpc
+        WHERE music_group_id_ = #{musicGroupId}
+        AND (payment_valid_end_date_ IS NULL OR payment_valid_start_date_ BETWEEN #{paymentValidStartDate} AND #{paymentValidEndDate}
+        OR payment_valid_end_date_ BETWEEN #{paymentValidStartDate} AND #{paymentValidEndDate})
+        <if test="calenderId != null">
+            AND mgpc.id_ = #{calenderId}
+        </if>
+    </select>
+    <select id="queryCalenderByDay" resultType="java.util.Map">
+        SELECT mgpcd.music_group_payment_calender_id_ 'key',COUNT(mgpcd.payment_status_) 'value'
+        FROM music_group_payment_calender_detail mgpcd
+        WHERE mgpcd.music_group_payment_calender_id_ IN
+        (SELECT id_ FROM music_group_payment_calender WHERE payment_status_ != 0
+        AND DATEDIFF(#{format},DATE_FORMAT(start_payment_date_,'%Y-%m-%d')) = #{configValue})
+        AND mgpcd.payment_status_ = 'NON_PAYMENT'
+        GROUP BY mgpcd.music_group_payment_calender_id_
+    </select>
+    <select id="queryByIds" resultMap="MusicGroupPaymentCalender">
+        SELECT * FROM music_group_payment_calender WHERE id_ IN
+        <foreach collection="calenderId" open="(" close=")" item="item" separator=",">
+            #{item}
+        </foreach>
+    </select>
+    <select id="queryEndIds" resultType="java.lang.Long">
+        SELECT DISTINCT mgpc.id_ FROM music_group_payment_calender mgpc
+        WHERE mgpc.payment_valid_end_date_ IS NOT NULL AND DATEDIFF(mgpc.payment_valid_end_date_,#{format}) = #{configValue};
+    </select>
+    <resultMap id="CalenderPushDto" type="com.ym.mec.biz.dal.dto.CalenderPushDto">
+        <result property="paymentValidEndDate" column="payment_valid_end_date_"/>
+        <result property="paymentValidStartDate" column="payment_valid_start_date_"/>
+        <result property="teacherId" column="educational_teacher_id_"/>
+        <result property="musicGroupName" column="name_"/>
+        <result property="teacherPhone" column="phone_"/>
+        <result property="calenderId" column="id_"/>
+    </resultMap>
+    <select id="getCalenderPushDto" resultMap="CalenderPushDto">
+        SELECT mgpc.id_,mgpc.payment_valid_start_date_,mgpc.payment_valid_end_date_,
+        mg.educational_teacher_id_,mg.name_,su.phone_
+        FROM music_group_payment_calender mgpc
+        LEFT JOIN music_group mg ON mgpc.music_group_id_ = mg.id_
+        LEFT JOIN sys_user su ON su.id_ = mg.educational_teacher_id_
+        WHERE mgpc.id_ IN
+        <foreach collection="calenderIds" open="(" close=")" separator="," item="item">
+            #{item}
+        </foreach>
+    </select>
+    <select id="getMusicCalenderPushDto" resultMap="CalenderPushDto">
+        SELECT mg.payment_valid_start_date_,mg.payment_valid_end_date_,
+        mg.educational_teacher_id_,su.phone_,mg.name_ FROM music_group mg
+        LEFT JOIN sys_user su ON mg.educational_teacher_id_ = su.id_
+        WHERE mg.payment_valid_end_date_ IS NOT NULL AND
+        DATEDIFF(mg.payment_valid_end_date_,#{format}) = #{configValue}
+    </select>
 </mapper>

+ 14 - 4
mec-biz/src/main/resources/config/mybatis/MusicGroupStudentFeeMapper.xml

@@ -42,15 +42,21 @@
     <!-- 向数据库增加一条记录 -->
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.MusicGroupStudentFee" useGeneratedKeys="true"
             keyColumn="id" keyProperty="id">
-		INSERT INTO music_group_student_fee_ (id_,music_group_id_,user_id_,course_fee_,create_time_,update_time_,next_payment_date_,latest_paid_time_,continuous_absenteeism_times_,subject_id_,payment_status_,temporary_course_fee_,payment_period_list_,remain_network_class_times_)
-		VALUES(#{id},#{musicGroupId},#{userId},#{courseFee},now(),now(),#{nextPaymentDate},#{latestPaidTime},#{continuousAbsenteeismTimes},#{subjectId},#{paymentStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{temporaryCourseFee},#{paymentPeriodList},#{remainNetworkClassTimes})
+		INSERT INTO music_group_student_fee_ (id_,music_group_id_,user_id_,course_fee_,create_time_,
+		update_time_,next_payment_date_,latest_paid_time_,continuous_absenteeism_times_,subject_id_,
+		payment_status_,temporary_course_fee_,payment_period_list_,remain_network_class_times_)
+		VALUES(#{id},#{musicGroupId},#{userId},#{courseFee},now(),now(),#{nextPaymentDate},#{latestPaidTime},
+		#{continuousAbsenteeismTimes},#{subjectId},#{paymentStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+		#{temporaryCourseFee},#{paymentPeriodList},#{remainNetworkClassTimes})
 	</insert>
 
     <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.MusicGroupStudentFee">
-        INSERT INTO music_group_student_fee_ (music_group_id_,user_id_,create_time_,update_time_,next_payment_date_,subject_id_,payment_status_,course_fee_,payment_period_list_,remain_network_class_times_)
+        INSERT INTO music_group_student_fee_ (music_group_id_,user_id_,create_time_,update_time_,next_payment_date_,
+        subject_id_,payment_status_,course_fee_,payment_period_list_,remain_network_class_times_)
 		VALUES
 		<foreach collection="musicGroupStudentFees" item="item" separator=",">
-            (#{item.musicGroupId},#{item.userId},NOW(),NOW(),#{nextPaymentDate},#{item.subjectId},#{paymentStatus},#{item.courseFee},#{item.paymentPeriodList},#{item.remainNetworkClassTimes})
+            (#{item.musicGroupId},#{item.userId},NOW(),NOW(),#{nextPaymentDate},#{item.subjectId},
+            #{paymentStatus},#{item.courseFee},#{item.paymentPeriodList},#{item.remainNetworkClassTimes})
         </foreach>
     </insert>
 
@@ -364,4 +370,8 @@
         SET mgsf.payment_status_ = #{paymentStatus},mgsf.update_time_ = NOW()
         WHERE mgpcd.music_group_payment_calender_id_ = mgpc.id_ AND mgpc.id_ = #{calenderId}
     </update>
+    <update id="updateFeeStatus">
+        UPDATE music_group_student_fee_ mgsf SET mgsf.payment_status_ = 'NON_PAYMENT',mgsf.update_time_ = NOW()
+        WHERE mgsf.payment_valid_end_date_ IS NOT NULL AND mgsf.payment_status_ = 'PAID_COMPLETED' AND mgsf.payment_valid_end_date_ &lt; NOW()
+    </update>
 </mapper>

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/OperatingReportMapper.xml

@@ -129,6 +129,12 @@
             <if test="organIdList != null and organIdList != ''">
                 AND FIND_IN_SET(opr.organ_id_,#{organIdList})
             </if>
+            <if test="type != null and type=='organ'.toString()">
+                AND opr.cooperation_organ_id_ IS NULL
+            </if>
+            <if test="type != null and type=='school'.toString()">
+                AND opr.cooperation_organ_id_ IS NOT NULL
+            </if>
             <if test="cooperationOrganId != null">
                 AND opr.cooperation_organ_id_ = #{cooperationOrganId}
             </if>

+ 36 - 6
mec-biz/src/main/resources/config/mybatis/SellOrderMapper.xml

@@ -6,6 +6,8 @@
         <!--@Table sell_order-->
         <id column="id_" property="id"/>
         <result column="organ_id_" property="organId"/>
+        <result column="edu_teacher_id_" property="eduTeacherId"/>
+        <result column="eduTeacher" property="eduTeacher"/>
         <result column="cooperation_organ_id_" property="cooperationOrganId"/>
         <result column="school_name_" property="schoolName"/>
         <result column="trans_no_" property="transNo"/>
@@ -33,7 +35,8 @@
     </resultMap>
     <sql id="Base_Column_List">
         <!--@mbg.generated-->
-        id_, organ_id_, cooperation_organ_id_, trans_no_,order_id_, order_no_, expect_amount_, actual_amount_,
+        id_, edu_teacher_id_,organ_id_, cooperation_organ_id_, trans_no_,order_id_, order_no_, expect_amount_,
+        actual_amount_,
         balance_amount_, sell_cost_, sell_cost2_, type_, goods_id_,goods_name_, num_, user_id_, payment_channel_,
         mer_no_, sell_time_, create_ime_, update_time_
     </sql>
@@ -52,11 +55,13 @@
     <insert id="insert" keyColumn="id_" keyProperty="id" parameterType="com.ym.mec.biz.dal.entity.SellOrder"
             useGeneratedKeys="true">
         <!--@mbg.generated-->
-        insert into sell_order (organ_id_, cooperation_organ_id_, trans_no_,order_id_, order_no_, expect_amount_,
+        insert into sell_order (edu_teacher_id_,organ_id_, cooperation_organ_id_, trans_no_,order_id_, order_no_,
+        expect_amount_,
         actual_amount_,
         balance_amount_, type_, goods_id_,goods_name_, sell_cost_, sell_cost2_, num_, user_id_, payment_channel_,
         mer_no_, sell_time_, create_ime_, update_time_)
-        values (#{organId}, #{cooperationOrganId}, #{transNo}, #{orderNo},#{orderId}, #{expectAmount}, #{actualAmount},
+        values (#{eduTeacherId},#{organId}, #{cooperationOrganId}, #{transNo}, #{orderNo},#{orderId}, #{expectAmount},
+        #{actualAmount},
         #{balanceAmount}, #{type}, #{goodsId}, #{goodsName}, #{sellCost}, #{sellCost2}, #{num}, #{userId},
         #{paymentChannel},
         #{merNo}, #{sellTime}, #{createIme}, #{updateTime})
@@ -65,6 +70,9 @@
         <!--@mbg.generated-->
         update sell_order
         <set>
+            <if test="eduTeacherId != null">
+                edu_teacher_id_ = #{eduTeacherId},
+            </if>
             <if test="organId != null">
                 organ_id_ = #{organId},
             </if>
@@ -133,23 +141,25 @@
         insert into sell_order (organ_id_, cooperation_organ_id_, trans_no_,order_id_, order_no_, expect_amount_,
         actual_amount_,
         balance_amount_, type_, goods_id_,goods_name_, sell_cost_, sell_cost2_, num_, user_id_, payment_channel_,
-        mer_no_, sell_time_, create_ime_, update_time_)
+        mer_no_, sell_time_,edu_teacher_id_, create_ime_, update_time_)
         VALUE
         <foreach collection="sellOrders" separator="," item="sellOrder">
             (#{sellOrder.organId},#{sellOrder.cooperationOrganId},#{sellOrder.transNo},#{sellOrder.orderId},#{sellOrder.orderNo},
             #{sellOrder.expectAmount},#{sellOrder.actualAmount},#{sellOrder.balanceAmount},#{sellOrder.type},#{sellOrder.goodsId},
             #{sellOrder.goodsName},#{sellOrder.sellCost},#{sellOrder.sellCost2},#{sellOrder.num},#{sellOrder.userId},
-            #{sellOrder.paymentChannel},#{sellOrder.merNo},#{sellOrder.sellTime},#{sellOrder.createIme},#{sellOrder.updateTime})
+            #{sellOrder.paymentChannel},#{sellOrder.merNo},#{sellOrder.sellTime},#{sellOrder.eduTeacherId},NOW(),NOW())
         </foreach>
     </insert>
 
 
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="SellOrder" parameterType="map">
-        SELECT so.*,su.username_ user_name_,su.phone_,o.name_ organ_name_,co.name_ school_name_ FROM sell_order so
+        SELECT so.*,su.username_ user_name_,su.phone_,o.name_ organ_name_,co.name_ school_name_,t.real_name_ eduTeacher
+        FROM sell_order so
         LEFT JOIN sys_user su ON so.user_id_ = su.id_
         LEFT JOIN organization o ON o.id_ = so.organ_id_
         LEFT JOIN cooperation_organ co ON co.id_= so.cooperation_organ_id_
+        LEFT JOIN sys_user t ON t.id_ = so.edu_teacher_id_
         <include refid="queryPageSql"/>
         ORDER BY so.create_ime_ DESC
         <include refid="global.limit"/>
@@ -346,4 +356,24 @@
         FROM sell_order
         WHERE order_id_ = #{orderId}
     </delete>
+
+    <select id="getOrderSellCost" resultType="decimal">
+        SELECT SUM(sell_cost_ * num_)
+        FROM sell_order
+        WHERE order_id_ = #{orderId}
+    </select>
+
+    <select id="getSubjectChangeMonthReport" resultMap="com.ym.mec.biz.dal.dao.OperatingReportDao.OperatingReport"><![CDATA[
+        SELECT sc.organ_id_,
+               sc.cooperation_organ_id_,
+               SUM(spo.actual_amount_) income_total_,
+               SUM(sc.sell_amount_)    sell_amount_,
+               SUM(sc.cost_margin_)    sell_cost_
+        FROM subject_change sc
+                 LEFT JOIN student_payment_order spo ON spo.id_ = sc.order_id_
+        WHERE sc.status_ = 2
+          AND sc.sell_time_ >= #{startTime}
+          AND sc.sell_time_ <= #{endTime}
+        GROUP BY sc.organ_id_, sc.cooperation_organ_id_
+        ]]></select>
 </mapper>

+ 16 - 10
mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml

@@ -25,6 +25,8 @@
         <result column="update_time_" property="updateTime"/>
         <result column="remark_" property="remark"/>
         <result column="current_class_times_" property="currentClassTimes"/>
+        <result column="current_class_times_" property="currentClassTimes"/>
+        <result column="current_schedule_id_" property="currentScheduleId"/>
     </resultMap>
 
     <!-- 根据主键查询一条记录 -->
@@ -41,15 +43,16 @@
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentAttendance" useGeneratedKeys="true"
             keyColumn="id" keyProperty="id">
         INSERT INTO student_attendance
-        (group_type_,music_group_id_,class_group_id_,course_schedule_id_,user_id_,teacher_id_,status_,create_time_,update_time_,remark_,current_class_times_,sign_in_time_,sign_out_time_)
+        (group_type_,music_group_id_,class_group_id_,course_schedule_id_,user_id_,teacher_id_,status_,create_time_,
+        update_time_,remark_,current_class_times_,sign_in_time_,sign_out_time_,current_schedule_id_)
         VALUES(#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{musicGroupId},#{classGroupId},
         #{courseScheduleId},#{userId},#{teacherId},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),now(),
-        #{remark},#{currentClassTimes},#{signInTime},#{signOutTime})
+        #{remark},#{currentClassTimes},#{signInTime},#{signOutTime},#{currentScheduleId})
     </insert>
 
     <insert id="addStudentAttendances" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id_">
       INSERT INTO student_attendance (group_type_, music_group_id_, class_group_id_, course_schedule_id_,
-      user_id_, teacher_id_, status_, create_time_,update_time_, remark_ ,current_class_times_,sign_in_time_,sign_out_time_)
+      user_id_, teacher_id_, status_, create_time_,update_time_, remark_ ,current_class_times_,sign_in_time_,sign_out_time_,current_schedule_id_)
       VALUES
 	  <foreach collection="list" item="studentAttendance" separator=",">
           (#{studentAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
@@ -57,14 +60,9 @@
           #{studentAttendance.userId},#{studentAttendance.teacherId},
           #{studentAttendance.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},now(),#{studentAttendance.updateTime},
           #{studentAttendance.remark},#{studentAttendance.currentClassTimes},
-          #{studentAttendance.signInTime},#{studentAttendance.signOutTime})
+          #{studentAttendance.signInTime},#{studentAttendance.signOutTime},#{studentAttendance.currentScheduleId})
       </foreach>
     </insert>
-    <insert id="cuntinueCourseSign">
-        INSERT INTO student_attendance (group_type_, music_group_id_, class_group_id_, course_schedule_id_,
-        user_id_, teacher_id_, status_, create_time_,update_time_, remark_ ,current_class_times_,sign_in_time_,sign_out_time_)
-        VALUES()
-    </insert>
 
     <!-- 根据主键查询一条记录 -->
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentAttendance">
@@ -73,6 +71,9 @@
             <if test="status != null">
                 status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
+            <if test="currentScheduleId != null">
+                current_schedule_id_ = #{currentScheduleId},
+            </if>
             <if test="signOutTime != null">
                 sign_out_time_ = #{signOutTime},
             </if>
@@ -103,7 +104,7 @@
             <if test="currentClassTimes != null">
                 current_class_times_ = #{currentClassTimes},
             </if>
-            update_time_=NOW()
+            update_time_ = NOW()
         </set>
         WHERE id_ = #{id}
     </update>
@@ -508,4 +509,9 @@
             #{courseId}
         </foreach>
     </select>
+    <select id="findFirstSign" resultType="java.lang.Long">
+        SELECT sa.course_schedule_id_ FROM student_attendance sa
+        WHERE sa.current_schedule_id_ = #{courseScheduleId} AND sa.user_id_ = #{userId}
+        AND sa.sign_in_time_ IS NOT NULL ORDER BY sa.sign_in_time_ ASC LIMIT 1
+    </select>
 </mapper>

+ 139 - 0
mec-biz/src/main/resources/config/mybatis/StudentGoodsSellMapper.xml

@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.StudentGoodsSellDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.StudentGoodsSell" id="StudentGoodsSell">
+		<result column="id_" property="id" />
+		<result column="user_id_" property="userId" />
+		<result column="teacher_id_" property="teacherId" />
+		<result column="goods_json_" property="goodsJson" />
+		<result column="total_amount_" property="totalAmount" />
+		<result column="market_amount_" property="marketAmount" />
+		<result column="order_no_" property="orderNo" />
+		<result column="username_" property="userName" />
+		<result column="organ_id_" property="organId" />
+		<result column="author_user_" property="authorUser" />
+		<result column="cooperation_organ_id_" property="cooperationOrganId" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="StudentGoodsSell" >
+		SELECT sgs.*,su.username_ FROM student_goods_sell sgs
+		LEFT JOIN sys_user su ON su.id_ = sgs.user_id_
+		WHERE sgs.id_ = #{id}
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="StudentGoodsSell">
+		SELECT * FROM student_goods_sell ORDER BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentGoodsSell" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO student_goods_sell (user_id_,teacher_id_,goods_json_,total_amount_,market_amount_,
+		create_time_,update_time_,order_no_,organ_id_,author_user_,cooperation_organ_id_)
+		VALUES(#{userId},#{teacherId},#{goodsJson},#{totalAmount},#{marketAmount},
+		NOW(),NOW(),#{orderNo},#{organId},#{authorUser},#{cooperationOrganId})
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentGoodsSell">
+		UPDATE student_goods_sell <set>
+		<if test="cooperationOrganId != null">
+			cooperation_organ_id_ = #{cooperationOrganId},
+		</if>
+		<if test="authorUser != null">
+			author_user_ = #{authorUser},
+		</if>
+		<if test="organId != null">
+			organ_id_ = #{organId},
+		</if>
+		<if test="orderNo != null">
+			order_no_ = #{orderNo},
+		</if>
+		<if test="userId != null">
+			user_id_ = #{userId},
+		</if>
+		<if test="totalAmount != null">
+			total_amount_ = #{totalAmount},
+		</if>
+		<if test="marketAmount != null">
+			market_amount_ = #{marketAmount},
+		</if>
+		<if test="teacherId != null">
+			teacher_id_ = #{teacherId},
+		</if>
+		<if test="goodsJson != null">
+			goods_json_ = #{goodsJson},
+		</if>
+		update_time_ = NOW()
+		</set> WHERE id_ = #{id}
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM student_goods_sell WHERE id_ = #{id} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="StudentGoodsSell" parameterType="map">
+		SELECT * FROM student_goods_sell ORDER BY id_ <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM student_goods_sell
+	</select>
+    <select id="countStudentGoodsOrders" resultType="java.lang.Integer">
+		SELECT COUNT(spo.id_) FROM student_payment_order spo
+		LEFT JOIN student_goods_sell sgs ON spo.order_no_ = sgs.order_no_
+		LEFT JOIN sys_user su ON sgs.user_id_ = su.id_
+		<include refid="queryStudentGoodsOrdersSql"/>
+	</select>
+	<resultMap type="com.ym.mec.biz.dal.dto.StudentGoodsSellDto" id="StudentGoodsSellDto" extends="com.ym.mec.biz.dal.dao.StudentPaymentOrderDao.StudentPaymentOrder">
+		<result column="goods_json_" property="goodsJson" />
+		<result column="total_amount_" property="totalAmount" />
+		<result column="market_amount_" property="marketAmount" />
+		<result column="username_" property="userName" />
+		<result column="author_user_" property="authorUser" />
+	</resultMap>
+	<sql id="queryStudentGoodsOrdersSql">
+		<where>
+			<if test="teacherId != null">
+				sgs.teacher_id_ = #{teacherId}
+			</if>
+			<if test="studentId != null">
+				AND sgs.user_id_ = #{studentId}
+			</if>
+			<if test="status != null">
+				AND spo.status_ = #{status}
+			</if>
+			<if test="search != null and search != ''">
+				AND (su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
+			</if>
+		</where>
+	</sql>
+	<select id="queryStudentGoodsOrders" resultMap="StudentGoodsSellDto">
+		SELECT spo.*,sgs.goods_json_,sgs.total_amount_,sgs.market_amount_,su.username_,sgs.author_user_
+		FROM student_payment_order spo
+		LEFT JOIN student_goods_sell sgs ON spo.order_no_ = sgs.order_no_
+		LEFT JOIN sys_user su ON sgs.user_id_ = su.id_
+		<include refid="queryStudentGoodsOrdersSql"/>
+		ORDER BY spo.create_time_ DESC
+		<include refid="global.limit"/>
+	</select>
+	<select id="findByOrderNo" resultMap="StudentGoodsSell">
+		SELECT * FROM student_goods_sell WHERE order_no_ = #{orderNo} LIMIT 1
+	</select>
+	<select id="getStudentGoodsSellDto" resultMap="StudentGoodsSellDto">
+		SELECT spo.*,sgs.goods_json_,sgs.total_amount_,sgs.market_amount_ FROM student_payment_order spo
+		LEFT JOIN student_goods_sell sgs ON spo.order_no_ = sgs.order_no_
+		WHERE spo.order_no_ = #{orderNo} LIMIT 1
+	</select>
+</mapper>

+ 80 - 24
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderDetailMapper.xml

@@ -14,7 +14,8 @@
         <result column="create_time_" property="createTime"/>
         <result column="update_time_" property="updateTime"/>
         <result column="payment_order_id_" property="paymentOrderId"/>
-        <result column="kit_group_purchase_type_" property="kitGroupPurchaseType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="kit_group_purchase_type_" property="kitGroupPurchaseType"
+                typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <collection property="goodsList" ofType="com.ym.mec.biz.dal.entity.Goods">
             <result column="goods_id_" property="id"/>
             <result column="goods_name_" property="name"/>
@@ -27,7 +28,9 @@
 
     <!-- 根据主键查询一条记录 -->
     <select id="get" resultMap="StudentPaymentOrderDetail">
-        SELECT * FROM student_payment_order_detail WHERE id_ = #{id}
+        SELECT *
+        FROM student_payment_order_detail
+        WHERE id_ = #{id}
     </select>
 
     <!-- 全查询 -->
@@ -68,7 +71,8 @@
                 payment_order_id_ = #{paymentOrderId},
             </if>
             <if test="kitGroupPurchaseType != null">
-                kit_group_purchase_type_ = #{kitGroupPurchaseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+                kit_group_purchase_type_ =
+                #{kitGroupPurchaseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
             <if test="type != null">
                 type_ = #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
@@ -79,7 +83,9 @@
 
     <!-- 根据主键删除一条记录 -->
     <delete id="delete">
-        DELETE FROM student_payment_order_detail WHERE id_ = #{id}
+        DELETE
+        FROM student_payment_order_detail
+        WHERE id_ = #{id}
     </delete>
 
     <!-- 分页查询 -->
@@ -107,27 +113,32 @@
 
     <!-- 查询注册订单详情 -->
     <select id="findApplyOrderSuccess" resultMap="StudentPaymentOrderDetail">
-        SELECT spod.* FROM student_payment_order spo
-        LEFT JOIN student_payment_order_detail spod ON spo.id_ = spod.payment_order_id_
-        LEFT JOIN student_registration sr ON spo.user_id_ = sr.user_id_
+        SELECT spod.*
+        FROM student_payment_order spo
+                 LEFT JOIN student_payment_order_detail spod ON spo.id_ = spod.payment_order_id_
+                 LEFT JOIN student_registration sr ON spo.user_id_ = sr.user_id_
         WHERE spo.music_group_id_ = #{musicGroupId}
-        AND spo.status_=#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-        AND spo.type_ = 'APPLY'
-        AND sr.music_group_id_=#{musicGroupId} AND sr.music_group_status_ != 'QUIT'
+          AND spo.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+          AND spo.type_ = 'APPLY'
+          AND sr.music_group_id_ = #{musicGroupId}
+          AND sr.music_group_status_ != 'QUIT'
     </select>
 
     <!-- 查询订单详情 -->
     <select id="findApplyOrderGoods" resultMap="StudentPaymentOrderDetail">
-        SELECT * FROM student_payment_order_detail WHERE payment_order_id_ = #{orderId}
+        SELECT *
+        FROM student_payment_order_detail
+        WHERE payment_order_id_ = #{orderId}
     </select>
 
     <!-- 查询用户注册订单详情 -->
     <select id="findUserApplyOrder" resultMap="StudentPaymentOrderDetail">
-        SELECT spod.* FROM student_payment_order spo
-        LEFT JOIN student_payment_order_detail spod ON spo.id_ = spod.payment_order_id_
+        SELECT spod.*
+        FROM student_payment_order spo
+                 LEFT JOIN student_payment_order_detail spod ON spo.id_ = spod.payment_order_id_
         WHERE spo.user_id_ = #{userId}
-        AND spo.status_=#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
-        AND spo.type_ = 'APPLY'
+          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_"/>
@@ -143,10 +154,13 @@
         <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
-        LEFT JOIN student_registration sr ON spo.user_id_ = sr.user_id_
-        WHERE spo.music_group_id_ = #{musicGroupId} AND spo.status_ = 'SUCCESS'
-        AND sr.music_group_id_ = #{musicGroupId} AND sr.music_group_status_!='QUIT'
+        SELECT MAX(spo.id_) payment_order_id_, spo.user_id_
+        FROM student_payment_order spo
+                 LEFT JOIN student_registration sr ON spo.user_id_ = sr.user_id_
+        WHERE spo.music_group_id_ = #{musicGroupId}
+          AND spo.status_ = 'SUCCESS'
+          AND sr.music_group_id_ = #{musicGroupId}
+          AND sr.music_group_status_ != 'QUIT'
         GROUP BY spo.user_id_
     </select>
     <select id="queryGoodsNames" resultType="java.util.Map">
@@ -169,16 +183,58 @@
     </select>
 
     <select id="findApplyOrderMusical" resultMap="StudentPaymentOrderDetail">
-        SELECT * FROM student_payment_order_detail WHERE payment_order_id_ = #{orderId} AND type_ = 'MUSICAL' LIMIT 1
+        SELECT *
+        FROM student_payment_order_detail
+        WHERE payment_order_id_ = #{orderId}
+          AND type_ = 'MUSICAL'
+        LIMIT 1
     </select>
 
     <select id="getOrderDetail" resultMap="StudentPaymentOrderDetail">
-        SELECT spod.*,g.id_ goods_id_,g.name_ goods_name_,g.group_purchase_price_,g.discount_price_,g.agree_cost_price_,g.type_ goods_type_ 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_ = #{orderId} AND spod.goods_id_list_ IS NOT NULL
+        SELECT spod.*,
+               g.id_   goods_id_,
+               g.name_ goods_name_,
+               g.group_purchase_price_,
+               g.discount_price_,
+               g.agree_cost_price_,
+               g.type_ goods_type_
+        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_ = #{orderId}
+          AND spod.goods_id_list_ IS NOT NULL
     </select>
 
     <select id="getOrderDetailType" resultType="java.lang.String">
-        SELECT DISTINCT type_ FROM student_payment_order_detail WHERE payment_order_id_ = #{orderId}
+        SELECT DISTINCT type_
+        FROM student_payment_order_detail
+        WHERE payment_order_id_ = #{orderId}
+    </select>
+
+    <select id="getStudentApplyDetail" resultMap="StudentPaymentOrderDetail">
+        SELECT spod.*,
+               g.id_   goods_id_,
+               g.name_ goods_name_,
+               g.group_purchase_price_,
+               g.discount_price_,
+               g.agree_cost_price_,
+               g.type_ goods_type_
+        FROM student_payment_order_detail spod
+                 LEFT JOIN goods g ON FIND_IN_SET(g.id_, spod.goods_id_list_)
+                 LEFT JOIN student_payment_order spo on spod.payment_order_id_ = spo.id_
+        WHERE spo.user_id_ = #{studentId}
+          AND spo.music_group_id_ = #{musicGroupId}
+          AND spo.status_ = 'SUCCESS'
+          AND spo.type_ = 'APPLY'
+          AND spod.type_ IN ('MUSICAL', 'ACCESSORIES', 'TEACHING', 'OTHER', 'COURSE')
+    </select>
+
+    <select id="queryPurchaseTypeMap" resultType="java.util.Map">
+        SELECT payment_order_id_ 'key',kit_group_purchase_type_ 'value'
+        FROM student_payment_order_detail
+        WHERE payment_order_id_ IN
+        <foreach collection="paymentOrderNo" open="(" close=")" separator="," item="item">
+            #{item}
+        </foreach>
+        AND type_='MUSICAL'
     </select>
 </mapper>

+ 17 - 5
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -86,14 +86,14 @@
         INSERT INTO student_payment_order
         (id_, group_type_, user_id_, organ_id_, routing_organ_id_, type_, expect_amount_, actual_amount_, com_amount_,
          per_amount_,
-         balance_payment_amount_, remit_fee_,course_remit_fee_, trans_no_,
+         balance_payment_amount_, remit_fee_, course_remit_fee_, trans_no_,
          status_, memo_, create_time_, update_time_, payment_channel_, payment_business_channel_,
          payment_account_no_, mer_nos_, order_no_, music_group_id_, class_group_id_, pay_time_)
         VALUES (#{id}, #{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 #{userId}, #{organId}, #{routingOrganId},
                 #{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
                 #{expectAmount}, #{actualAmount}, #{comAmount}, #{perAmount}, #{balancePaymentAmount},
-                #{remitFee},#{courseRemitFee}, #{transNo},
+                #{remitFee}, #{courseRemitFee}, #{transNo},
                 #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{memo}, now(), now(),
                 #{paymentChannel}, #{paymentBusinessChannel}, #{paymentAccountNo}, #{merNos}, #{orderNo},
                 #{musicGroupId},
@@ -252,6 +252,12 @@
             <if test="balancePaymentAmount != null">
                 AND spo.balance_payment_amount_ >= #{balancePaymentAmount}
             </if>
+            <if test="lessActualAmount != null">
+                <![CDATA[ AND spo.actual_amount_ <= #{lessActualAmount}]]>
+            </if>
+            <if test="lessBalancePaymentAmount != null">
+                <![CDATA[AND spo.balance_payment_amount_ <= #{lessBalancePaymentAmount}]]>
+            </if>
             <if test="orderNo != null">
                 AND spo.order_no_ = #{orderNo}
             </if>
@@ -697,11 +703,17 @@
     </select>
 
     <select id="getUsers" resultType="com.ym.mec.biz.dal.dto.BasicUserDto">
-            SELECT username_ name ,id_ userId,phone_ phone FROM sys_user
-            WHERE id_ = #{search} OR username_ LIKE CONCAT('%',#{search},'%') OR phone_ LIKE CONCAT('%',#{search},'%')
+        SELECT username_ name, id_ userId, phone_ phone
+        FROM sys_user
+        WHERE id_ = #{search}
+           OR username_ LIKE CONCAT('%', #{search}, '%')
+           OR phone_ LIKE CONCAT('%', #{search}, '%')
     </select>
 
     <select id="lockOrder" resultMap="StudentPaymentOrder">
-        SELECT * FROM student_payment_order WHERE id_ = #{id} FOR UPDATE
+        SELECT *
+        FROM student_payment_order
+        WHERE id_ = #{id} FOR
+        UPDATE
     </select>
 </mapper>

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

@@ -156,6 +156,12 @@
             <if test="balancePaymentAmount != null">
                 AND spo.balance_payment_amount_ >= #{balancePaymentAmount}
             </if>
+            <if test="lessActualAmount != null">
+                <![CDATA[ AND spo.actual_amount_ <= #{lessActualAmount}]]>
+            </if>
+            <if test="lessBalancePaymentAmount != null">
+                <![CDATA[AND spo.balance_payment_amount_ <= #{lessBalancePaymentAmount}]]>
+            </if>
             <if test="orderNo != null">
                 AND spo.order_no_ = #{orderNo}
             </if>
@@ -210,7 +216,8 @@
     </select>
 
     <delete id="deleteByOrderNo">
-        DELETE FROM student_payment_route_order
+        DELETE
+        FROM student_payment_route_order
         where order_no_ = #{orderNo}
     </delete>
 

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

@@ -647,4 +647,8 @@
         LEFT JOIN sys_user s ON s.id_ = cssp.user_id_
         WHERE cs.music_group_id_ = #{musicGroupId} AND cs.actual_teacher_id_ = #{teacherId} AND cs.group_type_ = 'MUSIC' GROUP BY s.id_
     </select>
+    <select id="getStudentRegister" resultMap="StudentRegistration">
+        SELECT * FROM student_registration WHERE music_group_id_ = #{musicGroupId} AND user_id_ = #{studentId}
+        ORDER BY id_ DESC LIMIT 1
+    </select>
 </mapper>

+ 47 - 0
mec-biz/src/main/resources/config/mybatis/StudentRepairMapper.xml

@@ -267,4 +267,51 @@
         ORDER BY RAND()
         LIMIT 1
     </select>
+    <select id="countEduStudents" resultType="java.lang.Integer">
+        SELECT COUNT(DISTINCT su.id_) FROM (
+        SELECT sr.user_id_ FROM music_group mg
+        LEFT JOIN student_registration sr ON mg.id_ = sr.music_group_id_
+        WHERE mg.status_ != 'CANCELED' AND sr.music_group_status_ != 'QUIT' AND mg.educational_teacher_id_ = #{teacherId}
+        UNION
+        SELECT cgsm.user_id_ FROM vip_group vg
+        LEFT JOIN class_group_student_mapper cgsm ON vg.id_ = cgsm.music_group_id_
+        WHERE cgsm.group_type_ = 'VIP' AND vg.educational_teacher_id_ = #{teacherId} AND cgsm.status_ != 'QUIT'
+        UNION
+        SELECT pg.student_id_ user_id_ FROM practice_group pg
+        WHERE pg.educational_teacher_id_ = #{teacherId}) sid
+        LEFT JOIN sys_user su ON su.id_ = sid.user_id_
+        <if test="search != null and search != ''">
+            WHERE su.id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%')
+        </if>
+    </select>
+    <select id="queryEduStudents" resultMap="com.ym.mec.biz.dal.dao.MusicGroupDao.BasicUserDto">
+        SELECT su.username_, su.id_ user_id_, su.avatar_ head_url_,su.phone_ FROM (
+        SELECT sr.user_id_ FROM music_group mg
+        LEFT JOIN student_registration sr ON mg.id_ = sr.music_group_id_
+        WHERE mg.status_ != 'CANCELED' AND sr.music_group_status_ != 'QUIT' AND mg.educational_teacher_id_ = #{teacherId}
+        UNION
+        SELECT cgsm.user_id_ FROM vip_group vg
+        LEFT JOIN class_group_student_mapper cgsm ON vg.id_ = cgsm.music_group_id_
+        WHERE cgsm.group_type_ = 'VIP' AND vg.educational_teacher_id_ = #{teacherId} AND cgsm.status_ != 'QUIT'
+        UNION
+        SELECT pg.student_id_ user_id_ FROM practice_group pg
+        WHERE pg.educational_teacher_id_ = #{teacherId}) sid
+        LEFT JOIN sys_user su ON su.id_ = sid.user_id_
+        <if test="search != null and search != ''">
+            WHERE su.id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%')
+        </if>
+    </select>
+    <select id="countStuEducation" resultType="java.lang.Integer">
+        SELECT DISTINCT sid.educational_teacher_id_ FROM (
+        SELECT mg.educational_teacher_id_ FROM music_group mg
+        LEFT JOIN student_registration sr ON mg.id_ = sr.music_group_id_
+        WHERE mg.status_ != 'CANCELED' AND sr.music_group_status_ != 'QUIT' AND sr.user_id_ = #{studentId}
+        UNION
+        SELECT vg.educational_teacher_id_ FROM vip_group vg
+        LEFT JOIN course_schedule_student_payment cssp ON vg.id_ = cssp.music_group_id_
+        WHERE cssp.group_type_ = 'VIP' AND cssp.user_id_ = #{studentId}
+        UNION
+        SELECT pg.educational_teacher_id_ FROM practice_group pg
+        WHERE pg.student_id_ = #{studentId}) sid
+    </select>
 </mapper>

+ 304 - 0
mec-biz/src/main/resources/config/mybatis/SubjectChangeMapper.xml

@@ -0,0 +1,304 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ym.mec.biz.dal.dao.SubjectChangeDao">
+    <resultMap id="SubjectChange" type="com.ym.mec.biz.dal.entity.SubjectChange">
+        <!--@mbg.generated-->
+        <!--@Table subject_change-->
+        <id column="id_" property="id"/>
+        <result column="edu_teacher_id_" property="eduTeacherId"/>
+        <result column="eduTeacher" property="eduTeacher"/>
+        <result column="student_id_" property="studentId"/>
+        <result column="studentName" property="studentName"/>
+        <result column="organ_id_" property="organId"/>
+        <result column="organName" property="organName"/>
+        <result column="cooperation_organ_id_" property="cooperationOrganId"/>
+        <result column="cooperationOrganName" property="cooperationOrganName"/>
+        <result column="music_group_id_" property="musicGroupId"/>
+        <result column="musicGroupName" property="musicGroupName"/>
+        <result column="original_subject_id_" property="originalSubjectId"/>
+        <result column="original_course_fee_" property="originalCourseFee"/>
+        <result column="original_musical_" property="originalMusical"/>
+        <result column="original_musical_price_" property="originalMusicalPrice"/>
+        <result column="original_accessories_" property="originalAccessories"/>
+        <result column="original_accessories_price_" property="originalAccessoriesPrice"/>
+        <result column="original_cost_" property="originalCost"/>
+        <result column="kit_group_purchase_type_" property="kitGroupPurchaseType"
+                typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="change_subject_id_" property="changeSubjectId"/>
+        <result column="change_course_fee_" property="changeCourseFee"/>
+        <result column="change_musical_" property="changeMusical"/>
+        <result column="change_musical_price_" property="changeMusicalPrice"/>
+        <result column="change_accessories_" property="changeAccessories"/>
+        <result column="change_accessories_price_" property="changeAccessoriesPrice"/>
+        <result column="change_cost_" property="changeCost"/>
+        <result column="goods_margin_" property="goodsMargin"/>
+        <result column="course_margin_" property="courseMargin"/>
+        <result column="cost_margin_" property="costMargin"/>
+        <result column="sell_amount_" property="sellAmount"/>
+        <result column="order_id_" property="orderId"/>
+        <result column="order_no_" property="orderNo"/>
+        <result column="trans_no_" property="transNo"/>
+        <result column="payment_channel_" property="paymentChannel"/>
+        <result column="mer_no_" property="merNo"/>
+        <result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result column="create_time_" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="version_" property="version"/>
+    </resultMap>
+    <sql id="Base_Column_List">
+        <!--@mbg.generated-->
+        id_,edu_teacher_id_,student_id_,organ_id_,cooperation_organ_id_,
+        music_group_id_,original_subject_id_,original_course_fee_, original_musical_,
+        original_musical_price_,
+        original_accessories_,original_accessories_price_,kit_group_purchase_type_,change_subject_id_,
+        change_course_fee_, change_musical_,
+        original_cost_,change_musical_price_,change_accessories_, change_accessories_price_,change_cost_, goods_margin_,
+        course_margin_,cost_margin_,sell_amount_,order_id_,order_no_,trans_no_,
+        status_,payment_channel_,mer_no_,sell_time_,create_time_,
+        update_time,version_
+    </sql>
+    <select id="get" parameterType="java.lang.Integer" resultMap="SubjectChange">
+        <!--@mbg.generated-->
+        select
+        <include refid="Base_Column_List"/>
+        from subject_change
+        where id_ = #{id}
+    </select>
+    <delete id="delete" parameterType="java.lang.Integer">
+        <!--@mbg.generated-->
+        delete from subject_change
+        where id_ = #{id}
+    </delete>
+    <insert id="insert" keyColumn="id_" keyProperty="id" parameterType="com.ym.mec.biz.dal.entity.SubjectChange"
+            useGeneratedKeys="true">
+        <!--@mbg.generated-->
+        insert into subject_change
+        (student_id_,edu_teacher_id_,organ_id_,cooperation_organ_id_,music_group_id_,original_subject_id_,original_course_fee_,
+        original_musical_,
+        original_musical_price_,original_accessories_,original_accessories_price_,original_cost_,kit_group_purchase_type_,
+        change_subject_id_,change_course_fee_, change_musical_, change_musical_price_,
+        change_accessories_, change_accessories_price_, change_cost_,goods_margin_,
+        course_margin_,cost_margin_,sell_amount_,order_id_,
+        order_no_,trans_no_,status_,sell_time_, create_time_, update_time,version_)
+        values
+        (#{studentId},#{eduTeacherId},#{organId},#{cooperationOrganId},#{musicGroupId},#{originalSubjectId},#{originalCourseFee},
+        #{originalMusical},
+        #{originalMusicalPrice},
+        #{originalAccessories},
+        #{originalAccessoriesPrice},#{originalCost},#{kitGroupPurchaseType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+        #{changeSubjectId},#{changeCourseFee}, #{changeMusical},
+        #{changeMusicalPrice}, #{changeAccessories}, #{changeAccessoriesPrice},#{changeCost}, #{goodsMargin},
+        #{courseMargin},#{costMargin},
+        #{sellAmount},#{orderId},#{orderNo},#{transNo},#{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{sellTime},
+        #{createTime}, #{updateTime},#{version})
+    </insert>
+    <update id="update" parameterType="com.ym.mec.biz.dal.entity.SubjectChange">
+        <!--@mbg.generated-->
+        update subject_change
+        <set>
+            <if test="eduTeacherId !=null ">
+                edu_teacher_id_ = #{eduTeacherId},
+            </if>
+            <if test="studentId != null">
+                student_id_ = #{studentId},
+            </if>
+            <if test="organId != null">
+                organ_id_ = #{organId},
+            </if>
+            <if test="musicGroupId != null">
+                music_group_id_ = #{musicGroupId},
+            </if>
+            <if test="originalCourseFee != null">
+                original_course_fee_ = #{originalCourseFee},
+            </if>
+            <if test="originalMusical != null">
+                original_musical_ = #{originalMusical},
+            </if>
+            <if test="originalMusicalPrice != null">
+                original_musical_price_ = #{originalMusicalPrice},
+            </if>
+            <if test="originalAccessories != null">
+                original_accessories_ = #{originalAccessories},
+            </if>
+            <if test="originalAccessoriesPrice != null">
+                original_accessories_price_ = #{originalAccessoriesPrice},
+            </if>
+            <if test="originalCost != null">
+                original_cost_ = #{originalCost},
+            </if>
+            <if test="changeCourseFee != null">
+                change_course_fee_ = #{changeCourseFee},
+            </if>
+            <if test="changeMusical != null">
+                change_musical_ = #{changeMusical},
+            </if>
+            <if test="changeMusicalPrice != null">
+                change_musical_price_ = #{changeMusicalPrice},
+            </if>
+            <if test="changeAccessories != null">
+                change_accessories_ = #{changeAccessories},
+            </if>
+            <if test="changeAccessoriesPrice != null">
+                change_accessories_price_ = #{changeAccessoriesPrice},
+            </if>
+            <if test="changeCost != null">
+                change_cost_ = #{changeCost},
+            </if>
+            <if test="goodsMargin != null">
+                goods_margin_ = #{goodsMargin},
+            </if>
+            <if test="courseMargin != null">
+                course_margin_ = #{courseMargin},
+            </if>
+            <if test="costMargin != null">
+                cost_margin_ = #{costMargin},
+            </if>
+            <if test="sellAmount != null">
+                sell_amount_ = #{sellAmount},
+            </if>
+            <if test="orderId != null">
+                order_id_ = #{orderId},
+            </if>
+            <if test="orderNo != null">
+                order_no_ = #{orderNo},
+            </if>
+            <if test="transNo != null">
+                trans_no_ = #{transNo},
+            </if>
+            <if test="status != null">
+                status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+            </if>
+            <if test="paymentChannel != null">
+                payment_channel_=#{paymentChannel},
+            </if>
+            <if test="merNo != null">
+                mer_no_ = #{merNo},
+            </if>
+            <if test="sellTime != null">
+                sell_time_ = #{sellTime},
+            </if>
+            <if test="createTime != null">
+                create_time_ = #{createTime},
+            </if>
+            <if test="updateTime != null">
+                update_time = #{updateTime},
+            </if>
+            version_ = version_+1
+        </set>
+        where id_ = #{id} AND version_ = #{version}
+    </update>
+
+    <select id="getStudentLastChange" resultMap="SubjectChange">
+        SELECT *
+        FROM subject_change
+        WHERE student_id_ = #{studentId}
+          AND music_group_id_ = #{musicGroupId}
+          AND status_ = 2
+        ORDER BY create_time_ DESC
+        LIMIT 1
+    </select>
+
+    <select id="getChangeInfo" resultMap="SubjectChange">
+        SELECT sc.*, su.username_ studentName
+        FROM subject_change sc
+                 LEFT jOIN sys_user su ON su.id_ = sc.student_id_
+        WHERE sc.id_ = #{id}
+    </select>
+
+    <select id="getMusicGroupWaitPay" resultMap="SubjectChange">
+        SELECT *
+        FROM subject_change
+        WHERE music_group_id_ = #{musicGroupId}
+          AND status_ IN (0, 1)
+    </select>
+
+    <select id="queryPage" resultMap="SubjectChange">
+        SELECT * FROM subject_change sc
+        <include refid="queryPageSql"/>
+        ORDER BY sc.id_ DESC
+        <include refid="global.limit"/>
+    </select>
+
+    <select id="getPageList" resultMap="SubjectChange">
+        SELECT sc.*,s.username_ studentName,o.name_ organName,co.name_ cooperationOrganName,edu.real_name_ eduTeacher,
+        mg.name_ musicGroupName FROM subject_change sc
+        LEFT JOIN music_group mg ON mg.id_ = sc.music_group_id_
+        LEFT JOIN sys_user s ON sc.student_id_ = s.id_
+        LEFT JOIN sys_user edu ON edu.id_ = sc.edu_teacher_id_
+        LEFT JOIN organization o ON sc.organ_id_ = o.id_
+        LEFT JOIN cooperation_organ co ON sc.cooperation_organ_id_ = co.id_
+        <include refid="queryPageSql"/>
+        ORDER BY sc.sell_time_ DESC
+        <include refid="global.limit"/>
+    </select>
+    <sql id="queryPageSql">
+        <where>
+            <if test="search != null and search != ''">
+                AND (sc.order_no_ = #{search} OR sc.trans_no_ = #{search} OR s.username_ LIKE CONCAT('%',#{search},'%'))
+            </if>
+            <if test="organIdList != null and organIdList != ''">
+                AND FIND_IN_SET(sc.organ_id_,#{organIdList})
+            </if>
+            <if test="status != null">
+                AND sc.status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            </if>
+            <if test="cooperationOrganId != null">
+                AND sc.cooperation_organ_id_ = #{cooperationOrganId}
+            </if>
+            <if test="startTime != null">
+                AND sc.sell_time_ >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND sc.sell_time_ &lt;= #{endTime}
+            </if>
+        </where>
+    </sql>
+    <select id="queryCount" resultType="int">
+        SELECT COUNT(*) FROM subject_change sc
+        LEFT JOIN sys_user s ON sc.student_id_ = s.id_
+        <include refid="queryPageSql"/>
+    </select>
+
+    <select id="getChangeGoods" resultMap="SubjectChange">
+        SELECT GROUP_CONCAT(original_musical_)     musicGroupName,
+               GROUP_CONCAT(original_accessories_) original_accessories_,
+               GROUP_CONCAT(change_musical_)       trans_no_,
+               GROUP_CONCAT(change_accessories_)   change_accessories_
+        FROM subject_change
+        WHERE music_group_id_ = #{musicGroupId}
+          AND status_ = 2
+        GROUP BY music_group_id_
+    </select>
+    <resultMap id="SubjectChangeDto" type="com.ym.mec.biz.dal.entity.SubjectChange" extends="SubjectChange">
+        <collection property="changeMusicalGoods" ofType="com.ym.mec.biz.dal.entity.Goods">
+            <result property="id" column="musical_id_"/>
+            <result property="name" column="musical_name_"/>
+        </collection>
+        <collection property="changeAccessoriesGoods" ofType="com.ym.mec.biz.dal.entity.Goods">
+            <result property="id" column="accessories_id_"/>
+            <result property="name" column="accessories_name_"/>
+        </collection>
+    </resultMap>
+
+    <select id="getStudentGoods" resultMap="SubjectChangeDto">
+        SELECT sc.*, m.id_ musical_id_, m.name_ musical_name_, a.id_ accessories_id_, a.name_ accessories_name_
+        FROM subject_change sc
+                 LEFT JOIN goods m ON m.id_ = sc.change_musical_
+                 LEFT JOIN goods a ON FIND_IN_SET(a.id_, sc.change_accessories_)
+        WHERE sc.id_ IN (
+            SELECT MAX(id_)
+            FROM subject_change
+            WHERE music_group_id_ = #{musicGroupId}
+              AND status_ = 2
+            GROUP BY student_id_
+        )
+    </select>
+    <select id="getStudentWaitPay" resultMap="SubjectChange">
+        SELECT *
+        FROM subject_change
+        WHERE music_group_id_ = #{musicGroupId}
+          AND student_id_ = #{studentId}
+          AND status_ IN (0, 1)
+        LIMIT 1
+    </select>
+</mapper>

+ 15 - 6
mec-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -29,6 +29,7 @@
         <result column="dispose_content_" property="disposeContent"/>
         <result column="operator_" property="operator"/>
         <result column="complaints_time_" property="complaintsTime"/>
+        <result column="current_schedule_id_" property="currentScheduleId"/>
     </resultMap>
     
     <resultMap type="com.ym.mec.biz.dal.dto.Mapper" id="Mapper">
@@ -51,19 +52,19 @@
     <insert id="insert" parameterType="com.ym.mec.biz.dal.entity.TeacherAttendance" useGeneratedKeys="true"
             keyColumn="id" keyProperty="id">
         INSERT INTO teacher_attendance
-        (id_,group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,remark_,create_time_,sign_out_time_,
-        sign_out_status_,current_class_times_,sign_in_longitude_latitude_,sign_out_longitude_latitude_)
-        VALUES(#{id},#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherId},
+        (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,remark_,create_time_,sign_out_time_,
+        sign_out_status_,current_class_times_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_)
+        VALUES(#{groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{teacherId},
         #{musicGroupId},#{classGroupId},#{courseScheduleId},#{signInTime},#{signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{remark},
         now(),#{signOutTime},#{signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-        #{currentClassTimes},#{signInLongitudeLatitude},#{signOutLongitudeLatitude})
+        #{currentClassTimes},#{signInLongitudeLatitude},#{signOutLongitudeLatitude},#{currentScheduleId})
     </insert>
 
     <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.TeacherAttendance" useGeneratedKeys="true"
             keyColumn="id" keyProperty="id">
         INSERT INTO teacher_attendance
         (group_type_,teacher_id_,music_group_id_,class_group_id_,course_schedule_id_,sign_in_time_,sign_in_status_,
-        remark_,create_time_,sign_out_time_,sign_out_status_,sign_in_longitude_latitude_,sign_out_longitude_latitude_)
+        remark_,create_time_,sign_out_time_,sign_out_status_,sign_in_longitude_latitude_,sign_out_longitude_latitude_,current_schedule_id_)
         VALUE
         <foreach collection="teacherAttendances" item="teacherAttendance" separator=",">
             (#{teacherAttendance.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
@@ -72,7 +73,7 @@
             #{teacherAttendance.signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             #{teacherAttendance.remark},now(),#{teacherAttendance.signOutTime},
             #{teacherAttendance.signOutStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-            #{teacherAttendance.signInLongitudeLatitude},#{teacherAttendance.signOutLongitudeLatitude})
+            #{teacherAttendance.signInLongitudeLatitude},#{teacherAttendance.signOutLongitudeLatitude},#{teacherAttendance.currentScheduleId})
         </foreach>
     </insert>
 
@@ -83,6 +84,9 @@
             <if test="signInStatus != null">
                 sign_in_status_ = #{signInStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
             </if>
+            <if test="currentScheduleId != null">
+                current_schedule_id_ = #{currentScheduleId},
+            </if>
             <if test="remark != null">
                 remark_ = #{remark},
             </if>
@@ -529,6 +533,11 @@
         LEFT JOIN student_attendance sa ON ta.course_schedule_id_ = sa.course_schedule_id_
         WHERE ta.course_schedule_id_ = #{courseScheduleId}
     </select>
+    <select id="findFirstSign" resultType="java.lang.Long">
+        SELECT ta.course_schedule_id_ FROM teacher_attendance ta
+        WHERE ta.current_schedule_id_ = #{currentScheduleId} AND ta.teacher_id_ = #{userId}
+        AND ta.sign_in_time_ IS NOT NULL ORDER BY ta.sign_in_time_ ASC LIMIT 1
+    </select>
 
     <update id="updateViPSignOutStatus" parameterType="string">
     	UPDATE teacher_attendance SET sign_out_status_ = 1,sign_out_time_= now()

+ 4 - 0
mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java

@@ -16,6 +16,10 @@ public interface TaskRemoteService {
 	// 教师异常考勤推送
 	public void pushTeacherExceptionAttendanceTask();
 
+	@GetMapping(value = "task/updateMusicGroupStudentFeeStatus")
+	// 更新学员缴费状态(新)
+	public void updateMusicGroupStudentFeeStatus();
+
 	@GetMapping(value = "task/refreshPaymentFeeStatus")
 	// 刷新付费状态
 	public void refreshPaymentFeeStatus();

+ 5 - 0
mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java

@@ -157,6 +157,11 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 	}
 
 	@Override
+	public void updateMusicGroupStudentFeeStatus() {
+		logger.info("更新乐团学员缴费状态失败");
+	}
+
+	@Override
 	public void studentServeRemind() {
 		logger.info("本周应布置课外训练推送失败");
 	}

+ 1 - 1
mec-im/src/main/java/com/ym/common/ErrorEnum.java

@@ -17,7 +17,7 @@ public enum ErrorEnum {
     ERR_IM_TOKEN_ERROR(10, "IM token error"),
     ERR_CREATE_ROOM_ERROR(11, "Create room error"),
     ERR_JOIN_ROOM_ERROR(12, "Join room error"),
-    JOIN_ROOM_ERROR(35, "Join room error"),
+    JOIN_ROOM_ERROR(35, "加入房间失败,请前往线下教室"),
     ERR_MESSAGE_ERROR(13, "IM Message send error"),
 
 

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

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.ym.common.ApiException;
 import com.ym.common.BaseResponse;
 import com.ym.common.ErrorEnum;
-import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.pojo.*;
 import com.ym.service.MessageService;
 import com.ym.service.RoomService;
@@ -25,32 +24,25 @@ public class RoomController{
     RoomService roomService;
     @Autowired
     MessageService messageService;
-    @Autowired
-    SysUserFeignService sysUserFeignService;
 
     @RequestMapping(value = "/join", method = RequestMethod.POST)
-    public Object joinRoom(@RequestBody ReqUserData data)
-            throws ApiException, Exception {
-        RoomResult roomResult = roomService.joinRoom(data.getUserName(), data.getRoomId(), data.isAudience(), data.isDisableCamera(),data.isMusicMode());
-        return new BaseResponse<>(roomResult);
-    }
-
-    @RequestMapping(value = "/queryNoJoinStu", method = RequestMethod.GET)
-    public Object queryNoJoinStu(String roomId){
-        return new BaseResponse<>(roomService.queryNoJoinStu(roomId));
+    public Object joinRoom(@RequestBody ReqUserData data) throws Exception {
+        return new BaseResponse<>(roomService.joinRoom(data.getRoomId()));
     }
 
     @RequestMapping(value = "/signIn", method = RequestMethod.POST)
     public Object signIn(Long roomId){
-        roomService.signIn(roomId);
         return new BaseResponse<>();
     }
 
     @RequestMapping(value = "/leave", method = RequestMethod.POST)
-    public Object leaveRoom(@RequestBody ReqUserData data)
-            throws ApiException, Exception {
-        boolean result = roomService.leaveRoom(data.getRoomId());
-        return new BaseResponse<>(result);
+    public Object leaveRoom(@RequestBody ReqUserData data){
+        return new BaseResponse<>();
+    }
+
+    @RequestMapping(value = "/queryNoJoinStu", method = RequestMethod.GET)
+    public Object queryNoJoinStu(String roomId){
+        return new BaseResponse<>(roomService.queryNoJoinStu(roomId));
     }
 
     @RequestMapping(value = "/sendImPlayMidiMessage", method = RequestMethod.POST)
@@ -59,41 +51,40 @@ public class RoomController{
         return new BaseResponse<>();
     }
 
+    @RequestMapping(value = "/leaveRoomSuccess")
+    public void leaveRoomSuccess() throws Exception {
+        roomService.leaveRoomSuccess("S1560287", "100136");
+    }
+
     @RequestMapping(value = "/statusSync")
-    public Object statusSync(@RequestBody String body) throws Exception {
+    public void statusSync(@RequestBody String body) throws Exception {
         ChannelStateNotify notify = JSONObject.parseObject(body, ChannelStateNotify.class);
         log.info("statusSyncParam: {}",JSONObject.toJSON(notify));
-        boolean result = false;
-        if(notify.getEvent() == 12 || notify.getEvent() == 3){
-            result = roomService.statusSync(notify.getChannelId(), notify.getUserId());
-        }else if(notify.getEvent() == 11){
-//            Teacher teacher = teacherDao.get(Integer.parseInt(notify.getUserId()));
-//            Long roomId = Long.parseLong(notify.getChannelId().substring(1));
-//            CourseSchedule courseSchedule = courseScheduleDao.get(roomId);
-//            if(teacher != null && teacher.getId().equals(courseSchedule.getActualTeacherId())){
-//                roomService.joinRoom(teacher.getRealName(),roomId.toString(),false,false);
-//            }else {
-//                roomService.joinRoom(teacher.getUsername(),roomId.toString(),false,false);
-//            }
+        String roomId = notify.getChannelId();
+        String userId = notify.getUserId();
+        switch (notify.getEvent()){
+            case 11:
+                //成员加入
+                roomService.joinRoomSuccess(roomId, userId);
+                break;
+            case 12:
+                //成员退出
+                roomService.leaveRoomSuccess(roomId, userId);
+                break;
         }
-        return new BaseResponse<>(result);
-    }
-
-    @RequestMapping(value = "/statusImMsg")
-    public void statusImMsg(@RequestBody String body) throws Exception {
-        System.out.println("");
+//        roomService.statusSync(notify);
     }
 
     @RequestMapping(value = "/downgrade", method = RequestMethod.POST)
     public Object downRole(@RequestBody ReqChangeUserRoleData data)
-            throws ApiException, Exception {
+            throws Exception {
         boolean result = roomService.downgrade(data.getRoomId(), data.getUsers());
         return new BaseResponse<>(result);
     }
 
     @RequestMapping(value = "/kick", method = RequestMethod.POST)
     public Object kickMember(@RequestBody ReqUserData data)
-            throws ApiException, Exception {
+            throws Exception {
         boolean result = roomService.kickMember(data.getRoomId());
         return new BaseResponse<>(result);
     }
@@ -101,14 +92,14 @@ public class RoomController{
     //only teacher
     @RequestMapping(value = "/display", method = RequestMethod.POST)
     public Object display(@RequestBody ReqDisplayData data)
-            throws ApiException, Exception {
+            throws Exception {
         boolean result = roomService.display(data.getRoomId(), data.getType(), data.getUri(),data.getUserId());
         return new BaseResponse<>(result);
     }
 
     @RequestMapping(value = "/whiteboard/create", method = RequestMethod.POST)
     public Object createWhiteBoard(@RequestBody ReqWhiteboardData data)
-            throws ApiException, Exception {
+            throws Exception {
         String result = roomService.createWhiteBoard(data.getRoomId());
         return new BaseResponse<>(result);
     }
@@ -116,21 +107,21 @@ public class RoomController{
 
     @RequestMapping(value = "/whiteboard/delete", method = RequestMethod.POST)
     public Object destroyWhiteBoard(@RequestBody ReqWhiteboardData data)
-            throws ApiException, Exception {
+            throws Exception {
         boolean result = roomService.deleteWhiteboard(data.getRoomId(), data.getWhiteboardId());
         return new BaseResponse<>(result);
     }
 
     @RequestMapping(value = "/whiteboard/list", method = RequestMethod.GET)
     public Object getWhiteBoard(@RequestParam String roomId)
-            throws ApiException, Exception {
+            throws Exception {
         List<RoomResult.WhiteboardResult> whiteboards = roomService.getWhiteboard(roomId);
         return new BaseResponse<>(whiteboards);
     }
 
     @RequestMapping(value = "/device/approve", method = RequestMethod.POST)
     public Object approveControlDevice(@RequestBody ReqDeviceControlData data)
-            throws ApiException, Exception {
+            throws Exception {
         boolean result;
         result = roomService.approveControlDevice(data.getRoomId(), data.getTicket());
         return new BaseResponse<>(result);
@@ -138,7 +129,7 @@ public class RoomController{
 
     @RequestMapping(value = "/device/reject", method = RequestMethod.POST)
     public Object rejectControlDevice(@RequestBody ReqDeviceControlData data)
-            throws ApiException, Exception {
+            throws Exception {
         boolean result;
         result = roomService.rejectControlDevice(data.getRoomId(), data.getTicket());
         return new BaseResponse<>(result);
@@ -146,7 +137,7 @@ public class RoomController{
 
     @RequestMapping(value = "/device/control", method = RequestMethod.POST)
     public Object controlDevice(@RequestBody ReqDeviceControlData data)
-            throws ApiException, Exception {
+            throws Exception {
         boolean result;
         if (data.getCameraOn() != null) {
             result = roomService.controlDevice(data.getRoomId(), data.getUserId(), DeviceTypeEnum.Camera, data.getCameraOn());
@@ -171,7 +162,7 @@ public class RoomController{
 
     @RequestMapping(value = "/device/sync", method = RequestMethod.POST)
     public Object syncDeviceState(@RequestBody ReqDeviceControlData data)
-            throws ApiException, Exception {
+            throws Exception {
         boolean result;
         if (data.getCameraOn() != null) {
             result = roomService.syncDeviceState(data.getRoomId(), DeviceTypeEnum.Camera, data.getCameraOn());
@@ -189,70 +180,70 @@ public class RoomController{
 
     @RequestMapping(value = "/whiteboard/turn-page", method = RequestMethod.POST)
     public Object turnPage(@RequestBody ReqWhiteboardData data)
-            throws ApiException, Exception {
+            throws Exception {
         boolean result = roomService.turnWhiteBoardPage(data.getRoomId(), data.getWhiteboardId(), data.getPage());
         return new BaseResponse<>(result);
     }
 
     @RequestMapping(value = "/members", method = RequestMethod.GET)
     public Object getMembers(@RequestParam String roomId)
-            throws ApiException, Exception {
+            throws Exception {
         List<RoomResult.MemberResult> whiteboards = roomService.getMembers(roomId);
         return new BaseResponse<>(whiteboards);
     }
 
     @RequestMapping(value = "/speech/apply", method = RequestMethod.POST)
     public Object apply(@RequestBody ReqSpeechData data)
-            throws ApiException, Exception {
+            throws Exception {
         Boolean result = roomService.applySpeech(data.getRoomId());
         return new BaseResponse<>(result);
     }
 
     @RequestMapping(value = "/speech/approve", method = RequestMethod.POST)
     public Object approval(@RequestBody ReqSpeechData data)
-            throws ApiException, Exception {
+            throws Exception {
         Boolean result = roomService.approveSpeech(data.getRoomId(), data.getTicket());
         return new BaseResponse<>(result);
     }
 
     @RequestMapping(value = "/speech/reject", method = RequestMethod.POST)
     public Object reject(@RequestBody ReqSpeechData data)
-            throws ApiException, Exception {
+            throws Exception {
         Boolean result = roomService.rejectSpeech(data.getRoomId(), data.getTicket());
         return new BaseResponse<>(result);
     }
 
     @RequestMapping(value = "/transfer", method = RequestMethod.POST)
     public Object transfer(@RequestBody ReqUpgradeRoleData data)
-            throws ApiException, Exception {
+            throws Exception {
         Boolean result = roomService.transfer(data.getRoomId(), data.getUserId());
         return new BaseResponse<>(result);
     }
 
     @RequestMapping(value = "/upgrade/invite", method = RequestMethod.POST)
     public Object inviteUpgradeRole(@RequestBody ReqUpgradeRoleData data)
-            throws ApiException, Exception {
+            throws Exception {
         Boolean result = roomService.inviteUpgradeRole(data.getRoomId(), data.getUserId(), data.getRole());
         return new BaseResponse<>(result);
     }
 
     @RequestMapping(value = "/upgrade/approve", method = RequestMethod.POST)
     public Object approveUpgradeRole(@RequestBody ReqUpgradeRoleData data)
-            throws ApiException, Exception {
+            throws Exception {
         Boolean result = roomService.approveUpgradeRole(data.getRoomId(), data.getTicket());
         return new BaseResponse<>(result);
     }
 
     @RequestMapping(value = "/upgrade/reject", method = RequestMethod.POST)
     public Object rejectUpgradeRole(@RequestBody ReqUpgradeRoleData data)
-            throws ApiException, Exception {
+            throws Exception {
         Boolean result = roomService.rejectUpgradeRole(data.getRoomId(), data.getTicket());
         return new BaseResponse<>(result);
     }
 
     @RequestMapping(value = "/change-role", method = RequestMethod.POST)
     public Object changeRole(@RequestBody ReqChangeRole data)
-            throws ApiException, Exception {
+            throws Exception {
         Boolean result = roomService.changeRole(data.getRoomId(), data.getUserId(), data.getRole());
         return new BaseResponse<>(result);
     }
@@ -262,7 +253,7 @@ public class RoomController{
                                      @RequestParam(value = "timestamp", required = false) String timestamp,
                                      @RequestParam(value = "nonce", required = false) String nonce,
                                      @RequestParam(value = "signature", required = false) String signature)
-            throws ApiException, Exception {
+            throws Exception {
         Boolean result = roomService.memberOnlineStatus(statusList, nonce, timestamp, signature);
         return new BaseResponse<>(result);
     }

+ 0 - 2
mec-im/src/main/java/com/ym/dao/HereWhiteDao.java

@@ -7,7 +7,5 @@ import org.springframework.stereotype.Repository;
 @Repository
 public interface HereWhiteDao extends JpaRepository<HereWhite, Long> {
 
-    HereWhite findById(Integer id);
-
     HereWhite findByCourseScheduleId(Integer id);
 }

+ 5 - 13
mec-im/src/main/java/com/ym/dao/RoomDao.java

@@ -16,26 +16,18 @@ import java.util.List;
  */
 @Repository
 public interface RoomDao extends JpaRepository<Room, Long> {
-    public List<Room> findByRid(String rid);
+    Room findByRid(String rid);
 
-    @Transactional
     @Modifying
-    public int deleteByRid(String rid);
+    int deleteByRid(String rid);
 
-    public boolean existsByRid(String rid);
+    boolean existsByRid(String rid);
 
-    @Transactional
     @Modifying
     @Query(value = "update rongyun_room set display=?2 where rid=?1", nativeQuery = true)
-    public int updateDisplayByRid(String rid, String display);
+    int updateDisplayByRid(String rid, String display);
 
-    @Transactional
-    @Modifying
-    @Query(value = "update rongyun_room set play_midi_json=?2 where rid=?1", nativeQuery = true)
-    public int updatePlayMidiByRid(String rid, String playMidi);
-
-    @Transactional
     @Modifying
     @Query(value = "update rongyun_room set whiteboard_name_index=?2 where rid=?1", nativeQuery = true)
-    public int updateWhiteboardNameIndexByRid(String rid, int whiteboardNameIndex);
+    int updateWhiteboardNameIndexByRid(String rid, int whiteboardNameIndex);
 }

+ 17 - 31
mec-im/src/main/java/com/ym/dao/RoomMemberDao.java

@@ -6,7 +6,6 @@ import org.springframework.data.jpa.repository.Lock;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
-import org.springframework.transaction.annotation.Transactional;
 
 import javax.persistence.LockModeType;
 import java.util.List;
@@ -16,64 +15,51 @@ import java.util.List;
  */
 @Repository
 public interface RoomMemberDao extends JpaRepository<RoomMember, Long> {
-    public List<RoomMember> findByRid(String rid);
+    List<RoomMember> findByRid(String rid);
 
     @Lock(value = LockModeType.PESSIMISTIC_WRITE)
-    public List<RoomMember> findByRidAndUid(String rid, String uid);
+    RoomMember findByRidAndUid(String rid, String uid);
 
-    public List<RoomMember> findByRidAndRole(String rid, int role);
+    List<RoomMember> findByRidAndRole(String rid, int role);
 
-    public List<RoomMember> findByUid(String uid);
-
-    public int countByRidAndRole(String rid, int role);
+    List<RoomMember> findByUid(String uid);
 
     @Modifying
-    @Transactional
-    public int deleteByRid(String roomId);
+    int deleteByRid(String roomId);
 
     @Query(value = "select count(*) from rongyun_room_member where rid=?1", nativeQuery = true)
-    public int countByRid(String roomId);
+    int countByRid(String roomId);
 
     @Query(value = "select count(*) from rongyun_room_member where rid=?1 and role!=?2", nativeQuery = true)
-    public int countByRidAndExcludeRole(String roomId, int excludeRole);
+    int countByRidAndExcludeRole(String roomId, int excludeRole);
 
-    @Transactional
     @Modifying
     @Query(value = "delete from rongyun_room_member where rid=?1 and uid=?2", nativeQuery = true)
-    public int deleteUserByRidAndUid(String rid, String uid);
+    int deleteUserByRidAndUid(String rid, String uid);
 
-    @Transactional
     @Modifying
     @Query(value = "update rongyun_room_member set role=?3 where rid=?1 and uid=?2", nativeQuery = true)
-    public int updateRoleByRidAndUid(String rid, String uid, int role);
-
-    @Transactional
-    @Modifying
-    @Query(value = "update rongyun_room_member set role=?3 where rid=?1 and role=?2", nativeQuery = true)
-    public int updateRoleByRidAndRole(String rid, int role);
+    int updateRoleByRidAndUid(String rid, String uid, int role);
 
-    @Transactional
     @Modifying
     @Query(value = "update rongyun_room_member set camera=?3 where rid=?1 and uid=?2", nativeQuery = true)
-    public int updateCameraByRidAndUid(String rid, String uid, boolean camera);
+    int updateCameraByRidAndUid(String rid, String uid, boolean camera);
 
-    @Transactional
     @Modifying
     @Query(value = "update rongyun_room_member set mic=?3 where rid=?1 and uid=?2", nativeQuery = true)
-    public int updateMicByRidAndUid(String rid, String uid, boolean mic);
+    int updateMicByRidAndUid(String rid, String uid, boolean mic);
 
-    @Transactional
     @Modifying
     @Query(value = "update rongyun_room_member set hand=?3 where rid=?1 and uid=?2", nativeQuery = true)
-    public int updateHandByRidAndUid(String rid, String uid, boolean hand);
+    int updateHandByRidAndUid(String rid, String uid, boolean hand);
 
-    @Transactional
     @Modifying
     @Query(value = "update rongyun_room_member set music_mode=?3 where rid=?1 and uid=?2", nativeQuery = true)
-    public int updateMusicByRidAndUid(String rid, String uid, boolean musicMode);
+    int updateMusicByRidAndUid(String rid, String uid, boolean musicMode);
 
-    public boolean existsByRidAndUid(String rid, String uid);
-
-    public boolean existsByRidAndRole(String rid, int role);
+    boolean existsByRidAndUid(String rid, String uid);
 
+    @Modifying
+    @Query(value = "DELETE FROM rongyun_room_member WHERE rid = ?1 AND uid != ?2", nativeQuery = true)
+    void deleteRoomMember(String roomId, String userId);
 }

+ 0 - 2
mec-im/src/main/java/com/ym/dao/SpeechDao.java

@@ -11,6 +11,4 @@ import java.util.List;
  */
 @Repository
 public interface SpeechDao extends CrudRepository<ScheduledTaskInfo, String> {
-
-    List<ScheduledTaskInfo> findByTicket(String ticket);
 }

+ 2 - 5
mec-im/src/main/java/com/ym/dao/UserDao.java

@@ -13,12 +13,9 @@ import java.util.List;
  */
 @Repository
 public interface UserDao extends JpaRepository<UserInfo, Long> {
-    //will query with "select * from TABLE where user_id = 'userId'"
-    public List<UserInfo> findByUid(String uid);
 
-    public List<UserInfo> findByName(String name);
+    UserInfo findByUid(String uid);
 
-    @Transactional
     @Modifying
-    public int deleteByUid(String uid);
+    int deleteByUid(String uid);
 }

+ 9 - 10
mec-im/src/main/java/com/ym/dao/WhiteboardDao.java

@@ -14,23 +14,22 @@ import java.util.List;
  */
 @Repository
 public interface WhiteboardDao extends JpaRepository<Whiteboard, Long> {
-    public List<Whiteboard> findByRid(String rid);
-    public List<Whiteboard> findByRidAndCreator(String rid, String creator);
-    public List<Whiteboard> findByRidAndWbid(String rid, String wbid);
+    List<Whiteboard> findByRid(String rid);
 
-    public int deleteByRid(String rid);
+    List<Whiteboard> findByRidAndCreator(String rid, String creator);
+
+    List<Whiteboard> findByRidAndWbid(String rid, String wbid);
+
+    int deleteByRid(String rid);
 
-    @Transactional
     @Modifying
-    public int deleteByWbid(String wbid);
+    int deleteByWbid(String wbid);
 
-    @Transactional
     @Modifying
     @Query(value = "delete from rongyun_whiteboard where rid=?1 and creator=?2", nativeQuery = true)
-    public int deleteByRidAndCreator(String rid, String creator);
+    int deleteByRidAndCreator(String rid, String creator);
 
-    @Transactional
     @Modifying
     @Query(value = "update rongyun_whiteboard set cur_pg=?3 where wbid=?2 and rid=?1", nativeQuery = true)
-    public int updatePageByRidAndWbid(String rid, String wbid, int page);
+    int updatePageByRidAndWbid(String rid, String wbid, int page);
 }

+ 6 - 1
mec-im/src/main/java/com/ym/service/Impl/HereWhiteServiceImpl.java

@@ -6,9 +6,11 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.util.http.HttpUtil;
 import com.ym.pojo.HereWhite;
 import com.ym.service.HereWhiteService;
+import com.ym.service.RoomService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Date;
@@ -25,10 +27,13 @@ public class HereWhiteServiceImpl implements HereWhiteService {
 
     @Autowired
     private HereWhiteDao hereWhiteDao;
+    @Autowired
+    private RoomService roomService;
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
+    @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
     public HereWhite create(String name, Integer userNum,Integer courseScheduleId) throws Exception {
+        courseScheduleId = roomService.getCurrentCourseId(courseScheduleId.toString());
         JSONObject json = new JSONObject();
         json.put("name",name);
         json.put("limit",userNum);

File diff suppressed because it is too large
+ 271 - 365
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java


+ 28 - 36
mec-im/src/main/java/com/ym/service/RoomService.java

@@ -1,7 +1,5 @@
 package com.ym.service;
 
-import com.ym.common.ApiException;
-import com.ym.mec.biz.dal.dto.BasicUserDto;
 import com.ym.mec.biz.dal.dto.RongyunBasicUserDto;
 import com.ym.pojo.*;
 
@@ -12,62 +10,61 @@ import java.util.List;
  */
 public interface RoomService {
     //everyone
-    public RoomResult joinRoom(String userName, String roomId, boolean isAudience, boolean isDisableCamera,boolean isMusicMode) throws ApiException, Exception;
+    RoomResult joinRoom(String roomId) throws Exception;
 
-    void signIn(Long roomId);
-
-    public Boolean leaveRoom(String roomId) throws ApiException, Exception;
+    Integer getCurrentCourseId(String roomId);
 
     //only host
-    public Boolean downgrade(String roomId, List<ReqChangeUserRoleData.ChangedUser> users) throws ApiException, Exception;
+    Boolean downgrade(String roomId, List<ReqChangeUserRoleData.ChangedUser> users) throws Exception;
+
+    Boolean kickMember(String roomId) throws Exception;
 
-    public Boolean kickMember(String roomId) throws ApiException, Exception;
+    void joinRoomSuccess(String roomId,String userId) throws Exception;
 
+    void leaveRoomSuccess(String roomId,String userId) throws Exception;
 
     //only teacher
-    public Boolean display(String roomId, int type, String uri, String userId) throws ApiException, Exception;
+    Boolean display(String roomId, int type, String uri, String userId) throws Exception;
 
-    public String createWhiteBoard(String roomId) throws ApiException, Exception;
+    String createWhiteBoard(String roomId) throws Exception;
 
-    public Boolean deleteWhiteboard(String roomId, String whiteBoardId) throws ApiException, Exception;
+    Boolean deleteWhiteboard(String roomId, String whiteBoardId) throws Exception;
 
-    public List<RoomResult.WhiteboardResult> getWhiteboard(String roomId) throws ApiException, Exception;
+    List<RoomResult.WhiteboardResult> getWhiteboard(String roomId) throws Exception;
 
-    public Boolean turnWhiteBoardPage(String roomId, String whiteBoardId, int page) throws ApiException, Exception;
+    Boolean turnWhiteBoardPage(String roomId, String whiteBoardId, int page) throws Exception;
 
-    public Boolean controlDevice(String roomId, String userId, DeviceTypeEnum type, boolean enable) throws ApiException, Exception;
+    Boolean controlDevice(String roomId, String userId, DeviceTypeEnum type, boolean enable) throws Exception;
 
     Boolean batchControlDevice(ReqDeviceControlData data) throws Exception;
 
-    public Boolean approveControlDevice(String roomId, String ticket) throws ApiException, Exception;
-
-    public Boolean rejectControlDevice(String roomId, String ticket) throws ApiException, Exception;
+    Boolean approveControlDevice(String roomId, String ticket) throws Exception;
 
+    Boolean rejectControlDevice(String roomId, String ticket) throws Exception;
 
-    public List<RoomResult.MemberResult> getMembers(String roomId) throws  ApiException, Exception;
 
-    public Boolean applySpeech(String roomId) throws  ApiException, Exception;
+    List<RoomResult.MemberResult> getMembers(String roomId) throws  Exception;
 
-    public Boolean approveSpeech(String roomId, String requestId) throws  ApiException, Exception;
+    Boolean applySpeech(String roomId) throws  Exception;
 
-    public Boolean rejectSpeech(String roomId, String requestId) throws  ApiException, Exception;
+    Boolean approveSpeech(String roomId, String requestId) throws  Exception;
 
+    Boolean rejectSpeech(String roomId, String requestId) throws  Exception;
 
-    public Boolean transfer(String roomId, String userId) throws ApiException, Exception;
 
-    public Boolean inviteUpgradeRole(String roomId, String userId, int role) throws  ApiException, Exception;
-    public Boolean approveUpgradeRole(String roomId, String ticket) throws ApiException, Exception;
-    public Boolean rejectUpgradeRole(String roomId, String ticket) throws ApiException, Exception;
+    Boolean transfer(String roomId, String userId) throws Exception;
 
-    public Boolean syncDeviceState(String roomId, DeviceTypeEnum type, boolean enable) throws ApiException, Exception;
+    Boolean inviteUpgradeRole(String roomId, String userId, int role) throws  Exception;
+    Boolean approveUpgradeRole(String roomId, String ticket) throws Exception;
+    Boolean rejectUpgradeRole(String roomId, String ticket) throws Exception;
 
-    public Boolean changeRole(String roomId, String userId, int role) throws ApiException, Exception;
+    Boolean syncDeviceState(String roomId, DeviceTypeEnum type, boolean enable) throws Exception;
 
-    public void destroyRoom(String roomId);
-    public Boolean memberOnlineStatus(List<ReqMemberOnlineStatus> statusList, String nonce, String timestamp, String signature) throws ApiException, Exception;
-    public void userIMOfflineKick(String userId);
+    Boolean changeRole(String roomId, String userId, int role) throws Exception;
 
-    boolean statusSync(String roomId,String userId) throws Exception;
+    void destroyRoom(String roomId);
+    Boolean memberOnlineStatus(List<ReqMemberOnlineStatus> statusList, String nonce, String timestamp, String signature) throws Exception;
+    void userIMOfflineKick(String userId);
 
     /**
      * 发送节拍器消息
@@ -80,9 +77,4 @@ public interface RoomService {
      * @return
      */
     List<RongyunBasicUserDto> queryNoJoinStu(String roomId);
-
-    /**
-     * 发送节拍器自定义消息
-     */
-//    void sendImPlayMidiMessage(PlayMidiMessageData playMidiMessageData);
 }

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

@@ -1,5 +1,7 @@
 package com.ym.mec.student.config;
 
+import com.ym.mec.common.security.BaseAccessDeniedHandler;
+import com.ym.mec.common.security.BaseAuthenticationEntryPoint;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
@@ -8,41 +10,44 @@ import org.springframework.security.oauth2.config.annotation.web.configuration.E
 import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
 import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
 
-import com.ym.mec.common.security.BaseAccessDeniedHandler;
-import com.ym.mec.common.security.BaseAuthenticationEntryPoint;
-
 @Configuration
 @EnableResourceServer
 @EnableGlobalMethodSecurity(prePostEnabled = true)
 public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 
-	@Autowired
-	private BaseAccessDeniedHandler baseAccessDeniedHandler;
-
-	@Autowired
-	private BaseAuthenticationEntryPoint baseAuthenticationEntryPoint;
-
-	@Override
-	public void configure(HttpSecurity http) throws Exception {
-		http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
-				.authorizeRequests().antMatchers("/v2/api-docs","/code/*","/register/*","/studentOrder/*","/musicGroup/getSubjectGoodsAndInfo",
-				"/musicGroup/getMusicGroupStatus","/musicGroup/getOrderStatus",
-				"/musicGroup/pay",
-				"/musicGroup/rePay",
-				"/studentManage/queryStudentPer",
-				"/sporadicChargeInfo/get",
-				"/sporadicChargeInfo/sporadicPay",
-				"/repair/getRepairInfo",
-				"/repair/payRepair",
-				"/degree/*",
-				"/practiceGroup/queryOrderInfo",
-				"/systemDate/query",
-				"/organization/getOrgans").permitAll().anyRequest().authenticated().and().httpBasic();
-	}
-
-	@Override
-	public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
-		resources.authenticationEntryPoint(baseAuthenticationEntryPoint).accessDeniedHandler(baseAccessDeniedHandler);
-	}
+    @Autowired
+    private BaseAccessDeniedHandler baseAccessDeniedHandler;
+
+    @Autowired
+    private BaseAuthenticationEntryPoint baseAuthenticationEntryPoint;
+
+    @Override
+    public void configure(HttpSecurity http) throws Exception {
+        http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
+                .authorizeRequests().antMatchers("/v2/api-docs", "/code/*", "/register/*", "/studentOrder/*", "/musicGroup/getSubjectGoodsAndInfo",
+                "/musicGroup/getMusicGroupStatus", "/musicGroup/getOrderStatus",
+                "/musicGroup/pay",
+                "/musicGroup/rePay",
+                "/studentManage/queryStudentPer",
+                "/sporadicChargeInfo/get",
+                "/sporadicChargeInfo/sporadicPay",
+                "/repair/getRepairInfo",
+                "/repair/payRepair",
+                "/degree/*",
+                "/practiceGroup/queryOrderInfo",
+                "/systemDate/query",
+                "/organization/getOrgans",
+                "/repair/addGoodsSellOrder",
+                "/repair/getStudentGoodsOrder",
+                "/subjectChange/getChangeInfo",
+                "/subjectChange/payChange",
+                "/contracts/queryProduceContract",
+                "/repair/studentPaymentGoodsOrder").permitAll().anyRequest().authenticated().and().httpBasic();
+    }
+
+    @Override
+    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
+        resources.authenticationEntryPoint(baseAuthenticationEntryPoint).accessDeniedHandler(baseAccessDeniedHandler);
+    }
 
 }

+ 8 - 5
mec-student/src/main/java/com/ym/mec/student/controller/ContractsController.java

@@ -81,11 +81,14 @@ public class ContractsController extends BaseController {
 
 	@ApiOperation("查询产品协议")
 	@GetMapping(value = "queryProduceContract")
-	public Object queryProduceContract(String musicGroupId) {
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			return failed("获取用户信息失败");
+	public Object queryProduceContract(Integer userId, String musicGroupId) {
+		if(Objects.isNull(userId)){
+			SysUser sysUser = sysUserFeignService.queryUserInfo();
+			if (sysUser == null) {
+				return failed("获取用户信息失败");
+			}
+			userId = sysUser.getId();
 		}
-		return succeed(contractService.queryProductContract(sysUser.getId(),musicGroupId));
+		return succeed(contractService.queryProductContract(userId,musicGroupId));
 	}
 }

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

@@ -259,9 +259,7 @@ public class MusicGroupController extends BaseController {
         if (studentRegistration == null) {
             return failed("报名信息有误,请核查");
         }
-
         Integer userId = studentRegistration.getUserId();
-
         StudentPaymentOrder ApplyOrder = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.SUCCESS);
         StudentPaymentOrder waitPay = studentPaymentOrderService.findMusicGroupApplyOrderByStatus(userId, studentRegistration.getMusicGroupId(), DealStatusEnum.WAIT_PAY);
         if (ApplyOrder != null && waitPay == null) {
@@ -271,7 +269,6 @@ public class MusicGroupController extends BaseController {
         if(payMap.containsKey("tradeState")){
             return failed(HttpStatus.CREATED, "恭喜您,报名成功!");
         }
-
         return succeed(payMap);
     }
 

+ 47 - 17
mec-student/src/main/java/com/ym/mec/student/controller/RepairController.java

@@ -3,7 +3,7 @@ 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.biz.dal.dto.GoodsSellDto;
+import com.ym.mec.biz.dal.entity.StudentGoodsSell;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.StudentRepair;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
@@ -11,11 +11,9 @@ import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
 import com.ym.mec.biz.dal.page.GoodsCategoryQueryInfo;
 import com.ym.mec.biz.dal.page.GoodsQueryInfo;
+import com.ym.mec.biz.dal.page.GoodsSellQueryInfo;
 import com.ym.mec.biz.dal.page.RepairStudentQueryInfo;
-import com.ym.mec.biz.service.GoodsCategoryService;
-import com.ym.mec.biz.service.GoodsService;
-import com.ym.mec.biz.service.StudentPaymentOrderService;
-import com.ym.mec.biz.service.StudentRepairService;
+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;
@@ -23,10 +21,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 import java.util.Map;
@@ -46,28 +41,46 @@ public class RepairController extends BaseController {
     private GoodsService goodsService;
     @Autowired
     private GoodsCategoryService goodsCategoryService;
+    @Autowired
+    private StudentGoodsSellService studentGoodsSellService;
 
     @ApiOperation("添加商品销售订单")
     @PostMapping(value = "/addGoodsSellOrder")
-    public HttpResponseResult addGoodsSellOrder(GoodsSellDto goodsSellDto) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            throw new BizException("请登录");
+    public HttpResponseResult addGoodsSellOrder(@RequestBody StudentGoodsSell studentGoodsSell) throws Exception {
+        if(studentGoodsSell.getUserId() == null){
+            SysUser sysUser = sysUserFeignService.queryUserInfo();
+            if (sysUser == null) {
+                throw new BizException("请登录");
+            }
+            studentGoodsSell.setUserId(sysUser.getId());
         }
-        if (goodsSellDto.getIsRepeatPay() == false) {
-            List<StudentPaymentOrder> list = studentPaymentOrderService.queryByCondition(GroupType.GOODS_SELL, null, sysUser.getId(), DealStatusEnum.ING,
-                    OrderTypeEnum.RENEW);
+        if (studentGoodsSell.getIsRepeatPay() == false) {
+            List<StudentPaymentOrder> list = studentPaymentOrderService.queryByCondition(GroupType.GOODS_SELL, null, studentGoodsSell.getUserId(), DealStatusEnum.ING,
+                    OrderTypeEnum.GOODS_SELL);
             if (list.size() > 0) {
                 return failed(HttpStatus.CONTINUE, "您有待支付的订单");
             }
         }
-        Map map = studentRepairService.addGoodsSellOrder(goodsSellDto);
+        studentGoodsSell.setAuthorUser(studentGoodsSell.getUserId());
+        Map map = studentRepairService.addGoodsSellOrder(studentGoodsSell);
         if(map.containsKey("tradeState")){
             return failed(HttpStatus.CREATED, "恭喜您,购买成功!");
         }
         return succeed(map);
     }
 
+    @ApiOperation("学员扫码支付")
+    @PostMapping(value = "/studentPaymentGoodsOrder")
+    public HttpResponseResult studentPaymentGoodsOrder(Integer goodsSellId) throws Exception {
+        Map map = studentRepairService.studentPaymentGoodsOrder(goodsSellId);
+        if(map.containsKey("tradeState")){
+            return failed(HttpStatus.CREATED, "恭喜您,购买成功!");
+        }
+        return succeed(map);
+    }
+
+
+
     @ApiOperation("获取维修记录")
     @GetMapping(value = "/getStudentRepairList")
     public HttpResponseResult getStudentRepairList(RepairStudentQueryInfo queryInfo) {
@@ -128,4 +141,21 @@ public class RepairController extends BaseController {
     public Object queryGoodsCategoryPage(GoodsCategoryQueryInfo queryInfo) {
         return succeed(goodsCategoryService.queryPage(queryInfo));
     }
+
+    @ApiOperation(value = "分页查询学员商品订单")
+    @GetMapping("/queryStudentGoodsOrders")
+    public Object queryStudentGoodsOrders(GoodsSellQueryInfo queryInfo) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        queryInfo.setStudentId(sysUser.getId());
+        return succeed(studentGoodsSellService.queryStudentGoodsOrders(queryInfo));
+    }
+
+    @ApiOperation(value = "获取学员商品订单")
+    @GetMapping("/getStudentGoodsOrder")
+    public Object getStudentGoodsOrder(Integer goodsSellId) {
+        return succeed(studentGoodsSellService.get(goodsSellId));
+    }
 }

Some files were not shown because too many files changed in this diff