前台商品、品牌接口完善

This commit is contained in:
macro 2020-05-23 16:29:46 +08:00
parent 6ff6d4c92f
commit 5f4a378347
11 changed files with 443 additions and 0 deletions

View File

@ -0,0 +1,60 @@
package com.macro.mall.portal.controller;
import com.macro.mall.common.api.CommonPage;
import com.macro.mall.common.api.CommonResult;
import com.macro.mall.model.PmsProduct;
import com.macro.mall.portal.domain.PmsPortalProductDetail;
import com.macro.mall.portal.domain.PmsProductCategoryNode;
import com.macro.mall.portal.service.PmsPortalProductService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 前台商品管理Controller
* Created by macro on 2020/4/6.
*/
@Controller
@Api(tags = "PmsPortalProductController", description = "前台商品管理")
@RequestMapping("/product")
public class PmsPortalProductController {
@Autowired
private PmsPortalProductService portalProductService;
@ApiOperation(value = "综合搜索、筛选、排序")
@ApiImplicitParam(name = "sort", value = "排序字段:0->按相关度1->按新品2->按销量3->价格从低到高4->价格从高到低",
defaultValue = "0", allowableValues = "0,1,2,3,4", paramType = "query", dataType = "integer")
@RequestMapping(value = "/search", method = RequestMethod.GET)
@ResponseBody
public CommonResult<CommonPage<PmsProduct>> search(@RequestParam(required = false) String keyword,
@RequestParam(required = false) Long brandId,
@RequestParam(required = false) Long productCategoryId,
@RequestParam(required = false, defaultValue = "0") Integer pageNum,
@RequestParam(required = false, defaultValue = "5") Integer pageSize,
@RequestParam(required = false, defaultValue = "0") Integer sort) {
List<PmsProduct> productList = portalProductService.search(keyword, brandId, productCategoryId, pageNum, pageSize, sort);
return CommonResult.success(CommonPage.restPage(productList));
}
@ApiOperation("以树形结构获取所有商品分类")
@RequestMapping(value = "/categoryTreeList", method = RequestMethod.GET)
@ResponseBody
public CommonResult<List<PmsProductCategoryNode>> categoryTreeList() {
List<PmsProductCategoryNode> list = portalProductService.categoryTreeList();
return CommonResult.success(list);
}
@ApiOperation("获取前台商品详情")
@RequestMapping(value = "/detail/{id}", method = RequestMethod.GET)
@ResponseBody
public CommonResult<PmsPortalProductDetail> detail(@PathVariable Long id) {
PmsPortalProductDetail productDetail = portalProductService.detail(id);
return CommonResult.success(productDetail);
}
}

View File

@ -0,0 +1,54 @@
package com.macro.mall.portal.controller;
import com.macro.mall.common.api.CommonPage;
import com.macro.mall.common.api.CommonResult;
import com.macro.mall.model.PmsBrand;
import com.macro.mall.model.PmsProduct;
import com.macro.mall.portal.service.PortalBrandService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 首页品牌推荐管理Controller
* Created by macro on 2020/5/15.
*/
@Controller
@Api(tags = "PortalBrandController", description = "前台品牌管理")
@RequestMapping("/brand")
public class PortalBrandController {
@Autowired
private PortalBrandService homeBrandService;
@ApiOperation("分页获取推荐品牌")
@RequestMapping(value = "/recommendList", method = RequestMethod.GET)
@ResponseBody
public CommonResult<List<PmsBrand>> recommendList(@RequestParam(value = "pageSize", defaultValue = "6") Integer pageSize,
@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) {
List<PmsBrand> brandList = homeBrandService.recommendList(pageNum, pageSize);
return CommonResult.success(brandList);
}
@ApiOperation("获取品牌详情")
@RequestMapping(value = "/detail/{brandId}", method = RequestMethod.GET)
@ResponseBody
public CommonResult<PmsBrand> detail(@PathVariable Long brandId) {
PmsBrand brand = homeBrandService.detail(brandId);
return CommonResult.success(brand);
}
@ApiOperation("分页获取品牌相关商品")
@RequestMapping(value = "/productList", method = RequestMethod.GET)
@ResponseBody
public CommonResult<CommonPage<PmsProduct>> productList(@RequestParam Long brandId,
@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize", defaultValue = "6") Integer pageSize) {
CommonPage<PmsProduct> result = homeBrandService.productList(brandId,pageNum, pageSize);
return CommonResult.success(result);
}
}

View File

@ -1,5 +1,6 @@
package com.macro.mall.portal.dao;
import com.macro.mall.model.SmsCoupon;
import com.macro.mall.portal.domain.CartProduct;
import com.macro.mall.portal.domain.PromotionProduct;
import org.apache.ibatis.annotations.Param;
@ -13,4 +14,5 @@ import java.util.List;
public interface PortalProductDao {
CartProduct getCartProduct(@Param("id") Long id);
List<PromotionProduct> getPromotionProductList(@Param("ids") List<Long> ids);
List<SmsCoupon> getAvailableCouponList(@Param("productId") Long productId,@Param("productCategoryId")Long productCategoryId);
}

View File

@ -0,0 +1,33 @@
package com.macro.mall.portal.domain;
import com.macro.mall.model.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* 前台商品详情
* Created by macro on 2020/4/6.
*/
@Getter
@Setter
public class PmsPortalProductDetail{
@ApiModelProperty("商品信息")
private PmsProduct product;
@ApiModelProperty("商品品牌")
private PmsBrand brand;
@ApiModelProperty("商品属性与参数")
private List<PmsProductAttribute> productAttributeList;
@ApiModelProperty("手动录入的商品属性与参数值")
private List<PmsProductAttributeValue> productAttributeValueList;
@ApiModelProperty("商品的sku库存信息")
private List<PmsSkuStock> skuStockList;
@ApiModelProperty("商品阶梯价格设置")
private List<PmsProductLadder> productLadderList;
@ApiModelProperty("商品满减价格设置")
private List<PmsProductFullReduction> productFullReductionList;
@ApiModelProperty("商品可用优惠券")
private List<SmsCoupon> couponList;
}

View File

@ -0,0 +1,17 @@
package com.macro.mall.portal.domain;
import com.macro.mall.model.PmsProductCategory;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* 商品分类包含子分类
* Created by macro on 2020/4/6.
*/
@Getter
@Setter
public class PmsProductCategoryNode extends PmsProductCategory {
private List<PmsProductCategoryNode> children;
}

View File

@ -0,0 +1,28 @@
package com.macro.mall.portal.service;
import com.macro.mall.model.PmsProduct;
import com.macro.mall.portal.domain.PmsPortalProductDetail;
import com.macro.mall.portal.domain.PmsProductCategoryNode;
import java.util.List;
/**
* 前台商品管理Service
* Created by macro on 2020/4/6.
*/
public interface PmsPortalProductService {
/**
* 综合搜索商品
*/
List<PmsProduct> search(String keyword, Long brandId, Long productCategoryId, Integer pageNum, Integer pageSize, Integer sort);
/**
* 以树形结构获取所有商品分类
*/
List<PmsProductCategoryNode> categoryTreeList();
/**
* 获取前台商品详情
*/
PmsPortalProductDetail detail(Long id);
}

View File

@ -0,0 +1,28 @@
package com.macro.mall.portal.service;
import com.macro.mall.common.api.CommonPage;
import com.macro.mall.model.PmsBrand;
import com.macro.mall.model.PmsProduct;
import java.util.List;
/**
* 前台品牌管理Service
* Created by macro on 2020/5/15.
*/
public interface PortalBrandService {
/**
* 分页获取推荐品牌
*/
List<PmsBrand> recommendList(Integer pageNum, Integer pageSize);
/**
* 获取品牌详情
*/
PmsBrand detail(Long brandId);
/**
* 分页获取品牌关联商品
*/
CommonPage<PmsProduct> productList(Long brandId, Integer pageNum, Integer pageSize);
}

View File

@ -0,0 +1,142 @@
package com.macro.mall.portal.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.PageHelper;
import com.macro.mall.mapper.*;
import com.macro.mall.model.*;
import com.macro.mall.portal.dao.PortalProductDao;
import com.macro.mall.portal.domain.PmsPortalProductDetail;
import com.macro.mall.portal.domain.PmsProductCategoryNode;
import com.macro.mall.portal.service.PmsPortalProductService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
/**
* 前台订单管理Service实现类
* Created by macro on 2020/4/6.
*/
@Service
public class PmsPortalProductServiceImpl implements PmsPortalProductService {
@Autowired
private PmsProductMapper productMapper;
@Autowired
private PmsProductCategoryMapper productCategoryMapper;
@Autowired
private PmsBrandMapper brandMapper;
@Autowired
private PmsProductAttributeMapper productAttributeMapper;
@Autowired
private PmsProductAttributeValueMapper productAttributeValueMapper;
@Autowired
private PmsSkuStockMapper skuStockMapper;
@Autowired
private PmsProductLadderMapper productLadderMapper;
@Autowired
private PmsProductFullReductionMapper productFullReductionMapper;
@Autowired
private PortalProductDao portalProductDao;
@Override
public List<PmsProduct> search(String keyword, Long brandId, Long productCategoryId, Integer pageNum, Integer pageSize, Integer sort) {
PageHelper.startPage(pageNum, pageSize);
PmsProductExample example = new PmsProductExample();
PmsProductExample.Criteria criteria = example.createCriteria();
criteria.andDeleteStatusEqualTo(0);
if (StrUtil.isNotEmpty(keyword)) {
criteria.andNameLike("%" + keyword + "%");
}
if (brandId != null) {
criteria.andBrandIdEqualTo(brandId);
}
if (productCategoryId != null) {
criteria.andProductCategoryIdEqualTo(productCategoryId);
}
//1->按新品2->按销量3->价格从低到高4->价格从高到低
if (sort == 1) {
example.setOrderByClause("id desc");
} else if (sort == 2) {
example.setOrderByClause("sale desc");
} else if (sort == 3) {
example.setOrderByClause("price asc");
} else if (sort == 4) {
example.setOrderByClause("price desc");
}
return productMapper.selectByExample(example);
}
@Override
public List<PmsProductCategoryNode> categoryTreeList() {
PmsProductCategoryExample example = new PmsProductCategoryExample();
List<PmsProductCategory> allList = productCategoryMapper.selectByExample(example);
List<PmsProductCategoryNode> result = allList.stream()
.filter(item -> item.getParentId().equals(0L))
.map(item -> covert(item, allList)).collect(Collectors.toList());
return result;
}
@Override
public PmsPortalProductDetail detail(Long id) {
PmsPortalProductDetail result = new PmsPortalProductDetail();
//获取商品信息
PmsProduct product = productMapper.selectByPrimaryKey(id);
result.setProduct(product);
//获取品牌信息
PmsBrand brand = brandMapper.selectByPrimaryKey(product.getBrandId());
result.setBrand(brand);
//获取商品属性信息
PmsProductAttributeExample attributeExample = new PmsProductAttributeExample();
attributeExample.createCriteria().andProductAttributeCategoryIdEqualTo(product.getProductAttributeCategoryId());
List<PmsProductAttribute> productAttributeList = productAttributeMapper.selectByExample(attributeExample);
result.setProductAttributeList(productAttributeList);
//获取商品属性值信息
if(CollUtil.isNotEmpty(productAttributeList)){
List<Long> attributeIds = productAttributeList.stream().map(PmsProductAttribute::getId).collect(Collectors.toList());
PmsProductAttributeValueExample attributeValueExample = new PmsProductAttributeValueExample();
attributeValueExample.createCriteria().andProductIdEqualTo(product.getId())
.andProductAttributeIdIn(attributeIds);
List<PmsProductAttributeValue> productAttributeValueList = productAttributeValueMapper.selectByExample(attributeValueExample);
result.setProductAttributeValueList(productAttributeValueList);
}
//获取商品SKU库存信息
PmsSkuStockExample skuExample = new PmsSkuStockExample();
skuExample.createCriteria().andProductIdEqualTo(product.getId());
List<PmsSkuStock> skuStockList = skuStockMapper.selectByExample(skuExample);
result.setSkuStockList(skuStockList);
//商品阶梯价格设置
if(product.getPromotionType()==3){
PmsProductLadderExample ladderExample = new PmsProductLadderExample();
ladderExample.createCriteria().andProductIdEqualTo(product.getId());
List<PmsProductLadder> productLadderList = productLadderMapper.selectByExample(ladderExample);
result.setProductLadderList(productLadderList);
}
//商品满减价格设置
if(product.getPromotionType()==4){
PmsProductFullReductionExample fullReductionExample = new PmsProductFullReductionExample();
fullReductionExample.createCriteria().andProductIdEqualTo(product.getId());
List<PmsProductFullReduction> productFullReductionList = productFullReductionMapper.selectByExample(fullReductionExample);
result.setProductFullReductionList(productFullReductionList);
}
//商品可用优惠券
result.setCouponList(portalProductDao.getAvailableCouponList(product.getId(),product.getProductCategoryId()));
return result;
}
/**
* 初始对象转化为节点对象
*/
private PmsProductCategoryNode covert(PmsProductCategory item, List<PmsProductCategory> allList) {
PmsProductCategoryNode node = new PmsProductCategoryNode();
BeanUtils.copyProperties(item, node);
List<PmsProductCategoryNode> children = allList.stream()
.filter(subItem -> subItem.getParentId().equals(item.getId()))
.map(subItem -> covert(subItem, allList)).collect(Collectors.toList());
node.setChildren(children);
return node;
}
}

View File

@ -0,0 +1,50 @@
package com.macro.mall.portal.service.impl;
import com.github.pagehelper.PageHelper;
import com.macro.mall.common.api.CommonPage;
import com.macro.mall.mapper.PmsBrandMapper;
import com.macro.mall.mapper.PmsProductMapper;
import com.macro.mall.model.PmsBrand;
import com.macro.mall.model.PmsProduct;
import com.macro.mall.model.PmsProductExample;
import com.macro.mall.portal.dao.HomeDao;
import com.macro.mall.portal.service.PortalBrandService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 前台品牌管理Service实现类
* Created by macro on 2020/5/15.
*/
@Service
public class PortalBrandServiceImpl implements PortalBrandService {
@Autowired
private HomeDao homeDao;
@Autowired
private PmsBrandMapper brandMapper;
@Autowired
private PmsProductMapper productMapper;
@Override
public List<PmsBrand> recommendList(Integer pageNum, Integer pageSize) {
int offset = (pageNum - 1) * pageSize;
return homeDao.getRecommendBrandList(offset, pageSize);
}
@Override
public PmsBrand detail(Long brandId) {
return brandMapper.selectByPrimaryKey(brandId);
}
@Override
public CommonPage<PmsProduct> productList(Long brandId, Integer pageNum, Integer pageSize) {
PageHelper.startPage(pageNum,pageSize);
PmsProductExample example = new PmsProductExample();
example.createCriteria().andDeleteStatusEqualTo(0)
.andBrandIdEqualTo(brandId);
List<PmsProduct> productList = productMapper.selectByExample(example);
return CommonPage.restPage(productList);
}
}

View File

@ -29,6 +29,8 @@ secure:
- /actuator/**
- /sso/**
- /home/**
- /product/**
- /brand/**
# 自定义redis key
redis:

View File

@ -72,4 +72,31 @@
#{id}
</foreach>
</select>
<select id="getAvailableCouponList" resultMap="com.macro.mall.mapper.SmsCouponMapper.BaseResultMap">
SELECT *
FROM sms_coupon
WHERE use_type = 0
AND start_time &lt; NOW()
AND end_time &gt; NOW()
UNION
(
SELECT c.*
FROM sms_coupon_product_category_relation cpc
LEFT JOIN sms_coupon c ON cpc.coupon_id = c.id
WHERE c.use_type = 1
AND c.start_time &lt; NOW()
AND c.end_time &gt; NOW()
AND cpc.product_category_id = #{productCategoryId}
)
UNION
(
SELECT c.*
FROM sms_coupon_product_relation cp
LEFT JOIN sms_coupon c ON cp.coupon_id = c.id
WHERE c.use_type = 2
AND c.start_time &lt; NOW()
AND c.end_time &gt; NOW()
AND cp.product_id = #{productId}
)
</select>
</mapper>