package cc.mrbird.febs.mall.service.impl;
|
|
import cc.mrbird.febs.common.entity.FebsResponse;
|
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
|
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
|
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeNewEnum;
|
import cc.mrbird.febs.common.exception.FebsException;
|
import cc.mrbird.febs.common.utils.*;
|
import cc.mrbird.febs.mall.conversion.CjInfoConversion;
|
import cc.mrbird.febs.mall.conversion.TzInfoConversion;
|
import cc.mrbird.febs.mall.dto.ApiCreateDto;
|
import cc.mrbird.febs.mall.dto.ApiCreateItemDto;
|
import cc.mrbird.febs.mall.dto.KjRecordDto;
|
import cc.mrbird.febs.mall.dto.OpenPrice;
|
import cc.mrbird.febs.mall.entity.*;
|
import cc.mrbird.febs.mall.mapper.*;
|
import cc.mrbird.febs.mall.service.CJService;
|
import cc.mrbird.febs.mall.service.IApiMallMemberService;
|
import cc.mrbird.febs.mall.vo.ApiKjInfoVo;
|
import cc.mrbird.febs.mall.vo.ApiKjRecordVo;
|
import cc.mrbird.febs.mall.vo.ApiTzInfoVo;
|
import cc.mrbird.febs.mall.vo.ApiTzListVo;
|
import cc.mrbird.febs.rabbit.producter.AgentProducer;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.RandomUtil;
|
import cn.hutool.core.util.StrUtil;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.text.ParseException;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class CJServiceImpl extends ServiceImpl<CjInfoMapper, CjInfo> implements CJService {
|
|
private final KjRecordMapper kjRecordMapper;
|
private final RedisUtils redisUtils;
|
private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
|
private final AgentProducer agentProducer;
|
private final TzInfoMapper tzInfoMapper;
|
private final MallMemberWalletMapper mallMemberWalletMapper;
|
private final CjInfoMapper cjInfoMapper;
|
private final CjItemMapper cjItemMapper;
|
private final IApiMallMemberService mallMemberService;
|
|
@Override
|
public FebsResponse kjRecord(KjRecordDto kjRecordDto) {
|
IPage<ApiKjRecordVo> page = new Page<>(kjRecordDto.getPageNum(), kjRecordDto.getPageSize());
|
IPage<ApiKjRecordVo> pages = kjRecordMapper.selectListInPage(page, kjRecordDto);
|
return new FebsResponse().success().data(pages);
|
}
|
|
@Override
|
public void createKjRecord() {
|
KjRecord kjRecord = new KjRecord();
|
String kjNo = MallUtils.getOrderNum();
|
kjRecord.setKjNo(kjNo);
|
kjRecordMapper.insert(kjRecord);
|
/**
|
* redis中设置下一期的开奖编号和开奖时间
|
*/
|
//开奖编号
|
String recordNoExit = redisUtils.getString(AppContants.KJ_RECORD_NO);
|
if (StrUtil.isNotBlank(recordNoExit)) {
|
redisUtils.del(AppContants.KJ_RECORD_NO);
|
}
|
redisUtils.set(AppContants.KJ_RECORD_NO, kjNo, 600);
|
//开奖时间
|
if (StrUtil.isNotBlank(redisUtils.getString(AppContants.KJ_RECORD_TIME))) {
|
redisUtils.del(AppContants.KJ_RECORD_TIME);
|
}
|
redisUtils.set(AppContants.KJ_RECORD_TIME, kjRecord.getCreatedTime(), 600);
|
|
agentProducer.sendChouJiangDelayMsg(kjNo, 10 * 60 * 1000L);
|
agentProducer.sendNoTimeDelayMsg(kjNo, 95 * 6 * 1000L);//提前三十秒停止下注
|
|
}
|
|
@Override
|
public FebsResponse kjInfo() {
|
ApiKjInfoVo apiKjInfoVo = new ApiKjInfoVo();
|
String kjNoOld = redisUtils.getString(AppContants.KJ_RECORD_NO_OLD);
|
String kjNumOld = redisUtils.getString(AppContants.KJ_RECORD_NUM_OLD);
|
if(StrUtil.isBlank(kjNoOld)){
|
KjRecord kjRecordOld = kjRecordMapper.selectOneByLimitZero(1,1);
|
if(ObjectUtil.isNotEmpty(kjRecordOld)){
|
apiKjInfoVo.setKjNoOld(kjRecordOld.getKjNo());
|
apiKjInfoVo.setKjNumOld(kjRecordOld.getKjNum());
|
}
|
}else{
|
apiKjInfoVo.setKjNoOld(kjNoOld);
|
apiKjInfoVo.setKjNumOld(kjNumOld);
|
}
|
|
String kjNo = redisUtils.getString(AppContants.KJ_RECORD_NO);
|
String createdTime = redisUtils.getString(AppContants.KJ_RECORD_TIME);
|
if(StrUtil.isBlank(kjNo)){
|
KjRecord kjRecord = kjRecordMapper.selectOneByLimitZero(0,1);
|
if(ObjectUtil.isNotEmpty(kjRecord)){
|
apiKjInfoVo.setKjNo(kjRecord.getKjNo());
|
apiKjInfoVo.setCreatedTime(kjRecord.getCreatedTime().toString());
|
}
|
}else{
|
apiKjInfoVo.setKjNo(kjNo);
|
try {
|
apiKjInfoVo.setCreatedTime(DateUtil.formatCstTime(createdTime, DateUtil.FULL_TIME_SPLIT_PATTERN));
|
} catch (ParseException e) {
|
e.printStackTrace();
|
}
|
}
|
|
DataDictionaryCustom timeIntervalDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.TIME_INTERVAL.getType(),
|
DataDictionaryEnum.TIME_INTERVAL.getCode()
|
);
|
apiKjInfoVo.setDjs(Integer.parseInt(timeIntervalDic.getValue()));
|
return new FebsResponse().success().data(apiKjInfoVo);
|
}
|
|
@Override
|
public void getChouJiangDelayMsg(String kjNo) {
|
//开启下注
|
DataDictionaryCustom noTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.NO_TIME.getType(),
|
DataDictionaryEnum.NO_TIME.getCode()
|
);
|
noTimeDic.setValue("1");
|
dataDictionaryCustomMapper.updateById(noTimeDic);
|
//开奖
|
KjRecord kjRecord = kjRecordMapper.selectKjNo(kjNo);
|
if(ObjectUtil.isEmpty(kjRecord)){
|
return;
|
}
|
int randomInt = RandomUtil.randomInt(1, 25);
|
kjRecord.setKjNum( String.valueOf(randomInt));
|
kjRecordMapper.updateById(kjRecord);
|
|
//开奖编号
|
String recordNoExit = redisUtils.getString(AppContants.KJ_RECORD_NO_OLD);
|
if (StrUtil.isNotBlank(recordNoExit)) {
|
redisUtils.del(AppContants.KJ_RECORD_NO_OLD);
|
}
|
redisUtils.set(AppContants.KJ_RECORD_NO_OLD, kjNo, 600);
|
|
//开奖号码
|
if (StrUtil.isNotBlank(redisUtils.getString(AppContants.KJ_RECORD_NUM_OLD))) {
|
redisUtils.del(AppContants.KJ_RECORD_NUM_OLD);
|
}
|
redisUtils.set(AppContants.KJ_RECORD_NUM_OLD, randomInt, 600);
|
OpenPrice openPrice = new OpenPrice();
|
openPrice.setKjNo(kjNo);
|
openPrice.setKjNum(String.valueOf(randomInt));
|
agentProducer.sendOpenPriceMsg(openPrice);
|
|
}
|
|
@Override
|
public FebsResponse tzInfo() {
|
ArrayList<ApiTzInfoVo> objects = new ArrayList<>();
|
|
List<TzInfo> tzInfos = tzInfoMapper.selectList(null);
|
if(CollUtil.isNotEmpty(tzInfos)){
|
for(TzInfo tzInfo : tzInfos){
|
ApiTzInfoVo apiTzInfoVo = TzInfoConversion.INSTANCE.entityToVo(tzInfo);
|
objects.add(apiTzInfoVo);
|
}
|
}
|
return new FebsResponse().success().data(objects);
|
}
|
|
@Override
|
@Transactional
|
public FebsResponse create(ApiCreateDto apiCreateDto) {
|
// Long memberId = LoginUserUtil.getLoginUser().getId();
|
Long memberId = 1L;
|
//开启下注
|
DataDictionaryCustom noTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.NO_TIME.getType(),
|
DataDictionaryEnum.NO_TIME.getCode()
|
);
|
if(noTimeDic.getValue().equals(2)){
|
throw new FebsException("请等待下一期");
|
}
|
|
List<ApiCreateItemDto> items = apiCreateDto.getItems();
|
if(CollUtil.isEmpty(items)){
|
throw new FebsException("参数有误,请刷新页面");
|
}
|
MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId);
|
BigDecimal totalAmount = BigDecimal.ZERO;
|
for(ApiCreateItemDto apiCreateItemDto : items){
|
BigDecimal tzAmount = apiCreateItemDto.getTzAmount().setScale(2,BigDecimal.ROUND_DOWN);//投注金额
|
if(BigDecimal.ZERO.compareTo(tzAmount) >= 0){
|
throw new FebsException("金额必须大于0");
|
}
|
totalAmount = totalAmount.add(tzAmount);
|
}
|
if(mallMemberWallet.getBalance().compareTo(totalAmount) < 0){
|
throw new FebsException("余额不足");
|
}
|
//新增一条投注主表记录
|
CjInfo cjInfo = new CjInfo();
|
cjInfo.setMemberId(memberId);
|
String kjNo = redisUtils.getString(AppContants.KJ_RECORD_NO);
|
cjInfo.setKjNo(kjNo);
|
cjInfo.setKjState(1);
|
cjInfo.setZjState(1);
|
cjInfo.setPerkAmount(BigDecimal.ZERO);
|
cjInfo.setTotalAmount(totalAmount);
|
cjInfoMapper.insert(cjInfo);
|
|
for(ApiCreateItemDto apiCreateItemDto : items){
|
Long id = apiCreateItemDto.getId();//投注ID
|
TzInfo tzInfo = tzInfoMapper.selectById(id);
|
if(ObjectUtil.isEmpty(tzInfo)){
|
throw new FebsException("参数有误,请刷新页面");
|
}
|
BigDecimal tzAmount = apiCreateItemDto.getTzAmount().setScale(2,BigDecimal.ROUND_DOWN);//投注金额
|
totalAmount = totalAmount.add(tzAmount);
|
|
CjItem cjItem = new CjItem();
|
cjItem.setInfoId(cjInfo.getId());
|
cjItem.setMemberId(memberId);
|
cjItem.setTzId(id);
|
cjItem.setType(tzInfo.getType());
|
cjItem.setAmount(tzAmount);
|
cjItem.setItemNum(tzInfo.getTzCode());
|
cjItem.setPerkAmount(BigDecimal.ZERO);
|
cjItemMapper.insert(cjItem);
|
}
|
|
String orderNo = MallUtils.getOrderNum("T");
|
mallMemberService.addMoneyFlow(
|
memberId,
|
totalAmount,
|
MoneyFlowTypeNewEnum.STATIC_BONUS.getValue(),
|
orderNo,
|
MoneyFlowTypeNewEnum.STATIC_BONUS.getDescription(),
|
null,
|
cjInfo.getId(),
|
2,
|
FlowTypeEnum.BALANCE.getValue());
|
|
return new FebsResponse().success().message("操作成功");
|
}
|
|
@Override
|
public FebsResponse tzInfoList(KjRecordDto kjRecordDto) {
|
// Long memberId = LoginUserUtil.getLoginUser().getId();
|
Long memberId = 1L;
|
kjRecordDto.setMemberId(memberId);
|
IPage<CjInfo> page = new Page<>(kjRecordDto.getPageNum(), kjRecordDto.getPageSize());
|
IPage<CjInfo> pages = cjInfoMapper.selectTzListByMemberId(page, kjRecordDto);
|
List<CjInfo> records = pages.getRecords();
|
List<ApiTzListVo> apiTzListVos = CjInfoConversion.INSTANCE.entitysToVos(records);
|
return new FebsResponse().success().data(apiTzListVos);
|
}
|
|
@Override
|
public void getNoTimeDelayMsg(String kjNo) {
|
DataDictionaryCustom noTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.NO_TIME.getType(),
|
DataDictionaryEnum.NO_TIME.getCode()
|
);
|
noTimeDic.setValue("2");
|
dataDictionaryCustomMapper.updateById(noTimeDic);
|
}
|
|
@Override
|
public void getOpenPriceMsg(String kjNo, String kjNum) {
|
|
}
|
|
}
|