package com.punchsettle.server.service.manager.impl; import com.punchsettle.server.atomic.entity.LotteryScratchRecord; import com.punchsettle.server.atomic.entity.User; import com.punchsettle.server.atomic.service.ILotteryScratchRecordService; import com.punchsettle.server.atomic.service.IUserService; import com.punchsettle.server.common.exception.BusinessException; import com.punchsettle.server.constant.ScratchActionTypeEnum; import com.punchsettle.server.dto.scratch.ScratchDto; import com.punchsettle.server.dto.scratch.ScratchQuery; import com.punchsettle.server.service.manager.IScratchManager; import com.punchsettle.server.utiis.UserUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.util.List; import java.util.Objects; import java.util.Optional; /** * @author tyuio * @version 1.0.0 * @description TODO * @date 2024/12/13 16:25 */ @Service public class ScratchManagerImpl implements IScratchManager { @Autowired private IUserService userService; @Autowired private ILotteryScratchRecordService scratchRecordService; @Override @Transactional(rollbackFor = Exception.class) public void addScratchRecord(ScratchDto dto) { if (ScratchActionTypeEnum.REVOKE_WIN.equals(dto.getActionType()) || ScratchActionTypeEnum.REVOKE_INVEST.equals(dto.getActionType())) { BusinessException.throwFail("传入了错误的记录动作类型"); } Long currentUserId = UserUtils.getCurrentUserId(); User user = Optional.ofNullable(userService.getById(currentUserId)).orElseThrow(() -> BusinessException.fail("无法获取当前用户信息")); User updateUser = new User(); updateUser.setId(user.getId()); if (ScratchActionTypeEnum.INVEST.equals(dto.getActionType())) { updateUser.setLotteryInvestAmount(user.getLotteryInvestAmount().add(dto.getAmount())); } if (ScratchActionTypeEnum.WIN.equals(dto.getActionType())) { updateUser.setLotteryWinAmount(user.getLotteryWinAmount().add(dto.getAmount())); } userService.updateById(updateUser); LotteryScratchRecord scratchRecord = new LotteryScratchRecord(); BeanUtils.copyProperties(dto, scratchRecord); scratchRecord.setId(null); scratchRecord.setUserId(user.getId()); scratchRecordService.insert(scratchRecord); } @Override @Transactional(rollbackFor = Exception.class) public void revokeScratchRecord(ScratchDto dto) { if (ScratchActionTypeEnum.WIN.equals(dto.getActionType()) || ScratchActionTypeEnum.INVEST.equals(dto.getActionType())) { BusinessException.throwFail("传入了错误的记录动作类型"); } // 获取当前用户信息 Long currentUserId = UserUtils.getCurrentUserId(); User user = Optional.ofNullable(userService.getById(currentUserId)).orElseThrow(() -> BusinessException.fail("无法获取当前用户信息")); // 获取待撤销的刮刮乐记录 LotteryScratchRecord scratchRecord = Optional.ofNullable(scratchRecordService.selectById(dto.getId())).orElseThrow(() -> BusinessException.fail("无法获取刮刮乐记录")); // 待更新的用户信息 User updateUser = new User(); updateUser.setId(user.getId()); // 待更新的刮刮乐记录 LotteryScratchRecord updateScratchRecord = new LotteryScratchRecord(); updateScratchRecord.setId(scratchRecord.getId()); // 撤销投入 if (ScratchActionTypeEnum.INVEST.equals(scratchRecord.getActionType())) { if (scratchRecord.getAmount().compareTo(user.getLotteryInvestAmount()) > 0) { BusinessException.throwFail("撤销投入金额异常,用户已投入金额小于待撤销金额"); } updateScratchRecord.setActionType(ScratchActionTypeEnum.REVOKE_INVEST); updateUser.setLotteryInvestAmount(user.getLotteryInvestAmount().subtract(scratchRecord.getAmount())); } // 撤销中奖 if (ScratchActionTypeEnum.WIN.equals(scratchRecord.getActionType())) { if (scratchRecord.getAmount().compareTo(user.getLotteryWinAmount()) > 0) { BusinessException.throwFail("撤销中奖金额异常,用户已中奖金额小于待撤销金额"); } updateScratchRecord.setActionType(ScratchActionTypeEnum.REVOKE_WIN); updateUser.setLotteryWinAmount(user.getLotteryWinAmount().subtract(scratchRecord.getAmount())); } // 更新用户 userService.updateById(updateUser); // 更新刮刮乐记录 scratchRecordService.update(updateScratchRecord); } @Override public List queryScratchRecord(ScratchQuery query) { if (Objects.isNull(query) || !StringUtils.hasText(query.getStartDate()) || !StringUtils.hasText(query.getEndDate())) { BusinessException.throwFail("请选择待查询的时间范围"); } query.setStartDate(String.format("%s 00:00:00.000", query.getStartDate())); query.setEndDate(String.format("%s 23:59:59.999", query.getEndDate())); // 获取当前用户信息 Long currentUserId = UserUtils.getCurrentUserId(); User user = Optional.ofNullable(userService.getById(currentUserId)).orElseThrow(() -> BusinessException.fail("无法获取当前用户信息")); query.setUserId(user.getId()); List scratchRecords = scratchRecordService.listByCondition(query); if (CollectionUtils.isEmpty(scratchRecords)) { return List.of(); } return scratchRecords.stream().map(record -> { ScratchDto dto = new ScratchDto(); BeanUtils.copyProperties(record, dto); return dto; }).toList(); } }