zepengdev
2025-09-30 bfddfbc26cac79e28149cfd7a3d3c63c623a39ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package com.oying.modules.pc.product.service.impl;
 
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson2.JSON;
import com.oying.modules.pc.common.core.constrant.AuditStatusEnum;
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.ProductAudit;
import com.oying.modules.pc.product.domain.ProductImage;
import com.oying.modules.pc.product.domain.ProductLabel;
import com.oying.modules.pc.product.domain.dto.ProductAuditData;
import com.oying.modules.pc.product.domain.dto.ProductCreateRequest;
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.enums.ProductAuditTypeEnum;
import com.oying.modules.pc.product.domain.enums.ProductCreationType;
import com.oying.modules.pc.product.domain.enums.ProductStatusEnum;
import com.oying.modules.pc.product.service.*;
import com.oying.modules.pc.utils.ImageUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
 
import java.util.List;
import java.util.stream.Collectors;
 
@Slf4j
@Component
@RequiredArgsConstructor
public class ProductAuditCreator implements ProductCreationStrategy {
 
    private final ProductService productService;
    private final ProductImageService productImageService;
    private final ProductLabelService productLabelService;
    private final ProductAuditService productAuditService;
 
    @Override
    public ProductCreationType getType() {
        return ProductCreationType.WITH_AUDIT;
    }
 
    @Override
    public void create(ProductCreateRequest resource) {
        ProductMerchantCreateRequest request = (ProductMerchantCreateRequest) resource;
        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.PENDING.getValue());
        productService.create(product);
 
        List<ProductImage> 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<ProductLabel> productLabels = request.getLabels().stream().map(i -> {
            i.setProductId(product.getProductId());
            return ProductLabelAssembler.to(i);
        }).collect(Collectors.toList());
        if (CollectionUtil.isNotEmpty(productLabels)) {
            productLabelService.saveBatch(productLabels);
        }
 
        Product auditProduct = new Product();
        auditProduct.copy(product);
        auditProduct.setImages(productImages);
        auditProduct.setLabels(productLabels);
 
        ProductAudit audit = new ProductAudit();
        audit.setProductId(product.getProductId());
        audit.setType(ProductAuditTypeEnum.NEW_PRODUCT.name());
        audit.setStatus(AuditStatusEnum.PENDING.getValue());
        ProductAuditData auditData = new ProductAuditData();
        auditData.setProduct(auditProduct);
        audit.setData(JSON.toJSONString(auditData));
        productAuditService.create(audit);
    }
 
    @Override
    public boolean supports(ProductCreationType type) {
        return ProductCreationType.WITH_AUDIT.equals(type);
    }
}