Merge branch 'print_sku'

This commit is contained in:
2025-11-15 15:30:57 +08:00
7 changed files with 315 additions and 35 deletions

View File

@@ -33,6 +33,7 @@ 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.IAutoCouponService;
import com.ycwl.basic.pricing.service.IPriceCalculationService;
import com.ycwl.basic.model.pc.printer.entity.MemberPrintEntity;
import com.ycwl.basic.model.pc.printer.entity.PrintTaskEntity;
@@ -109,6 +110,8 @@ public class PrinterServiceImpl implements PrinterService {
@Autowired
private IPriceCalculationService priceCalculationService;
@Autowired
private IAutoCouponService autoCouponService;
@Autowired
private ScenicRepository scenicRepository;
@Autowired
private OrderRepository orderRepository;
@@ -354,37 +357,104 @@ public class PrinterServiceImpl implements PrinterService {
@Override
public PriceObj queryPrice(Long memberId, Long scenicId, Long faceId) {
List<MemberPrintResp> userPhotoList = getUserPhotoList(memberId, scenicId, faceId);
// 计算照片总数量
long count = userPhotoList.stream()
.filter(item -> Objects.nonNull(item.getQuantity()))
.mapToInt(MemberPrintResp::getQuantity)
.sum();
PriceObj obj = new PriceObj();
obj.setScenicId(scenicId);
obj.setGoodsId(faceId);
obj.setFaceId(faceId);
obj.setGoodsType(3);
if (count == 0) {
// 按照 sourceId 分类照片
// sourceId > 0: 普通照片打印 (PHOTO_PRINT)
// sourceId == null: 手机照片打印 (PHOTO_PRINT_MU)
// sourceId == 0: 特效照片打印 (PHOTO_PRINT_FX)
long normalCount = userPhotoList.stream()
.filter(item -> Objects.nonNull(item.getQuantity())
&& item.getSourceId() != null && item.getSourceId() > 0)
.mapToInt(MemberPrintResp::getQuantity)
.sum();
long mobileCount = userPhotoList.stream()
.filter(item -> Objects.nonNull(item.getQuantity())
&& item.getSourceId() == null)
.mapToInt(MemberPrintResp::getQuantity)
.sum();
long effectCount = userPhotoList.stream()
.filter(item -> Objects.nonNull(item.getQuantity())
&& item.getSourceId() != null && item.getSourceId() == 0)
.mapToInt(MemberPrintResp::getQuantity)
.sum();
long totalCount = normalCount + mobileCount + effectCount;
if (totalCount == 0) {
// 如果没有照片,返回零价格
obj.setPrice(BigDecimal.ZERO);
obj.setSlashPrice(BigDecimal.ZERO);
obj.setFree(false);
return obj;
}
// 构建价格计算请求
PriceCalculationRequest request = new PriceCalculationRequest();
request.setUserId(memberId);
// 创建照片打印商品项
ProductItem photoItem = new ProductItem();
photoItem.setProductType(ProductType.PHOTO_PRINT);
photoItem.setProductId(scenicId.toString());
photoItem.setQuantity(Long.valueOf(count).intValue());
photoItem.setPurchaseCount(1);
photoItem.setScenicId(scenicId.toString());
// 创建商品项列表
List<ProductItem> productItems = new ArrayList<>();
request.setProducts(Collections.singletonList(photoItem));
// 添加普通照片打印商品项 (sourceId > 0)
if (normalCount > 0) {
ProductItem normalPhotoItem = new ProductItem();
normalPhotoItem.setProductType(ProductType.PHOTO_PRINT);
normalPhotoItem.setProductId(scenicId.toString());
normalPhotoItem.setQuantity(Long.valueOf(normalCount).intValue());
normalPhotoItem.setPurchaseCount(1);
normalPhotoItem.setScenicId(scenicId.toString());
productItems.add(normalPhotoItem);
log.debug("普通照片打印数量: {}", normalCount);
}
// 添加手机照片打印商品项 (sourceId == null)
if (mobileCount > 0) {
ProductItem mobilePhotoItem = new ProductItem();
mobilePhotoItem.setProductType(ProductType.PHOTO_PRINT_MU);
mobilePhotoItem.setProductId(scenicId.toString());
mobilePhotoItem.setQuantity(Long.valueOf(mobileCount).intValue());
mobilePhotoItem.setPurchaseCount(1);
mobilePhotoItem.setScenicId(scenicId.toString());
productItems.add(mobilePhotoItem);
log.debug("手机照片打印数量: {}", mobileCount);
}
// 添加特效照片打印商品项 (sourceId == 0)
if (effectCount > 0) {
ProductItem effectPhotoItem = new ProductItem();
effectPhotoItem.setProductType(ProductType.PHOTO_PRINT_FX);
effectPhotoItem.setProductId(scenicId.toString());
effectPhotoItem.setQuantity(Long.valueOf(effectCount).intValue());
effectPhotoItem.setPurchaseCount(1);
effectPhotoItem.setScenicId(scenicId.toString());
productItems.add(effectPhotoItem);
log.debug("特效照片打印数量: {}", effectCount);
}
request.setProducts(productItems);
if (mobileCount > 0) {
try {
autoCouponService.autoGrantCoupon(
memberId,
faceId,
scenicId,
ProductType.PHOTO_PRINT_MU
);
} catch (Exception e) {
log.warn("自动发券失败,不影响下单流程: memberId={}, faceId={}, scenicId={}, error={}",
memberId, faceId, scenicId, e.getMessage());
}
}
request.setAutoUseCoupon(true);
// 使用统一价格计算服务
PriceCalculationResult result = priceCalculationService.calculatePrice(request);
@@ -505,8 +575,32 @@ public class PrinterServiceImpl implements PrinterService {
}
// 验证照片数量
List<MemberPrintResp> userPhotoList = getUserPhotoList(memberId, scenicId, faceId);
long count = userPhotoList.stream().filter(item -> Objects.nonNull(item.getQuantity())).mapToInt(MemberPrintResp::getQuantity).sum();
if (count == 0) {
// 按照 sourceId 分类照片
// sourceId > 0: 普通照片打印 (PHOTO_PRINT)
// sourceId == null: 手机照片打印 (PHOTO_PRINT_MU)
// sourceId == 0: 特效照片打印 (PHOTO_PRINT_FX)
long normalCount = userPhotoList.stream()
.filter(item -> Objects.nonNull(item.getQuantity())
&& item.getSourceId() != null && item.getSourceId() > 0)
.mapToInt(MemberPrintResp::getQuantity)
.sum();
long mobileCount = userPhotoList.stream()
.filter(item -> Objects.nonNull(item.getQuantity())
&& item.getSourceId() == null)
.mapToInt(MemberPrintResp::getQuantity)
.sum();
long effectCount = userPhotoList.stream()
.filter(item -> Objects.nonNull(item.getQuantity())
&& item.getSourceId() != null && item.getSourceId() == 0)
.mapToInt(MemberPrintResp::getQuantity)
.sum();
long totalCount = normalCount + mobileCount + effectCount;
if (totalCount == 0) {
throw new BaseException("没有可打印的照片");
}
@@ -536,15 +630,48 @@ public class PrinterServiceImpl implements PrinterService {
request.setUserId(memberId);
request.setScenicId(scenicId);
// 创建照片打印商品项
ProductItem photoItem = new ProductItem();
photoItem.setProductType(ProductType.PHOTO_PRINT);
photoItem.setProductId(scenicId.toString());
photoItem.setQuantity(Long.valueOf(count).intValue());
photoItem.setPurchaseCount(1);
photoItem.setScenicId(scenicId.toString());
// 创建商品项列表
List<ProductItem> productItems = new ArrayList<>();
request.setProducts(Collections.singletonList(photoItem));
// 添加普通照片打印商品项 (sourceId > 0)
if (normalCount > 0) {
ProductItem normalPhotoItem = new ProductItem();
normalPhotoItem.setProductType(ProductType.PHOTO_PRINT);
normalPhotoItem.setProductId(scenicId.toString());
normalPhotoItem.setQuantity(Long.valueOf(normalCount).intValue());
normalPhotoItem.setPurchaseCount(1);
normalPhotoItem.setScenicId(scenicId.toString());
productItems.add(normalPhotoItem);
log.debug("创建订单-普通照片打印数量: {}", normalCount);
}
// 添加手机照片打印商品项 (sourceId == null)
if (mobileCount > 0) {
ProductItem mobilePhotoItem = new ProductItem();
mobilePhotoItem.setProductType(ProductType.PHOTO_PRINT_MU);
mobilePhotoItem.setProductId(scenicId.toString());
mobilePhotoItem.setQuantity(Long.valueOf(mobileCount).intValue());
mobilePhotoItem.setPurchaseCount(1);
mobilePhotoItem.setScenicId(scenicId.toString());
productItems.add(mobilePhotoItem);
log.debug("创建订单-手机照片打印数量: {}", mobileCount);
}
// 添加特效照片打印商品项 (sourceId == 0)
if (effectCount > 0) {
ProductItem effectPhotoItem = new ProductItem();
effectPhotoItem.setProductType(ProductType.PHOTO_PRINT_FX);
effectPhotoItem.setProductId(scenicId.toString());
effectPhotoItem.setQuantity(Long.valueOf(effectCount).intValue());
effectPhotoItem.setPurchaseCount(1);
effectPhotoItem.setScenicId(scenicId.toString());
productItems.add(effectPhotoItem);
log.debug("创建订单-特效照片打印数量: {}", effectCount);
}
request.setProducts(productItems);
request.setAutoUseCoupon(true);
request.setPreviewOnly(false);
PriceCalculationResult priceResult = priceCalculationService.calculatePrice(request);