Joburgess 5 years ago
parent
commit
eb4f4c7752
18 changed files with 321 additions and 36 deletions
  1. 0 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupDao.java
  2. 0 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupStudentMapperDao.java
  3. 17 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  4. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupDao.java
  5. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupApplyDto.java
  6. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupStudentDto.java
  7. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroupStudentMapper.java
  8. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  9. 11 3
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserCashAccountService.java
  10. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupService.java
  11. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  12. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleTeacherSalaryServiceImpl.java
  13. 31 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserCashAccountServiceImpl.java
  14. 105 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  15. 25 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  16. 25 3
      mec-biz/src/main/resources/config/mybatis/VipGroupMapper.xml
  17. 15 7
      mec-web/src/main/java/com/ym/mec/web/controller/SysUserCashAccountController.java
  18. 24 4
      mec-web/src/main/java/com/ym/mec/web/controller/VipGroupManageController.java

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

@@ -14,7 +14,6 @@ import java.util.Set;
 
 public interface ClassGroupDao extends BaseDAO<Integer, ClassGroup> {
 
-
     /**
      * 查询老师乐团课课程
      *

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

@@ -12,7 +12,6 @@ import java.util.List;
 import java.util.Map;
 
 public interface ClassGroupStudentMapperDao extends BaseDAO<Long, ClassGroupStudentMapper> {
-
     /**
      * 批量插入学生
      *

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

@@ -425,8 +425,10 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @param endTime   结束时间
      * @return
      */
-    List<CourseSchedule> queryTeacherCourseScheduleListByTimeRangeAndType(@Param("teacherId") Integer teacherId, @Param("type") CourseScheduleType type,
-                                                                          @Param("startTime") Date startTime, @Param("endTime") Date endTime);
+    List<CourseSchedule> queryTeacherCourseScheduleListByTimeRangeAndType(@Param("teacherId") Integer teacherId,
+                                                                          @Param("type") CourseScheduleType type,
+                                                                          @Param("startTime") Date startTime,
+                                                                          @Param("endTime") Date endTime);
 
     /**
      * 查询班级未开始的课程
@@ -461,7 +463,8 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
      * @author Joburgess
      * @date 2019/10/31
      */
-    List<CourseSchedule> findByDateZone(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
+    List<CourseSchedule> findByDateZone(@Param("startTime") Date startTime,
+                                        @Param("endTime") Date endTime);
 
     /**
      * 查询学生明天的课程数
@@ -532,6 +535,17 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     List<CourseSchedule> findByClassGroup(@Param("classGroupId") Integer classGroupId);
 
     /**
+     * @describe 根据班级以及课程状态获取课程计划
+     * @author Joburgess
+     * @date 2019/11/16
+     * @param classGroupId: 班级编号
+     * @param status: 状态
+     * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
+     */
+    List<CourseSchedule> findByClassGroupAndStatus(@Param("classGroupId") Integer classGroupId,
+                                                   @Param("status") String status);
+
+    /**
      * @param classGroupIds: 班级编号
      * @return java.util.List<com.ym.mec.biz.dal.entity.CourseSchedule>
      * @describe 根据班级获取课程计划

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

@@ -42,6 +42,16 @@ public interface VipGroupDao extends BaseDAO<Long, VipGroup> {
 	 */
 	List<VipGroupStudentDto> findVipGroupStudents(Map<String, Object> params);
 
+	/**
+	 * @describe 获取还有课程余额的学员
+	 * @author Joburgess
+	 * @date 2019/11/16
+	 * @param params:
+	 * @return java.util.List<com.ym.mec.biz.dal.dto.VipGroupStudentDto>
+	 */
+	List<VipGroupStudentDto> findHaveCourseBalanceStudents(Map<String, Object> params);
+	int countHaveCourseBalanceStudentNum(Map<String, Object> params);
+
 	int countVipGroupStudents(Map<String, Object> params);
 
 	/**

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupApplyDto.java

@@ -17,7 +17,15 @@ public class VipGroupApplyDto {
     @ApiModelProperty(value = "课程计划列表",required = false)
     private List<CourseSchedule> courseSchedules;
 
+    private String studentIds;
 
+    public String getStudentIds() {
+        return studentIds;
+    }
+
+    public void setStudentIds(String studentIds) {
+        this.studentIds = studentIds;
+    }
 
     public VipGroupApplyBaseInfoDto getVipGroupApplyBaseInfo() {
         return vipGroupApplyBaseInfo;

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/VipGroupStudentDto.java

@@ -14,12 +14,23 @@ public class VipGroupStudentDto {
     @ApiModelProperty(value = "用户名称")
     private String userName;
 
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
     @ApiModelProperty(value = "课时总数")
     private Integer totalClassTimes;
 
     @ApiModelProperty(value = "当前课时")
     private Integer currentClassTimes;
 
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
     public Long getId() {
         return id;
     }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroupStudentMapper.java

@@ -50,6 +50,13 @@ public class ClassGroupStudentMapper {
 		this.status = ClassGroupStudentStatusEnum.NORMAL;
 	}
 
+	public ClassGroupStudentMapper(String musicGroupId, int classGroupId, Integer userId, ClassGroupStudentStatusEnum status) {
+		this.musicGroupId = musicGroupId;
+		this.classGroupId = classGroupId;
+		this.userId = userId;
+		this.status = status;
+	}
+
 	public ClassGroupStudentStatusEnum getStatus() {
 		return status;
 	}

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

@@ -304,4 +304,15 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      * @return int
      */
     int batchUpdateClassCourseTimes(List<Integer> classGroupIds);
+
+    /**
+     * @describe 将学生加入到班级
+     * @author Joburgess
+     * @date 2019/11/16
+     * @param musicGroupId: 乐团或者VIP课编号
+     * @param classGroupId: 班级编号
+     * @param studentIds: 学生编号列表
+     * @return void
+     */
+    void addStudentIntoClassGroup(String musicGroupId,Integer classGroupId,List<Integer> studentIds);
 }

+ 11 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/SysUserCashAccountService.java

@@ -1,10 +1,10 @@
 package com.ym.mec.biz.service;
 
-import java.math.BigDecimal;
-
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.common.service.BaseService;
 
+import java.math.BigDecimal;
+
 public interface SysUserCashAccountService extends BaseService<Integer, SysUserCashAccount> {
 
 	/**
@@ -16,9 +16,17 @@ public interface SysUserCashAccountService extends BaseService<Integer, SysUserC
 	boolean updateBalance(Integer userId, BigDecimal decimal);
 
 	/**
+	 * 更新指定用户的账户课程余额
+	 * @param userId 用户编号
+	 * @param decimal 交易金额(支持负数)
+	 * @return
+	 */
+	boolean updateCourseBalance(Integer userId, BigDecimal decimal);
+
+	/**
 	 * 将课程余额转入到可用余额
 	 * @param userId
 	 * @return
 	 */
 	boolean transferCourseBalanceToBalance(Integer userId);
-}
+}

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

@@ -99,6 +99,15 @@ public interface VipGroupService extends BaseService<Long, VipGroup> {
     PageInfo findVipGroupStudents(VipGroupQueryInfo queryInfo);
 
     /**
+     * @describe 获取还有课程余额的学员
+     * @author Joburgess
+     * @date 2019/11/16
+     * @param queryInfo:
+     * @return com.ym.mec.common.page.PageInfo
+     */
+    PageInfo findHaveCourseBalanceStudents(VipGroupQueryInfo queryInfo);
+
+    /**
      * @Author: Joburgess
      * @Date: 2019/10/3
      * @params [vipGroupId]

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

@@ -1625,4 +1625,15 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         Map<Integer, Integer> classGroupCourseTimesMap = MapUtil.convertIntegerMap(classGroupCourseTimesMaps);
         return classGroupDao.batchUpdateClassGroupCourseTimes(classGroupCourseTimesMap);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addStudentIntoClassGroup(String musicGroupId, Integer classGroupId, List<Integer> studentIds) {
+        List<ClassGroupStudentMapper> classGroupStudentMappers=new ArrayList<>();
+        for (Integer studentId : studentIds) {
+            ClassGroupStudentMapper classGroupStudentMapper=new ClassGroupStudentMapper(musicGroupId,classGroupId,studentId,ClassGroupStudentStatusEnum.NORMAL);
+            classGroupStudentMappers.add(classGroupStudentMapper);
+        }
+        classGroupStudentMapperDao.classGroupStudentsInsert(classGroupStudentMappers);
+    }
 }

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

@@ -199,7 +199,7 @@ public class CourseScheduleTeacherSalaryServiceImpl extends BaseServiceImpl<Long
         //需更新学生课程缴费记录
         List<CourseScheduleStudentPayment> updateStudentPayments = new ArrayList<>();
 
-        //用户账户自己变动信息列表
+        //用户账户资金变动信息列表
         List<SysUserCashAccountDetail> userCashAccountDetails = new ArrayList<>();
 
         //处理课酬信息

+ 31 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserCashAccountServiceImpl.java

@@ -1,13 +1,5 @@
 package com.ym.mec.biz.service.impl;
 
-import java.math.BigDecimal;
-import java.util.Date;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDetailDao;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
@@ -19,6 +11,13 @@ import com.ym.mec.biz.service.SysUserCashAccountService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Date;
 
 @Service
 public class SysUserCashAccountServiceImpl extends BaseServiceImpl<Integer, SysUserCashAccount> implements SysUserCashAccountService {
@@ -60,6 +59,29 @@ public class SysUserCashAccountServiceImpl extends BaseServiceImpl<Integer, SysU
 	}
 
 	@Override
+	public boolean updateCourseBalance(Integer userId, BigDecimal decimal) {
+		SysUserCashAccount cashAccount = sysUserCashAccountDao.getLocked(userId);
+		if (cashAccount == null) {
+			throw new BizException("用户[{}]现金账户不存在", userId);
+		}
+
+		if (cashAccount.getStatus() != PlatformCashAccountStatusEnum.NORMAL) {
+			throw new BizException("账户不可用");
+		}
+		BigDecimal balance = cashAccount.getCourseBalance().add(decimal);
+		if (balance.doubleValue() < 0) {
+			throw new BizException("现金账户[{}]余额不足,可用余额剩{}元", userId, cashAccount.getCourseBalance().doubleValue());
+		}
+
+		cashAccount.setCourseBalance(balance);
+		cashAccount.setUpdateTime(new Date());
+
+		sysUserCashAccountDao.update(cashAccount);
+
+		return true;
+	}
+
+	@Override
 	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
 	public boolean transferCourseBalanceToBalance(Integer userId) {
 		SysUserCashAccount cashAccount = sysUserCashAccountDao.getLocked(userId);
@@ -93,4 +115,4 @@ public class SysUserCashAccountServiceImpl extends BaseServiceImpl<Integer, SysU
 		return true;
 	}
 
-}
+}

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

@@ -101,6 +101,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 	private TeacherAttendanceDao teacherAttendanceDao;
 	@Autowired
 	private ContractService contractService;
+	@Autowired
+	private ClassGroupService classGroupService;
 
 	@Override
 	public BaseDAO<Long, VipGroup> getDAO() {
@@ -146,6 +148,13 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         	throw new BizException("该用户不存在");
 		}
 
+        String studentIds=vipGroup.getStudentIds();
+		List<String> studentIdList=new ArrayList<>();
+
+        if(StringUtils.isNotBlank(studentIds)){
+			studentIdList = Arrays.asList(studentIds.split(","));
+		}
+
         Date now=new Date();
 
 		VipGroupApplyBaseInfoDto vipGroupApplyBaseInfoDto=vipGroup.getVipGroupApplyBaseInfo();
@@ -193,14 +202,19 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 		//如果默认课酬与实际课酬不匹配则需要审批
 		if(costInfo.get("offlineTeacherSalary").compareTo(vipGroupApplyBaseInfoDto.getOfflineTeacherSalary())!=0||
-			costInfo.get("onlineTeacherSalary").compareTo(vipGroupApplyBaseInfoDto.getOnlineTeacherSalary())!=0){
+			costInfo.get("onlineTeacherSalary").compareTo(vipGroupApplyBaseInfoDto.getOnlineTeacherSalary())!=0
+			&&StringUtils.isBlank(studentIds)){
 			vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.ING);
 		}else{
 			vipGroupApplyBaseInfoDto.setAuditStatus(AuditStatusEnum.PASS);
 		}
 
 		vipGroupApplyBaseInfoDto.setTotalPrice(costInfo.get("totalPrice"));
-		vipGroupApplyBaseInfoDto.setStatus(VipGroupStatusEnum.APPLYING);
+		if(StringUtils.isNotBlank(studentIds)){
+			vipGroupApplyBaseInfoDto.setStatus(VipGroupStatusEnum.FINISH);
+		}else{
+			vipGroupApplyBaseInfoDto.setStatus(VipGroupStatusEnum.APPLYING);
+		}
 		vipGroupApplyBaseInfoDto.setOrganId(sysUser.getOrganId());
 		//开课时间为排课的第一节课的开始时间
 		vipGroupApplyBaseInfoDto.setCourseStartDate(firstCourseSchedule.getStartClassTime());
@@ -215,6 +229,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		ClassGroup classGroup=new ClassGroup();
 		classGroup.setSubjectIdList(vipGroupApplyBaseInfoDto.getSubjectIdList());
 		classGroup.setExpectStudentNum(vipGroupCategory.getStudentNum());
+		if(StringUtils.isNotBlank(studentIds)){
+			classGroup.setStudentNum(studentIdList.size());
+		}
 		classGroup.setName(vipGroupApplyBaseInfoDto.getName());
 		classGroup.setExpectStudentNum(vipGroupApplyBaseInfoDto.getStudentNum());
 		classGroup.setTotalClassTimes(totalClassTimes);
@@ -264,6 +281,12 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		vipGroupApplyBaseInfoDto.setCourseSchedulesJson(JSON.toJSONString(vipGroup.getCourseSchedules()));
 		vipGroupDao.update(vipGroupApplyBaseInfoDto);
 
+		if(StringUtils.isNotBlank(studentIds)){
+			List<Integer> collect = studentIdList.stream().mapToInt(Integer::parseInt).boxed().collect(Collectors.toList());
+			classGroupService.addStudentIntoClassGroup(vipGroupApplyBaseInfoDto.getId().toString(),classGroup.getId(),collect);
+			createVipGroupCourseScheInfo(vipGroupApplyBaseInfoDto.getId());
+		}
+
 		SysUser systemUser = sysUserFeignService.queryUserById(systemId);
 		Set<Integer> roleIds = new HashSet<>(1);
 		roleIds.add(SysUserRole.OPERATION_EXECUTIVE);
@@ -500,6 +523,26 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 	}
 
 	@Override
+	public PageInfo findHaveCourseBalanceStudents(VipGroupQueryInfo queryInfo) {
+		PageInfo pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List dataList = null;
+		int count = vipGroupDao.countHaveCourseBalanceStudentNum(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = vipGroupDao.findHaveCourseBalanceStudents(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+	@Override
 	public VipGroupManageDetailDto getVipGroupDetail(Long vipGroupId) {
 		if(Objects.isNull(vipGroupId)){
 			throw new BizException("请指定vip课程");
@@ -1378,22 +1421,80 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public void addVipGroupStudents(Long vipGroupId, List<Integer> studentIds) {
 		if(CollectionUtils.isEmpty(studentIds)){
 			throw new BizException("请选择学生");
 		}
 		if(Objects.isNull(vipGroupId)){
-			throw new BizException("请指定班级");
+			throw new BizException("请指定vip课程");
 		}
+		VipGroup vipGroup=vipGroupDao.get(vipGroupId);
+		if(Objects.isNull(vipGroup)){
+			throw new BizException("未找到指定的vip课程");
+		}
+		ClassGroup classGroup = classGroupDao.findByVipGroup(vipGroupId, null);
+		List<CourseSchedule> surplusCourses = courseScheduleDao.findByClassGroupAndStatus(classGroup.getId(), CourseStatusEnum.NOT_START.getCode());
+		if(CollectionUtils.isEmpty(surplusCourses)){
+			throw new BizException("此vip课程没有剩余课程计划");
+		}
+		BigDecimal surplusCoursesPrice=new BigDecimal(0);
+		surplusCourses.forEach(courseSchedule -> {
+			if(courseSchedule.getTeachMode().equals(TeachModeEnum.OFFLINE)){
+				surplusCoursesPrice.add(vipGroup.getOfflineClassesUnitPrice());
+			}else if(courseSchedule.getTeachMode().equals(TeachModeEnum.ONLINE)){
+				surplusCoursesPrice.add(vipGroup.getOnlineClassesUnitPrice());
+			}
+		});
+		List<ImGroupMember> imGroupMemberList = new ArrayList<>();
+		//生成学生单课缴费信息
+		for (Integer studentId:studentIds) {
+			SysUserCashAccount sysUserCashAccount = sysUserCashAccountService.get(studentId);
+			if(sysUserCashAccount.getCourseBalance().compareTo(surplusCoursesPrice)<0){
+				throw new BizException("存在课程余额不足的学生");
+			}
+			courseScheduleStudentPaymentService.createCourseScheduleStudentPaymentForVipGroup(vipGroupId,studentId);
+
+			sysUserCashAccountService.updateCourseBalance(studentId,surplusCoursesPrice.negate());
 
+			imGroupMemberList.add(new ImGroupMember(studentId.toString()));
+		}
+
+		try {
+			ImGroupMember[] imGroupMembers = imGroupMemberList.toArray(new ImGroupMember[imGroupMemberList.size()]);
+			// 创建群组
+			imFeignService.groupCreate(new ImGroupModel(classGroup.getId().toString(), imGroupMembers, classGroup.getName()));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public void stopVipGroupWithNoCreate() {
 		List<VipGroup> noCreateSuccessVipGroups = vipGroupDao.findNoCreateSuccessVipGroup();
 		if(CollectionUtils.isEmpty(noCreateSuccessVipGroups)){
 			return;
 		}
-//		studentPaymentOrderDao.queryByDealStatus()
+		//用户账户资金变动信息列表
+		List<SysUserCashAccountDetail> userCashAccountDetails = new ArrayList<>();
+		for (VipGroup noCreateSuccessVipGroup : noCreateSuccessVipGroups) {
+			List<StudentPaymentOrder> studentPaymentOrders = studentPaymentOrderDao.queryByDealStatus(noCreateSuccessVipGroup.getId().toString(),
+					OrderTypeEnum.SMALL_CLASS_TO_BUY, DealStatusEnum.SUCCESS);
+			for (StudentPaymentOrder studentPaymentOrder:studentPaymentOrders){
+				//生成账户资金明细
+				sysUserCashAccountService.updateCourseBalance(studentPaymentOrder.getUserId(),studentPaymentOrder.getActualAmount());
+				SysUserCashAccount sysUserCashAccount = sysUserCashAccountService.get(studentPaymentOrder.getUserId());
+				SysUserCashAccountDetail sysUserIncomeCashAccountDetail = new SysUserCashAccountDetail();
+				sysUserIncomeCashAccountDetail.setUserId(studentPaymentOrder.getUserId());
+				sysUserIncomeCashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.REFUNDS);
+				sysUserIncomeCashAccountDetail.setStatus(DealStatusEnum.SUCCESS);
+				sysUserIncomeCashAccountDetail.setAmount(studentPaymentOrder.getActualAmount());
+				sysUserIncomeCashAccountDetail.setBalance(sysUserCashAccount.getBalance());
+				sysUserIncomeCashAccountDetail.setAttribute(studentPaymentOrder.getTransNo());
+				userCashAccountDetails.add(sysUserIncomeCashAccountDetail);
+			}
+		}
+		sysUserCashAccountDetailDao.batchInsert(userCashAccountDetails);
 	}
 }

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

@@ -1229,6 +1229,31 @@
         LEFT JOIN course_schedule_teacher_salary csts ON cs.id_=csts.course_schedule_id_
       where cs.class_group_id_=#{classGroupId}
     </select>
+    <select id="findByClassGroupAndStatus" resultMap="CourseSchedule">
+      select
+        cs.id_,
+        cs.class_group_id_,
+        cs.status_,
+        cs.subsidy_,
+        cs.class_date_,
+        CONCAT(cs.class_date_,' ',cs.start_class_time_) start_class_time_,
+        CONCAT(cs.class_date_,' ',cs.end_class_time_) end_class_time_,
+        cs.start_class_time_ start_class_time_str_,
+        cs.end_class_time_ end_class_time_str_,
+        cs.teacher_id_,
+        csts.user_id_ actual_teacher_id_,
+        cs.create_time_,
+        cs.update_time_,
+        cs.teach_mode_,
+        cs.type_,
+        cs.name_,
+        cs.student_num_,
+        cs.leave_student_num_,
+        cs.schoole_id_
+      from  course_schedule cs
+        LEFT JOIN course_schedule_teacher_salary csts ON cs.id_=csts.course_schedule_id_
+      where cs.class_group_id_=#{classGroupId} AND cs.status=#{status}
+    </select>
     <select id="findByClassGroups" resultMap="CourseSchedule">
         select
             cs.id_,

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

@@ -444,6 +444,7 @@
     <resultMap id="vipGroupStudentDto" type="com.ym.mec.biz.dal.dto.VipGroupStudentDto">
         <result column="id_" property="id"/>
         <result column="username_" property="userName"/>
+        <result column="phone_" property="phone"/>
         <result column="total_class_times_" property="totalClassTimes"/>
         <result column="current_class_times_" property="currentClassTimes"/>
     </resultMap>
@@ -452,18 +453,39 @@
         SELECT
             su.id_,
             su.username_,
+            su.phone_,
             cg.total_class_times_,
             cg.current_class_times_
         FROM
-            vip_group_class_group_mapper vgcgm
-            LEFT JOIN class_group cg ON vgcgm.class_group_id_=cg.id_
+            class_group cg
             LEFT JOIN class_group_student_mapper cgsm ON vgcgm.class_group_id_=cgsm.class_group_id_
             LEFT JOIN sys_user su ON cgsm.user_id_=su.id_
-        WHERE vgcgm.vip_group_id_=#{vipGroupId} AND cgsm.user_id_ IS NOT NULL
+        WHERE cg.music_group_id_=#{vipGroupId} AND cgsm.user_id_ IS NOT NULL
         ORDER BY su.id_
         <include refid="global.limit"/>
     </select>
 
+    <select id="findHaveCourseBalanceStudents" resultMap="vipGroupStudentDto">
+        SELECT
+            su.id_,
+            su.username_,
+            su.phone_
+        FROM
+          sys_user_cash_account suca
+          LEFT JOIN sys_user su ON suca.user_id_=su.id_
+        WHERE
+          suca.course_balance_ >0
+        <include refid="global.limit"/>
+    </select>
+    <select id="countHaveCourseBalanceStudentNum" resultType="int">
+        SELECT
+            COUNT(1)
+        FROM
+        sys_user_cash_account suca
+        WHERE
+        suca.course_balance_ >0
+    </select>
+
     <select id="countVipGroupStudents" resultType="int">
         SELECT
         count(*)

+ 15 - 7
mec-web/src/main/java/com/ym/mec/web/controller/SysUserCashAccountController.java

@@ -1,8 +1,12 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.service.SysUserCashAccountService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -10,11 +14,7 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.service.SysUserCashAccountService;
-import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.common.page.QueryInfo;
+import java.math.BigDecimal;
 
 @RequestMapping("userCashAccount")
 @Api(tags = "用户账户服务")
@@ -44,11 +44,19 @@ public class SysUserCashAccountController extends BaseController {
 		return succeed(sysUserCashAccountService.queryPage(queryInfo));
 	}
 
-	@ApiOperation(value = "分页查询收费类型列表")
+	@ApiOperation(value = "将课程余额转入到可用余额")
 	@PostMapping("/transferCourseBalanceToBalance")
 	@PreAuthorize("@pcs.hasPermissions('userCashAccount/transferCourseBalanceToBalance')")
 	public Object transferCourseBalanceToBalance(Integer userId) {
 		sysUserCashAccountService.transferCourseBalanceToBalance(userId);
 		return succeed();
 	}
+
+	@ApiOperation(value = "更新指定用户的账户课程余额")
+	@PostMapping("/updateCourseBalance")
+	@PreAuthorize("@pcs.hasPermissions('userCashAccount/updateCourseBalance')")
+	public Object updateCourseBalance(Integer userId, BigDecimal decimal) {
+		sysUserCashAccountService.transferCourseBalanceToBalance(userId);
+		return succeed();
+	}
 }

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

@@ -1,6 +1,5 @@
 package com.ym.mec.web.controller;
 
-import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
@@ -10,16 +9,19 @@ import com.ym.mec.biz.dal.dto.VipGroupApplyDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.entity.StudentApplyRefunds.StudentApplyRefundsStatus;
 import com.ym.mec.biz.dal.enums.AuditStatusEnum;
-import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.page.VipGroupAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupSalaryQueryInfo;
 import com.ym.mec.biz.dal.page.VipGroupTeachingRecordQueryInfo;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.service.StudentApplyRefundsService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
+import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.controller.BaseController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -27,7 +29,10 @@ import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * @Author Joburgess
@@ -95,6 +100,21 @@ public class VipGroupManageController extends BaseController {
         return succeed(vipGroupService.findVipGroupStudents(queryInfo));
     }
 
+    @ApiOperation(value = "获取还有课程余额的学员")
+    @GetMapping(value = "/findHaveCourseBalanceStudents")
+    @PreAuthorize("@pcs.hasPermissions('vipGroupManage/findHaveCourseBalanceStudents')")
+    public Object findHaveCourseBalanceStudents(VipGroupQueryInfo queryInfo){
+        return succeed(vipGroupService.findHaveCourseBalanceStudents(queryInfo));
+    }
+
+    @ApiOperation(value = "添加vip课学员")
+    @GetMapping(value = "/addVipGroupStudents")
+    @PreAuthorize("@pcs.hasPermissions('vipGroupManage/addVipGroupStudents')")
+    public Object addVipGroupStudents(Long vipGroupId,@Param("studentIds[]") List<Integer> studentIds){
+        vipGroupService.addVipGroupStudents(vipGroupId,studentIds);
+        return succeed();
+    }
+
     @ApiOperation(value = "vip课详情")
     @GetMapping("/getVipGroupDetail")
     @PreAuthorize("@pcs.hasPermissions('vipGroupManage/getVipGroupDetail')")