浏览代码

feat:VIP改造

Joburgess 4 年之前
父节点
当前提交
c4df05d20e

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/VipGroupStudentCoursePriceDao.java

@@ -0,0 +1,16 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice;
+import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface VipGroupStudentCoursePriceDao extends BaseDAO<Long, VipGroupStudentCoursePrice> {
+
+    int batchInsert(@Param("datas")List<VipGroupStudentCoursePrice> datas);
+
+    List<VipGroupStudentCoursePrice> getVipGroupStudentCoursePrice(@Param("vipGroupId") Long vipGroupId,
+                                                      @Param("studentId") Integer studentId);
+	
+}

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

@@ -1,9 +1,11 @@
 package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.entity.VipGroup;
+import com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * @Author Joburgess
@@ -32,6 +34,17 @@ public class VipGroupApplyBaseInfoDto extends VipGroup {
     @ApiModelProperty(value = "教师线下课课酬")
     private BigDecimal offlineTeacherSalary;
 
+    @ApiModelProperty(value = "课程组学员缴费设置")
+    private List<VipGroupStudentCoursePrice> vipGroupStudentCoursePrices;
+
+    public List<VipGroupStudentCoursePrice> getVipGroupStudentCoursePrices() {
+        return vipGroupStudentCoursePrices;
+    }
+
+    public void setVipGroupStudentCoursePrices(List<VipGroupStudentCoursePrice> vipGroupStudentCoursePrices) {
+        this.vipGroupStudentCoursePrices = vipGroupStudentCoursePrices;
+    }
+
     public String getSubjectIdList() {
         return subjectIdList;
     }

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.math.BigDecimal;

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

@@ -28,12 +28,32 @@ public class VipGroupStudentDto {
 
     private BigDecimal courseSalary;
 
+    private BigDecimal balance;
+
+    private BigDecimal allBalance;
+
     private Date applyDate;
 
     private Date refundDate;
 
     private Integer studentStatus;
 
+    public BigDecimal getBalance() {
+        return balance;
+    }
+
+    public void setBalance(BigDecimal balance) {
+        this.balance = balance;
+    }
+
+    public BigDecimal getAllBalance() {
+        return allBalance;
+    }
+
+    public void setAllBalance(BigDecimal allBalance) {
+        this.allBalance = allBalance;
+    }
+
     public Date getApplyDate() {
         return applyDate;
     }

+ 99 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/VipGroupStudentCoursePrice.java

@@ -0,0 +1,99 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.math.BigDecimal;
+
+/**
+ * 对应数据库表(vip_group_student_course_price):
+ */
+public class VipGroupStudentCoursePrice {
+
+	/**  */
+	private Long id;
+	
+	/** vip课程组编号 */
+	private Long vipGroupId;
+	
+	/** 学员编号 */
+	private Integer studentId;
+	
+	/** 线上课单价 */
+	private java.math.BigDecimal onlineClassesUnitPrice;
+	
+	/** 线下课单价 */
+	private java.math.BigDecimal offlineClassesUnitPrice;
+	
+	/** 支付价格 */
+	private java.math.BigDecimal paymentPrice;
+
+	public VipGroupStudentCoursePrice() {
+	}
+
+	public VipGroupStudentCoursePrice(Integer studentId, BigDecimal onlineClassesUnitPrice, BigDecimal offlineClassesUnitPrice) {
+		this.studentId = studentId;
+		this.onlineClassesUnitPrice = onlineClassesUnitPrice;
+		this.offlineClassesUnitPrice = offlineClassesUnitPrice;
+	}
+
+	public VipGroupStudentCoursePrice(Integer studentId, BigDecimal onlineClassesUnitPrice, BigDecimal offlineClassesUnitPrice, BigDecimal paymentPrice) {
+		this.studentId = studentId;
+		this.onlineClassesUnitPrice = onlineClassesUnitPrice;
+		this.offlineClassesUnitPrice = offlineClassesUnitPrice;
+		this.paymentPrice = paymentPrice;
+	}
+
+	public void setId(Long id){
+		this.id = id;
+	}
+	
+	public Long getId(){
+		return this.id;
+	}
+			
+	public void setVipGroupId(Long vipGroupId){
+		this.vipGroupId = vipGroupId;
+	}
+	
+	public Long getVipGroupId(){
+		return this.vipGroupId;
+	}
+			
+	public void setStudentId(Integer studentId){
+		this.studentId = studentId;
+	}
+	
+	public Integer getStudentId(){
+		return this.studentId;
+	}
+			
+	public void setOnlineClassesUnitPrice(java.math.BigDecimal onlineClassesUnitPrice){
+		this.onlineClassesUnitPrice = onlineClassesUnitPrice;
+	}
+	
+	public java.math.BigDecimal getOnlineClassesUnitPrice(){
+		return this.onlineClassesUnitPrice;
+	}
+			
+	public void setOfflineClassesUnitPrice(java.math.BigDecimal offlineClassesUnitPrice){
+		this.offlineClassesUnitPrice = offlineClassesUnitPrice;
+	}
+	
+	public java.math.BigDecimal getOfflineClassesUnitPrice(){
+		return this.offlineClassesUnitPrice;
+	}
+			
+	public void setPaymentPrice(java.math.BigDecimal paymentPrice){
+		this.paymentPrice = paymentPrice;
+	}
+	
+	public java.math.BigDecimal getPaymentPrice(){
+		return this.paymentPrice;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

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

@@ -54,6 +54,19 @@ public interface SysUserCashAccountService extends BaseService<Integer, SysUserC
 	boolean appendCourseBalance(Integer userId, BigDecimal decimal, PlatformCashAccountDetailTypeEnum type, String description);
 
 	/**
+	 * @describe 从账户金额与课程金额中扣减指定金额
+	 * 优先课程金额,不够再扣减账户金额
+	 * @author Joburgess
+	 * @date 2021/1/20 0020
+	 * @param userId:
+	 * @param decimal:
+	 * @param type:
+	 * @param description:
+	 * @return void
+	 */
+	void subtractFromCourseBalanceAndBalance(Integer userId, BigDecimal decimal, PlatformCashAccountDetailTypeEnum type, String description);
+
+	/**
 	 * 将课程余额转入到可用余额
 	 * @param userId
 	 * @return

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/VipGroupStudentCoursePriceService.java

@@ -0,0 +1,8 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice;
+import com.ym.mec.common.service.BaseService;
+
+public interface VipGroupStudentCoursePriceService extends BaseService<Long, VipGroupStudentCoursePrice> {
+
+}

+ 65 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserCashAccountServiceImpl.java

@@ -256,6 +256,71 @@ public class SysUserCashAccountServiceImpl extends BaseServiceImpl<Integer, SysU
     }
 
     @Override
+    public void subtractFromCourseBalanceAndBalance(Integer userId, BigDecimal decimal, PlatformCashAccountDetailTypeEnum type, String description) {
+        SysUserCashAccount cashAccount = sysUserCashAccountDao.getLocked(userId);
+        if (cashAccount == null) {
+            throw new BizException("用户[{}]现金账户不存在", userId);
+        }
+        decimal = decimal.abs();
+        BigDecimal allBalance = cashAccount.getCourseBalance().add(cashAccount.getBalance());
+        BigDecimal changeMoney = decimal;
+        if (changeMoney.compareTo(allBalance)>0) {
+            throw new BizException("现金账户[{}]课程余额不足,可用余额剩{}元", userId, allBalance.doubleValue());
+        }
+
+        if (changeMoney.compareTo(BigDecimal.ZERO) == 0) {
+            return;
+        }
+
+        Date date = new Date();
+        SysUserCoursesAccountDetail sysUserCoursesAccountDetail = new SysUserCoursesAccountDetail();
+        if(changeMoney.compareTo(cashAccount.getCourseBalance())>0){
+            changeMoney = changeMoney.subtract(cashAccount.getCourseBalance());
+            cashAccount.setCourseBalance(BigDecimal.ZERO);
+            sysUserCoursesAccountDetail.setAmount(cashAccount.getCourseBalance());
+        }else{
+            changeMoney = BigDecimal.ZERO;
+            cashAccount.setCourseBalance(cashAccount.getCourseBalance().subtract(changeMoney));
+            sysUserCoursesAccountDetail.setAmount(changeMoney);
+        }
+        cashAccount.setUpdateTime(date);
+
+        String comment = description;
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser != null && sysUser.getId()!=null){
+            comment +=  "-" + sysUser.getId();
+        }
+        sysUserCoursesAccountDetail.setUserId(userId);
+        sysUserCoursesAccountDetail.setBalance(cashAccount.getBalance());
+        sysUserCoursesAccountDetail.setComment(comment);
+        sysUserCoursesAccountDetail.setDescription("总扣费金额:"+decimal);
+        sysUserCoursesAccountDetail.setStatus(DealStatusEnum.SUCCESS);
+        sysUserCoursesAccountDetail.setType(type);
+        sysUserCoursesAccountDetail.setUpdateTime(date);
+        sysUserCoursesAccountDetail.setCreateTime(date);
+        sysUserCoursesAccountDetailDao.insert(sysUserCoursesAccountDetail);
+
+        if(changeMoney.compareTo(BigDecimal.ZERO)==0){
+            sysUserCashAccountDao.update(cashAccount);
+            return;
+        }
+        cashAccount.setBalance(cashAccount.getBalance().subtract(changeMoney));
+        sysUserCashAccountDao.update(cashAccount);
+
+        SysUserCashAccountDetail detail = new SysUserCashAccountDetail();
+        detail.setAmount(changeMoney);
+        detail.setBalance(cashAccount.getBalance());
+        detail.setComment(comment);
+        detail.setCreateTime(date);
+        detail.setDescription("总扣费金额:"+decimal);
+        detail.setStatus(DealStatusEnum.SUCCESS);
+        detail.setType(type);
+        detail.setUpdateTime(date);
+        detail.setUserId(userId);
+        sysUserCashAccountDetailDao.insert(detail);
+    }
+
+    @Override
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public boolean transferCourseBalanceToBalance(Integer userId, BigDecimal money) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();

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

@@ -149,6 +149,8 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 	private GroupClassService groupClassService;
 	@Autowired
 	private StudentPaymentRouteOrderService studentPaymentRouteOrderService;
+	@Autowired
+	private VipGroupStudentCoursePriceDao vipGroupStudentCoursePriceDao;
 
 	private static final Logger LOGGER = LoggerFactory
 			.getLogger(VipGroup.class);
@@ -205,23 +207,17 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
         if(Objects.isNull(vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice())
             &&Objects.isNull(vipGroupApplyBaseInfoDto.getOnlineClassesUnitPrice())){
-            throw new BizException("请设置教师课酬");
+            throw new BizException("请设置课程单价");
         }
 
 		if(StringUtils.isBlank(vipGroupApplyBaseInfoDto.getStudentIdList())){
 			throw new BizException("请选择学员");
 		}
 
-        if(Objects.isNull(vipGroupApplyBaseInfoDto.getOnlineTeacherSalary())){
-        	vipGroupApplyBaseInfoDto.setOnlineTeacherSalary(new BigDecimal(0));
-		}
-
-		if(Objects.isNull(vipGroupApplyBaseInfoDto.getOfflineTeacherSalary())){
-			vipGroupApplyBaseInfoDto.setOfflineTeacherSalary(new BigDecimal(0));
+        if(Objects.isNull(vipGroupApplyBaseInfoDto.getOnlineTeacherSalary())||Objects.isNull(vipGroupApplyBaseInfoDto.getOfflineTeacherSalary())){
+			throw new BizException("请设置教师课酬");
 		}
 
-		//获取活动信息
-		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupApplyBaseInfo().getVipGroupActivityId().intValue());
 		Integer totalClassTimes=vipGroupApplyBaseInfoDto.getOnlineClassesNum()+vipGroupApplyBaseInfoDto.getOfflineClassesNum();
 		//获取第一节课
 		CourseSchedule firstCourseSchedule = vipGroup.getCourseSchedules().stream().min(Comparator.comparing(CourseSchedule::getStartClassTime)).get();
@@ -241,12 +237,20 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		    throw new BizException("创建失败,报名截止时间必须在开课时间前一天");
         }
 
+		List<Integer> canBuyStudentIds = Arrays.stream(vipGroupApplyBaseInfoDto.getStudentIdList().split(",")).map(e -> Integer.valueOf(e)).collect(Collectors.toList());
+		List<VipGroupStudentCoursePrice> vscps = new ArrayList<>();
+
+		//获取活动信息
+		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupApplyBaseInfo().getVipGroupActivityId());
 		//判断课程安排是否超出范围
-		if(Objects.nonNull(vipGroupActivity.getCoursesEndTime())||Objects.nonNull(vipGroupActivity.getCoursesStartTime())){
+		if(Objects.nonNull(vipGroupActivity)&&(Objects.nonNull(vipGroupActivity.getCoursesEndTime())||Objects.nonNull(vipGroupActivity.getCoursesStartTime()))){
 			if(latestCourseSchedule.getEndClassTime().after(vipGroupActivity.getCoursesEndTime())
 					||firstCourseSchedule.getStartClassTime().before(vipGroupActivity.getCoursesStartTime())){
 				throw new BizException("课时安排时间超出范围!");
 			}
+			for (Integer canBuyStudentId : canBuyStudentIds) {
+				vscps.add(new VipGroupStudentCoursePrice(canBuyStudentId, vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice(), vipGroupApplyBaseInfoDto.getOfflineClassesUnitPrice()));
+			}
 		}else{
 			VipGroupDefaultClassesCycle vipGroupDefaultClassesCycle = vipGroupDefaultClassesCycleDao.findByOrganAndClassTimes(totalClassTimes);
 
@@ -256,6 +260,15 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 					throw new BizException("课时安排时间超出范围!");
 				}
 			}
+			vscps = vipGroup.getVipGroupApplyBaseInfo().getVipGroupStudentCoursePrices();
+			vipGroupApplyBaseInfoDto.setTotalPrice(new BigDecimal(0));
+			for (VipGroupStudentCoursePrice vscp : vscps) {
+				if(Objects.isNull(vscp.getOnlineClassesUnitPrice())||Objects.isNull(vscp.getOfflineClassesUnitPrice())){
+					throw new BizException("请设置课程单价");
+				}
+				vscp.setPaymentPrice(vscp.getOfflineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOfflineClassesNum())).add(vscp.getOnlineClassesUnitPrice().multiply(new BigDecimal(vipGroupApplyBaseInfoDto.getOnlineClassesNum()))));
+				vipGroupApplyBaseInfoDto.setTotalPrice(vipGroupApplyBaseInfoDto.getTotalPrice().add(vscp.getPaymentPrice()));
+			}
 		}
 
 		int repeatVipGroups = vipGroupDao.countUserRepeatVipGroupInCourseStartEndTime(vipGroupApplyBaseInfoDto.getUserId(), firstCourseSchedule.getStartClassTime(), latestCourseSchedule.getEndClassTime());
@@ -267,9 +280,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 		if(Objects.isNull(vipGroupCategory)){
 			throw new BizException("课程形式不存在");
 		}
-
-		List<Integer> canBuyStudentIds = Arrays.stream(vipGroupApplyBaseInfoDto.getStudentIdList().split(",")).map(e -> Integer.valueOf(e)).collect(Collectors.toList());
-
 		List<String> studentNames = studentDao.getStudentNames(canBuyStudentIds);
 
 		//生成vip课信息
@@ -360,6 +370,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 		vipGroupDao.insert(vipGroupApplyBaseInfoDto);
 
+		vscps.forEach(e->e.setVipGroupId(vipGroupApplyBaseInfoDto.getId()));
+		vipGroupStudentCoursePriceDao.batchInsert(vscps);
+
         vipGroup.getVipGroupApplyBaseInfo().setId(vipGroupApplyBaseInfoDto.getId());
 
 		//创建班级信息
@@ -972,14 +985,38 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			throw new BizException("请设置教师课酬");
 		}
 
-		if(Objects.isNull(vipGroup.getVipGroupActivityId())){
-			throw new BizException("请指定活动方案");
+		if(Objects.isNull(teacherDefaultVipGroupSalary)||Objects.isNull(teacherDefaultVipGroupSalary.getOfflineClassesSalary())){
+			throw new BizException("请设置教师VIP课课酬");
 		}
 
-		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId().intValue());
+		VipGroupActivity vipGroupActivity = vipGroupActivityDao.get(vipGroup.getVipGroupActivityId());
+
+		Map<String,BigDecimal> results=new HashMap<>(1);
+
+		int normalStudentNum = 0;
+		if(Objects.nonNull(vipGroup.getId())){
+			normalStudentNum = classGroupStudentMapperDao.countGroupNormalStudentNum(GroupType.VIP, vipGroup.getId().toString());
+		}
 
 		if(Objects.isNull(vipGroupActivity)){
-			throw new BizException("指定的活动方案不存在");
+			vipGroup.setTotalPrice(new BigDecimal(0));
+			for (VipGroupStudentCoursePrice vscp : ((VipGroupApplyBaseInfoDto)vipGroup).getVipGroupStudentCoursePrices()) {
+				if(Objects.isNull(vscp.getOnlineClassesUnitPrice())||Objects.isNull(vscp.getOfflineClassesUnitPrice())){
+					throw new BizException("请设置课程单价");
+				}
+				vscp.setPaymentPrice(vscp.getOfflineClassesUnitPrice().multiply(new BigDecimal(vipGroup.getOfflineClassesNum())).add(vscp.getOnlineClassesUnitPrice().multiply(new BigDecimal(vipGroup.getOnlineClassesNum()))));
+				vipGroup.setTotalPrice(vipGroup.getTotalPrice().add(vscp.getPaymentPrice()));
+			}
+			BigDecimal ots = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+			BigDecimal ofts = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
+			if(Objects.nonNull(vipGroup.getStatus())&&normalStudentNum!=vipGroupCategory.getStudentNum()){
+				ots = ots.divide(new BigDecimal(vipGroupCategory.getStudentNum()),CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+				ofts = ofts.divide(new BigDecimal(vipGroupCategory.getStudentNum()),CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
+			}
+			results.put("totalPrice",vipGroup.getTotalPrice());
+			results.put("onlineTeacherSalary",ots);
+			results.put("offlineTeacherSalary",ofts);
+			return results;
 		}
 
 		VipGroupSalarySettlementDto vipGroupSalarySettlementDto = JSON.parseObject(vipGroupActivity.getSalarySettlementJson(), VipGroupSalarySettlementDto.class);
@@ -988,8 +1025,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			throw new BizException("课酬结算方案错误");
 		}
 
-		Map<String,BigDecimal> results=new HashMap<>(1);
-
 		BigDecimal offlineClassNum=new BigDecimal(vipGroup.getOfflineClassesNum());
 		BigDecimal onlineClassNum=new BigDecimal(vipGroup.getOnlineClassesNum());
 		onlineClassesUnitPrice=Objects.isNull(onlineClassesUnitPrice)?vipGroup.getOnlineClassesUnitPrice():onlineClassesUnitPrice;
@@ -1044,34 +1079,12 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 		results.put("totalPrice",totalPrice.setScale(0,BigDecimal.ROUND_CEILING));
 
-		int normalStudentNum = 0;
-		if(Objects.nonNull(vipGroup.getId())){
-			normalStudentNum = classGroupStudentMapperDao.countGroupNormalStudentNum(GroupType.VIP, vipGroup.getId().toString());
-		}
-
-//		if(JobNatureEnum.PART_TIME.equals(teacher.getJobNature())){
-//			BigDecimal ots = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
-//			BigDecimal ofts = teacherDefaultVipGroupSalary.getOfflineClassesSalary();
-//			if(normalStudentNum>0&&normalStudentNum!=vipGroupCategory.getStudentNum()){
-//				ots = ots.divide(new BigDecimal(vipGroupCategory.getStudentNum()),CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
-//				ofts = ofts.divide(new BigDecimal(vipGroupCategory.getStudentNum()),CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(normalStudentNum)).setScale(CommonConstants.DECIMAL_FINAL_PLACE, BigDecimal.ROUND_HALF_UP);
-//			}
-//
-//			results.put("onlineTeacherSalary", ots);
-//			results.put("offlineTeacherSalary", ofts);
-//			return results;
-//		}
-
 		//教师课酬线上单课酬计算
 		if(Objects.nonNull(vipGroupSalarySettlementDto.getOnlineSalarySettlement())){
 			if(Objects.isNull(teacherOnlineSalary)){
 				switch (vipGroupSalarySettlementDto.getOnlineSalarySettlement().getSalarySettlementType()){
 					case TEACHER_DEFAULT:
-						if(Objects.isNull(teacherDefaultVipGroupSalary)||Objects.isNull(teacherDefaultVipGroupSalary.getOfflineClassesSalary())){
-							teacherOnlineSalary=new BigDecimal(0);
-						}else{
-							teacherOnlineSalary=teacherDefaultVipGroupSalary.getOfflineClassesSalary();
-						}
+						teacherOnlineSalary=teacherDefaultVipGroupSalary.getOfflineClassesSalary();
 						results.put("onlineTeacherSalary",teacherOnlineSalary.setScale(0, BigDecimal.ROUND_HALF_UP));
 						break;
 					case RATIO_DISCOUNT:
@@ -1097,11 +1110,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			if(Objects.isNull(teacherOfflineSalary)){
 				switch (vipGroupSalarySettlementDto.getOfflineSalarySettlement().getSalarySettlementType()){
 					case TEACHER_DEFAULT:
-						if(Objects.isNull(teacherDefaultVipGroupSalary)||Objects.isNull(teacherDefaultVipGroupSalary.getOfflineClassesSalary())){
-							teacherOfflineSalary=new BigDecimal(0);
-						}else{
-							teacherOfflineSalary=teacherDefaultVipGroupSalary.getOfflineClassesSalary();
-						}
+						teacherOfflineSalary=teacherDefaultVipGroupSalary.getOfflineClassesSalary();
 						results.put("offlineTeacherSalary",teacherOfflineSalary.setScale(0, BigDecimal.ROUND_HALF_UP));
 						break;
 					case RATIO_DISCOUNT:
@@ -2827,6 +2836,12 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			}
 		}
 
+		Map<Integer, VipGroupStudentCoursePrice> studentCoursePriceMap = new HashMap<>();
+		if(Objects.isNull(vipGroup.getVipGroupActivityId())){
+			List<VipGroupStudentCoursePrice> vipGroupStudentCoursePrice = vipGroupStudentCoursePriceDao.getVipGroupStudentCoursePrice(vipGroupId, null);
+			studentCoursePriceMap = vipGroupStudentCoursePrice.stream().collect(Collectors.toMap(VipGroupStudentCoursePrice::getStudentId, v->v, (v1, v2)->v1));
+		}
+
 		VipGroupDefaultClassesUnitPrice vipGroupDefaultClassesUnitPrice = vipGroupDefaultClassesUnitPriceDao.getByVipGroup(vipGroup.getId());
 		if(Objects.isNull(vipGroupDefaultClassesUnitPrice)){
 			throw new BizException("课程单价设置错误");
@@ -2996,10 +3011,17 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 
 		//生成学生单课缴费信息
 		for (Integer studentId:studentIds) {
-			SysUserCashAccount sysUserCashAccount = sysUserCashAccountService.get(studentId);
-			if(sysUserCashAccount.getCourseBalance().compareTo(surplusCoursesPrice)<0){
-				throw new BizException("存在课程余额不足的学生");
+			if(Objects.isNull(vipGroupActivity)){
+				VipGroupStudentCoursePrice vipGroupStudentCoursePrice = studentCoursePriceMap.get(studentId);
+				if(Objects.isNull(vipGroupStudentCoursePrice)||Objects.isNull(vipGroupStudentCoursePrice.getOfflineClassesUnitPrice())||Objects.isNull(vipGroupStudentCoursePrice.getOnlineClassesUnitPrice())){
+					throw new BizException("学员缴费设置有误");
+				}
+				vipGroup.setOfflineClassesUnitPrice(vipGroupStudentCoursePrice.getOfflineClassesUnitPrice());
+				vipGroup.setOnlineClassesUnitPrice(vipGroupStudentCoursePrice.getOnlineClassesUnitPrice());
+				surplusCoursesPrice = vipGroupStudentCoursePrice.getOfflineClassesUnitPrice().multiply(new BigDecimal(offlineCourseTimes)).add(vipGroupStudentCoursePrice.getOnlineClassesUnitPrice().multiply(new BigDecimal(onlineCourseTimes)));
 			}
+
+			sysUserCashAccountService.subtractFromCourseBalanceAndBalance(studentId,surplusCoursesPrice,PlatformCashAccountDetailTypeEnum.PAY_FEE, "后台添加学员扣减账户金额");
 //			courseScheduleStudentPaymentService.createCourseScheduleStudentPaymentForVipGroup(vipGroupId,studentId);
 
 			List<CourseScheduleStudentPayment> courseScheduleStudentPayments=new ArrayList<>();
@@ -3046,8 +3068,6 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
 			}
 			courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
 
-			sysUserCashAccountService.updateCourseBalance(studentId,sysUserCashAccount.getCourseBalance().subtract(surplusCoursesPrice),PlatformCashAccountDetailTypeEnum.PAY_FEE, surplusCoursesPrice.negate(), "后台添加学员扣除课程余额");
-
 			//创建班级学生关联记录
 			ClassGroupStudentMapper classGroupStudentMapper;
 

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

@@ -0,0 +1,22 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice;
+import com.ym.mec.biz.service.VipGroupStudentCoursePriceService;
+import com.ym.mec.biz.dal.dao.VipGroupStudentCoursePriceDao;
+import org.springframework.stereotype.Service;
+
+@Service
+public class VipGroupStudentCoursePriceServiceImpl extends BaseServiceImpl<Long, VipGroupStudentCoursePrice> implements VipGroupStudentCoursePriceService {
+	
+	@Autowired
+	private VipGroupStudentCoursePriceDao vipGroupStudentCoursePriceDao;
+
+	@Override
+	public BaseDAO<Long, VipGroupStudentCoursePrice> getDAO() {
+		return vipGroupStudentCoursePriceDao;
+	}
+	
+}

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

@@ -352,6 +352,7 @@
             AND status_='SUCCESS') = 0
             AND vg.organ_id_ = #{organId} AND IF(vg.student_id_list_ IS NULL,1,FIND_IN_SET(#{userId},
             vg.student_id_list_))
+            AND vg.vip_group_activity_id_ IS NOT NULL
             <if test="subjectId!=null">
                 AND FIND_IN_SET(#{subjectId},cg.subject_id_list_)
             </if>
@@ -552,10 +553,12 @@
 
     <select id="findHaveCourseBalanceStudents" resultMap="vipGroupStudentDto">
         SELECT
-        su.id_,
-        su.username_,
-        su.phone_,
-        suca.course_balance_
+            su.id_,
+            su.username_,
+            su.phone_,
+            suca.course_balance_,
+            suca.balance_ balance,
+            (suca.course_balance_+suca.balance_) allBalance
         FROM
         sys_user_cash_account suca
         LEFT JOIN sys_user su ON suca.user_id_=su.id_

+ 93 - 0
mec-biz/src/main/resources/config/mybatis/VipGroupStudentCoursePriceMapper.xml

@@ -0,0 +1,93 @@
+<?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.VipGroupStudentCoursePriceDao">
+
+	<resultMap type="com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice" id="VipGroupStudentCoursePrice">
+		<result column="id_" property="id" />
+		<result column="vip_group_id_" property="vipGroupId" />
+		<result column="student_id_" property="studentId" />
+		<result column="online_classes_unit_price_" property="onlineClassesUnitPrice" />
+		<result column="offline_classes_unit_price_" property="offlineClassesUnitPrice" />
+		<result column="payment_price_" property="paymentPrice" />
+	</resultMap>
+
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="VipGroupStudentCoursePrice" >
+		SELECT * FROM vip_group_student_course_price WHERE id_ = #{id}
+	</select>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="VipGroupStudentCoursePrice">
+		SELECT * FROM vip_group_student_course_price ORDER BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		</selectKey>
+		-->
+		INSERT INTO vip_group_student_course_price (vip_group_id_,student_id_,online_classes_unit_price_,offline_classes_unit_price_,payment_price_)
+		VALUES(#{vipGroupId},#{studentId},#{onlineClassesUnitPrice},#{offlineClassesUnitPrice},#{paymentPrice})
+	</insert>
+
+	<insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO vip_group_student_course_price (vip_group_id_,student_id_,online_classes_unit_price_,offline_classes_unit_price_,payment_price_)
+		VALUE
+		<foreach collection="datas" item="data" separator=",">
+			(#{data.vipGroupId},#{data.studentId},#{data.onlineClassesUnitPrice},#{data.offlineClassesUnitPrice},#{data.paymentPrice})
+		</foreach>
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.VipGroupStudentCoursePrice">
+		UPDATE vip_group_student_course_price <set>
+		<if test="vipGroupId != null">
+			vip_group_id_ = #{vipGroupId},
+		</if>
+		<if test="id != null">
+			id_ = #{id},
+		</if>
+		<if test="offlineClassesUnitPrice != null">
+			offline_classes_unit_price_ = #{offlineClassesUnitPrice},
+		</if>
+		<if test="onlineClassesUnitPrice != null">
+			online_classes_unit_price_ = #{onlineClassesUnitPrice},
+		</if>
+		<if test="studentId != null">
+			student_id_ = #{studentId},
+		</if>
+		<if test="paymentPrice != null">
+			payment_price_ = #{paymentPrice},
+		</if>
+	</set> WHERE id_ = #{id}
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM vip_group_student_course_price WHERE id_ = #{id}
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="VipGroupStudentCoursePrice" parameterType="map">
+		SELECT * FROM vip_group_student_course_price ORDER BY id_ <include refid="global.limit"/>
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM vip_group_student_course_price
+	</select>
+
+    <select id="getVipGroupStudentCoursePrice" resultMap="VipGroupStudentCoursePrice">
+		SELECT * FROM vip_group_student_course_price
+		WHERE vip_group_id_=#{vipGroupId}
+		  <if test="studentId!=null">
+			  AND student_id_=#{studentId}
+		  </if>
+	</select>
+</mapper>