package com.ks.vip.service.remote;
|
|
import com.ks.vip.dao.UserLijinRecordDao;
|
import com.ks.vip.exception.LijinBalanceException;
|
import com.ks.vip.mapper.LijinBalanceMapper;
|
import com.ks.vip.pojo.DO.LijinBalance;
|
import com.ks.vip.pojo.DO.UserLijinRecord;
|
import com.ks.vip.service.LijinBalanceService;
|
import org.apache.dubbo.config.annotation.Service;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.yeshi.utils.TimeUtil;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.UUID;
|
|
@Service(version = "1.0")
|
public class LijinBalanceServiceImpl implements LijinBalanceService {
|
|
Logger logger = LoggerFactory.getLogger(LijinBalanceService.class);
|
|
@Resource
|
private LijinBalanceMapper lijinBalanceMapper;
|
|
@Resource
|
private UserLijinRecordDao userLijinRecordDao;
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void init(String uid) {
|
LijinBalance balance = lijinBalanceMapper.selectByPrimaryKeyForUpdate(uid);
|
if (balance != null) {
|
return;
|
}
|
balance = new LijinBalance();
|
balance.setBalance(new BigDecimal(0));
|
balance.setCreateTime(new Date());
|
balance.setId(uid);
|
lijinBalanceMapper.insertSelective(balance);
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public BigDecimal getBalance(String uid) {
|
LijinBalance balance = lijinBalanceMapper.selectByPrimaryKey(uid);
|
if (balance == null) {
|
return null;
|
}
|
return balance.getBalance();
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public void addLijin(String uid, BigDecimal money, String title, String category, String identifyCode) throws LijinBalanceException {
|
//添加记录
|
LijinBalance lijinBalance = lijinBalanceMapper.selectByPrimaryKeyForUpdate(uid);
|
if (lijinBalance == null) {
|
throw new LijinBalanceException(LijinBalanceException.CODE_NOT_INIT, "余额未初始化");
|
}
|
//增加余额
|
LijinBalance update = new LijinBalance();
|
update.setId(uid);
|
update.setBalance(lijinBalance.getBalance().add(money));
|
update.setUpdateTime(new Date());
|
lijinBalanceMapper.updateByPrimaryKeySelective(update);
|
//增加记录
|
UserLijinRecord record = new UserLijinRecord();
|
record.setMoney(money);
|
record.setId(uid + "-" + UUID.randomUUID().toString());
|
record.setTitle(title);
|
record.setType(UserLijinRecord.TYPE_ADD);
|
record.setUid(uid);
|
record.setCategory(category);
|
record.setCreateTime(new Date());
|
record.setIdentifyCode(identifyCode);
|
userLijinRecordDao.save(record);
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public void consumeLijin(String uid, BigDecimal money, String title, String category, String identifyCode) throws LijinBalanceException {
|
logger.info("开始扣除礼金");
|
//添加记录
|
LijinBalance lijinBalance = lijinBalanceMapper.selectByPrimaryKeyForUpdate(uid);
|
logger.info("用户礼金锁定成功");
|
if (lijinBalance == null) {
|
throw new LijinBalanceException(LijinBalanceException.CODE_NOT_INIT, "余额未初始化");
|
}
|
if (lijinBalance.getBalance().compareTo(money) < 0) {
|
throw new LijinBalanceException(LijinBalanceException.CODE_BALANCE_NOT_ENOUGH, "礼金余额不足");
|
}
|
|
|
//增加余额
|
LijinBalance update = new LijinBalance();
|
update.setId(uid);
|
update.setBalance(lijinBalance.getBalance().subtract(money));
|
update.setUpdateTime(new Date());
|
lijinBalanceMapper.updateByPrimaryKeySelective(update);
|
logger.info("减余额成功");
|
//增加记录
|
UserLijinRecord record = new UserLijinRecord();
|
record.setMoney(money);
|
record.setId(uid + "-" + UUID.randomUUID().toString());
|
record.setTitle(title);
|
record.setType(UserLijinRecord.TYPE_CONSUME);
|
record.setUid(uid);
|
record.setCategory(category);
|
record.setCreateTime(new Date());
|
record.setIdentifyCode(identifyCode);
|
userLijinRecordDao.save(record);
|
logger.info("增加记录成功");
|
}
|
|
@Override
|
public BigDecimal getUsingLijin(String uid) {
|
UserLijinRecordDao.DaoQuery daoQuery = new UserLijinRecordDao.DaoQuery();
|
daoQuery.uid = uid;
|
daoQuery.type = UserLijinRecord.TYPE_CONSUME;
|
daoQuery.category = UserLijinRecord.Category.createGoodsLijin.name();
|
daoQuery.count = 100;
|
daoQuery.maxCreateTime = new Date();
|
daoQuery.minCreateTime = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(daoQuery.maxCreateTime.getTime(), "yyyyMMdd"), "yyyyMMdd"));
|
List<UserLijinRecord> list = userLijinRecordDao.list(daoQuery);
|
BigDecimal using = new BigDecimal(0);
|
if (list != null) {
|
for (UserLijinRecord record : list) {
|
using = using.add(record.getMoney());
|
}
|
}
|
return using;
|
}
|
}
|