/*
|
* Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
|
*
|
* https://www.mall4j.com/
|
*
|
* 未经允许,不可做商业用途!
|
*
|
* 版权所有,侵权必究!
|
*/
|
package com.yami.shop.api.controller;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.yami.shop.bean.app.dto.CategoryDto;
|
import com.yami.shop.bean.dto.DerivativeCategoryDto;
|
import com.yami.shop.bean.enums.EsOperationType;
|
import com.yami.shop.bean.event.EsProductUpdateEvent;
|
import com.yami.shop.bean.model.Category;
|
import com.yami.shop.bean.model.CategoryShop;
|
import com.yami.shop.bean.model.Product;
|
import com.yami.shop.bean.vo.CategoryShopVO;
|
import com.yami.shop.bean.vo.CategoryVO;
|
import com.yami.shop.common.annotation.RedisLock;
|
import com.yami.shop.common.annotation.SysLog;
|
import com.yami.shop.common.config.Constant;
|
import com.yami.shop.common.exception.YamiShopBindException;
|
import com.yami.shop.common.i18n.I18nMessage;
|
import com.yami.shop.common.i18n.LanguageEnum;
|
import com.yami.shop.common.response.ServerResponseEntity;
|
import com.yami.shop.common.util.PageParam;
|
import com.yami.shop.security.api.util.SecurityUtils;
|
import com.yami.shop.service.*;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.Parameter;
|
import io.swagger.v3.oas.annotations.Parameters;
|
import io.swagger.v3.oas.annotations.Operation;
|
import ma.glasnost.orika.MapperFacade;
|
import org.springdoc.api.annotations.ParameterObject;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.context.ApplicationEventPublisher;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.web.bind.annotation.*;
|
|
import javax.servlet.http.HttpServletResponse;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Objects;
|
import java.util.stream.Collectors;
|
|
import static java.util.stream.Collectors.groupingBy;
|
|
/**
|
* @author LGH
|
*/
|
@RestController
|
@RequestMapping("/p/prod/category")
|
@Tag(name = "分类接口")
|
public class CategoryController {
|
|
@Autowired
|
private CategoryService categoryService;
|
|
@Autowired
|
private MapperFacade mapperFacade;
|
|
@Autowired
|
private ProductService productService;
|
|
@Autowired
|
private CategoryShopService categoryShopService;
|
|
@Autowired
|
private ApplicationEventPublisher eventPublisher;
|
|
@Autowired
|
private CategoryExcelService categoryExcelService;
|
|
@Autowired
|
private LifeServiceCategoryService lifeServiceCategoryService;
|
|
@Autowired
|
private ShopDetailService shopDetailService;
|
|
public static final Integer SHOP = 0;
|
public static final Integer LIFE_SERVICE_SHOP = 1;
|
public static final Integer TECHNICIAN = 2;
|
|
@GetMapping("/categoryInfo")
|
@Operation(summary = "分类信息列表" , description = "获取所有的产品分类信息,顶级分类的parentId为0,默认为顶级分类")
|
@Parameters({
|
@Parameter(name = "parentId", description = "分类ID" ),
|
@Parameter(name = "shopId", description = "店铺id" )
|
})
|
public ServerResponseEntity<List<CategoryDto>> categoryInfo(@RequestParam(value = "parentId", defaultValue = "0") Long parentId,
|
@RequestParam(value = "shopId", defaultValue = "0") Long shopId) {
|
List<Category> categories = categoryService.listByParentIdAndShopId(parentId, shopId, I18nMessage.getDbLang());
|
List<CategoryDto> categoryDtos = mapperFacade.mapAsList(categories, CategoryDto.class);
|
return ServerResponseEntity.success(categoryDtos);
|
}
|
|
/**
|
* 根据店铺类型获取签约的分类列表
|
* @param status
|
* @param shopType
|
* @return
|
*/
|
@GetMapping("/listSigningCategoryByShopType/{shopType}")
|
@Operation(summary = "根据店铺类型获取签约的分类列表(状态参数为空则返回所有)" , description = "根据店铺类型获取签约的分类列表(状态参数为空则返回所有)")
|
@Parameter(name = "status", description = "签约状态:1:已通过 0待审核 -1未通过" )
|
public ServerResponseEntity<List<String>> listByShopType(@RequestParam(value = "status", required = false) Integer status,
|
@PathVariable("shopType") Integer shopType) {
|
// Long shopId = shopDetailService.getShopDetailByUserId(SecurityUtils.getUser().getUserId()).getShopId();
|
List<String> categoryShopVOList = null;
|
if (Objects.equals(SHOP,shopType)) {
|
// categoryShopVOList = categoryShopService.listSigningCategoryByShopId(shopId, I18nMessage.getLang());
|
categoryShopVOList = categoryShopService.getCategory();
|
}else{
|
// categoryShopVOList = lifeServiceCategoryService.listSigningCategoryByShopId(shopId, I18nMessage.getLang());
|
categoryShopVOList = lifeServiceCategoryService.getCategory();
|
}
|
return ServerResponseEntity.success(categoryShopVOList);
|
}
|
|
/**
|
* 批量签约分类
|
* @param categoryShopList
|
* @param shopType
|
* @return
|
*/
|
@PostMapping("/signing/{shopType}")
|
@Operation(summary = "批量签约分类(申请店铺时使用)" , description = "批量签约分类(申请店铺时使用)")
|
public ServerResponseEntity signingCategoryByShopType(@RequestBody List categoryShopList,
|
@PathVariable("shopType") Integer shopType) {
|
Long shopId = shopDetailService.getShopDetailByUserId(SecurityUtils.getUser().getUserId()).getShopId();
|
if (Objects.equals(shopType,SHOP)){
|
categoryShopService.signingCategory(categoryShopList, shopId, false);
|
}else{
|
lifeServiceCategoryService.signingCategory(categoryShopList,shopId,false);
|
}
|
|
return ServerResponseEntity.success();
|
}
|
|
@GetMapping("/info/{categoryId}")
|
@Operation(summary = "根据分类id获取分类信息" , description = "根据分类id获取分类信息")
|
public ServerResponseEntity<Category> info(@PathVariable("categoryId") Long categoryId){
|
// 获取数据库中的分类,如果分类为空则抛异常
|
Category category = categoryService.getCategoryByCategoryIdAndShopId(categoryId, shopDetailService.getShopDetailByUserId(SecurityUtils.getUser().getUserId()).getShopId());
|
if (!Objects.equals(SecurityUtils.getUser().getShopId(), category.getShopId())) {
|
throw new YamiShopBindException("yami.no.auth");
|
}
|
return ServerResponseEntity.success(category);
|
}
|
|
@GetMapping("/getCdnCategory")
|
@Operation(summary = "获取CDN分类信息" , description = "获取CDN分类信息")
|
public ServerResponseEntity<List<Category>> getCdnCategory(){
|
//获取二级分类
|
List<Category> categories = categoryService.listByParentIdAndShopId(342L, 0L, I18nMessage.getDbLang());
|
for(Category categoryTwo : categories) {
|
List<Category> categoriesThree = categoryService.listByParentIdAndShopId(categoryTwo.getCategoryId(),0L, I18nMessage.getDbLang());
|
List<DerivativeCategoryDto> derivativeCategories = mapperFacade.mapAsList(categoriesThree, DerivativeCategoryDto.class);
|
categoryTwo.setCategories(derivativeCategories);
|
}
|
return ServerResponseEntity.success(categories);
|
}
|
|
@SysLog("保存分类")
|
@PostMapping
|
@PreAuthorize("@pms.hasPermission('prod:category:save')")
|
@Operation(summary = "保存分类信息" , description = "保存分类信息")
|
@RedisLock(lockName = "saveCategoryLock",key = "#Category")
|
public ServerResponseEntity<Long> save(@RequestBody Category category){
|
category.setShopId(shopDetailService.getShopDetailByUserId(SecurityUtils.getUser().getUserId()).getShopId());
|
category.setRecTime(new Date());
|
Integer count = categoryService.getCategoryName(category);
|
if(count > 0){
|
// 类目名称已存在!
|
throw new YamiShopBindException("yami.category.name.exist");
|
}
|
category.setSeq(Objects.isNull(category.getSeq()) ? 0 : category.getSeq());
|
categoryService.saveCategroy(category);
|
categoryService.removeCacheByParentIdAndLang(category.getParentId(),category.getShopId(), LanguageEnum.LANGUAGE_ZH_CN.getLang());
|
categoryService.removeCacheByParentIdAndLang(category.getParentId(), category.getShopId(), LanguageEnum.LANGUAGE_EN.getLang());
|
return ServerResponseEntity.success(category.getCategoryId());
|
}
|
|
@SysLog("更新分类")
|
@PutMapping
|
@PreAuthorize("@pms.hasPermission('prod:category:update')")
|
@Operation(summary = "更新分类信息" , description = "更新分类信息")
|
public ServerResponseEntity<String> update(@RequestBody Category category){
|
// 获取数据库中的分类,如果分类为空则抛异常
|
categoryService.getCategoryByCategoryIdAndShopId(category.getCategoryId(),SecurityUtils.getUser().getShopId());
|
category.setShopId(shopDetailService.getShopDetailByUserId(SecurityUtils.getUser().getUserId()).getShopId());
|
Category categoryDb = categoryService.getCategoryByCategoryId(category.getCategoryId());
|
if (Objects.equals(categoryDb.getParentId(), Constant.CATEGORY_ID) && !Objects.equals(category.getParentId(), Constant.CATEGORY_ID)){
|
// 一级分类不能改为二级分类
|
return ServerResponseEntity.showFailMsg(I18nMessage.getMessage("yami.category.one.check"));
|
}else if(Objects.equals(category.getParentId(), Constant.CATEGORY_ID) && !Objects.equals(categoryDb.getParentId(), Constant.CATEGORY_ID)){
|
// 二级分类不能改为一级分类
|
return ServerResponseEntity.showFailMsg(I18nMessage.getMessage("yami.category.two.check"));
|
}
|
if (Objects.equals(category.getParentId(),category.getCategoryId())) {
|
// 分类的上级不能是自己本身
|
return ServerResponseEntity.showFailMsg(I18nMessage.getMessage("yami.category.superior.check"));
|
}
|
Integer count = categoryService.getCategoryName(category);
|
if(count > 0){
|
// 类目名称已存在!
|
throw new YamiShopBindException("yami.category.name.exist");
|
}
|
category.setCategoryName(categoryDb.getCategoryName());
|
category.setOldCategoryName(categoryDb.getCategoryName());
|
category.setOldCategoryNameEn(categoryDb.getCategoryNameEn());
|
categoryService.updateCategroy(category);
|
categoryService.removeCacheByParentIdAndLang(category.getParentId(), category.getShopId(), LanguageEnum.LANGUAGE_ZH_CN.getLang());
|
categoryService.removeCacheByParentIdAndLang(category.getParentId(), category.getShopId(), LanguageEnum.LANGUAGE_EN.getLang());
|
eventPublisher.publishEvent(new EsProductUpdateEvent(category.getCategoryId(), null, EsOperationType.UPDATE_BY_SHOP_CATEGORY_ID));
|
return ServerResponseEntity.success();
|
}
|
|
@SysLog("删除分类")
|
@DeleteMapping("/{categoryId}")
|
@PreAuthorize("@pms.hasPermission('prod:category:delete')")
|
@Operation(summary = "根据分类id删除分类" , description = "根据分类id删除分类")
|
public ServerResponseEntity<String> delete(@PathVariable("categoryId") Long categoryId){
|
int categoryProdCount = productService.count(new LambdaQueryWrapper<Product>().eq(Product::getShopCategoryId, categoryId).ne(Product::getStatus, -1));
|
if (categoryProdCount>0){
|
// 该分类下还有商品,请先删除该分类下的商品
|
return ServerResponseEntity.showFailMsg(I18nMessage.getMessage("yami.category.delete.check"));
|
}
|
|
Category category = categoryService.getCategoryByCategoryIdAndShopId(categoryId,shopDetailService.getShopDetailByUserId(SecurityUtils.getUser().getUserId()).getShopId());
|
categoryService.deleteCategroy(category);
|
categoryService.removeCacheByParentIdAndLang(category.getParentId(), category.getShopId(), LanguageEnum.LANGUAGE_ZH_CN.getLang());
|
categoryService.removeCacheByParentIdAndLang(category.getParentId(), category.getShopId(), LanguageEnum.LANGUAGE_EN.getLang());
|
return ServerResponseEntity.success();
|
}
|
|
@GetMapping("/listCategory")
|
@PreAuthorize("@pms.hasPermission('prod:category:listCategory')")
|
@Operation(summary = "获取一级分类" , description = "获取一级分类")
|
public ServerResponseEntity<List<Category>> listCategory(@ParameterObject Category category){
|
category.setLang(I18nMessage.getLang());
|
category.setGrade(1);
|
category.setShopId(shopDetailService.getShopDetailByUserId(SecurityUtils.getUser().getUserId()).getShopId());
|
List<Category> list = categoryService.categoryLangList(category);
|
return ServerResponseEntity.success(list);
|
}
|
|
@GetMapping("/pageCategory")
|
@PreAuthorize("@pms.hasPermission('prod:category:listCategory')")
|
@Operation(summary = "分页获取一级分类" , description = "分页获取一级分类")
|
public ServerResponseEntity<IPage<Category>> pageCategory(PageParam<Category> page, @ParameterObject Category category){
|
category.setLang(I18nMessage.getLang());
|
category.setGrade(1);
|
category.setShopId(shopDetailService.getShopDetailByUserId(SecurityUtils.getUser().getUserId()).getShopId());
|
IPage<Category> categoryPage = categoryService.pageCategoryLangList(page, category);
|
return ServerResponseEntity.success(categoryPage);
|
}
|
|
@GetMapping("/platformCategory")
|
@Operation(summary = "获取平台所有上架的分类" , description = "获取平台所有上架的分类")
|
public ServerResponseEntity<List<Category>> listCategory(){
|
List<Category> list = categoryService.platformCategory();
|
return ServerResponseEntity.success(list);
|
}
|
|
@PostMapping("/signing")
|
@Operation(summary = "批量签约分类(申请店铺时使用)" , description = "批量签约分类(申请店铺时使用)")
|
public ServerResponseEntity<Void> signingCategory(@RequestBody List<CategoryShop> categoryShopList) {
|
Long shopId = shopDetailService.getShopDetailByUserId(SecurityUtils.getUser().getUserId()).getShopId();
|
categoryShopService.signingCategory(categoryShopList, shopId, false);
|
return ServerResponseEntity.success();
|
}
|
|
@GetMapping("/listSigningCategory")
|
@Operation(summary = "获取签约的分类列表(状态参数为空则返回所有)" , description = "获取签约的分类列表(状态参数为空则返回所有)")
|
@Parameter(name = "status", description = "签约状态:1:已通过 0待审核 -1未通过" )
|
public ServerResponseEntity<List<CategoryShopVO>> listByShopId(@RequestParam(value = "status", required = false) Integer status) {
|
Long shopId = shopDetailService.getShopDetailByUserId(SecurityUtils.getUser().getUserId()).getShopId();
|
List<CategoryShopVO> categoryShopVOList = categoryShopService.listSigningCategoryByShopId(shopId, I18nMessage.getLang());
|
if (Objects.nonNull(status)) {
|
categoryShopVOList = categoryShopVOList.stream().filter(item -> Objects.equals(item.getStatus(), status)).collect(Collectors.toList());
|
}
|
return ServerResponseEntity.success(categoryShopVOList);
|
}
|
|
@GetMapping("/listAvailableSigningCategory")
|
@Schema(description = "获取店铺签约的可用分类列表(发布商品时使用)" )
|
public ServerResponseEntity<List<Category>> listAvailableSigningCategory() {
|
Long shopId = shopDetailService.getShopDetailByUserId(SecurityUtils.getUser().getUserId()).getShopId();
|
List<Category> categories = categoryShopService.listAvailableSigningCategory(shopId, I18nMessage.getLang());
|
return ServerResponseEntity.success(categories);
|
}
|
|
@GetMapping("/shopCategory")
|
@Operation(summary = "获取店铺分类" , description = "获取店铺分类")
|
public ServerResponseEntity<List<CategoryVO>> shopCategory(@RequestParam(value = "categoryType") Integer categoryType){
|
Category category = new Category();
|
category.setLang(I18nMessage.getLang());
|
category.setGrade(1);
|
category.setShopId(1L);
|
category.setCategoryType(categoryType);
|
List<Category> list = categoryService.categoryLangList(category);
|
List<CategoryVO> categoryVOS = mapperFacade.mapAsList(list, CategoryVO.class);
|
return ServerResponseEntity.success(categoryVOS);
|
}
|
|
|
@GetMapping("/export")
|
@PreAuthorize("@pms.hasPermission('prod:category:export')")
|
@Operation(summary = "导出分类" , description = "导出分类")
|
public void export(HttpServletResponse response) {
|
Long shopId = shopDetailService.getShopDetailByUserId(SecurityUtils.getUser().getUserId()).getShopId();
|
categoryExcelService.export(response, shopId);
|
}
|
|
}
|