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.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.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.apache.commons.lang3.ObjectUtils; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; /** * @author lzp * @date 2025-04-30 **/ @RestController @RequiredArgsConstructor @Api(tags = "商品(商户端)") @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 getProductsByPage(@PathVariable Long storeId, ProductQueryCriteria criteria) { criteria.setStoreId(ObjectUtils.defaultIfNull(criteria.getStoreId(), storeId)); Page page = new Page<>(criteria.getPage(), criteria.getSize()); PageResult productPageResult = productService.queryAll(criteria, page); List productList = Optional.ofNullable(productPageResult.getContent()).orElse(ListUtil.empty()); PageResult viewPageResult = new PageResult<>( productList.stream().map(i -> { ProductMerchantSimpleView view = new ProductMerchantSimpleView(); BeanUtil.copyProperties(i, view); return view; }).collect(Collectors.toList()), productPageResult.getTotalElements()); return ResponseEntity.ok(R.success(viewPageResult)); } @GetMapping(value = "/{productId}") @ApiOperation("查询商品") /*@PreAuthorize("@el.check('merchant:product:byProductId') " + "and @storeMerchantOwnershipService.check(#storeId)")*/ public ResponseEntity getProductById(@PathVariable Long productId) { return ResponseEntity.ok(R.success(productService.getById(productId))); } @GetMapping(value = "/{productId}/details") @ApiOperation("查询商品详情") /*@PreAuthorize("@el.check('merchant:product:byProductId') " + "and @storeMerchantOwnershipService.check(#storeId)")*/ public ResponseEntity getDetailsById(@PathVariable Long productId) { Product product = productService.getById(productId); if (ObjUtil.isNotEmpty(product)) { product.setImages(productImageService.queryImagesByProductId(productId)); product.setLabels(productLabelService.queryLabelsByProductId(productId)); } return ResponseEntity.ok(R.success(product)); } @PostMapping @Log("新增商品") @ApiOperation("新增商品") //@PreAuthorize("@el.check('merchant:product:add') " + // "and @storeMerchantOwnershipService.check(#storeId)") public ResponseEntity createProduct(@PathVariable Long storeId, @Validated @RequestBody ProductMerchantCreateRequest request) { request.setStoreId(ObjectUtils.defaultIfNull(request.getStoreId(), storeId)); productMerchantService.create(request); return ResponseEntity.status(HttpStatus.CREATED).build(); } @PutMapping(value = "/{productId}") //@Log("修改商品") @ApiOperation("修改商品") /*@PreAuthorize("@el.check('merchant:product:edit') " + "and @storeMerchantOwnershipService.check(#storeId)")*/ public ResponseEntity updateProduct(@PathVariable Long productId, @Validated @RequestBody ProductMerchantUpdateRequest request) { request.setProductId(ObjectUtils.defaultIfNull(request.getProductId(), productId)); productMerchantService.update(request); return ResponseEntity.noContent().build(); } @DeleteMapping @Log("批量删除商品") @ApiOperation("批量删除商品") //@PreAuthorize("@el.check('merchant:product:batchDel') " + // "and @storeMerchantOwnershipService.check(#storeId)") public ResponseEntity deleteProduct(@ApiParam(value = "传ID数组[]") @RequestBody List 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 ids) { productMerchantService.batchDelete(ids); return ResponseEntity.noContent().build(); } @PutMapping(value = "/{productId}/on") @Log("上架商品") @ApiOperation("上架商品") /*@PreAuthorize("@el.check('merchant:product:on') " + "and @storeMerchantOwnershipService.check(#storeId)")*/ public ResponseEntity putOnShelf(@PathVariable("productId") Long productId) { productMerchantService.putOnShelf(productId); return ResponseEntity.noContent().build(); } @PutMapping(value = "/{productId}/off") @Log("下架商品") @ApiOperation("下架商品") /*@PreAuthorize("@el.check('merchant:product:off') " + "and @storeMerchantOwnershipService.check(#storeId)")*/ public ResponseEntity takeOffShelf(@PathVariable("productId") Long productId) { productMerchantService.takeOffShelf(productId); return ResponseEntity.noContent().build(); } @PostMapping(value = "/{productId}/images") @Log("添加商品图片") @ApiOperation("添加商品图片") public ResponseEntity batchAddImage(@PathVariable("productId") Long productId, @RequestBody List 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 ids) { productImageService.deleteAll(ids); return ResponseEntity.noContent().build(); } @PostMapping(value = "/{productId}/labels") @Log("添加商品标签") @ApiOperation("添加商品标签") public ResponseEntity batchAddLabel(@PathVariable("productId") Long productId, @RequestBody List 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 ids) { productLabelService.deleteAll(ids); return ResponseEntity.noContent().build(); } }