From 8841ef182bbe06a7ef1f102f51810502dde0a76f Mon Sep 17 00:00:00 2001 From: xin <1099200748@qq.com> Date: Sat, 19 Jul 2025 16:26:58 +0800 Subject: [PATCH] Merge branch 'master' into xin --- oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductMerchantServiceImpl.java | 34 +++++++++-- oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreMerchantServiceImpl.java | 3 + oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductQueryCriteria.java | 2 oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductMerchantController.java | 10 +++ oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreCategoryMerchantController.java | 14 ++++ oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductAuditServiceImpl.java | 9 +++ oying-system/src/main/java/com/oying/modules/pc/product/domain/Product.java | 3 + oying-system/src/main/java/com/oying/modules/pc/product/service/ProductAuditService.java | 8 ++ oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductController.java | 14 ++-- oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductAuditController.java | 2 oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductAuditData.java | 6 + oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreAuditData.java | 1 oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductRevisionRecord.java | 18 ------ oying-system/src/main/resources/mapper/pc/product/ProductMapper.xml | 6 + 14 files changed, 93 insertions(+), 37 deletions(-) diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/domain/Product.java b/oying-system/src/main/java/com/oying/modules/pc/product/domain/Product.java index 566ea69..2c5e76f 100644 --- a/oying-system/src/main/java/com/oying/modules/pc/product/domain/Product.java +++ b/oying-system/src/main/java/com/oying/modules/pc/product/domain/Product.java @@ -58,6 +58,9 @@ @ApiModelProperty(value = "状态") private Integer status; + @ApiModelProperty(value = "上架状态") + private Integer shelfStatus; + @NotBlank @ApiModelProperty(value = "主图片") private String mainImageId; diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductAuditData.java b/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductAuditData.java index 7f8f95d..d383ca0 100644 --- a/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductAuditData.java +++ b/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductAuditData.java @@ -1,5 +1,6 @@ package com.oying.modules.pc.product.domain.dto; +import com.oying.modules.pc.product.domain.Product; import com.oying.modules.pc.store.domain.Store; import com.oying.modules.pc.store.domain.dto.StoreRevisionRecord; import lombok.Data; @@ -7,7 +8,8 @@ @Data public class ProductAuditData { - private Store store; - private StoreRevisionRecord revisionRecord; + private Product originalStore; + private Product product; + private ProductRevisionRecord revisionRecord; } diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductQueryCriteria.java b/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductQueryCriteria.java index 644f932..860b8b4 100644 --- a/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductQueryCriteria.java +++ b/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductQueryCriteria.java @@ -21,6 +21,8 @@ private Integer status; + private Integer shelfStatus; + private Long categoryId; private Long secondCategoryId; diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductRevisionRecord.java b/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductRevisionRecord.java index ae1e04a..20770cb 100644 --- a/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductRevisionRecord.java +++ b/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductRevisionRecord.java @@ -10,23 +10,5 @@ @Data public class ProductRevisionRecord { - - @ApiModelProperty(value = "店铺ID") - private Long storeId; - - @ApiModelProperty(value = "店铺名称") - private String storeName; - - @ApiModelProperty(value = "资质") - private List<StoreQualification> qualifications = new ArrayList<>(); - - @ApiModelProperty(value = "删除的资质") - private List<Long> deletedQualificationIds = new ArrayList<>(); - - @ApiModelProperty(value = "修改的资质") - private List<StoreQualificationUpdateRequest> updatedQualifications = new ArrayList<>(); - - @ApiModelProperty(value = "新增的资质") - private List<StoreQualification> newQualifications = new ArrayList<>(); } diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductAuditController.java b/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductAuditController.java index 04d0bc8..8530d0c 100644 --- a/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductAuditController.java +++ b/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductAuditController.java @@ -54,7 +54,7 @@ return ResponseEntity.noContent().build(); } - @PostMapping(value = "/verdict") + @PutMapping(value = "/verdict") @ApiOperation("处理审核") public ResponseEntity<?> submitAuditVerdict(@RequestBody ProductAudit resources) { auditService.processVerdict(resources); diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductController.java b/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductController.java index 149958d..a0a2299 100644 --- a/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductController.java +++ b/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductController.java @@ -76,7 +76,7 @@ return ResponseEntity.ok(R.success(pageResult)); } - @GetMapping(value = "/{productId}}") + @GetMapping(value = "/{productId}") @ApiOperation("查询商品") // @PreAuthorize("@el.check('product:list')") public ResponseEntity<?> getProduct(@PathVariable Long productId) { @@ -87,8 +87,8 @@ return ResponseEntity.ok(R.success(product)); } - @GetMapping(value = "/{productId}}/details") - @ApiOperation("查询商品") + @GetMapping(value = "/{productId}/details") + @ApiOperation("查询商品详情") // @PreAuthorize("@el.check('product:list')") public ResponseEntity<?> getProductDetails(@PathVariable Long productId) { Product product = productService.getById(productId); @@ -99,16 +99,16 @@ return ResponseEntity.ok(R.success(product)); } - @GetMapping(value = "/{productId}}/images") - @ApiOperation("查询商品") + @GetMapping(value = "/{productId}/images") + @ApiOperation("查询商品图片") // @PreAuthorize("@el.check('product:list')") public ResponseEntity<?> getProductImages(@PathVariable Long productId) { return ResponseEntity.ok(R.success(productImageService.queryImagesByProductId(productId))); } - @GetMapping(value = "/{productId}}/labels") - @ApiOperation("查询商品") + @GetMapping(value = "/{productId}/labels") + @ApiOperation("查询商品标签信息") // @PreAuthorize("@el.check('product:list')") public ResponseEntity<?> getProductLabels(@PathVariable Long productId) { return ResponseEntity.ok(R.success(productLabelService.queryLabelsByProductId(productId))); diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductMerchantController.java b/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductMerchantController.java index 800f96f..899e619 100644 --- a/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductMerchantController.java +++ b/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductMerchantController.java @@ -124,6 +124,16 @@ 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(); + } + @PutMapping(value = "/{productId}/on") @Log("上架商品") @ApiOperation("上架商品") diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/service/ProductAuditService.java b/oying-system/src/main/java/com/oying/modules/pc/product/service/ProductAuditService.java index 66ce99d..909c8f3 100644 --- a/oying-system/src/main/java/com/oying/modules/pc/product/service/ProductAuditService.java +++ b/oying-system/src/main/java/com/oying/modules/pc/product/service/ProductAuditService.java @@ -43,6 +43,14 @@ ProductAudit getByProductId(Long productId); /** + * 是否有待审记录 + * + * @param productId 必须的参数,不能为null + * @return 查询到的结果 + */ + boolean hasPendingByStoreId(Long productId); + + /** * 创建 * * @param resources / diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductAuditServiceImpl.java b/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductAuditServiceImpl.java index 6713397..e21362b 100644 --- a/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductAuditServiceImpl.java +++ b/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductAuditServiceImpl.java @@ -10,6 +10,7 @@ import com.oying.modules.pc.product.events.ProductAuditVerdictEvent; import com.oying.modules.pc.product.mapper.ProductAuditMapper; import com.oying.modules.pc.product.service.ProductAuditService; +import com.oying.modules.pc.store.domain.StoreAudit; import com.oying.utils.FileUtil; import com.oying.utils.PageResult; import com.oying.utils.PageUtil; @@ -56,6 +57,14 @@ } @Override + public boolean hasPendingByStoreId(Long productId) { + LambdaQueryWrapper<ProductAudit> wrapper = new LambdaQueryWrapper<ProductAudit>() + .eq(ProductAudit::getProductId, productId) + .eq(ProductAudit::getStatus, AuditStatusEnum.PENDING.getValue()); + return productAuditMapper.selectCount(wrapper) > 0; + } + + @Override @Transactional(rollbackFor = Exception.class) public void create(ProductAudit resources) { productAuditMapper.insert(resources); 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 583047a..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,6 +2,7 @@ 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.BadRequestException; import com.oying.exception.EntityNotFoundException; @@ -12,6 +13,7 @@ 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.ProductMerchantCreateRequest; import com.oying.modules.pc.product.domain.dto.ProductMerchantUpdateRequest; @@ -76,7 +78,7 @@ @Transactional(rollbackFor = Exception.class) public void update(ProductMerchantUpdateRequest request) { Product existingProduct = this.findOrThrow(request.getProductId()); - this.validateApprovedStatus(existingProduct.getStatus()); + this.validateApprovedStatus(existingProduct.getShelfStatus()); this.processImagesUpdate(request); this.processLabelsUpdate(request); BeanUtils.copyProperties(request, existingProduct); @@ -87,7 +89,7 @@ @Transactional(rollbackFor = Exception.class) public void updateImages(ProductMerchantUpdateRequest request) { Product existingProduct = this.findOrThrow(request.getProductId()); - this.validateApprovedStatus(existingProduct.getStatus()); + this.validateApprovedStatus(existingProduct.getShelfStatus()); this.findOrThrow(request.getProductId()); this.processImagesUpdate(request); } @@ -96,7 +98,7 @@ @Transactional(rollbackFor = Exception.class) public void updateLabels(ProductMerchantUpdateRequest request) { Product existingProduct = this.findOrThrow(request.getProductId()); - this.validateApprovedStatus(existingProduct.getStatus()); + this.validateApprovedStatus(existingProduct.getShelfStatus()); this.findOrThrow(request.getProductId()); this.processImagesUpdate(request); } @@ -109,10 +111,22 @@ @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) @@ -122,9 +136,14 @@ @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); } @@ -179,11 +198,14 @@ private void handlePutOnShelfAuditEvent(ProductAudit audit) { AuditStatusEnum auditStatus = AuditStatusEnum.get(audit.getStatus()); + Product existingProduct = productService.getById(audit.getProductId()); if (AuditStatusEnum.APPROVED.equals(auditStatus)) { - Product existingProduct = productService.getById(audit.getProductId()); + existingProduct.setStatus(ProductStatusEnum.AVAILABLE.getValue()); + existingProduct.setShelfStatus(ProductStatusEnum.AVAILABLE.getValue()); + } else { existingProduct.setStatus(auditStatus.getValue()); - productService.updateById(existingProduct); } + productService.updateById(existingProduct); } private void validateApprovedStatus(Integer status) { diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreAuditData.java b/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreAuditData.java index d60c325..47fe004 100644 --- a/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreAuditData.java +++ b/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreAuditData.java @@ -6,6 +6,7 @@ @Data public class StoreAuditData { + private Store originalStore; private Store store; private StoreRevisionRecord revisionRecord; diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreCategoryMerchantController.java b/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreCategoryMerchantController.java index d193a8e..6eefbd2 100644 --- a/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreCategoryMerchantController.java +++ b/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreCategoryMerchantController.java @@ -126,10 +126,20 @@ @DeleteMapping @Log("删除店铺类目") @ApiOperation("删除店铺类目") - @PreAuthorize("@el.check('storeCategory:del')" + - " and @storeMerchantOwnershipService.check(#storeId)") + /*@PreAuthorize("@el.check('storeCategory:del')" + + " and @storeMerchantOwnershipService.check(#storeId)")*/ public ResponseEntity<?> deleteStoreCategory(@ApiParam(value = "传ID数组[]") @RequestBody List<Long> ids) { storeCategoryService.deleteAll(ids); return ResponseEntity.noContent().build(); } + + @PostMapping(value = "/delete") + @Log("删除店铺类目") + @ApiOperation("删除店铺类目") + /*@PreAuthorize("@el.check('storeCategory:del')" + + " and @storeMerchantOwnershipService.check(#storeId)")*/ + public ResponseEntity<?> delStoreCategory(@ApiParam(value = "传ID数组[]") @RequestBody List<Long> ids) { + storeCategoryService.deleteAll(ids); + return ResponseEntity.noContent().build(); + } } diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreMerchantServiceImpl.java b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreMerchantServiceImpl.java index f3ce233..1915403 100644 --- a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreMerchantServiceImpl.java +++ b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreMerchantServiceImpl.java @@ -65,6 +65,8 @@ BeanUtil.copyProperties(request, existingStore, CopyOptions.create().setIgnoreNullValue(true)); storeService.update(existingStore, true); } else if (AuditStatusEnum.APPROVED.equals(existingStatus)) { + Store originalStore = new Store(); + BeanUtil.copyProperties(existingStore, originalStore, CopyOptions.create().setIgnoreNullValue(true)); Store newStore = new Store(); newStore.setQualifications(ListUtil.of()); BeanUtil.copyProperties(request, newStore, CopyOptions.create().setIgnoreNullValue(true)); @@ -95,6 +97,7 @@ StoreRevisionRecord revisionRecord = new StoreRevisionRecord(); BeanUtil.copyProperties(request, revisionRecord, CopyOptions.create().setIgnoreNullValue(true)); StoreAuditData auditData = new StoreAuditData(); + auditData.setOriginalStore(originalStore); auditData.setStore(newStore); auditData.setRevisionRecord(revisionRecord); this.createLatestModification(request.getStoreId(), StoreChangeTypeEnum.STORE_UPDATE, auditData); diff --git a/oying-system/src/main/resources/mapper/pc/product/ProductMapper.xml b/oying-system/src/main/resources/mapper/pc/product/ProductMapper.xml index 209639f..ee5bc4f 100644 --- a/oying-system/src/main/resources/mapper/pc/product/ProductMapper.xml +++ b/oying-system/src/main/resources/mapper/pc/product/ProductMapper.xml @@ -11,6 +11,7 @@ <result column="category_id" property="categoryId"/> <result column="second_category_id" property="secondCategoryId"/> <result column="status" property="status"/> + <result column="shelf_status" property="shelfStatus"/> <result column="main_image_id" property="mainImageId"/> <result column="main_image_Url" property="mainImageUrl"/> <result column="description" property="description"/> @@ -33,7 +34,7 @@ </resultMap> <sql id="Base_Column_List"> - product_id, store_id, code, barcode, name, title, category_id, second_category_id, status, main_image_id, main_image_url, description, price, stock_quantity, min_purchase_quantity, warn_stock, weight, width, length, height, returns, self_pickup, deleted_flag, create_by, create_time, update_by, update_time, version + product_id, store_id, code, barcode, name, title, category_id, second_category_id, status, shelf_status, main_image_id, main_image_url, description, price, stock_quantity, min_purchase_quantity, warn_stock, weight, width, length, height, returns, self_pickup, deleted_flag, create_by, create_time, update_by, update_time, version </sql> <select id="findAll" resultMap="BaseResultMap"> @@ -56,6 +57,9 @@ <if test="criteria.status != null"> and status = #{criteria.status} </if> + <if test="criteria.shelfStatus != null"> + and shelf_status = #{criteria.shelfStatus} + </if> <if test="criteria.active != null"> and active = #{criteria.active} </if> -- Gitblit v1.9.3