From 7440258d31a6ef7d76eb2351852cec9f2bdd4222 Mon Sep 17 00:00:00 2001 From: zepengdev <lzpsmith@outlook.com> Date: Mon, 21 Jul 2025 16:16:28 +0800 Subject: [PATCH] fix: 调整店铺商品查询的参数 --- oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductMerchantServiceImpl.java | 86 +++++++++++++++++++++++++++++++++++++++---- 1 files changed, 78 insertions(+), 8 deletions(-) diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductMerchantServiceImpl.java b/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductMerchantServiceImpl.java index 7540a58..24ed038 100644 --- a/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductMerchantServiceImpl.java +++ b/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductMerchantServiceImpl.java @@ -2,33 +2,39 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjUtil; +import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.oying.exception.EntityExistException; +import com.oying.exception.BadRequestException; import com.oying.exception.EntityNotFoundException; +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.ProductImageCreateRequest; -import com.oying.modules.pc.product.domain.dto.ProductLabelCreateRequest; 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.ProductChangeTypeEnum; import com.oying.modules.pc.product.domain.enums.ProductStatusEnum; -import com.oying.modules.pc.product.service.ProductImageService; -import com.oying.modules.pc.product.service.ProductLabelService; -import com.oying.modules.pc.product.service.ProductMerchantService; -import com.oying.modules.pc.product.service.ProductService; +import com.oying.modules.pc.product.events.ProductAuditVerdictEvent; +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.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; +@Slf4j @Service @RequiredArgsConstructor public class ProductMerchantServiceImpl implements ProductMerchantService { @@ -36,6 +42,7 @@ private final ProductService productService; private final ProductImageService productImageService; private final ProductLabelService productLabelService; + private final ProductAuditService productAuditService; @Override @Transactional(rollbackFor = Exception.class) @@ -71,6 +78,7 @@ @Transactional(rollbackFor = Exception.class) public void update(ProductMerchantUpdateRequest request) { Product existingProduct = this.findOrThrow(request.getProductId()); + this.validateApprovedStatus(existingProduct.getShelfStatus()); this.processImagesUpdate(request); this.processLabelsUpdate(request); BeanUtils.copyProperties(request, existingProduct); @@ -80,6 +88,8 @@ @Override @Transactional(rollbackFor = Exception.class) public void updateImages(ProductMerchantUpdateRequest request) { + Product existingProduct = this.findOrThrow(request.getProductId()); + this.validateApprovedStatus(existingProduct.getShelfStatus()); this.findOrThrow(request.getProductId()); this.processImagesUpdate(request); } @@ -87,6 +97,8 @@ @Override @Transactional(rollbackFor = Exception.class) public void updateLabels(ProductMerchantUpdateRequest request) { + Product existingProduct = this.findOrThrow(request.getProductId()); + this.validateApprovedStatus(existingProduct.getShelfStatus()); this.findOrThrow(request.getProductId()); this.processImagesUpdate(request); } @@ -99,18 +111,55 @@ @Override public void putOnShelf(Long productId) { + Product existingProduct = productService.getById(productId); + if (ProductStatusEnum.AVAILABLE.getValue().equals(existingProduct.getShelfStatus())) { + throw new BadRequestException("商品已上架"); + } + + if (productAuditService.hasPendingByStoreId(productId)) { + throw new BadRequestException("已在审核中"); + } + + ProductAudit audit = new ProductAudit(); + audit.setProductId(productId); + audit.setType(ProductChangeTypeEnum.PUT_ON_SHELF.name()); + audit.setStatus(AuditStatusEnum.PENDING.getValue()); + ProductAuditData auditData = new ProductAuditData(); + auditData.setOriginalStore(existingProduct); + audit.setData(JSON.toJSONString(auditData)); + productAuditService.create(audit); LambdaUpdateWrapper<Product> wrapper = new LambdaUpdateWrapper<Product>() .eq(Product::getProductId, productId) - .set(Product::getStatus, ProductStatusEnum.AVAILABLE.getValue()); + .set(Product::getStatus, ProductStatusEnum.PENDING.getValue()); productService.update(wrapper); } @Override public void takeOffShelf(Long productId) { + Product existingProduct = productService.getById(productId); + if (ProductStatusEnum.NO_AVAILABLE.getValue().equals(existingProduct.getShelfStatus())) { + return; + } LambdaUpdateWrapper<Product> wrapper = new LambdaUpdateWrapper<Product>() .eq(Product::getProductId, productId) - .set(Product::getStatus, ProductStatusEnum.NO_AVAILABLE.getValue()); + .set(Product::getStatus, ProductStatusEnum.NO_AVAILABLE.getValue()) + .set(Product::getShelfStatus, ProductStatusEnum.NO_AVAILABLE.getValue()); productService.update(wrapper); + } + + @Override + @EventListener + @Transactional(rollbackFor = Exception.class) + public void handleAuditVerdictEvent(ProductAuditVerdictEvent event) { + try { + ProductAudit audit = productAuditService.getById(event.getAuditId()); + ProductChangeTypeEnum changeType = ProductChangeTypeEnum.valueOf(audit.getType()); + if (changeType == ProductChangeTypeEnum.PUT_ON_SHELF) { + this.handlePutOnShelfAuditEvent(audit); + } + } catch (Exception e) { + log.error("处理商品审核结果异常", e); + } } private Product findOrThrow(Long productId) { @@ -146,4 +195,25 @@ productLabelService.batchCreate(newLabels); } } + + private void handlePutOnShelfAuditEvent(ProductAudit audit) { + AuditStatusEnum auditStatus = AuditStatusEnum.get(audit.getStatus()); + Product existingProduct = productService.getById(audit.getProductId()); + if (AuditStatusEnum.APPROVED.equals(auditStatus)) { + existingProduct.setStatus(ProductStatusEnum.AVAILABLE.getValue()); + existingProduct.setShelfStatus(ProductStatusEnum.AVAILABLE.getValue()); + } else { + existingProduct.setStatus(auditStatus.getValue()); + } + productService.updateById(existingProduct); + } + + private void validateApprovedStatus(Integer status) { + Set<ProductStatusEnum> statusEnumSet = CollectionUtil.newHashSet(ProductStatusEnum.PENDING, + ProductStatusEnum.UNDER_REVIEW, ProductStatusEnum.AVAILABLE); + ProductStatusEnum existingStatus = ProductStatusEnum.getOrDefault(status, ProductStatusEnum.DRAFT); + if (statusEnumSet.contains(existingStatus)) { + throw new BadRequestException("在售商品无法修改"); + } + } } -- Gitblit v1.9.3