|
@@ -1,7 +1,16 @@
|
|
|
package com.yonge.cooleshow.biz.dal.service.impl;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.yonge.cooleshow.biz.dal.entity.PianoRoomTime;
|
|
|
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
|
|
|
+import com.yonge.cooleshow.biz.dal.service.PianoRoomTimeService;
|
|
|
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
|
|
|
+import com.yonge.toolset.base.exception.BizException;
|
|
|
+import com.yonge.toolset.payment.util.DistributedLock;
|
|
|
+import org.redisson.api.RedissonClient;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
@@ -10,20 +19,61 @@ import com.yonge.cooleshow.biz.dal.vo.PianoRoomChangeRecordVo;
|
|
|
import com.yonge.cooleshow.biz.dal.dto.search.PianoRoomChangeRecordSearch;
|
|
|
import com.yonge.cooleshow.biz.dal.dao.PianoRoomChangeRecordDao;
|
|
|
import com.yonge.cooleshow.biz.dal.service.PianoRoomChangeRecordService;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.util.Date;
|
|
|
|
|
|
|
|
|
@Service
|
|
|
public class PianoRoomChangeRecordServiceImpl extends ServiceImpl<PianoRoomChangeRecordDao, PianoRoomChangeRecord> implements PianoRoomChangeRecordService {
|
|
|
private final static Logger log = LoggerFactory.getLogger(PianoRoomChangeRecordServiceImpl.class);
|
|
|
+ @Autowired
|
|
|
+ private RedissonClient redissonClient;
|
|
|
+ @Autowired
|
|
|
+ private PianoRoomTimeService pianoRoomTimeService;
|
|
|
|
|
|
- @Override
|
|
|
+ @Override
|
|
|
public PianoRoomChangeRecordVo detail(Long id) {
|
|
|
return baseMapper.detail(id);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
@Override
|
|
|
- public IPage<PianoRoomChangeRecordVo> selectPage(IPage<PianoRoomChangeRecordVo> page, PianoRoomChangeRecordSearch query){
|
|
|
+ public IPage<PianoRoomChangeRecordVo> selectPage(IPage<PianoRoomChangeRecordVo> page, PianoRoomChangeRecordSearch query) {
|
|
|
return page.setRecords(baseMapper.selectPage(page, query));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public boolean add(PianoRoomChangeRecord pianoRoomChangeRecord) {
|
|
|
+ //保存记录
|
|
|
+ save(pianoRoomChangeRecord);
|
|
|
+ //入琴房账户
|
|
|
+ DistributedLock.of(redissonClient)
|
|
|
+ .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_PIANO_ROOM_ACCOUNT.getRedisKey(pianoRoomChangeRecord.getUserId())
|
|
|
+ , (o) -> {
|
|
|
+ PianoRoomTime pianoRoomTime = pianoRoomTimeService.getOne(Wrappers.<PianoRoomTime>lambdaQuery()
|
|
|
+ .eq(PianoRoomTime::getTeacherId, pianoRoomChangeRecord.getUserId()));
|
|
|
+
|
|
|
+ if (null == pianoRoomTime) {
|
|
|
+ pianoRoomTime = new PianoRoomTime();
|
|
|
+ pianoRoomTime.setTeacherId(pianoRoomChangeRecord.getUserId());
|
|
|
+ pianoRoomTimeService.save(pianoRoomTime);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (InOrOutEnum.IN.equals(pianoRoomChangeRecord.getInOrOut())) {
|
|
|
+ pianoRoomTime.setRemainTime(pianoRoomTime.getRemainTime() + pianoRoomChangeRecord.getTimes());
|
|
|
+ } else {
|
|
|
+ pianoRoomTime.setRemainTime(pianoRoomTime.getRemainTime() - pianoRoomChangeRecord.getTimes());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pianoRoomTime.getRemainTime() < 0) {
|
|
|
+ throw new BizException("时长余额不足");
|
|
|
+ }
|
|
|
+ pianoRoomTime.setUpdateTime(new Date());
|
|
|
+ pianoRoomTimeService.updateById(pianoRoomTime);
|
|
|
+ return null;
|
|
|
+ }, null, 10l);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
}
|