فهرست منبع

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

 Conflicts:
	cms/src/main/java/com/ym/mec/cms/controller/NewsController.java
	cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsInformationServiceImpl.java
zouxuan 3 سال پیش
والد
کامیت
6cb1fecea6
100فایلهای تغییر یافته به همراه3077 افزوده شده و 2355 حذف شده
  1. 33 0
      cms/src/main/java/com/ym/mec/cms/controller/NewsController.java
  2. 3 1
      cms/src/main/java/com/ym/mec/cms/dal/dao/SysNewsInformationDao.java
  3. 23 1
      cms/src/main/java/com/ym/mec/cms/dal/entity/SysNewsType.java
  4. 2 10
      cms/src/main/java/com/ym/mec/cms/service/SysNewsInformationService.java
  5. 2 0
      cms/src/main/java/com/ym/mec/cms/service/SysNewsTypeService.java
  6. 5 56
      cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsInformationServiceImpl.java
  7. 68 38
      cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsTypeServiceImpl.java
  8. 16 2
      cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml
  9. 10 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUser.java
  10. 4 4
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/PhoneAuthenticationProvider.java
  11. 29 26
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java
  12. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/config/AdapayNotifyConstants.java
  13. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java
  14. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  15. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/HfMerchantConfigDao.java
  16. 8 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java
  17. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SellOrderDao.java
  18. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  19. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java
  20. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java
  21. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentRouteOrderDao.java
  22. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  23. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkStudentDetailDto.java
  24. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseScheduleEndDto.java
  25. 88 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportStudentSubCourse.java
  26. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/FeeFlagNumDto.java
  27. 110 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PaymentParam.java
  28. 12 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java
  29. 86 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentServeDto.java
  30. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentSubTotalCourseTimesDto.java
  31. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  32. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/HfMember.java
  33. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/QuestionnaireTopic.java
  34. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentRegistration.java
  35. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java
  36. 30 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicScore.java
  37. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExamSongTypeEnum.java
  38. 4 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java
  39. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java
  40. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentStatisticsQueryInfo.java
  41. 47 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentSubTotalCourseTimesQueryInfo.java
  42. 7 4
      mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java
  43. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  44. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java
  45. 14 6
      mec-biz/src/main/java/com/ym/mec/biz/service/HfMemberService.java
  46. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/HfMerchantConfigService.java
  47. 0 281
      mec-biz/src/main/java/com/ym/mec/biz/service/NotifyCallback.java
  48. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/OrderPayOpsService.java
  49. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/PayService.java
  50. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/PracticeGroupService.java
  51. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java
  52. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderDetailService.java
  53. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  54. 18 5
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  55. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicScoreService.java
  56. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherService.java
  57. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantOrderRecordService.java
  58. 0 14
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantPaymentOrderService.java
  59. 17 8
      mec-biz/src/main/java/com/ym/mec/biz/service/UploadFileService.java
  60. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java
  61. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ChildrenDayReserveServiceImpl.java
  62. 147 147
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  63. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java
  64. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CoursesGroupServiceImpl.java
  65. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/DegreeRegistrationServiceImpl.java
  66. 270 234
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  67. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java
  68. 195 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/HfMemberServiceImpl.java
  69. 0 144
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/HfMemberSserviceImpl.java
  70. 36 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/HfMerchantConfigServiceImpl.java
  71. 11 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  72. 85 26
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
  73. 526 526
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupPaymentCalenderDetailServiceImpl.java
  74. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  75. 71 148
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrderPayOpsServiceImpl.java
  76. 22 38
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrganizationServiceImpl.java
  77. 30 41
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PayServiceImpl.java
  78. 58 50
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  79. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ReplacementInstrumentActivityServiceImpl.java
  80. 30 80
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SellOrderServiceImpl.java
  81. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseHomeworkServiceImpl.java
  82. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentInstrumentServiceImpl.java
  83. 136 115
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  84. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderDetailServiceImpl.java
  85. 43 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  86. 8 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRechargeServiceImpl.java
  87. 5 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRepairServiceImpl.java
  88. 27 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  89. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java
  90. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  91. 53 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreServiceImpl.java
  92. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  93. 105 47
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java
  94. 118 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantOrderRecordServiceImpl.java
  95. 17 213
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantPaymentOrderServiceImpl.java
  96. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  97. 21 0
      mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml
  98. 16 3
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  99. 8 3
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  100. 127 0
      mec-biz/src/main/resources/config/mybatis/HfMerchantConfigMapper.xml

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

@@ -1,5 +1,29 @@
 package com.ym.mec.cms.controller;
 
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.cms.controller.queryinfo.NewsInformationQueryInfo;
@@ -28,6 +52,8 @@ import org.springframework.web.bind.annotation.*;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import javax.validation.constraints.NotNull;
+
 @RestController
 @RequestMapping("news")
 @Api(tags = "资讯服务")
@@ -190,4 +216,11 @@ public class NewsController extends BaseController {
         return succeed(sysNewsInformationService.deleteWithLogical(id));
     }
 
+	@ApiOperation("查询资讯详情")
+	@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "资讯ID编号", required = true, dataType = "Long"),
+			@ApiImplicitParam(name = "memo", value = "版本号",  dataType = "String") })
+	@GetMapping("/list/tree")
+	public Object listWithTree(Integer id, String memo) {
+		return succeed(sysNewsTypeService.listWithTree(id,memo));
+	}
 }

+ 3 - 1
cms/src/main/java/com/ym/mec/cms/dal/dao/SysNewsInformationDao.java

@@ -15,7 +15,7 @@ public interface SysNewsInformationDao extends BaseDAO<Long, SysNewsInformation>
 	 * @param type
 	 * @return
 	 */
-	List<SysNewsInformation> queryByType(Integer type);
+	List<SysNewsInformation> queryByType(@Param("type") Integer type);
 
 	List<SysNewsInformation> queryBottomInfo(@Param("subType") Integer subType);
 
@@ -37,4 +37,6 @@ public interface SysNewsInformationDao extends BaseDAO<Long, SysNewsInformation>
 	List<SysNewsInformation> queryNeedUpdateStatusList();
 	
 	SysNewsInformationDto queryById(Long id);
+
+	List<SysNewsInformation> queryBySubType(@Param("subType") Integer subType, @Param("memo") String memo);
 }

+ 23 - 1
cms/src/main/java/com/ym/mec/cms/dal/entity/SysNewsType.java

@@ -4,6 +4,8 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import com.ym.mec.common.entity.BaseEntity;
 
+import java.util.List;
+
 /**
  * 对应数据库表(sys_news_type):
  */
@@ -26,7 +28,27 @@ public class SysNewsType extends BaseEntity {
 	
 	/**  */
 	private java.util.Date updateTime;
-	
+
+	private List<SysNewsType> children;
+	private List<SysNewsInformation> informationList;
+
+	public List<SysNewsInformation> getInformationList() {
+		return informationList;
+	}
+
+	public void setInformationList(List<SysNewsInformation> informationList) {
+		this.informationList = informationList;
+	}
+
+	public List<SysNewsType> getChildren() {
+		return children;
+	}
+
+	public SysNewsType setChildren(List<SysNewsType> children) {
+		this.children = children;
+		return this;
+	}
+
 	public void setId(Integer id){
 		this.id = id;
 	}

+ 2 - 10
cms/src/main/java/com/ym/mec/cms/service/SysNewsInformationService.java

@@ -1,8 +1,5 @@
 package com.ym.mec.cms.service;
 
-import java.util.List;
-import java.util.Map;
-
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.cms.controller.queryinfo.NewsInformationQueryInfo;
 import com.ym.mec.cms.dal.entity.SysNewsInformation;
@@ -10,14 +7,9 @@ import com.ym.mec.cms.dto.SysNewsInformationDto;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
-public interface SysNewsInformationService extends BaseService<Long, SysNewsInformation> {
+import java.util.Map;
 
-	/**
-	 * 根据类型查询资讯列表
-	 * @param type
-	 * @return
-	 */
-	List<SysNewsInformation> queryByType(Integer type);
+public interface SysNewsInformationService extends BaseService<Long, SysNewsInformation> {
 
     List<SysNewsInformation> queryBottomInfo(Integer subType);
 

+ 2 - 0
cms/src/main/java/com/ym/mec/cms/service/SysNewsTypeService.java

@@ -12,4 +12,6 @@ public interface SysNewsTypeService extends BaseService<Integer, SysNewsType> {
 
 	//根据父级查询子集
 	List<SysNewsTypeTree> queryByParentId(Integer parentId);
+
+	List<SysNewsType> listWithTree(Integer id, String memo);
 }

+ 5 - 56
cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsInformationServiceImpl.java

@@ -1,16 +1,5 @@
 package com.ym.mec.cms.service.impl;
 
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.cms.controller.queryinfo.NewsInformationQueryInfo;
 import com.ym.mec.cms.dal.dao.SysNewsInformationDao;
@@ -23,25 +12,16 @@ 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 com.ym.mec.web.WebFeignService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
 
 @Service
 public class SysNewsInformationServiceImpl extends BaseServiceImpl<Long, SysNewsInformation> implements SysNewsInformationService {
 
 	@Autowired
 	private SysNewsInformationDao sysNewsInformationDao;
-	
-	@Autowired
-	private WebFeignService webFeignService;
-
-	@Value("${cms.server.context.path}")
-	private String serverContextPath;
-	
-	private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-
-	public void setServerContextPath(String serverContextPath) {
-		this.serverContextPath = serverContextPath;
-	}
 
 	@Override
 	public BaseDAO<Long, SysNewsInformation> getDAO() {
@@ -87,37 +67,6 @@ public class SysNewsInformationServiceImpl extends BaseServiceImpl<Long, SysNews
 			queryInfo.setMemo(null);
 		}
 		PageInfo<SysNewsInformation> pageInfos = queryHomePage(queryInfo);
-
-		/*boolean isNewer = false;
-		Date date = new Date();
-		Date startDate = queryInfo.getDate();
-		Date endDate = null;
-		if (startDate == null) {
-			try {
-				String startDateStr = "2020-05-01";
-				startDate = sdf.parse(startDateStr);
-				endDate = sdf.parse("2021-02-01");
-			} catch (ParseException e) {
-				throw new RuntimeException(e);
-			}
-		}
-		if (queryInfo.getTenantId() == 1 && date.after(startDate) && date.before(endDate)) {
-			if (user != null && "18696158274".equals(user.getPhone()) == false) {
-				isNewer = webFeignService.isPurchasedPracticeCourse(user.getId()) == false;
-				SysNewsInformation info = new SysNewsInformation();
-				info.setOrder(1);
-				info.setCreateTime(date);
-				info.setUpdateTime(date);
-				if (isNewer) {
-					info.setLinkUrl(serverContextPath + "/#/auditionActive");
-					info.setCoverImage("https://daya-online.oss-cn-beijing.aliyuncs.com/tempActivity/3_1.png");
-				} else {
-					info.setLinkUrl(serverContextPath + "/#/auditionActive");
-					info.setCoverImage("https://daya-online.oss-cn-beijing.aliyuncs.com/tempActivity/3_2.png");
-				}
-				pageInfos.getRows().add(info);
-			}
-		}*/
 		homeList.put("banner",pageInfos);
 		
 		queryInfo.setMemo(null);
@@ -159,7 +108,7 @@ public class SysNewsInformationServiceImpl extends BaseServiceImpl<Long, SysNews
 			dataList = sysNewsInformationDao.queryHomePage(params);
 		}
 		if (count == 0) {
-			dataList = new ArrayList<SysNewsInformation>();
+			dataList = new ArrayList<>();
 		}
 		pageInfo.setRows(dataList);
 		return pageInfo;

+ 68 - 38
cms/src/main/java/com/ym/mec/cms/service/impl/SysNewsTypeServiceImpl.java

@@ -1,49 +1,79 @@
 package com.ym.mec.cms.service.impl;
 
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
+import com.ym.mec.cms.dal.dao.SysNewsInformationDao;
 import com.ym.mec.cms.dal.dao.SysNewsTypeDao;
+import com.ym.mec.cms.dal.entity.SysNewsInformation;
 import com.ym.mec.cms.dal.entity.SysNewsType;
 import com.ym.mec.cms.dal.entity.SysNewsTypeTree;
 import com.ym.mec.cms.service.SysNewsTypeService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
-public class SysNewsTypeServiceImpl extends BaseServiceImpl<Integer, SysNewsType>  implements SysNewsTypeService {
-	
-	@Autowired
-	private SysNewsTypeDao sysNewsTypeDao;
-
-	@Override
-	public BaseDAO<Integer, SysNewsType> getDAO() {
-		return sysNewsTypeDao;
-	}
-
-	@Override
-	public List<SysNewsTypeTree> queryTree(Integer parentId) {
-		if(parentId == null){
-			parentId = 0 ;
-		}
-		List<SysNewsTypeTree> sysNewsTypeList = queryByParentId(parentId);
-		if(sysNewsTypeList != null && sysNewsTypeList.size() > 0){
-			for(SysNewsTypeTree type : sysNewsTypeList){
-				type.setSubTypeList(queryTree(type.getId()));
-			}
-		}
-		
-		return sysNewsTypeList;
-	}
-
-	@Override
-	public List<SysNewsTypeTree> queryByParentId(Integer parentId) {
-		if(parentId == null){
-			parentId = 0 ;
-		}
-		return sysNewsTypeDao.queryByParentId(parentId);
-	}
-	
+public class SysNewsTypeServiceImpl extends BaseServiceImpl<Integer, SysNewsType> implements SysNewsTypeService {
+    @Autowired
+    private SysNewsTypeDao sysNewsTypeDao;
+    @Autowired
+    private SysNewsInformationDao informationDao;
+
+    @Override
+    public BaseDAO<Integer, SysNewsType> getDAO() {
+        return sysNewsTypeDao;
+    }
+
+    @Override
+    public List<SysNewsTypeTree> queryTree(Integer parentId) {
+        if (parentId == null) {
+            parentId = 0;
+        }
+        List<SysNewsTypeTree> sysNewsTypeList = queryByParentId(parentId);
+        if (sysNewsTypeList != null && sysNewsTypeList.size() > 0) {
+            for (SysNewsTypeTree type : sysNewsTypeList) {
+                type.setSubTypeList(queryTree(type.getId()));
+            }
+        }
+
+        return sysNewsTypeList;
+    }
+
+    @Override
+    public List<SysNewsTypeTree> queryByParentId(Integer parentId) {
+        if (parentId == null) {
+            parentId = 0;
+        }
+        return sysNewsTypeDao.queryByParentId(parentId);
+    }
+
+    public List<SysNewsType> listWithTree(Integer id, String memo) {
+        SysNewsType newsType = sysNewsTypeDao.get(id);
+        List<SysNewsType> all = sysNewsTypeDao.findAll(null);
+
+        all.forEach(e -> {
+            List<SysNewsInformation> list = informationDao.queryBySubType(e.getId(), memo);
+            if (CollectionUtils.isNotEmpty(list)) {
+                e.setInformationList(list);
+            } else {
+                e.setInformationList(informationDao.queryBySubType(e.getId(), null));
+            }
+        });
+        List<SysNewsType> treeMenus = all.stream()
+                .filter((e) -> e.getParentId().equals(newsType.getParentId()))
+                .map((menu) -> menu.setChildren(getChildren(menu, all)))
+                .filter(e -> e.getId().equals(id))
+                .collect(Collectors.toList());
+        return treeMenus;
+    }
+
+    private List<SysNewsType> getChildren(SysNewsType rootMenu, List<SysNewsType> allMenus) {
+        List<SysNewsType> childrenList = allMenus.stream().filter(e -> e.getParentId().equals(rootMenu.getId()))
+                .map(menu -> menu.setChildren(getChildren(menu, allMenus)))
+                .collect(Collectors.toList());
+        return childrenList;
+    }
 }

+ 16 - 2
cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml

@@ -171,7 +171,8 @@
 	
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="SysNewsInformation" parameterType="map">
-		SELECT sni.*,GROUP_CONCAT(distinct s.name_) subject_name_,GROUP_CONCAT(distinct o.name_) organ_name_list_ FROM sys_news_information sni left join subject s on find_in_set(s.id_,sni.subject_id_list_)
+		SELECT sni.*,GROUP_CONCAT(distinct s.name_) subject_name_,GROUP_CONCAT(distinct o.name_) organ_name_list_
+		FROM sys_news_information sni left join subject s on find_in_set(s.id_,sni.subject_id_list_)
 		left join organization o on find_in_set(o.id_,sni.organ_id_list_)
 		<include refid="queryCondition" />
 		group by sni.id_
@@ -190,9 +191,10 @@
 		<where>
 			del_flag_=0
 			<if test="type != null">
-				and type_ = #{type}
+				and sub_type_ = #{type}
 			</if>
 		</where>
+		ORDER BY order_ DESC
 	</select>
 
     <select id="queryBottomInfo" resultMap="SysNewsInformation" parameterType="java.lang.Integer">
@@ -309,4 +311,16 @@
 		left join sys_news_type snts on sni.sub_type_ = snts.id_
 		where sni.id_ = #{id}
 	</select>
+	<select id="queryBySubType" resultMap="SysNewsInformation">
+		SELECT * FROM sys_news_information
+		WHERE del_flag_=0
+		AND status_=1
+		<if test="subType != null">
+			AND sub_type_ = #{subType}
+		</if>
+		<if test="memo != null and memo !=''">
+			AND memo_ = #{memo}
+		</if>
+		ORDER BY order_ DESC
+	</select>
 </mapper>

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

@@ -161,6 +161,16 @@ public class SysUser extends BaseEntity implements Serializable{
 	
 	private String organIdList;
 
+	private String subjectId;
+
+	public String getSubjectId() {
+		return subjectId;
+	}
+
+	public void setSubjectId(String subjectId) {
+		this.subjectId = subjectId;
+	}
+
 	public String getPositions() {
 		return positions;
 	}

+ 4 - 4
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/PhoneAuthenticationProvider.java

@@ -78,10 +78,10 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
 				throw new LockedException("用户不存在");
 			}
 			//如果机构不一致,不允许跨机构注册
-			if(loginEntity.getTenantId() != null && loginEntity.getTenantId() != 0 &&
-					!loginEntity.getTenantId().equals(user.getTenantId())){
-				throw new LockedException("用户已注册");
-			}
+//			if(loginEntity.getTenantId() != null && loginEntity.getTenantId() != 0 &&
+//					!loginEntity.getTenantId().equals(user.getTenantId())){
+//				throw new LockedException("用户已注册");
+//			}
 			if (StringUtils.isNotBlank(deviceNum)) {
 				sysUserDeviceService.bindDevice(clientId, user.getId(), deviceNum, userInfo.getSysUser().getTenantId());
 			}

+ 29 - 26
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java

@@ -1,47 +1,38 @@
 package com.ym.mec.auth.web.controller;
 
-import com.ym.mec.auth.service.TenantInfoService;
-import com.ym.mec.common.page.QueryInfo;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-
-import java.util.Date;
-
-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;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.service.SysRoleService;
 import com.ym.mec.auth.service.SysUserRoleService;
 import com.ym.mec.auth.service.SysUserService;
+import com.ym.mec.auth.service.TenantInfoService;
 import com.ym.mec.auth.web.controller.queryInfo.SysUserQueryInfo;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImResult;
 import com.ym.mec.common.entity.ImUserModel;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.security.AuthUser;
 import com.ym.mec.common.security.SecurityConstants;
 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 com.ym.mec.web.WebFeignService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+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;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
 
 @RestController()
 @RequestMapping("user")
@@ -59,8 +50,6 @@ public class UserController extends BaseController {
 	@Autowired
 	private IdGeneratorService smsCodeService;
 	@Autowired
-	private WebFeignService webFeignService;
-	@Autowired
 	private TenantInfoService tenantInfoService;
 	@Value("${message.debugMode}")
 	private boolean debugMode;
@@ -364,4 +353,18 @@ public class UserController extends BaseController {
     public Object queryClientByPhone(String phone) {
         return succeed(sysUserService.queryClientByPhone(phone));
     }
+
+	@ApiOperation(value = "用户注销")
+	@PostMapping(value = "/destroy")
+	public Object destroy() {
+		AuthUser user = SecurityUtils.getUser();
+		if (user != null) {
+			SysUser sysUser = sysUserService.get(user.getUserId());
+			sysUser.setPhone("Z" + sysUser.getPhone());
+			sysUser.setUpdateTime(new Date());
+			sysUserService.update(sysUser);
+			return succeed();
+		}
+		return failed("请登录");
+	}
 }

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/config/AdapayNotifyConstants.java

@@ -0,0 +1,13 @@
+package com.ym.mec.biz.dal.config;
+
+public class AdapayNotifyConstants {
+	
+	public static String corp_member_notify_url_test = "https://test.dayaedu.com/api-web/adapay/callback";
+
+	public static String corp_member_notify_url_prod = "https://online.dayaedu.com/api-web/adapay/callback";
+	
+	public static String student_payment_notify_url_test = "https://mstutest.dayaedu.com/api-student/studentOrder/callback";
+	
+	public static String student_payment_notify_url_prod = "https://mstuonline.dayaedu.com/api-student/studentOrder/callback";
+
+}

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.ActivityStudentDto;
+import com.ym.mec.biz.dal.dto.ExportStudentSubCourse;
 import com.ym.mec.biz.dal.entity.ActivityUserMapper;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
@@ -109,4 +110,6 @@ public interface ActivityUserMapperDao extends BaseDAO<Integer, ActivityUserMapp
     //获取学员未排课资格
     Integer getStudentNoMapperInfo(@Param("userId") Integer userId,
                                   @Param("activityId") Integer activityId);
+
+    List<ExportStudentSubCourse> exportStudentSubCourse(@Param("organId") String organId,@Param("tenantId") Integer tenantId);
 }

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

@@ -645,7 +645,7 @@ public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
      * @param type
      * @return
      */
-    List<ClassGroupTeachersDto> findClassGroupByType(@Param("musicGroupId") String musicGroupId, @Param("type") ClassGroupTypeEnum type);
+    List<ClassGroupTeachersDto> findClassGroupByType(@Param("musicGroupId") String musicGroupId, @Param("type") ClassGroupTypeEnum type,@Param("hasCourse") Boolean hasCourse);
 
     /**
      * @param groupIds:  乐团或vip课编号

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/HfMerchantConfigDao.java

@@ -0,0 +1,9 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
+
+public interface HfMerchantConfigDao extends BaseDAO<Integer, HfMerchantConfig> {
+
+	HfMerchantConfig queryByTenantId(Integer tenantId);
+}

+ 8 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupPaymentStudentCourseDetailDao.java

@@ -102,10 +102,15 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
      */
     List<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(@Param("musicGroupId") String musicGroupId);
 
+    Integer countStudentSubTotalCourseTimes(Map<String, Object> params);
+
+    List<StudentSubTotalCourseTimesDto> pageStudentSubTotalCourseTimes(Map<String, Object> params);
+
     List<MusicGroupPaymentStudentCourseDetail> findByCalenderAndUserId(@Param("calenderId") Long calenderId, @Param("userId") Integer userId);
 
     /**
      * 更新学员实际缴费金额
+     *
      * @param courseType
      * @param musicGroupPaymentCalenderIds
      * @param courseCurrentPrice
@@ -115,16 +120,16 @@ public interface MusicGroupPaymentStudentCourseDetailDao extends BaseDAO<Long, M
                             @Param("courseCurrentPrice") BigDecimal courseCurrentPrice);
 
     /**
-     * @description: 校验学员排课时长是否一致
      * @param musicGroupId
      * @param courseTypes
      * @param studentIds
      * @return void
+     * @description: 校验学员排课时长是否一致
      * @author zx
      * @date 2022/3/3 19:04
      */
     Integer checkCourseTimes(@Param("musicGroupId") String musicGroupId,
-                          @Param("courseTypes") List<CourseSchedule.CourseScheduleType> courseTypes,
-                          @Param("studentIds") List<Integer> studentIds);
+                             @Param("courseTypes") List<CourseSchedule.CourseScheduleType> courseTypes,
+                             @Param("studentIds") List<Integer> studentIds);
 
 }

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

@@ -10,6 +10,7 @@ import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public interface SellOrderDao extends BaseDAO<Integer, SellOrder> {
 
@@ -227,4 +228,6 @@ public interface SellOrderDao extends BaseDAO<Integer, SellOrder> {
 
     //统计外部销售收入总金额
     List<Map<Long, String>> sumOutOrderAmount(@Param("outOrderList") List<Long> outOrderList);
+
+    List<SellOrder> querySellOrderByOrderIds(@Param("orderIds") Set<Long> paymentOrderIds);
 }

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

@@ -422,4 +422,6 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     int countStudentBasicInfo(Map<String, Object> params);
 
     List<SysUserDto> queryStudentBasicInfo(Map<String, Object> params);
+
+    List<BaseMapDto> queryStuSubjectId(@Param("organIds") String organIds);
 }

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.StudentExercisesSituationDto;
+import com.ym.mec.biz.dal.dto.StudentServeDto;
 import com.ym.mec.biz.dal.dto.TeacherExercisesServiceDto;
 import com.ym.mec.biz.dal.dto.TeacherServeDto;
 import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
@@ -150,8 +151,16 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
                                                                          @Param("courseId") Long courseId);
 
     List<TeacherServeDto> queryTeacherServeInfo(Map<String, Object> params);
+
     int countTeacherServeInfo(Map<String, Object> params);
 
+    /**
+     * 查询学生指标
+     * @param params
+     * @return
+     */
+    List<StudentServeDto> queryStudentServeInfo(@Param("params") Map<String, Object> params);
+
     List<StudentExtracurricularExercisesSituation> findTeacherServeWithDate(@Param("monday") String monday,
                                                                             @Param("sunday") String sunday,
                                                                             @Param("teacherIds") List<Integer> teacherIds,
@@ -190,4 +199,7 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
                                                                    @Param("serveType") String serveType,
                                                                    @Param("month") Date month,
                                                                    @Param("userId") Integer userId);
+
+
+
 }

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

@@ -444,4 +444,7 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
     int getStudentMusicOrderNum(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId, @Param("orderId") Long orderId);
 
     StudentPaymentOrder getMemberIngOrder(@Param("type") OrderTypeEnum type, @Param("status") DealStatusEnum status);
+
+    //用户户购买过的活动的次数
+    int countByActivityIds(@Param("activityIds") List<String> activityIds, @Param("userId") Integer userId);
 }

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

@@ -48,6 +48,8 @@ public interface StudentPaymentRouteOrderDao extends BaseDAO<Long, StudentPaymen
 
     List<StudentPaymentOrderExportDto> ExportQueryPage(Map<String, Object> params);
 
+    List<StudentPaymentOrderExportDto> ExportQueryPage1(Map<String, Object> params);
+
     /**
      * 根据订单号删除
      *
@@ -92,4 +94,6 @@ public interface StudentPaymentRouteOrderDao extends BaseDAO<Long, StudentPaymen
     StudentPaymentRouteOrder getByOrderNo(String orderNo);
 
     FeeFlagNumDto getCountFeeFlagNum(@Param("orderNo") String orderNo);
+
+    List<FeeFlagNumDto> queryCountFeeFlagNum(@Param("orderNos") List<String> orderNos);
 }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java

@@ -529,4 +529,13 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
      *              <p>  search 模糊搜索
      */
     <T> IPage<T> getStudentsByTeacherOrgan(Page<T> page, @Param("param") Map<String, Object> param);
+
+    /**
+    * @description: 获取老师分部列表
+     * @param userId
+    * @return java.util.List<com.ym.mec.biz.dal.dto.BaseMapDto<java.lang.Integer,java.lang.String>>
+    * @author zx
+    * @date 2022/7/15 15:43
+    */
+    List<BaseMapDto<Integer, String>> queryOrganList(@Param("userId") Integer userId);
 }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseHomeworkStudentDetailDto.java

@@ -45,6 +45,9 @@ public class CourseHomeworkStudentDetailDto {
     @ApiModelProperty(value = "学生作业文件链接",required = false)
     private String attachments;
 
+    @ApiModelProperty(value = "学生作业是否过期",required = false)
+    private boolean expire;
+
     @ApiModelProperty(value = "学生作业评分",required = false)
     private Long score;
 
@@ -83,6 +86,24 @@ public class CourseHomeworkStudentDetailDto {
     
     private MusicGroupTrainPlan musicGroupTrainPlan;
 
+    private Date submitTime;
+
+    public Date getSubmitTime() {
+        return submitTime;
+    }
+
+    public void setSubmitTime(Date submitTime) {
+        this.submitTime = submitTime;
+    }
+
+    public boolean getExpire() {
+        return expire;
+    }
+
+    public void setExpire(boolean expire) {
+        this.expire = expire;
+    }
+
     public StandardEnum getStandardFlag() {
         return standardFlag;
     }

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

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.entity.PracticeGroup;
 import com.ym.mec.biz.dal.enums.SignInStatusEnum;
 import com.ym.mec.biz.dal.enums.SignOutStatusEnum;
 import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
 
@@ -57,6 +58,9 @@ public class CourseScheduleEndDto extends CourseSchedule {
     /** 合作单位 */
     private String cooperationOrgan;
 
+    @ApiModelProperty(value = "被合并的课程ids,多个,分割")
+    private String mergedCourseIds;
+
     public Date getGenerateTime() {
         return generateTime;
     }
@@ -224,4 +228,12 @@ public class CourseScheduleEndDto extends CourseSchedule {
     public void setCooperationOrgan(String cooperationOrgan) {
         this.cooperationOrgan = cooperationOrgan;
     }
+
+    public String getMergedCourseIds() {
+        return mergedCourseIds;
+    }
+
+    public void setMergedCourseIds(String mergedCourseIds) {
+        this.mergedCourseIds = mergedCourseIds;
+    }
 }

+ 88 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportStudentSubCourse.java

@@ -0,0 +1,88 @@
+package com.ym.mec.biz.dal.dto;
+
+public class ExportStudentSubCourse {
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 用户名称
+     */
+    private String username;
+    /**
+     * 分部名称
+     */
+    private String organizationName;
+    /**
+     * 活动id
+     */
+    private Integer activityId;
+    /**
+     * 活动名称
+     */
+    private String activityName;
+    /**
+     * 剩余排课资格
+     */
+    private Integer subCourseNum;
+    /**
+     * 剩余赠送排课资格
+     */
+    private Integer subGiveCourseNum;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public Integer getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Integer activityId) {
+        this.activityId = activityId;
+    }
+
+    public String getOrganizationName() {
+        return organizationName;
+    }
+
+    public void setOrganizationName(String organizationName) {
+        this.organizationName = organizationName;
+    }
+
+    public String getActivityName() {
+        return activityName;
+    }
+
+    public void setActivityName(String activityName) {
+        this.activityName = activityName;
+    }
+
+    public Integer getSubCourseNum() {
+        return subCourseNum;
+    }
+
+    public void setSubCourseNum(Integer subCourseNum) {
+        this.subCourseNum = subCourseNum;
+    }
+
+    public Integer getSubGiveCourseNum() {
+        return subGiveCourseNum;
+    }
+
+    public void setSubGiveCourseNum(Integer subGiveCourseNum) {
+        this.subGiveCourseNum = subGiveCourseNum;
+    }
+}

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/FeeFlagNumDto.java

@@ -3,6 +3,15 @@ package com.ym.mec.biz.dal.dto;
 public class FeeFlagNumDto {
     private Integer totalNum;
     private Integer yesNum;
+    private String orderNo;
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
 
     public Integer getTotalNum() {
         return totalNum;

+ 110 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PaymentParam.java

@@ -0,0 +1,110 @@
+package com.ym.mec.biz.dal.dto;
+
+import java.math.BigDecimal;
+
+public class PaymentParam {
+    private BigDecimal amount;
+    private String orderNo;
+    private String payChannel;
+    private String returnUrl;
+    private String orderSubject;
+    private String orderBody;
+    private String sign;
+    private String code;
+    private String platform;
+    private Integer tenantId;
+    
+    private String notifyUrl;
+    
+
+    public PaymentParam() {
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getPayChannel() {
+        return payChannel;
+    }
+
+    public void setPayChannel(String payChannel) {
+        this.payChannel = payChannel;
+    }
+
+    public String getReturnUrl() {
+        return returnUrl;
+    }
+
+    public void setReturnUrl(String returnUrl) {
+        this.returnUrl = returnUrl;
+    }
+
+    public String getOrderSubject() {
+        return orderSubject;
+    }
+
+    public void setOrderSubject(String orderSubject) {
+        this.orderSubject = orderSubject;
+    }
+
+    public String getOrderBody() {
+        return orderBody;
+    }
+
+    public void setOrderBody(String orderBody) {
+        this.orderBody = orderBody;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getPlatform() {
+        return platform;
+    }
+
+    public void setPlatform(String platform) {
+        this.platform = platform;
+    }
+
+    public Integer getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(Integer tenantId) {
+        this.tenantId = tenantId;
+    }
+
+	public String getNotifyUrl() {
+		return notifyUrl;
+	}
+
+	public void setNotifyUrl(String notifyUrl) {
+		this.notifyUrl = notifyUrl;
+	}
+}

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

@@ -21,6 +21,9 @@ public class StudentManageListDto {
     @ApiModelProperty(value = "用户名",required = false)
     private String realName;
 
+    @ApiModelProperty(value = "用户头像",required = false)
+    private String avatar;
+
     @ApiModelProperty(value = "用户名",required = false)
     private String username;
 
@@ -121,7 +124,15 @@ public class StudentManageListDto {
     private Integer recordUserId;
 	
 	private String extSubjectIds;
-	
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
     public Integer getRecordUserId() {
         return recordUserId;
     }

+ 86 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentServeDto.java

@@ -4,6 +4,8 @@ import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.TeachModeEnum;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Date;
 
 /**
@@ -18,6 +20,22 @@ public class StudentServeDto extends Student {
 
     private Date courseStartTime;
 
+    private String musicGroupName;
+
+    private String servePeriod;
+
+    private String serveNum;
+
+    private Integer actualExercisesNum;
+
+    private Integer exercisesReplyNum;
+
+    private Integer exercisesMessageNum;
+
+    private BigDecimal signRate;
+
+    private BigDecimal passRate;
+
     public GroupType getGroupType() {
         return groupType;
     }
@@ -41,4 +59,72 @@ public class StudentServeDto extends Student {
     public void setCourseStartTime(Date courseStartTime) {
         this.courseStartTime = courseStartTime;
     }
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
+    public String getServePeriod() {
+        return servePeriod;
+    }
+
+    public void setServePeriod(String servePeriod) {
+        this.servePeriod = servePeriod;
+    }
+
+    public String getServeNum() {
+        return serveNum;
+    }
+
+    public void setServeNum(String serveNum) {
+        this.serveNum = serveNum;
+    }
+
+    public Integer getActualExercisesNum() {
+        return actualExercisesNum;
+    }
+
+    public void setActualExercisesNum(Integer actualExercisesNum) {
+        this.actualExercisesNum = actualExercisesNum;
+    }
+
+    public Integer getExercisesReplyNum() {
+        return exercisesReplyNum;
+    }
+
+    public void setExercisesReplyNum(Integer exercisesReplyNum) {
+        this.exercisesReplyNum = exercisesReplyNum;
+    }
+
+    public Integer getExercisesMessageNum() {
+        return exercisesMessageNum;
+    }
+
+    public void setExercisesMessageNum(Integer exercisesMessageNum) {
+        this.exercisesMessageNum = exercisesMessageNum;
+    }
+
+    public BigDecimal getSignRate() {
+        return signRate;
+    }
+
+    public void setSignRate(BigDecimal signRate) {
+        if (null != signRate) {
+            this.signRate = signRate.setScale(2, RoundingMode.HALF_UP);
+        }
+    }
+
+    public BigDecimal getPassRate() {
+        return passRate;
+    }
+
+    public void setPassRate(BigDecimal passRate) {
+        if (null != passRate) {
+            this.passRate = passRate.setScale(2, RoundingMode.HALF_UP);
+        }
+    }
 }

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

@@ -11,6 +11,8 @@ public class StudentSubTotalCourseTimesDto{
 
     private String classGroupId;
 
+    private String courseType;
+
     private List<MapDto> MapDtos;
 
     public String getClassGroupId() {
@@ -52,4 +54,12 @@ public class StudentSubTotalCourseTimesDto{
     public void setMapDtos(List<MapDto> mapDtos) {
         MapDtos = mapDtos;
     }
+
+    public String getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(String courseType) {
+        this.courseType = courseType;
+    }
 }

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

@@ -67,6 +67,7 @@ public class CourseSchedule  extends BaseEntity{
 	/**  */
 	private Long id;
 
+	@ApiModelProperty(value = "合并|被合并课程编号(未合并为空,合并后主记录为自己,被合并课程记录合并课程id)")
 	private Long newCourseId;
 
 	private GroupType groupType;

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

@@ -58,6 +58,12 @@ public class HfMember extends BaseEntity {
 
     @ApiModelProperty(value = "邮编",required = true)
     private String zipCode;
+    
+    @ApiModelProperty(value = "银行账户类型:1-对公;2-对私,如果需要自动开结算账户,本字段必填",required = true)
+    private String bankAcctType;
+
+    @ApiModelProperty(value = "银行卡对应的户名,如果需要自动开结算账户,本字段必填;若银行账户类型是对公,必须与企业名称一致",required = true)
+	private String cardName;
 
     @ApiModelProperty(value = "银行卡号",required = true)
     private String cardNo;
@@ -298,4 +304,20 @@ public class HfMember extends BaseEntity {
 	public void setOrganId(Integer organId) {
 		this.organId = organId;
 	}
+
+	public String getBankAcctType() {
+		return bankAcctType;
+	}
+
+	public void setBankAcctType(String bankAcctType) {
+		this.bankAcctType = bankAcctType;
+	}
+
+	public String getCardName() {
+		return cardName;
+	}
+
+	public void setCardName(String cardName) {
+		this.cardName = cardName;
+	}
 }

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/QuestionnaireTopic.java

@@ -48,6 +48,28 @@ public class QuestionnaireTopic extends BaseEntity {
 
 	private Boolean modifyFlag = true;
 
+	//分享标题
+	private String shareTitle;
+
+	//分享标题
+	private String shareDescribe;
+
+	public String getShareTitle() {
+		return shareTitle;
+	}
+
+	public void setShareTitle(String shareTitle) {
+		this.shareTitle = shareTitle;
+	}
+
+	public String getShareDescribe() {
+		return shareDescribe;
+	}
+
+	public void setShareDescribe(String shareDescribe) {
+		this.shareDescribe = shareDescribe;
+	}
+
 	public Boolean getModifyFlag() {
 		return modifyFlag;
 	}

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

@@ -91,7 +91,7 @@ public class StudentRegistration extends BaseEntity {
     @ApiModelProperty(value = "生日", required = false)
     private Date birthdate;
 
-    @ApiModelProperty(value = "缴费状态(1-已缴费 0-未交费)", required = false)
+    @ApiModelProperty(value = "缴费状态(2-已缴费 1-开启缴费 0-未交费)", required = false)
     private PaymentStatusEnum paymentStatus;
 
     @ApiModelProperty(value = "用户所在乐团状态)",required = false)

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

@@ -75,6 +75,17 @@ public class SysMusicCompareRecord extends BaseEntity {
 	
 	private String partIndex;
 
+	//文件是否过期
+	private boolean expire;
+
+	public boolean getExpire() {
+		return expire;
+	}
+
+	public void setExpire(boolean expire) {
+		this.expire = expire;
+	}
+
 	public SysMusicCompareRecord() {
 	}
 

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

@@ -50,6 +50,8 @@ public class SysMusicScore {
 	
 	/** 类型PERSON 个人,COMMON公用 */
 	private ExamSongTypeEnum type;
+
+	private String typeName;
 	
 	/** 声部列表 */
 	private String subjectIds;
@@ -105,9 +107,12 @@ public class SysMusicScore {
 
 	//是否显示
 	private Integer showFlag = 0;
+	private String showName;
 
 	private Boolean isOpenMetronome;
-	
+
+	private String openMetronomeName;
+
 	private String museScoreUrl;
 	
 	private String museScoreMemo;
@@ -124,6 +129,30 @@ public class SysMusicScore {
 		this.extConfigJson = extConfigJson;
 	}
 
+	public String getTypeName() {
+		return typeName;
+	}
+
+	public void setTypeName(String typeName) {
+		this.typeName = typeName;
+	}
+
+	public String getOpenMetronomeName() {
+		return openMetronomeName;
+	}
+
+	public String getShowName() {
+		return showName;
+	}
+
+	public void setShowName(String showName) {
+		this.showName = showName;
+	}
+
+	public void setOpenMetronomeName(String openMetronomeName) {
+		this.openMetronomeName = openMetronomeName;
+	}
+
 	public Integer getSubjectId() {
 		return subjectId;
 	}

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

@@ -3,7 +3,7 @@ package com.ym.mec.biz.dal.enums;
 import com.ym.mec.common.enums.BaseEnum;
 
 public enum ExamSongTypeEnum implements BaseEnum<String, ExamSongTypeEnum> {
-	PERSON("PERSON", "个人"), COMMON("COMMON", "公");
+	PERSON("PERSON", "个人"), COMMON("COMMON", "公");
 
 	private String code;
 

+ 4 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java

@@ -70,11 +70,13 @@ public enum ExportEnum implements BaseEnum<String, ExportEnum> {
     MUSIC_ENLIGHTENMENT_QUESTIONNAIRES("MUSIC_ENLIGHTENMENT_QUESTIONNAIRES", "启蒙课问卷导出"),
     STUDENT_INSTRUMENT("STUDENT_INSTRUMENT", "乐保导出"),
     EXPORT_BILL("EXPORT_BILL", "对账单导出"),
-//    QUESTIONNAIRE_USER_RESULT("QUESTIONNAIRE_USER_RESULT", "问卷调查导出"),
     STUDENT_VIP_COURSE_INFO("STUDENT_VIP_COURSE_INFO", "VIP课学员课程信息导出"),
     STUDENT_MUSIC_THEORY_COURSE_INFO("STUDENT_MUSIC_THEORY_COURSE_INFO", "乐理课学员课程信息导出"),
     VIP_STUDENT_COURSE_MANAGE("VIP_STUDENT_COURSE_MANAGE", "vip学员课程管理"),
-    EXERCISES_SITUATION("EXERCISES_SITUATION", "服务指标导出");
+    EXERCISES_SITUATION("EXERCISES_SITUATION", "服务指标导出"),
+    EXPORT_STUDENT_SUBCOURSE("EXPORT_STUDENT_SUBCOURSE", "活动资格导出"),
+    EXPORT_STUDENT_SERVE_INFO("EXPORT_STUDENT_SERVE_INFO", "乐团学生服务指标导出"),
+    ;
 
     private String code;
 

+ 4 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java

@@ -13,7 +13,10 @@ public enum ExportTypeEnum implements BaseEnum<Integer, ExportTypeEnum> {
 	STUDENT_SMALL_CLASS_STATISTICS(7, "学员小课数据统计"),
 	ORDER_LIST_SUM(8, "订单汇总"),
 	MUSIC_GROUP_COURSE_LIST(9, "乐团课表详情导出"),
-	MUSIC_GROUP_DATA_EXPORT(10, "乐团数据导出");
+	MUSIC_GROUP_DATA_EXPORT(10, "乐团数据导出"),
+	EXPORT_STUDENT_SUBCOURSE(11, "活动资格导出"),
+	EXPORT_STUDENT_SERVE_INFO(12, "乐团学生服务指标导出");
+	;
 
 	private Integer code;
 

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

@@ -57,6 +57,12 @@ public class StudentStatisticsQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "第一次课截止时间(年月日)",required = false)
     private String firstCourseEndTime;
 
+    @ApiModelProperty(value = "最近一次回访开始时间(年月日)",required = false)
+    private String lastVisitStartTime;
+
+    @ApiModelProperty(value = "最近一次回访截止时间(年月日)",required = false)
+    private String lastVisitEndTime;
+
     @ApiModelProperty(value = "分部编号列表",required = false)
     private String organId;
 
@@ -188,6 +194,22 @@ public class StudentStatisticsQueryInfo extends QueryInfo {
         this.firstCourseStartTime = firstCourseStartTime;
     }
 
+    public String getLastVisitStartTime() {
+        return lastVisitStartTime;
+    }
+
+    public void setLastVisitStartTime(String lastVisitStartTime) {
+        this.lastVisitStartTime = lastVisitStartTime;
+    }
+
+    public String getLastVisitEndTime() {
+        return lastVisitEndTime;
+    }
+
+    public void setLastVisitEndTime(String lastVisitEndTime) {
+        this.lastVisitEndTime = lastVisitEndTime;
+    }
+
     public String getFirstCourseEndTime() {
         return firstCourseEndTime;
     }

+ 47 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentSubTotalCourseTimesQueryInfo.java

@@ -0,0 +1,47 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+public class StudentSubTotalCourseTimesQueryInfo extends QueryInfo {
+    @ApiModelProperty(value = "乐团id")
+    private String musicGroupId;
+    @ApiModelProperty(value = "是否存在剩余时长")
+    private Boolean hastimer;
+    @ApiModelProperty(value = "班级类型")
+    private String courseType;
+    @ApiModelProperty(value = "班级id")
+    private String classGroupId;
+
+    public String getMusicGroupId() {
+        return musicGroupId;
+    }
+
+    public void setMusicGroupId(String musicGroupId) {
+        this.musicGroupId = musicGroupId;
+    }
+
+    public Boolean getHastimer() {
+        return hastimer;
+    }
+
+    public void setHastimer(Boolean hastimer) {
+        this.hastimer = hastimer;
+    }
+
+    public String getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(String courseType) {
+        this.courseType = courseType;
+    }
+
+    public String getClassGroupId() {
+        return classGroupId;
+    }
+
+    public void setClassGroupId(String classGroupId) {
+        this.classGroupId = classGroupId;
+    }
+}

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

@@ -1,9 +1,6 @@
 package com.ym.mec.biz.service;
 
-import com.ym.mec.biz.dal.dto.ActivityQueryDto;
-import com.ym.mec.biz.dal.dto.ActivityStudentAdjustDto;
-import com.ym.mec.biz.dal.dto.ActivityStudentDto;
-import com.ym.mec.biz.dal.dto.ActivityUserMapperAddDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.ActivityUserMapper;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
@@ -121,4 +118,10 @@ public interface ActivityUserMapperService extends BaseService<Integer, Activity
     Map<String,Object> getStudentNoMapperInfo();
 
     Integer getStudentNoCourseNum(Integer userId, Integer activityId);
+
+    /**
+     * 报表中心-活动资格导出
+     * @return
+     */
+    List<ExportStudentSubCourse> exportStudentSubCourse(String organId, Integer tenantId);
 }

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

@@ -380,7 +380,7 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @param type
      * @return
      */
-    List<ClassGroupTeachersDto> getClassGroupAndTeacherByType(String musicGroupId, ClassGroupTypeEnum type);
+    List<ClassGroupTeachersDto> getClassGroupAndTeacherByType(String musicGroupId, ClassGroupTypeEnum type,Boolean hasCourse);
 
     /**
      * 根据乐团id,班级类型获取班级和老师

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java

@@ -266,6 +266,9 @@ public interface ExportService {
     //vip学员课程管理
     HttpResponseResult exportVipStudentCourseManage(Map<String, Object> info, List<String> headColumns) throws Exception;
 
+    //导出活动资格
+    HttpResponseResult exportStudentSubCourse(Map<String, Object> info, List<String> headColumns);
+
     //学员小课记录导出
     HttpResponseResult exportStudentMusicTheoryCourseInfo(Map<String, Object> info, List<String> headColumns);
 

+ 14 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/HfMemberService.java

@@ -1,16 +1,24 @@
 package com.ym.mec.biz.service;
 
+import java.io.File;
+
 import com.ym.mec.biz.dal.entity.HfMember;
 import com.ym.mec.common.service.BaseService;
-
-import java.io.File;
-import java.util.Map;
+import com.ym.mec.thirdparty.adapay.entity.AccountInfo;
 
 public interface HfMemberService extends BaseService<Integer, HfMember> {
+	
+	/**
+     * 根据商户号获取商户信息
+     *
+     * @param memberId
+     * @return
+     */
+    HfMember getByMemberId(String memberId);
 
-    Map<String,Object> createMember(HfMember member, File file) throws Exception;
+    boolean createMember(HfMember member, File file) throws Exception;
 
-    Map<String,Object> updateMember(HfMember member, File file) throws Exception;
+    boolean updateMember(HfMember member, File file) throws Exception;
 
-    Map<String,Object> createSettleAccount(String memberId, String cardNo, String bankCode) throws Exception;
+    boolean mergeSettleAccount(String memberId, AccountInfo accountInfo) throws Exception;
 }

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

@@ -0,0 +1,9 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.common.service.BaseService;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
+
+public interface HfMerchantConfigService extends BaseService<Integer, HfMerchantConfig> {
+
+	HfMerchantConfig queryByTenantId(Integer tenantId);
+}

+ 0 - 281
mec-biz/src/main/java/com/ym/mec/biz/service/NotifyCallback.java

@@ -1,281 +0,0 @@
-package com.ym.mec.biz.service;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.huifu.adapay.Adapay;
-import com.huifu.adapay.notify.MQTTCallbackHandler;
-import com.ym.mec.biz.dal.dao.HfMemberDao;
-import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.entity.HfMember;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
-import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
-import com.ym.mec.biz.dal.enums.DealStatusEnum;
-import com.ym.mec.thirdparty.adapay.ConfigInit;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.PostConstruct;
-import java.math.BigDecimal;
-import java.util.HashMap;
-import java.util.Map;
-
-
-@Service
-public class NotifyCallback implements MQTTCallbackHandler {
-
-    @Autowired
-    private StudentPaymentOrderService studentPaymentOrderService;
-    @Autowired
-    private TenantPaymentOrderService tenantPaymentOrderService;
-    @Autowired
-    private HfMemberDao hfMemberDao;
-
-    private static NotifyCallback notifyCallback;
-
-    @Value("${spring.profiles.active:dev}")
-    private String profiles;
-
-    @Value("${spring.application.name}")
-    private String appName;
-
-    @PostConstruct
-    public void init() {
-        notifyCallback = this;
-//        if (!profiles.equals("prod") && !appName.equals("student-server")) {
-//            Adapay.debug = true;
-//            // prodMode 模式,默认为生产模式,false可以使用mock模式
-//            Adapay.prodMode = false;
-//        }
-        Adapay.setDeviceID(appName);
-    }
-
-    /**
-     * 用户接收并处理支付成功的异步消息
-     *
-     * @param payment 成功的支付对象
-     * @throws Exception 异常
-     */
-    @Override
-    public void paymentSuccessMessageArrived(String payment) throws Exception {
-        System.out.println(String.format("receive paymentSuccess  msg=%s", payment));
-        JSONObject dataObj = JSON.parseObject(payment);
-        if (!dataObj.getString("app_id").equals(ConfigInit.appId)) {
-            return;
-        }
-        String orderNo = dataObj.getString("order_no");
-        StudentPaymentOrder studentPaymentOrder = notifyCallback.studentPaymentOrderService.findOrderByOrderNo(orderNo);
-
-        if (studentPaymentOrder != null) {
-            Map<String, String> notifyMap = new HashMap<>();
-            notifyMap.put("channelType", dataObj.getString("pay_channel"));
-            notifyMap.put("tradeState", "1");
-            notifyMap.put("totalMoney", dataObj.getString("pay_amt"));
-            notifyMap.put("merOrderNo", dataObj.getString("order_no"));
-            notifyCallback.studentPaymentOrderService.updateOrder(notifyMap);
-            return;
-        }
-        TenantPaymentOrder tenantPaymentOrder = notifyCallback.tenantPaymentOrderService.queryByOrderNo(orderNo);
-        if (tenantPaymentOrder != null) {
-            tenantPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
-            tenantPaymentOrder.setPaymentBusinessChannel(dataObj.getString("pay_channel"));
-            tenantPaymentOrder.setActualAmount(new BigDecimal(dataObj.getString("pay_amt")));
-            notifyCallback.tenantPaymentOrderService.paymentForCallback(tenantPaymentOrder);
-        }
-    }
-
-    /**
-     * 用户接收并处理支付失败的异步消息
-     *
-     * @param payment 失败的支付对象
-     * @throws Exception 异常
-     */
-    @Override
-    public void paymentFailedMessageArrived(String payment) throws Exception {
-        System.out.println(String.format("receive paymentFailed msg=%s", payment));
-
-        JSONObject dataObj = JSON.parseObject(payment);
-        if (!dataObj.getString("app_id").equals(ConfigInit.appId)) {
-            return;
-        }
-
-        String orderNo = dataObj.getString("order_no");
-        StudentPaymentOrder studentPaymentOrder = notifyCallback.studentPaymentOrderService.findOrderByOrderNo(orderNo);
-
-        if (studentPaymentOrder != null) {
-            Map<String, String> notifyMap = new HashMap<>();
-            notifyMap.put("channelType", dataObj.getString("pay_channel"));
-            notifyMap.put("tradeState", "0");
-            notifyMap.put("totalMoney", dataObj.getString("pay_amt"));
-            notifyMap.put("merOrderNo", dataObj.getString("order_no"));
-            notifyMap.put("remarks", dataObj.getString("error_msg"));
-            notifyCallback.studentPaymentOrderService.updateOrder(notifyMap);
-            return;
-        }
-        TenantPaymentOrder tenantPaymentOrder = notifyCallback.tenantPaymentOrderService.queryByOrderNo(orderNo);
-        if (tenantPaymentOrder != null) {
-            tenantPaymentOrder.setStatus(DealStatusEnum.FAILED);
-            tenantPaymentOrder.setPaymentBusinessChannel(dataObj.getString("pay_channel"));
-            notifyCallback.tenantPaymentOrderService.paymentForCallback(tenantPaymentOrder);
-        }
-    }
-
-
-    /**
-     * 用户接收并处理关闭支付交易成功的异步消息
-     *
-     * @param payment 关闭成功的支付对象
-     * @throws Exception 异常
-     */
-    @Override
-    public void paymentCloseSuccessMessageArrived(String payment) throws Exception {
-        System.out.println(String.format("receive paymentCloseSuccess msg=%s", payment));
-        JSONObject dataObj = JSON.parseObject(payment);
-        if (!dataObj.getString("app_id").equals(ConfigInit.appId)) {
-            return;
-        }
-        String orderNo = dataObj.getString("order_no");
-        StudentPaymentOrder studentPaymentOrder = notifyCallback.studentPaymentOrderService.findOrderByOrderNo(orderNo);
-
-        if (studentPaymentOrder != null) {
-            Map<String, String> notifyMap = new HashMap<>();
-            notifyMap.put("channelType", dataObj.getString("pay_channel"));
-            notifyMap.put("tradeState", "0");
-            notifyMap.put("totalMoney", dataObj.getString("pay_amt"));
-            notifyMap.put("merOrderNo", dataObj.getString("order_no"));
-            notifyMap.put("remarks", dataObj.getString("error_msg"));
-            notifyCallback.studentPaymentOrderService.updateOrder(notifyMap);
-            return;
-        }
-        TenantPaymentOrder tenantPaymentOrder = notifyCallback.tenantPaymentOrderService.queryByOrderNo(orderNo);
-        if (tenantPaymentOrder != null) {
-            tenantPaymentOrder.setStatus(DealStatusEnum.FAILED);
-            tenantPaymentOrder.setPaymentBusinessChannel(dataObj.getString("pay_channel"));
-            tenantPaymentOrderService.paymentForCallback(tenantPaymentOrder);
-        }
-    }
-
-    /**
-     * 用户接收并处理关闭支付交易失败的异步消息
-     *
-     * @param payment 关闭失败的支付对象
-     * @throws Exception 异常
-     */
-    @Override
-    public void paymentCloseFailedMessageArrived(String payment) throws Exception {
-        System.out.println(String.format("receive paymentCloseFailed msg=%s", payment));
-    }
-
-    @Override
-    public void paymentReverseFailedMessageArrived(String payment) throws Exception {
-
-        System.out.println(String.format("receive payment ReverseFailed msg=%s", payment));
-    }
-
-    @Override
-    public void paymentReverseSuccessMessageArrived(String payment) throws Exception {
-        System.out.println(String.format("receive payment ReverseSuccess msg=%s", payment));
-    }
-
-    /**
-     * 用户接收并处理退款成功的异步消息
-     *
-     * @param refund 成功的退款对象
-     * @throws Exception 异常
-     */
-    @Override
-    public void refundSuccessMessageArrived(String refund) throws Exception {
-        System.out.println(String.format("receive refundSuccess msg=%s", refund));
-    }
-
-    /**
-     * 用户接收并处理退款失败的异步消息
-     *
-     * @param refund 失败的退款对象
-     * @throws Exception 异常
-     */
-    @Override
-    public void refundFailedMessageArrived(String refund) throws Exception {
-        System.out.println(String.format("receive refundFailed   msg=%s", refund));
-    }
-
-    @Override
-    public void corpMemberSuccessMessageArrived(String corpMember) throws Exception {
-        System.out.println(String.format("receive corpMember   msg=%s", corpMember));
-        JSONObject corpMemberObj = JSON.parseObject(corpMember);
-        if (!corpMemberObj.getString("app_id").equals(ConfigInit.appId)) {
-            return;
-        }
-        String memberId = corpMemberObj.getString("member_id");
-        HfMember hfMember = notifyCallback.hfMemberDao.getByMemberId(memberId);
-        if (hfMember == null || !hfMember.getStatus().equals("pending")) {
-            return;
-        }
-        hfMember.setStatus("succeeded");
-        hfMember.setMemo(corpMemberObj.getString("audit_desc"));
-        if (corpMemberObj.containsKey("audit_state") && corpMemberObj.getString("audit_state").equals("E")) {
-            JSONObject accounts = JSON.parseObject(corpMemberObj.getString("settle_accounts"));
-            hfMember.setSettleAccountId(accounts.getString("id"));
-        }
-        notifyCallback.hfMemberDao.update(hfMember);
-    }
-
-    @Override
-    public void corpMemberFailedMessageArrived(String corpMember) throws Exception {
-        System.out.println(String.format("receive corpMember  msg=%s", corpMember));
-        JSONObject corpMemberObj = JSON.parseObject(corpMember);
-        if (!corpMemberObj.getString("app_id").equals(ConfigInit.appId)) {
-            return;
-        }
-        String memberId = corpMemberObj.getString("member_id");
-        HfMember hfMember = notifyCallback.hfMemberDao.getByMemberId(memberId);
-        if (hfMember == null || !hfMember.getStatus().equals("pending")) {
-            return;
-        }
-        hfMember.setStatus("failed");
-        hfMember.setMemo(corpMemberObj.getString("audit_desc"));
-        notifyCallback.hfMemberDao.update(hfMember);
-    }
-
-    @Override
-    public void unknowMessageArrived(String message) throws Exception {
-        System.out.println(String.format("receive unknow  msg=%s", message));
-    }
-
-    @Override
-    public void drawCashFailedMessageArrived(String drawCash) throws Exception {
-        System.out.println(String.format("receive unknow  msg=%s", drawCash));
-
-    }
-
-    @Override
-    public void drawCashSuccessedMessageArrived(String drawCash) throws Exception {
-
-        System.out.println(String.format("receive unknow  msg=%s", drawCash));
-
-    }
-
-    @Override
-    public void pagePaymentFailedMessageArrived(String arg0) throws Exception {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void pagePaymentSuccessedMessageArrived(String arg0) throws Exception {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void connectionLost(String message) throws Exception {
-        // TODO Auto-generated method stub
-        System.out.println("mqtt...........lost.............");
-
-    }
-
-    @Override
-    public void connectSuccess() throws Exception {
-        System.out.println("mqtt...........connect.............");
-    }
-}

+ 3 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/OrderPayOpsService.java

@@ -1,9 +1,10 @@
 package com.ym.mec.biz.service;
 
-import java.math.BigDecimal;
 import java.util.Map;
 
+import com.ym.mec.biz.dal.dto.PaymentParam;
+
 public interface OrderPayOpsService {
 
-    Map<String, Object> executePayment(BigDecimal amount, String orderNo, String payChannel, String returnUrl, String orderSubject, String orderBody, String sign, String code, String platform) throws Exception;
+    Map<String, Object> executePayment(PaymentParam paymentParam) throws Exception;
 }

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

@@ -40,6 +40,6 @@ public interface PayService {
 	 * @return
 	 * @throws Exception
 	 */
-	Map<String, Object> getPayToPlatformMap(PaymentChannelEnum paymentChannel, BigDecimal amount, BigDecimal balanceAmount, String orderNo,
+	Map<String, Object> getPayToPlatformMap(Integer tenantId, PaymentChannelEnum paymentChannel, BigDecimal amount, BigDecimal balanceAmount, String orderNo,
 			String notifyUrl, String returnUrl, String orderSubject, String orderBody) throws Exception;
 }

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

@@ -397,4 +397,6 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
 
 	//学生端网管课活动排课
 	HttpResponseResult studentCreateActivityPracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams);
+
+	void checkActivity();
 }

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

@@ -203,11 +203,12 @@ public interface StudentManageService {
      */
     PageInfo<StudentNoStartCoursesDto> queryStudentNoStartCourse(StudentQueryInfo queryInfo);
 
+    Integer countStudentSubTotalCourseTimes(StudentSubTotalCourseTimesQueryInfo queryInfo);
     /**
      * 乐团管理--乐团详情--学员列表--获取学员可排课时长
      * @return
      */
-    List<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(String musicGroupId);
+    PageInfo<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(StudentSubTotalCourseTimesQueryInfo queryInfo);
 
     PageInfo<StudentErrorLeaveDto> queryStudentErrorLeaveList(StudentErrorLeaveQueryInfo queryInfo);
 
@@ -220,4 +221,5 @@ public interface StudentManageService {
     void updateChildrenDayStudent(ActivityCourseDetailDto activityCourseDetailDto);
 
     PageInfo<Student> queryStudent(StudentActivityQueryInfo queryInfo);
+
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
 import com.ym.mec.biz.dal.dto.MusicalListDetailDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
@@ -11,6 +12,8 @@ import java.util.List;
 
 public interface StudentPaymentOrderDetailService extends BaseService<Long, StudentPaymentOrderDetail> {
 
+    StudentPaymentOrderDetailDao getDao();
+
 
     /**
      * 批量添加订单

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

@@ -162,7 +162,7 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 
     int batchUpdate(List<StudentPaymentOrder> studentPaymentOrderList);
 
-    PayStatus queryPayStatus(String paymentChannel, String orderNo, String transNo) throws Exception;
+    PayStatus queryPayStatus(StudentPaymentOrder studentPaymentOrder) throws Exception;
 
     /**
      * 获取购买了乐器的报名订单

+ 18 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java

@@ -7,15 +7,12 @@ import java.util.Map;
 
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.BaseStudentDto;
-import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
-import com.ym.mec.biz.dal.entity.CooperationOrgan;
-import com.ym.mec.biz.dal.entity.Student;
-import com.ym.mec.biz.dal.entity.StudentPreRegistration;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
 public interface StudentService extends BaseService<Integer, Student> {
@@ -167,4 +164,20 @@ public interface StudentService extends BaseService<Integer, Student> {
     <T extends BaseStudentDto> SysUser upSetStudent(T student);
 
     PageInfo<SysUserDto> queryStudentBasicInfo(UserBasicQueryInfo queryInfo);
+
+    /**
+     * 获取和当前指导老师关联的学员
+     *
+     * @return
+     */
+    PageInfo<BasicUserDto> queryStudent(QueryInfo queryInfo);
+
+    /**
+    * @description: 获取分部学员声部列表
+     * @param organIds
+    * @return java.util.List<com.ym.mec.biz.dal.entity.Subject>
+    * @author zx
+    * @date 2022/7/19 15:21
+    */
+    List<BaseMapDto> queryStuSubjectId(String organIds);
 }

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicScoreService.java

@@ -8,6 +8,8 @@ import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
+import java.util.List;
+
 public interface SysMusicScoreService extends BaseService<Integer, SysMusicScore> {
 
     void updateMusicScore(MusicScoreDto musicScoreDto);
@@ -16,6 +18,8 @@ public interface SysMusicScoreService extends BaseService<Integer, SysMusicScore
 
     void del(Integer id);
 
+    List<SysMusicScore> queryMusicScoreAll(SysExamSongQueryInfo queryInfo);
+
     PageInfo<SysMusicScore> queryMusicScorePage(SysExamSongQueryInfo queryInfo);
     
     PageInfo<SysMusicScore> queryMusicScorePageInfo(SysExamSongQueryInfo queryInfo);

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

@@ -251,4 +251,13 @@ public interface TeacherService extends BaseService<Integer, Teacher> {
      *              <p> -rows 每页数量
      */
     PageInfo<BasicUserDto> getStudentsByTeacherOrgan(Map<String, Object> param);
+
+    /**
+    * @description: 获取老师分部列表
+     * @param
+    * @return java.lang.Object
+    * @author zx
+    * @date 2022/7/15 15:31
+    */
+    List<BaseMapDto<Integer,String>> queryOrganList(Integer userId);
 }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantOrderRecordService.java

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.dto.TenantOrderRecordDto;
 import com.ym.mec.biz.dal.entity.TenantOrderRecord;
 import com.ym.mec.common.page.PageInfo;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 /**
@@ -32,5 +33,7 @@ public interface TenantOrderRecordService extends IService<TenantOrderRecord> {
 
     void rechargeSuccess(TenantOrderRecord record);
 
+    String callback(HttpServletRequest request);
+
 }
 

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

@@ -17,18 +17,6 @@ public interface TenantPaymentOrderService extends BaseService<Long, TenantPayme
 	public HttpResponseResult createOrder(Integer userId, Integer activitiesId, boolean isContinuePay);
 
 	/**
-	 * 回调
-	 * @param tenantPaymentOrder
-	 * @return
-	 */
-	public boolean paymentForCallback(TenantPaymentOrder tenantPaymentOrder);
-
-	/**
-	 * 从第三方查询订单状态
-	 */
-	public void queryOrderStatusFromRemote();
-
-	/**
 	 * 订单查询
 	 * @param orderNo
 	 * @return
@@ -37,6 +25,4 @@ public interface TenantPaymentOrderService extends BaseService<Long, TenantPayme
 
 	Object queryTenanPaymentPage(TenantPaymentOrderQueryInfo queryInfo);
 
-
-	Boolean confirmOrder(TenantPaymentOrder order);
 }

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

@@ -1,7 +1,12 @@
 package com.ym.mec.biz.service;
 
-import java.io.*;
-
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.ym.mec.thirdparty.entity.UploadSign;
+import com.ym.mec.common.entity.UploadReturnBean;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.thirdparty.storage.StoragePluginContext;
+import com.ym.mec.thirdparty.storage.provider.KS3StoragePlugin;
+import com.ym.mec.util.upload.UploadUtil;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -10,12 +15,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
-import com.ym.mec.common.entity.UploadReturnBean;
-import com.ym.mec.common.exception.BizException;
-import com.ym.mec.thirdparty.storage.StoragePluginContext;
-import com.ym.mec.thirdparty.storage.provider.KS3StoragePlugin;
-import com.ym.mec.util.upload.UploadUtil;
-import org.springframework.web.multipart.MultipartFile;
+import java.io.*;
 
 /** 
  * 上传工具服务层实现类
@@ -129,4 +129,13 @@ public class UploadFileService {
 		return file;
 	}
 
+	/**
+	 * 获取上传文件签名
+	 *
+	 * @param uploadSign
+	 * @return
+	 */
+	public PostObjectFormFields getUploadSign(UploadSign uploadSign) {
+		return storagePluginContext.getUploadSign(KS3StoragePlugin.PLUGIN_NAME, uploadSign);
+	}
 }

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

@@ -299,4 +299,9 @@ public class ActivityUserMapperServiceImpl extends BaseServiceImpl<Integer, Acti
 	public Integer getStudentNoCourseNum(Integer userId, Integer activityId) {
 		return activityUserMapperDao.getStudentNoMapperInfo(userId, activityId);
 	}
+
+	@Override
+	public List<ExportStudentSubCourse> exportStudentSubCourse(String organId, Integer tenantId) {
+		return activityUserMapperDao.exportStudentSubCourse(organId,tenantId);
+	}
 }

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

@@ -338,7 +338,7 @@ public class ChildrenDayReserveServiceImpl extends BaseServiceImpl<Integer, Chil
                 orderAmount,
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                 orderSubject,
                 orderSubject,

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

@@ -206,7 +206,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         }
         List<ClassGroupTeacherMapper> teacherMappers = classGroup.getTeacherMapperList();
         Set<Integer> collect = teacherMappers.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-        if(teacherMappers.size() != collect.size()){
+        if (teacherMappers.size() != collect.size()) {
             throw new BizException("主教与助教存在冲突");
         }
 
@@ -282,16 +282,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         } else {
             MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
             Map<Integer, String> userRoleMap = new HashMap<>();
-            if(musicGroup.getEducationalTeacherId() != null){
+            if (musicGroup.getEducationalTeacherId() != null) {
                 userRoleMap.put(musicGroup.getEducationalTeacherId(), "乐团主管");
             }
-            if(musicGroup.getTeamTeacherId() != null){
+            if (musicGroup.getTeamTeacherId() != null) {
                 userRoleMap.put(musicGroup.getTeamTeacherId(), "运营主管");
             }
-            if(musicGroup.getDirectorUserId() != null){
+            if (musicGroup.getDirectorUserId() != null) {
                 userRoleMap.put(musicGroup.getDirectorUserId(), "乐队指导");
             }
-            if(musicGroup.getTransactionTeacherId() != null){
+            if (musicGroup.getTransactionTeacherId() != null) {
                 userRoleMap.put(musicGroup.getTransactionTeacherId(), "衔接老师");
             }
             if (teacherIdList != null && teacherIdList.size() > 0) {
@@ -545,8 +545,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
                 if (highClassGroup.getHoliday()) {
                     Integer tenantId = TenantContextHolder.getTenantId();
-                    String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING,tenantId);
-                    if(StringUtils.isNotBlank(holidaySetting)){
+                    String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
+                    if (StringUtils.isNotBlank(holidaySetting)) {
                         holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
                     }
                 }
@@ -629,7 +629,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 param.put("musicGroupId", e.getMusicGroupId());
                 e.setAttendanceNum(teacherPersonalAttendancesCount);
                 Long aLong = hasRestClassMap.get(Integer.parseInt(e.getClassGroupIds()));
-                if(aLong != null){
+                if (aLong != null) {
                     e.setHasRestClass(aLong.intValue());
                 }
             });
@@ -1206,7 +1206,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         Map<CourseScheduleType, BigDecimal> originUnitPriceMap = new HashMap<CourseSchedule.CourseScheduleType, BigDecimal>();
         Map<CourseScheduleType, BigDecimal> totalCurrentPriceMap = new HashMap<CourseSchedule.CourseScheduleType, BigDecimal>();
         Map<CourseScheduleType, BigDecimal> totalOriginPriceMap = new HashMap<CourseSchedule.CourseScheduleType, BigDecimal>();
-        if(musicGroupPaymentCalenderCourseSettingsList != null){
+        if (musicGroupPaymentCalenderCourseSettingsList != null) {
             for (MusicGroupPaymentCalenderCourseSettings musicGroupPaymentCalenderCourseSettings : musicGroupPaymentCalenderCourseSettingsList) {
                 unitPriceMap.put(
                         musicGroupPaymentCalenderCourseSettings.getCourseType(),
@@ -1244,9 +1244,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<CourseScheduleStudentPayment>();
             List<CourseScheduleStudentPayment> totalCourseScheduleStudentPayments = new ArrayList<CourseScheduleStudentPayment>();
 
-            if(HIGH_ONLINE.equals(classGroup.getType())){
+            if (HIGH_ONLINE.equals(classGroup.getType())) {
                 Integer studentNum = classGroupStudentMapperDao.countClassGroupStudentNum(classGroup.getId());
-                if(Objects.nonNull(studentNum)&&studentNum>=6){
+                if (Objects.nonNull(studentNum) && studentNum >= 6) {
                     throw new BizException("线上基础技能班班级最大人数为6人");
                 }
             }
@@ -1256,11 +1256,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
             // 2、插入关联关系
             ClassGroupStudentMapper classGroupStudent = classGroupStudentMapperDao.findClassGroupStudent(classGroup.getId(), studentId);
-            if(Objects.nonNull(classGroupStudent)){
+            if (Objects.nonNull(classGroupStudent)) {
                 classGroupStudent.setStatus(ClassGroupStudentStatusEnum.NORMAL);
                 classGroupStudent.setUpdateTime(date);
                 classGroupStudentMapperDao.update(classGroupStudent);
-            }else {
+            } else {
                 ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
                 classGroupStudentMapper.setMusicGroupId(classGroup.getMusicGroupId());
                 classGroupStudentMapper.setClassGroupId(classGroup.getId());
@@ -1276,8 +1276,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             Map<Integer, List<CourseSchedule>> memberCourseSchedule = courseScheduleList.stream().collect(Collectors.groupingBy(CourseSchedule::getMemberFlag));
             for (Integer integer : memberCourseSchedule.keySet()) {
                 List<CourseSchedule> courseSchedules = memberCourseSchedule.get(integer);
-                if(courseSchedules != null && courseSchedules.size() > 0){
-                    if(integer == 0){
+                if (courseSchedules != null && courseSchedules.size() > 0) {
+                    if (integer == 0) {
                         for (CourseSchedule courseSchedule : courseSchedules) {
                             if (existCourseIds.contains(courseSchedule.getId())) {
                                 throw new BizException("该学员已在此班级{}课程中", courseSchedule.getId());
@@ -1329,7 +1329,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                             List<CourseScheduleType> list = new ArrayList<CourseSchedule.CourseScheduleType>();
                             for (CourseScheduleStudentPayment courseScheduleStudentPayment : courseScheduleStudentPayments) {
                                 courseType = courseScheduleStudentPayment.getCourseSchedule().getType();
-                                if(totalCurrentPriceMap.get(courseType) == null){
+                                if (totalCurrentPriceMap.get(courseType) == null) {
                                     throw new BizException("该缴费项目有新增课时:请重新编辑");
                                 }
                                 if (!list.contains(courseType)) {
@@ -1344,7 +1344,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                                 }
                             }
                         }
-                    }else {
+                    } else {
                         for (CourseSchedule courseSchedule : courseSchedules) {
                             if (existCourseIds.contains(courseSchedule.getId())) {
                                 throw new BizException("该学员已在此班级{}课程中", courseSchedule.getId());
@@ -1367,18 +1367,18 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     }
                 }
             }
-            if(totalCourseScheduleStudentPayments.size() > 0 || courseScheduleStudentPayments.size() > 0){
+            if (totalCourseScheduleStudentPayments.size() > 0 || courseScheduleStudentPayments.size() > 0) {
                 totalCourseScheduleStudentPayments.addAll(courseScheduleStudentPayments);
                 courseScheduleStudentPaymentService.batchInsert(totalCourseScheduleStudentPayments);
                 studentService.updateStudentServiceTag(studentId, null, YesOrNoEnum.YES.getCode());
             }
 
-            if(!CollectionUtils.isEmpty(courseScheduleList)){
+            if (!CollectionUtils.isEmpty(courseScheduleList)) {
                 allNotStartCourses.addAll(courseScheduleList);
             }
 
             List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getClassGroupTeachers(classGroup.getId());
-            if(!CollectionUtils.isEmpty(classGroupTeachers)){
+            if (!CollectionUtils.isEmpty(classGroupTeachers)) {
                 ctm.put(classGroup.getId(), classGroupTeachers);
             }
 
@@ -1396,7 +1396,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             for (CourseScheduleTeacherSalary oldCourseSalary : oldCourseSalaries) {
                 oldCourseSalary.setId(null);
                 //课酬调整后不能更新课酬
-                if(!oldCourseSalary.getEnableChangeSalary()){
+                if (!oldCourseSalary.getEnableChangeSalary()) {
                     continue;
                 }
                 courseScheduleTeacherSalaryService.createMusicGroupCourseTeacherSalary(null, idCourseMap.get(oldCourseSalary.getCourseScheduleId()), oldCourseSalary);
@@ -1431,7 +1431,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //删除班级未开始课程
         List<CourseSchedule> courseScheduleList = courseScheduleService.findNoStartCoursesByClassGroupId(classGroupId);
         if (courseScheduleList.size() > 0) {
-            if(courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId).size() > 0){
+            if (courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId).size() > 0) {
                 throw new BizException("操作失败:该班级存在预排课程");
             }
             List<Long> courseScheduleIds = courseScheduleList.stream().map(courseSchedule -> courseSchedule.getId()).collect(Collectors.toList());
@@ -1457,7 +1457,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //删除班级未开始课程
         List<CourseSchedule> courseScheduleList = courseScheduleService.findNoStartCoursesByClassGroupId(classGroupId);
         if (courseScheduleList.size() > 0) {
-            if(courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId).size() > 0){
+            if (courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId).size() > 0) {
                 throw new BizException("操作失败:该班级存在预排课程");
             }
             List<Long> courseScheduleIds = courseScheduleList.stream().map(courseSchedule -> courseSchedule.getId()).collect(Collectors.toList());
@@ -1692,8 +1692,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         TeacherClassHeadInfo teacherClassHeadInfo = new TeacherClassHeadInfo();
         //获取班级的线上、线下课数量
-        int onlineCourseNum = classGroupDao.countCourseNum(classGroupId,"ONLINE");
-        int offlineCourseNum = classGroupDao.countCourseNum(classGroupId,"OFFLINE");
+        int onlineCourseNum = classGroupDao.countCourseNum(classGroupId, "ONLINE");
+        int offlineCourseNum = classGroupDao.countCourseNum(classGroupId, "OFFLINE");
 
         if (onlineCourseNum > 0 && offlineCourseNum <= 0) {
             teacherClassHeadInfo.setTeachMode("1");
@@ -1707,7 +1707,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         teacherClassHeadInfo.setStudentNum(classGroupStudentMapperDao.countClassGroupStudentNum(classGroup.getId()));
         teacherClassHeadInfo.setCurrentClassTimes(courseScheduleDao.countCurrentTimes(classGroup.getId(), new Date()));
         teacherClassHeadInfo.setTotalClassTimes(courseScheduleDao.countClassGroupCourses(classGroup.getId()));
-        teacherClassHeadInfo.setSurplusClassTimes(teacherClassHeadInfo.getTotalClassTimes()-teacherClassHeadInfo.getCurrentClassTimes());
+        teacherClassHeadInfo.setSurplusClassTimes(teacherClassHeadInfo.getTotalClassTimes() - teacherClassHeadInfo.getCurrentClassTimes());
         if (subjectNames != null && !subjectNames.isEmpty()) {
             teacherClassHeadInfo.setSubjectNames(subjectNames);
         }
@@ -1784,12 +1784,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 Set<Long> collect = truantStudent.stream().map(e -> e.getStudentId()).collect(Collectors.toSet());
                 Map<Integer, String> paymentStatusMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDao.queryUserCoursePaymentStatus(collect, schedule.getMusicGroupId()));
 
-                Map<Integer, Long> quitMap = MapUtil.convertIntegerMap(musicGroupQuitDao.queryQuitMapByStudentId(collect,schedule.getMusicGroupId()));
+                Map<Integer, Long> quitMap = MapUtil.convertIntegerMap(musicGroupQuitDao.queryQuitMapByStudentId(collect, schedule.getMusicGroupId()));
                 //学员是否有待审核的退团申请
                 truantStudent.forEach(studentAttendanceViewDto -> {
                     studentAttendanceViewDto.setPaymentStatus(paymentStatusMap.get(studentAttendanceViewDto.getStudentId().intValue()));
                     Long aLong = quitMap.get(studentAttendanceViewDto.getStudentId().intValue());
-                    studentAttendanceViewDto.setQuitFlag(aLong==null?0:aLong.intValue());
+                    studentAttendanceViewDto.setQuitFlag(aLong == null ? 0 : aLong.intValue());
                 });
             }
             List<StudentAttendanceViewDto> tempIds = truantStudent.stream()
@@ -1802,12 +1802,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 List<Map<Integer, Long>> studentSubjectIdMaps = subjectDao.findStudentSubjectIdMaps(tempIds);
                 Map<Integer, Long> studentSubjectIdMap = MapUtil.convertIntegerMap(studentSubjectIdMaps);
                 truantStudent.forEach(studentAttendanceViewDto -> {
-                   if(Objects.nonNull(studentAttendanceViewDto.getBeMerged())&&studentAttendanceViewDto.getBeMerged()){
-                       studentAttendanceViewDto.setSubjectName("被合并学员");
-                   }else{
-                       studentAttendanceViewDto.setSubjectName(studentSubjectNameMap.get(studentAttendanceViewDto.getStudentId().intValue()));
-                       studentAttendanceViewDto.setSubjectId(studentSubjectIdMap.get(studentAttendanceViewDto.getStudentId().intValue()));
-                   }
+                    if (Objects.nonNull(studentAttendanceViewDto.getBeMerged()) && studentAttendanceViewDto.getBeMerged()) {
+                        studentAttendanceViewDto.setSubjectName("被合并学员");
+                    } else {
+                        studentAttendanceViewDto.setSubjectName(studentSubjectNameMap.get(studentAttendanceViewDto.getStudentId().intValue()));
+                        studentAttendanceViewDto.setSubjectId(studentSubjectIdMap.get(studentAttendanceViewDto.getStudentId().intValue()));
+                    }
                 });
             } else if (schedule.getGroupType() != MUSIC) {
                 ClassGroup classGroup = classGroupDao.get(schedule.getClassGroupId());
@@ -1998,8 +1998,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
             if (classGroup4MixDto.getHoliday()) {
                 Integer tenantId = TenantContextHolder.getTenantId();
-                String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING,tenantId);
-                if(StringUtils.isNotBlank(holidaySetting)){
+                String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
+                if (StringUtils.isNotBlank(holidaySetting)) {
                     holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
                 }
             }
@@ -2019,7 +2019,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
                     //课时长度
                     long classCourseDuration = Duration.between(LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + courseTimeDto.getStartClassTime() + ":00", formatter),
-                            LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
+                                    LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
                             .toMinutes();
 
                     totalCourseDuration += classCourseDuration;
@@ -2147,8 +2147,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         Set<String> holidayDays = new HashSet<>();
         if (classGroup4MixDto.getHoliday()) {
             Integer tenantId = TenantContextHolder.getTenantId();
-            String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING,tenantId);
-            if(StringUtils.isNotBlank(holidaySetting)){
+            String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
+            if (StringUtils.isNotBlank(holidaySetting)) {
                 holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
             }
         }
@@ -2388,10 +2388,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             List<ClassGroupTeacherMapper> byClassGroup = classGroupTeacherMapperDao.findByClassGroup(classGroupId);
             List<ClassGroupTeacherMapper> newTeacherMapperList = classGroup4MixDtos.get(0).getClassGroupTeacherMapperList();
             Set<Integer> collect = newTeacherMapperList.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-            if(newTeacherMapperList.size() != collect.size()){
+            if (newTeacherMapperList.size() != collect.size()) {
                 throw new BizException("主教与助教存在冲突");
             }
-            if(musicGroup.getStatus() == PROGRESS){
+            if (musicGroup.getStatus() == PROGRESS) {
                 if (byClassGroup != null && byClassGroup.size() > 0) {
                     ClassGroupTeacherMapper groupTeacherMapper = byClassGroup.stream().filter(classGroupTeacherMapper -> classGroupTeacherMapper.getTeacherRole() == TeachTypeEnum.BISHOP).findFirst().get();
                     if (groupTeacherMapper != null) {
@@ -2460,7 +2460,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
             List<ClassGroupTeacherMapper> teacherMappers = classGroup4MixDto.getClassGroupTeacherMapperList();
             Set<Integer> collect = teacherMappers.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-            if(teacherMappers.size() != collect.size()){
+            if (teacherMappers.size() != collect.size()) {
                 throw new BizException("主教与助教存在冲突");
             }
             //3、插入班级排课信息
@@ -2484,22 +2484,22 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
             Set<String> holidayDays = new HashSet<>();
             Integer tenantId = TenantContextHolder.getTenantId();
-            String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING,tenantId);
-            if(StringUtils.isNotBlank(holidaySetting)){
+            String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
+            if (StringUtils.isNotBlank(holidaySetting)) {
                 holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
             }
 
             Set<Integer> allTeacherIds = new HashSet<>();
             List<SimpleUserDto> allTeacherInfo = new ArrayList<>();
-            if(!confirmGenerate){
+            if (!confirmGenerate) {
                 for (CourseTimeDto courseTimeDto : classGroup4MixDto.getCourseTimeDtoList()) {
                     List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = courseTimeDto.getClassGroupTeacherMapperList();
                     Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().map(t -> t.getUserId()).collect(Collectors.toSet());
-                    if(!CollectionUtils.isEmpty(teacherIds)){
+                    if (!CollectionUtils.isEmpty(teacherIds)) {
                         allTeacherIds.addAll(teacherIds);
                     }
                 }
-                if(!CollectionUtils.isEmpty(allTeacherIds)){
+                if (!CollectionUtils.isEmpty(allTeacherIds)) {
                     allTeacherInfo = teacherDao.getUsersSimpleInfo(new ArrayList<>(allTeacherIds));
                 }
             }
@@ -2515,8 +2515,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         throw new BizException("主教与助教存在冲突");
                     }
 
-                    Integer teacherId = newClassGroupTeacherMapperList.stream().filter(ct->TeachTypeEnum.BISHOP.equals(ct.getTeacherRole())).findAny().get().getUserId();
-                    if(Objects.isNull(teacherId)){
+                    Integer teacherId = newClassGroupTeacherMapperList.stream().filter(ct -> TeachTypeEnum.BISHOP.equals(ct.getTeacherRole())).findAny().get().getUserId();
+                    if (Objects.isNull(teacherId)) {
                         throw new BizException("请设置主教");
                     }
 
@@ -2550,7 +2550,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
                     //课时长度
                     long classCourseDuration = Duration.between(LocalDateTime.parse(DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy-MM-dd") + " " + courseTimeDto.getStartClassTime() + ":00", formatter),
-                            LocalDateTime.parse(DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy-MM-dd") + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
+                                    LocalDateTime.parse(DateUtil.dateToString(courseTimeDto.getStartDate(), "yyyy-MM-dd") + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
                             .toMinutes();
 
                     totalCourseDuration += classCourseDuration;
@@ -2601,14 +2601,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     courseScheduleDao.insert(courseSchedule);
                     courseScheduleList.add(courseSchedule);
 
-                    if(!confirmGenerate){
-                        Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().filter(ct->TeachTypeEnum.TEACHING.equals(ct.getTeacherRole())).map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
+                    if (!confirmGenerate) {
+                        Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().filter(ct -> TeachTypeEnum.TEACHING.equals(ct.getTeacherRole())).map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
                         SimpleUserDto mainTeacher = allTeacherInfo.stream().filter(t -> teacherId.equals(t.getUserId())).findAny().get();
-                        if(Objects.nonNull(mainTeacher)){
+                        if (Objects.nonNull(mainTeacher)) {
                             courseSchedule.setActualTeacherName(mainTeacher.getUserName());
                         }
                         List<SimpleUserDto> teachingTeachers = allTeacherInfo.stream().filter(t -> teacherIds.contains(t.getUserId())).collect(Collectors.toList());
-                        if(!CollectionUtils.isEmpty(teachingTeachers)){
+                        if (!CollectionUtils.isEmpty(teachingTeachers)) {
                             courseSchedule.setTeachingTeacherNames(StringUtils.join(teachingTeachers.stream().map(SimpleUserDto::getUserName).collect(Collectors.toList()), ","));
                         }
                     }
@@ -2672,28 +2672,28 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
         //校验所有学员的课时都有消耗
         String studentName = musicGroupSchoolTermStudentCourseDetailDao.getNoCourseStudentName(musicGroupSchoolTermCourseDetailId);
-        if(StringUtils.isNotEmpty(studentName)){
-            throw new BizException("操作失败:{} 未排课,请检查排课是否完整",studentName);
+        if (StringUtils.isNotEmpty(studentName)) {
+            throw new BizException("操作失败:{} 未排课,请检查排课是否完整", studentName);
         }
         //获取所有预排课课程列表
         List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(termCourseDetail.getMusicGroupId());
-        if(courseSchedules.size() == 0){
+        if (courseSchedules.size() == 0) {
             throw new BizException("操作失败:请先预排课");
         }
         //是否有进行中或者已结束的课程
         int overCourseScheduleNum = courseScheduleDao.queryOverPreCourseListByMusicGroupId(termCourseDetail.getMusicGroupId());
-        if(overCourseScheduleNum > 0){
+        if (overCourseScheduleNum > 0) {
             throw new BizException("操作失败:有进行中或已结束的课程,请重新排课");
         }
 
         Map<Integer, List<CourseSchedule>> courseMap = courseSchedules.stream().collect(Collectors.groupingBy(CourseSchedule::getClassGroupId));
-        courseMap.keySet().forEach(e->{
+        courseMap.keySet().forEach(e -> {
             //更新班级课程数
             classGroupService.updateTotalClassTimes(e, courseMap.get(e).size());
         });
         List<Long> courseScheduleIds = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toList());
         //取消预排课标记
-        courseScheduleDao.batchUpdateLockByCourseIds(courseScheduleIds,0,0);
+        courseScheduleDao.batchUpdateLockByCourseIds(courseScheduleIds, 0, 0);
         //标记已排课
         termCourseDetail.setCourseFlag(true);
         musicGroupSchoolTermCourseDetailDao.update(termCourseDetail);
@@ -2726,16 +2726,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         if (!CollectionUtils.isEmpty(teacherAttendances)) {
             teacherAttendanceDao.batchInsert(teacherAttendances);
         }
-        imUserFriendService.refreshGroupImUserFriend(termCourseDetail.getMusicGroupId(),MUSIC);
+        imUserFriendService.refreshGroupImUserFriend(termCourseDetail.getMusicGroupId(), MUSIC);
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void cancelPreCourseSchedule(Integer musicGroupSchoolTermCourseDetailId, Integer classGroupId) {
         MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.get(musicGroupSchoolTermCourseDetailId);
-        if(classGroupId == null){
+        if (classGroupId == null) {
             List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByMusicGroupId(termCourseDetail.getMusicGroupId());
-            if(courseSchedules.size() > 0){
+            if (courseSchedules.size() > 0) {
                 List<Long> courseScheduleIds = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toList());
                 //删除课程以及关联的学员老师
                 courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
@@ -2743,11 +2743,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 courseScheduleDao.deleteCourseSchedulesByClassGroupIds(courseScheduleIds);
             }
             //取消所有预排课
-            musicGroupSchoolTermStudentCourseDetailDao.deleteByDetailId(musicGroupSchoolTermCourseDetailId,null);
+            musicGroupSchoolTermStudentCourseDetailDao.deleteByDetailId(musicGroupSchoolTermCourseDetailId, null);
             musicGroupSchoolTermCourseDetailDao.delete(musicGroupSchoolTermCourseDetailId);
-        }else {
+        } else {
             List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId);
-            if(courseSchedules.size() == 0){
+            if (courseSchedules.size() == 0) {
                 return;
             }
             List<Long> courseScheduleIds = courseSchedules.stream().map(c -> c.getId()).collect(Collectors.toList());
@@ -2769,14 +2769,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     //根据课程编号获取总时长
                     int courseMinutes = courseScheduleDao.sumCourseMinutes(courseScheduleIdList);
                     preMemberCourseMinutes += courseMinutes;
-                    if(scheduleType == SINGLE || scheduleType == TRAINING_SINGLE){
+                    if (scheduleType == SINGLE || scheduleType == TRAINING_SINGLE) {
                         singleCourseMinutes += courseMinutes;
                     }
-                    if(scheduleType == MIX || scheduleType == TRAINING_MIX){
+                    if (scheduleType == MIX || scheduleType == TRAINING_MIX) {
                         mixCourseMinutes += courseMinutes;
                     }
                 }
-                musicGroupSchoolTermStudentCourseDetailDao.cutMinutes(musicGroupSchoolTermCourseDetailId,preMemberCourseMinutes,mixCourseMinutes,singleCourseMinutes,studentId);
+                musicGroupSchoolTermStudentCourseDetailDao.cutMinutes(musicGroupSchoolTermCourseDetailId, preMemberCourseMinutes, mixCourseMinutes, singleCourseMinutes, studentId);
             }
             //删除课程以及关联的学员老师
             courseScheduleStudentPaymentDao.deleteByCourseSchedule(courseScheduleIds);
@@ -2788,12 +2788,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Override
     public List<ClassGroup> queryStudentClassGroupsAndTeacher(String musicGroupId) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(sysUser == null){
+        if (sysUser == null) {
             throw new BizException("请登录");
         }
         List<ClassGroup> classGroups = classGroupDao.queryStudentClassGroups(musicGroupId, sysUser.getId());
-        if(classGroups.size() > 0){
-            classGroups.forEach(e->{
+        if (classGroups.size() > 0) {
+            classGroups.forEach(e -> {
                 e.setTeacherMapperList(classGroupTeacherMapperDao.findClassGroupTeachers(e.getId().toString()));
             });
         }
@@ -2819,17 +2819,17 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             throw new BizException("当前班级已冻结无法操作预排课");
         }
         MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
-        if(musicGroup == null){
+        if (musicGroup == null) {
             throw new BizException("乐团信息查询失败");
         }
-        if(musicGroup.getTenantId() == null){
+        if (musicGroup.getTenantId() == null) {
             throw new BizException("乐团机构信息异常,请联系管理员");
         }
         String configValue = sysTenantConfigService.getTenantConfigValue(SysConfigService.MEMBER_GROUP_TERM_GIVE_COURSE_TIME, musicGroup.getTenantId());
-        if(StringUtils.isEmpty(configValue)){
+        if (StringUtils.isEmpty(configValue)) {
             throw new BizException("请配置会员团每学期赠送课程分钟数");
         }
-        Integer giveCourseTime = Integer.parseInt(configValue)>>1;
+        Integer giveCourseTime = Integer.parseInt(configValue) >> 1;
 
         Boolean confirmGenerate = false;
         if (Objects.nonNull(classGroup4MixDtos.get(0).getConfirmGenerate())) {
@@ -2870,35 +2870,35 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
             Integer totalMixCourseMinutes = 0;
             Integer singleCourseMinutes = 0;
-            if(classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == MIX ||
-                    classGroup4MixDto.getCourseType() == TRAINING_SINGLE || classGroup4MixDto.getCourseType() == TRAINING_MIX){
+            if (classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == MIX ||
+                    classGroup4MixDto.getCourseType() == TRAINING_SINGLE || classGroup4MixDto.getCourseType() == TRAINING_MIX) {
                 //单技课和合奏课最大的排课时长不能超过44 * 45 分钟
-                if(classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == TRAINING_SINGLE){
-                    if(totalCourseMinutes > giveCourseTime){
-                        throw new BizException("声部类型总时长不能超过最大限制({}分钟)",giveCourseTime);
+                if (classGroup4MixDto.getCourseType() == SINGLE || classGroup4MixDto.getCourseType() == TRAINING_SINGLE) {
+                    if (totalCourseMinutes > giveCourseTime) {
+                        throw new BizException("声部类型总时长不能超过最大限制({}分钟)", giveCourseTime);
                     }
                     singleCourseMinutes = totalCourseMinutes;
                     //获取所选学员最大的已消耗的单技课时长
-                    int maxSingleCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxSingleCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
-                    if(giveCourseTime - maxSingleCourseMinutes < totalCourseMinutes){
+                    int maxSingleCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxSingleCourseMinutes(musicGroupSchoolTermCourseDetailId, studentIds);
+                    if (giveCourseTime - maxSingleCourseMinutes < totalCourseMinutes) {
 //                        throw new BizException("操作失败:所选学员可排单技课时长已不足{}分钟",totalCourseMinutes);
-                        throw new BizException("声部类型总时长不能超过最大限制({}分钟)",giveCourseTime);
+                        throw new BizException("声部类型总时长不能超过最大限制({}分钟)", giveCourseTime);
                     }
                 } else {
-                    if(totalCourseMinutes > giveCourseTime){
-                        throw new BizException("合奏类型总时长不能超过最大限制({}分钟)",giveCourseTime);
+                    if (totalCourseMinutes > giveCourseTime) {
+                        throw new BizException("合奏类型总时长不能超过最大限制({}分钟)", giveCourseTime);
                     }
                     totalMixCourseMinutes = totalCourseMinutes;
-                    int maxMixCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxMixCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
-                    if(giveCourseTime - maxMixCourseMinutes < totalCourseMinutes){
+                    int maxMixCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMaxMixCourseMinutes(musicGroupSchoolTermCourseDetailId, studentIds);
+                    if (giveCourseTime - maxMixCourseMinutes < totalCourseMinutes) {
 //                        throw new BizException("操作失败:所选学员可排合奏课时长已不足{}分钟",totalCourseMinutes);
-                        throw new BizException("合奏类型总时长不能超过最大限制({}分钟)",giveCourseTime);
+                        throw new BizException("合奏类型总时长不能超过最大限制({}分钟)", giveCourseTime);
                     }
                 }
             }
             //获取班级学员最少可排课时长
-            int mixCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMixCourseMinutes(musicGroupSchoolTermCourseDetailId,studentIds);
-            if(totalCourseMinutes > mixCourseMinutes){
+            int mixCourseMinutes = musicGroupSchoolTermStudentCourseDetailDao.getMixCourseMinutes(musicGroupSchoolTermCourseDetailId, studentIds);
+            if (totalCourseMinutes > mixCourseMinutes) {
                 throw new BizException("操作失败:所选部分学员可排课时间不足");
             }
 
@@ -2910,22 +2910,22 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
             Set<String> holidayDays = new HashSet<>();
             Integer tenantId = TenantContextHolder.getTenantId();
-            String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING,tenantId);
-            if(StringUtils.isNotBlank(holidaySetting)){
+            String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
+            if (StringUtils.isNotBlank(holidaySetting)) {
                 holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
             }
 
             Set<Integer> allTeacherIds = new HashSet<>();
             List<SimpleUserDto> allTeacherInfo = new ArrayList<>();
-            if(!confirmGenerate){
+            if (!confirmGenerate) {
                 for (CourseTimeDto courseTimeDto : classGroup4MixDto.getCourseTimeDtoList()) {
                     List<ClassGroupTeacherMapper> newClassGroupTeacherMapperList = courseTimeDto.getClassGroupTeacherMapperList();
                     Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().map(t -> t.getUserId()).collect(Collectors.toSet());
-                    if(!CollectionUtils.isEmpty(teacherIds)){
+                    if (!CollectionUtils.isEmpty(teacherIds)) {
                         allTeacherIds.addAll(teacherIds);
                     }
                 }
-                if(!CollectionUtils.isEmpty(allTeacherIds)){
+                if (!CollectionUtils.isEmpty(allTeacherIds)) {
                     allTeacherInfo = teacherDao.getUsersSimpleInfo(new ArrayList<>(allTeacherIds));
                 }
             }
@@ -2941,8 +2941,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         throw new BizException("主教与助教存在冲突");
                     }
 
-                    Integer teacherId = newClassGroupTeacherMapperList.stream().filter(ct->TeachTypeEnum.BISHOP.equals(ct.getTeacherRole())).findAny().get().getUserId();
-                    if(Objects.isNull(teacherId)){
+                    Integer teacherId = newClassGroupTeacherMapperList.stream().filter(ct -> TeachTypeEnum.BISHOP.equals(ct.getTeacherRole())).findAny().get().getUserId();
+                    if (Objects.isNull(teacherId)) {
                         throw new BizException("请设置主教");
                     }
 
@@ -2953,11 +2953,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                         throw new BizException("排课循环周期错误,请核查");
                     }
                     //排课截止时间不可超过学期截止日期
-                    if(courseTimeDto.getEndDate().compareTo(schoolTermCourseDetail.getEndSchoolTerm()) > 0){
+                    if (courseTimeDto.getEndDate().compareTo(schoolTermCourseDetail.getEndSchoolTerm()) > 0) {
                         throw new BizException("操作失败:不可跨学期排课,请调整课程截止日期");
                     }
                     //排课开始时间不可小于预排课时间
-                    if(courseTimeDto.getStartDate().compareTo(schoolTermCourseDetail.getStartSchoolTerm()) < 0){
+                    if (courseTimeDto.getStartDate().compareTo(schoolTermCourseDetail.getStartSchoolTerm()) < 0) {
                         throw new BizException("操作失败:排课开始时间不可小于开课日期");
                     }
 
@@ -3029,14 +3029,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     courseScheduleDao.insert(courseSchedule);
                     courseScheduleList.add(courseSchedule);
 
-                    if(!confirmGenerate){
-                        Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().filter(ct->TeachTypeEnum.TEACHING.equals(ct.getTeacherRole())).map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
+                    if (!confirmGenerate) {
+                        Set<Integer> teacherIds = newClassGroupTeacherMapperList.stream().filter(ct -> TeachTypeEnum.TEACHING.equals(ct.getTeacherRole())).map(ClassGroupTeacherMapper::getUserId).collect(Collectors.toSet());
                         SimpleUserDto mainTeacher = allTeacherInfo.stream().filter(t -> teacherId.equals(t.getUserId())).findAny().get();
-                        if(Objects.nonNull(mainTeacher)){
+                        if (Objects.nonNull(mainTeacher)) {
                             courseSchedule.setActualTeacherName(mainTeacher.getUserName());
                         }
                         List<SimpleUserDto> teachingTeachers = allTeacherInfo.stream().filter(t -> teacherIds.contains(t.getUserId())).collect(Collectors.toList());
-                        if(!CollectionUtils.isEmpty(teachingTeachers)){
+                        if (!CollectionUtils.isEmpty(teachingTeachers)) {
                             courseSchedule.setTeachingTeacherNames(StringUtils.join(teachingTeachers.stream().map(SimpleUserDto::getUserName).collect(Collectors.toList()), ","));
                         }
                     }
@@ -3216,8 +3216,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             Set<String> holidayDays = new HashSet<>();
             if (classGroup4MixDto.getHoliday()) {
                 Integer tenantId = TenantContextHolder.getTenantId();
-                String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING,tenantId);
-                if(StringUtils.isNotBlank(holidaySetting)){
+                String holidaySetting = sysTenantConfigService.getTenantConfigValue(SysConfigService.HOLIDAY_SETTING, tenantId);
+                if (StringUtils.isNotBlank(holidaySetting)) {
                     holidayDays = new HashSet<>(JSON.parseArray(holidaySetting, String.class));
                 }
             }
@@ -3238,7 +3238,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
                     //课时长度
                     long classCourseDuration = Duration.between(LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + courseTimeDto.getStartClassTime() + ":00", formatter),
-                            LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
+                                    LocalDateTime.parse(classGroup4MixDto.getStartDate() + " " + courseTimeDto.getEndClassTime() + ":00", formatter))
                             .toMinutes();
 
                     totalCourseDuration += classCourseDuration;
@@ -3326,7 +3326,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             params.put("offset", pageInfo.getOffset());
             dataList = classGroupDao.queryMusicGroupClassGroup(params);
             List<Integer> classGroups = dataList.stream().map(e -> e.getClassGroupId()).collect(Collectors.toList());
-            Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroups, null,0));
+            Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroups, null, 0));
             Map<Integer, Long> currentNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countExpendNumByClassGroupId(classGroups));
             String join = StringUtils.join(classGroups, ",");
             //获取主教老师
@@ -3420,16 +3420,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Transactional(rollbackFor = Exception.class)
     public int updateClassGroup(ClassGroup classGroup) {
         ClassGroup group = classGroupDao.get(classGroup.getId());
-        if(Objects.isNull(group)){
+        if (Objects.isNull(group)) {
             throw new BizException("班级信息不存在");
         }
         String groupName = classGroup.getName();
-        if(StringUtils.isEmpty(groupName)){
+        if (StringUtils.isEmpty(groupName)) {
             throw new BizException("请填写班级名称");
         }
         classGroupDao.update(classGroup);
         ImGroup imGroup = imGroupService.get(classGroup.getId().toString());
-        if(!Objects.isNull(imGroup)){
+        if (!Objects.isNull(imGroup)) {
             imGroup.setName(groupName);
             imGroupService.update(imGroup);
         }
@@ -3588,8 +3588,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    public List<ClassGroupTeachersDto> getClassGroupAndTeacherByType(String musicGroupId, ClassGroupTypeEnum type) {
-        List<ClassGroupTeachersDto> classGroups = classGroupDao.findClassGroupByType(musicGroupId, type);
+    public List<ClassGroupTeachersDto> getClassGroupAndTeacherByType(String musicGroupId, ClassGroupTypeEnum type, Boolean hasCourse) {
+        List<ClassGroupTeachersDto> classGroups = classGroupDao.findClassGroupByType(musicGroupId, type, hasCourse);
         if (classGroups.size() == 0) {
             return null;
         }
@@ -3599,14 +3599,14 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperDao.findClassGroupTeachers(classGroupIds);
         Map<Integer, Integer> studyNums = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(classGroupDao.countStudyNum(classGroupIds))), HashMap.class);
 
-        Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroupSet, null,0));
-        MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroupId, null,0);
+        Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroupSet, null, 0));
+        MusicGroupSchoolTermCourseDetail termCourseDetail = musicGroupSchoolTermCourseDetailDao.findByCourseDateAndMusicGroupId(musicGroupId, null, 0);
         Map<Integer, Long> preTotalNumMap = null;
         Map<Integer, Long> preSubMinutesMap = null;
         Map<Integer, BigDecimal> preMinutesMap = null;
-        if(termCourseDetail != null){
+        if (termCourseDetail != null) {
             preTotalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countPreTotalNumByClassGroupId(classGroupSet));
-            preSubMinutesMap = MapUtil.convertIntegerMap(courseScheduleDao.countPreSubMinutesByClassGroupId(classGroupSet,termCourseDetail.getId()));
+            preSubMinutesMap = MapUtil.convertIntegerMap(courseScheduleDao.countPreSubMinutesByClassGroupId(classGroupSet, termCourseDetail.getId()));
             preMinutesMap = MapUtil.convertIntegerMap(courseScheduleDao.countPreMinutesByClassGroupId(classGroupSet));
         }
         Map<Integer, Long> currentNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countExpendNumByClassGroupId(classGroupSet));
@@ -3621,22 +3621,22 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             classGroup.setStudentNum(studyNums.get(classGroup.getId()));
             int totalClassTimes = 0;
             int currentClassTimes = 0;
-            if(preSubMinutesMap != null){
+            if (preSubMinutesMap != null) {
                 if (preSubMinutesMap.containsKey(classGroup.getId())) {
                     Long aLong = preSubMinutesMap.get(classGroup.getId());
-                    classGroup.setPreSubMinutes(aLong==null?0:aLong.intValue());
+                    classGroup.setPreSubMinutes(aLong == null ? 0 : aLong.intValue());
                 }
             }
-            if(preMinutesMap != null){
+            if (preMinutesMap != null) {
                 if (preMinutesMap.containsKey(classGroup.getId())) {
                     BigDecimal bigDecimal = preMinutesMap.get(classGroup.getId());
-                    classGroup.setPreMinutes(bigDecimal==null?0:bigDecimal.intValue());
+                    classGroup.setPreMinutes(bigDecimal == null ? 0 : bigDecimal.intValue());
                 }
             }
-            if(preTotalNumMap != null){
+            if (preTotalNumMap != null) {
                 if (preTotalNumMap.containsKey(classGroup.getId())) {
                     Long aLong = preTotalNumMap.get(classGroup.getId());
-                    classGroup.setPreTotalClassTimes(aLong==null?0:aLong.intValue());
+                    classGroup.setPreTotalClassTimes(aLong == null ? 0 : aLong.intValue());
                 }
             }
 
@@ -3673,7 +3673,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             } else {
                 count = classGroupDao.countClassGroup(params);
             }
-        }else {
+        } else {
             count = classGroupDao.countClassGroup(params);
         }
 
@@ -3687,7 +3687,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperDao.findClassGroupTeachers(classGroupIds);
             Map<Integer, Integer> studyNums = JSONObject.parseObject(JSONObject.toJSONString(MapUtil.convertIntegerMap(classGroupDao.countStudyNum(classGroupIds))), HashMap.class);
 
-            Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroupSet, null,0));
+            Map<Integer, Long> totalNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countTotalNumByClassGroupId(classGroupSet, null, 0));
             Map<Integer, Long> currentNumMap = MapUtil.convertIntegerMap(courseScheduleDao.countExpendNumByClassGroupId(classGroupSet));
 
             for (ClassGroupTeachersDto classGroup : dataList) {
@@ -3722,16 +3722,16 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         MusicGroup musicGroup = musicGroupDao.get(classGroup.getMusicGroupId());
 
         Map<Integer, String> userRoleMap = new HashMap<Integer, String>();
-        if(musicGroup.getEducationalTeacherId() != null){
+        if (musicGroup.getEducationalTeacherId() != null) {
             userRoleMap.put(musicGroup.getEducationalTeacherId(), "乐团主管");
         }
-        if(musicGroup.getTeamTeacherId() != null){
+        if (musicGroup.getTeamTeacherId() != null) {
             userRoleMap.put(musicGroup.getTeamTeacherId(), "运营主管");
         }
-        if(musicGroup.getDirectorUserId() != null){
+        if (musicGroup.getDirectorUserId() != null) {
             userRoleMap.put(musicGroup.getDirectorUserId(), "乐队指导");
         }
-        if(musicGroup.getTransactionTeacherId() != null){
+        if (musicGroup.getTransactionTeacherId() != null) {
             userRoleMap.put(musicGroup.getTransactionTeacherId(), "衔接老师");
         }
         for (Integer userId : userIds) {
@@ -4061,8 +4061,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    public List<RemainCourseTypeDurationDto> queryRemainCourseTypeDuration(String classGroupIdList,Integer memberFlag) {
-        return courseScheduleDao.queryRemainCourseTypeDuration(classGroupIdList,memberFlag);
+    public List<RemainCourseTypeDurationDto> queryRemainCourseTypeDuration(String classGroupIdList, Integer memberFlag) {
+        return courseScheduleDao.queryRemainCourseTypeDuration(classGroupIdList, memberFlag);
     }
 
     @Override
@@ -4137,7 +4137,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 
         MusicGroup musicGroup = musicGroupDao.findByClassGroupId(classGroupIds.get(0));
         //获取欠费学员列表
-        List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(musicGroup.getId(), new ArrayList<>(studentIds),null);
+        List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(musicGroup.getId(), new ArrayList<>(studentIds), null);
         if (noPaymentUserIds.size() > 0) {
             throw new BizException("操作失败:有欠费的学员不允许创建缴费");
         }
@@ -4262,7 +4262,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             //冻结班级
             classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 1);
             //冻结所选班级的课程
-            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1,null);
+            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1, null);
             httpResponseResult.setMsg("学员班级调整申请已提交,缴费项目审核中");
         }
         return httpResponseResult;
@@ -4388,11 +4388,11 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         classGroupIds.add(masterClassGroupId);
         List<ClassGroup> byClassGroupIds = classGroupDao.findByClassGroupIds(classGroupIds, null);
         long count = byClassGroupIds.stream().map(e -> e.getMusicGroupId()).distinct().count();
-        if(count > 1){
+        if (count > 1) {
             //获取分布默认的课程类型单价
             MusicGroup musicGroup = musicGroupDao.findByClassGroupId(masterClassGroupId);
             //主班乐团不能是系统收费团
-            if(musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){
+            if (musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE) {
                 throw new BizException("操作失败:主班乐团不能是系统收费团");
             }
         }
@@ -4550,7 +4550,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                                 List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = courseScheduleTeacherSalaryDao.findByCourseSchedule(courseSchedule.getId());
                                 for (CourseScheduleTeacherSalary teacherSalary : courseScheduleTeacherSalaries) {
                                     //课酬调整后不能更新课酬
-                                    if(!teacherSalary.getEnableChangeSalary()){
+                                    if (!teacherSalary.getEnableChangeSalary()) {
                                         continue;
                                     }
                                     List<TeacherDefaultMusicGroupSalary> teacherSalaryList = teacherDefaultMusicGroupSalaryService.getTeacherSalaryByUserIdAndType(teacherSalary.getUserId(), null, null);
@@ -4608,7 +4608,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //主班
         Integer masterClassGroupId = mergeClassSplitClassAffirmDto.getMasterClassGroupId();
         //是否有预排课
-        if(courseScheduleDao.queryPreCourseListByClassGroupId(masterClassGroupId).size() > 0){
+        if (courseScheduleDao.queryPreCourseListByClassGroupId(masterClassGroupId).size() > 0) {
             throw new BizException("操作失败: 所选主班有预排课课程,请先完成预排课操作");
         }
         //学员列表
@@ -4621,7 +4621,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //学员列表
         List<Integer> classGroupIds = mergeClassSplitClassAffirmDto.getClassGroupIds();
         //是否有预排课
-        if(courseScheduleDao.queryPreCourseListByClassGroupIds(classGroupIds) > 0){
+        if (courseScheduleDao.queryPreCourseListByClassGroupIds(classGroupIds) > 0) {
             throw new BizException("操作失败: 所选从班班有预排课课程,请先完成预排课操作");
         }
         //班级和学员关联
@@ -4636,7 +4636,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         StudentRegistration studentRegistration = studentRegistrationDao.findApplyStudent(musicGroup.getId(), studentIds);
         if (studentRegistration != null) {
             throw new BizException("操作失败: 学员 {}/{} 在 {} 中为报名状态不可合并",
-                    studentRegistration.getName(),studentRegistration.getUserId(),musicGroup.getName());
+                    studentRegistration.getName(), studentRegistration.getUserId(), musicGroup.getName());
         }
         //获取缴费状态在审核中或者已拒绝的缴费项目的学员
         String studentId = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroup.getId(), null);
@@ -4656,9 +4656,9 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         //给原价赋值,前端没传过来
         for (MusicGroupPaymentCalenderStudentDetail e : calenderStudentDetails) {
             BigDecimal subtract = e.getMasterSubCoursePrice().subtract(e.getSubCourseAmount());
-            if(subtract.compareTo(BigDecimal.ZERO) < 0){
+            if (subtract.compareTo(BigDecimal.ZERO) < 0) {
                 e.setCourseOriginalPrice(BigDecimal.ZERO);
-            }else {
+            } else {
                 e.setCourseOriginalPrice(subtract);
             }
         }
@@ -4716,7 +4716,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect = calenderStudentDetails.stream().collect(Collectors.groupingBy(e -> e.getUserId()));
             for (Map<Integer, String> classGroupStudent : classGroupStudents) {
                 Integer classGroupId = classGroupStudent.keySet().iterator().next();
-                studentRegistrationService.insertStudent(classGroupStudent.get(classGroupId), musicGroupDao.findByClassGroupId(classGroupId).getId(), musicGroup.getId(), collect,paymentCalenderDto.getBatchNo());
+                studentRegistrationService.insertStudent(classGroupStudent.get(classGroupId), musicGroupDao.findByClassGroupId(classGroupId).getId(), musicGroup.getId(), collect, paymentCalenderDto.getBatchNo());
             }
             List<Map> classGroupStudents1 = JSON.parseArray(musicGroupStudentClassAdjust.getClassGroupStudents(), Map.class);
             spanGroupClassAdjustPass(masterClassGroupId, studentIds, courseIds, classGroupStudents1, allLockCourseIds, paymentCalenderDto.getBatchNo(), masterTotalPrice);
@@ -4725,7 +4725,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
 //                冻结班级
             classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 1);
 //                冻结所选班级的课程
-            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1,null);
+            courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 1, null);
             httpResponseResult.setMsg("操作成功:学员班级调整申请已提交,缴费项目审核中");
         }
         return httpResponseResult;
@@ -4761,7 +4761,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             courseScheduleDao.deleteMusicGroupCourseSchedulesWithStudents(courseIds, studentIds);
         }
         //解冻课程
-        courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 0,null);
+        courseScheduleDao.batchUpdateLockByCourseIds(allLockCourseIds, 0, null);
         //解冻班级
         classGroupIds.add(masterClassGroupId);
         classGroupDao.batchUpdateLockByClassGroupIds(classGroupIds, 0);
@@ -4784,10 +4784,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     @Override
     public List<CourseSchedule> queryPreCourseList(Integer classGroupId) {
         List<CourseSchedule> courseSchedules = courseScheduleDao.queryPreCourseListByClassGroupId(classGroupId);
-        if(courseSchedules.size() > 0){
+        if (courseSchedules.size() > 0) {
             List<Long> courseIdList = courseSchedules.stream().map(e -> e.getId()).collect(Collectors.toList());
-            Map<Long, String> bishopTeacherMap = MapUtil.convertMybatisMap(courseScheduleTeacherSalaryDao.queryTeacherNameMap(courseIdList,"BISHOP"));
-            Map<Long, String> teachingTeacherMap = MapUtil.convertMybatisMap(courseScheduleTeacherSalaryDao.queryTeacherNameMap(courseIdList,"TEACHING"));
+            Map<Long, String> bishopTeacherMap = MapUtil.convertMybatisMap(courseScheduleTeacherSalaryDao.queryTeacherNameMap(courseIdList, "BISHOP"));
+            Map<Long, String> teachingTeacherMap = MapUtil.convertMybatisMap(courseScheduleTeacherSalaryDao.queryTeacherNameMap(courseIdList, "TEACHING"));
             for (CourseSchedule courseSchedule : courseSchedules) {
                 courseSchedule.setActualTeacherName(bishopTeacherMap.get(courseSchedule.getId()));
                 courseSchedule.setTeachingTeacherNames(teachingTeacherMap.get(courseSchedule.getId()));

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

@@ -182,7 +182,7 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
         int orderState = 0;
         //消费大于0元则拉起支付
         if (payAmount.compareTo(BigDecimal.ZERO) > 0) {
-            payMap = payService.getPayToPlatformMap(
+            payMap = payService.getPayToPlatformMap(tenantId,
                     PaymentChannelEnum.ADAPAY,
                     payAmount,
                     BigDecimal.ZERO,

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

@@ -582,7 +582,7 @@ public class CoursesGroupServiceImpl extends BaseServiceImpl<Long, CoursesGroup>
                     amount,
                     balance,
                     orderNo,
-                    baseApiUrl + "/api-student/studentOrder/notify",
+                    baseApiUrl + "/api-student/studentOrder/callback",
                     baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                     "对外课程组购买",
                     coursesGroup.getName(),

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

@@ -186,7 +186,7 @@ public class DegreeRegistrationServiceImpl extends BaseServiceImpl<Integer, Degr
                 money,
                 BigDecimal.ZERO,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                 "考级报名活动",
                 "考级报名活动",

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 270 - 234
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java


+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExtracurricularExercisesReplyServiceImpl.java

@@ -28,6 +28,7 @@ import java.math.BigDecimal;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -104,6 +105,8 @@ public class ExtracurricularExercisesReplyServiceImpl extends BaseServiceImpl<Lo
 		detail.setStudentName(extraExerciseReply.getStudentName());
 		detail.setExpiryDate(extraExerciseReply.getExpireDate());
 		detail.setType("EXTRA");
+		detail.setExpire(DateUtil.isOverdue(extraExerciseReply.getCreateTime(),
+				sysConfigDao.findConfigValue("file_expiration_time")));
 
 		String configValue = sysConfigDao.findConfigValue(SysConfigService.HOMEWORK_OPEN_FLAG);
 		if(StringUtils.isEmpty(configValue)){

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

@@ -0,0 +1,195 @@
+package com.ym.mec.biz.service.impl;
+
+import java.io.File;
+import java.util.Date;
+
+import org.apache.commons.lang3.StringUtils;
+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;
+
+import com.ym.mec.biz.dal.config.AdapayNotifyConstants;
+import com.ym.mec.biz.dal.dao.HfMemberDao;
+import com.ym.mec.biz.dal.entity.HfMember;
+import com.ym.mec.biz.service.HfMemberService;
+import com.ym.mec.biz.service.HfMerchantConfigService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.adapay.CorpMemberService;
+import com.ym.mec.thirdparty.adapay.SettleAccountService;
+import com.ym.mec.thirdparty.adapay.entity.AccountInfo;
+import com.ym.mec.thirdparty.adapay.entity.EnterpriseUser;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
+
+@Service
+public class HfMemberServiceImpl extends BaseServiceImpl<Integer, HfMember> implements HfMemberService {
+	
+    @Autowired
+    private HfMemberDao hfMemberDao;
+    
+    @Autowired
+    private SettleAccountService settleAccountService;
+    
+    @Autowired
+    private CorpMemberService corpMemberService;
+    
+    @Autowired
+    private HfMerchantConfigService hfMerchantConfigService;
+
+    @Value("${spring.profiles.active:dev}")
+    private String env;
+
+    @Override
+    public BaseDAO<Integer, HfMember> getDAO() {
+        return hfMemberDao;
+    }
+
+    @Override
+	public HfMember getByMemberId(String memberId) {
+		return hfMemberDao.getByMemberId(memberId);
+	}
+
+	@Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean createMember(HfMember member, File file) throws Exception {
+        HfMember hasMember = hfMemberDao.getByMemberId(member.getMemberId());
+        if (hasMember != null) {
+            throw new BizException("商户号不能与已有商户相同,请核查");
+        }
+        hasMember = hfMemberDao.getByName(member.getName());
+        if (hasMember != null) {
+            throw new BizException("公司名与已有公司名相同,请核查");
+        }
+        
+        Integer tenantId = member.getTenantId();
+        
+        HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(tenantId);
+        if(hfMerchantConfig == null){
+        	throw new BizException("机构[{}]汇付商户信息找不到", tenantId);
+        }
+        
+        EnterpriseUser enterpriseUser = new EnterpriseUser();
+        enterpriseUser.setAddress(member.getAddress());
+        enterpriseUser.setAreaCode(member.getAreaCode());
+        enterpriseUser.setAttachFile(file);
+        enterpriseUser.setBankAcctType(member.getBankAcctType());
+        enterpriseUser.setBankCode(member.getBankCode());
+        enterpriseUser.setBusinessScope(member.getBusinessScope());
+        enterpriseUser.setCardName(member.getCardName());
+        enterpriseUser.setCardNo(member.getCardNo());
+        enterpriseUser.setLegalCertId(member.getLegalCertId());
+        enterpriseUser.setLegalCertIdExpires(member.getLegalCertIdExpires());
+        enterpriseUser.setLegalMp(member.getLegalMp());
+        enterpriseUser.setLegalPerson(member.getLegalPerson());
+        enterpriseUser.setMemberId(member.getMemberId());
+        enterpriseUser.setName(member.getName());
+        
+        if(StringUtils.equals(env, "prod")){
+            enterpriseUser.setNotifyUrl(AdapayNotifyConstants.corp_member_notify_url_prod);
+        }else {
+            enterpriseUser.setNotifyUrl(AdapayNotifyConstants.corp_member_notify_url_test);
+        }
+        enterpriseUser.setProvCode(member.getProvCode());
+        enterpriseUser.setSocialCreditCode(member.getSocialCreditCode());
+        enterpriseUser.setSocialCreditCodeExpires(member.getSocialCreditCodeExpires());
+        
+        corpMemberService.create(hfMerchantConfig.getMerKey(), hfMerchantConfig.getAppId(), enterpriseUser, enterpriseUser.getNotifyUrl());
+
+        Date nowDate = new Date();
+        member.setCreateTime(nowDate);
+        member.setUpdateTime(nowDate);
+        member.setStatus("pending");
+        insert(member);
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateMember(HfMember member, File file) throws Exception {
+        HfMember hfMember = hfMemberDao.get(member.getId());
+        if (hfMember == null) {
+            throw new BizException("商户不存在请核对");
+        }
+
+        Integer tenantId = member.getTenantId();
+        
+        HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(tenantId);
+        if(hfMerchantConfig == null){
+        	throw new BizException("机构[{}]汇付商户信息找不到", tenantId);
+        }
+        
+        EnterpriseUser enterpriseUser = new EnterpriseUser();
+        enterpriseUser.setAddress(member.getAddress());
+        enterpriseUser.setAreaCode(member.getAreaCode());
+        enterpriseUser.setAttachFile(file);
+        enterpriseUser.setBankAcctType(member.getBankAcctType());
+        enterpriseUser.setBankCode(member.getBankCode());
+        enterpriseUser.setBusinessScope(member.getBusinessScope());
+        enterpriseUser.setCardName(member.getCardName());
+        enterpriseUser.setCardNo(member.getCardNo());
+        enterpriseUser.setLegalCertId(member.getLegalCertId());
+        enterpriseUser.setLegalCertIdExpires(member.getLegalCertIdExpires());
+        enterpriseUser.setLegalMp(member.getLegalMp());
+        enterpriseUser.setLegalPerson(member.getLegalPerson());
+        enterpriseUser.setMemberId(member.getMemberId());
+        enterpriseUser.setName(member.getName());
+        
+        if(StringUtils.equals(env, "prod")){
+            enterpriseUser.setNotifyUrl(AdapayNotifyConstants.corp_member_notify_url_prod);
+        }else {
+            enterpriseUser.setNotifyUrl(AdapayNotifyConstants.corp_member_notify_url_test);
+        }
+        
+        enterpriseUser.setProvCode(member.getProvCode());
+        enterpriseUser.setSocialCreditCode(member.getSocialCreditCode());
+        enterpriseUser.setSocialCreditCodeExpires(member.getSocialCreditCodeExpires());
+        
+        corpMemberService.update(hfMerchantConfig.getMerKey(), hfMerchantConfig.getAppId(), enterpriseUser, enterpriseUser.getNotifyUrl());
+
+        Date nowDate = new Date();
+        member.setUpdateTime(nowDate);
+        member.setStatus("pending");
+        if (update(member) <= 0) {
+            throw new BizException("更新商户信息失败,请重试");
+        }
+        
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean mergeSettleAccount(String memberId, AccountInfo accountInfo) throws Exception {
+        HfMember hfMember = hfMemberDao.getByMemberId(memberId);
+        if (!hfMember.getStatus().equals("succeeded")) {
+            throw new BizException("商户审核通过,才能绑定结算卡");
+        }
+        hfMember.setCardNo(accountInfo.getCardId());
+        hfMember.setBankCode(accountInfo.getBankCode());
+        hfMember.setBankAcctType(accountInfo.getBankAcctType());
+        hfMember.setCardName(accountInfo.getCardName());
+        
+        Integer tenantId = hfMember.getTenantId();
+        
+        HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(tenantId);
+        if(hfMerchantConfig == null){
+        	throw new BizException("机构[{}]汇付商户信息找不到", tenantId);
+        }
+
+        //删除结算账户
+        if (StringUtils.isNotBlank(hfMember.getSettleAccountId())) {
+            settleAccountService.delete(hfMerchantConfig.getMerKey(), hfMerchantConfig.getAppId(), memberId, hfMember.getSettleAccountId());
+        }
+
+        //创建结算账户
+        String settleAccountId = settleAccountService.create(hfMerchantConfig.getMerKey(), hfMerchantConfig.getAppId(), accountInfo);
+
+        hfMember.setSettleAccountId(settleAccountId);
+        if (hfMemberDao.update(hfMember) <= 0) {
+            throw new BizException("绑卡失败,请重试");
+        }
+        return true;
+    }
+}

+ 0 - 144
mec-biz/src/main/java/com/ym/mec/biz/service/impl/HfMemberSserviceImpl.java

@@ -1,144 +0,0 @@
-package com.ym.mec.biz.service.impl;
-
-import com.ym.mec.biz.dal.dao.HfMemberDao;
-import com.ym.mec.biz.dal.entity.HfMember;
-import com.ym.mec.biz.service.HfMemberService;
-import com.ym.mec.common.dal.BaseDAO;
-import com.ym.mec.common.exception.BizException;
-import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.thirdparty.adapay.CorpMember;
-import com.ym.mec.thirdparty.adapay.SettleAccount;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.io.File;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-@Service
-public class HfMemberSserviceImpl extends BaseServiceImpl<Integer, HfMember> implements HfMemberService {
-    @Autowired
-    private HfMemberDao hfMemberDao;
-
-    @Override
-    public BaseDAO<Integer, HfMember> getDAO() {
-        return hfMemberDao;
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Map<String, Object> createMember(HfMember member, File file) throws Exception {
-        HfMember hasMember = hfMemberDao.getByMemberId(member.getMemberId());
-        if (hasMember != null) {
-            throw new BizException("商户号不能与已有商户相同,请核查");
-        }
-        hasMember = hfMemberDao.getByName(member.getName());
-        if (hasMember != null) {
-            throw new BizException("公司名与已有公司名相同,请核查");
-        }
-
-        Date nowDate = new Date();
-        member.setCreateTime(nowDate);
-        member.setUpdateTime(nowDate);
-        member.setStatus("pending");
-        insert(member);
-
-        HashMap<String, Object> memberParams = new HashMap<>();
-        memberParams.put("order_no", "corp_mem_" + System.currentTimeMillis());
-        memberParams.put("member_id", member.getMemberId());
-        memberParams.put("name", member.getName());
-        memberParams.put("prov_code", member.getProvCode());
-        memberParams.put("area_code", member.getAreaCode());
-        memberParams.put("social_credit_code", member.getSocialCreditCode());
-        memberParams.put("social_credit_code_expires", member.getSocialCreditCodeExpires());
-        memberParams.put("business_scope", member.getBusinessScope());
-        memberParams.put("legal_person", member.getLegalPerson());
-        memberParams.put("legal_cert_id", member.getLegalCertId());
-        memberParams.put("legal_cert_id_expires", member.getLegalCertIdExpires());
-        memberParams.put("legal_mp", member.getLegalMp());
-        memberParams.put("address", member.getAddress());
-        memberParams.put("zip_code", member.getZipCode());
-        memberParams.put("bank_code", member.getBankCode());
-        memberParams.put("bank_acct_type", "1");
-        memberParams.put("card_no", member.getCardNo());
-        memberParams.put("card_name", member.getName());
-        return CorpMember.executeCreateMember(memberParams, file);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Map<String, Object> updateMember(HfMember member, File file) throws Exception {
-        HfMember hfMember = hfMemberDao.get(member.getId());
-        if (hfMember == null) {
-            throw new BizException("商户不存在请核对");
-        }
-
-        if (!hfMember.getStatus().equals("failed")) {
-            throw new BizException("商户不是审核失败状态不能修改");
-        }
-
-        Date nowDate = new Date();
-        member.setUpdateTime(nowDate);
-        member.setStatus("pending");
-        if (update(member) <= 0) {
-            throw new BizException("更新商户信息失败,请重试");
-        }
-        HashMap<String, Object> memberParams = new HashMap<>();
-        memberParams.put("order_no", "corp_mem_" + System.currentTimeMillis());
-        memberParams.put("member_id", member.getMemberId());
-        memberParams.put("name", member.getName());
-        memberParams.put("prov_code", member.getProvCode());
-        memberParams.put("area_code", member.getAreaCode());
-        memberParams.put("social_credit_code", member.getSocialCreditCode());
-        memberParams.put("social_credit_code_expires", member.getSocialCreditCodeExpires());
-        memberParams.put("business_scope", member.getBusinessScope());
-        memberParams.put("legal_person", member.getLegalPerson());
-        memberParams.put("legal_cert_id", member.getLegalCertId());
-        memberParams.put("legal_cert_id_expires", member.getLegalCertIdExpires());
-        memberParams.put("legal_mp", member.getLegalMp());
-        memberParams.put("address", member.getAddress());
-        memberParams.put("zip_code", member.getZipCode());
-        memberParams.put("bank_code", member.getBankCode());
-        memberParams.put("bank_acct_type", "1");
-        memberParams.put("card_no", member.getCardNo());
-        memberParams.put("card_name", member.getName());
-        return CorpMember.executeCreateMember(memberParams, file);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Map<String, Object> createSettleAccount(String memberId, String cardNo, String bankCode) throws Exception {
-        HfMember hfMember = hfMemberDao.getByMemberId(memberId);
-        if (!hfMember.getStatus().equals("succeeded")) {
-            throw new BizException("商户审核通过,才能绑定结算卡");
-        }
-        hfMember.setCardNo(cardNo);
-        hfMember.setBankCode(bankCode);
-
-        //删除结算账户
-        if (StringUtils.isNotBlank(hfMember.getSettleAccountId())) {
-            SettleAccount.executeDeleteSettleAccount(hfMember.getSettleAccountId(), memberId);
-        }
-
-        Map<String, Object> accountInfo = new HashMap<String, Object>();
-        accountInfo.put("card_id", cardNo);
-        accountInfo.put("card_name", hfMember.getName());
-        accountInfo.put("tel_no", hfMember.getLegalMp());
-        accountInfo.put("bank_code", bankCode);
-        accountInfo.put("bank_acct_type", "1");
-        accountInfo.put("prov_code", hfMember.getProvCode());
-        accountInfo.put("area_code", hfMember.getAreaCode());
-
-        //创建结算账户
-        Map<String, Object> objectMap = SettleAccount.executeCreateSettleAccount(memberId, accountInfo);
-
-        hfMember.setSettleAccountId(objectMap.get("id").toString());
-        if (hfMemberDao.update(hfMember) <= 0) {
-            throw new BizException("绑卡失败,请重试");
-        }
-        return objectMap;
-    }
-}

+ 36 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/HfMerchantConfigServiceImpl.java

@@ -0,0 +1,36 @@
+package com.ym.mec.biz.service.impl;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.biz.dal.dao.HfMerchantConfigDao;
+import com.ym.mec.biz.service.HfMerchantConfigService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.adapay.AdapayInit;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
+
+@Service
+public class HfMerchantConfigServiceImpl extends BaseServiceImpl<Integer, HfMerchantConfig>  implements HfMerchantConfigService,InitializingBean {
+	
+	@Autowired
+	private HfMerchantConfigDao hfMerchantConfigDao;
+
+	@Override
+	public BaseDAO<Integer, HfMerchantConfig> getDAO() {
+		return hfMerchantConfigDao;
+	}
+
+	@Override
+	public void afterPropertiesSet() throws Exception {
+		AdapayInit adapayInit = AdapayInit.getInstance(false, true);
+		adapayInit.initWithMerConfig(hfMerchantConfigDao.findAll(null));
+	}
+
+	@Override
+	public HfMerchantConfig queryByTenantId(Integer tenantId) {
+		return hfMerchantConfigDao.queryByTenantId(tenantId);
+	}
+	
+}

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

@@ -653,7 +653,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         //获取在线人员信息
         RMap<Integer, String> onlineUserCache = getOnlineUserCache(roomUid);
         //删除人员对应直播间编号信息
-        onlineUserCache.forEach((id,s) -> redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, id.toString())).delete());
+        onlineUserCache.forEach((id, s) -> redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, id.toString())).delete());
         //删除直播间所有用户数据
         roomTotalUserCache.delete();
         //删除在线用户数据
@@ -720,21 +720,26 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             Integer userId = Integer.valueOf(userid);
 
             //从房间累计用户信息中查询该用户的信息
-            RMap<Integer, String> roomTotalUser = getTotalUserCache(roomUid);
+            RMap<Integer, String> roomTotalUser = this.getTotalUserCache(roomUid);
             //该房间未查询到用户数据则不处理
-            if (!roomTotalUser.isExists() && !roomTotalUser.containsKey(userId)) {
+            if (!roomTotalUser.isExists()) {
                 return;
             }
+            if (!roomTotalUser.containsKey(userId)) {
+                return;
+            }
+            String userJsonStr = roomTotalUser.get(userId);
+            log.info("opsRoom>>>> userJsonStr  {}", userJsonStr);
             //查询用户数据
-            RoomUserInfoVo userInfo = JSONObject.toJavaObject(JSONObject.parseObject(roomTotalUser.get(userId)), RoomUserInfoVo.class);
+            RoomUserInfoVo userInfo = JSONObject.toJavaObject(JSONObject.parseObject(userJsonStr), RoomUserInfoVo.class);
             //如果有动态观看时间则证明主播开播过,需要计算当前用户观看时长
             if (Objects.nonNull(userInfo.getDynamicLookTime())) {
-                userInfo.setTotalViewTime(getLookMinutes(userInfo.getDynamicLookTime(), userInfo.getTotalViewTime()));
+                userInfo.setTotalViewTime(this.getLookMinutes(userInfo.getDynamicLookTime(), userInfo.getTotalViewTime()));
                 userInfo.setDynamicLookTime(null);
             }
             roomTotalUser.fastPut(userId, JSONObject.toJSONString(userInfo));
             //查询在线人员列表
-            RMap<Integer, String> onlineUserInfo = getOnlineUserCache(roomUid);
+            RMap<Integer, String> onlineUserInfo = this.getOnlineUserCache(roomUid);
             if (!onlineUserInfo.isExists()) {
                 return;
             }

+ 85 - 26
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java

@@ -1,15 +1,84 @@
 package com.ym.mec.biz.service.impl;
 
+import static com.ym.mec.biz.dal.enums.CouponDetailTypeEnum.MEMBER;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import java.util.function.BiPredicate;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.LocalDate;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+
 import com.alibaba.fastjson.JSONArray;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dao.ActivityUserMapperDao;
+import com.ym.mec.biz.dal.dao.MemberRankPrivilegesDao;
+import com.ym.mec.biz.dal.dao.MemberRankSettingDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.TempBuyFreeLiveTheoryCourseDao;
+import com.ym.mec.biz.dal.dao.TempLittleArtistTrainingCampUserRelationDao;
+import com.ym.mec.biz.dal.dao.VipGroupActivityDao;
 import com.ym.mec.biz.dal.dto.Cloud2022ActivityDto;
 import com.ym.mec.biz.dal.dto.MemberPayParamDto;
-import com.ym.mec.biz.dal.dto.RedisKeyConstant;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.*;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.dal.entity.ActivityUserMapper;
+import com.ym.mec.biz.dal.entity.CloudCoachPaymentProgram;
+import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
+import com.ym.mec.biz.dal.entity.MemberRankPrivileges;
+import com.ym.mec.biz.dal.entity.MemberRankSetting;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentCloudCoachPaymentDetails;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
+import com.ym.mec.biz.dal.entity.SysUserCashAccount;
+import com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse;
+import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCampUserRelation;
+import com.ym.mec.biz.dal.entity.VipGroupActivity;
+import com.ym.mec.biz.dal.enums.CouponDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.CourseViewTypeEnum;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
+import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.enums.PeriodEnum;
+import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
+import com.ym.mec.biz.service.CloudCoachPaymentProgramService;
+import com.ym.mec.biz.service.CloudTeacherOrderService;
+import com.ym.mec.biz.service.ContractService;
+import com.ym.mec.biz.service.HfMerchantConfigService;
+import com.ym.mec.biz.service.LiveGoodsService;
+import com.ym.mec.biz.service.MemberFeeSettingService;
+import com.ym.mec.biz.service.MemberRankSettingService;
+import com.ym.mec.biz.service.StudentCloudCoachPaymentDetailsService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.SysCouponCodeService;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.SysUserCashAccountDetailService;
+import com.ym.mec.biz.service.SysUserCashAccountService;
+import com.ym.mec.biz.service.TenantConfigService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.HttpResponseResult;
@@ -17,30 +86,11 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.adapay.Payment;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 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.collections.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.joda.time.LocalDate;
-import org.redisson.api.RBucket;
-import org.redisson.api.RedissonClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Isolation;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-import java.util.function.BiPredicate;
-import java.util.stream.Collectors;
-
-import static com.ym.mec.biz.dal.enums.CouponDetailTypeEnum.MEMBER;
 
 @Service
 public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, MemberRankSetting> implements MemberRankSettingService {
@@ -95,6 +145,9 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
     private TempLittleArtistTrainingCampUserRelationDao tempLittleArtistTrainingCampUserRelationDao;
     @Autowired
     private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
+    
+    @Autowired
+    private HfMerchantConfigService hfMerchantConfigService;
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -507,7 +560,13 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
     //检查订单在第三方是否支付成功
     private void checkOrder(StudentPaymentOrder orderByOrderNo) throws Exception {
         if (StringUtils.isNotBlank(orderByOrderNo.getTransNo())) {
-            Map<String, Object> payment = Payment.queryPayment(orderByOrderNo.getTransNo());
+
+            HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(orderByOrderNo.getTenantId());
+            if(hfMerchantConfig == null){
+            	throw new BizException("机构[{}]汇付商户信息找不到", orderByOrderNo.getTenantId());
+            }
+            
+            Map<String, Object> payment = Payment.queryPayment(orderByOrderNo.getTransNo(), hfMerchantConfig.getMerKey());
             String status = (String) payment.get("status");
             if (status.equals("succeeded")) {
                 throw new BizException("该订单已经支付成功,无法关闭。");

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

@@ -32,544 +32,544 @@ import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.NON_P
 import static com.ym.mec.biz.dal.entity.MusicGroupStudentFee.PaymentStatus.PAID_COMPLETED;
 
 @Service
-public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<Long, MusicGroupPaymentCalenderDetail>  implements MusicGroupPaymentCalenderDetailService {
-	
-	@Autowired
-	private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
-	@Autowired
-	private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
-	@Autowired
-	private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
-	@Autowired
-	private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
-	@Autowired
-	private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
-	@Autowired
-	private MusicGroupDao musicGroupDao;
-	@Autowired
-	private SysConfigDao sysConfigDao;
-	@Autowired
-	private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
-	@Autowired
-	private ActivityUserMapperService activityUserMapperService;
-	@Autowired
-	private SysMessageService sysMessageService;
-	@Autowired
-	private MusicGroupPaymentCalenderMemberService musicGroupPaymentCalenderMemberService;
-	@Autowired
-	private MusicGroupPaymentCalenderActivityService musicGroupPaymentCalenderActivityService;
-	@Autowired
-	private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
-	@Autowired
-	private CloudTeacherOrderService cloudTeacherOrderService;
-	@Autowired
-	private StudentPaymentOrderDao studentPaymentOrderDao;
-	@Autowired
-	private StudentDao studentDao;
-
-	@Override
-	public BaseDAO<Long, MusicGroupPaymentCalenderDetail> getDAO() {
-		return musicGroupPaymentCalenderDetailDao;
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public String openPayment(String ids, Date startPaymentDate, Date deadlinePaymentDate) {
-		if(StringUtils.isEmpty(ids)){
-			throw new BizException("参数校验失败");
-		}
-		//获取可开启缴费列表
-		List<MusicGroupPaymentCalenderDetail> calenderDetails = musicGroupPaymentCalenderDetailDao.queryCanOpenList(ids);
-		if(calenderDetails.size() == 0){
-			return "操作失败:所选学员已开启缴费,或已完成缴费";
-		}
-		int length = ids.split(",").length;
-		Date date = new Date();
-		
-		Long calenderId = calenderDetails.get(0).getMusicGroupPaymentCalenderId();
-		MusicGroupPaymentCalender calender = musicGroupPaymentCalenderService.get(calenderId);
-		calenderDetails.forEach(e->{
-			e.setUpdateTime(date);
-			e.setOpen(1);
-			e.setStartPaymentDate(startPaymentDate);
-			e.setDeadlinePaymentDate(deadlinePaymentDate);
-		});
-		musicGroupPaymentCalenderDetailDao.batchUpdate(calenderDetails);
-		Set<Integer> studentIds = calenderDetails.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-		//推送消息
-		if (calender.getPayUserType() == STUDENT && studentIds.size() > 0) {
-			Map<Integer, String> push = new HashMap<>();
-			for (Integer userId : studentIds) {
-				push.put(userId, userId + "");
-			}
-			MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
-			String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-			String memo = "4?" + baseUrl + "/#/musicGroupRenew?calenderId="+calender.getId()+"&id=" + calender.getMusicGroupId();
-			// 发送续费通知
-			sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
-					null, 0, memo,"STUDENT",musicGroup.getName());
-			//获取未缴费且不是0元的学员列表
-			Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calender.getId(),studentIds));
-			if(studentMaps.size() > 0){
-				sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_WAIT_RENEW_MESSAGE, studentMaps,
-						null, 0, memo, null, musicGroup.getName());
-			}
-		}
-		StringBuffer append = new StringBuffer("操作成功: 成功开启缴费").append(studentIds.size()).append("条,失败").append(length - studentIds.size()).append("条");
-		return append.toString();
-	}
-
-	@Override
-	public List<SimpleUserDto> findMusicGroupStudentWithSubject(String musicGroupId, Integer subjectId) {
-		if(Objects.isNull(musicGroupId)){
-			throw new BizException("请指定乐团");
-		}
-		return musicGroupPaymentCalenderDetailDao.findMusicGroupStudentWithSubject(musicGroupId, subjectId);
-	}
-
-	@Override
-	public void refreshUserMusicGroupPaymentStatusTask() {
-		musicGroupPaymentCalenderDetailDao.refreshUserMusicGroupPaymentStatusTask();
-	}
-
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void batchAdd(MusicGroupPaymentCalender musicGroupPaymentCalender,List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails) {
-		Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect = musicGroupPaymentCalenderStudentDetails.stream().collect(Collectors.groupingBy(e -> e.getUserId()));
-		MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
-		Long musicGroupPaymentCalenderId = musicGroupPaymentCalender.getId();
-		for (Integer studentId : collect.keySet()) {
-			musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
-			musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
-			musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.NON_PAYMENT);
-			List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = collect.get(studentId);
-			BigDecimal totalPrice = calenderStudentDetails.stream().map(e->e.getCourseCurrentPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+public class MusicGroupPaymentCalenderDetailServiceImpl extends BaseServiceImpl<Long, MusicGroupPaymentCalenderDetail> implements MusicGroupPaymentCalenderDetailService {
+
+    @Autowired
+    private MusicGroupPaymentCalenderDetailDao musicGroupPaymentCalenderDetailDao;
+    @Autowired
+    private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
+    @Autowired
+    private MusicGroupPaymentCalenderService musicGroupPaymentCalenderService;
+    @Autowired
+    private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
+    @Autowired
+    private MusicGroupPaymentStudentCourseDetailDao musicGroupPaymentStudentCourseDetailDao;
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+    @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
+    private MusicGroupStudentFeeDao musicGroupStudentFeeDao;
+    @Autowired
+    private ActivityUserMapperService activityUserMapperService;
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
+    private MusicGroupPaymentCalenderMemberService musicGroupPaymentCalenderMemberService;
+    @Autowired
+    private MusicGroupPaymentCalenderActivityService musicGroupPaymentCalenderActivityService;
+    @Autowired
+    private StudentPaymentOrderDetailDao studentPaymentOrderDetailDao;
+    @Autowired
+    private CloudTeacherOrderService cloudTeacherOrderService;
+    @Autowired
+    private StudentPaymentOrderDao studentPaymentOrderDao;
+    @Autowired
+    private StudentDao studentDao;
+
+    @Override
+    public BaseDAO<Long, MusicGroupPaymentCalenderDetail> getDAO() {
+        return musicGroupPaymentCalenderDetailDao;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String openPayment(String ids, Date startPaymentDate, Date deadlinePaymentDate) {
+        if (StringUtils.isEmpty(ids)) {
+            throw new BizException("参数校验失败");
+        }
+        //获取可开启缴费列表
+        List<MusicGroupPaymentCalenderDetail> calenderDetails = musicGroupPaymentCalenderDetailDao.queryCanOpenList(ids);
+        if (calenderDetails.size() == 0) {
+            return "操作失败:所选学员已开启缴费,或已完成缴费";
+        }
+        int length = ids.split(",").length;
+        Date date = new Date();
+
+        Long calenderId = calenderDetails.get(0).getMusicGroupPaymentCalenderId();
+        MusicGroupPaymentCalender calender = musicGroupPaymentCalenderService.get(calenderId);
+        calenderDetails.forEach(e -> {
+            e.setUpdateTime(date);
+            e.setOpen(1);
+            e.setStartPaymentDate(startPaymentDate);
+            e.setDeadlinePaymentDate(deadlinePaymentDate);
+        });
+        musicGroupPaymentCalenderDetailDao.batchUpdate(calenderDetails);
+        Set<Integer> studentIds = calenderDetails.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+        //推送消息
+        if (calender.getPayUserType() == STUDENT && studentIds.size() > 0) {
+            Map<Integer, String> push = new HashMap<>();
+            for (Integer userId : studentIds) {
+                push.put(userId, userId + "");
+            }
+            MusicGroup musicGroup = musicGroupDao.get(calender.getMusicGroupId());
+            String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+            String memo = "4?" + baseUrl + "/#/musicGroupRenew?calenderId=" + calender.getId() + "&id=" + calender.getMusicGroupId();
+            // 发送续费通知
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
+                    null, 0, memo, "STUDENT", musicGroup.getName());
+            //获取未缴费且不是0元的学员列表
+            Map<Integer, String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calender.getId(), studentIds));
+            if (studentMaps.size() > 0) {
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_WAIT_RENEW_MESSAGE, studentMaps,
+                        null, 0, memo, null, musicGroup.getName());
+            }
+        }
+        StringBuffer append = new StringBuffer("操作成功: 成功开启缴费").append(studentIds.size()).append("条,失败").append(length - studentIds.size()).append("条");
+        return append.toString();
+    }
+
+    @Override
+    public List<SimpleUserDto> findMusicGroupStudentWithSubject(String musicGroupId, Integer subjectId) {
+        if (Objects.isNull(musicGroupId)) {
+            throw new BizException("请指定乐团");
+        }
+        return musicGroupPaymentCalenderDetailDao.findMusicGroupStudentWithSubject(musicGroupId, subjectId);
+    }
+
+    @Override
+    public void refreshUserMusicGroupPaymentStatusTask() {
+        musicGroupPaymentCalenderDetailDao.refreshUserMusicGroupPaymentStatusTask();
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchAdd(MusicGroupPaymentCalender musicGroupPaymentCalender, List<MusicGroupPaymentCalenderStudentDetail> musicGroupPaymentCalenderStudentDetails) {
+        Map<Integer, List<MusicGroupPaymentCalenderStudentDetail>> collect = musicGroupPaymentCalenderStudentDetails.stream().collect(Collectors.groupingBy(e -> e.getUserId()));
+        MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
+        Long musicGroupPaymentCalenderId = musicGroupPaymentCalender.getId();
+        for (Integer studentId : collect.keySet()) {
+            musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
+            musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
+            musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.NON_PAYMENT);
+            List<MusicGroupPaymentCalenderStudentDetail> calenderStudentDetails = collect.get(studentId);
+            BigDecimal totalPrice = calenderStudentDetails.stream().map(e -> e.getCourseCurrentPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
 //			musicGroupPaymentCalenderDetail.setExpectAmount(totalPrice);
-			if(musicGroupPaymentCalender.getStatus() != AUDITING){
-				if (totalPrice.doubleValue() == 0d) {
-					musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
-					musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + 1);
+            if (musicGroupPaymentCalender.getStatus() != AUDITING) {
+                if (totalPrice.doubleValue() == 0d) {
+                    musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
+                    musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + 1);
 //					musicGroupPaymentCalenderDetail.setActualAmount(totalPrice);
-				}
-			}
-			musicGroupPaymentCalenderDetail.setMusicGroupId(musicGroupPaymentCalender.getMusicGroupId());
-			musicGroupPaymentCalenderDetail.setUserId(studentId);
-			musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
-			musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
-			musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
-			musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
-		}
-		musicGroupPaymentCalender.setExpectNum(collect.keySet().size());
-		musicGroupPaymentCalenderService.update(musicGroupPaymentCalender);
-		//给学员推送缴费通知
-		if(musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN){
-			musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalenderId,musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId()),collect.keySet());
-		}
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void batchAdd(String batchNo, Set<Integer> userIdList) {
-		
-		List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
-		if(musicGroupPaymentCalenderList == null || musicGroupPaymentCalenderList.size() == 0){
-			throw new BizException("操作失败:缴费项目不存在");
-		}
-		MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderList.get(0);
-		String musicGroupId = musicGroupPaymentCalender.getMusicGroupId();
-		// 所有缴费项目已完成排课才能创建下一个缴费项目
-		List<String> batchNoList = new ArrayList<>();
-		batchNoList.add(batchNo);
+                }
+            }
+            musicGroupPaymentCalenderDetail.setMusicGroupId(musicGroupPaymentCalender.getMusicGroupId());
+            musicGroupPaymentCalenderDetail.setUserId(studentId);
+            musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
+            musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
+            musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
+            musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
+        }
+        musicGroupPaymentCalender.setExpectNum(collect.keySet().size());
+        musicGroupPaymentCalenderService.update(musicGroupPaymentCalender);
+        //给学员推送缴费通知
+        if (musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN) {
+            musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalenderId, musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId()), collect.keySet());
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchAdd(String batchNo, Set<Integer> userIdList) {
+
+        List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList = musicGroupPaymentCalenderDao.findByBatchNo(batchNo);
+        if (musicGroupPaymentCalenderList == null || musicGroupPaymentCalenderList.size() == 0) {
+            throw new BizException("操作失败:缴费项目不存在");
+        }
+        MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderList.get(0);
+        String musicGroupId = musicGroupPaymentCalender.getMusicGroupId();
+        // 所有缴费项目已完成排课才能创建下一个缴费项目
+        List<String> batchNoList = new ArrayList<>();
+        batchNoList.add(batchNo);
 		/*String orignBatchNo = musicGroupPaymentStudentCourseDetailDao.getUnUseBatchNoWithStudentAndCourseTypeAndCourseMinutes(musicGroupId, null, null,batchNoList);
 		if (StringUtils.isNoneBlank(orignBatchNo)) {
 			throw new BizException("当前乐团存在未排课的缴费项目,请先完成排课再操作");
 		}*/
-		//获取欠费学员列表
-		List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(musicGroupId, new ArrayList<>(userIdList),null);
-		if(noPaymentUserIds.size() > 0){
-			throw new BizException("操作失败:有欠费的学员不允许创建缴费");
-		}
-		//获取缴费状态在审核中或者已拒绝的缴费项目的学员
-		String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroupId,batchNo);
-		if(StringUtils.isNotEmpty(studentIds)){
-			for (Integer integer : userIdList) {
-				if(studentIds.contains(integer.toString())){
-					throw new BizException("操作失败:所选学员有待审核或已拒绝的缴费项目");
-				}
-			}
-		}
-		Long musicGroupPaymentCalenderId = musicGroupPaymentCalender.getId();
-
-		if(musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY){
-			throw new BizException("操作失败:报名缴费项不允许添加学员");
-		}
-		if (musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.AUDITING
-				|| musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.REJECT) {
-			throw new BizException("当前缴费状态不能添加学生");
-		}
-		//判断学生是否已存在
-		Set<Integer> userList = musicGroupPaymentCalenderDetailDao.queryStudentIds(musicGroupPaymentCalenderId);
-		if(Collections.disjoint(userList, userIdList) == false){
-			throw new BizException("操作失败:包含已存在的学员");
-		}
-		
-		List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(musicGroupPaymentCalenderId);
-		
-		if (courseSettingsList != null && courseSettingsList.size() > 0) {
-			List<StudentSubTotalCourseTimesDto> studentCourseTypeDtos = musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTimes(musicGroupId);
-
-			Set<String> courseTypes = new HashSet<String>();
-			for (StudentSubTotalCourseTimesDto dto : studentCourseTypeDtos) {
-				if (userIdList.contains(dto.getUserId())) {
-					courseTypes.addAll(dto.getMapDtos().stream().filter(t -> t.getValue() > 0).map(t -> t.getKey()).collect(Collectors.toSet()));
-				}
-			}
-
-			for (MusicGroupPaymentCalenderCourseSettings mgpccs : courseSettingsList) {
-				if (courseTypes.contains(mgpccs.getCourseType().name())) {
-					throw new BizException("操作失败:存在未排完的[{}]", mgpccs.getCourseType().getMsg());
-				}
-			}
-		}
-
-		Date date = new Date();
-		MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
-		Map<Integer,Long> userMap = new HashMap<>();
-		List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList = new ArrayList<MusicGroupPaymentCalenderDetail>();
-		//创建缴费明细
-		MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
-
-		List<MusicGroupPaymentCalenderActivity> calenderActivities = musicGroupPaymentCalenderActivityService.findByCalenderId(musicGroupPaymentCalenderId);
-		MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberService.findByCalenderId(musicGroupPaymentCalenderId);
-		for(Integer studentId : userIdList){
-			musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
-			musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
-			musicGroupPaymentCalenderDetail.setCreateTime(date);
-			if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
-				musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
-			} else {
-				musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.NON_PAYMENT);
-			}
-			musicGroupPaymentCalenderDetail.setUpdateTime(date);
-			musicGroupPaymentCalenderDetail.setUserId(studentId);
-			musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
-			musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
-			musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
-			musicGroupPaymentCalenderDetailList.add(musicGroupPaymentCalenderDetail);
-			if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
-				// 添加会员
-				if(calenderMember != null){
-					CloudTeacherOrder cloudTeacherOrder = new CloudTeacherOrder();
-					cloudTeacherOrder.setOrganId(musicGroup.getOrganId());
-					cloudTeacherOrder.setType(calenderMember.getPeriod());
-					cloudTeacherOrder.setAmount(BigDecimal.ZERO);
-					cloudTeacherOrder.setStudentId(studentId);
-					cloudTeacherOrder.setLevel(calenderMember.getMemberRankSettingId());
-					cloudTeacherOrder.setTime(calenderMember.getNum().intValue());
-					cloudTeacherOrder.setStatus(1);
-					cloudTeacherOrder.setRemark("缴费项目0元新增学员");
-					cloudTeacherOrder.setMusicGroupId(musicGroupId);
-					cloudTeacherOrderService.save(cloudTeacherOrder,calenderMember.getAutoActivationFlag());
-				}
-				//添加小课包
-				if(calenderActivities != null && calenderActivities.size() > 0){
-					List<ActivityUserMapper> activityUserMapperList = new ArrayList<>();
-					for (MusicGroupPaymentCalenderActivity calenderActivity : calenderActivities) {
-						ActivityUserMapper activityUserMapper = new ActivityUserMapper();
-						activityUserMapper.setActualPrice(BigDecimal.ZERO);
-						activityUserMapper.setActivityId(calenderActivity.getActivityId());
-						Student student = studentDao.get(studentId);
-						activityUserMapper.setUserId(studentId);
-						activityUserMapper.setTeacherId(student.getTeacherId());
-						if("网管课".equals(calenderActivity.getCategoryName())){
-							activityUserMapper.setPracticeFlag(1);
-						}else {
-							activityUserMapper.setVipFlag(1);
-						}
-						activityUserMapperList.add(activityUserMapper);
-					}
-					activityUserMapperService.batchInsert(activityUserMapperList);
-				}
-			}
-		}
-
-		if (musicGroupPaymentCalenderDetailList.size() > 0) {
-			musicGroupPaymentCalenderDetailDao.batchInsert(musicGroupPaymentCalenderDetailList);
-			musicGroupPaymentCalenderDetailList.stream().forEach(e-> userMap.put(e.getUserId(),e.getId()));
-		}
-		//更新预计缴费人数
-		musicGroupPaymentCalender.setExpectNum(musicGroupPaymentCalender.getExpectNum() + userIdList.size());
-		musicGroupPaymentCalender.setUpdateTime(date);
-		if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
-			musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + userIdList.size());
-		}
-		musicGroupPaymentCalenderService.update(musicGroupPaymentCalender);
-
-		//创建学生课排课分钟数
-		if(courseSettingsList != null && courseSettingsList.size() > 0){
-			List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<>();
-			MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;
-			for(Integer studentId : userIdList){
-				for(MusicGroupPaymentCalenderCourseSettings courseSettings : courseSettingsList){
-					if (courseSettings.getCourseTotalMinuties() == null || courseSettings.getCourseTotalMinuties() == 0) {
-						continue;
-					}
-					musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
-					musicGroupPaymentStudentCourseDetail.setCourseType(courseSettings.getCourseType());
-					musicGroupPaymentStudentCourseDetail.setCreateTime(date);
-					musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
-					musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(userMap.get(studentId));
-					musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSettings.getCourseTotalMinuties());
-					musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSettings.getCourseOriginalPrice());
-					musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSettings.getCourseCurrentPrice());
-					musicGroupPaymentStudentCourseDetail.setUpdateTime(date);
-					musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
-					musicGroupPaymentStudentCourseDetail.setUserId(studentId);
-					musicGroupPaymentStudentCourseDetailList.add(musicGroupPaymentStudentCourseDetail);
-				}
-			}
-			if(musicGroupPaymentStudentCourseDetailList.size() > 0){
-				musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetailList);
-			}
-		}
-		//给学员推送缴费通知
-		if (musicGroupPaymentCalender.getPayUserType() == STUDENT && musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN) {
-			musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalender.getId(),
-					musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId()),userIdList);
-		}
-	}
-
-	@Override
-	public List<FeeStudentDto> queryFeeStudents(String musicGroupId,String search,Integer subjectId) {
-		return musicGroupStudentFeeDao.queryFeeStudents(musicGroupId,search,subjectId);
-	}
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public void batchDel(String musicGroupPaymentCalenderDetailIds) {
-		List<MusicGroupPaymentCalenderDetail> details = musicGroupPaymentCalenderDetailDao.queryListByIds(musicGroupPaymentCalenderDetailIds);
-		if(details == null || details.size() == 0){
-			throw new BizException("删除失败: 数据不可为空");
-		}
-		Long musicGroupPaymentCalenderId = details.get(0).getMusicGroupPaymentCalenderId();
-		MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderDao.get(musicGroupPaymentCalenderId);
-		
-		if(musicGroupPaymentCalender == null){
-			throw new BizException("查询缴费项目失败[{}]", musicGroupPaymentCalender);
-		}
-		
-		long count = 0;
-		if (musicGroupPaymentCalender.getPayUserType() == STUDENT) {
-			// 是否已缴费
-			count = details.stream().filter(e -> e.getPaymentStatus() != NON_PAYMENT).count();
-			if (count > 0) {
-				throw new BizException("删除失败: 存在已缴费的学员");
-			}
-		}
-		List<Long> musicGroupPaymentCalenderDetailIdList = new ArrayList<Long>();
-		for(String s : musicGroupPaymentCalenderDetailIds.split(",")){
-			musicGroupPaymentCalenderDetailIdList.add(Long.parseLong(s));
-		}
-		//是否已排课
-		List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = musicGroupPaymentStudentCourseDetailDao.queryByMusicGroupPaymentStudentCourseDetailId(musicGroupPaymentCalenderDetailIdList);
-		count = musicGroupPaymentStudentCourseDetailList.stream().filter(e -> e.getUsedCourseMinutes() > 0).count();
-		if(count > 0){
-			throw new BizException("删除失败:存在已排课的学员");
-		}
-		
-		int currentNum = musicGroupPaymentCalender.getExpectNum() - details.size();
-		musicGroupPaymentCalender.setExpectNum(currentNum < 0 ? 0 : currentNum);
-		musicGroupPaymentCalender.setUpdateTime(new Date());
-		musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
-
-		musicGroupPaymentCalenderDetailDao.batchDel(musicGroupPaymentCalenderDetailIds);
-		musicGroupPaymentStudentCourseDetailDao.deleteByMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetailIdList);
-	}
-
-	@Override
-	public PageInfo<MusicArrearageStudentDto> queryArrearageStudents(ArrearageStudentsQueryInfo queryInfo) {
-		PageInfo<MusicArrearageStudentDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<>();
-		MapUtil.populateMap(params, queryInfo);
-
-		List<MusicArrearageStudentDto> dataList = null;
-		int count = musicGroupPaymentCalenderDetailDao.countArrearageStudents(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = musicGroupPaymentCalenderDetailDao.queryArrearageStudents(params);
-		}
-		if (count == 0) {
-			dataList = new ArrayList<>();
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
-	}
-
-	@Override
-	public List<MusicGroup> getNoPaymentStudentMusicGroups(String organIdsStr) {
-		Set<Integer> organIds = null;
-		if(StringUtils.isNotBlank(organIdsStr)){
-			organIds = Arrays.stream(organIdsStr.split(",")).map(Integer::new).collect(Collectors.toSet());
-		}
-		return musicGroupPaymentCalenderDetailDao.getNoPaymentStudentMusicGroups(organIds, TenantContextHolder.getTenantId());
-	}
-
-	@Override
-	public void pushWaitRenewMessage(Long calenderId, String studentIds) {
-		List<MusicGroupPaymentCalenderDetail> calenderDetails = musicGroupPaymentCalenderDetailDao.queryNoPaymentCanPushByCalenderId(calenderId,studentIds);
-		if(calenderDetails == null || calenderDetails.size() == 0){
-			throw new BizException("发送失败:没有可以发送缴费提醒的学员");
-		}
-		Set<Integer> studentIdList = calenderDetails.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
-		MusicGroupPaymentCalender paymentCalender = musicGroupPaymentCalenderDao.get(calenderId);
-		//未缴费
-		Map<Integer,String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calenderId,studentIdList));
-		MusicGroup musicGroup = musicGroupDao.get(paymentCalender.getMusicGroupId());
-		String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
-		String memo = "4?" + baseUrl + "/#/musicGroupRenew?calenderId="+calenderId+"&id=" + musicGroup.getId();
-		Map<Integer, String> push = new HashMap<>();
-		for (Integer userId : studentIdList) {
-			push.put(userId, userId.toString());
-		}
-		// 发送续费通知
-		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
-				null, 0, memo, "STUDENT", musicGroup.getName());
-		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_WAIT_RENEW_MESSAGE, studentMaps,
-				null, 0, memo, null, musicGroup.getName());
-	}
+        //获取欠费学员列表
+        List<Integer> noPaymentUserIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(musicGroupId, new ArrayList<>(userIdList), null);
+        if (noPaymentUserIds.size() > 0) {
+            throw new BizException("操作失败:有欠费的学员不允许创建缴费");
+        }
+        //获取缴费状态在审核中或者已拒绝的缴费项目的学员
+        String studentIds = musicGroupPaymentCalenderDao.queryCalenderStudentIds(musicGroupId, batchNo);
+        if (StringUtils.isNotEmpty(studentIds)) {
+            for (Integer integer : userIdList) {
+                if (studentIds.contains(integer.toString())) {
+                    throw new BizException("操作失败:所选学员有待审核或已拒绝的缴费项目");
+                }
+            }
+        }
+        Long musicGroupPaymentCalenderId = musicGroupPaymentCalender.getId();
+
+        if (musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY) {
+            throw new BizException("操作失败:报名缴费项不允许添加学员");
+        }
+        if (musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.AUDITING
+                || musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.REJECT) {
+            throw new BizException("当前缴费状态不能添加学生");
+        }
+        //判断学生是否已存在
+        Set<Integer> userList = musicGroupPaymentCalenderDetailDao.queryStudentIds(musicGroupPaymentCalenderId);
+        if (Collections.disjoint(userList, userIdList) == false) {
+            throw new BizException("操作失败:包含已存在的学员");
+        }
+
+        List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao.getWithPaymentCalender(musicGroupPaymentCalenderId);
+
+        if (courseSettingsList != null && courseSettingsList.size() > 0) {
+            List<StudentSubTotalCourseTimesDto> studentCourseTypeDtos = musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTimes(musicGroupId);
+
+            Set<String> courseTypes = new HashSet<String>();
+            for (StudentSubTotalCourseTimesDto dto : studentCourseTypeDtos) {
+                if (userIdList.contains(dto.getUserId())) {
+                    courseTypes.addAll(dto.getMapDtos().stream().filter(t -> t.getValue() > 0).map(t -> t.getKey()).collect(Collectors.toSet()));
+                }
+            }
+
+            for (MusicGroupPaymentCalenderCourseSettings mgpccs : courseSettingsList) {
+                if (courseTypes.contains(mgpccs.getCourseType().name())) {
+                    throw new BizException("操作失败:存在未排完的[{}]", mgpccs.getCourseType().getMsg());
+                }
+            }
+        }
+
+        Date date = new Date();
+        MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = null;
+        Map<Integer, Long> userMap = new HashMap<>();
+        List<MusicGroupPaymentCalenderDetail> musicGroupPaymentCalenderDetailList = new ArrayList<MusicGroupPaymentCalenderDetail>();
+        //创建缴费明细
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+
+        List<MusicGroupPaymentCalenderActivity> calenderActivities = musicGroupPaymentCalenderActivityService.findByCalenderId(musicGroupPaymentCalenderId);
+        MusicGroupPaymentCalenderMember calenderMember = musicGroupPaymentCalenderMemberService.findByCalenderId(musicGroupPaymentCalenderId);
+        for (Integer studentId : userIdList) {
+            musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
+            musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
+            musicGroupPaymentCalenderDetail.setCreateTime(date);
+            if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
+                musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.PAID_COMPLETED);
+            } else {
+                musicGroupPaymentCalenderDetail.setPaymentStatus(PaymentStatus.NON_PAYMENT);
+            }
+            musicGroupPaymentCalenderDetail.setUpdateTime(date);
+            musicGroupPaymentCalenderDetail.setUserId(studentId);
+            musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
+            musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
+            musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
+            musicGroupPaymentCalenderDetailList.add(musicGroupPaymentCalenderDetail);
+            if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
+                // 添加会员
+                if (calenderMember != null) {
+                    CloudTeacherOrder cloudTeacherOrder = new CloudTeacherOrder();
+                    cloudTeacherOrder.setOrganId(musicGroup.getOrganId());
+                    cloudTeacherOrder.setType(calenderMember.getPeriod());
+                    cloudTeacherOrder.setAmount(BigDecimal.ZERO);
+                    cloudTeacherOrder.setStudentId(studentId);
+                    cloudTeacherOrder.setLevel(calenderMember.getMemberRankSettingId());
+                    cloudTeacherOrder.setTime(calenderMember.getNum().intValue());
+                    cloudTeacherOrder.setStatus(1);
+                    cloudTeacherOrder.setRemark("缴费项目0元新增学员");
+                    cloudTeacherOrder.setMusicGroupId(musicGroupId);
+                    cloudTeacherOrderService.save(cloudTeacherOrder, calenderMember.getAutoActivationFlag());
+                }
+                //添加小课包
+                if (calenderActivities != null && calenderActivities.size() > 0) {
+                    List<ActivityUserMapper> activityUserMapperList = new ArrayList<>();
+                    for (MusicGroupPaymentCalenderActivity calenderActivity : calenderActivities) {
+                        ActivityUserMapper activityUserMapper = new ActivityUserMapper();
+                        activityUserMapper.setActualPrice(BigDecimal.ZERO);
+                        activityUserMapper.setActivityId(calenderActivity.getActivityId());
+                        Student student = studentDao.get(studentId);
+                        activityUserMapper.setUserId(studentId);
+                        activityUserMapper.setTeacherId(student.getTeacherId());
+                        if ("网管课".equals(calenderActivity.getCategoryName())) {
+                            activityUserMapper.setPracticeFlag(1);
+                        } else {
+                            activityUserMapper.setVipFlag(1);
+                        }
+                        activityUserMapperList.add(activityUserMapper);
+                    }
+                    activityUserMapperService.batchInsert(activityUserMapperList);
+                }
+            }
+        }
+
+        if (musicGroupPaymentCalenderDetailList.size() > 0) {
+            musicGroupPaymentCalenderDetailDao.batchInsert(musicGroupPaymentCalenderDetailList);
+            musicGroupPaymentCalenderDetailList.stream().forEach(e -> userMap.put(e.getUserId(), e.getId()));
+        }
+        //更新预计缴费人数
+        musicGroupPaymentCalender.setExpectNum(musicGroupPaymentCalender.getExpectNum() + userIdList.size());
+        musicGroupPaymentCalender.setUpdateTime(date);
+        if (musicGroupPaymentCalender.getCurrentTotalAmount().compareTo(BigDecimal.ZERO) == 0) {
+            musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + userIdList.size());
+        }
+        musicGroupPaymentCalenderService.update(musicGroupPaymentCalender);
+
+        //创建学生课排课分钟数
+        if (courseSettingsList != null && courseSettingsList.size() > 0) {
+            List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = new ArrayList<>();
+            MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = null;
+            for (Integer studentId : userIdList) {
+                for (MusicGroupPaymentCalenderCourseSettings courseSettings : courseSettingsList) {
+                    if (courseSettings.getCourseTotalMinuties() == null || courseSettings.getCourseTotalMinuties() == 0) {
+                        continue;
+                    }
+                    musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
+                    musicGroupPaymentStudentCourseDetail.setCourseType(courseSettings.getCourseType());
+                    musicGroupPaymentStudentCourseDetail.setCreateTime(date);
+                    musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalenderId);
+                    musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(userMap.get(studentId));
+                    musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSettings.getCourseTotalMinuties());
+                    musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSettings.getCourseOriginalPrice());
+                    musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSettings.getCourseCurrentPrice());
+                    musicGroupPaymentStudentCourseDetail.setUpdateTime(date);
+                    musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
+                    musicGroupPaymentStudentCourseDetail.setUserId(studentId);
+                    musicGroupPaymentStudentCourseDetailList.add(musicGroupPaymentStudentCourseDetail);
+                }
+            }
+            if (musicGroupPaymentStudentCourseDetailList.size() > 0) {
+                musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetailList);
+            }
+        }
+        //给学员推送缴费通知
+        if (musicGroupPaymentCalender.getPayUserType() == STUDENT && musicGroupPaymentCalender.getStatus() == PaymentCalenderStatusEnum.OPEN) {
+            musicGroupPaymentCalenderService.pushWaitRenewMessage(musicGroupPaymentCalender.getId(),
+                    musicGroupDao.get(musicGroupPaymentCalender.getMusicGroupId()), userIdList);
+        }
+    }
+
+    @Override
+    public List<FeeStudentDto> queryFeeStudents(String musicGroupId, String search, Integer subjectId) {
+        return musicGroupStudentFeeDao.queryFeeStudents(musicGroupId, search, subjectId);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchDel(String musicGroupPaymentCalenderDetailIds) {
+        List<MusicGroupPaymentCalenderDetail> details = musicGroupPaymentCalenderDetailDao.queryListByIds(musicGroupPaymentCalenderDetailIds);
+        if (details == null || details.size() == 0) {
+            throw new BizException("删除失败: 数据不可为空");
+        }
+        Long musicGroupPaymentCalenderId = details.get(0).getMusicGroupPaymentCalenderId();
+        MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderDao.get(musicGroupPaymentCalenderId);
+
+        if (musicGroupPaymentCalender == null) {
+            throw new BizException("查询缴费项目失败[{}]", musicGroupPaymentCalender);
+        }
+
+        long count = 0;
+        if (musicGroupPaymentCalender.getPayUserType() == STUDENT) {
+            // 是否已缴费
+            count = details.stream().filter(e -> e.getPaymentStatus() != NON_PAYMENT).count();
+            if (count > 0) {
+                throw new BizException("删除失败: 存在已缴费的学员");
+            }
+        }
+        List<Long> musicGroupPaymentCalenderDetailIdList = new ArrayList<Long>();
+        for (String s : musicGroupPaymentCalenderDetailIds.split(",")) {
+            musicGroupPaymentCalenderDetailIdList.add(Long.parseLong(s));
+        }
+        //是否已排课
+        List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetailList = musicGroupPaymentStudentCourseDetailDao.queryByMusicGroupPaymentStudentCourseDetailId(musicGroupPaymentCalenderDetailIdList);
+        count = musicGroupPaymentStudentCourseDetailList.stream().filter(e -> e.getUsedCourseMinutes() > 0).count();
+        if (count > 0) {
+            throw new BizException("删除失败:存在已排课的学员");
+        }
+
+        int currentNum = musicGroupPaymentCalender.getExpectNum() - details.size();
+        musicGroupPaymentCalender.setExpectNum(currentNum < 0 ? 0 : currentNum);
+        musicGroupPaymentCalender.setUpdateTime(new Date());
+        musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
+
+        musicGroupPaymentCalenderDetailDao.batchDel(musicGroupPaymentCalenderDetailIds);
+        musicGroupPaymentStudentCourseDetailDao.deleteByMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetailIdList);
+    }
+
+    @Override
+    public PageInfo<MusicArrearageStudentDto> queryArrearageStudents(ArrearageStudentsQueryInfo queryInfo) {
+        PageInfo<MusicArrearageStudentDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<MusicArrearageStudentDto> dataList = null;
+        int count = musicGroupPaymentCalenderDetailDao.countArrearageStudents(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = musicGroupPaymentCalenderDetailDao.queryArrearageStudents(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public List<MusicGroup> getNoPaymentStudentMusicGroups(String organIdsStr) {
+        Set<Integer> organIds = null;
+        if (StringUtils.isNotBlank(organIdsStr)) {
+            organIds = Arrays.stream(organIdsStr.split(",")).map(Integer::new).collect(Collectors.toSet());
+        }
+        return musicGroupPaymentCalenderDetailDao.getNoPaymentStudentMusicGroups(organIds, TenantContextHolder.getTenantId());
+    }
+
+    @Override
+    public void pushWaitRenewMessage(Long calenderId, String studentIds) {
+        List<MusicGroupPaymentCalenderDetail> calenderDetails = musicGroupPaymentCalenderDetailDao.queryNoPaymentCanPushByCalenderId(calenderId, studentIds);
+        if (calenderDetails == null || calenderDetails.size() == 0) {
+            throw new BizException("发送失败:没有可以发送缴费提醒的学员");
+        }
+        Set<Integer> studentIdList = calenderDetails.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
+        MusicGroupPaymentCalender paymentCalender = musicGroupPaymentCalenderDao.get(calenderId);
+        //未缴费
+        Map<Integer, String> studentMaps = MapUtil.convertMybatisMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentAndNotZeroStudent(calenderId, studentIdList));
+        MusicGroup musicGroup = musicGroupDao.get(paymentCalender.getMusicGroupId());
+        String baseUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
+        String memo = "4?" + baseUrl + "/#/musicGroupRenew?calenderId=" + calenderId + "&id=" + musicGroup.getId();
+        Map<Integer, String> push = new HashMap<>();
+        for (Integer userId : studentIdList) {
+            push.put(userId, userId.toString());
+        }
+        // 发送续费通知
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PUSH_WAIT_RENEW_MESSAGE, push,
+                null, 0, memo, "STUDENT", musicGroup.getName());
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.STUDENT_SMS_WAIT_RENEW_MESSAGE, studentMaps,
+                null, 0, memo, null, musicGroup.getName());
+    }
 
     @Override
     public PageInfo<MusicGroupPaymentCalenderDetailDto> queryDetailPage(MusicCalenderDetailQueryInfo queryInfo) {
-		PageInfo<MusicGroupPaymentCalenderDetailDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<String, Object>();
-		MapUtil.populateMap(params, queryInfo);
-
-		List<MusicGroupPaymentCalenderDetailDto> dataList = null;
-		int count = musicGroupPaymentCalenderDetailDao.countDetailPage(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = musicGroupPaymentCalenderDetailDao.queryDetailPage(params);
-			List<StudentPaymentOrderDetail> orderDetail = studentPaymentOrderDetailDao.findByCalenderId(dataList.get(0).getMusicGroupPaymentCalenderId());
-			Map<Integer, List<StudentPaymentOrderDetail>> orderDetailMap = orderDetail.stream().collect(Collectors.groupingBy(StudentPaymentOrderDetail::getUserId));
-			for (MusicGroupPaymentCalenderDetailDto row : dataList) {
-				List<StudentPaymentOrderDetail> orderDetailList = orderDetailMap.get(row.getUserId());
-				if(orderDetailList != null && orderDetailList.size() > 0){
-					BigDecimal totalAmount = orderDetailList.stream().map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-					//辅件
-					BigDecimal accessoriesAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.ACCESSORIES).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-					row.setAccessoriesAmount(accessoriesAmount);
-					//会员金额
-					BigDecimal cloudAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.CLOUD_TEACHER || e.getType() == OrderDetailTypeEnum.CLOUD_TEACHER_PLUS).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-					row.setCloudAmount(cloudAmount);
-					//乐器
-					BigDecimal musicalAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.MUSICAL).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-					row.setMusicalAmount(musicalAmount);
-					//乐保
-					BigDecimal maintenanceAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.MAINTENANCE).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-					row.setMaintenanceAmount(maintenanceAmount);
-					//活动
-					BigDecimal activityAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.PRACTICE || e.getType() == OrderDetailTypeEnum.VIP).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
-					row.setActivityAmount(activityAmount);
-
-					totalAmount = totalAmount.subtract(accessoriesAmount).subtract(cloudAmount).subtract(musicalAmount).subtract(maintenanceAmount).subtract(activityAmount);
-					row.setCourseAmount(totalAmount);
-				}
-			}
-		}
-		if (count == 0) {
-			dataList = new ArrayList<>();
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
+        PageInfo<MusicGroupPaymentCalenderDetailDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<MusicGroupPaymentCalenderDetailDto> dataList = null;
+        int count = musicGroupPaymentCalenderDetailDao.countDetailPage(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = musicGroupPaymentCalenderDetailDao.queryDetailPage(params);
+            List<StudentPaymentOrderDetail> orderDetail = studentPaymentOrderDetailDao.findByCalenderId(dataList.get(0).getMusicGroupPaymentCalenderId());
+            Map<Integer, List<StudentPaymentOrderDetail>> orderDetailMap = orderDetail.stream().collect(Collectors.groupingBy(StudentPaymentOrderDetail::getUserId));
+            for (MusicGroupPaymentCalenderDetailDto row : dataList) {
+                List<StudentPaymentOrderDetail> orderDetailList = orderDetailMap.get(row.getUserId());
+                if (orderDetailList != null && orderDetailList.size() > 0) {
+                    BigDecimal totalAmount = orderDetailList.stream().map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    //辅件
+                    BigDecimal accessoriesAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.ACCESSORIES).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    row.setAccessoriesAmount(accessoriesAmount);
+                    //会员金额
+                    BigDecimal cloudAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.CLOUD_TEACHER || e.getType() == OrderDetailTypeEnum.CLOUD_TEACHER_PLUS).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    row.setCloudAmount(cloudAmount);
+                    //乐器
+                    BigDecimal musicalAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.MUSICAL).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    row.setMusicalAmount(musicalAmount);
+                    //乐保
+                    BigDecimal maintenanceAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.MAINTENANCE).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    row.setMaintenanceAmount(maintenanceAmount);
+                    //活动
+                    BigDecimal activityAmount = orderDetailList.stream().filter(e -> e.getType() == OrderDetailTypeEnum.PRACTICE || e.getType() == OrderDetailTypeEnum.VIP).map(e -> e.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    row.setActivityAmount(activityAmount);
+
+                    totalAmount = totalAmount.subtract(accessoriesAmount).subtract(cloudAmount).subtract(musicalAmount).subtract(maintenanceAmount).subtract(activityAmount);
+                    row.setCourseAmount(totalAmount);
+                }
+            }
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
     }
 
     @Override
-	@Transactional(rollbackFor = Exception.class)
+    @Transactional(rollbackFor = Exception.class)
     public void addCalenderDetail(StudentPaymentOrder studentPaymentOrder, StudentRegistration studentRegistration) {
-		Date nowDate = new Date();
-		Integer tenantId = studentPaymentOrder.getTenantId();
-		//缴费详情 calender detail
-		MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderService.get(studentPaymentOrder.getCalenderId());
-		Long currentPaymentCalenderId = studentPaymentOrder.getCalenderId();
-		//查询缴费项目关联的订单
-		List<StudentPaymentOrder> orderList = studentPaymentOrderDao.findByCalenderId(currentPaymentCalenderId,studentPaymentOrder.getUserId());
-		if(orderList.size() == 1){
-			// 更新实际缴费人数
-			if (musicGroupPaymentCalender.getActualNum() == null) {
-				musicGroupPaymentCalender.setActualNum(1);
-			} else {
-				musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + 1);
-			}
-			if(musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY){
-				if (musicGroupPaymentCalender.getExpectNum() == null) {
-					musicGroupPaymentCalender.setExpectNum(1);
-				} else {
-					musicGroupPaymentCalender.setExpectNum(musicGroupPaymentCalender.getExpectNum() + 1);
-				}
-			}
-			musicGroupPaymentCalender.setUpdateTime(nowDate);
-			musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
-		}
-
-		MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = musicGroupPaymentCalenderDetailDao.findByCalenderIdAndUserId(currentPaymentCalenderId,studentPaymentOrder.getUserId());
-		if(musicGroupPaymentCalenderDetail == null){
-			musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
-			musicGroupPaymentCalenderDetail.setTenantId(tenantId);
-			musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
-			musicGroupPaymentCalenderDetail.setUserId(studentPaymentOrder.getUserId());
-			musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
-			musicGroupPaymentCalenderDetail.setPaymentStatus(PAID_COMPLETED);
-			musicGroupPaymentCalenderDetail.setPayTime(nowDate);
-			musicGroupPaymentCalenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
-			musicGroupPaymentCalenderDetail.setUseInCourse(0);
-			musicGroupPaymentCalenderDetail.setOpen(1);
-			musicGroupPaymentCalenderDetail.setUserStatus(null);
-			musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
-			musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
-			musicGroupPaymentCalenderDetail.setCreateTime(nowDate);
-			musicGroupPaymentCalenderDetail.setUpdateTime(nowDate);
-			musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
-		}else {
-			musicGroupPaymentCalenderDetail.setPaymentStatus(PAID_COMPLETED);
-			musicGroupPaymentCalenderDetail.setPayTime(nowDate);
-			musicGroupPaymentCalenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
-			musicGroupPaymentCalenderDetailDao.update(musicGroupPaymentCalenderDetail);
-		}
-
-		//续费项目加学员时就生成了课程时长,报名项目在缴费成功后才需要添加课程时长
-		if(musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY){
-			List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = new ArrayList<>();
-			List<String> orderDetailTypes = studentPaymentOrderDetailDao.getOrderDetailType(studentPaymentOrder.getId());
-			List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao
-					.getWithPaymentCalender(musicGroupPaymentCalender.getId());
-			for (MusicGroupPaymentCalenderCourseSettings courseSetting : courseSettingsList) {
-				if (musicGroupPaymentCalender.getPayUserType().equals(MusicGroupPaymentCalender.PayUserType.STUDENT)
-						&& !orderDetailTypes.contains(courseSetting.getCourseType().getCode())) {
-					continue;
-				}
-				if (courseSetting.getCourseTotalMinuties() == null || courseSetting.getCourseTotalMinuties() == 0) {
-					continue;
-				}
-				MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
-				musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
-				musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetail.getId());
-				musicGroupPaymentStudentCourseDetail.setUserId(studentPaymentOrder.getUserId());
-				musicGroupPaymentStudentCourseDetail.setCourseType(courseSetting.getCourseType());
-				musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSetting.getCourseTotalMinuties());
-				musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSetting.getCourseOriginalPrice());
-				musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSetting.getCourseCurrentPrice());
-				musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
-				musicGroupPaymentStudentCourseDetail.setCreateTime(nowDate);
-				musicGroupPaymentStudentCourseDetail.setUpdateTime(nowDate);
-				musicGroupPaymentStudentCourseDetail.setTenantId(tenantId);
-				musicGroupPaymentStudentCourseDetails.add(musicGroupPaymentStudentCourseDetail);
-			}
-			if (musicGroupPaymentStudentCourseDetails.size() > 0) {
-				musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetails);
-			}
-		}
+        Date nowDate = new Date();
+        Integer tenantId = studentPaymentOrder.getTenantId();
+        //缴费详情 calender detail
+        MusicGroupPaymentCalender musicGroupPaymentCalender = musicGroupPaymentCalenderService.get(studentPaymentOrder.getCalenderId());
+        Long currentPaymentCalenderId = studentPaymentOrder.getCalenderId();
+        //查询缴费项目关联的订单
+        List<StudentPaymentOrder> orderList = studentPaymentOrderDao.findByCalenderId(currentPaymentCalenderId, studentPaymentOrder.getUserId());
+        if (orderList.size() == 1) {
+            // 更新实际缴费人数
+            if (musicGroupPaymentCalender.getActualNum() == null) {
+                musicGroupPaymentCalender.setActualNum(1);
+            } else {
+                musicGroupPaymentCalender.setActualNum(musicGroupPaymentCalender.getActualNum() + 1);
+            }
+            if (musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY) {
+                if (musicGroupPaymentCalender.getExpectNum() == null) {
+                    musicGroupPaymentCalender.setExpectNum(1);
+                } else {
+                    musicGroupPaymentCalender.setExpectNum(musicGroupPaymentCalender.getExpectNum() + 1);
+                }
+            }
+            musicGroupPaymentCalender.setUpdateTime(nowDate);
+            musicGroupPaymentCalenderDao.update(musicGroupPaymentCalender);
+        }
+
+        MusicGroupPaymentCalenderDetail musicGroupPaymentCalenderDetail = musicGroupPaymentCalenderDetailDao.findByCalenderIdAndUserId(currentPaymentCalenderId, studentPaymentOrder.getUserId());
+        if (musicGroupPaymentCalenderDetail == null) {
+            musicGroupPaymentCalenderDetail = new MusicGroupPaymentCalenderDetail();
+            musicGroupPaymentCalenderDetail.setTenantId(tenantId);
+            musicGroupPaymentCalenderDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
+            musicGroupPaymentCalenderDetail.setUserId(studentPaymentOrder.getUserId());
+            musicGroupPaymentCalenderDetail.setResponsibleUserId(musicGroupPaymentCalender.getOperator());
+            musicGroupPaymentCalenderDetail.setPaymentStatus(PAID_COMPLETED);
+            musicGroupPaymentCalenderDetail.setPayTime(nowDate);
+            musicGroupPaymentCalenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
+            musicGroupPaymentCalenderDetail.setUseInCourse(0);
+            musicGroupPaymentCalenderDetail.setOpen(1);
+            musicGroupPaymentCalenderDetail.setUserStatus(null);
+            musicGroupPaymentCalenderDetail.setDeadlinePaymentDate(musicGroupPaymentCalender.getDeadlinePaymentDate());
+            musicGroupPaymentCalenderDetail.setStartPaymentDate(musicGroupPaymentCalender.getStartPaymentDate());
+            musicGroupPaymentCalenderDetail.setCreateTime(nowDate);
+            musicGroupPaymentCalenderDetail.setUpdateTime(nowDate);
+            musicGroupPaymentCalenderDetailDao.insert(musicGroupPaymentCalenderDetail);
+        } else {
+            musicGroupPaymentCalenderDetail.setPaymentStatus(PAID_COMPLETED);
+            musicGroupPaymentCalenderDetail.setPayTime(nowDate);
+            musicGroupPaymentCalenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
+            musicGroupPaymentCalenderDetailDao.update(musicGroupPaymentCalenderDetail);
+        }
+
+        //续费项目加学员时就生成了课程时长,报名项目在缴费成功后才需要添加课程时长
+        if (musicGroupPaymentCalender.getPaymentType() == MusicGroupPaymentCalender.PaymentType.MUSIC_APPLY) {
+            List<MusicGroupPaymentStudentCourseDetail> musicGroupPaymentStudentCourseDetails = new ArrayList<>();
+            List<String> orderDetailTypes = studentPaymentOrderDetailDao.getOrderDetailType(studentPaymentOrder.getId());
+            List<MusicGroupPaymentCalenderCourseSettings> courseSettingsList = musicGroupPaymentCalenderCourseSettingsDao
+                    .getWithPaymentCalender(musicGroupPaymentCalender.getId());
+            for (MusicGroupPaymentCalenderCourseSettings courseSetting : courseSettingsList) {
+                if (musicGroupPaymentCalender.getPayUserType().equals(MusicGroupPaymentCalender.PayUserType.STUDENT)
+                        && !orderDetailTypes.contains(courseSetting.getCourseType().getCode())) {
+                    continue;
+                }
+                if (courseSetting.getCourseTotalMinuties() == null || courseSetting.getCourseTotalMinuties() == 0) {
+                    continue;
+                }
+                MusicGroupPaymentStudentCourseDetail musicGroupPaymentStudentCourseDetail = new MusicGroupPaymentStudentCourseDetail();
+                musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderId(musicGroupPaymentCalender.getId());
+                musicGroupPaymentStudentCourseDetail.setMusicGroupPaymentCalenderDetailId(musicGroupPaymentCalenderDetail.getId());
+                musicGroupPaymentStudentCourseDetail.setUserId(studentPaymentOrder.getUserId());
+                musicGroupPaymentStudentCourseDetail.setCourseType(courseSetting.getCourseType());
+                musicGroupPaymentStudentCourseDetail.setTotalCourseMinutes(courseSetting.getCourseTotalMinuties());
+                musicGroupPaymentStudentCourseDetail.setCourseOriginalPrice(courseSetting.getCourseOriginalPrice());
+                musicGroupPaymentStudentCourseDetail.setCourseCurrentPrice(courseSetting.getCourseCurrentPrice());
+                musicGroupPaymentStudentCourseDetail.setUsedCourseMinutes(0);
+                musicGroupPaymentStudentCourseDetail.setCreateTime(nowDate);
+                musicGroupPaymentStudentCourseDetail.setUpdateTime(nowDate);
+                musicGroupPaymentStudentCourseDetail.setTenantId(tenantId);
+                musicGroupPaymentStudentCourseDetails.add(musicGroupPaymentStudentCourseDetail);
+            }
+            if (musicGroupPaymentStudentCourseDetails.size() > 0) {
+                musicGroupPaymentStudentCourseDetailDao.batchInsert(musicGroupPaymentStudentCourseDetails);
+            }
+        }
     }
 }

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

@@ -947,7 +947,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 amount,
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                 chargeInfo.getTitle(),
                 chargeInfo.getTitle(),
@@ -1078,7 +1078,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 amount,
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + studentPaymentOrder.getOrderNo(),
                 "续费",
                 "乐团续费",
@@ -1353,7 +1353,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 amount,
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                 orderSubject,
                 orderSubject,

+ 71 - 148
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrderPayOpsServiceImpl.java

@@ -1,39 +1,54 @@
 package com.ym.mec.biz.service.impl;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.function.BiPredicate;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import org.apache.commons.lang3.StringUtils;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.DigestUtils;
+
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dto.PaymentParam;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.TenantConfig;
 import com.ym.mec.biz.dal.entity.TenantOrderRecord;
 import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.service.HfMerchantConfigService;
+import com.ym.mec.biz.service.OrderPayOpsService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.biz.service.TenantConfigService;
+import com.ym.mec.biz.service.TenantOrderRecordService;
+import com.ym.mec.biz.service.TenantPaymentOrderService;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.thirdparty.adapay.ConfigInit;
 import com.ym.mec.thirdparty.adapay.Payment;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.http.HttpUtil;
 import com.ym.mec.util.json.JsonUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.redisson.api.RBucket;
-import org.redisson.api.RedissonClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.util.DigestUtils;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.function.BiPredicate;
-import java.util.function.Consumer;
-import java.util.function.Function;
 
 /**
  * @author hgw
@@ -49,6 +64,10 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
     private TenantPaymentOrderService tenantPaymentOrderService;
     @Autowired
     private TenantOrderRecordService tenantOrderRecordService;
+    
+    @Autowired
+    private HfMerchantConfigService hfMerchantConfigService;
+    
     @Autowired
     private RedissonClient redissonClient;
     @Autowired
@@ -62,9 +81,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
     private static final BiPredicate<Object, DealStatusEnum> predicate = (o, s) -> Objects.nonNull(o) && !DealStatusEnum.ING.equals(s);
 
     @Override
-    public Map<String, Object> executePayment(BigDecimal amount, String orderNo, String payChannel, String returnUrl, String orderSubject, String orderBody, String sign, String code, String platform) throws Exception {
-        PaymentParam payParam = new PaymentParam(amount, orderNo, payChannel, returnUrl,
-                orderSubject, orderBody, sign, code, platform);
+    public Map<String, Object> executePayment(PaymentParam payParam) throws Exception {
         log.info("executePayment >>>>> {}", JSON.toJSONString(payParam));
         if (payParam.getAmount() == null) {
             throw new Exception("PaymentParam query is null");
@@ -74,13 +91,11 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         //返回值
         Map<String, Object> payment;
 
-        if (WrapperUtil.checkStr(platform, tenantPlatform)) {
+        if (WrapperUtil.checkStr(payParam.getPlatform(), tenantPlatform)) {
             //tenant 机构开通、续费付款、 cloudTeacherOrder 团练宝激活支付、tenantRecharge 机构充值
             payment = tenantPlatformOrder(payParam);
             //主动延迟检查订单
             delayCheckTenant();
-        } else if (platform.equals("teacher")) {
-            payment = teacher(payParam);
         } else {
             //如果以上操作都没有 则应该是这一个,因为老代码就是这样写的。
             payment = student(payParam);
@@ -90,13 +105,21 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
     }
 
     private void checkSing(PaymentParam param) {
+        
+        //查询商户支付账户
+        HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(param.getTenantId());
+        if(hfMerchantConfig == null){
+        	throw new BizException("请配置机构的汇付商户信息");
+        }
         Map<String, Object> signParams = new LinkedHashMap<>();
-        signParams.put("appId", ConfigInit.appId);
+        signParams.put("appId", hfMerchantConfig.getAppId());
         signParams.put("amount", param.getAmount().setScale(2, RoundingMode.HALF_UP));
         signParams.put("orderNo", param.getOrderNo());
+        signParams.put("notifyUrl", param.getNotifyUrl());
+        signParams.put("returnUrl", param.getReturnUrl());
         signParams.put("orderSubject", param.getOrderSubject());
         signParams.put("orderBody", param.getOrderBody());
-        signParams.put("wxAppId", ConfigInit.wxAppId);
+        signParams.put("wxAppId", hfMerchantConfig.getWxAppId());
         String originalStr = JSONObject.toJSONString(signParams);
         String newSign = DigestUtils.md5DigestAsHex(originalStr.getBytes());
         if (!newSign.equals(param.getSign())) {
@@ -110,7 +133,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         //查询订单
         TenantOrderRecord tenantOrderRecord = tenantOrderRecordService.getOne(new WrapperUtil<TenantOrderRecord>()
                 .hasEq("order_no_", payParam.getOrderNo()).queryWrapper());
-        if (Objects.isNull(tenantOrderRecord)) {
+        if (Objects.isNull(tenantOrderRecord) || tenantOrderRecord.getTenantId().intValue() != payParam.getTenantId()) {
             throw new BizException("订单不存在");
         }
         if (tenantOrderRecord.getOrderState() != 0) {
@@ -118,7 +141,6 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         }
         //获取支付数据
         Map<String, Object> payment;
-        payParam.setTenantId(tenantOrderRecord.getTenantId());
         try {
             payment = checkOrderAndGetParam(payParam,
                     tenantOrderRecord,
@@ -159,10 +181,10 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
     private Map<String, Object> student(PaymentParam payParam) throws Exception {
         Map<String, Object> payment;
         StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findOrderByOrderNo(payParam.getOrderNo());
-        if (Objects.isNull(studentPaymentOrder)) {
+        if (Objects.isNull(studentPaymentOrder) || studentPaymentOrder.getTenantId().intValue() != payParam.getTenantId()) {
             throw new BizException("订单不存在");
         }
-        payParam.setTenantId(studentPaymentOrder.getTenantId());
+        
         payment = checkOrderAndGetParam(payParam,
                 studentPaymentOrder,
                 StudentPaymentOrder::getStatus,
@@ -185,12 +207,20 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         Date createTime = dateFunc.apply(clazz);
         //校验订单是否超时
         String timeExpire = checkOrderTimeOut(createTime);
+        
+        //查询商户支付账户
+        HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(payParam.getTenantId());
+        if(hfMerchantConfig == null){
+        	throw new BizException("请配置机构的汇付商户信息");
+        }
+        
         //初始化支付数据
-        Map<String, Object> paymentParams = getPaymentParam(payParam, clazz);
+        Map<String, Object> paymentParams = getPaymentParam(payParam, clazz, hfMerchantConfig.getPlatformPayeeMemberId());
         paymentParams.put("time_expire", timeExpire);
-        paymentParams.put("expend", getExpend(payParam));
+        paymentParams.put("expend", getExpend(hfMerchantConfig, payParam));
+        paymentParams.put("notify_url", payParam.getNotifyUrl());
         //向第三方发起支付,获取第三方的支付的信息
-        Map<String, Object> payment = Payment.executePayment(paymentParams);
+        Map<String, Object> payment = Payment.executePayment(hfMerchantConfig.getAppId(), hfMerchantConfig.getMerKey(), paymentParams);
         log.info("executePayment create order param >>>>> {}", JSON.toJSONString(payment));
         String transNo = (String) payment.get("id");
         //修改流水
@@ -223,26 +253,26 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         action.accept(clazz);
     }
 
-    private Map<String, Object> getExpend(PaymentParam payParam) throws Exception {
+    private Map<String, Object> getExpend(HfMerchantConfig hfMerchantConfig, PaymentParam payParam) throws Exception {
         Map<String, Object> expendParams = new HashMap<>(5);
         String openId = "";
         if (payParam.getPayChannel().equals("wx_pub")) {
             //微信支付则获取openId
-            openId = getOpenId(payParam.getCode());
+            openId = getOpenId(hfMerchantConfig, payParam.getCode());
         }
         expendParams.put("open_id", openId);
         expendParams.put("is_raw", "1");
-        expendParams.put("callback_url", payParam.getReturnUrl());
+        //expendParams.put("callback_url", payParam.getReturnUrl());
         expendParams.put("limit_pay", "1");
         return expendParams;
     }
 
-    private String getOpenId(String code) throws Exception {
+    private String getOpenId(HfMerchantConfig hfMerchantConfig, String code) throws Exception {
         String openId;
         if (code == null || code.isEmpty()) {
             throw new BizException("微信支付请先授权");
         }
-        String wxMpOAuth2AccessTokenUrl = String.format(ConfigInit.wxMpOAuth2AccessTokenUrl, ConfigInit.wxAppId, ConfigInit.wxAppSecret, code);
+        String wxMpOAuth2AccessTokenUrl = String.format(ConfigInit.wxMpOAuth2AccessTokenUrl, hfMerchantConfig.getWxAppId(), hfMerchantConfig.getWxAppSecret(), code);
         Map<String, String> weChatRes = JSON.parseObject(HttpUtil.get(wxMpOAuth2AccessTokenUrl, new HashMap<>()), Map.class);
         if (!weChatRes.containsKey("openid")) {
             throw new BizException("授权失败,请重新授权");
@@ -251,9 +281,8 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         return openId;
     }
 
-    private <T> Map<String, Object> getPaymentParam(PaymentParam payParam, T clazz) {
+    private <T> Map<String, Object> getPaymentParam(PaymentParam payParam, T clazz, String platformAccount) {
         Map<String, Object> paymentParams = new HashMap<>();
-        paymentParams.put("app_id", ConfigInit.appId);
         paymentParams.put("order_no", payParam.getOrderNo());
         paymentParams.put("pay_channel", payParam.getPayChannel());
         paymentParams.put("pay_amt", payParam.getAmount().setScale(2, RoundingMode.HALF_UP));
@@ -293,7 +322,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
     	        		throw new BizException("分部[{}]没有设置收款账号", config.getParanValue());
     	        	}*/
 
-                    String platformAccount = sysConfigDao.findConfigValue(SysConfigService.PLATFORM_PAYEE_ACCOUNT);
+                    //String platformAccount = sysConfigDao.findConfigValue(SysConfigService.PLATFORM_PAYEE_ACCOUNT);
 
                     if (StringUtils.isBlank(platformAccount)) {
                         throw new BizException("平台收款账户查询失败");
@@ -368,111 +397,5 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         });
     }
 
-    static class PaymentParam {
-        private BigDecimal amount;
-        private String orderNo;
-        private String payChannel;
-        private String returnUrl;
-        private String orderSubject;
-        private String orderBody;
-        private String sign;
-        private String code;
-        private String platform;
-        private Integer tenantId;
-
-        PaymentParam(BigDecimal amount, String orderNo, String payChannel, String returnUrl, String orderSubject,
-                     String orderBody, String sign, String code, String platform) {
-            this.amount = amount;
-            this.orderNo = orderNo;
-            this.payChannel = payChannel;
-            this.returnUrl = returnUrl;
-            this.orderSubject = orderSubject;
-            this.orderBody = orderBody;
-            this.sign = sign;
-            this.code = code;
-            this.platform = platform;
-        }
-
-        public BigDecimal getAmount() {
-            return amount;
-        }
-
-        public void setAmount(BigDecimal amount) {
-            this.amount = amount;
-        }
-
-        public String getOrderNo() {
-            return orderNo;
-        }
-
-        public void setOrderNo(String orderNo) {
-            this.orderNo = orderNo;
-        }
-
-        public String getPayChannel() {
-            return payChannel;
-        }
-
-        public void setPayChannel(String payChannel) {
-            this.payChannel = payChannel;
-        }
-
-        public String getReturnUrl() {
-            return returnUrl;
-        }
-
-        public void setReturnUrl(String returnUrl) {
-            this.returnUrl = returnUrl;
-        }
-
-        public String getOrderSubject() {
-            return orderSubject;
-        }
-
-        public void setOrderSubject(String orderSubject) {
-            this.orderSubject = orderSubject;
-        }
-
-        public String getOrderBody() {
-            return orderBody;
-        }
-
-        public void setOrderBody(String orderBody) {
-            this.orderBody = orderBody;
-        }
-
-        public String getSign() {
-            return sign;
-        }
-
-        public void setSign(String sign) {
-            this.sign = sign;
-        }
-
-        public String getCode() {
-            return code;
-        }
-
-        public void setCode(String code) {
-            this.code = code;
-        }
-
-        public String getPlatform() {
-            return platform;
-        }
-
-        public void setPlatform(String platform) {
-            this.platform = platform;
-        }
-
-        public Integer getTenantId() {
-            return tenantId;
-        }
-
-        public void setTenantId(Integer tenantId) {
-            this.tenantId = tenantId;
-        }
-    }
-
 }
 

+ 22 - 38
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrganizationServiceImpl.java

@@ -1,26 +1,9 @@
 package com.ym.mec.biz.service.impl;
 
-import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.EDUCATION;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-import com.ym.mec.biz.service.*;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dao.OrganizationDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.dao.TenantContractTemplateDao;
 import com.ym.mec.biz.dal.dao.TenantInfoDao;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.Organization;
@@ -30,10 +13,24 @@ import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.SixPlusGradeEnum;
 import com.ym.mec.biz.dal.page.EducationBaseQueryInfo;
+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.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import static com.ym.mec.biz.dal.enums.SysUserRoleEnum.EDUCATION;
 
 @Service
 public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organization> implements OrganizationService {
@@ -47,7 +44,7 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 	@Autowired
 	private EmployeeDao employeeDao;
 	@Autowired
-	private SysUserFeignService sysUserFeignService;
+	private SysUserService sysUserService;
 	@Autowired
 	private SysEmployeePositionService employeePositionService;
 	@Autowired
@@ -66,10 +63,7 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 
 	@Override
 	public List<Organization> queryEmployeeOrgan(){
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if(sysUser == null){
-			throw new BizException("获取用户信息失败");
-		}
+		SysUser sysUser = sysUserService.getUser();
 		String organIds = this.getEmployeeOrgan(sysUser.getId(), "", sysUser.getIsSuperAdmin());
 		return organizationDao.queryEmployeeOrgan(organIds);
 	}
@@ -139,20 +133,13 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 
 	@Override
 	public String getEmployeeOrgan(Object organIds) {
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			throw new BizException("用户信息获取失败");
-		}
+		SysUser sysUser = sysUserService.getUser();
 		return this.getEmployeeOrgan(sysUser.getId(),organIds == null?"":organIds.toString(),sysUser.getIsSuperAdmin());
 	}
 
 	@Override
 	public String getTeacherOrgan() {
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			throw new BizException("用户信息获取失败");
-		}
-		Teacher teacher = teacherDao.get(sysUser.getId());
+		Teacher teacher = teacherDao.get(sysUserService.getUserId());
 		String organIds = teacher.getTeacherOrganId() + "";
 		if(StringUtils.isNotBlank(teacher.getFlowOrganRange())){
 			organIds = organIds + "," + teacher.getFlowOrganRange();
@@ -177,10 +164,7 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
 
 	@Override
     public <T extends EducationBaseQueryInfo> T onlyEducation(T queryInfo) {
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if (sysUser == null) {
-			throw new BizException("用户信息获取失败");
-		}
+		SysUser sysUser = sysUserService.getUser();
 		queryInfo.setOrganIds(this.getEmployeeOrgan(sysUser.getId(),queryInfo.getOrganIds(),sysUser.getIsSuperAdmin()));
 		Boolean onlyForRole = employeePositionService.onlyForRole(EDUCATION, sysUser.getId(), sysUser.getIsSuperAdmin());
 		//如果当前用户只有教务老师角色,那么只能看到他所管理的课程组的信息
@@ -223,11 +207,11 @@ public class OrganizationServiceImpl extends BaseServiceImpl<Integer, Organizati
     public Long add(Organization organization) {
 		long insert = organizationDao.insert(organization);
 		TenantInfo tenantInfo = tenantInfoDao.selectById(organization.getTenantId());
-		SysUser sysUser = sysUserFeignService.queryUserInfo();
-		if(!sysUser.getId().equals(tenantInfo.getUserId())){
+		Integer userId = sysUserService.getUserId();
+		if(!userId.equals(tenantInfo.getUserId())){
 			updateOrganId(tenantInfo.getUserId(),organization.getId());
 		}
-		updateOrganId(sysUser.getId(),organization.getId());
+		updateOrganId(userId,organization.getId());
 		return insert;
     }
 

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

@@ -36,6 +36,7 @@ import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.dal.enums.OrderTypeEnum;
 import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
 import com.ym.mec.biz.service.GoodsService;
+import com.ym.mec.biz.service.HfMerchantConfigService;
 import com.ym.mec.biz.service.PayService;
 import com.ym.mec.biz.service.SellOrderService;
 import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
@@ -46,6 +47,7 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.redis.service.RedisCache;
 import com.ym.mec.thirdparty.adapay.ConfigInit;
 import com.ym.mec.thirdparty.adapay.Payment;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import com.ym.mec.thirdparty.yqpay.YqPayUtil;
 import com.ym.mec.util.date.DateUtil;
 
@@ -64,6 +66,9 @@ public class PayServiceImpl implements PayService {
     private GoodsService goodsService;
     
     @Autowired
+    private HfMerchantConfigService hfMerchantConfigService;
+    
+    @Autowired
     private SysConfigDao sysConfigDao;
     @Autowired
     private SysPaymentConfigService sysPaymentConfigService;
@@ -89,17 +94,16 @@ public class PayServiceImpl implements PayService {
         
         Integer tenantId = studentPaymentOrder.getTenantId();
         
+        HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(tenantId);
+        if(hfMerchantConfig == null){
+        	throw new BizException("机构[{}]汇付商户信息找不到", tenantId);
+        }
+        
         if(tenantId != 1){//非大雅机构
         	
-        	SysPaymentConfig sysPaymentConfig = sysPaymentConfigService.findPaymentConfigByOrganId(organId);
-        	
-        	if(sysPaymentConfig == null || StringUtils.isBlank(sysPaymentConfig.getHfMerNo())){
-        		throw new BizException("分部[{}]没有设置收款账号", organId);
-        	}
-        	
         	Date date = new Date();
         	
-        	String merNo = sysPaymentConfig.getHfMerNo();
+        	String merNo = "0";
         	
         	StudentPaymentRouteOrder studentPaymentRouteOrder = new StudentPaymentRouteOrder();
             studentPaymentRouteOrder.setOrderNo(orderNo);
@@ -110,12 +114,13 @@ public class PayServiceImpl implements PayService {
             studentPaymentRouteOrder.setMerNo(merNo);
             studentPaymentRouteOrder.setSaleAmount(BigDecimal.ZERO);
             studentPaymentRouteOrder.setServiceAmount(amount);
+            studentPaymentRouteOrder.setTenantId(tenantId);
             studentPaymentRouteOrder.setCreateTime(date);
             studentPaymentRouteOrder.setUpdateTime(date);
             studentPaymentRouteOrderDao.insert(studentPaymentRouteOrder);
             
             Map<String, Object> unionPay = new HashMap<>();
-            Map<String, Object> payMap = Payment.getPayMap(amount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody);
+            Map<String, Object> payMap = Payment.getPayMap(hfMerchantConfig, amount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody);
             
             PaymentChannelEnum payType = PaymentChannelEnum.ADAPAY;
 
@@ -129,8 +134,8 @@ public class PayServiceImpl implements PayService {
 		Date date = new Date();
         
         //如果当前是买的小课/网管课
-		if (studentPaymentOrder != null && studentPaymentOrder.getType() == OrderTypeEnum.SMALL_CLASS_TO_BUY || studentPaymentOrder.getType() == OrderTypeEnum.PRACTICE_GROUP_BUY
-				|| studentPaymentOrder.getType() == OrderTypeEnum.PRACTICE_GROUP_RENEW) {
+		if (studentPaymentOrder != null && (studentPaymentOrder.getType() == OrderTypeEnum.SMALL_CLASS_TO_BUY || studentPaymentOrder.getType() == OrderTypeEnum.PRACTICE_GROUP_BUY
+				|| studentPaymentOrder.getType() == OrderTypeEnum.PRACTICE_GROUP_RENEW)) {
 			
 			//忽略的分部
 			List<Integer> ignoreOrganList = Arrays.asList(4);
@@ -157,12 +162,13 @@ public class PayServiceImpl implements PayService {
 	            studentPaymentRouteOrder.setMerNo(merNo);
 	            studentPaymentRouteOrder.setSaleAmount(BigDecimal.ZERO);
 	            studentPaymentRouteOrder.setServiceAmount(amount);
+	            studentPaymentRouteOrder.setTenantId(tenantId);
 	            studentPaymentRouteOrder.setCreateTime(date);
 	            studentPaymentRouteOrder.setUpdateTime(date);
 	            studentPaymentRouteOrderDao.insert(studentPaymentRouteOrder);
 	            
 	            Map<String, Object> unionPay = new HashMap<>();
-	            Map<String, Object> payMap = Payment.getPayMap(amount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody);
+	            Map<String, Object> payMap = Payment.getPayMap(hfMerchantConfig, amount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody);
 	            
 	            PaymentChannelEnum payType = PaymentChannelEnum.ADAPAY;
 
@@ -354,6 +360,7 @@ public class PayServiceImpl implements PayService {
     	            studentPaymentRouteOrder.setMerNo(goodsSellReceiptMerNo);
     	            studentPaymentRouteOrder.setSaleAmount(BigDecimal.ZERO);
     	            studentPaymentRouteOrder.setServiceAmount(subCashAmount);
+    	            studentPaymentRouteOrder.setTenantId(tenantId);
     	            studentPaymentRouteOrder.setCreateTime(date);
     	            studentPaymentRouteOrder.setUpdateTime(date);
     	            studentPaymentRouteOrderDao.insert(studentPaymentRouteOrder);
@@ -389,7 +396,7 @@ public class PayServiceImpl implements PayService {
             routeScaleDtos = noUsePaymentConfig(amount); //款项都收到平台商户
         }
 
-        //根据费用类型
+        //根据费用类型,mark
         if (routeScaleDtos == null) {
             routeScaleDtos = getTypeRouteChannel(organId, orderNo, amount, balanceAmount);
         }
@@ -416,7 +423,7 @@ public class PayServiceImpl implements PayService {
         	routeScaleDtos.add(routeScaleDtoForGoodsSell);
         }*/
         
-        Map<String, Object> map = getPayRoute(amount, balanceAmount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody, routeScaleDtos, subCashAmount);
+        Map<String, Object> map = getPayRoute(hfMerchantConfig, amount, balanceAmount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody, routeScaleDtos, subCashAmount);
         
 		if (routeScaleDtoForGoodsSell != null) {
 			String routingMerNos = (String) map.get("routingMerNos");
@@ -436,41 +443,22 @@ public class PayServiceImpl implements PayService {
     }
 
     @Override
-	public Map<String, Object> getPayToPlatformMap(PaymentChannelEnum paymentChannel, BigDecimal amount, BigDecimal balanceAmount, String orderNo, String notifyUrl, String returnUrl,
+	public Map<String, Object> getPayToPlatformMap(Integer tenantId, PaymentChannelEnum paymentChannel, BigDecimal amount, BigDecimal balanceAmount, String orderNo, String notifyUrl, String returnUrl,
 			String orderSubject, String orderBody) throws Exception {
     	
-    	/*SysConfig config = sysConfigDao.findByParamName("platform_collection_organ");
-        if (Objects.isNull(config)) {
-            throw new BizException("平台收款账户没有设置[platform_collection_organ]");
+        HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(tenantId);
+        if(hfMerchantConfig == null){
+        	throw new BizException("机构[{}]汇付商户信息找不到", tenantId);
         }
     	
-    	SysPaymentConfig sysPaymentConfig = sysPaymentConfigService.findPaymentConfigByOrganId(Integer.parseInt(config.getParanValue()));
-    	
-    	if(sysPaymentConfig == null || StringUtils.isBlank(sysPaymentConfig.getHfMerNo())){
-    		throw new BizException("分部[{}]没有设置收款账号", config.getParanValue());
-    	}
-    	
-    	String payeeMerNo = sysPaymentConfig.getHfMerNo();*/
-    	
-    	String payeeMerNo = sysConfigDao.findConfigValue(SysConfigService.PLATFORM_PAYEE_ACCOUNT);
-    	
-    	if(StringUtils.isBlank(payeeMerNo)){
-    		throw new BizException("平台收款账户查询失败");
-    	}
-    	
-        Map<String, Object> payMap = null;
-        
-    	if (paymentChannel.equals(PaymentChannelEnum.YQPAY)) {
-            payMap = YqPayUtil.getPayMap(amount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody, YqPayUtil.merNo, payeeMerNo);
-        } else {
-            payMap = Payment.getPayMap(amount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody);
-        }
+        Map<String, Object> payMap = Payment.getPayMap(hfMerchantConfig, amount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody);
         
         Map<String, Object> unionPay = new HashMap<>();
         unionPay.put("orderNo", orderNo);
         unionPay.put("type", paymentChannel.getCode());
         unionPay.put("payMap", payMap);
-        unionPay.put("routingMerNos", payeeMerNo);
+        unionPay.put("tenantId", hfMerchantConfig.getTenantId());
+        unionPay.put("routingMerNos", hfMerchantConfig.getPlatformPayeeMemberId());
         
 		return unionPay;
 	}
@@ -688,7 +676,7 @@ public class PayServiceImpl implements PayService {
         return amount.add(totalHasReceipt).compareTo(totalMaxReceipt) >= 0;
     }
 
-    private Map<String, Object> getPayRoute(BigDecimal amount, BigDecimal balanceAmount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, List<RouteScaleDto> routeScaleDtos, BigDecimal shareAmount) throws Exception {
+    private Map<String, Object> getPayRoute(HfMerchantConfig hfMerchantConfig, BigDecimal amount, BigDecimal balanceAmount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, List<RouteScaleDto> routeScaleDtos, BigDecimal shareAmount) throws Exception {
         Map<String, List<RouteScaleDto>> routeScaleDtosMap = routeScaleDtos.stream().collect(Collectors.groupingBy(RouteScaleDto::getMerNo));
 
         //合并同账号的数据
@@ -778,6 +766,7 @@ public class PayServiceImpl implements PayService {
             studentPaymentRouteOrder.setMerNo(routeScaleDto.getMerNo());
             studentPaymentRouteOrder.setSaleAmount(routeScaleDto.getSaleAmount());
             studentPaymentRouteOrder.setServiceAmount(routeScaleDto.getServiceAmount());
+            studentPaymentRouteOrder.setTenantId(hfMerchantConfig.getTenantId());
             RouteOrders.add(studentPaymentRouteOrder);
             routingMerNoSet.add(routeScaleDto.getMerNo());
         }
@@ -794,7 +783,7 @@ public class PayServiceImpl implements PayService {
             }
             payMap = YqPayUtil.getPayMap(amount.add(shareAmount), orderNo, notifyUrl, returnUrl, orderSubject, orderBody, YqPayUtil.merNo, tempRoutingList);
         } else {
-            payMap = Payment.getPayMap(amount.add(shareAmount), orderNo, notifyUrl, returnUrl, orderSubject, orderBody);
+            payMap = Payment.getPayMap(hfMerchantConfig, amount.add(shareAmount), orderNo, notifyUrl, returnUrl, orderSubject, orderBody);
         }
         String routingMerNos = String.join(",", routingMerNoSet);
 

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

@@ -87,6 +87,8 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     @Autowired
     private SysUserFeignService sysUserFeignService;
     @Autowired
+    private SysUserService sysUserService;
+    @Autowired
     private TeacherDao teacherDao;
     @Autowired
     private SysMessageService sysMessageService;
@@ -305,10 +307,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         if (Objects.isNull(subjectId)) {
             throw new BizException("请选择声部");
         }
-        SysUser sysUser = sysUserFeignService.queryUserById(userId);
-        if (Objects.isNull(sysUser)) {
-            throw new BizException("用户不存在");
-        }
+        SysUser sysUser = sysUserService.queryUserById(userId);
         if (Objects.isNull(sysUser.getOrganId())) {
             throw new BizException("未找到用户分部属性");
         }
@@ -393,10 +392,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         if (Objects.isNull(teacherId)) {
             throw new BizException("请选择教师");
         }
-        SysUser student = sysUserFeignService.queryUserById(userId);
-        if (Objects.isNull(student)) {
-            throw new BizException("用户不存在");
-        }
+        SysUser student = sysUserService.queryUserById(userId);
         if (Objects.isNull(student.getOrganId())) {
             throw new BizException("未找到用户分部属性");
         }
@@ -1273,7 +1269,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         }
         applyTimes += 1;
 
-        SysUser sysUser = sysUserFeignService.queryUserById(practiceGroup.getStudentId());
+        SysUser sysUser = sysUserService.queryUserById(practiceGroup.getStudentId());
 
         practiceGroup.setCoursesStartDate(allCourseDates.get(0));
         practiceGroup.setCoursesExpireDate(allCourseDates.get(3));
@@ -1837,10 +1833,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         if (Objects.isNull(subjectId)) {
             throw new BizException("请选择声部");
         }
-        SysUser sysUser = sysUserFeignService.queryUserById(userId);
-        if (Objects.isNull(sysUser)) {
-            throw new BizException("用户不存在");
-        }
+        SysUser sysUser = sysUserService.queryUserById(userId);
         if (Objects.isNull(sysUser.getOrganId())) {
             throw new BizException("未找到用户分部属性");
         }
@@ -1968,10 +1961,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         if (Objects.isNull(teacherId)) {
             throw new BizException("请选择教师");
         }
-        SysUser student = sysUserFeignService.queryUserById(userId);
-        if (Objects.isNull(student)) {
-            throw new BizException("用户不存在");
-        }
+        SysUser student = sysUserService.queryUserById(userId);
         if (Objects.isNull(student.getOrganId())) {
             throw new BizException("未找到用户分部属性");
         }
@@ -2638,7 +2628,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                     amount,
                     balance,
                     orderNo,
-                    baseApiUrl + "/api-student/studentOrder/notify",
+                    baseApiUrl + "/api-student/studentOrder/callback",
                     baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                     "网管课购买",
                     practiceGroupBuyParams.getName(),
@@ -2713,7 +2703,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "训练时间与陪练次数不匹配");
         }
 
-        SysUser sysUser = sysUserFeignService.queryUserById(practiceGroupBuyParams.getStudentId());
+        SysUser sysUser = sysUserService.queryUserById(practiceGroupBuyParams.getStudentId());
 
         Subject subject = subjectDao.get(practiceGroupBuyParams.getSubjectId());
         if (Objects.isNull(subject)) {
@@ -3105,7 +3095,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                     amount,
                     balance,
                     orderNo,
-                    baseApiUrl + "/api-student/studentOrder/notify",
+                    baseApiUrl + "/api-student/studentOrder/callback",
                     baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                     "网管课购买",
                     practiceGroupBuyParams.getName(),
@@ -3616,7 +3606,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                 newOrder.getActualAmount(),
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                 "网管课购买",
                 practiceGroup.getName(),
@@ -3694,7 +3684,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
             if (list.size() > 0) {
                 StudentPaymentOrder applyOrder = list.get(list.size() - 1);
                 // 查询订单状态
-                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
+                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder);
                 if (payStatus == PayStatus.SUCCESSED) {
                     throw new BizException("订单已支付成功,请勿重复支付");
                 }
@@ -4249,7 +4239,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
 
         int repeatVipGroups = practiceGroupDao.countUserRepeatPracticeGroupInCourseStartEndTime(applyBaseInfo.getUserId(), firstCourseSchedule.getStartClassTime(), latestCourseSchedule.getEndClassTime());
         if (repeatVipGroups > 0) {
-            SysUser sysUser = sysUserFeignService.queryUserById(applyBaseInfo.getUserId());
+            SysUser sysUser = sysUserService.queryUserById(applyBaseInfo.getUserId());
             throw new BizException("{}课程时间冲突({}-{})", sysUser.getRealName(), DateUtil.dateToString(firstCourseSchedule.getStartClassTime(), "yyyy-MM-dd HH:mm:ss"), DateUtil.dateToString(latestCourseSchedule.getEndClassTime(), "HH:mm:ss"));
         }
 
@@ -4435,10 +4425,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public HttpResponseResult buyTeacherPracticeGroup(PracticeGroupBuyParamsDto practiceGroupBuyParams) throws Exception {
-        SysUser user = sysUserFeignService.queryUserInfo();
-        if (user == null) {
-            throw new BizException("用户信息获取失败");
-        }
+        SysUser user = sysUserService.getUser();
         // 判断是否存在支付中的记录
         List<StudentPaymentOrder> list = studentPaymentOrderService
                 .queryByCondition(GroupType.PRACTICE,
@@ -4449,7 +4436,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         if (list.size() > 0) {
             StudentPaymentOrder applyOrder = list.get(list.size() - 1);
             // 查询订单状态
-            PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
+            PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder);
             if (payStatus == PayStatus.SUCCESSED) {
                 throw new BizException("订单已支付成功,请勿重复支付");
             }/*else if(payStatus == PayStatus.PAYING){
@@ -4577,7 +4564,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                 amount,
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                 "网管课购买",
                 practiceGroup.getName(),
@@ -4680,30 +4667,22 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public Object buyActivityPracticeGroup(PracticeGroupBuyParamsDto practiceGroupBuyParams) throws Exception {
+        Student student = studentDao.getLocked(practiceGroupBuyParams.getUserId());
+        this.checkActivity();
         Integer activityId = practiceGroupBuyParams.getActivityId();
         VipGroupActivity activity = vipGroupActivityDao.get(activityId);
-        Date now = new Date();
-        Date startTime = activity.getStartTime();
-        Date endTime = activity.getEndTime();
-        if (startTime != null && startTime.compareTo(now) > 0) {
-            throw new BizException("活动尚未开始,感谢您的关注");
-        }
-        if (endTime != null && endTime.compareTo(now) <= 0) {
-            throw new BizException("活动已结束,感谢您的参与");
-        }
-        Student student = studentDao.getLocked(practiceGroupBuyParams.getUserId());
-        Integer studentMaxUsedTimes = activity.getStudentMaxUsedTimes();
-        if (studentMaxUsedTimes != -1) {
-            //获取活动购买次数
-            int activityBuyNum = activityUserMapperService.countActivityBuyNum(activityId, practiceGroupBuyParams.getUserId());
-            if (activityBuyNum >= studentMaxUsedTimes) {
-                throw new BizException("当前活动最多课购买{}次,感谢您的参与", studentMaxUsedTimes);
-            }
-        }
+//        Integer studentMaxUsedTimes = activity.getStudentMaxUsedTimes();
+//        if (studentMaxUsedTimes != -1) {
+//            //获取活动购买次数
+//            int activityBuyNum = activityUserMapperService.countActivityBuyNum(activityId, practiceGroupBuyParams.getUserId());
+//            if (activityBuyNum >= studentMaxUsedTimes) {
+//                throw new BizException("当前活动最多课购买{}次,感谢您的参与", studentMaxUsedTimes);
+//            }
+//        }
 
         //判断用户是否已存在订单
         // 判断是否存在支付中的记录
-        List<StudentPaymentOrder> applyOrderList = studentPaymentOrderService.queryByCondition(GroupType.MEMBER, null, student.getUserId(), DealStatusEnum.ING, OrderTypeEnum.MEMBER);
+        List<StudentPaymentOrder> applyOrderList = studentPaymentOrderService.queryByCondition(GroupType.VIP, null, student.getUserId(), DealStatusEnum.ING, OrderTypeEnum.ACTIVITY);
         if (org.apache.commons.collections.CollectionUtils.isNotEmpty(applyOrderList)) {
             HttpResponseResult result = studentPaymentOrderService.checkRepeatPay(applyOrderList.get(0), practiceGroupBuyParams.getRepeatPay());
             if (result.getCode() != 200) {
@@ -4780,7 +4759,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
                 activityFee,
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                 orderSubject,
                 orderSubject,
@@ -4910,7 +4889,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult studentCreateActivityPracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams) {
-        SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
+        SysUser sysUser = sysUserService.getUser();
         studentDao.getLocked(sysUser.getId());
         practiceGroupBuyParams.setStudentId(sysUser.getId());
         String activeConfig = sysConfigDao.findConfigValue("cloud_teacher_active_config");
@@ -5222,4 +5201,33 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         activityUserMapperService.update(activityUserMapper);
         return BaseController.succeed();
     }
+
+    @Override
+    public void checkActivity() {
+        SysUser sysUser = sysUserService.getUser();
+        String activeConfig = sysConfigDao.findConfigValue("2022_cloud_activity_config");
+        List<Cloud2022ActivityDto> cloud2022ActivityDtos = JSONArray.parseArray(activeConfig, Cloud2022ActivityDto.class);
+        List<Cloud2022ActivityDto> activityDtos = cloud2022ActivityDtos.stream().
+                filter(e -> Arrays.stream(e.getOrganId().split(",")).collect(Collectors.toList()).
+                        contains(sysUser.getOrganId().toString())).collect(Collectors.toList());
+        if(org.apache.commons.collections.CollectionUtils.isEmpty(activityDtos)){
+            throw new BizException("当前分部暂未开通活动");
+        }
+        Integer activityId = Integer.parseInt(activityDtos.get(0).getActivityId().split(",")[0]);
+        VipGroupActivity activity = vipGroupActivityDao.get(activityId);
+        Date now = new Date();
+        Date startTime = activity.getStartTime();
+        Date endTime = activity.getEndTime();
+        if (startTime != null && startTime.compareTo(now) > 0) {
+            throw new BizException("活动尚未开始,感谢您的关注");
+        }
+        if (endTime != null && endTime.compareTo(now) <= 0) {
+            throw new BizException("活动已结束,感谢您的参与");
+        }
+        //只允许购买一次
+        int num = studentPaymentOrderDao.countByActivityIds(activityDtos.stream().map(e->e.getActivityId()).collect(Collectors.toList()),sysUser.getId());
+        if(num > 0){
+            throw new BizException("您已参与过该活动,感谢您的关注");
+        }
+    }
 }

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

@@ -328,7 +328,7 @@ public class ReplacementInstrumentActivityServiceImpl extends BaseServiceImpl<In
             if (oldOrder != null) {
                 
                 // 查询订单状态
-                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(oldOrder.getPaymentChannel(), oldOrder.getOrderNo(), oldOrder.getTransNo());
+                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(oldOrder);
                 if(payStatus != PayStatus.FAILED){
                 	if(payStatus == PayStatus.SUCCESSED){
                 		throw new BizException("订单已支付成功,请勿重复支付");
@@ -414,7 +414,7 @@ public class ReplacementInstrumentActivityServiceImpl extends BaseServiceImpl<In
                 amount,
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                 orderSubject,
                 orderSubject,

+ 30 - 80
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SellOrderServiceImpl.java

@@ -11,6 +11,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -497,96 +498,45 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
             }
         }
         Map<String, BigDecimal> sellAmount = new HashMap<>();
-        //乐器销售,声部更改
-        if (order.getType().equals(OrderTypeEnum.GOODS_SELL) || order.getType().equals(OrderTypeEnum.SUBJECT_CHANGE)) {
+        //乐器销售,声部更改,乐器置换
+        if (order.getType().equals(OrderTypeEnum.GOODS_SELL) || order.getType().equals(OrderTypeEnum.SUBJECT_CHANGE) || order.getType().equals(OrderTypeEnum.REPLACEMENT)) {
             sellAmount.put("actualAmount", order.getActualAmount().subtract(cloudIncome));
             sellAmount.put("balance", order.getBalancePaymentAmount() == null ? BigDecimal.ZERO : order.getBalancePaymentAmount().subtract(cloudBalanceIncome));
             return sellAmount;
         }
-        //乐器置换
-        if (order.getType().equals(OrderTypeEnum.REPLACEMENT)) {
-            sellAmount.put("actualAmount", order.getActualAmount().subtract(cloudIncome));
-            sellAmount.put("balance", order.getBalancePaymentAmount() == null ? BigDecimal.ZERO : order.getBalancePaymentAmount().subtract(cloudBalanceIncome));
-            return sellAmount;
+        //乐团报名,乐器维修
+        if (order.getType().equals(OrderTypeEnum.APPLY) || order.getType().equals(OrderTypeEnum.REPAIR)) {
+            return this.calcSellAmount(order,cloudBalanceIncome, cloudIncome);
         }
+        sellAmount.put("actualAmount", BigDecimal.ZERO);
+        sellAmount.put("balance", BigDecimal.ZERO);
+        return sellAmount;
+    }
 
-        //乐器维修
-        if (order.getType().equals(OrderTypeEnum.REPAIR)) {
-            /*StudentRepair repairInfo = studentRepairDao.getRepairInfo(Integer.parseInt(order.getMusicGroupId()));
-
-            if (StringUtils.isBlank(repairInfo.getGoodsJson())) {
-                sellAmount.put("actualAmount", BigDecimal.ZERO);
-                sellAmount.put("balance", BigDecimal.ZERO);
-                return sellAmount;
-            }
-            List<Goods> goodies = JSONObject.parseArray(repairInfo.getGoodsJson(), Goods.class);
-            List<Integer> goodsIds = goodies.stream().map(Goods::getId).collect(Collectors.toList());
-            if (goodsIds.size() <= 0) {
-                sellAmount.put("actualAmount", BigDecimal.ZERO);
-                sellAmount.put("balance", BigDecimal.ZERO);
-                return sellAmount;
-            }
-
-            BigDecimal totalAmount = order.getExpectAmount().add(repairInfo.getExemptionAmount());
-            if (totalAmount.compareTo(BigDecimal.ZERO) <= 0) {
-                sellAmount.put("actualAmount", BigDecimal.ZERO);
-                sellAmount.put("balance", BigDecimal.ZERO);
-                return sellAmount;
-            }
-
-            BigDecimal goodsTotalPrice = BigDecimal.ZERO;
-            goodies = goodsDao.getGoodies(goodsIds);
-            int i = 1;
-            for (Integer goodsId : goodsIds) {
-                for (Goods goods : goodies) {
-                    if (goods.getId().equals(goodsId)) {
-                        goodsTotalPrice = goodsTotalPrice.add(goods.getDiscountPrice());
-                        break;
-                    }
-                }
-            }
-            BigDecimal balance = order.getBalancePaymentAmount() == null ? BigDecimal.ZERO : order.getBalancePaymentAmount();
+    public Map<String, BigDecimal> calcSellAmount(StudentPaymentOrder order,BigDecimal cloudBalanceIncome,BigDecimal cloudIncome) {
+        List<StudentPaymentOrderDetail> orderDetails = studentPaymentOrderDetailDao.getOrderDetail(order.getId());
+        //总余额支付
+        BigDecimal totalBalance = order.getBalancePaymentAmount() != null ? order.getBalancePaymentAmount() : BigDecimal.ZERO;
+        //总价格
+        BigDecimal totalPrice = order.getExpectAmount();
+        //商品总付款
+        BigDecimal detailTotalPrice = orderDetails.stream().map(StudentPaymentOrderDetail::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+        //商品销售占的余额
+        BigDecimal detailTotalBalance = detailTotalPrice.multiply(totalBalance).divide(totalPrice, 2, BigDecimal.ROUND_DOWN);
 
-            BigDecimal goodsTotalBalance = goodsTotalPrice.multiply(balance).divide(totalAmount, 2, BigDecimal.ROUND_DOWN);
-            BigDecimal goodsTotalActualAmount = goodsTotalPrice.multiply(order.getActualAmount()).divide(totalAmount, 2, BigDecimal.ROUND_DOWN);
-            sellAmount.put("actualAmount", goodsTotalActualAmount.subtract(cloudIncome));
-            sellAmount.put("balance", goodsTotalBalance.subtract(cloudBalanceIncome));*/
-        	
-            sellAmount.put("actualAmount", order.getActualAmount().subtract(cloudIncome));
-            sellAmount.put("balance", order.getBalancePaymentAmount() == null ? BigDecimal.ZERO : order.getBalancePaymentAmount().subtract(cloudBalanceIncome));
-            return sellAmount;
+        if(detailTotalBalance.subtract(cloudBalanceIncome).compareTo(BigDecimal.ZERO) < 0) {
+            detailTotalBalance = cloudBalanceIncome;
         }
 
-        //乐团报名
-        if (order.getType().equals(OrderTypeEnum.APPLY)) {
-            List<StudentPaymentOrderDetail> orderDetails = studentPaymentOrderDetailDao.getOrderDetail(order.getId());
-            //总余额支付
-            BigDecimal totalBalance = order.getBalancePaymentAmount() != null ? order.getBalancePaymentAmount() : BigDecimal.ZERO;
-            //总价格
-            BigDecimal totalPrice = order.getExpectAmount();
-            //商品总付款
-            BigDecimal detailTotalPrice = orderDetails.stream().map(StudentPaymentOrderDetail::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
-            //商品销售占的余额
-            BigDecimal detailTotalBalance = detailTotalPrice.multiply(totalBalance).divide(totalPrice, 2, BigDecimal.ROUND_DOWN);
-            
-            if(detailTotalBalance.subtract(cloudBalanceIncome).compareTo(BigDecimal.ZERO) < 0) {
-            	detailTotalBalance = cloudBalanceIncome;
-            }
-            
-            BigDecimal actualAmount = detailTotalPrice.multiply(order.getActualAmount()).divide(totalPrice, 2, BigDecimal.ROUND_DOWN);
-            
-            if(actualAmount.subtract(cloudIncome).compareTo(BigDecimal.ZERO) < 0){
-            	actualAmount = cloudIncome;
-            }
-            
-            //返回销售收入
-        	sellAmount.put("actualAmount", actualAmount.subtract(cloudIncome));
-            sellAmount.put("balance", detailTotalBalance.subtract(cloudBalanceIncome));
-            return sellAmount;
-        }
+        BigDecimal actualAmount = detailTotalPrice.multiply(order.getActualAmount()).divide(totalPrice, 2, BigDecimal.ROUND_DOWN);
 
-        sellAmount.put("actualAmount", BigDecimal.ZERO);
-        sellAmount.put("balance", BigDecimal.ZERO);
+        if(actualAmount.subtract(cloudIncome).compareTo(BigDecimal.ZERO) < 0){
+            actualAmount = cloudIncome;
+        }
+        Map<String, BigDecimal> sellAmount = new HashMap<>(2);
+        //返回销售收入
+        sellAmount.put("actualAmount", actualAmount.subtract(cloudIncome));
+        sellAmount.put("balance", detailTotalBalance.subtract(cloudBalanceIncome));
         return sellAmount;
     }
 

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

@@ -226,6 +226,8 @@ public class StudentCourseHomeworkServiceImpl extends BaseServiceImpl<Long, Stud
 		}
 		
         CourseHomeworkStudentDetailDto courseHomeworkStudentDetail = studentCourseHomeworkDao.findCourseHomeworkStudentDetail(courseScheduleID, userId);
+        courseHomeworkStudentDetail.setExpire(DateUtil.isOverdue(courseHomeworkStudentDetail.getSubmitTime(),
+                sysConfigDao.findConfigValue("file_expiration_time")));
         if(courseHomeworkStudentDetail == null){
         	courseHomeworkStudentDetail = new CourseHomeworkStudentDetailDto();
 			courseHomeworkStudentDetail.setMusicGroupTrainPlan(musicGroupTrainPlan);

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

@@ -179,7 +179,7 @@ public class StudentInstrumentServiceImpl extends BaseServiceImpl<Long, StudentI
                 amount,
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                 orderSubject,
                 orderSubject,

+ 136 - 115
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -112,8 +112,10 @@ public class StudentManageServiceImpl implements StudentManageService {
         Map<String, Object> params = new HashMap<String, Object>();
         MapUtil.populateMap(params, queryInfo);
 
-        String[] organIds = queryInfo.getOrganId().split(",");
-        params.put("organIds", organIds);
+        if(StringUtils.isNotEmpty(queryInfo.getOrganId())){
+            String[] organIds = queryInfo.getOrganId().split(",");
+            params.put("organIds", organIds);
+        }
 
         List<StudentManageListDto> dataList = null;
         int count = studentManageDao.countStudentByOrganId(params);
@@ -144,10 +146,10 @@ public class StudentManageServiceImpl implements StudentManageService {
         //用户协议
         List<SysUserContracts> userAllContract = sysUserContractsDao.getUserAllContract(new ArrayList<>(userIds));
         Map<Integer, Set<Integer>> userContractVersionMap = new HashMap<>();
-        if(!CollectionUtils.isEmpty(userAllContract)){
+        if (!CollectionUtils.isEmpty(userAllContract)) {
             userContractVersionMap = userAllContract.stream().collect(Collectors.groupingBy(SysUserContracts::getUserId, Collectors.mapping(SysUserContracts::getVersion, Collectors.toSet())));
         }
-        Map<Long,String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(userIds,null));
+        Map<Long, String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(userIds, null));
         //List<Subject> studentSubject = studentManageDao.getStudentSubject(userIds);
         StudentListCourseDto studentListCourseDto = null;
         //获取所在乐团
@@ -196,20 +198,20 @@ public class StudentManageServiceImpl implements StudentManageService {
                 dto.setHasPracticeCourse(YesOrNoEnum.NO);
             }
             //如果会员已过期、是否有未生效的会员
-            if(dto.getMemberRankSettingId() == null){
+            if (dto.getMemberRankSettingId() == null) {
                 String s = cloudMap.get(dto.getUserId().longValue());
-                if(StringUtils.isNotEmpty(s)){
+                if (StringUtils.isNotEmpty(s)) {
                     dto.setHasNoStartCloudTeacher(true);
                 }
             }
 
-            if(userContractVersionMap.containsKey(dto.getUserId())){
+            if (userContractVersionMap.containsKey(dto.getUserId())) {
                 dto.setIsSignedContract(true);
-            }else{
+            } else {
                 dto.setIsSignedContract(false);
             }
             //年级
-            dto.setCurrentGrade(studentService.getStudentGrade(dto.getGradeType(),dto.getCurrentGradeNum()));
+            dto.setCurrentGrade(studentService.getStudentGrade(dto.getGradeType(), dto.getCurrentGradeNum()));
         }
         pageInfo.setRows(dataList);
         return pageInfo;
@@ -253,6 +255,7 @@ public class StudentManageServiceImpl implements StudentManageService {
         pageInfo.setRows(dataList);
         return pageInfo;
     }
+
     @Override
     public PageInfo<SimpleUserDto> queryStudentsWithTeacherByOrganId(StudentManageQueryInfo queryInfo) {
         PageInfo<SimpleUserDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
@@ -300,7 +303,7 @@ public class StudentManageServiceImpl implements StudentManageService {
             dataList = studentPaymentOrderDao.queryDouble11Students(params);
             SysConfig vipSpecialActivityConfig = sysConfigService.findByParamName(SysConfigService.VIP_SPECIAL_ACTIVITY_IDS);
             Map<Integer, StudentVipDouble11Dto> studentCourseTimeMap = new HashMap<>();
-            if(Objects.nonNull(vipSpecialActivityConfig)&&StringUtils.isNotBlank(vipSpecialActivityConfig.getParanValue())){
+            if (Objects.nonNull(vipSpecialActivityConfig) && StringUtils.isNotBlank(vipSpecialActivityConfig.getParanValue())) {
                 Set<Integer> studentIds = dataList.stream().map(StudentVipDouble11Dto::getUserId).collect(Collectors.toSet());
                 Set<Integer> specialActivityIds = Arrays.stream(vipSpecialActivityConfig.getParanValue().split(",")).map(Integer::valueOf).collect(Collectors.toSet());
                 List<StudentVipDouble11Dto> studentCourseTimeList = courseScheduleStudentPaymentDao.countStudentDouble11CourseTime(new ArrayList<>(studentIds), new ArrayList<>(specialActivityIds));
@@ -308,12 +311,12 @@ public class StudentManageServiceImpl implements StudentManageService {
             }
             for (StudentVipDouble11Dto studentVipDouble11Dto : dataList) {
                 StudentVipDouble11Dto studentCourseTime = studentCourseTimeMap.get(studentVipDouble11Dto.getUserId());
-                studentVipDouble11Dto.setCourseOneToOneTime(studentVipDouble11Dto.getPaymentOneToOneTime()*20-(Objects.isNull(studentCourseTime)?0:studentCourseTime.getCourseOneToOneTime()));
-                if(studentVipDouble11Dto.getCourseOneToOneTime()<0){
+                studentVipDouble11Dto.setCourseOneToOneTime(studentVipDouble11Dto.getPaymentOneToOneTime() * 20 - (Objects.isNull(studentCourseTime) ? 0 : studentCourseTime.getCourseOneToOneTime()));
+                if (studentVipDouble11Dto.getCourseOneToOneTime() < 0) {
                     studentVipDouble11Dto.setCourseOneToOneTime(0);
                 }
-                studentVipDouble11Dto.setCourseOneToTwoTime(studentVipDouble11Dto.getPaymentOneToTwoTime()*20-(Objects.isNull(studentCourseTime)?0:studentCourseTime.getCourseOneToTwoTime()));
-                if(studentVipDouble11Dto.getCourseOneToTwoTime()<0){
+                studentVipDouble11Dto.setCourseOneToTwoTime(studentVipDouble11Dto.getPaymentOneToTwoTime() * 20 - (Objects.isNull(studentCourseTime) ? 0 : studentCourseTime.getCourseOneToTwoTime()));
+                if (studentVipDouble11Dto.getCourseOneToTwoTime() < 0) {
                     studentVipDouble11Dto.setCourseOneToTwoTime(0);
                 }
             }
@@ -328,19 +331,19 @@ public class StudentManageServiceImpl implements StudentManageService {
         List<StudentVipDouble11Dto> studentsDouble11Infos = studentPaymentOrderDao.findStudentsDouble11Infos(studentIds);
         SysConfig vipSpecialActivityConfig = sysConfigService.findByParamName(SysConfigService.VIP_SPECIAL_ACTIVITY_IDS);
         Map<Integer, StudentVipDouble11Dto> studentCourseTimeMap = new HashMap<>();
-        if(Objects.nonNull(vipSpecialActivityConfig)&&StringUtils.isNotBlank(vipSpecialActivityConfig.getParanValue())){
+        if (Objects.nonNull(vipSpecialActivityConfig) && StringUtils.isNotBlank(vipSpecialActivityConfig.getParanValue())) {
             Set<Integer> specialActivityIds = Arrays.stream(vipSpecialActivityConfig.getParanValue().split(",")).map(Integer::valueOf).collect(Collectors.toSet());
             List<StudentVipDouble11Dto> studentCourseTimeList = courseScheduleStudentPaymentDao.countStudentDouble11CourseTime(studentIds, new ArrayList<>(specialActivityIds));
             studentCourseTimeMap = studentCourseTimeList.stream().collect(Collectors.toMap(StudentVipDouble11Dto::getUserId, s -> s));
         }
         for (StudentVipDouble11Dto studentVipDouble11Dto : studentsDouble11Infos) {
             StudentVipDouble11Dto studentCourseTime = studentCourseTimeMap.get(studentVipDouble11Dto.getUserId());
-            studentVipDouble11Dto.setCourseOneToOneTime(studentVipDouble11Dto.getPaymentOneToOneTime()*20-(Objects.isNull(studentCourseTime)?0:studentCourseTime.getCourseOneToOneTime()));
-            if(studentVipDouble11Dto.getCourseOneToOneTime()<0){
+            studentVipDouble11Dto.setCourseOneToOneTime(studentVipDouble11Dto.getPaymentOneToOneTime() * 20 - (Objects.isNull(studentCourseTime) ? 0 : studentCourseTime.getCourseOneToOneTime()));
+            if (studentVipDouble11Dto.getCourseOneToOneTime() < 0) {
                 studentVipDouble11Dto.setCourseOneToOneTime(0);
             }
-            studentVipDouble11Dto.setCourseOneToTwoTime(studentVipDouble11Dto.getPaymentOneToTwoTime()*20-(Objects.isNull(studentCourseTime)?0:studentCourseTime.getCourseOneToTwoTime()));
-            if(studentVipDouble11Dto.getCourseOneToTwoTime()<0){
+            studentVipDouble11Dto.setCourseOneToTwoTime(studentVipDouble11Dto.getPaymentOneToTwoTime() * 20 - (Objects.isNull(studentCourseTime) ? 0 : studentCourseTime.getCourseOneToTwoTime()));
+            if (studentVipDouble11Dto.getCourseOneToTwoTime() < 0) {
                 studentVipDouble11Dto.setCourseOneToTwoTime(0);
             }
         }
@@ -486,31 +489,31 @@ public class StudentManageServiceImpl implements StudentManageService {
         MapUtil.populateMap(params, queryInfo);
         List<MusicGroupStudentsDto> dataList = new ArrayList<>();
         List<StudentRegistration> studentRegistrations = studentRegistrationDao.getMusicGroupStu(queryInfo.getMusicGroupId());
-        if(studentRegistrations.size() == 0){
+        if (studentRegistrations.size() == 0) {
             return pageInfo;
         }
         List<Integer> userIds = studentRegistrations.stream().map(e -> e.getUserId()).collect(Collectors.toList());
-        if(queryInfo.getHasCourse() != null){
+        if (queryInfo.getHasCourse() != null) {
             //有剩余课程的学员
-            List<Integer> hasCourseStudent = courseScheduleDao.findHasCourseStudent(userIds,"VIP,PRACTICE");
-            if(queryInfo.getHasCourse()){
+            List<Integer> hasCourseStudent = courseScheduleDao.findHasCourseStudent(userIds, "VIP,PRACTICE");
+            if (queryInfo.getHasCourse()) {
                 userIds = hasCourseStudent;
-            }else {
+            } else {
                 userIds.removeAll(hasCourseStudent);
             }
         }
-        if(userIds.size() > 0 && queryInfo.getOweFlag() != null){
-            List<Integer> studentIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(queryInfo.getMusicGroupId(),userIds,null);
-            if(queryInfo.getOweFlag()){
+        if (userIds.size() > 0 && queryInfo.getOweFlag() != null) {
+            List<Integer> studentIds = musicGroupPaymentCalenderDetailDao.queryNoPaymentUserIds(queryInfo.getMusicGroupId(), userIds, null);
+            if (queryInfo.getOweFlag()) {
                 userIds = studentIds;
-            }else {
+            } else {
                 userIds.removeAll(studentIds);
             }
         }
-        if(userIds.size() == 0){
+        if (userIds.size() == 0) {
             return pageInfo;
         }
-        params.put("userIds",userIds);
+        params.put("userIds", userIds);
         int count = studentManageDao.countMusicGroupStudent(params);
         if (queryInfo.getIsExport() && count > 50000) {
             throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
@@ -520,7 +523,7 @@ public class StudentManageServiceImpl implements StudentManageService {
             params.put("offset", pageInfo.getOffset());
             dataList = studentManageDao.queryMusicGroupStudent(params);
             //获取乐团学员欠费金额
-            Map<Integer,BigDecimal> totalAmountMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentTotalAmount(queryInfo.getMusicGroupId()));
+            Map<Integer, BigDecimal> totalAmountMap = MapUtil.convertIntegerMap(musicGroupPaymentCalenderDetailDao.queryNoPaymentTotalAmount(queryInfo.getMusicGroupId()));
             //退团的学生
             List<Integer> quitUserIds = dataList.stream().filter(e -> e.getStudentStatus().equals("QUIT")).map(MusicGroupStudentsDto::getUserId).collect(Collectors.toList());
             if (quitUserIds.size() > 0) {
@@ -533,23 +536,23 @@ public class StudentManageServiceImpl implements StudentManageService {
                 }
             }
             List<Integer> collect = dataList.stream().map(e -> e.getUserId()).collect(Collectors.toList());
-            List<Integer> hasCourseStudent = courseScheduleDao.findHasCourseStudent(collect,"VIP,PRACTICE");
+            List<Integer> hasCourseStudent = courseScheduleDao.findHasCourseStudent(collect, "VIP,PRACTICE");
             List<SubjectChange> waitPayChange = subjectChangeDao.getMusicGroupWaitPay(queryInfo.getMusicGroupId());
             Map<Integer, List<SubjectChange>> studentWaitPayChange = waitPayChange.stream().collect(Collectors.groupingBy(SubjectChange::getStudentId));
             //查询是否有有效期内乐保
-            List<StudentInstrument> studentsMaintenanceNum = studentInstrumentDao.getStudentsMaintenanceNum(collect,queryInfo.getMusicGroupId());
+            List<StudentInstrument> studentsMaintenanceNum = studentInstrumentDao.getStudentsMaintenanceNum(collect, queryInfo.getMusicGroupId());
             Map<Integer, Integer> studentMaintenanceMap = studentsMaintenanceNum.stream().collect(Collectors.toMap(StudentInstrument::getStudentId, StudentInstrument::getGoodsId));
 
             //查询云教练订单
             List<CloudTeacherOrder> studentCloudTeacherOrders = cloudTeacherOrderService.getStudentCloudTeacherOrders(collect, queryInfo.getMusicGroupId());
             Map<Integer, List<CloudTeacherOrder>> studentCloudTeacherMap = studentCloudTeacherOrders.stream().collect(Collectors.groupingBy(CloudTeacherOrder::getStudentId));
             Date nowDate = new Date();
-            Map<Long,String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(new HashSet<>(collect),null));
-            dataList.forEach(e->{
+            Map<Long, String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(new HashSet<>(collect), null));
+            dataList.forEach(e -> {
                 //如果会员已过期、是否有未生效的会员
-                if(e.getMemberRankSettingId() == null){
+                if (e.getMemberRankSettingId() == null) {
                     String s = cloudMap.get(e.getUserId().longValue());
-                    if(StringUtils.isNotEmpty(s)){
+                    if (StringUtils.isNotEmpty(s)) {
                         e.setHasNoStartCloudTeacher(true);
                     }
                 }
@@ -558,16 +561,16 @@ public class StudentManageServiceImpl implements StudentManageService {
                 if (studentWaitPayChange.containsKey(e.getUserId())) {
                     e.setSubjectChange(studentWaitPayChange.get(e.getUserId()).get(0));
                 }
-                if(studentMaintenanceMap.containsKey(e.getUserId())){
+                if (studentMaintenanceMap.containsKey(e.getUserId())) {
                     e.setHasMaintenance(true);
                 }
                 if (studentCloudTeacherMap.containsKey(e.getUserId())) {
                     List<CloudTeacherOrder> cloudTeacherOrders = studentCloudTeacherMap.get(e.getUserId());
-                    if(cloudTeacherOrders != null && cloudTeacherOrders.size() > 0){
+                    if (cloudTeacherOrders != null && cloudTeacherOrders.size() > 0) {
                         BigDecimal cloudAmount = BigDecimal.ZERO;
                         for (CloudTeacherOrder cloudTeacherOrder : cloudTeacherOrders) {
-                            if (cloudTeacherOrder.getEndTime() == null || DateUtil.stringToDate(DateUtil.format(cloudTeacherOrder.getEndTime(),DateUtil.ISO_EXPANDED_DATE_FORMAT),DateUtil.ISO_EXPANDED_DATE_FORMAT).compareTo(
-                                    DateUtil.stringToDate(DateUtil.format(nowDate,DateUtil.ISO_EXPANDED_DATE_FORMAT),DateUtil.ISO_EXPANDED_DATE_FORMAT)) >= 0) {
+                            if (cloudTeacherOrder.getEndTime() == null || DateUtil.stringToDate(DateUtil.format(cloudTeacherOrder.getEndTime(), DateUtil.ISO_EXPANDED_DATE_FORMAT), DateUtil.ISO_EXPANDED_DATE_FORMAT).compareTo(
+                                    DateUtil.stringToDate(DateUtil.format(nowDate, DateUtil.ISO_EXPANDED_DATE_FORMAT), DateUtil.ISO_EXPANDED_DATE_FORMAT)) >= 0) {
                                 cloudAmount = cloudAmount.add(cloudTeacherOrder.getAmount());
                             }
                         }
@@ -592,17 +595,17 @@ public class StudentManageServiceImpl implements StudentManageService {
         //未完成vip、网管课学员数量/该乐团在读学员人数*100%
         List<StudentRegistration> studentRegistrations = studentRegistrationDao.getMusicGroupStu(musicGroupId);
         List<Integer> userIds = studentRegistrations.stream().filter(e -> e.getMusicGroupStatus() == StudentMusicGroupStatusEnum.NORMAL).map(StudentRegistration::getUserId).collect(Collectors.toList());
-        if(userIds.size() == 0){
-            resultMap.put("courseRate","0.00%");
+        if (userIds.size() == 0) {
+            resultMap.put("courseRate", "0.00%");
             return resultMap;
         }
-        List<Integer> hasCourseStudent = courseScheduleDao.findHasCourseStudent(userIds,"VIP,PRACTICE");
+        List<Integer> hasCourseStudent = courseScheduleDao.findHasCourseStudent(userIds, "VIP,PRACTICE");
         double size = userIds.size() + 0d;
-        if(hasCourseStudent.size() == 0){
-            resultMap.put("courseRate","0.00%");
-        }else {
+        if (hasCourseStudent.size() == 0) {
+            resultMap.put("courseRate", "0.00%");
+        } else {
             double d = (hasCourseStudent.size() / size) * 100;
-            resultMap.put("courseRate",String.format("%.2f", d) + "%");
+            resultMap.put("courseRate", String.format("%.2f", d) + "%");
         }
         return resultMap;
     }
@@ -637,16 +640,12 @@ public class StudentManageServiceImpl implements StudentManageService {
     public void updateUser(SysUser sysUser) {
         studentManageDao.updateUser(sysUser);
         Student student = studentDao.get(sysUser.getId());
-        if(student != null) {
+        if (student != null) {
             student.setCurrentGradeNum(sysUser.getCurrentGradeNum());
             student.setCurrentClass(sysUser.getCurrentClass());
+            Optional.ofNullable(sysUser.getSubjectId()).ifPresent(student::setSubjectIdList);
             studentDao.update(student);
         }
-//        StudentRegistration studentRegistration = new StudentRegistration();
-//        studentRegistration.setUserId(sysUser.getId());
-//        studentRegistration.setCurrentClass(sysUser.getCurrentClass());
-//        studentRegistration.setCurrentGrade(sysUser.getCurrentGrade());
-//        studentRegistrationDao.updateCurrentClass(studentRegistration);
     }
 
     @Override
@@ -686,7 +685,7 @@ public class StudentManageServiceImpl implements StudentManageService {
         Date date = new Date();
         SysUser sysUser = teacherDao.getUserWithPhone(student.getPhone());
         if (sysUser != null) {
-            EmployeeServiceImpl.checkTenantId(student.getTenantId(),sysUser.getTenantId());
+            EmployeeServiceImpl.checkTenantId(student.getTenantId(), sysUser.getTenantId());
             if (sysUser.getUserType().contains("STUDENT")) {
                 throw new BizException("手机号已被占用");
             } else {
@@ -738,13 +737,13 @@ public class StudentManageServiceImpl implements StudentManageService {
         // 同步更新机构手机号 如果它存在
         SysUser user = teacherDao.getUser(student.getId());
         tenantInfoService.updatePhone(student.getPhone(), user.getPhone());
-        activityUserMapperDao.updateTeacherId(student.getUserId(),student.getTeacherId());
-        if(Objects.nonNull(student.getCarePackage())||Objects.nonNull(student.getComeOnPackage())){
+        activityUserMapperDao.updateTeacherId(student.getUserId(), student.getTeacherId());
+        if (Objects.nonNull(student.getCarePackage()) || Objects.nonNull(student.getComeOnPackage())) {
             Student oldStudent = studentDao.get(userId);
-            if(Objects.nonNull(oldStudent.getCarePackage())&&oldStudent.getCarePackage().equals(2)){
+            if (Objects.nonNull(oldStudent.getCarePackage()) && oldStudent.getCarePackage().equals(2)) {
                 student.setCarePackage(oldStudent.getCarePackage());
             }
-            if(Objects.nonNull(oldStudent.getComeOnPackage())&&oldStudent.getComeOnPackage().equals(2)){
+            if (Objects.nonNull(oldStudent.getComeOnPackage()) && oldStudent.getComeOnPackage().equals(2)) {
                 student.setComeOnPackage(oldStudent.getComeOnPackage());
             }
         }
@@ -754,8 +753,8 @@ public class StudentManageServiceImpl implements StudentManageService {
             LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
             studentExtracurricularExercisesSituationService.deleteByStudent(student.getId(), monDayDate.toString());
         }
-        webFeignService.updateNickName(userId,student.getUsername());
-        imFeignService.update(new ImUserModel(userId.toString(),student.getUsername(),sysUser1 == null ? null:sysUser1.getAvatar()));
+        webFeignService.updateNickName(userId, student.getUsername());
+        imFeignService.update(new ImUserModel(userId.toString(), student.getUsername(), sysUser1 == null ? null : sysUser1.getAvatar()));
         return userId;
     }
 
@@ -786,9 +785,9 @@ public class StudentManageServiceImpl implements StudentManageService {
         studentNum = studentNum == null ? 0 : studentNum;
         signInNum = signInNum == null ? 0 : signInNum;
         leaveNum = leaveNum == null ? 0 : leaveNum;
-        if(Objects.nonNull(courseSchedule)&& !CourseStatusEnum.NOT_START.equals(courseSchedule.getStatus())){
+        if (Objects.nonNull(courseSchedule) && !CourseStatusEnum.NOT_START.equals(courseSchedule.getStatus())) {
             sum.put("truantNum", studentNum - signInNum - leaveNum);
-        }else{
+        } else {
             sum.put("truantNum", 0);
         }
         sum.put("homeworkNum", studentManageDao.countHomeworkNum(courseScheduleId));
@@ -815,14 +814,14 @@ public class StudentManageServiceImpl implements StudentManageService {
 
             List<UserGroupDto> allUserGroups = studentRegistrationDao.getUserGroups(new ArrayList<>(studentIds));
             Map<Integer, List<UserGroupDto>> userGroupsMap = new HashMap<>();
-            if(!CollectionUtils.isEmpty(allUserGroups)){
+            if (!CollectionUtils.isEmpty(allUserGroups)) {
                 userGroupsMap = allUserGroups.stream().collect(Collectors.groupingBy(UserGroupDto::getUserId));
             }
 
             for (Student4operating student4operating : dataList) {
                 List<UserGroupDto> userGroupDtos = userGroupsMap.get(student4operating.getStudentId());
-                if(!CollectionUtils.isEmpty(userGroupDtos)){
-                    student4operating.setGroupNames(userGroupDtos.stream().filter(ug->StringUtils.isNotBlank(ug.getGroupName())).map(UserGroupDto::getGroupName).sorted().collect(Collectors.joining(",")));
+                if (!CollectionUtils.isEmpty(userGroupDtos)) {
+                    student4operating.setGroupNames(userGroupDtos.stream().filter(ug -> StringUtils.isNotBlank(ug.getGroupName())).map(UserGroupDto::getGroupName).sorted().collect(Collectors.joining(",")));
                 }
             }
         }
@@ -831,14 +830,14 @@ public class StudentManageServiceImpl implements StudentManageService {
     }
 
     @Override
-    public List<BasicUserDto> queryCanAddStudent(String musicGroupId, String batchNo,String search,Integer subjectId) {
-        return studentManageDao.queryCanAddStudent(musicGroupId, batchNo,search,subjectId);
+    public List<BasicUserDto> queryCanAddStudent(String musicGroupId, String batchNo, String search, Integer subjectId) {
+        return studentManageDao.queryCanAddStudent(musicGroupId, batchNo, search, subjectId);
     }
 
     @Override
     public PageInfo<BasicUserDto> queryGroupStudents(StudentQueryInfo queryInfo) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(sysUser == null || sysUser.getId() == null){
+        if (sysUser == null || sysUser.getId() == null) {
             throw new BizException("用户信息获取失败");
         }
         PageInfo<BasicUserDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
@@ -847,17 +846,17 @@ public class StudentManageServiceImpl implements StudentManageService {
         MapUtil.populateMap(params, queryInfo);
         params.put("offset", pageInfo.getOffset());
         Integer count = 0;
-        if("VIP".equals(queryInfo.getGroupType())){
+        if ("VIP".equals(queryInfo.getGroupType())) {
             count = studentManageDao.countVipGroupStudents(params);
-        }else {
+        } else {
             count = studentManageDao.countPracticeGroupStudents(params);
         }
         List<BasicUserDto> dataList = new ArrayList<>();
         if (count > 0) {
             pageInfo.setTotal(count);
-            if("VIP".equals(queryInfo.getGroupType())){
+            if ("VIP".equals(queryInfo.getGroupType())) {
                 dataList = studentManageDao.queryVipGroupStudents(params);
-            }else {
+            } else {
                 dataList = studentManageDao.queryPracticeGroupStudents(params);
             }
         }
@@ -868,7 +867,7 @@ public class StudentManageServiceImpl implements StudentManageService {
     @Override
     public PageInfo<StudentNoStartCoursesDto> queryStudentNoStartCourse(StudentQueryInfo queryInfo) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if(sysUser == null || sysUser.getId() == null){
+        if (sysUser == null || sysUser.getId() == null) {
             throw new BizException("用户信息获取失败");
         }
         PageInfo<StudentNoStartCoursesDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
@@ -887,13 +886,35 @@ public class StudentManageServiceImpl implements StudentManageService {
     }
 
     @Override
-    public List<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(String musicGroupId) {
-        List<StudentSubTotalCourseTimesDto> timesDtos = musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTimes(musicGroupId);
-        Map<Integer,String> classMap = MapUtil.convertMybatisMap(classGroupDao.queryStudentClassGroupMap(musicGroupId));
-        for (StudentSubTotalCourseTimesDto timesDto : timesDtos) {
-            timesDto.setClassGroupId(classMap.get(timesDto.getUserId()));
+    public Integer countStudentSubTotalCourseTimes(StudentSubTotalCourseTimesQueryInfo queryInfo) {
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        return musicGroupPaymentStudentCourseDetailDao.countStudentSubTotalCourseTimes(params);
+    }
+
+    @Override
+    public PageInfo<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(StudentSubTotalCourseTimesQueryInfo queryInfo) {
+        PageInfo<StudentSubTotalCourseTimesDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        params.put("offset", pageInfo.getOffset());
+
+        int count = musicGroupPaymentStudentCourseDetailDao.countStudentSubTotalCourseTimes(params);
+        List<StudentSubTotalCourseTimesDto> dataList = new ArrayList<>();
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            dataList = musicGroupPaymentStudentCourseDetailDao.pageStudentSubTotalCourseTimes(params);
+            //内部分页
+            int endIdx = pageInfo.getPageNo() * pageInfo.getLimit();
+            dataList = dataList.subList(pageInfo.getOffset(), dataList.size() > endIdx ? endIdx : dataList.size());
+
+            Map<Integer, String> classMap = MapUtil.convertMybatisMap(classGroupDao.queryStudentClassGroupMap(queryInfo.getMusicGroupId()));
+            for (StudentSubTotalCourseTimesDto timesDto : dataList) {
+                timesDto.setClassGroupId(classMap.get(timesDto.getUserId()));
+            }
         }
-        return timesDtos;
+        pageInfo.setRows(dataList);
+        return pageInfo;
     }
 
     @Override
@@ -904,7 +925,7 @@ public class StudentManageServiceImpl implements StudentManageService {
 
         Integer tenantId = TenantContextHolder.getTenantId();
         String studentErrorLeaveNum = sysTenantConfigService.getTenantConfigValue(SysConfigService.STUDENT_ERROR_LEAVE_NUM, tenantId);
-        if(StringUtils.isEmpty(studentErrorLeaveNum)){
+        if (StringUtils.isEmpty(studentErrorLeaveNum)) {
             return pageInfo;
         }
         Map<String, Object> params = new HashMap<>();
@@ -916,21 +937,21 @@ public class StudentManageServiceImpl implements StudentManageService {
         params.put("currentMonth", currentMonth);
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         //当前用户是否是分部经理
-        Boolean onlyForRole = employeePositionService.onlyForRole(SysUserRoleEnum.EDUCATION,sysUser.getId(),sysUser.getIsSuperAdmin());
+        Boolean onlyForRole = employeePositionService.onlyForRole(SysUserRoleEnum.EDUCATION, sysUser.getId(), sysUser.getIsSuperAdmin());
         if (onlyForRole) {
             //获取教务老师关联的班级列表
             List<Long> classGroupIds = classGroupDao.queryGroupClassGroupIds(sysUser.getId());
-            if(classGroupIds == null || classGroupIds.size() == 0){
+            if (classGroupIds == null || classGroupIds.size() == 0) {
                 return pageInfo;
             }
             params.put("classGroupIds", classGroupIds);
         }
-        params.put("studentErrorLeaveNum",studentErrorLeaveNum);
+        params.put("studentErrorLeaveNum", studentErrorLeaveNum);
         int count = indexBaseMonthDataDao.countStudentErrorLeave1(params);
         List<StudentErrorLeaveDto> dataList = new ArrayList<>();
         if (count > 0) {
             //获取近两个月异常请假次数
-            Map<Integer,BigDecimal> leaveNumMap = MapUtil.convertIntegerMap(indexBaseMonthDataDao.getStudentErrorLeaveNumMap(params));
+            Map<Integer, BigDecimal> leaveNumMap = MapUtil.convertIntegerMap(indexBaseMonthDataDao.getStudentErrorLeaveNumMap(params));
             pageInfo.setTotal(count);
             dataList = indexBaseMonthDataDao.queryStudentErrorLeave(params);
             for (StudentErrorLeaveDto studentErrorLeaveDto : dataList) {
@@ -962,47 +983,47 @@ public class StudentManageServiceImpl implements StudentManageService {
     @Transactional(rollbackFor = Exception.class)
     public void updateChildrenDayStudent(ActivityCourseDetailDto activityCourseDetailDto) {
         Student student = studentDao.getLocked(activityCourseDetailDto.getUserId());
-        if(student == null){
+        if (student == null) {
             throw new BizException("学员信息不存在");
         }
-        if(!activityCourseDetailDto.getVip1().equals(0) && !activityCourseDetailDto.getVip1().equals(1)){
+        if (!activityCourseDetailDto.getVip1().equals(0) && !activityCourseDetailDto.getVip1().equals(1)) {
             throw new BizException("修改失败:排课次数异常");
         }
-        if(!activityCourseDetailDto.getVip2().equals(0) && !activityCourseDetailDto.getVip2().equals(1)){
+        if (!activityCourseDetailDto.getVip2().equals(0) && !activityCourseDetailDto.getVip2().equals(1)) {
             throw new BizException("修改失败:排课次数异常");
         }
-        if(!activityCourseDetailDto.getFree_vip().equals(0) && !activityCourseDetailDto.getFree_vip().equals(1)){
+        if (!activityCourseDetailDto.getFree_vip().equals(0) && !activityCourseDetailDto.getFree_vip().equals(1)) {
             throw new BizException("修改失败:排课次数异常");
         }
-        if(!activityCourseDetailDto.getMusic_theory().equals(0) && !activityCourseDetailDto.getMusic_theory().equals(1)){
+        if (!activityCourseDetailDto.getMusic_theory().equals(0) && !activityCourseDetailDto.getMusic_theory().equals(1)) {
             throw new BizException("修改失败:排课次数异常");
         }
-        if(activityCourseDetailDto.getMusic_theory().equals(1)){
+        if (activityCourseDetailDto.getMusic_theory().equals(1)) {
             String activityCourseDetail = student.getActivityCourseDetail();
-            if(StringUtils.isNotEmpty(activityCourseDetail)){
+            if (StringUtils.isNotEmpty(activityCourseDetail)) {
                 ActivityCourseDetailDto detailDto = JSON.parseObject(activityCourseDetail, ActivityCourseDetailDto.class);
-                if(detailDto.getMusic_theory() == null || detailDto.getMusic_theory().equals(0)){
+                if (detailDto.getMusic_theory() == null || detailDto.getMusic_theory().equals(0)) {
                     SysUser sysUser = sysUserFeignService.queryUserById(student.getUserId());
-                    if(sysUser == null){
+                    if (sysUser == null) {
                         throw new BizException("请登录");
                     }
                     OrganizationDegreeCourseFee degreeCourseFee = organizationDegreeCourseFeeDao.getByOrganId(sysUser.getOrganId());
-                    if(degreeCourseFee == null){
+                    if (degreeCourseFee == null) {
                         throw new BizException("学员所在分部未配置考级价格");
                     }
                     activityCourseDetailDto.setMusic_theory_price(degreeCourseFee.getTheory());
-                }else {
+                } else {
                     activityCourseDetailDto.setMusic_theory_price(detailDto.getMusic_theory_price());
                 }
-            }else {
+            } else {
                 SysUser sysUser = teacherDao.getUser(student.getUserId());
                 OrganizationDegreeCourseFee degreeCourseFee = organizationDegreeCourseFeeDao.getByOrganId(sysUser.getOrganId());
-                if(degreeCourseFee == null){
+                if (degreeCourseFee == null) {
                     throw new BizException("学员所在分部未配置考级价格");
                 }
                 activityCourseDetailDto.setMusic_theory_price(degreeCourseFee.getTheory());
             }
-        }else {
+        } else {
             activityCourseDetailDto.setMusic_theory_price(BigDecimal.ZERO);
         }
         activityCourseDetailDto.setUserId(null);
@@ -1015,35 +1036,35 @@ public class StudentManageServiceImpl implements StudentManageService {
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
         List<Integer> studentIds = new ArrayList<>();
-        params.put("studentIds",studentIds);
+        params.put("studentIds", studentIds);
         PageInfo<Student> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-        if(queryInfo.getHasMusicCourse() != null){
-            params.put("groupType","MUSIC");
-            params.put("hasCourse",queryInfo.getHasMusicCourse());
+        if (queryInfo.getHasMusicCourse() != null) {
+            params.put("groupType", "MUSIC");
+            params.put("hasCourse", queryInfo.getHasMusicCourse());
             studentIds = courseScheduleDao.queryHasCourseStudentIds(params);
-            if(studentIds == null || studentIds.size() == 0){
+            if (studentIds == null || studentIds.size() == 0) {
                 return pageInfo;
             }
         }
-        if(queryInfo.getHasPracticeCourse() != null){
-            params.put("groupType","PRACTICE");
-            params.put("hasCourse",queryInfo.getHasPracticeCourse());
-            params.put("studentIds",studentIds);
+        if (queryInfo.getHasPracticeCourse() != null) {
+            params.put("groupType", "PRACTICE");
+            params.put("hasCourse", queryInfo.getHasPracticeCourse());
+            params.put("studentIds", studentIds);
             studentIds = courseScheduleDao.queryHasCourseStudentIds(params);
-            if(studentIds == null || studentIds.size() == 0){
+            if (studentIds == null || studentIds.size() == 0) {
                 return pageInfo;
             }
         }
-        if(queryInfo.getHasVipCourse() != null){
-            params.put("groupType","VIP");
-            params.put("hasCourse",queryInfo.getHasVipCourse());
-            params.put("studentIds",studentIds);
+        if (queryInfo.getHasVipCourse() != null) {
+            params.put("groupType", "VIP");
+            params.put("hasCourse", queryInfo.getHasVipCourse());
+            params.put("studentIds", studentIds);
             studentIds = courseScheduleDao.queryHasCourseStudentIds(params);
-            if(studentIds == null || studentIds.size() == 0){
+            if (studentIds == null || studentIds.size() == 0) {
                 return pageInfo;
             }
         }
-        params.put("studentIds",studentIds);
+        params.put("studentIds", studentIds);
         List<Student> dataList = null;
         int count = studentDao.countStudent(params);
         if (count > 0) {

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

@@ -67,6 +67,11 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
         return studentPaymentOrderDetailDao;
     }
 
+    @Override
+    public StudentPaymentOrderDetailDao getDao() {
+        return studentPaymentOrderDetailDao;
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public int batchAdd(List<StudentPaymentOrderDetail> studentPaymentOrderDetailList) {

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

@@ -27,6 +27,7 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.adapay.ConfigInit;
 import com.ym.mec.thirdparty.adapay.Payment;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import com.ym.mec.thirdparty.yqpay.*;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
@@ -115,6 +116,9 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private TenantConfigService tenantConfigService;
     @Autowired
     private GoodsProcurementDao goodsProcurementDao;
+    
+    @Autowired
+    private HfMerchantConfigService hfMerchantConfigService;
 
     @Override
     public BaseDAO<Long, StudentPaymentOrder> getDAO() {
@@ -174,7 +178,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             return notifyMap;
         }
 
-        Map<String, Object> payMap = payService.getPayMap(cashAmount, balance, studentPaymentOrder.getOrderNo(), baseApiUrl + "/api-student/studentOrder/notify", baseApiUrl
+        Map<String, Object> payMap = payService.getPayMap(cashAmount, balance, studentPaymentOrder.getOrderNo(), baseApiUrl + "/api-student/studentOrder/callback", baseApiUrl
                 + "/api-student/studentOrder/paymentResult?orderNo=" + studentPaymentOrder.getOrderNo(), studentPaymentOrder.getMemo(), studentPaymentOrder.getMemo(), studentPaymentOrder.getOrganId(), payReceiver);
 
         studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
@@ -277,6 +281,10 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         if (payingOrders.size() == 0) {
             return;
         }
+        
+        Map<Integer,HfMerchantConfig> payConfigMap = new HashMap<Integer, HfMerchantConfig>();
+        HfMerchantConfig hfMerchantConfig = null;
+        
         List<String> orderNoList = new ArrayList<String>();
 
         for (StudentPaymentOrder payingOrder : payingOrders) {
@@ -292,7 +300,17 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             if (DateUtil.minutesBetween(payingOrder.getCreateTime(), date) < 10) {
                 continue;
             }
-            Map<String, Object> payment = Payment.queryPayment(payingOrder.getTransNo());
+            
+            hfMerchantConfig = payConfigMap.get(payingOrder.getTenantId());
+            if(hfMerchantConfig == null){
+            	hfMerchantConfig = hfMerchantConfigService.queryByTenantId(payingOrder.getTenantId());
+                if(hfMerchantConfig == null){
+                	throw new BizException("机构[{}]汇付商户信息找不到", payingOrder.getTenantId());
+                }
+            	payConfigMap.put(payingOrder.getTenantId(), hfMerchantConfig);
+            }
+            
+            Map<String, Object> payment = Payment.queryPayment(payingOrder.getTransNo(), hfMerchantConfig.getMerKey());
             LOGGER.info("订单[{}]交易主动查询接口返回:{}", payingOrder.getTransNo(), payment);
 
             Map<String, String> rpMap = new HashMap<>();
@@ -397,8 +415,18 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             return true;
         }
         Date date = new Date();
+        
+        HfMerchantConfig hfMerchantConfig = null;
+        
         List<StudentPaymentRouteOrder> routeOrders = studentPaymentRouteOrderDao.getRouteOrders(order.getOrderNo());
         for (StudentPaymentRouteOrder routeOrder : routeOrders) {
+        	if(hfMerchantConfig == null){
+        		hfMerchantConfig = hfMerchantConfigService.queryByTenantId(routeOrder.getTenantId());
+        	}
+            if(hfMerchantConfig == null){
+            	throw new BizException("机构[{}]汇付商户信息找不到", routeOrder.getTenantId());
+            }
+            
             Map<String, Object> divMember = new HashMap<>();
             divMember.put("member_id", routeOrder.getMerNo());//分佣账户
             divMember.put("amount", routeOrder.getRouteAmount().setScale(2, BigDecimal.ROUND_HALF_UP));//分佣金额
@@ -415,7 +443,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             confirm.put("confirm_amt", routeOrder.getRouteAmount());
             confirm.put("div_members", divMembers);
             try {
-                Map<String, Object> map = Payment.createConfirm(confirm);
+                Map<String, Object> map = Payment.createConfirm(confirm, hfMerchantConfig.getMerKey());
                 LOGGER.info("分账信息返回:{}", map);
                 routeOrder.setServiceFee(new BigDecimal(map.get("fee_amt").toString()));
                 routeOrder.setUpdateTime(date);
@@ -675,12 +703,21 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
-    public PayStatus queryPayStatus(String paymentChannel, String orderNo, String transNo) throws Exception {
+    public PayStatus queryPayStatus(StudentPaymentOrder studentPaymentOrder) throws Exception {
+    	
+    	String paymentChannel = studentPaymentOrder.getPaymentChannel();
+    	String orderNo = studentPaymentOrder.getOrderNo();
+    	String transNo = studentPaymentOrder.getTransNo();
+    	
         if (StringUtils.isBlank(transNo)) {
             return PayStatus.FAILED;
         }
         if (StringUtils.equals(paymentChannel, "ADAPAY")) {
-            Map<String, Object> payment = Payment.queryPayment(transNo);
+        	HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(studentPaymentOrder.getTenantId());
+            if(hfMerchantConfig == null){
+            	throw new BizException("机构[{}]汇付商户信息找不到", studentPaymentOrder.getTenantId());
+            }
+            Map<String, Object> payment = Payment.queryPayment(transNo, hfMerchantConfig.getMerKey());
             String status = (String) payment.get("status");
             if (status.equals("succeeded")) {
                 return PayStatus.SUCCESSED;
@@ -789,7 +826,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult checkRepeatPay(StudentPaymentOrder order, Boolean repeatPay) throws Exception {
         // 查询订单状态
-        PayStatus payStatus = this.queryPayStatus(order.getPaymentChannel(), order.getOrderNo(), order.getTransNo());
+        PayStatus payStatus = this.queryPayStatus(order);
         if (payStatus == PayStatus.SUCCESSED) {
             throw new BizException("订单已支付成功,请勿重复支付");
         }

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

@@ -11,7 +11,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.ym.mec.biz.dal.dao.StudentRechargeDao;
-import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.entity.StudentRecharge;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
@@ -20,6 +20,7 @@ import com.ym.mec.biz.dal.enums.PlatformCashAccountStatusEnum;
 import com.ym.mec.biz.dal.enums.TransTypeEnum;
 import com.ym.mec.biz.service.PayService;
 import com.ym.mec.biz.service.StudentRechargeService;
+import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysUserCashAccountDetailService;
 import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.dal.BaseDAO;
@@ -41,6 +42,9 @@ public class StudentRechargeServiceImpl extends BaseServiceImpl<String, StudentR
 
 	@Autowired
 	private PayService payService;
+	
+    @Autowired
+    private SysConfigDao sysConfigDao;
 
 	@Autowired
 	private IdGeneratorService idGeneratorService;
@@ -73,9 +77,11 @@ public class StudentRechargeServiceImpl extends BaseServiceImpl<String, StudentR
 		studentRecharge.setTransNo(null);
 		studentRecharge.setOrderNo(idGeneratorService.generatorId("payment") + "");
 		studentRechargeDao.insert(studentRecharge);
+		
+        String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL);
 
 		try {
-			return payService.getPayMap(amount, BigDecimal.ZERO,studentRecharge.getOrderNo(), "https://pay.dayaedu.com/api/yqpay/notify", "http://dev.dayaedu.com", "充值",
+			return payService.getPayMap(amount, BigDecimal.ZERO,studentRecharge.getOrderNo(), baseApiUrl + "/api-student/studentOrder/callback", baseApiUrl, "充值",
 					"充值",userId,null);
 		} catch (Exception e) {
 			throw new BizException("调用支付接口出错", e);

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

@@ -182,7 +182,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
             } else if (orderByOrderNo.getStatus() == ING) {
 
                 // 查询订单状态
-                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(orderByOrderNo.getPaymentChannel(), orderByOrderNo.getOrderNo(), orderByOrderNo.getTransNo());
+                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(orderByOrderNo);
                 if (payStatus != PayStatus.FAILED) {
                     if (payStatus == PayStatus.SUCCESSED) {
                         throw new BizException("订单已支付成功,请勿重复支付");
@@ -456,7 +456,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                 amount,
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?type=edu&orderNo=" + orderNo,
                 "商品销售",
                 "商品销售",
@@ -575,7 +575,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                 amount,
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?type=edu&orderNo=" + orderNo,
                 "商品销售",
                 "商品销售",
@@ -794,7 +794,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                 amount,
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?type=edu&orderNo=" + orderNo,
                 "乐器维修",
                 "乐器维修",
@@ -1049,7 +1049,7 @@ public class StudentRepairServiceImpl extends BaseServiceImpl<Integer, StudentRe
                 amount,
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                 "乐器维修",
                 "乐器维修",

+ 27 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -23,7 +23,9 @@ import java.util.stream.Collectors;
 import javax.annotation.PostConstruct;
 
 import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.*;
+import com.ym.mec.common.page.QueryInfo;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -49,16 +51,6 @@ import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dao.SysMusicCompareRecordDao;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.entity.BaseStudentDto;
-import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
-import com.ym.mec.biz.dal.entity.CooperationOrgan;
-import com.ym.mec.biz.dal.entity.CourseSchedule;
-import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
-import com.ym.mec.biz.dal.entity.MemberRankSetting;
-import com.ym.mec.biz.dal.entity.Organization;
-import com.ym.mec.biz.dal.entity.Student;
-import com.ym.mec.biz.dal.entity.StudentPreRegistration;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.enums.FivePlusGradeEnum;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
@@ -1358,6 +1350,31 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         return pageInfo;
     }
 
+    @Override
+    public PageInfo<BasicUserDto> queryStudent(QueryInfo queryInfo) {
+        PageInfo<BasicUserDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<BasicUserDto> dataList = null;
+        int count = teacherDao.countStudent(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = teacherDao.queryStudent(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public List<BaseMapDto> queryStuSubjectId(String organIds) {
+        return studentDao.queryStuSubjectId(organIds);
+    }
+
     @Transactional(rollbackFor = Exception.class)
     public  <T extends BaseStudentDto> void insertStudent(T baseStudent){
         Student student = new Student();

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

@@ -203,7 +203,7 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
 
             if (studentPaymentOrder != null && studentPaymentOrder.getStatus() == DealStatusEnum.ING) {
                 // 查询订单状态
-                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(studentPaymentOrder.getPaymentChannel(), studentPaymentOrder.getOrderNo(), studentPaymentOrder.getTransNo());
+                PayStatus payStatus = studentPaymentOrderService.queryPayStatus(studentPaymentOrder);
                 if (payStatus != PayStatus.FAILED) {
                     if (payStatus == PayStatus.SUCCESSED) {
                         throw new BizException("订单已支付成功,请勿重复支付");
@@ -427,7 +427,7 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
                 amount,
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                 "声部更换",
                 "声部更换",

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

@@ -34,6 +34,7 @@ import java.math.BigDecimal;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -167,6 +168,8 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		jsonObject.put("heardLevel", userLastEvaluationData.getHeardLevel());
 		jsonObject.put("videoFilePath", userLastEvaluationData.getVideoFilePath());
 		jsonObject.put("partIndex", userLastEvaluationData.getPartIndex());
+		jsonObject.put("expire",DateUtil.isOverdue(userLastEvaluationData.getCreateTime(),
+				sysConfigDao.findConfigValue("file_expiration_time")));
 
 		SysMusicScore sysMusicScore = sysMusicScoreDao.get(userLastEvaluationData.getSysMusicScoreId());
 		if(Objects.nonNull(sysMusicScore)){
@@ -323,6 +326,9 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		if (count == 0) {
 			dataList = new ArrayList<>();
 		}
+		Function<Date,Boolean> expirationFun = (submitTime)->DateUtil.isOverdue(submitTime,sysConfigDao.findConfigValue("file_expiration_time"));
+		dataList.forEach(e->e.setExpire(expirationFun.apply(e.getCreateTime())));
+
 		pageInfo.setRows(dataList);
 		Map<String, Object> result = new HashMap<>();
 		userTrainOverView.setTrainTime(userTrainOverView.getTrainTime()/60);

+ 53 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreServiceImpl.java

@@ -21,6 +21,7 @@ import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.SysMusicScoreMetronomeTranscod;
 import com.ym.mec.biz.dal.dto.SysMusicScoreTranscod;
 import com.ym.mec.biz.dal.entity.SysMusicScoreChangeLog;
+import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.UploadFileService;
 import com.ym.mec.common.entity.UploadReturnBean;
 import com.ym.mec.common.service.IdGeneratorService;
@@ -28,7 +29,6 @@ import com.ym.mec.util.file.FileUtil;
 import com.ym.mec.util.shell.ScriptUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.commons.util.IdUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -68,6 +68,8 @@ public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicS
     private IdGeneratorService idGeneratorService;
     @Autowired
     private UploadFileService uploadFileService;
+    @Autowired
+    private OrganizationService organizationService;
 
     @Override
     public BaseDAO<Integer, SysMusicScore> getDAO() {
@@ -185,10 +187,26 @@ public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicS
         }
     }
 
-    @Override
-    public PageInfo<SysMusicScore> queryMusicScorePage(SysExamSongQueryInfo queryInfo) {
-        PageInfo<SysMusicScore> sysMusicScorePageInfo = queryPage(queryInfo);
-        List<SysMusicScore> rows = sysMusicScorePageInfo.getRows();
+    private void dealMusicScoreParam(SysExamSongQueryInfo queryInfo){
+        queryInfo.setOrganId(organizationService.getEmployeeOrgan(queryInfo.getOrganId()));
+        if(queryInfo.getCategoriesId() != null){
+            List<Integer> categoriesIdList = new ArrayList<>();
+            Integer categoriesId = Integer.parseInt(queryInfo.getCategoriesId());
+
+            SysMusicScoreCategories sysMusicScoreCategories = sysMusicScoreCategoriesService.get(categoriesId);
+
+            if(sysMusicScoreCategories == null){
+                throw new BizException("分类找不到");
+            }
+            categoriesIdList.add(categoriesId);
+            sysMusicScoreCategories = sysMusicScoreCategoriesService.getChildTree(sysMusicScoreCategories);
+            getAllCategoryIdList(categoriesIdList, sysMusicScoreCategories.getSysMusicScoreCategoriesList());
+
+            queryInfo.setCategoriesIdList(categoriesIdList);
+        }
+    }
+
+    private void dealMusicScoreData(List<SysMusicScore> rows){
         if (rows != null && rows.size() > 0) {
             Set<Integer> categoriesIds = rows.stream().map(e -> e.getMusicScoreCategoriesId()).collect(Collectors.toSet());
             //获取分部列表
@@ -198,11 +216,14 @@ public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicS
             subjectIds.removeAll(Collections.singleton(null));
             Map<Long, String> subjectMap = new HashMap();
             if (subjectIds.size() > 0) {
-                subjectMap = MapUtil.convertMybatisMap(subjectDao.findBySubjecIds(StringUtils.join(subjectIds, ",")));
+                String ids = StringUtils.join(subjectIds, ",");
+                subjectMap = MapUtil.convertMybatisMap(subjectDao.findBySubjecIds(ids));
             }
             Map<Integer, String> map = new HashMap<>(categoriesIds.size());
             for (Integer categoriesId : categoriesIds) {
-                map.put(categoriesId, getParentTreeName(categoriesId));
+                if(null != categoriesId){
+                    map.put(categoriesId, getParentTreeName(categoriesId));
+                }
             }
             for (SysMusicScore row : rows) {
                 row.setCategoriesName(map.get(row.getMusicScoreCategoriesId()));
@@ -210,6 +231,30 @@ public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicS
                 row.setSubjectName(subjectMap.get(row.getSubjectId()));
             }
         }
+    }
+
+    @Override
+    public List<SysMusicScore> queryMusicScoreAll(SysExamSongQueryInfo queryInfo) {
+        //封装查询参数
+        dealMusicScoreParam(queryInfo);
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<SysMusicScore> rows = findAll(params);
+        //处理查询结果
+        dealMusicScoreData(rows);
+        return rows;
+    }
+
+    @Override
+    public PageInfo<SysMusicScore> queryMusicScorePage(SysExamSongQueryInfo queryInfo) {
+        //封装查询参数
+        dealMusicScoreParam(queryInfo);
+
+        PageInfo<SysMusicScore> sysMusicScorePageInfo = queryPage(queryInfo);
+        List<SysMusicScore> rows = sysMusicScorePageInfo.getRows();
+        //处理查询结果
+        dealMusicScoreData(rows);
         return sysMusicScorePageInfo;
     }
 
@@ -386,4 +431,5 @@ public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicS
         }
 
     }
+
 }

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

@@ -874,4 +874,9 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
         return PageUtil.pageInfo(teacherDao.getStudentsByTeacherOrgan(pageInfo, param));
     }
 
+    @Override
+    public List<BaseMapDto<Integer, String>> queryOrganList(Integer userId) {
+        return teacherDao.queryOrganList(userId);
+    }
+
 }

+ 105 - 47
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java

@@ -1,5 +1,50 @@
 package com.ym.mec.biz.service.impl;
 
+import static com.ym.mec.biz.dal.enums.MessageTypeEnum.EMAIL_TENANT_EXPIRATION_REMINDERS;
+import static com.ym.mec.biz.dal.enums.MessageTypeEnum.EMAIL_TENANT_RENEWAL_SUCCESSFUL;
+import static com.ym.mec.biz.dal.enums.MessageTypeEnum.SMS_TENANT_EXPIRATION_REMINDERS;
+import static com.ym.mec.biz.dal.enums.MessageTypeEnum.SMS_TENANT_RENEWAL_SUCCESSFUL;
+
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.LocalDate;
+import org.joda.time.LocalDateTime;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -9,18 +54,56 @@ import com.ym.mec.auth.api.entity.SysRole;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.enums.SysUserType;
 import com.ym.mec.biz.dal.dao.OrganizationDao;
-import com.ym.mec.biz.dal.dao.TenantContractTemplateDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dao.TenantInfoDao;
 import com.ym.mec.biz.dal.dto.TenantConfigDto;
 import com.ym.mec.biz.dal.dto.TenantInfoDto;
 import com.ym.mec.biz.dal.dto.TenantProductInfoDto;
-import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.entity.PlatformServe;
+import com.ym.mec.biz.dal.entity.PlatformServeDetail;
+import com.ym.mec.biz.dal.entity.SysArea;
+import com.ym.mec.biz.dal.entity.SysConfig;
+import com.ym.mec.biz.dal.entity.SysUserTenant;
+import com.ym.mec.biz.dal.entity.SysUserTsign;
+import com.ym.mec.biz.dal.entity.TenantAssetsInfo;
+import com.ym.mec.biz.dal.entity.TenantConfig;
+import com.ym.mec.biz.dal.entity.TenantContractRecord;
 import com.ym.mec.biz.dal.entity.TenantContractRecord.TenantContractRecordEnum;
-import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.entity.TenantInfo;
+import com.ym.mec.biz.dal.entity.TenantOrderRecord;
+import com.ym.mec.biz.dal.entity.TenantPreJoin;
+import com.ym.mec.biz.dal.entity.TenantProductInfo;
+import com.ym.mec.biz.dal.entity.TenantProductSumm;
+import com.ym.mec.biz.dal.enums.GradeTypeEnum;
+import com.ym.mec.biz.dal.enums.JobNatureEnum;
+import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
+import com.ym.mec.biz.dal.enums.TenantOrderRecordEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
 import com.ym.mec.biz.dal.vo.PlatformServePageVo;
 import com.ym.mec.biz.dal.vo.SysUserTenantVo;
 import com.ym.mec.biz.dal.vo.TenantInfoPageVo;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.service.ContractService;
+import com.ym.mec.biz.service.EmployeeService;
+import com.ym.mec.biz.service.PayService;
+import com.ym.mec.biz.service.PlatformProductService;
+import com.ym.mec.biz.service.PlatformServeDetailService;
+import com.ym.mec.biz.service.PlatformServeService;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.biz.service.SysAreaService;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.SysUserTenantService;
+import com.ym.mec.biz.service.SysUserTsignService;
+import com.ym.mec.biz.service.TenantAssetsInfoService;
+import com.ym.mec.biz.service.TenantConfigService;
+import com.ym.mec.biz.service.TenantContractRecordService;
+import com.ym.mec.biz.service.TenantContractTemplateService;
+import com.ym.mec.biz.service.TenantInfoService;
+import com.ym.mec.biz.service.TenantOrderRecordService;
+import com.ym.mec.biz.service.TenantPreJoinService;
+import com.ym.mec.biz.service.TenantProductInfoService;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
@@ -34,40 +117,6 @@ import com.ym.mec.thirdparty.yqpay.DateUtils;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.freemarker.FreemarkerTemplateEngine;
 import com.ym.mec.util.pdf.PDFUtil;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.joda.time.LocalDate;
-import org.joda.time.LocalDateTime;
-import org.redisson.api.RBucket;
-import org.redisson.api.RedissonClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.dao.DuplicateKeyException;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.servlet.http.HttpServletRequest;
-import java.io.File;
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.math.MathContext;
-import java.math.RoundingMode;
-import java.nio.charset.Charset;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import static com.ym.mec.biz.dal.enums.MessageTypeEnum.*;
 
 @Service
 public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo> implements TenantInfoService {
@@ -94,6 +143,8 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
     @Autowired
     private OrganizationDao organizationDao;
     @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
     private PayService payService;
     @Autowired
     private IdGeneratorService idGenerator;
@@ -744,15 +795,17 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         //生成订单编号
         String orderNo = idGenerator.generatorId("payment") + "";
         int orderState = 0;
+
+        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
         //消费大于0元则拉起支付
         if (productInfo.getPayAmount().compareTo(BigDecimal.ZERO) > 0) {
-            result = payService.getPayToPlatformMap(
+            result = payService.getPayToPlatformMap(tenantId,
                     PaymentChannelEnum.ADAPAY,
                     productInfo.getPayAmount(),
                     BigDecimal.ZERO,
                     orderNo,
-                    null,
-                    null,
+                    baseApiUrl + "/api-web/tenantInfo/callback",
+                    baseApiUrl + "/api-web/tenantInfo/paymentResult?orderNo=" + orderNo,
                     tenantEnum.getMsg(),
                     tenantEnum.getMsg()
             );
@@ -789,15 +842,17 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         //生成订单编号
         String orderNo = idGenerator.generatorId("payment") + "";
         int orderState = 0;
+
+        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
         //消费大于0元则拉起支付
         if (amount.compareTo(BigDecimal.ZERO) > 0) {
-            result = payService.getPayToPlatformMap(
+            result = payService.getPayToPlatformMap(tenantId,
                     PaymentChannelEnum.ADAPAY,
                     amount,
                     BigDecimal.ZERO,
                     orderNo,
-                    null,
-                    null,
+                    baseApiUrl + "/api-web/tenantInfo/callback",
+                    baseApiUrl + "/api-web/tenantInfo/paymentResult?orderNo=" + orderNo,
                     tenantEnum.getMsg(),
                     tenantEnum.getMsg()
             );
@@ -1073,15 +1128,18 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         TenantOrderRecordEnum tenantEnum = TenantOrderRecordEnum.TENANT_RECHARGE;
         Map<String, Object> result = new HashMap<>();
         int orderState = 0;
+
+        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+        
         //消费大于0元则拉起支付
         if (amount.compareTo(BigDecimal.ZERO) > 0) {
-            result = payService.getPayToPlatformMap(
+            result = payService.getPayToPlatformMap(tenantId,
                     PaymentChannelEnum.ADAPAY,
                     amount,
                     BigDecimal.ZERO,
                     orderNo,
-                    null,
-                    null,
+                    baseApiUrl + "/api-web/tenantInfo/callback",
+                    baseApiUrl + "/api-web/tenantInfo/paymentResult?orderNo=" + orderNo,
                     tenantEnum.getMsg(),
                     tenantEnum.getMsg()
             );

+ 118 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantOrderRecordServiceImpl.java

@@ -1,5 +1,28 @@
 package com.ym.mec.biz.service.impl;
 
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huifu.adapay.core.AdapayCore;
+import com.huifu.adapay.core.util.AdapaySign;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.LocalDateTime;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -8,31 +31,43 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
 import com.ym.mec.biz.dal.dao.TenantOrderRecordDao;
 import com.ym.mec.biz.dal.dto.TenantOrderRecordDto;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.*;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
+import com.ym.mec.biz.dal.entity.PlatformServe;
+import com.ym.mec.biz.dal.entity.PlatformServeDetail;
+import com.ym.mec.biz.dal.entity.TenantAssetsInfo;
+import com.ym.mec.biz.dal.entity.TenantConfig;
+import com.ym.mec.biz.dal.entity.TenantInfo;
+import com.ym.mec.biz.dal.entity.TenantOrderRecord;
+import com.ym.mec.biz.dal.entity.TenantProductInfo;
+import com.ym.mec.biz.dal.entity.TenantProxyDividend;
+import com.ym.mec.biz.dal.entity.TenantProxyUserRelation;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
+import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
+import com.ym.mec.biz.dal.enums.PeriodEnum;
+import com.ym.mec.biz.dal.enums.TenantOrderRecordEnum;
+import com.ym.mec.biz.service.CloudTeacherOrderService;
+import com.ym.mec.biz.service.HfMerchantConfigService;
+import com.ym.mec.biz.service.PlatformServeDetailService;
+import com.ym.mec.biz.service.PlatformServeService;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.biz.service.TenantAssetsInfoService;
+import com.ym.mec.biz.service.TenantConfigService;
+import com.ym.mec.biz.service.TenantInfoService;
+import com.ym.mec.biz.service.TenantOrderRecordService;
+import com.ym.mec.biz.service.TenantProductInfoService;
+import com.ym.mec.biz.service.TenantProxyDividendService;
+import com.ym.mec.biz.service.TenantProxyUserRelationService;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
 import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.adapay.Payment;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.joda.time.LocalDateTime;
-import org.redisson.api.RBucket;
-import org.redisson.api.RedissonClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Consumer;
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * 机构付款记录表(TenantOrderRecord)表服务实现类
@@ -69,6 +104,9 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
     @Autowired
     private TenantProxyUserRelationService tenantProxyUserRelationService;
 
+    @Autowired
+    private HfMerchantConfigService hfMerchantConfigService;
+
     //订单不存在
     private static final String PAYMENT_ID_NOT_EXISTS = "payment_id_not_exists";
 
@@ -309,7 +347,13 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
         if (StringUtils.equals(orderRecord.getPaymentChannel(), PaymentChannelEnum.ADAPAY.getCode())) {
             Map<String, Object> payment;
             try {
-                payment = Payment.queryPayment(orderRecord.getTransNo());
+                Integer tenantId = orderRecord.getTenantId();
+                HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(tenantId);
+                if (hfMerchantConfig == null) {
+                    throw new BizException("机构[{}]汇付商户信息找不到", tenantId);
+                }
+
+                payment = Payment.queryPayment(orderRecord.getTransNo(), hfMerchantConfig.getMerKey());
                 log.info("    >>>>> checkTenantOrder  payment start");
                 String status = (String) payment.get("status");
                 //判断状态是成功还是失败
@@ -390,6 +434,62 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
         detail.put("num", productInfo.getExpiryCount());
     }
 
+    /**
+     * 机构相关支付-回调
+     */
+    @Override
+    public String callback(HttpServletRequest request) {
+        // 验签请参data
+        String data = request.getParameter("data");
+        // 验签请参sign
+        String sign = request.getParameter("sign");
+        log.info("tenant callback request param:{}", data);
+        try {
+            // 验签
+            if (AdapaySign.verifySign(data, sign, AdapayCore.PUBLIC_KEY)) {
+                JSONObject dataObj = JSON.parseObject(data);
+                String transType = request.getParameter("type");
+                String orderNo = dataObj.getString("order_no");
+                TenantOrderRecord record = this.getOne(Wrappers.<TenantOrderRecord>lambdaQuery()
+                        .eq(TenantOrderRecord::getOrderNo, orderNo));
+                if(Objects.isNull(record)){
+                    log.error("error tenant callback request orderNo is null param:{}", data);
+                    return "failed";
+                }
+                //只处理未支付状态的订单
+                if(!record.getOrderState().equals(0)){
+                    return "succeeded";
+                }
+                switch (transType) {
+                    case "payment.succeeded":// 支付成功
+                        Consumer<TenantOrderRecord> consumer = checkOrder.get(record.getOrderType());
+                        if (Objects.nonNull(consumer)) {
+                            consumer.accept(record);
+                        }
+                        LocalDateTime now = LocalDateTime.now();
+                        record.setPayDate(now.toLocalDate().toDate());
+                        record.setPayTime(now.toDate());
+                        //修改流水
+                        record.setOrderState(1);
+                        baseMapper.updateById(record);
+                        break;
+                    case "payment.failed":// 支付失败
+                        //修改流水
+                        record.setOrderState(2);
+                        baseMapper.updateById(record);
+                        break;
+                    default:
+                        break;
+                }
+            } else {
+                return "验签失败";
+            }
+        } catch (Exception e) {
+            log.error("error tenant callback request param:{}", data);
+            return e.getMessage();
+        }
+        return "succeeded";
+    }
 
 }
 

+ 17 - 213
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantPaymentOrderServiceImpl.java

@@ -10,10 +10,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.thirdparty.adapay.ConfigInit;
-import com.ym.mec.thirdparty.adapay.Payment;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,13 +19,23 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.alibaba.fastjson.JSON;
+import com.ym.mec.biz.dal.dao.StudentPaymentRouteOrderDao;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.TenantEntryActivitiesDao;
+import com.ym.mec.biz.dal.dao.TenantPaymentOrderDao;
 import com.ym.mec.biz.dal.dto.PageInfoOrder;
+import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
 import com.ym.mec.biz.dal.entity.SysTenantAccountDetail.TransType;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.TenantEntryActivities;
 import com.ym.mec.biz.dal.entity.TenantEntryActivities.SuitableUser;
+import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
 import com.ym.mec.biz.dal.entity.TenantPaymentOrder.TenantPaymentType;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
 import com.ym.mec.biz.dal.page.TenantPaymentOrderQueryInfo;
+import com.ym.mec.biz.service.HfMerchantConfigService;
 import com.ym.mec.biz.service.PayService;
 import com.ym.mec.biz.service.SysTenantAccountService;
 import com.ym.mec.biz.service.TenantPaymentOrderService;
@@ -38,6 +44,9 @@ import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.adapay.ConfigInit;
+import com.ym.mec.thirdparty.adapay.Payment;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import com.ym.mec.thirdparty.yqpay.Msg;
 import com.ym.mec.thirdparty.yqpay.RsqMsg;
 import com.ym.mec.thirdparty.yqpay.YqPayFeignService;
@@ -75,6 +84,9 @@ public class TenantPaymentOrderServiceImpl extends BaseServiceImpl<Long, TenantP
     private YqPayFeignService yqPayFeignService;
     @Autowired
     private StudentPaymentRouteOrderDao studentPaymentRouteOrderDao;
+    
+    @Autowired
+    private HfMerchantConfigService hfMerchantConfigService;
 
     @Override
     public BaseDAO<Long, TenantPaymentOrder> getDAO() {
@@ -170,7 +182,7 @@ public class TenantPaymentOrderServiceImpl extends BaseServiceImpl<Long, TenantP
                     tenantPaymentOrder.getExpectAmount(),
                     BigDecimal.ZERO,
                     tenantPaymentOrder.getOrderNo(),
-                    baseApiUrl + "/api-teacher/teacherOrder/notify",
+                    baseApiUrl + "/api-teacher/teacherOrder/callback",
                     baseApiUrl + "/api-teacher/teacherOrder/paymentResult?orderNo=" + tenantPaymentOrder.getOrderNo(),
                     "商户入驻",
                     "商户充值",
@@ -191,214 +203,6 @@ public class TenantPaymentOrderServiceImpl extends BaseServiceImpl<Long, TenantP
     }
 
     @Override
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public boolean paymentForCallback(TenantPaymentOrder tenantPaymentOrder) {
-
-        Integer activitiesId = tenantPaymentOrder.getActivitiesId();
-
-        Date date = new Date();
-        tenantPaymentOrder.setUpdateTime(date);
-        tenantPaymentOrderDao.update(tenantPaymentOrder);
-
-        Integer userId = tenantPaymentOrder.getUserId();
-
-        if (tenantPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
-
-            TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
-            if (tenantEntryActivities == null) {
-                throw new BizException("活动找不到");
-            }
-
-            // 更新账户表信息
-            sysTenantAccountService.update(userId, tenantEntryActivities.getPurchaseMinutes() + tenantEntryActivities.getGiveMinutes(),
-                    tenantPaymentOrder.getOrderNo(), TransType.RECHARGE, "", tenantEntryActivities.getDiscountPrice(), "");
-
-            this.confirmOrder(tenantPaymentOrder);
-        } else {
-
-        }
-
-        return true;
-    }
-
-    public Boolean confirmOrder(TenantPaymentOrder order) {
-        List<StudentPaymentRouteOrder> routeOrders = studentPaymentRouteOrderDao.getRouteOrders(order.getOrderNo());
-        for (StudentPaymentRouteOrder routeOrder : routeOrders) {
-            Map<String, Object> divMember = new HashMap<>();
-            divMember.put("member_id", routeOrder.getMerNo());//分佣账户
-            divMember.put("amount", routeOrder.getRouteAmount().setScale(2, BigDecimal.ROUND_HALF_UP));//分佣金额
-            divMember.put("fee_flag", "Y");
-            if (routeOrder.getMerNo().equals(ConfigInit.merNo)) {
-                divMember.put("member_id", 0);
-            }
-            List<Map<String, Object>> divMembers = new ArrayList<>();
-            divMembers.add(divMember);
-
-            Map<String, Object> confirm = new HashMap<>();
-            confirm.put("payment_id", order.getTransNo());
-            confirm.put("order_no", idGeneratorService.generatorId("payment"));
-            confirm.put("confirm_amt", routeOrder.getRouteAmount());
-            confirm.put("div_members", divMembers);
-            try {
-                Payment.createConfirm(confirm);
-            } catch (Exception e) {
-                continue;
-            }
-        }
-        return true;
-    }
-
-
-    @Override
-    public void queryOrderStatusFromRemote() {
-        try {
-            yqPayQuery();
-        } catch (Exception e) {
-            throw new BizException("查询订单状态出现异常");
-        }
-        try {
-            adaPayQuery();
-        } catch (Exception e) {
-            throw new BizException("查询订单状态出现异常");
-        }
-    }
-
-    private void yqPayQuery() throws Exception {
-        List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "YQPAY");
-
-        if (payingOrders.size() == 0) {
-            return;
-        }
-        List<String> orderNoList = payingOrders.stream().map(TenantPaymentOrder::getOrderNo).collect(Collectors.toList());
-        String merOrderNos = payingOrders.stream().map(TenantPaymentOrder::getOrderNo).collect(Collectors.joining(","));
-
-        String notifyUrl = ""; // 回调地址
-        Map<String, Object> resultMap = new LinkedHashMap<>();
-        resultMap.put("merOrderNoList", merOrderNos);
-        Map<String, Object> requestMap = YqPayUtil.getRequestMap(notifyUrl, resultMap);
-
-        RsqMsg rsqMsg = new RsqMsg(requestMap);
-
-        Msg queryRs = yqPayFeignService.orderQuery(rsqMsg);
-        logger.info("支付状态查询结果:{}", queryRs);
-        if (queryRs.getCode().equals("88")) {
-            // 更新订单状态
-            String[] statusArr = {"0", "1", "7"};
-            String responseParameters = queryRs.getResponseParameters();
-            List<Map<String, Object>> responseList = JSON.parseObject(responseParameters, List.class);
-            for (Map<String, Object> response : responseList) {
-                Map<String, Object> rpMap = response;
-                String channelType = rpMap.get("channelType").equals("1") ? "WXPay" : (rpMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
-                rpMap.put("channelType", channelType);
-
-                if (orderNoList.contains(rpMap.get("merOrderNo"))) {
-                    orderNoList.remove(rpMap.get("merOrderNo"));
-                }
-
-                if (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
-                    try {
-                        DealStatusEnum status = rpMap.get("tradeState").equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
-                        TenantPaymentOrder order = tenantPaymentOrderDao.findOrderByOrderNo(rpMap.get("merOrderNo").toString());
-                        if (order == null || !order.getStatus().equals(DealStatusEnum.ING)) {
-                            continue;
-                        }
-
-                        if (status.equals(DealStatusEnum.SUCCESS)) {
-                            order.setPayTime(new Date());
-                            order.setActualAmount(new BigDecimal((String) rpMap.get("payAmount")));
-                        } else {
-                            Object remarks = rpMap.get("remarks");
-                            if (remarks != null) {
-                                order.setMemo(remarks.toString());
-                            }
-                        }
-                        order.setStatus(status);
-                        order.setTransNo(rpMap.get("orderNo").toString());
-                        order.setPaymentBusinessChannel(channelType);
-                        paymentForCallback(order);
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                        continue;
-                    }
-                }
-            }
-
-            Date date = new Date();
-            for (TenantPaymentOrder po : payingOrders) {
-                if (orderNoList.contains(po.getOrderNo())) {
-                    // 超过30分钟的关闭订单
-                    if (DateUtil.addMinutes(po.getCreateTime(), 30).before(date)) {
-                        po.setStatus(DealStatusEnum.FAILED);
-                        po.setMemo("超时未支付关闭");
-                        paymentForCallback(po);
-                    }
-                }
-            }
-        }
-    }
-
-    private void adaPayQuery() throws Exception {
-        List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "ADAPAY");
-        if (payingOrders.size() == 0) {
-            return;
-        }
-
-        List<String> orderNoList = new ArrayList<String>();
-
-        for (TenantPaymentOrder payingOrder : payingOrders) {
-            if (payingOrder.getTransNo() == null) {
-                orderNoList.add(payingOrder.getOrderNo());
-                continue;
-            }
-            Map<String, Object> payment = Payment.queryPayment(payingOrder.getTransNo());
-
-            String channelType = (String) payment.get("pay_channel");
-            String payStatus = (String) payment.get("status");
-            String transNo = (String) payment.get("id");
-            String memo = null;
-            if (payment.containsKey("error_msg")) {
-                memo = (String) payment.get("error_msg");
-            }
-            DealStatusEnum status = null;
-            if (payStatus.equals("succeeded")) {
-                status = DealStatusEnum.SUCCESS;
-                payingOrder.setActualAmount(new BigDecimal((String) payment.get("pay_amt")));
-            } else if (payStatus.equals("failed")) {
-                status = DealStatusEnum.FAILED;
-            }
-
-            if (status != null) {
-                payingOrder.setStatus(status);
-                payingOrder.setTransNo(transNo);
-                payingOrder.setPaymentBusinessChannel(channelType);
-                payingOrder.setMemo(memo);
-                try {
-                    paymentForCallback(payingOrder);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                    continue;
-                }
-            }
-
-            if (status.equals("pending")) {
-                orderNoList.add(payingOrder.getOrderNo());
-            }
-        }
-
-        Date date = new Date();
-        for (TenantPaymentOrder po : payingOrders) {
-            if (orderNoList.contains(po.getOrderNo())) {
-                // 超过30分钟的关闭订单
-                if (DateUtil.addMinutes(po.getCreateTime(), 30).before(date)) {
-                    po.setStatus(DealStatusEnum.FAILED);
-                    po.setMemo("超时未支付关闭");
-                    paymentForCallback(po);
-                }
-            }
-        }
-    }
-
-    @Override
     public TenantPaymentOrder queryByOrderNo(String orderNo) {
         return tenantPaymentOrderDao.findOrderByOrderNo(orderNo);
     }

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

@@ -2714,7 +2714,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                 amount,
                 balance,
                 orderNo,
-                baseApiUrl + "/api-student/studentOrder/notify",
+                baseApiUrl + "/api-student/studentOrder/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
                 "vip课购买",
                 vipGroup.getName(),

+ 21 - 0
mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml

@@ -305,4 +305,25 @@
 		WHERE aum.return_fee_ = 0 AND aum.user_id_ = #{userId} AND aum.activity_id_ = #{activityId}
 		GROUP BY aum.user_id_
 	</select>
+	
+	<select id="exportStudentSubCourse" resultType="com.ym.mec.biz.dal.dto.ExportStudentSubCourse">
+		select
+			t.user_id_ as userId,
+			su.username_ as username,
+			t.activity_id_ as activityId,
+			o.name_ as organizationName,
+			vga.name_ as activityName,
+			sum(if(t.vip_flag_ = 1 || t.practice_flag_ = 1 ,1,0)) as subCourseNum,
+			sum(if(t.give_vip_flag_ = 1 || t.give_practice_flag_ = 1,1,0)) as subGiveCourseNum
+		from activity_user_mapper t
+				 left join vip_group_activity vga on t.activity_id_ = vga.id_
+				 left join sys_user su on t.user_id_ = su.id_
+				 left join organization o on su.organ_id_ = o.id_
+		where t.tenant_id_ = #{tenantId} and t.return_fee_ = 0
+		and (t.vip_flag_ = 1 or t.give_vip_flag_ = 1 or t.practice_flag_ = 1 or t.give_practice_flag_ = 1)
+		<if test="organId != null">
+			AND FIND_IN_SET(su.organ_id_,#{organId})
+		</if>
+		group by t.user_id_ , t.activity_id_
+	</select>
 </mapper>

+ 16 - 3
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -1236,11 +1236,24 @@
     </update>
 
     <select id="findClassGroupByType" resultMap="ClassGroupTeachers">
-        SELECT * FROM class_group WHERE music_group_id_=#{musicGroupId} AND group_type_ = 'MUSIC'
+        SELECT t.* FROM class_group t
+        WHERE t.music_group_id_=#{musicGroupId} AND t.group_type_ = 'MUSIC'
         <if test="type !=null ">
-            AND type_=#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+            AND t.type_=#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+        </if>
+        <if test="hasCourse != null and hasCourse == true">
+            and exists (
+               select 1 from course_schedule a where t.id_ = a.class_group_id_ and a.del_flag_ = 0
+                                                 and a.status_ in ('NOT_START','UNDERWAY') and a.is_lock_ = 0
+            )
+        </if>
+        <if test="hasCourse != null and hasCourse == false">
+            and not exists (
+                select 1 from course_schedule a where t.id_ = a.class_group_id_ and a.del_flag_ = 0
+                and a.status_ in ('NOT_START','UNDERWAY') and a.is_lock_ = 0
+            )
         </if>
-        AND del_flag_ = '0'
+        AND t.del_flag_ = '0'
     </select>
     <select id="countGroupTotalClassTimes" resultType="map">
         SELECT

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

@@ -62,6 +62,7 @@
         <result column="organ_name_" property="organName"/>
         <result column="isCallNames" property="isCallNames" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result column="is_complaints_" property="isComplaints"/>
+        <result column="merged_course_ids_" property="mergedCourseIds"/>
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.dto.CourseScheduleDto" id="courseScheduleDto" extends="CourseSchedule">
@@ -166,7 +167,6 @@
         cs.teaching_content_,
         cs.note_,
         cs.organ_id_,
-        cs.new_course_id_,
         cs.member_flag_,
         cs.valid_end_time_,
         cs.valid_start_time_,
@@ -2386,10 +2386,15 @@
             cs.is_lock_,
             cs.organ_id_,
             cs.member_flag_,
+            cs.new_course_id_,
             s.name_ schoole_name_,
             o.name_ organ_name_,
             CASE WHEN COUNT(CASE WHEN sa.id_ IS NULL OR (sa.status_ = 'LEAVE' AND sa.remark_ IS NOT NULL) THEN NULL ELSE 1 END) > 0 THEN 1 ELSE 0 END isCallNames,
-            CASE WHEN COUNT(CASE WHEN ta.is_complaints_ = 1 THEN 1 ELSE NULL END) > 0 THEN '1' ELSE '0' END is_complaints_
+            CASE WHEN COUNT(CASE WHEN ta.is_complaints_ = 1 THEN 1 ELSE NULL END) > 0 THEN '1' ELSE '0' END is_complaints_,
+            (
+                select group_concat(csd.id_) from course_schedule csd
+                where csd.del_flag_ = 0 and csd.id_ != csd.new_course_id_  and csd.new_course_id_ = cs.new_course_id_
+            ) as merged_course_ids_
         FROM
             course_schedule cs
             LEFT JOIN school s ON cs.schoole_id_=s.id_
@@ -2526,7 +2531,7 @@
             AND (cs.music_group_id_ = #{search} OR cs.id_=#{search} OR cs.name_ LIKE CONCAT('%' ,#{search}, '%' ))
         </if>
         <if test="courseIdSearch != null">
-            AND cs.id_ = #{courseIdSearch}
+            AND (cs.id_ = #{courseIdSearch} or cs.new_course_id_ = #{courseIdSearch})
         </if>
         <if test="tenantId != null">
             AND cs.tenant_id_ = #{tenantId}

+ 127 - 0
mec-biz/src/main/resources/config/mybatis/HfMerchantConfigMapper.xml

@@ -0,0 +1,127 @@
+<?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.HfMerchantConfigDao">
+
+	<resultMap type="com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig"
+		id="HfMerchantConfig">
+		<result column="id_" property="id" />
+		<result column="app_id_" property="appId" />
+		<result column="mer_key_" property="merKey" />
+		<result column="api_key_" property="apiKey" />
+		<result column="mock_api_key_" property="mockApiKey" />
+		<result column="rsa_private_key_" property="rsaPrivateKey" />
+		<result column="rsa_public_key_" property="rsaPublicKey" />
+		<result column="expend_params_" property="expendParams" />
+		<result column="wx_app_id_" property="wxAppId" />
+		<result column="wx_app_secret_" property="wxAppSecret" />
+		<result column="platform_payee_member_id_" property="platformPayeeMemberId" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+		<result column="tenant_id_" property="tenantId" />
+	</resultMap>
+
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="HfMerchantConfig">
+		SELECT * FROM
+		hf_merchant_config WHERE id_ = #{id}
+	</select>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="HfMerchantConfig">
+		SELECT * FROM hf_merchant_config ORDER
+		BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig"
+		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
+			AS ID FROM DUAL </selectKey> -->
+		INSERT INTO hf_merchant_config
+		(id_,app_id_,mer_key_,api_key_,mock_api_key_,rsa_private_key_,rsa_public_key_,expend_params_,wx_app_id_,wx_app_secret_,create_time_,update_time_,tenant_id_,platform_payee_member_id_)
+		VALUES(#{id},#{appId},#{merKey},#{apiKey},#{mockApiKey},#{rsaPrivateKey},#{rsaPublicKey},#{expendParams},#{wxAppId},#{wxAppSecret},#{createTime},#{updateTime},#{tenantId},#{platformPayeeMemberId})
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig">
+		UPDATE hf_merchant_config
+		<set>
+			<if test="apiKey != null">
+				api_key_ = #{apiKey},
+			</if>
+			<if test="appId != null">
+				app_id_ = #{appId},
+			</if>
+			<if test="rsaPublicKey != null">
+				rsa_public_key_ = #{rsaPublicKey},
+			</if>
+			<if test="mockApiKey != null">
+				mock_api_key_ = #{mockApiKey},
+			</if>
+			<if test="expendParams != null">
+				expend_params_ = #{expendParams},
+			</if>
+			<if test="id != null">
+				id_ = #{id},
+			</if>
+			<if test="tenantId != null">
+				tenant_id_ = #{tenantId},
+			</if>
+			<if test="updateTime != null">
+				update_time_ = #{updateTime},
+			</if>
+			<if test="merKey != null">
+				mer_key_ = #{merKey},
+			</if>
+			<if test="rsaPrivateKey != null">
+				rsa_private_key_ = #{rsaPrivateKey},
+			</if>
+			<if test="platformPayeeMemberId != null">
+				platform_payee_member_id_ = #{platformPayeeMemberId},
+			</if>
+			<if test="createTime != null">
+				create_time_ = #{createTime},
+			</if>
+			<if test="wxAppId != null">
+				wx_app_id_ = #{wxAppId},
+			</if>
+			<if test="wxAppSecret != null">
+				wx_app_secret_ = #{wxAppSecret},
+			</if>
+		</set>
+		WHERE id_ = #{id}
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete">
+		DELETE FROM hf_merchant_config WHERE id_ = #{id}
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="HfMerchantConfig" parameterType="map">
+		SELECT * FROM hf_merchant_config
+        <include refid="queryPageSql"/>
+		ORDER BY id_
+		<include refid="global.limit" />
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM hf_merchant_config
+        <include refid="queryPageSql"/>
+	</select>
+	
+	<select id="queryByTenantId" resultMap="HfMerchantConfig">
+		SELECT * FROM hf_merchant_config where tenant_id_ = #{tenantId}
+	</select>
+
+    <sql id="queryPageSql">
+        <where>
+            <if test="tenantId != null">
+                AND tenant_id_ = #{tenantId}
+            </if>
+        </where>
+    </sql>
+
+</mapper>

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