refactor(puzzle): 优化拼图记录查询逻辑

- 移除 BigDecimal 导入并修改拼图数量统计方式
- 使用关联表查询替换直接的数量统计方法
- 更新拼图记录查询逻辑,通过关联表获取数据
- 添加对空值的过滤处理确保数据完整性
- 修改内容页面转换方法,支持免费状态判断
- 删除价格计算相关依赖和服务调用
- 添加 MemberPuzzleEntity 和 FreeStatus 常量支持
- 从关联记录读取免费状态替代价格计算逻辑
This commit is contained in:
2026-01-20 11:24:57 +08:00
parent 679f2d3a79
commit 42bf3d3d0a
2 changed files with 39 additions and 43 deletions

View File

@@ -33,7 +33,6 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@@ -62,8 +61,9 @@ public class AppPuzzleController {
if (faceId == null) {
return ApiResponse.fail("faceId不能为空");
}
int count = puzzleRepository.countRecordsByFaceId(faceId);
return ApiResponse.success(count);
// 通过关联表查询数量
List<MemberPuzzleEntity> relations = memberPuzzleMapper.listByFaceId(faceId);
return ApiResponse.success(relations.size());
}
/**
@@ -74,9 +74,17 @@ public class AppPuzzleController {
if (faceId == null) {
return ApiResponse.fail("faceId不能为空");
}
List<PuzzleGenerationRecordEntity> records = puzzleRepository.getRecordsByFaceId(faceId);
List<ContentPageVO> result = records.stream()
.map(this::convertToContentPageVO)
// 通过关联表查询,获取关联的拼图记录
List<MemberPuzzleEntity> relations = memberPuzzleMapper.listByFaceId(faceId);
List<ContentPageVO> result = relations.stream()
.map(relation -> {
PuzzleGenerationRecordEntity record = puzzleRepository.getRecordById(relation.getRecordId());
if (record == null) {
return null;
}
return convertToContentPageVO(record, relation);
})
.filter(vo -> vo != null)
.collect(Collectors.toList());
return ApiResponse.success(result);
}
@@ -93,7 +101,9 @@ public class AppPuzzleController {
if (record == null) {
return ApiResponse.fail("未找到对应的拼图记录");
}
ContentPageVO result = convertToContentPageVO(record);
// 查询关联记录
MemberPuzzleEntity relation = memberPuzzleMapper.getByFaceAndRecord(record.getFaceId(), recordId);
ContentPageVO result = convertToContentPageVO(record, relation);
return ApiResponse.success(result);
}
@@ -273,8 +283,11 @@ public class AppPuzzleController {
/**
* 将PuzzleGenerationRecordEntity转换为ContentPageVO
*
* @param record 拼图生成记录
* @param relation 会员拼图关联记录,用于获取免费状态
*/
private ContentPageVO convertToContentPageVO(PuzzleGenerationRecordEntity record) {
private ContentPageVO convertToContentPageVO(PuzzleGenerationRecordEntity record, MemberPuzzleEntity relation) {
ContentPageVO vo = new ContentPageVO();
// 内容类型为3(拼图)
@@ -310,21 +323,11 @@ public class AppPuzzleController {
vo.setIsBuy(1);
} else {
vo.setIsBuy(0);
PriceCalculationRequest calculationRequest = new PriceCalculationRequest();
ProductItem productItem = new ProductItem();
productItem.setProductType(ProductType.PHOTO_LOG);
productItem.setProductId(record.getTemplateId().toString());
productItem.setPurchaseCount(1);
productItem.setScenicId(face.getScenicId().toString());
calculationRequest.setProducts(Collections.singletonList(productItem));
calculationRequest.setUserId(face.getMemberId());
calculationRequest.setFaceId(record.getFaceId());
calculationRequest.setPreviewOnly(true); // 仅查询价格,不实际使用优惠
PriceCalculationResult calculationResult = iPriceCalculationService.calculatePrice(calculationRequest);
if (calculationResult.getFinalAmount().compareTo(BigDecimal.ZERO) > 0) {
vo.setFreeCount(0);
} else {
// 从关联记录读取免费状态
if (relation != null && FreeStatus.isFree(relation.getIsFree())) {
vo.setFreeCount(1);
} else {
vo.setFreeCount(0);
}
}
}

View File

@@ -47,13 +47,11 @@ import com.ycwl.basic.model.pc.video.entity.VideoEntity;
import com.ycwl.basic.model.repository.TaskUpdateResult;
import com.ycwl.basic.model.task.resp.SearchFaceRespVo;
import com.ycwl.basic.pricing.dto.PriceCalculationRequest;
import com.ycwl.basic.pricing.dto.PriceCalculationResult;
import com.ycwl.basic.pricing.dto.ProductItem;
import com.ycwl.basic.pricing.enums.ProductType;
import com.ycwl.basic.pricing.service.IPriceCalculationService;
import com.ycwl.basic.constant.FreeStatus;
import com.ycwl.basic.model.pc.puzzle.entity.MemberPuzzleEntity;
import com.ycwl.basic.puzzle.entity.PuzzleGenerationRecordEntity;
import com.ycwl.basic.puzzle.entity.PuzzleTemplateEntity;
import com.ycwl.basic.puzzle.mapper.MemberPuzzleMapper;
import com.ycwl.basic.puzzle.mapper.PuzzleGenerationRecordMapper;
import com.ycwl.basic.puzzle.mapper.PuzzleTemplateMapper;
import com.ycwl.basic.puzzle.repository.PuzzleRepository;
@@ -201,12 +199,12 @@ public class FaceServiceImpl implements FaceService {
@Autowired
private PuzzleGenerationRecordMapper puzzleGenerationRecordMapper;
@Autowired
private IPriceCalculationService iPriceCalculationService;
@Autowired
private PuzzleTemplateMapper puzzleTemplateMapper;
@Autowired
private PuzzleRepository puzzleRepository;
@Autowired
private MemberPuzzleMapper memberPuzzleMapper;
@Autowired
private FaceDetectLogAiCamService faceDetectLogAiCamService;
@Autowired
private OrderRepository orderRepository;
@@ -566,21 +564,16 @@ public class FaceServiceImpl implements FaceService {
}
}
}
PriceCalculationRequest calculationRequest = new PriceCalculationRequest();
ProductItem productItem = new ProductItem();
productItem.setProductType(ProductType.PHOTO_LOG);
productItem.setProductId(template.getId().toString());
productItem.setPurchaseCount(1);
productItem.setScenicId(face.getScenicId().toString());
calculationRequest.setProducts(Collections.singletonList(productItem));
calculationRequest.setUserId(face.getMemberId());
calculationRequest.setFaceId(face.getId());
calculationRequest.setPreviewOnly(true); // 仅查询价格,不实际使用优惠
PriceCalculationResult calculationResult = iPriceCalculationService.calculatePrice(calculationRequest);
if (calculationResult.getFinalAmount().compareTo(BigDecimal.ZERO) > 0) {
sfpContent.setFreeCount(0);
// 从 member_puzzle 关联记录读取免费状态
if (optionalRecord.isPresent()) {
MemberPuzzleEntity memberPuzzle = memberPuzzleMapper.getByFaceAndRecord(faceId, optionalRecord.get().getId());
if (memberPuzzle != null && FreeStatus.isFree(memberPuzzle.getIsFree())) {
sfpContent.setFreeCount(1);
} else {
sfpContent.setFreeCount(0);
}
} else {
sfpContent.setFreeCount(1);
sfpContent.setFreeCount(0);
}
contentList.add(1, sfpContent);
}