xin
2025-07-19 8841ef182bbe06a7ef1f102f51810502dde0a76f
oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductMerchantController.java
@@ -1,25 +1,30 @@
package com.oying.modules.pc.product.rest;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.oying.annotation.Log;
import com.oying.modules.pc.common.core.domain.R;
import com.oying.modules.pc.product.domain.Product;
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.dto.ProductQueryCriteria;
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.view.ProductMerchantDetailsView;
import com.oying.modules.pc.product.view.ProductMerchantSimpleView;
import com.oying.utils.PageResult;
import com.oying.utils.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -37,24 +42,27 @@
@RequestMapping("/api/pc/merchant/store/{storeId}/product")
public class ProductMerchantController {
    private final int MAX_IMAGES = 5;
    private final int MAX_LABELS = 10;
    private final ProductService productService;
    private final ProductMerchantService productMerchantService;
    private final ProductImageService productImageService;
    private final ProductLabelService productLabelService;
    @GetMapping(value = "/page")
    @ApiOperation("获取指定商户店铺的商品列表(支持分页)")
    /*@PreAuthorize("@el.check('merchant:product:page') " +
            "and @storeMerchantOwnershipService.check(#storeId)")*/
    public ResponseEntity<?> query(@PathVariable Long storeId,
                                   ProductQueryCriteria criteria) {
        criteria.setStoreId(storeId);
    public ResponseEntity<?> getProductsByPage(@PathVariable Long storeId, ProductQueryCriteria criteria) {
        criteria.setStoreId(ObjectUtils.defaultIfNull(criteria.getStoreId(), storeId));
        Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
        PageResult<Product> productPageResult = productService.queryAll(criteria, page);
        List<Product> productList = Optional.ofNullable(productPageResult.getContent()).orElse(ListUtil.empty());
        PageResult<ProductMerchantSimpleView> viewPageResult = new PageResult<>(
                productList.stream().map(i -> {
                    ProductMerchantSimpleView view = new ProductMerchantSimpleView();
                    BeanUtils.copyProperties(i, view);
                    BeanUtil.copyProperties(i, view);
                    return view;
                }).collect(Collectors.toList()),
                productPageResult.getTotalElements());
@@ -65,7 +73,7 @@
    @ApiOperation("查询商品")
    /*@PreAuthorize("@el.check('merchant:product:byProductId') " +
            "and @storeMerchantOwnershipService.check(#storeId)")*/
    public ResponseEntity<?> getById(@PathVariable Long productId) {
    public ResponseEntity<?> getProductById(@PathVariable Long productId) {
        return ResponseEntity.ok(R.success(productService.getById(productId)));
    }
@@ -75,14 +83,11 @@
            "and @storeMerchantOwnershipService.check(#storeId)")*/
    public ResponseEntity<?> getDetailsById(@PathVariable Long productId) {
        Product product = productService.getById(productId);
        ProductMerchantDetailsView view = null;
        if (product != null) {
            view = new ProductMerchantDetailsView();
            BeanUtils.copyProperties(product, view);
            view.setMainImageList(ListUtil.empty());
            view.setLabelList(ListUtil.empty());
        if (ObjUtil.isNotEmpty(product)) {
            product.setImages(productImageService.queryImagesByProductId(productId));
            product.setLabels(productLabelService.queryLabelsByProductId(productId));
        }
        return ResponseEntity.ok(R.success(view));
        return ResponseEntity.ok(R.success(product));
    }
    @PostMapping
@@ -92,20 +97,20 @@
    //        "and @storeMerchantOwnershipService.check(#storeId)")
    public ResponseEntity<?> createProduct(@PathVariable Long storeId,
                                           @Validated @RequestBody ProductMerchantCreateRequest request) {
        productMerchantService.create(storeId, request);
        return ResponseEntity.noContent().build();
        request.setStoreId(ObjectUtils.defaultIfNull(request.getStoreId(), storeId));
        productMerchantService.create(request);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }
    @PutMapping(value = "/{productId}")
    @Log("修改商品")
    //@Log("修改商品")
    @ApiOperation("修改商品")
    /*@PreAuthorize("@el.check('merchant:product:edit') " +
            "and @storeMerchantOwnershipService.check(#storeId)")*/
    public ResponseEntity<?> updateProduct(@PathVariable Long productId,
                                           @Validated @RequestBody ProductMerchantUpdateRequest request) {
        productMerchantService.update(productId, request);
        request.setProductId(ObjectUtils.defaultIfNull(request.getProductId(), productId));
        productMerchantService.update(request);
        return ResponseEntity.noContent().build();
    }
@@ -115,6 +120,16 @@
    //@PreAuthorize("@el.check('merchant:product:batchDel') " +
    //        "and @storeMerchantOwnershipService.check(#storeId)")
    public ResponseEntity<?> deleteProduct(@ApiParam(value = "传ID数组[]") @RequestBody List<Long> ids) {
        productMerchantService.batchDelete(ids);
        return ResponseEntity.noContent().build();
    }
    @PostMapping(value = "/delete")
    @Log("批量删除商品")
    @ApiOperation("批量删除商品")
    //@PreAuthorize("@el.check('merchant:product:batchDel') " +
    //        "and @storeMerchantOwnershipService.check(#storeId)")
    public ResponseEntity<?> delProduct(@ApiParam(value = "传ID数组[]") @RequestBody List<Long> ids) {
        productMerchantService.batchDelete(ids);
        return ResponseEntity.noContent().build();
    }
@@ -138,4 +153,64 @@
        productMerchantService.takeOffShelf(productId);
        return ResponseEntity.noContent().build();
    }
    @PostMapping(value = "/{productId}/images")
    @Log("添加商品图片")
    @ApiOperation("添加商品图片")
    public ResponseEntity<?> batchAddImage(@PathVariable("productId") Long productId,
                                           @RequestBody List<ProductImageCreateRequest> requests) {
        requests = requests.stream().peek(i -> i.setProductId(Optional.ofNullable(i.getProductId()).orElse(productId)))
                .collect(Collectors.toList());
        productImageService.batchCreate(requests);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }
    @PutMapping(value = "/{productId}/images/change")
    @Log("商品图片变更")
    @ApiOperation("商品图片变更")
    public ResponseEntity<?> updateImage(@PathVariable("productId") Long productId,
                                           @RequestBody ProductMerchantUpdateRequest request) {
        request.setProductId(ObjectUtils.defaultIfNull(request.getProductId(), productId));
        productMerchantService.updateImages(request);
        return ResponseEntity.noContent().build();
    }
    @DeleteMapping(value = "/{productId}/images")
    @Log("删除商品图片")
    @ApiOperation("添加商品图片")
    public ResponseEntity<?> deleteImage(@PathVariable("productId") Long productId,
                                         @RequestBody List<Long> ids) {
        productImageService.deleteAll(ids);
        return ResponseEntity.noContent().build();
    }
    @PostMapping(value = "/{productId}/labels")
    @Log("添加商品标签")
    @ApiOperation("添加商品标签")
    public ResponseEntity<?> batchAddLabel(@PathVariable("productId") Long productId,
                                           @RequestBody List<ProductLabel> requests) {
        requests = requests.stream().peek(i -> i.setProductId(Optional.ofNullable(i.getProductId()).orElse(productId)))
                .collect(Collectors.toList());
        productLabelService.batchCreate(requests);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }
    @PutMapping(value = "/{productId}/labels/change")
    @Log("标签变更")
    @ApiOperation("标签变更")
    public ResponseEntity<?> updateLabels(@PathVariable("productId") Long productId,
                                         @RequestBody ProductMerchantUpdateRequest request) {
        request.setProductId(ObjectUtils.defaultIfNull(request.getProductId(), productId));
        productMerchantService.updateLabels(request);
        return ResponseEntity.noContent().build();
    }
    @DeleteMapping(value = "/{productId}/labels")
    @Log("删除商品标签")
    @ApiOperation("添加商品标签")
    public ResponseEntity<?> deleteLabel(@PathVariable("productId") Long productId,
                                         @RequestBody List<Long> ids) {
        productLabelService.deleteAll(ids);
        return ResponseEntity.noContent().build();
    }
}