|
@@ -1123,7 +1123,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
teacherId = payment.getTeacherId();
|
|
|
studentId = payment.getUserId();
|
|
|
}
|
|
|
- if(CollectionUtils.isNotEmpty(teacherSalaryList)){
|
|
|
+ if (CollectionUtils.isNotEmpty(teacherSalaryList)) {
|
|
|
courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
|
|
|
log.info("buyPracticeCourseSuccess ok");
|
|
|
//写老师账户
|
|
@@ -1730,18 +1730,21 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
recordDao.insertBatch(records);
|
|
|
|
|
|
//释放冻结课时
|
|
|
- List<PianoRoomTime> roomTimeList = new ArrayList<>();
|
|
|
Map<Long, List<CourseScheduleRecord>> collect = records.stream().collect(Collectors.groupingBy(CourseScheduleRecord::getTeacherId, Collectors.toList()));
|
|
|
collect.forEach((key, list) -> {
|
|
|
- PianoRoomTime pianoRoomTime = pianoRoomTimeDao.selectOne(Wrappers.<PianoRoomTime>lambdaQuery().eq(PianoRoomTime::getTeacherId, key));
|
|
|
- Integer frozenTime = pianoRoomTime.getFrozenTime();
|
|
|
-
|
|
|
- PianoRoomTime roomTime = new PianoRoomTime();
|
|
|
- roomTime.setTeacherId(key);
|
|
|
- roomTime.setFrozenTime(frozenTime - list.stream().mapToInt(CourseScheduleRecord::getConsumTime).sum());
|
|
|
- roomTimeList.add(roomTime);
|
|
|
+ //入琴房账户
|
|
|
+ DistributedLock.of(redissonClient)
|
|
|
+ .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_PIANO_ROOM_ACCOUNT.getRedisKey(key)
|
|
|
+ , (o) -> {
|
|
|
+ PianoRoomTime pianoRoomTime = pianoRoomTimeDao.selectOne(Wrappers.<PianoRoomTime>lambdaQuery().eq(PianoRoomTime::getTeacherId, key));
|
|
|
+ Integer frozenTime = pianoRoomTime.getFrozenTime();
|
|
|
+
|
|
|
+ PianoRoomTime roomTime = new PianoRoomTime();
|
|
|
+ roomTime.setFrozenTime(frozenTime - list.stream().mapToInt(CourseScheduleRecord::getConsumTime).sum());
|
|
|
+ pianoRoomTimeDao.update(roomTime, Wrappers.<PianoRoomTime>lambdaQuery().eq(PianoRoomTime::getTeacherId, key));
|
|
|
+ return null;
|
|
|
+ }, null, 10l);
|
|
|
});
|
|
|
- pianoRoomTimeDao.updateBatch(roomTimeList);
|
|
|
}
|
|
|
|
|
|
List<CourseScheduleStudentVo> courseList = userList.stream()
|
|
@@ -1979,10 +1982,26 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
|
|
|
//扣减piano_room_time
|
|
|
- PianoRoomTime roomTime = new PianoRoomTime();
|
|
|
- roomTime.setRemainTime(remainTime - consumTime);
|
|
|
- roomTime.setFrozenTime(frozenTime + consumTime);
|
|
|
- pianoRoomTimeDao.update(roomTime, Wrappers.<PianoRoomTime>lambdaQuery().eq(PianoRoomTime::getTeacherId, teacherId));
|
|
|
+ DistributedLock.of(redissonClient)
|
|
|
+ .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_PIANO_ROOM_ACCOUNT.getRedisKey(teacherId)
|
|
|
+ , (o) -> {
|
|
|
+ //校验时长
|
|
|
+ PianoRoomTime pianoRoomTimeLock = pianoRoomTimeDao.selectOne(Wrappers.<PianoRoomTime>lambdaQuery().eq(PianoRoomTime::getTeacherId, teacherId));
|
|
|
+ if (pianoRoomTimeLock == null) {
|
|
|
+ throw new BizException("未查询到老师剩余时长");
|
|
|
+ }
|
|
|
+ Integer remainTimeLock = pianoRoomTimeLock.getRemainTime();
|
|
|
+ Integer frozenTimeLock = pianoRoomTimeLock.getFrozenTime();
|
|
|
+ if (consumTime > remainTimeLock) {
|
|
|
+ throw new BizException("剩余时长不足");
|
|
|
+ }
|
|
|
+
|
|
|
+ PianoRoomTime roomTimeLock = new PianoRoomTime();
|
|
|
+ roomTimeLock.setRemainTime(remainTimeLock - consumTime);
|
|
|
+ roomTimeLock.setFrozenTime(frozenTimeLock + consumTime);
|
|
|
+ pianoRoomTimeDao.update(roomTimeLock, Wrappers.<PianoRoomTime>lambdaQuery().eq(PianoRoomTime::getTeacherId, teacherId));
|
|
|
+ return null;
|
|
|
+ }, null, 10l);
|
|
|
|
|
|
//创建群聊
|
|
|
try {
|
|
@@ -2092,18 +2111,31 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
Integer time = schedule.getSingleCourseTime() * n;//消耗时长 课程数*单课时长*人数
|
|
|
|
|
|
- PianoRoomTime pianoRoomTime = pianoRoomTimeDao.selectOne(Wrappers.<PianoRoomTime>lambdaQuery().eq(PianoRoomTime::getTeacherId, teacherId));
|
|
|
- if (pianoRoomTime == null) {
|
|
|
- throw new BizException("未查到剩余时长");
|
|
|
- }
|
|
|
- if (pianoRoomTime.getFrozenTime() - time < 0) {
|
|
|
- throw new BizException("冻结时长计算错误");
|
|
|
- }
|
|
|
- pianoRoomTimeDao.update(null, Wrappers.<PianoRoomTime>lambdaUpdate()
|
|
|
- .eq(PianoRoomTime::getTeacherId, teacherId)
|
|
|
- .set(PianoRoomTime::getRemainTime, pianoRoomTime.getRemainTime() + time)
|
|
|
- .set(PianoRoomTime::getFrozenTime, pianoRoomTime.getFrozenTime() - time));
|
|
|
+ Map<String, Object> paramMap = new HashMap<>();
|
|
|
+ paramMap.put("teacherId", teacherId);
|
|
|
+ paramMap.put("time", time);
|
|
|
|
|
|
+ //更新老师琴房时长账户
|
|
|
+ DistributedLock.of(redissonClient)
|
|
|
+ .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_PIANO_ROOM_ACCOUNT.getRedisKey(teacherId)
|
|
|
+ , (objectMap) -> {
|
|
|
+ Long objectId = Long.parseLong(objectMap.get("teacherId").toString());
|
|
|
+ Integer objectTime = Integer.parseInt(objectMap.get("time").toString());
|
|
|
+
|
|
|
+ PianoRoomTime pianoRoomTime = pianoRoomTimeDao.selectOne(Wrappers.<PianoRoomTime>lambdaQuery()
|
|
|
+ .eq(PianoRoomTime::getTeacherId, objectId));
|
|
|
+ if (pianoRoomTime == null) {
|
|
|
+ throw new BizException("未查到剩余时长");
|
|
|
+ }
|
|
|
+ if (pianoRoomTime.getFrozenTime() - objectTime < 0) {
|
|
|
+ throw new BizException("冻结时长计算错误");
|
|
|
+ }
|
|
|
+ pianoRoomTimeDao.update(null, Wrappers.<PianoRoomTime>lambdaUpdate()
|
|
|
+ .eq(PianoRoomTime::getTeacherId, objectId)
|
|
|
+ .set(PianoRoomTime::getRemainTime, pianoRoomTime.getRemainTime() + objectTime)
|
|
|
+ .set(PianoRoomTime::getFrozenTime, pianoRoomTime.getFrozenTime() - objectTime));
|
|
|
+ return null;
|
|
|
+ }, paramMap, 10l);
|
|
|
//删除课程
|
|
|
baseMapper.deleteById(courseId);
|
|
|
//删除payment
|
|
@@ -2244,27 +2276,33 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
throw new BizException("未查到排课学员");
|
|
|
}
|
|
|
|
|
|
- PianoRoomTime pianoRoomTime = pianoRoomTimeDao.selectOne(Wrappers.<PianoRoomTime>lambdaQuery().eq(PianoRoomTime::getTeacherId, teacherId));
|
|
|
- if (pianoRoomTime == null) {
|
|
|
- throw new BizException("未查到剩余时长");
|
|
|
- }
|
|
|
- Integer frozenTime = pianoRoomTime.getFrozenTime();//冻结时长
|
|
|
- Integer remainTime = pianoRoomTime.getRemainTime();//剩余时长
|
|
|
+ //更新老师琴房时长账户
|
|
|
+ DistributedLock.of(redissonClient)
|
|
|
+ .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_PIANO_ROOM_ACCOUNT.getRedisKey(teacherId)
|
|
|
+ , (o) -> {
|
|
|
+ PianoRoomTime pianoRoomTime = pianoRoomTimeDao.selectOne(Wrappers.<PianoRoomTime>lambdaQuery().eq(PianoRoomTime::getTeacherId, teacherId));
|
|
|
+ if (pianoRoomTime == null) {
|
|
|
+ throw new BizException("未查到剩余时长");
|
|
|
+ }
|
|
|
+ Integer frozenTime = pianoRoomTime.getFrozenTime();//冻结时长
|
|
|
+ Integer remainTime = pianoRoomTime.getRemainTime();//剩余时长
|
|
|
|
|
|
- String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
|
|
|
- Integer after = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentIds.size() + 1));//变更后
|
|
|
- Integer before = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(paymentList.size() + 1));//变更前
|
|
|
- if (after == null || before == null) {
|
|
|
- throw new BizException("公式转换失败");
|
|
|
- }
|
|
|
- int diffTime = singleCourseTime * (after - before);//人数变更后单课耗时
|
|
|
- if (remainTime - diffTime < 0) {
|
|
|
- throw new BizException("剩余时长不足");
|
|
|
- }
|
|
|
- pianoRoomTimeDao.update(null, Wrappers.<PianoRoomTime>lambdaUpdate()
|
|
|
- .eq(PianoRoomTime::getTeacherId, teacherId)
|
|
|
- .set(PianoRoomTime::getRemainTime, remainTime - diffTime)
|
|
|
- .set(PianoRoomTime::getFrozenTime, frozenTime + diffTime));
|
|
|
+ String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
|
|
|
+ Integer after = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentIds.size() + 1));//变更后
|
|
|
+ Integer before = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(paymentList.size() + 1));//变更前
|
|
|
+ if (after == null || before == null) {
|
|
|
+ throw new BizException("公式转换失败");
|
|
|
+ }
|
|
|
+ int diffTime = singleCourseTime * (after - before);//人数变更后单课耗时
|
|
|
+ if (remainTime - diffTime < 0) {
|
|
|
+ throw new BizException("剩余时长不足");
|
|
|
+ }
|
|
|
+ pianoRoomTimeDao.update(null, Wrappers.<PianoRoomTime>lambdaUpdate()
|
|
|
+ .eq(PianoRoomTime::getTeacherId, teacherId)
|
|
|
+ .set(PianoRoomTime::getRemainTime, remainTime - diffTime)
|
|
|
+ .set(PianoRoomTime::getFrozenTime, frozenTime + diffTime));
|
|
|
+ return null;
|
|
|
+ }, null, 10l);
|
|
|
|
|
|
//删除原学员
|
|
|
paymentDao.delete(Wrappers.<CourseScheduleStudentPayment>lambdaQuery().eq(CourseScheduleStudentPayment::getCourseId, courseId));
|