Browse Source

抽象计算平均数的方法

hgw 3 years ago
parent
commit
dbfed66035

+ 4 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/CourseConstant.java

@@ -1,10 +1,13 @@
 package com.yonge.cooleshow.biz.dal.constant;
 
 public interface CourseConstant {
+
+    String TEACHER_ID = "${teacherId}";
+
     /**
      * 未正式写入数据库的排课时间临时数据
      * <p>用途将未写入数据库的排课数据写入缓存,然后生成日历及陪练课买课时校验课时将缓存时间拿出来比对
      * <p>返回结果 List<CourseTimeEntity>
      */
-    String LOCK_COURSE_TIME_INFO = "LOCK_COURSE_TIME_INFO";
+    String LOCK_COURSE_TIME_INFO = String.join(":", LiveRoomConstant.COOLESHOW, CourseConstant.LOCK_COURSE_TIME_INFO, TEACHER_ID);
 }

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java

@@ -18,6 +18,7 @@ import com.yonge.cooleshow.common.page.PageInfo;
 import org.redisson.api.RMap;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 

+ 10 - 34
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java

@@ -454,7 +454,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
      * @return 缓存 key teacherId value List<CourseTimeEntity>
      */
     public RMap<Long, List<CourseTimeEntity>> getLiveLockTimeCache(Long teacherId) {
-        String key = String.join(":", LiveRoomConstant.COOLESHOW, CourseConstant.LOCK_COURSE_TIME_INFO, teacherId.toString());
+        String key = CourseConstant.LOCK_COURSE_TIME_INFO.replace(CourseConstant.TEACHER_ID, teacherId.toString());
         return redissonClient.getMap(key);
     }
 
@@ -547,18 +547,18 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         }
         //校验购买的课程组每节课时间是否和自己的课时冲突
         batchCheckStudentCourseTime(studentId, courseList, CourseSchedule::getStartTime, CourseSchedule::getEndTime);
-        //返回的数据 有用后面aftet的方法使用
-        Map<String, Object> bizContent = new HashMap<>();
-        bizContent.put("courseGroup", courseGroup);
-        bizContent.put("courseList", courseList);
-        bizContent.put("studentId", studentId);
+        //将该数据传递到后面的after方法使用
+        Map<String, Object> bizParam = new HashMap<>();
+        bizParam.put("courseGroup", courseGroup);
+        bizParam.put("courseList", courseList);
+        bizParam.put("studentId", studentId);
         OrderCreateRes orderCreateRes = new OrderCreateRes();
         orderCreateRes.setRes(true);
         orderCreateRes.setMerchId(courseGroup.getTeacherId());
         orderCreateRes.setBizId(courseGroup.getId());
         orderCreateRes.setOriginalPrice(courseGroup.getCoursePrice());
         orderCreateRes.setExpectPrice(courseGroup.getCoursePrice());
-        orderCreateRes.setBizParam(bizContent);
+        orderCreateRes.setBizParam(bizParam);
         orderCreateRes.setGoodNum(courseGroup.getCourseNum());
         orderCreateRes.setGoodType(GoodTypeEnum.LIVE);
 
@@ -586,7 +586,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         CourseGroup courseGroup = (CourseGroup) param.get("courseGroup");
 
         //获取每节课购买的价格
-        Map<Integer, BigDecimal> courseAveragePrice = getCourseAveragePrice(courseGroup.getCourseNum(), courseGroup.getCoursePrice());
+        Map<Integer, BigDecimal> courseAveragePrice = WrapperUtil.getAveragePrice(courseGroup.getCourseNum(), courseGroup.getCoursePrice());
         //写course_schedule_student_payment表 作为记录锁定时间用,防止重复购买,如果支付失败则删除该数据
         List<CourseScheduleStudentPayment> studentPaymentList = new ArrayList<>();
         Date now = new Date();
@@ -640,7 +640,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         //总课酬  1 - (1 * 手续费率)
         BigDecimal totalRatePrice = expectPrice.subtract(expectPrice.multiply(liveServiceRate)).setScale(2, RoundingMode.HALF_UP);
         //获取每节课的课酬 key 课堂数  value 课酬
-        Map<Integer, BigDecimal> singerCourseSalary = getCourseAveragePrice(courseGroup.getCourseNum(), totalRatePrice);
+        Map<Integer, BigDecimal> singerCourseSalary = WrapperUtil.getAveragePrice(courseGroup.getCourseNum(), totalRatePrice);
         //写入课酬表计算-根据课程组总金额计算分配到每节课的金额
         Date now = new Date();
         List<CourseScheduleTeacherSalary> teacherSalaryList = new ArrayList<>();
@@ -662,30 +662,6 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     }
 
     /**
-     * 计算课堂每节课价格
-     *
-     * @param totalCourseNum 总课程数
-     * @param totalRatePrice 总金额
-     * @return key 课堂数 value 课酬
-     */
-    private Map<Integer, BigDecimal> getCourseAveragePrice(Integer totalCourseNum, BigDecimal totalRatePrice) {
-        //每节课的单价 四舍五入
-        BigDecimal singerSalary = totalRatePrice.divide(BigDecimal.valueOf(totalCourseNum), 2, RoundingMode.HALF_UP);
-        //单价累计总额
-        BigDecimal cumulativeAmount = BigDecimal.ZERO;
-        Map<Integer, BigDecimal> map = new HashMap<>();
-        for (int i = 1; i <= totalCourseNum; i++) {
-            //最后一节课,直接用总课酬减去累计总额
-            if (i == totalCourseNum) {
-                singerSalary = totalRatePrice.subtract(cumulativeAmount);
-            }
-            cumulativeAmount = cumulativeAmount.add(singerSalary);
-            map.put(i, singerSalary);
-        }
-        return map;
-    }
-
-    /**
      * 学生购买直播课-失败-回调
      */
     @Transactional(rollbackFor = Exception.class)
@@ -723,7 +699,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         courseGroupList.forEach(courseGroup -> {
             courseGroup.setStatus(CourseGroupEnum.APPLY.getCode());
             this.updateById(courseGroup);
-        })  ;
+        });
     }
 
 }

+ 5 - 30
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java

@@ -9,9 +9,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleRepliedDao;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
 import com.yonge.cooleshow.biz.dal.dto.PracticeScheduleDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
@@ -42,7 +42,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
@@ -805,30 +804,6 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     }
 
     /**
-     * 计算课堂每节课价格
-     *
-     * @param totalCourseNum 总课程数
-     * @param totalRatePrice 总金额
-     * @return key 课堂数 value 课酬
-     */
-    private Map<Integer, BigDecimal> getCourseAveragePrice(Integer totalCourseNum, BigDecimal totalRatePrice) {
-        //每节课的单价 四舍五入
-        BigDecimal singerSalary = totalRatePrice.divide(BigDecimal.valueOf(totalCourseNum), 2, RoundingMode.HALF_UP);
-        //单价累计总额
-        BigDecimal cumulativeAmount = BigDecimal.ZERO;
-        Map<Integer, BigDecimal> map = new HashMap<>();
-        for (int i = 1; i <= totalCourseNum; i++) {
-            //最后一节课,直接用总课酬减去累计总额
-            if (i == totalCourseNum) {
-                singerSalary = totalRatePrice.subtract(cumulativeAmount);
-            }
-            cumulativeAmount = cumulativeAmount.add(singerSalary);
-            map.put(i, singerSalary);
-        }
-        return map;
-    }
-
-    /**
      * @Description: 学生购买陪练课
      * @Author: cy
      * @Date: 2022/4/21
@@ -855,7 +830,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         Long groupId = scheduleDto.getGroupId();
 
         //获取每节课购买的价格
-        Map<Integer, BigDecimal> courseAveragePrice = getCourseAveragePrice(scheduleDto.getCourseNum(), scheduleDto.getCoursePrice());
+        Map<Integer, BigDecimal> courseAveragePrice = WrapperUtil.getAveragePrice(scheduleDto.getCourseNum(), scheduleDto.getCoursePrice());
 
         List<CourseScheduleDate> classTime = scheduleDto.getClassTime();
         for (int i = 0; i < classTime.size(); i++) {
@@ -881,9 +856,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             payment.setCourseGroupId(groupId);
             payment.setCourseType(CourseScheduleEnum.PRACTICE.getCode());
             payment.setOrderNo(orderNo);
-            payment.setOriginalPrice(courseAveragePrice.get(i+1));
-            payment.setExpectPrice(courseAveragePrice.get(i+1));
-            payment.setActualPrice(courseAveragePrice.get(i+1));
+            payment.setOriginalPrice(courseAveragePrice.get(i + 1));
+            payment.setExpectPrice(courseAveragePrice.get(i + 1));
+            payment.setActualPrice(courseAveragePrice.get(i + 1));
             //写入course_schedule_student_payment
             courseScheduleStudentPaymentService.save(payment);
         }

+ 32 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/support/WrapperUtil.java

@@ -6,6 +6,7 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -236,4 +237,35 @@ public class WrapperUtil {
         }
     }
 
+    /**
+     * 计算平均价格,保留2位
+     * <p> 例如:总数3  总金额10
+     * <p> 返回:
+     * <p> key   value
+     * <p> 1 :3.33
+     * <p> 2 :3.33
+     * <p> 3 :3.34
+     * <p> 最后1 ,2,3的的金额总数还是为10
+     *
+     * @param totalNum   总数
+     * @param totalPrice 总金额
+     * @return key 数 value 平均金额
+     */
+    public static Map<Integer, BigDecimal> getAveragePrice(Integer totalNum, BigDecimal totalPrice) {
+        //单价 四舍五入
+        BigDecimal unitPrice = totalPrice.divide(BigDecimal.valueOf(totalNum), 2, RoundingMode.HALF_UP);
+        //累计总额
+        BigDecimal cumulativeAmount = BigDecimal.ZERO;
+        Map<Integer, BigDecimal> map = new HashMap<>();
+        for (int i = 1; i <= totalNum; i++) {
+            //最后一个数,直接用总金额减去累计总额
+            if (i == totalNum) {
+                unitPrice = totalPrice.subtract(cumulativeAmount);
+            }
+            cumulativeAmount = cumulativeAmount.add(unitPrice);
+            map.put(i, unitPrice);
+        }
+        return map;
+    }
+
 }