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.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -62,8 +61,9 @@ public class AppPuzzleController {
if (faceId == null) { if (faceId == null) {
return ApiResponse.fail("faceId不能为空"); 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) { if (faceId == null) {
return ApiResponse.fail("faceId不能为空"); return ApiResponse.fail("faceId不能为空");
} }
List<PuzzleGenerationRecordEntity> records = puzzleRepository.getRecordsByFaceId(faceId); // 通过关联表查询,获取关联的拼图记录
List<ContentPageVO> result = records.stream() List<MemberPuzzleEntity> relations = memberPuzzleMapper.listByFaceId(faceId);
.map(this::convertToContentPageVO) 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()); .collect(Collectors.toList());
return ApiResponse.success(result); return ApiResponse.success(result);
} }
@@ -93,7 +101,9 @@ public class AppPuzzleController {
if (record == null) { if (record == null) {
return ApiResponse.fail("未找到对应的拼图记录"); return ApiResponse.fail("未找到对应的拼图记录");
} }
ContentPageVO result = convertToContentPageVO(record); // 查询关联记录
MemberPuzzleEntity relation = memberPuzzleMapper.getByFaceAndRecord(record.getFaceId(), recordId);
ContentPageVO result = convertToContentPageVO(record, relation);
return ApiResponse.success(result); return ApiResponse.success(result);
} }
@@ -273,8 +283,11 @@ public class AppPuzzleController {
/** /**
* 将PuzzleGenerationRecordEntity转换为ContentPageVO * 将PuzzleGenerationRecordEntity转换为ContentPageVO
*
* @param record 拼图生成记录
* @param relation 会员拼图关联记录,用于获取免费状态
*/ */
private ContentPageVO convertToContentPageVO(PuzzleGenerationRecordEntity record) { private ContentPageVO convertToContentPageVO(PuzzleGenerationRecordEntity record, MemberPuzzleEntity relation) {
ContentPageVO vo = new ContentPageVO(); ContentPageVO vo = new ContentPageVO();
// 内容类型为3(拼图) // 内容类型为3(拼图)
@@ -310,21 +323,11 @@ public class AppPuzzleController {
vo.setIsBuy(1); vo.setIsBuy(1);
} else { } else {
vo.setIsBuy(0); vo.setIsBuy(0);
PriceCalculationRequest calculationRequest = new PriceCalculationRequest(); // 从关联记录读取免费状态
ProductItem productItem = new ProductItem(); if (relation != null && FreeStatus.isFree(relation.getIsFree())) {
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 {
vo.setFreeCount(1); 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.repository.TaskUpdateResult;
import com.ycwl.basic.model.task.resp.SearchFaceRespVo; import com.ycwl.basic.model.task.resp.SearchFaceRespVo;
import com.ycwl.basic.pricing.dto.PriceCalculationRequest; import com.ycwl.basic.constant.FreeStatus;
import com.ycwl.basic.pricing.dto.PriceCalculationResult; import com.ycwl.basic.model.pc.puzzle.entity.MemberPuzzleEntity;
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.puzzle.entity.PuzzleGenerationRecordEntity; import com.ycwl.basic.puzzle.entity.PuzzleGenerationRecordEntity;
import com.ycwl.basic.puzzle.entity.PuzzleTemplateEntity; 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.PuzzleGenerationRecordMapper;
import com.ycwl.basic.puzzle.mapper.PuzzleTemplateMapper; import com.ycwl.basic.puzzle.mapper.PuzzleTemplateMapper;
import com.ycwl.basic.puzzle.repository.PuzzleRepository; import com.ycwl.basic.puzzle.repository.PuzzleRepository;
@@ -201,12 +199,12 @@ public class FaceServiceImpl implements FaceService {
@Autowired @Autowired
private PuzzleGenerationRecordMapper puzzleGenerationRecordMapper; private PuzzleGenerationRecordMapper puzzleGenerationRecordMapper;
@Autowired @Autowired
private IPriceCalculationService iPriceCalculationService;
@Autowired
private PuzzleTemplateMapper puzzleTemplateMapper; private PuzzleTemplateMapper puzzleTemplateMapper;
@Autowired @Autowired
private PuzzleRepository puzzleRepository; private PuzzleRepository puzzleRepository;
@Autowired @Autowired
private MemberPuzzleMapper memberPuzzleMapper;
@Autowired
private FaceDetectLogAiCamService faceDetectLogAiCamService; private FaceDetectLogAiCamService faceDetectLogAiCamService;
@Autowired @Autowired
private OrderRepository orderRepository; private OrderRepository orderRepository;
@@ -566,21 +564,16 @@ public class FaceServiceImpl implements FaceService {
} }
} }
} }
PriceCalculationRequest calculationRequest = new PriceCalculationRequest(); // 从 member_puzzle 关联记录读取免费状态
ProductItem productItem = new ProductItem(); if (optionalRecord.isPresent()) {
productItem.setProductType(ProductType.PHOTO_LOG); MemberPuzzleEntity memberPuzzle = memberPuzzleMapper.getByFaceAndRecord(faceId, optionalRecord.get().getId());
productItem.setProductId(template.getId().toString()); if (memberPuzzle != null && FreeStatus.isFree(memberPuzzle.getIsFree())) {
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);
} else {
sfpContent.setFreeCount(1); sfpContent.setFreeCount(1);
} else {
sfpContent.setFreeCount(0);
}
} else {
sfpContent.setFreeCount(0);
} }
contentList.add(1, sfpContent); contentList.add(1, sfpContent);
} }