فهرست منبع

前台商品、品牌接口完善

macro 4 سال پیش
والد
کامیت
5f4a378347

+ 60 - 0
mall-portal/src/main/java/com/macro/mall/portal/controller/PmsPortalProductController.java

@@ -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);
+    }
+}

+ 54 - 0
mall-portal/src/main/java/com/macro/mall/portal/controller/PortalBrandController.java

@@ -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);
+    }
+}

+ 2 - 0
mall-portal/src/main/java/com/macro/mall/portal/dao/PortalProductDao.java

@@ -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);
 }

+ 33 - 0
mall-portal/src/main/java/com/macro/mall/portal/domain/PmsPortalProductDetail.java

@@ -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;
+}

+ 17 - 0
mall-portal/src/main/java/com/macro/mall/portal/domain/PmsProductCategoryNode.java

@@ -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;
+}

+ 28 - 0
mall-portal/src/main/java/com/macro/mall/portal/service/PmsPortalProductService.java

@@ -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);
+}

+ 28 - 0
mall-portal/src/main/java/com/macro/mall/portal/service/PortalBrandService.java

@@ -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);
+}

+ 142 - 0
mall-portal/src/main/java/com/macro/mall/portal/service/impl/PmsPortalProductServiceImpl.java

@@ -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;
+    }
+}

+ 50 - 0
mall-portal/src/main/java/com/macro/mall/portal/service/impl/PortalBrandServiceImpl.java

@@ -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);
+    }
+}

+ 2 - 0
mall-portal/src/main/resources/application.yml

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

+ 27 - 0
mall-portal/src/main/resources/dao/PortalProductDao.xml

@@ -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>