package com.oying.modules.pc.product.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjUtil; import com.oying.exception.EntityExistException; import com.oying.exception.EntityNotFoundException; import com.oying.modules.pc.product.converter.ProductImageAssembler; import com.oying.modules.pc.product.converter.ProductLabelAssembler; import com.oying.modules.pc.product.domain.Product; import com.oying.modules.pc.product.domain.ProductImage; import com.oying.modules.pc.product.domain.ProductLabel; import com.oying.modules.pc.product.domain.dto.ProductImageCreateRequest; import com.oying.modules.pc.product.domain.dto.ProductMerchantCreateRequest; import com.oying.modules.pc.product.domain.dto.ProductMerchantUpdateRequest; import com.oying.modules.pc.product.domain.enums.ProductStatusEnum; import com.oying.modules.pc.product.service.ProductAdminService; import com.oying.modules.pc.product.service.ProductImageService; import com.oying.modules.pc.product.service.ProductLabelService; import com.oying.modules.pc.product.service.ProductService; import com.oying.modules.pc.utils.ImageUtils; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class ProductAdminServiceImpl implements ProductAdminService { private final ProductService productService; private final ProductImageService productImageService; private final ProductLabelService productLabelService; @Override @Transactional(rollbackFor = Exception.class) public void create(ProductMerchantCreateRequest request) { Product product = new Product(); BeanUtils.copyProperties(request, product); request.getImages().stream().findFirst().map(ProductImageCreateRequest::getUploadFileId) .ifPresent(id -> { product.setMainImageId(id.toString()); product.setMainImageUrl(ImageUtils.getPublicObjectUrl(id)); }); product.setStatus(ProductStatusEnum.DRAFT.getValue()); productService.create(product); List productImages = request.getImages().stream().map(i -> { i.setProductId(product.getProductId()); return ProductImageAssembler.to(i); }).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(productImages)) { productImageService.saveBatch(productImages); } List productLabels = request.getLabels().stream().map(i -> { i.setProductId(product.getProductId()); return ProductLabelAssembler.to(i); }).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(productLabels)) { productLabelService.saveBatch(productLabels); } } @Override @Transactional(rollbackFor = Exception.class) public void update(ProductMerchantUpdateRequest request) { Product existingProduct = this.findOrThrow(request.getProductId()); this.processImagesUpdate(request); this.processLabelsUpdate(request); BeanUtils.copyProperties(request, existingProduct); productService.update(existingProduct); } @Transactional @Override public void delete(List ids) { productService.deleteAll(ids); } private Product findOrThrow(Long productId) { Product existingProduct = productService.getById(productId); if (ObjUtil.isEmpty(existingProduct)) { throw new EntityNotFoundException(Product.class, "id", Optional.ofNullable(productId).map(Object::toString).orElse("null")); } return existingProduct; } private void processImagesUpdate(ProductMerchantUpdateRequest request) { if (CollectionUtil.isNotEmpty(request.getDeletedImageIds())) { productImageService.deleteAll(request.getDeletedImageIds()); } if (CollectionUtil.isNotEmpty(request.getUpdatedImages())) { productImageService.batchUpdate(request.getUpdatedImages()); } if (CollectionUtil.isNotEmpty(request.getNewImages())) { productImageService.batchCreate(request.getNewImages()); } } private void processLabelsUpdate(ProductMerchantUpdateRequest request) { if (CollectionUtil.isNotEmpty(request.getDeletedLabelIds())) { productLabelService.deleteAll(request.getDeletedLabelIds()); } if (CollectionUtil.isNotEmpty(request.getUpdatedLabels())) { productLabelService.batchUpdate(request.getUpdatedLabels()); } if (CollectionUtil.isNotEmpty(request.getNewLabels())) { productLabelService.batchCreate(request.getNewLabels()); } } }