Selaa lähdekoodia

组合商品与再次购买

chao 4 vuotta sitten
vanhempi
commit
e96850ece0

+ 25 - 72
src/main/java/com/caimei365/commodity/components/PriceUtilService.java

@@ -4,8 +4,10 @@ package com.caimei365.commodity.components;
 import com.caimei365.commodity.mapper.PriceMapper;
 import com.caimei365.commodity.mapper.PromotionsMapper;
 import com.caimei365.commodity.model.vo.*;
+import com.caimei365.commodity.utils.ImageUtils;
 import com.caimei365.commodity.utils.MathUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -26,6 +28,8 @@ public class PriceUtilService {
     private PriceMapper priceMapper;
     @Resource
     private PromotionsMapper promotionsMapper;
+    @Value("${caimei.wwwDomain}")
+    private String domain;
     /**
      * 根据价格返回价格等级
      * @param price 价格
@@ -54,7 +58,7 @@ public class PriceUtilService {
     public void setLadderPriceList(List<LadderPriceVo> ladderPrices, TaxVo tax) {
         IntStream.range(0, ladderPrices.size()).forEach(i -> {
             //税费标志
-            boolean taxFlag = "0".equals(tax.getIncludedTax()) && ("1".equals(tax.getInvoiceType()) || "2".equals(tax.getInvoiceType()));
+            boolean taxFlag = 0 == tax.getIncludedTax() && 1 == tax.getInvoiceType() || 2 == tax.getInvoiceType();
             //添加税费
             if (taxFlag) {
                 BigDecimal taxFee = MathUtil.div(MathUtil.mul(ladderPrices.get(i).getBuyPrice(), tax.getTaxPoint()), 100);
@@ -148,79 +152,28 @@ public class PriceUtilService {
         price.setCostPrice(0d);
     }
 
-        /**
-     * 根据用户id设置详细价格
-     *
-     * @param product 商品价格类
-     * @param userId 用户Id
+    /**
+     * 设置商品主图及价格
+     * @param userId  用户Id
+     * @param product ProductItemVo
      */
-    public void setItemPriceByUserId(ProductItemVo product, Integer userId) {
+    public void setProductDetails(Integer userId, ProductItemVo product) {
+        // 设置图片
+        product.setImage(ImageUtils.getImageURL("product", product.getImage(), 0, domain));
         // 设置价格等级
         product.setPriceGrade(getPriceGrade(product.getPrice()));
-        // 根据用户Id查询用户身份
-        Integer identity = priceMapper.getIdentityByUserId(userId);
-        if (null != identity && identity > 0) {
-            // 用户身份: 2-会员机构, 4-普通机构
-            product.setUserIdentity(identity);
-            // 默认非促销活动状态
-            product.setActStatus(0);
-            // 设置划线价
-            product.setOriginalPrice(product.getPrice());
-            //税费标志
-            boolean taxFlag = "0".equals(product.getIncludedTax()) && ("1".equals(product.getInvoiceType()) || "2".equals(product.getInvoiceType()));
-            // 根据商品id查询商品活动
-            PromotionsVo promotions = promotionsMapper.getPromotionsByProductId(product.getProductId());
-            if (null != promotions) {
-                // 促销活动
-                product.setActStatus(1);
-                product.setLadderPriceFlag(0);
-                if (promotions.getMode() == 3) {
-                    // 获取赠品
-                    List<ProductItemVo> giftList = promotionsMapper.getPromotionGifts(promotions.getId());
-                    promotions.setGiftList(giftList);
-                }
-                if (promotions.getType() == 1 && promotions.getMode() == 1 && null != promotions.getTouchPrice()) {
-                    product.setPrice(promotions.getTouchPrice());
-                    //添加税费
-                    if (taxFlag) {
-                        BigDecimal taxFee = MathUtil.div(MathUtil.mul(promotions.getTouchPrice(), product.getTaxRate()), 100);
-                        promotions.setTouchPrice(MathUtil.add(promotions.getTouchPrice(),taxFee).doubleValue());
-                    }
-                }
-                product.setPromotions(promotions);
-            } else {
-                if (null != userId) {
-                    if (1 == product.getLadderPriceFlag()) {
-                        // 阶梯价
-                        LadderPriceVo lowerPrice = priceMapper.findLowerLadderPrice(product.getProductId());
-                        LadderPriceVo lowerBuyNum = priceMapper.findMaxLadderPrice(product.getProductId());
-                        if (null != lowerPrice) {
-                            product.setPrice(lowerPrice.getBuyPrice());
-                            if (null != lowerBuyNum){
-                                product.setMin(lowerBuyNum.getBuyNum());
-                            }
-                        } else {
-                            product.setLadderPriceFlag(0);
-                        }
-                    } else {
-                        // 复购价
-                        Double repurchase = priceMapper.getRepurchasePrice(product.getProductId(), userId);
-                        if (null != repurchase && repurchase > 0) {
-                            product.setPrice(repurchase);
-                            product.setLadderPriceFlag(0);
-                        }
-                    }
-                }
-            }
-            //添加税费
-            if (taxFlag) {
-                BigDecimal thisTaxFee = MathUtil.div(MathUtil.mul(product.getPrice(), product.getTaxRate()), 100);
-                product.setPrice(MathUtil.add(product.getPrice(), thisTaxFee).doubleValue());
-            }
-        } else {
-            product.setPrice(0d);
-            product.setOriginalPrice(0d);
-            product.setUserIdentity(0);
-        }
+        // 数据库获取基本价格信息
+        PriceVo price = priceMapper.getDetailPrice(product.getProductId());
+        // 根据用户id设置详细价格
+        setPriceByUserId(price, userId);
+        // 设置价格
+        product.setActStatus(price.getActStatus());
+        product.setPrice(price.getPrice());
+        product.setOriginalPrice(price.getOriginalPrice());
+        product.setLadderPriceFlag(price.getLadderPriceFlag());
+        product.setPromotions(price.getPromotions());
+        product.setMin(price.getMinBuyNumber());
+        product.setUserIdentity(price.getUserIdentity());
     }
+
 }

+ 19 - 5
src/main/java/com/caimei365/commodity/controller/ProductPageApi.java

@@ -1,10 +1,7 @@
 package com.caimei365.commodity.controller;
 
 import com.caimei365.commodity.model.ResponseJson;
-import com.caimei365.commodity.model.vo.BigTypeVo;
-import com.caimei365.commodity.model.vo.BrandVo;
-import com.caimei365.commodity.model.vo.ProductDetailVo;
-import com.caimei365.commodity.model.vo.ProductFormVo;
+import com.caimei365.commodity.model.vo.*;
 import com.caimei365.commodity.service.PageService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -13,6 +10,7 @@ import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
@@ -109,5 +107,21 @@ public class ProductPageApi {
         return pageService.getProductDetails(productId, userId);
     }
 
-
+    /**
+     * 再次购买商品列表
+     *
+     * @param userId 用户Id
+     */
+    @ApiOperation("再次购买商品列表(旧:/repeat/buyAgain)")
+    @ApiImplicitParams({
+        @ApiImplicitParam(required = false, name = "userId", value = "用户Id"),
+        @ApiImplicitParam(required = false, name = "pageNum", value = "页码"),
+        @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
+    })
+    @GetMapping("/product/repeat")
+    public ResponseJson<PaginationVo<ProductItemVo>> getBuyAgainProducts(Integer userId,
+                                                                         @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                                         @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
+        return pageService.getBuyAgainProducts(userId, pageNum, pageSize);
+    }
 }

+ 65 - 0
src/main/java/com/caimei365/commodity/controller/ProductSellerApi.java

@@ -0,0 +1,65 @@
+package com.caimei365.commodity.controller;
+
+import com.caimei365.commodity.model.ResponseJson;
+import com.caimei365.commodity.model.vo.CombinationVo;
+import com.caimei365.commodity.model.vo.PaginationVo;
+import com.caimei365.commodity.model.vo.ProductItemVo;
+import com.caimei365.commodity.service.SellerService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/4/23
+ */
+@Api(tags="协销商品API")
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/commodity/seller")
+public class ProductSellerApi {
+    private final SellerService sellerService;
+
+    /**
+     * 协销搜索商品(单一)
+     */
+    @ApiOperation("协销搜索单一商品(旧:/seller/product/search)")
+    @ApiImplicitParams({
+        @ApiImplicitParam(required = false, name = "searchWord", value = "搜索关键字"),
+        @ApiImplicitParam(required = false, name = "clubUserId", value = "机构用户Id"),
+        @ApiImplicitParam(required = false, name = "pageNum", value = "页码"),
+        @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
+    })
+    @GetMapping("/product/single")
+    public ResponseJson<PaginationVo<ProductItemVo>> searchSingleProducts(String searchWord, Integer clubUserId,
+                                                                            @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                                            @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
+        return sellerService.searchSingleProducts(searchWord, clubUserId, pageNum, pageSize);
+    }
+
+    /**
+     * 协销搜索商品(组合)
+     */
+    @ApiOperation("协销搜索组合商品(旧:/seller/combinationProduct/search)")
+    @ApiImplicitParams({
+        @ApiImplicitParam(required = false, name = "searchWord", value = "搜索关键字"),
+        @ApiImplicitParam(required = false, name = "clubUserId", value = "机构用户Id"),
+        @ApiImplicitParam(required = false, name = "pageNum", value = "页码"),
+        @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
+    })
+    @GetMapping("/product/combination")
+    public ResponseJson<PaginationVo<CombinationVo>> searchCombinationProducts(String searchWord, Integer clubUserId,
+                                                                               @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                                               @RequestParam(value = "pageSize", defaultValue = "5") int pageSize) {
+        return sellerService.searchCombinationProducts(searchWord, clubUserId, pageNum, pageSize);
+    }
+
+}

+ 0 - 2
src/main/java/com/caimei365/commodity/controller/ProductShopApi.java

@@ -10,11 +10,9 @@ import com.caimei365.commodity.model.search.ProductListVo;
 import com.caimei365.commodity.model.vo.BrandVo;
 import com.caimei365.commodity.model.vo.PaginationVo;
 import com.caimei365.commodity.model.vo.ProductFormVo;
-import com.caimei365.commodity.model.vo.SecondListVo;
 import com.caimei365.commodity.service.ShopService;
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;

+ 5 - 0
src/main/java/com/caimei365/commodity/mapper/PageMapper.java

@@ -77,4 +77,9 @@ public interface PageMapper {
      * 商品详情页
      */
     ProductDetailVo getProductDetails(Integer productId);
+    /**
+     * 再次购买
+     * @param userId 用户Id
+     */
+    List<ProductItemVo> getBuyAgainProducts(Integer userId);
 }

+ 32 - 0
src/main/java/com/caimei365/commodity/mapper/SellerMapper.java

@@ -0,0 +1,32 @@
+package com.caimei365.commodity.mapper;
+
+import com.caimei365.commodity.model.vo.CombinationVo;
+import com.caimei365.commodity.model.vo.ProductItemVo;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/4/23
+ */
+@Mapper
+public interface SellerMapper {
+    /**
+     * 根据关键词获取协销单一商品列表
+     * @param searchWord 关键词
+     */
+    List<ProductItemVo> getSingleProductList(String searchWord);
+    /**
+     * 根据关键词获取协销组合商品列表
+     * @param searchWord 关键词
+     */
+    List<CombinationVo> getCombinationList(String searchWord);
+    /**
+     * 获取组合对应的商品集合
+     * @param id 组合id
+     */
+    List<ProductItemVo> getCombinationProductList(Integer id);
+}

+ 49 - 0
src/main/java/com/caimei365/commodity/model/vo/CombinationVo.java

@@ -0,0 +1,49 @@
+package com.caimei365.commodity.model.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/4/25
+ */
+@Data
+public class CombinationVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	private Integer id;
+	/**
+	 * 组合名称
+	 */
+	private String name;
+	/**
+	 * 添加时间
+	 */
+	private Date addTime;
+	/**
+	 * 更新时间
+	 */
+	private Date updateTime;
+	/**
+	 * 组合商品list
+	 */
+	private List<ProductItemVo> combinationProductList;
+	/**
+	 * 组合里面的商品种类
+	 */
+	private  Integer productKind;
+	/**
+	 * 组合里面选中的商品总数量
+	 */
+	private  Integer productTotalNum;
+    /**
+	 * 组合里面选中的商品总金额
+	 */
+	private BigDecimal productTotalAmount;
+}

+ 4 - 1
src/main/java/com/caimei365/commodity/model/vo/ProductDetailVo.java

@@ -265,5 +265,8 @@ public class ProductDetailVo implements Serializable {
      * 促销活动
      */
     private PromotionsVo promotions;
-
+    /**
+     * 用户身份: 2-会员机构, 4-普通机构
+     */
+    private Integer userIdentity;
 }

+ 24 - 0
src/main/java/com/caimei365/commodity/model/vo/ProductItemVo.java

@@ -45,6 +45,14 @@ public class ProductItemVo implements Serializable {
     private Integer beautyActFlag;
     /** 商品原价 */
     private Double originalPrice;
+    /**
+     * 成本价选中标志:1固定成本 2比例成
+     */
+    private Integer costCheckFlag;
+    /**
+     * 固定成本价
+     */
+    private Double costPrice;
     /** 购买数量 */
     private Integer number;
     /** 是否是赠品 2是,其他否 */
@@ -73,6 +81,10 @@ public class ProductItemVo implements Serializable {
     private String productCode;
     /** 商品是否默认选中 */
     private Boolean productsChecked = false;
+    /**
+     * 成本大于复购价 或 当前机构价小于复购价
+     */
+    private Boolean repurchasePriceState = false;
     /** 是否含税 0不含税,1含税,2未知 */
     private String includedTax;
     /** 发票类型(基于是否含税基础) 1增值税票,2普通票, 3不能开票 */
@@ -115,4 +127,16 @@ public class ProductItemVo implements Serializable {
      * 三级分类Id
      */
     private Integer tinyTypeId;
+    /**
+     * 初始化商品数量0,提供前端使用(组合商品)
+     */
+    private Integer initProductNum;
+    /**
+     * 初始化商品总金额,提供前端使用(组合商品)
+     */
+    private Double totalPrice;
+    /**
+     * 再次购买价格
+     */
+    private Double discountPrice;
 }

+ 8 - 4
src/main/java/com/caimei365/commodity/service/PageService.java

@@ -1,10 +1,7 @@
 package com.caimei365.commodity.service;
 
 import com.caimei365.commodity.model.ResponseJson;
-import com.caimei365.commodity.model.vo.BigTypeVo;
-import com.caimei365.commodity.model.vo.BrandVo;
-import com.caimei365.commodity.model.vo.ProductDetailVo;
-import com.caimei365.commodity.model.vo.ProductFormVo;
+import com.caimei365.commodity.model.vo.*;
 
 import java.util.List;
 import java.util.Map;
@@ -53,4 +50,11 @@ public interface PageService {
      * @param userId    用户Id
      */
     ResponseJson<ProductDetailVo> getProductDetails(Integer productId, Integer userId);
+
+    /**
+     * 再次购买商品列表
+     *
+     * @param userId    用户Id
+     */
+    ResponseJson<PaginationVo<ProductItemVo>> getBuyAgainProducts(Integer userId, int pageNum, int pageSize);
 }

+ 32 - 0
src/main/java/com/caimei365/commodity/service/SellerService.java

@@ -0,0 +1,32 @@
+package com.caimei365.commodity.service;
+
+import com.caimei365.commodity.model.ResponseJson;
+import com.caimei365.commodity.model.vo.CombinationVo;
+import com.caimei365.commodity.model.vo.PaginationVo;
+import com.caimei365.commodity.model.vo.ProductItemVo;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/4/23
+ */
+public interface SellerService {
+    /**
+     * 协销搜索商品(单一)
+     * @param searchWord  搜索关键字
+     * @param clubUserId  机构用户Id
+     * @param pageNum     页码
+     * @param pageSize    每页数量
+     */
+    ResponseJson<PaginationVo<ProductItemVo>> searchSingleProducts(String searchWord, Integer clubUserId, int pageNum, int pageSize);
+
+    /**
+     * 协销搜索商品(组合)
+     * @param searchWord  搜索关键字
+     * @param clubUserId  机构用户Id
+     * @param pageNum     页码
+     * @param pageSize    每页数量
+     */
+    ResponseJson<PaginationVo<CombinationVo>> searchCombinationProducts(String searchWord, Integer clubUserId, int pageNum, int pageSize);
+}

+ 37 - 7
src/main/java/com/caimei365/commodity/service/impl/PageServiceImpl.java

@@ -13,6 +13,8 @@ import com.caimei365.commodity.service.PageService;
 import com.caimei365.commodity.utils.AppletsLinkUtil;
 import com.caimei365.commodity.utils.ImageUtils;
 import com.caimei365.commodity.components.PriceUtilService;
+import com.caimei365.commodity.utils.MathUtil;
+import com.github.pagehelper.PageHelper;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
@@ -22,8 +24,6 @@ import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.util.*;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
  * Description
@@ -53,7 +53,7 @@ public class PageServiceImpl implements PageService {
      * @param source   请求来源:www,crm
      */
     @Override
-    // @Cacheable(value = "getClassify", key = "#typeSort +'-'+ #source", unless = "#result == null")
+    @Cacheable(value = "getClassify", key = "#typeSort +'-'+ #source", unless = "#result == null")
     public ResponseJson<List<BigTypeVo>> getClassify(Integer typeSort, String source) {
         List<BigTypeVo> bigTypeList = productTypeMapper.getBigTypeList(typeSort,source);
         bigTypeList.forEach(bigType -> {
@@ -88,7 +88,7 @@ public class PageServiceImpl implements PageService {
      * @param source 来源:1网站,2小程序
      */
     @Override
-    // @Cacheable(value = "instrumentData", key = "#pageId+'-'+#userId+'-'+#source", unless = "#result == null")
+    @Cacheable(value = "instrumentData", key = "#pageId+'-'+#userId+'-'+#source", unless = "#result == null")
     public ResponseJson<Map<String, Object>> getClassifyData(Integer pageId, Integer userId, Integer source) {
         source = source == null ? 1 : source;
         Map<String, Object> map = new HashMap<>(3);
@@ -115,7 +115,7 @@ public class PageServiceImpl implements PageService {
      * @param userId 用户id
      * @param source 来源:1网站,2小程序
      */
-    //@Cacheable(value = "getHomeFloorData", key = "#userId +'-'+ #source", unless = "#result == null")
+    @Cacheable(value = "getHomeFloorData", key = "#userId +'-'+ #source", unless = "#result == null")
     @Override
     public ResponseJson<Map<String, Object>> getHomeData(Integer userId, Integer source) {
         Map<String, Object> map = new HashMap<>(2);
@@ -272,10 +272,40 @@ public class PageServiceImpl implements PageService {
             product.setLadderPriceFlag(price.getLadderPriceFlag());
             product.setPromotions(price.getPromotions());
             product.setMinBuyNumber(price.getMinBuyNumber());
+            product.setUserIdentity(price.getUserIdentity());
         }
         return ResponseJson.success(product);
     }
 
+    /**
+     * 再次购买商品列表
+     *
+     * @param userId   用户Id
+     * @param pageNum
+     * @param pageSize
+     */
+    @Override
+    public ResponseJson<PaginationVo<ProductItemVo>> getBuyAgainProducts(Integer userId, int pageNum, int pageSize) {
+        if (null == userId) {
+            return ResponseJson.error("参数错误:用户Id不能为空!", null);
+        }
+        PageHelper.startPage(pageNum, pageSize);
+        List<ProductItemVo> productList = pageMapper.getBuyAgainProducts(userId);
+        productList.forEach(product -> {
+            double price = product.getPrice();
+            double costPrice = product.getCostPrice();
+            double discountPrice = product.getDiscountPrice();
+            Integer costFlag = product.getCostCheckFlag();
+            // 成本大于等于复购价 或 复购价大于机构价
+            boolean state = (costFlag == 1 && MathUtil.compare(costPrice, discountPrice) >=0) || MathUtil.compare(discountPrice, price) >0;
+            product.setRepurchasePriceState(state);
+            // 设置商品主图及价格
+            priceUtilService.setProductDetails(userId, product);
+        });
+        PaginationVo<ProductItemVo> pageData = new PaginationVo<>(productList);
+        return ResponseJson.success(pageData);
+    }
+
     /**
      * 设置跳转参数
      * @param floorContent FloorContentVo
@@ -315,11 +345,11 @@ public class PageServiceImpl implements PageService {
                 // 获取商品及价格
                 ProductItemVo product = pageMapper.getProductItemById(image.getProductId());
                 if (product != null) {
+                    // 设置商品主图及价格
+                    priceUtilService.setProductDetails(userId, product);
                     image.setListType(1);
                     image.setName(product.getName());
                     image.setImage(ImageUtils.getImageURL("product", product.getImage(), 0, domain));
-                    // 设置商品价格
-                    priceUtilService.setItemPriceByUserId(product, userId);
                     image.setProduct(product);
                     if (userId != null) {
                         if (product.getUserIdentity() > 0) {

+ 96 - 0
src/main/java/com/caimei365/commodity/service/impl/SellerServiceImpl.java

@@ -0,0 +1,96 @@
+package com.caimei365.commodity.service.impl;
+
+import com.caimei365.commodity.components.PriceUtilService;
+import com.caimei365.commodity.mapper.PriceMapper;
+import com.caimei365.commodity.mapper.SellerMapper;
+import com.caimei365.commodity.model.ResponseJson;
+import com.caimei365.commodity.model.vo.CombinationVo;
+import com.caimei365.commodity.model.vo.PaginationVo;
+import com.caimei365.commodity.model.vo.PriceVo;
+import com.caimei365.commodity.model.vo.ProductItemVo;
+import com.caimei365.commodity.service.SellerService;
+import com.caimei365.commodity.utils.ImageUtils;
+import com.github.pagehelper.PageHelper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/4/23
+ */
+@Service
+public class SellerServiceImpl implements SellerService {
+    @Value("${caimei.wwwDomain}")
+    private String domain;
+    @Resource
+    private SellerMapper sellerMapper;
+    @Resource
+    private PriceUtilService priceUtilService;
+    @Resource
+    private PriceMapper priceMapper;
+
+    /**
+     * 协销搜索商品(单一)
+     *
+     * @param searchWord 搜索关键字
+     * @param clubUserId 机构用户Id
+     * @param pageNum    页码
+     * @param pageSize   每页数量
+     */
+    @Override
+    public ResponseJson<PaginationVo<ProductItemVo>> searchSingleProducts(String searchWord, Integer clubUserId, int pageNum, int pageSize) {
+        if (null == clubUserId) {
+            return ResponseJson.error("参数错误:机构用户Id不能为空!", null);
+        }
+        PageHelper.startPage(pageNum, pageSize);
+        List<ProductItemVo> productList = sellerMapper.getSingleProductList(searchWord);
+        productList.forEach(product -> {
+            // 设置商品主图及价格
+            priceUtilService.setProductDetails(clubUserId, product);
+        });
+        PaginationVo<ProductItemVo> pageData = new PaginationVo<>(productList);
+        return ResponseJson.success(pageData);
+    }
+
+    /**
+     * 协销搜索商品(组合)
+     *
+     * @param searchWord 搜索关键字
+     * @param clubUserId 机构用户Id
+     * @param pageNum    页码
+     * @param pageSize   每页数量
+     */
+    @Override
+    public ResponseJson<PaginationVo<CombinationVo>> searchCombinationProducts(String searchWord, Integer clubUserId, int pageNum, int pageSize) {
+        if (null == clubUserId) {
+            return ResponseJson.error("参数错误:机构用户Id不能为空!", null);
+        }
+        PageHelper.startPage(pageNum, pageSize);
+        List<CombinationVo> combinationList = sellerMapper.getCombinationList(searchWord);
+        combinationList.forEach(combination -> {
+            // 初始化商品数据,提供前端使用
+            combination.setProductKind(0);
+            combination.setProductTotalNum(0);
+            combination.setProductTotalAmount(new BigDecimal(0));
+            // 获取组合对应的商品集合
+            List<ProductItemVo> productList = sellerMapper.getCombinationProductList(combination.getId());
+            productList.forEach(product -> {
+                // 初始化商品数据,提供前端使用
+                product.setInitProductNum(0);
+                product.setTotalPrice(0d);
+                // 设置商品主图及价格
+                priceUtilService.setProductDetails(clubUserId, product);
+            });
+            combination.setCombinationProductList(productList);
+        });
+        PaginationVo<CombinationVo> pageData = new PaginationVo<>(combinationList);
+        return ResponseJson.success(pageData);
+    }
+
+}

+ 5 - 3
src/main/java/com/caimei365/commodity/service/impl/ShopServiceImpl.java

@@ -3,6 +3,7 @@ package com.caimei365.commodity.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.caimei365.commodity.components.PriceUtilService;
+import com.caimei365.commodity.mapper.PriceMapper;
 import com.caimei365.commodity.mapper.PromotionsMapper;
 import com.caimei365.commodity.mapper.ShopMapper;
 import com.caimei365.commodity.model.ResponseJson;
@@ -36,6 +37,8 @@ public class ShopServiceImpl implements ShopService {
     @Resource
     private ShopMapper shopMapper;
     @Resource
+    private PriceMapper priceMapper;
+    @Resource
     private PromotionsMapper promotionsMapper;
     @Resource
     private PriceUtilService priceUtilService;
@@ -102,12 +105,11 @@ public class ShopServiceImpl implements ShopService {
         List<ProductItemVo> productList = shopMapper.getShopProductsSelect(shopId, name, productCode, validFlag, featuredFlag, commodityType, bigTypeId, smallTypeId, tinyTypeId);
         if (null != productList && productList.size() > 0) {
             for (ProductItemVo product : productList) {
-                product.setImage(ImageUtils.getImageURL("product", product.getImage(), 0, domain));
                 String typeName = shopMapper.getTypeName(product.getBigTypeId(), product.getSmallTypeId(), product.getTinyTypeId());
                 product.setTypeName(typeName);
-                // 设置商品价格
+                // 设置商品主图及价格
                 Integer userId = shopMapper.getUserIdByshopId(shopId);
-                priceUtilService.setItemPriceByUserId(product, userId);
+                priceUtilService.setProductDetails(userId, product);
             }
         }
         PaginationVo<ProductItemVo> productPage = new PaginationVo<>(productList);

+ 52 - 7
src/main/resources/mapper/PageMapper.xml

@@ -85,9 +85,10 @@
     <select id="getProductItemById" resultType="com.caimei365.commodity.model.vo.ProductItemVo">
         select
             p.productID as productId,
-            p.`name` as name,
+            p.name,
+            p.aliasName,
             p.mainImage as image,
-            p.unit as unit,
+            p.unit,
             p.productCode as code,
             p.price1TextFlag as priceFlag,
             p.price1 as price,
@@ -95,14 +96,20 @@
             p.searchKey as keyword,
             p.price8Text as beautyActFlag,
             p.minBuyNumber as min,
-            p.ladderPriceFlag as ladderPriceFlag,
-            p.normalPrice as normalPrice,
-            p.step as step,
+            p.ladderPriceFlag,
+            p.normalPrice,
+            p.step,
             p.shopID as shopId,
             p.taxPoint as taxRate,
-            p.includedTax as includedTax,
-            p.invoiceType as invoiceType,
+            p.includedTax,
+            p.invoiceType,
             p.productCategory as productCategory,
+            p.validFlag,
+            p.featuredFlag,
+            p.commodityType,
+            p.bigTypeID as bigTypeId,
+            p.smallTypeID as smallTypeId,
+            p.tinyTypeID as tinyTypeId,
             cshd.detailTalkFlag as detailTalkFlag
         from product p
         left join cm_second_hand_detail cshd on p.productID = cshd.productID
@@ -145,6 +152,44 @@
         from product
         where productID = #{productId}
     </select>
+    <select id="getBuyAgainProducts" resultType="com.caimei365.commodity.model.vo.ProductItemVo">
+        select
+            p.productID as productId,
+            p.name,
+            p.aliasName,
+            p.mainImage as image,
+            p.unit,
+            p.productCode as code,
+            p.price1TextFlag as priceFlag,
+            p.price1 as price,
+            p.costPrice,
+            p.costCheckFlag,
+            p.shopID as shopId,
+            p.searchKey as keyword,
+            p.price8Text as beautyActFlag,
+            p.minBuyNumber as min,
+            p.ladderPriceFlag,
+            p.normalPrice,
+            p.step,
+            p.shopID as shopId,
+            p.taxPoint as taxRate,
+            p.includedTax,
+            p.invoiceType,
+            p.productCategory as productCategory,
+            p.validFlag,
+            p.featuredFlag,
+            p.commodityType,
+            p.bigTypeID as bigTypeId,
+            p.smallTypeID as smallTypeId,
+            p.tinyTypeID as tinyTypeId,
+            rpp.currentPrice as discountPrice
+        from
+          repeat_purchase_price rpp
+          left join product p on rpp.productId = p.productID
+        where rpp.delFlag = '0' and p.validFlag='2'
+        and rpp.userId = #{userId}
+        order by rpp.createTime desc
+    </select>
 
 
 </mapper>

+ 81 - 0
src/main/resources/mapper/SellerMapper.xml

@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.caimei365.commodity.mapper.SellerMapper">
+    <select id="getSingleProductList" resultType="com.caimei365.commodity.model.vo.ProductItemVo">
+        select
+            p.productID as productId,
+            p.name,
+            p.aliasName,
+            p.mainImage as image,
+            p.unit,
+            p.productCode as code,
+            p.price1TextFlag as priceFlag,
+            p.price1 as price,
+            p.shopID as shopId,
+            p.searchKey as keyword,
+            p.price8Text as beautyActFlag,
+            p.minBuyNumber as min,
+            p.ladderPriceFlag,
+            p.normalPrice,
+            p.step,
+            p.shopID as shopId,
+            p.taxPoint as taxRate,
+            p.includedTax,
+            p.invoiceType,
+            p.productCategory as productCategory,
+            p.validFlag,
+            p.featuredFlag,
+            p.commodityType,
+            p.bigTypeID as bigTypeId,
+            p.smallTypeID as smallTypeId,
+            p.tinyTypeID as tinyTypeId
+        from product p
+        where
+        (name LIKE CONCAT('%',#{searchWord},'%') or productCode LIKE CONCAT('%',#{searchWord},'%'))
+        and validFlag in (2,3,9)
+    </select>
+    <select id="getCombinationList" resultType="com.caimei365.commodity.model.vo.CombinationVo">
+        select c.id, c.name, c.addTime, c.updateTime
+        from cm_product_combination c
+        left join product p on p.combinationID = c.id
+        where c.delFlag = 0 and p.validFlag = 2
+        <if test="searchWord != null and searchWord != ''">
+            and (p.name like CONCAT('%',#{searchWord},'%') or p.productCode LIKE CONCAT('%',#{searchWord},'%'))
+        </if>
+        group by c.id
+        having COUNT(*) > 0
+        order by c.addTime desc
+    </select>
+    <select id="getCombinationProductList" resultType="com.caimei365.commodity.model.vo.ProductItemVo">
+        select
+            p.productID as productId,
+            p.name,
+            p.aliasName,
+            p.mainImage as image,
+            p.unit,
+            p.productCode as code,
+            p.price1TextFlag as priceFlag,
+            p.price1 as price,
+            p.shopID as shopId,
+            p.searchKey as keyword,
+            p.price8Text as beautyActFlag,
+            p.minBuyNumber as min,
+            p.ladderPriceFlag,
+            p.normalPrice,
+            p.step,
+            p.shopID as shopId,
+            p.taxPoint as taxRate,
+            p.includedTax,
+            p.invoiceType,
+            p.productCategory as productCategory,
+            p.validFlag,
+            p.featuredFlag,
+            p.commodityType,
+            p.bigTypeID as bigTypeId,
+            p.smallTypeID as smallTypeId,
+            p.tinyTypeID as tinyTypeId
+        from product p
+        where p.validFlag = 2 and p.combinationID = #{id}
+        order by p.combinationSort!= 0 desc,p.combinationSort asc
+    </select>
+</mapper>

+ 26 - 3
src/main/resources/mapper/ShopMapper.xml

@@ -338,9 +338,32 @@
     </select>
     <select id="getShopProductsSelect" resultType="com.caimei365.commodity.model.vo.ProductItemVo">
         select
-            p.productID as productId, p.name, p.aliasName, p.price1 as price, p.normalPrice, p.mainImage, p.ladderPriceFlag as ladderPriceFlag,
-            p.validFlag, p.featuredFlag, p.productCode, p.commodityType as commodityType,
-            p.bigTypeID as bigTypeId, p.smallTypeID as smallTypeId, p.tinyTypeID as tinyTypeId
+            p.productID as productId,
+            p.name,
+            p.aliasName,
+            p.mainImage as image,
+            p.unit,
+            p.productCode as code,
+            p.price1TextFlag as priceFlag,
+            p.price1 as price,
+            p.shopID as shopId,
+            p.searchKey as keyword,
+            p.price8Text as beautyActFlag,
+            p.minBuyNumber as min,
+            p.ladderPriceFlag,
+            p.normalPrice,
+            p.step,
+            p.shopID as shopId,
+            p.taxPoint as taxRate,
+            p.includedTax,
+            p.invoiceType,
+            p.productCategory as productCategory,
+            p.validFlag,
+            p.featuredFlag,
+            p.commodityType,
+            p.bigTypeID as bigTypeId,
+            p.smallTypeID as smallTypeId,
+            p.tinyTypeID as tinyTypeId
         from product p
         <where>
             p.shopID = #{shopId}