|
|
@@ -0,0 +1,313 @@
|
|
|
+package org.dromara.physical.service.impl;
|
|
|
+
|
|
|
+import cn.idev.excel.EasyExcel;
|
|
|
+import cn.idev.excel.context.AnalysisContext;
|
|
|
+import cn.idev.excel.event.AnalysisEventListener;
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
+import org.dromara.business.utils.BlindLevelsValidatorUtils;
|
|
|
+import org.dromara.common.core.domain.R;
|
|
|
+import org.dromara.common.core.service.UserService;
|
|
|
+import org.dromara.common.core.utils.MapstructUtils;
|
|
|
+import org.dromara.common.core.utils.StringUtils;
|
|
|
+import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
+import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.dromara.common.satoken.utils.LoginHelper;
|
|
|
+import org.dromara.physical.domain.PhysicalBlindStructures;
|
|
|
+import org.dromara.physical.domain.bo.PhysicalBlindLevelsBo;
|
|
|
+import org.dromara.physical.domain.bo.PhysicalBlindStructuresBo;
|
|
|
+import org.dromara.physical.domain.vo.PhysicalBlindLevelsImportVo;
|
|
|
+import org.dromara.physical.domain.vo.PhysicalBlindLevelsVo;
|
|
|
+import org.dromara.physical.domain.vo.PhysicalBlindStructuresVo;
|
|
|
+import org.dromara.physical.mapper.PhysicalBlindLevelsMapper;
|
|
|
+import org.dromara.physical.mapper.PhysicalBlindStructuresMapper;
|
|
|
+import org.dromara.physical.service.IPhysicalBlindStructuresService;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Collection;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 线下盲注等级主名Service业务层处理
|
|
|
+ *
|
|
|
+ * @author Lion Li
|
|
|
+ * @date 2025-11-19
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+public class PhysicalBlindStructuresServiceImpl implements IPhysicalBlindStructuresService {
|
|
|
+
|
|
|
+ private final PhysicalBlindStructuresMapper baseMapper;
|
|
|
+
|
|
|
+ private final PhysicalBlindLevelsServiceImpl physicalBlindLevelsService;
|
|
|
+
|
|
|
+ private final PhysicalBlindLevelsMapper physicalBlindLevelsMapper;
|
|
|
+
|
|
|
+ private final UserService userService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询线下盲注等级主名
|
|
|
+ *
|
|
|
+ * @param id 主键
|
|
|
+ * @return 线下盲注等级主名
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public PhysicalBlindStructuresVo queryById(Long id){
|
|
|
+ return baseMapper.selectPhysicalBlindStructureById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分页查询线下盲注等级主名列表
|
|
|
+ *
|
|
|
+ * @param bo 查询条件
|
|
|
+ * @param pageQuery 分页参数
|
|
|
+ * @return 线下盲注等级主名分页列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<PhysicalBlindStructuresVo> queryPageList(PhysicalBlindStructuresBo bo, PageQuery pageQuery) {
|
|
|
+ LambdaQueryWrapper<PhysicalBlindStructures> lqw = buildQueryWrapper(bo);
|
|
|
+ Page<PhysicalBlindStructuresVo> result = baseMapper.selectPhysicalBlindStructureAllPage(pageQuery.build(), lqw);
|
|
|
+ for (PhysicalBlindStructuresVo record : result.getRecords()) {
|
|
|
+ PhysicalBlindLevelsBo blindLevelsBo=new PhysicalBlindLevelsBo();
|
|
|
+ blindLevelsBo.setBlindStructureId(record.getId());
|
|
|
+ record.setBlindLevels(physicalBlindLevelsService.queryList(blindLevelsBo));
|
|
|
+ if(record.getCreateUserId()!=null){
|
|
|
+ String createName = userService.selectUserNameById(record.getCreateUserId());
|
|
|
+ record.setCreateName(createName);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return TableDataInfo.build(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询符合条件的线下盲注等级主名列表
|
|
|
+ *
|
|
|
+ * @param bo 查询条件
|
|
|
+ * @return 线下盲注等级主名列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<PhysicalBlindStructuresVo> queryList(PhysicalBlindStructuresBo bo) {
|
|
|
+ LambdaQueryWrapper<PhysicalBlindStructures> lqw = buildQueryWrapper(bo);
|
|
|
+ List<PhysicalBlindStructuresVo> blindStructuresVoList = baseMapper.selectPhysicalBlindStructureList(lqw);
|
|
|
+
|
|
|
+ for (PhysicalBlindStructuresVo blindStructuresVo : blindStructuresVoList) {
|
|
|
+ if(blindStructuresVo.getCreateUserId()!=null){
|
|
|
+ String createName = userService.selectUserNameById(blindStructuresVo.getCreateUserId());
|
|
|
+ blindStructuresVo.setCreateName(createName);
|
|
|
+ PhysicalBlindLevelsBo blindLevelsBo=new PhysicalBlindLevelsBo();
|
|
|
+ blindLevelsBo.setBlindStructureId(blindStructuresVo.getId());
|
|
|
+ List<PhysicalBlindLevelsVo> blindLevelsVos = physicalBlindLevelsService.queryList(blindLevelsBo);
|
|
|
+ if(blindLevelsVos.size()>0){
|
|
|
+ Long smallBlind = blindLevelsVos.get(0).getSmallBlind();
|
|
|
+ Long bigBlind = blindLevelsVos.get(0).getBigBlind();
|
|
|
+ Long ante = blindLevelsVos.get(0).getAnte();
|
|
|
+ String parseBlindsInfo = smallBlind+"/"+bigBlind+" "+ante;
|
|
|
+ blindStructuresVo.setParseBlindsInfo(parseBlindsInfo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return blindStructuresVoList;
|
|
|
+ }
|
|
|
+
|
|
|
+ private LambdaQueryWrapper<PhysicalBlindStructures> buildQueryWrapper(PhysicalBlindStructuresBo bo) {
|
|
|
+ Map<String, Object> params = bo.getParams();
|
|
|
+ LambdaQueryWrapper<PhysicalBlindStructures> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.orderByAsc(PhysicalBlindStructures::getId);
|
|
|
+ lqw.like(StringUtils.isNotBlank(bo.getName()), PhysicalBlindStructures::getName, bo.getName());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getDescription()), PhysicalBlindStructures::getDescription, bo.getDescription());
|
|
|
+ lqw.eq(bo.getCreatedAt() != null, PhysicalBlindStructures::getCreatedAt, bo.getCreatedAt());
|
|
|
+ lqw.eq(bo.getUpdatedAt() != null, PhysicalBlindStructures::getUpdatedAt, bo.getUpdatedAt());
|
|
|
+ lqw.eq(bo.getCreateUserId() != null, PhysicalBlindStructures::getCreateUserId, bo.getCreateUserId());
|
|
|
+ lqw.eq(bo.getUpdateUserId() != null, PhysicalBlindStructures::getUpdateUserId, bo.getUpdateUserId());
|
|
|
+ return lqw;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增线下盲注等级主名
|
|
|
+ *
|
|
|
+ * @param bo 线下盲注等级主名
|
|
|
+ * @return 是否新增成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public R<Boolean> insertByBo(PhysicalBlindStructuresBo bo, MultipartFile file) {
|
|
|
+ PhysicalBlindStructures add = MapstructUtils.convert(bo, PhysicalBlindStructures.class);
|
|
|
+ validEntityBeforeSave(add);
|
|
|
+
|
|
|
+ // 2. 解析 Excel 文件
|
|
|
+ List<PhysicalBlindLevelsImportVo> dataList;
|
|
|
+ try (InputStream inputStream = file.getInputStream()) {
|
|
|
+ dataList = parseExcel(inputStream);
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error("读取文件失败", e);
|
|
|
+ return R.fail("读取文件失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(dataList)) {
|
|
|
+ return R.fail("导入数据为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 校验数据逻辑(可选)
|
|
|
+ BlindLevelsValidatorUtils.ValidationResult validationResult = BlindLevelsValidatorUtils.validateBlindLevelsPhysical(dataList);
|
|
|
+ if (validationResult.isValid()) {
|
|
|
+ System.out.println("数据校验通过");
|
|
|
+ } else {
|
|
|
+ return R.fail(validationResult.getErrorMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ Long userId = LoginHelper.getUserId();
|
|
|
+ add.setCreateUserId(userId);
|
|
|
+ boolean flag = baseMapper.insertPhysicalBlindStructure(add) > 0;
|
|
|
+ if (!flag) {
|
|
|
+ return R.fail("插入主表失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ bo.setId(add.getId());
|
|
|
+ // 5. 插入子表数据
|
|
|
+ for (PhysicalBlindLevelsImportVo vo : dataList) {
|
|
|
+ PhysicalBlindLevelsBo levelBo = new PhysicalBlindLevelsBo();
|
|
|
+ levelBo.setBlindStructureId(add.getId());
|
|
|
+ levelBo.setLevelNumber(vo.getLevelNumber());
|
|
|
+ levelBo.setSmallBlind(vo.getSmallBlind());
|
|
|
+ levelBo.setBigBlind(vo.getBigBlind());
|
|
|
+ levelBo.setAnte(vo.getAnte());
|
|
|
+ levelBo.setDurationMinutes(vo.getDurationMinutes());
|
|
|
+ levelBo.setCreateUserId(userId);
|
|
|
+ levelBo.setDisplayOrder(vo.getDisplayOrder());
|
|
|
+ levelBo.setIsBreak(vo.getIsBreak());
|
|
|
+ levelBo.setBreakDurationMinutes(vo.getBreakDurationMinutes());
|
|
|
+ physicalBlindLevelsService.insertByBo(levelBo);
|
|
|
+ }
|
|
|
+
|
|
|
+ return R.ok(true); // 成功返回
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改线下盲注等级主名
|
|
|
+ *
|
|
|
+ * @param bo 线下盲注等级主名
|
|
|
+ * @return 是否修改成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public R<Boolean> updateByBo(PhysicalBlindStructuresBo bo, MultipartFile file) {
|
|
|
+ //todo 1. 检查是否正在使用中
|
|
|
+
|
|
|
+ PhysicalBlindStructures update = MapstructUtils.convert(bo, PhysicalBlindStructures.class);
|
|
|
+ validEntityBeforeSave(update);
|
|
|
+
|
|
|
+ Long userId = LoginHelper.getUserId();
|
|
|
+ update.setUpdateUserId(userId);
|
|
|
+ log.info("准备更新盲注结构,用户ID: {}", userId);
|
|
|
+
|
|
|
+ // 3. 解析 Excel 文件
|
|
|
+ List<PhysicalBlindLevelsImportVo> dataList = List.of();
|
|
|
+ if (file != null) {
|
|
|
+ log.info("开始解析上传的Excel文件");
|
|
|
+ try (InputStream inputStream = file.getInputStream()) {
|
|
|
+ dataList = parseExcel(inputStream);
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error("读取文件失败", e);
|
|
|
+ return R.fail("读取文件失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(dataList)) {
|
|
|
+ log.warn("导入数据为空");
|
|
|
+ return R.fail("导入数据为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 校验数据逻辑(可选)
|
|
|
+ BlindLevelsValidatorUtils.ValidationResult validationResult = BlindLevelsValidatorUtils.validateBlindLevelsPhysical(dataList);
|
|
|
+ if (validationResult.isValid()) {
|
|
|
+ log.info("数据校验通过,共{}条数据", dataList.size());
|
|
|
+ } else {
|
|
|
+ log.warn("数据校验失败: {}", validationResult.getErrorMessage());
|
|
|
+ return R.fail(validationResult.getErrorMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ int i = baseMapper.updatePhysicalBlindStructure(update);
|
|
|
+ if (i <= 0) {
|
|
|
+ log.error("更新主表失败");
|
|
|
+ return R.fail("更新失败");
|
|
|
+ }
|
|
|
+ log.info("主表更新成功");
|
|
|
+ // 6. 处理等级数据
|
|
|
+ if (file != null) {
|
|
|
+ log.info("开始处理等级数据,删除原有数据");
|
|
|
+ physicalBlindLevelsMapper.deletePhysicalBlindLevelByBlindStructureId(update.getId());
|
|
|
+
|
|
|
+ log.info("开始插入新等级数据,共{}条", dataList.size());
|
|
|
+ for (PhysicalBlindLevelsImportVo vo : dataList) {
|
|
|
+ PhysicalBlindLevelsBo levelBo = new PhysicalBlindLevelsBo();
|
|
|
+ levelBo.setBlindStructureId(update.getId());
|
|
|
+ levelBo.setLevelNumber(vo.getLevelNumber());
|
|
|
+ levelBo.setSmallBlind(vo.getSmallBlind());
|
|
|
+ levelBo.setBigBlind(vo.getBigBlind());
|
|
|
+ levelBo.setAnte(vo.getAnte());
|
|
|
+ levelBo.setDurationMinutes(vo.getDurationMinutes());
|
|
|
+ levelBo.setCreateUserId(userId);
|
|
|
+ physicalBlindLevelsService.insertByBo(levelBo);
|
|
|
+ }
|
|
|
+ log.info("等级数据处理完成");
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("盲注结构更新成功,ID: {}", bo.getId());
|
|
|
+ return R.ok(true); // 成功返回 true
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存前的数据校验
|
|
|
+ */
|
|
|
+ private void validEntityBeforeSave(PhysicalBlindStructures entity){
|
|
|
+ //TODO 做一些数据校验,如唯一约束
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验并批量删除线下盲注等级主名信息
|
|
|
+ *
|
|
|
+ * @param ids 待删除的主键集合
|
|
|
+ * @param isValid 是否进行有效性校验
|
|
|
+ * @return 是否删除成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
|
+ if(isValid){
|
|
|
+ //TODO 做一些业务上的校验,判断是否需要校验
|
|
|
+ }
|
|
|
+ //TODO已经在比赛中使用的盲注禁止删除和修改
|
|
|
+
|
|
|
+ return baseMapper.deletePhysicalBlindStructure(ids) > 0;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ // 解析 Excel 方法
|
|
|
+ private List<PhysicalBlindLevelsImportVo> parseExcel(InputStream inputStream) {
|
|
|
+ List<PhysicalBlindLevelsImportVo> list = new ArrayList<>();
|
|
|
+ EasyExcel.read(inputStream, PhysicalBlindLevelsImportVo.class, new AnalysisEventListener<PhysicalBlindLevelsImportVo>() {
|
|
|
+ @Override
|
|
|
+ public void invoke(PhysicalBlindLevelsImportVo data, AnalysisContext context) {
|
|
|
+ list.add(data);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void doAfterAllAnalysed(AnalysisContext context) {
|
|
|
+ // 解析完成
|
|
|
+ }
|
|
|
+ }).sheet().doRead();
|
|
|
+
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+}
|