Browse Source

商品详情

chao 4 years ago
parent
commit
9005216db5

+ 20 - 0
src/main/java/com/caimei365/commodity/controller/ProductPageApi.java

@@ -3,6 +3,8 @@ 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.service.PageService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -90,4 +92,22 @@ public class ProductPageApi {
     public ResponseJson<List<BrandVo>> getBrandList() {
         return pageService.getBrandList();
     }
+
+    /**
+     * 商品详情页
+     *
+     * @param productId 商品Id
+     * @param userId    用户Id
+     */
+    @ApiOperation("商品详情页(旧:/product/details)")
+    @ApiImplicitParams({
+        @ApiImplicitParam(required = false, name = "userId", value = "用户id"),
+        @ApiImplicitParam(required = false, name = "productId", value = "商品Id")
+    })
+    @GetMapping("/product/details")
+    public ResponseJson<ProductDetailVo> getProductDetails(Integer productId, Integer userId) {
+        return pageService.getProductDetails(productId, userId);
+    }
+
+
 }

+ 1 - 1
src/main/java/com/caimei365/commodity/controller/ProductTypeApi.java

@@ -75,7 +75,7 @@ public class ProductTypeApi {
     @ApiOperation("根据Id获取分类(小程序)(旧:/product/typeId/classify)")
     @ApiImplicitParams({
         @ApiImplicitParam(required = true, name = "typeId", value = "分类Id"),
-        @ApiImplicitParam(required = true, name = "idType", value = "typeId类型:1:bigType,2:smallType,3:tinyType"),
+        @ApiImplicitParam(required = true, name = "idType", value = "typeId类型:1:一级分类,2:二级分类,3:三级分类"),
         @ApiImplicitParam(required = false, name = "source", value = "请求来源:www,crm")
     })
     @GetMapping("/id")

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

@@ -73,4 +73,8 @@ public interface PageMapper {
      * 商品品牌列表
      */
     List<BrandVo> getBrandList();
+    /**
+     * 商品详情页
+     */
+    ProductDetailVo getProductDetails(Integer productId);
 }

+ 13 - 0
src/main/java/com/caimei365/commodity/mapper/ShopMapper.java

@@ -7,6 +7,7 @@ import com.caimei365.commodity.model.po.ProductPo;
 import com.caimei365.commodity.model.search.ProductListVo;
 import com.caimei365.commodity.model.vo.ProductFormVo;
 import com.caimei365.commodity.model.vo.ProductItemVo;
+import com.caimei365.commodity.model.vo.ShopVo;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
@@ -104,4 +105,16 @@ public interface ShopMapper {
      * 获取商品详情
      */
     ProductDetailInfoPo getProductDetailInfo(Integer productId);
+    /**
+     * 供应商信息
+     */
+    ShopVo getProductShopById(Integer shopId);
+    /**
+     * 上架商品数量
+     */
+    Integer getProductNumById(Integer shopId);
+    /**
+     * 获取用户身份
+     */
+    Integer getUserIdentityById(Integer userId);
 }

+ 2 - 2
src/main/java/com/caimei365/commodity/model/dto/ProductDto.java

@@ -115,7 +115,7 @@ public class ProductDto implements Serializable {
      * 械字号类型   (基于械字号基础),1:一类,2:二类,3:三类
      */
     @ApiModelProperty("械字号类型")
-    private String machineType;
+    private Integer machineType;
     /**
      * 搜索关键词,4个用英文逗号区分,不存在的直接逗号隔空(顺序参考:品牌,学名,市场称呼,大类别,小类别)
      */
@@ -140,7 +140,7 @@ public class ProductDto implements Serializable {
      * 发票类型(基于是否含税基础)   1增值税票,2普通票, 3不能开票
      */
     @ApiModelProperty("发票类型")
-    private String invoiceType;
+    private Integer invoiceType;
     /**
      * 开票税点(基于不含税基础) :增值税默认13%,普通票6%取值范围[0-100]
      */

+ 21 - 0
src/main/java/com/caimei365/commodity/model/po/ProductPo.java

@@ -1,5 +1,6 @@
 package com.caimei365.commodity.model.po;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -45,6 +46,18 @@ public class ProductPo implements Serializable {
      * 内部商品名称
      */
     private String aliasName;
+    /**
+     * 搜索关键词,4个用英文逗号区分,不存在的直接逗号隔空(顺序参考:品牌,学名,市场称呼,大类别,小类别)
+     */
+    private String searchKey;
+    /**
+     * 销售区域:1全部区域, 0指定区域
+     */
+    private String allAreaFlag;
+    /**
+     * 指定的销售区域
+     */
+    private String provinceIds;
     /**
      * 市场价
      */
@@ -141,6 +154,14 @@ public class ProductPo implements Serializable {
      * 械字号类型   (基于械字号基础),1:一类,2:二类,3:三类
      */
     private Integer machineType;
+    /**
+     * 械字号资质证书图  (基于械字号基础)
+     */
+    private String qualificationImg;
+    /**
+     * 开票税点(基于不含税基础) :增值税默认13%,普通票6%取值范围[0-100]
+     */
+    private Double taxPoint;
     /**
      * 是否含税   0不含税,1含税,2未知
      */

+ 269 - 0
src/main/java/com/caimei365/commodity/model/vo/ProductDetailVo.java

@@ -0,0 +1,269 @@
+package com.caimei365.commodity.model.vo;
+
+import com.caimei365.commodity.model.po.ProductDetailInfoPo;
+import com.caimei365.commodity.model.po.ProductImagePo;
+import com.caimei365.commodity.model.po.ProductParameterPo;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/4/22
+ */
+@ApiModel("商品详情")
+@Data
+public class ProductDetailVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 商品productID
+     */
+    private Integer productId;
+    /**
+     * 所属供应商Id
+     */
+    private Integer shopId;
+    /**
+     * 商品名称
+     */
+    private String name;
+    /**
+     * 内部商品名称
+     */
+    private String aliasName;
+    /**
+     * 搜索关键词,4个用英文逗号区分,不存在的直接逗号隔空(顺序参考:品牌,学名,市场称呼,大类别,小类别)
+     */
+    private String searchKey;
+    /**
+     * 商品属性:1产品,2仪器
+     */
+    private Integer commodityType;
+    /**
+     * 一级分类id
+     */
+    private Integer bigTypeId;
+    /**
+     * 二级分类id
+     */
+    private Integer smallTypeId;
+    /**
+     * 三级分类Id
+     */
+    private Integer tinyTypeId;
+    /**
+     * 主图
+     */
+    private String mainImage;
+    /**
+     * 品牌Id
+     */
+    private Integer brandId;
+    /**
+     * 商品类型:0其它类型(默认),1妆字号,2械字号
+     */
+    private Integer productType;
+    /**
+     * 商品标签用英文逗号隔开,中文逗号或其它一律不作切割
+     */
+    private String tags;
+    /**
+     * 商品货号
+     */
+    private String productCode;
+    /**
+     * 包装规格
+     */
+    private String unit;
+    /**
+     * 市场价
+     */
+    private Double normalPrice;
+    /**
+     * 商品价格
+     */
+    private Double price;
+    /**
+     * 价格可见度:0公开价格 1不公开价格 2仅对会员机构公开 price1TextFlag
+     */
+    private Integer priceFlag;
+    /**
+     * 启用阶梯价格标识 0否 1是
+     */
+    private Integer ladderPriceFlag;
+    /**
+     * 成本价
+     */
+    private Double costPrice;
+    /**
+     * 商品可见度:(3:所有人可见,2:普通机构可见,1:会员机构可见)
+     */
+    private Integer visibility;
+    /**
+     * 商品状态, 0逻辑删除 1待审核 2已上架 3已下架 8审核未通过 9已隐身 10已冻结
+     */
+    private Integer validFlag;
+    /**
+     * 是否使用活动角标:1是,空或0不是[与actType搭配使用,仅用于标识非真正活动]
+     */
+    private Integer actFlag;
+    /**
+     * 是否含税   0不含税,1含税,2未知
+     */
+    private Integer includedTax;
+    /**
+     * 供应商税率:增值专用发票默认13%,增值税普通发票6%取值范围[0-100]
+     */
+    private Double supplierTaxPoint;
+    /**
+     * 最小购买量
+     */
+    private Integer minBuyNumber;
+    /**
+     * 服务起订量
+     */
+    private Integer serviceNumber;
+    /**
+     * 库存
+     */
+    private Integer stock;
+    /**
+     * 商品的类别:1正常商品(默认),2二手商品
+     */
+    private Integer productCategory;
+    /**
+     * 添加时间
+     */
+    private String addTime;
+    /**
+     * 更新时间
+     */
+    private String updateTime;
+    /**
+     * 是否有sku:1有, 0没有
+     */
+    private Integer hasSkuFlag;
+    /**
+     * 销量
+     */
+    private Integer sellNumber;
+    /**
+     * 排序值
+     */
+    private Integer sortIndex;
+    /**
+     * 供应商主推商品标志 0否 1是
+     */
+    private Integer featuredFlag;
+    /**
+     * 成本价选中标志:1固定成本 2比例成
+     */
+    private Integer costCheckFlag;
+    /**
+     * 相关推荐类型 0自动选择; 1手动推荐
+     */
+    private Integer recommendType;
+    /**
+     * 标签数组
+     */
+    private String[] tagsList;
+    /**
+     * 品牌名称
+     */
+    private String brandName;
+    /**
+     * 一级分类名称
+     */
+    private String bigTypeName;
+    /**
+     * 二级分类名称
+     */
+    private String smallTypeName;
+    /**
+     * 三级分类名称
+     */
+    private String tinyTypeName;
+    /**
+     * 所在分类名称
+     */
+    private String typeName;
+    /**
+     * 商品详情
+     */
+    private ProductDetailInfoPo productDetail;
+    /**
+     * 商品图片
+     */
+    private List<ProductImagePo> imageList;
+    /**
+     * 相关参数
+     */
+    private List<ProductParameterPo> parametersList;
+    /**
+     * 械字号类型   (基于械字号基础),1:一类,2:二类,3:三类
+     */
+    private String machineType;
+
+    /**
+     * 购买数量: 1逐步增长,2以起订量增长(起订量的倍数增长)
+     */
+    private Integer step;
+    /**
+     * 械字号资质证书图  (基于械字号基础)
+     */
+    private String qualificationImg;
+
+    /**
+     * 发票类型(基于是否含税基础)   1增值税票,2普通票, 3不能开票
+     */
+    private String invoiceType;
+    /**
+     * 开票税点(基于不含税基础) :增值税默认13%,普通票6%取值范围[0-100]
+     */
+    private Double taxPoint;
+    /**
+     * 销售区域:1全部区域, 0指定区域
+     */
+    private String allAreaFlag;
+    /**
+     * 指定的销售区域
+     */
+    private String provinceIds;
+    /**
+     * 商品详情信息
+     */
+    private String detailInfo;
+    /**
+     * 服务详情
+     */
+    private String serviceInfo;
+    /**
+     * 订购方案
+     */
+    private String orderInfo;
+    /**
+     * 计算后价格等级
+     */
+    private Integer priceGrade;
+    /**
+     * 供应商信息
+     */
+    private ShopVo shop;
+    /**
+     * 商品是否处于活动状态 1是 0否
+     */
+    private Integer actStatus;
+    /**
+     * 划线价格
+     */
+    private Double originalPrice;
+    /**
+     * 促销活动
+     */
+    private PromotionsVo promotions;
+
+}

+ 51 - 0
src/main/java/com/caimei365/commodity/model/vo/ProductFormVo.java

@@ -4,6 +4,7 @@ import com.caimei365.commodity.model.po.ProductDetailInfoPo;
 import com.caimei365.commodity.model.po.ProductImagePo;
 import com.caimei365.commodity.model.po.ProductParameterPo;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -35,6 +36,10 @@ public class ProductFormVo implements Serializable {
      * 内部商品名称
      */
     private String aliasName;
+    /**
+     * 搜索关键词,4个用英文逗号区分,不存在的直接逗号隔空(顺序参考:品牌,学名,市场称呼,大类别,小类别)
+     */
+    private String searchKey;
     /**
      * 商品属性:1产品,2仪器
      */
@@ -91,6 +96,10 @@ public class ProductFormVo implements Serializable {
      * 启用阶梯价格标识 0否 1是
      */
     private Integer ladderPriceFlag;
+    /**
+     * 成本价
+     */
+    private Double costPrice;
     /**
      * 商品可见度:(3:所有人可见,2:普通机构可见,1:会员机构可见)
      */
@@ -191,4 +200,46 @@ public class ProductFormVo implements Serializable {
      * 相关参数
      */
     private List<ProductParameterPo> parametersList;
+    /**
+     * 械字号类型   (基于械字号基础),1:一类,2:二类,3:三类
+     */
+    private String machineType;
+
+    /**
+     * 购买数量: 1逐步增长,2以起订量增长(起订量的倍数增长)
+     */
+    private Integer step;
+    /**
+     * 械字号资质证书图  (基于械字号基础)
+     */
+    private String qualificationImg;
+
+    /**
+     * 发票类型(基于是否含税基础)   1增值税票,2普通票, 3不能开票
+     */
+    private String invoiceType;
+    /**
+     * 开票税点(基于不含税基础) :增值税默认13%,普通票6%取值范围[0-100]
+     */
+    private Double taxPoint;
+    /**
+     * 销售区域:1全部区域, 0指定区域
+     */
+    private String allAreaFlag;
+    /**
+     * 指定的销售区域
+     */
+    private String provinceIds;
+    /**
+     * 商品详情信息
+     */
+    private String detailInfo;
+    /**
+     * 服务详情
+     */
+    private String serviceInfo;
+    /**
+     * 订购方案
+     */
+    private String orderInfo;
 }

+ 186 - 0
src/main/java/com/caimei365/commodity/model/vo/ShopVo.java

@@ -0,0 +1,186 @@
+package com.caimei365.commodity.model.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2021/3/16
+ */
+@Data
+public class ShopVo implements Serializable {
+    /**
+     * 用户ID
+     */
+    private Integer userId;
+    /**
+     * 供应商ID
+     */
+    private Integer shopId;
+    /**
+     * 供应商公司名称
+     */
+    private String name;
+    /**
+     * 供应商公司简称
+     */
+    private String shortName;
+    /**
+     * 联系人
+     */
+    private String linkMan;
+    /**
+     * 手机号
+     */
+    private String contractMobile;
+    /**
+     * 联系人邮箱
+     */
+    private String email;
+    private String contractEmail;
+    /**
+     * 固定电话
+     */
+    private String contractPhone;
+    /**
+     * 省
+     */
+    private Integer provinceId;
+    /**
+     * 市
+     */
+    private Integer cityId;
+    /**
+     * 所在县区Id
+     */
+    private Integer townId;
+    /**
+     * 地址
+     */
+    private String address;
+    /**
+     * 统一社会信用代码
+     */
+    private String socialCreditCode;
+    /**
+     * 营业执照(businessLicenseImage)
+     */
+    private String businessLicense;
+    /**
+     * 医疗=1和非医疗=2
+     */
+    private Integer firstShopType;
+    /**
+     * 医疗的二级分类 一类器械=1、二类器械 =2、三类器械=3、其他=4 /// 1和非医疗没有二级分类
+     */
+    private Integer secondShopType;
+    /**
+     * 主打项目(mainpro)
+     */
+    private String mainProduct;
+    /**
+     * 添加时间
+     */
+    private String addTime;
+    /**
+     * 供应商状态: 90:已上线,91:已下线,92:审核不通过,3:待审核
+     */
+    private Integer status;
+    /**
+     * 是否可用,1可用
+     */
+    private String validFlag;
+    /**
+     * 省市区地址
+     */
+    private String provincialAddress;
+
+    /**
+     * 荣誉证书
+     */
+    private List<String> honorCertification;
+
+    /**
+     * 生产经营证书
+     */
+    private String operationLicence;
+
+    /**
+     * 产品证书
+     */
+    private List<String> productCertification;
+
+    /**
+     * 卫生许可证
+     */
+    private String hygienicLicense;
+
+    /**
+     * 税务登记证
+     */
+    private String taxLicense;
+    /**
+     * 主打商品说明(productDesc)
+     */
+    private String mainProductDesc;
+    /**
+     * 法人代表
+     */
+    private String legalPerson;
+    /**
+     * 注册资本
+     */
+    private Double registeredCapital;
+    /**
+     * 传真号(fax)
+     */
+    private String faxNumber;
+    /**
+     * 公司性质(nature)
+     */
+    private String companyNature;
+    /**
+     * 年营业额
+     */
+    private Double turnover;
+    /**
+     * 医疗执业许可证(medicalPracticeLicenseImg1)
+     */
+    private String medicalPracticeLicense;
+    /**
+     * 公司介绍(info)
+     */
+    private String shopDesc;
+    /**
+     * 经营范围
+     */
+    private String businessScope;
+    /**
+     * 公司LOGO
+     */
+    private String logo;
+    /**
+     * 官网地址
+     */
+    private String website;
+    /**
+     * 微信公众号
+     */
+    private String wxOfficialAccount;
+    /**
+     * 微信小程序
+     */
+    private String wxApplets;
+    /**
+     * 上架商品数量
+     */
+    private Integer normalNum;
+    /**
+     * 经营范围
+     */
+    private String[] businessScopeArray;
+}

+ 10 - 0
src/main/java/com/caimei365/commodity/service/PageService.java

@@ -3,6 +3,8 @@ 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 java.util.List;
 import java.util.Map;
@@ -43,4 +45,12 @@ public interface PageService {
      * 商品品牌列表
      */
     ResponseJson<List<BrandVo>> getBrandList();
+
+    /**
+     * 商品详情页
+     *
+     * @param productId 商品Id
+     * @param userId    用户Id
+     */
+    ResponseJson<ProductDetailVo> getProductDetails(Integer productId, Integer userId);
 }

+ 118 - 4
src/main/java/com/caimei365/commodity/service/impl/PageServiceImpl.java

@@ -1,8 +1,13 @@
 package com.caimei365.commodity.service.impl;
 
 import com.caimei365.commodity.mapper.PageMapper;
+import com.caimei365.commodity.mapper.PriceMapper;
 import com.caimei365.commodity.mapper.ProductTypeMapper;
+import com.caimei365.commodity.mapper.ShopMapper;
 import com.caimei365.commodity.model.ResponseJson;
+import com.caimei365.commodity.model.po.ProductDetailInfoPo;
+import com.caimei365.commodity.model.po.ProductImagePo;
+import com.caimei365.commodity.model.po.ProductParameterPo;
 import com.caimei365.commodity.model.vo.*;
 import com.caimei365.commodity.service.PageService;
 import com.caimei365.commodity.utils.AppletsLinkUtil;
@@ -16,10 +21,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * Description
@@ -35,6 +39,10 @@ public class PageServiceImpl implements PageService {
     @Resource
     private PageMapper pageMapper;
     @Resource
+    private ShopMapper shopMapper;
+    @Resource
+    private PriceMapper priceMapper;
+    @Resource
     private PriceUtilService priceUtilService;
     @Resource
     private ProductTypeMapper productTypeMapper;
@@ -162,6 +170,112 @@ public class PageServiceImpl implements PageService {
         return ResponseJson.success(brandList);
     }
 
+    /**
+     * 商品详情页
+     *
+     * @param productId 商品Id
+     * @param userId    用户Id
+     */
+    @Override
+    public ResponseJson<ProductDetailVo> getProductDetails(Integer productId, Integer userId) {
+        ProductDetailVo product = pageMapper.getProductDetails(productId);
+        if (product == null) {
+            //商品不存在
+            product = new ProductDetailVo();
+            product.setValidFlag(0);
+        }
+        boolean validFlag = 2 != product.getProductCategory() && 2 == product.getValidFlag() && (product.getStock()== null || product.getStock() == 0);
+        if (validFlag) {
+            //已上架但库存为0的正常商品,设置为已售罄商品
+            product.setValidFlag(4);
+        }
+        String[] split = null;
+        // 品牌名称
+        String brandName = shopMapper.getBrandNameById(product.getBrandId());
+        product.setBrandName(brandName);
+        //商品标签
+        if (product.getTags() != null) {
+            String tags = product.getTags().replace(" ", ",").replace("、", ",").replace(",", ",");
+            if (tags.contains(",")) {
+                List<String> list = new ArrayList<String>();
+                for (String s : tags.split(",")) {
+                    if (s != null && !"".equals(s)) {
+                        list.add(s);
+                    }
+                }
+                split = list.toArray(new String[list.size()]);
+            }
+        }
+        product.setTagsList(split);
+        // 主图
+        product.setMainImage(ImageUtils.getImageURL("product", product.getMainImage(), 0, domain));
+        // 商品图片
+        List<ProductImagePo> imageList = shopMapper.getProductImages(productId);
+        for (ProductImagePo image : imageList) {
+            String imageURL = ImageUtils.getImageURL("product", image.getImage(), 0, domain);
+            image.setImage(imageURL);
+        }
+        product.setImageList(imageList);
+        // 商品详情
+        ProductDetailInfoPo productDetail = shopMapper.getProductDetailInfo(productId);
+        product.setProductDetail(productDetail);
+        // 相关参数
+        List<ProductParameterPo> parametersList = shopMapper.getProductParameters(productId);
+        product.setParametersList(parametersList);
+        // 分类名称
+        String typeName = shopMapper.getTypeName(product.getBigTypeId(), product.getSmallTypeId(), product.getTinyTypeId());
+        product.setTypeName(typeName);
+        List<String> list = StringUtils.isNotEmpty(typeName) ? Arrays.asList(typeName.split("-")) : new ArrayList<>();
+        product.setBigTypeName(list.size() > 0 ? list.get(0) : null);
+        product.setSmallTypeName(list.size() > 1 ? list.get(1) : null);
+        product.setTinyTypeName(list.size() > 2 ? list.get(2) : null);
+        //价格等级
+        product.setPriceGrade(priceUtilService.getPriceGrade(product.getPrice()));
+        //供应商信息
+        ShopVo shop = shopMapper.getProductShopById(product.getShopId());
+        Integer normalNum = shopMapper.getProductNumById(product.getShopId());
+        shop.setNormalNum(normalNum == null ? 0 : normalNum);
+        if (shop.getBusinessScope() != null && shop.getBusinessScope().contains("/")) {
+            String[] businessScopeArray = shop.getBusinessScope().split("/");
+            shop.setBusinessScopeArray(businessScopeArray);
+        }
+        shop.setLogo(ImageUtils.getImageURL("shopLogo", shop.getLogo(), 0, domain));
+        shop.setBusinessLicense(ImageUtils.getImageURL("shopLogo", shop.getBusinessLicense(), 0, domain));
+        product.setShop(shop);
+        // 商品可见度:3:所有人可见,2:普通机构可见,1:会员机构可见
+        Integer visibility = product.getVisibility();
+        if (null != userId && userId > 0) {
+            // 用户身份:0个人,1协销,2会员机构,3供应商,4普通机构
+            Integer identity = shopMapper.getUserIdentityById(userId);
+            // 协销 | 会员机构 | 综合供应商
+            boolean pass1 = null != identity && (identity == 1 || identity == 2);
+            // 普通机构
+            boolean pass2 = null != identity && (identity == 4 && (visibility == 2 || visibility == 3));
+            // 游客
+            boolean pass3 = visibility == 3;
+            if (!(pass1 || pass2 || pass3)) {
+                return ResponseJson.success(1, "没有权限查看该商品", new ProductDetailVo());
+            }
+        } else if (2 == visibility || 1 == visibility) {
+            return ResponseJson.success(1, "没有权限查看该商品,userId为空", new ProductDetailVo());
+        }
+        // 商品不处于已删除/待审核/审核未通过的状态
+        if (0 != product.getValidFlag()) {
+            // 数据库获取基本价格信息
+            PriceVo price = priceMapper.getDetailPrice(productId);
+            // 根据用户id设置详细价格
+            priceUtilService.setPriceByUserId(price, userId);
+            // 设置价格
+            product.setActStatus(price.getActStatus());
+            product.setPrice(price.getPrice());
+            product.setOriginalPrice(price.getOriginalPrice());
+            product.setLadderPriceFlag(price.getLadderPriceFlag());
+            product.setPromotions(price.getPromotions());
+            product.setMinBuyNumber(price.getMinBuyNumber());
+        }
+        return ResponseJson.success(product);
+    }
+
     /**
      * 设置跳转参数
      * @param floorContent FloorContentVo

+ 28 - 12
src/main/java/com/caimei365/commodity/service/impl/ShopServiceImpl.java

@@ -11,7 +11,6 @@ import com.caimei365.commodity.model.po.ProductImagePo;
 import com.caimei365.commodity.model.po.ProductParameterPo;
 import com.caimei365.commodity.model.po.ProductPo;
 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.ProductItemVo;
@@ -214,6 +213,7 @@ public class ShopServiceImpl implements ShopService {
         String current = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
         //保存或修改商品
         ProductPo product = new ProductPo();
+        product.setProductId(productDto.getProductId());
         product.setShopId(productDto.getShopId());
         product.setName(productDto.getName());
         product.setAliasName(productDto.getAliasName());
@@ -230,6 +230,21 @@ public class ShopServiceImpl implements ShopService {
         product.setIncludedTax(productDto.getIncludedTax());
         product.setMinBuyNumber(productDto.getMinBuyNumber());
         product.setStock(productDto.getStock());
+        product.setSearchKey(productDto.getSearchKey());
+        product.setCostPrice(productDto.getCostPrice());
+        product.setStep(productDto.getStep());
+        product.setAllAreaFlag(productDto.getAllAreaFlag());
+        product.setProvinceIds(productDto.getProvinceIds());
+        product.setProductCode(productDto.getProductCode());
+        product.setServiceNumber(productDto.getMinBuyNumber());
+        product.setSupplierTaxPoint(productDto.getTaxPoint());
+        product.setMachineType(productDto.getMachineType());
+        product.setStep(productDto.getStep());
+        product.setQualificationImg(productDto.getQualificationImg());
+        product.setInvoiceType(productDto.getInvoiceType());
+        product.setTaxPoint(productDto.getTaxPoint());
+        product.setAllAreaFlag(productDto.getAllAreaFlag());
+        product.setProvinceIds(productDto.getProvinceIds());
         product.setUpdateTime(current);
         product.setValidFlag(1);
         product.setProductCategory(1);
@@ -241,9 +256,7 @@ public class ShopServiceImpl implements ShopService {
                 product.setMainImage(image);
             }
         }
-        if (null == productDto.getProductId()) {
-            product.setServiceNumber(productDto.getMinBuyNumber());
-            product.setSupplierTaxPoint(productDto.getTaxPoint());
+        if (null == product.getProductId()) {
             product.setAddTime(current);
             product.setHasSkuFlag(1);
             product.setSellNumber(0);
@@ -257,22 +270,21 @@ public class ShopServiceImpl implements ShopService {
             product.setVisibility(3);
             if (StringUtils.isBlank(productDto.getProductCode())) {
                 String productCode = shopMapper.getCodeByTypeId(productDto.getBigTypeId(), productDto.getSmallTypeId(), productDto.getTinyTypeId());
-                productCode = productCode + productDto.getProductId();
+                productCode = productCode + product.getProductId();
                 product.setProductCode(productCode);
             }
             shopMapper.insertProduct(product);
         } else {
-            product.setProductId(productDto.getProductId());
             shopMapper.updateProduct(product);
         }
         //保存或修改商品图片
-        List<ProductImagePo> productImageList = shopMapper.getImageByProductId(productDto.getProductId());
+        List<ProductImagePo> productImageList = shopMapper.getImageByProductId(product.getProductId());
         for (Map<String, String> map : imageList) {
             String mainFlag = map.get("mainFlag");
             String image = map.get("image");
             String productImageId = map.get("productImageId");
             ProductImagePo productImage = new ProductImagePo();
-            productImage.setProductId(productDto.getProductId());
+            productImage.setProductId(product.getProductId());
             productImage.setShopId(productDto.getShopId());
             productImage.setAddTime(current);
             productImage.setImage(image);
@@ -291,7 +303,7 @@ public class ShopServiceImpl implements ShopService {
             }
         }
         //保存相关参数
-        shopMapper.deleteProductParameters(productDto.getProductId());
+        shopMapper.deleteProductParameters(product.getProductId());
         if (null != paramList && paramList.size() > 0) {
             for (Map<String, String> map : paramList) {
                 String paramsName = map.get("paramsName");
@@ -300,7 +312,7 @@ public class ShopServiceImpl implements ShopService {
                     ProductParameterPo parameters = new ProductParameterPo();
                     parameters.setParamsName(paramsName);
                     parameters.setParamsContent(paramsContent);
-                    parameters.setProductId(productDto.getProductId());
+                    parameters.setProductId(product.getProductId());
                     parameters.setDelFlag(0);
                     shopMapper.insertProductParameters(parameters);
                 }
@@ -344,10 +356,14 @@ public class ShopServiceImpl implements ShopService {
         String brandName = shopMapper.getBrandNameById(product.getBrandId());
         product.setBrandName(brandName);
         ProductDetailInfoPo productDetail = shopMapper.getProductDetailInfo(productId);
-        List<ProductImagePo> productImage = shopMapper.getProductImages(productId);
+        List<ProductImagePo> imageList = shopMapper.getProductImages(productId);
+        for (ProductImagePo image : imageList) {
+            String imageURL = ImageUtils.getImageURL("product", image.getImage(), 0, domain);
+            image.setImage(imageURL);
+        }
         List<ProductParameterPo> parametersList = shopMapper.getProductParameters(productId);
         product.setProductDetail(productDetail);
-        product.setImageList(productImage);
+        product.setImageList(imageList);
         product.setParametersList(parametersList);
         return ResponseJson.success(product);
     }

+ 10 - 0
src/main/resources/mapper/PageMapper.xml

@@ -135,6 +135,16 @@
 		where status = '1' and delFlag = '0' and description is not null and description != '' and id not in (161)
 		order by sort
     </select>
+    <select id="getProductDetails" resultType="com.caimei365.commodity.model.vo.ProductDetailVo">
+        select productID as productId, shopID as shopId,  name, aliasName, commodityType, mainImage, stock, invoiceType,
+            bigTypeID as bigTypeId, smallTypeID as smallTypeId, tinyTypeID as tinyTypeId, searchKey, visibility,
+            brandID as brandId,  productType, tags, unit, normalPrice, price1 as price, includedTax, minBuyNumber,
+            productCategory, serviceNumber, taxPoint, supplierTaxPoint, price1TextFlag as priceFlag, actFlag, ladderPriceFlag,
+            addTime, hasSkuFlag, sellNumber, sortIndex, featuredFlag, costCheckFlag, recommendType, machineType,
+            productCode, updateTime, validFlag, searchKey, allAreaFlag, step, costPrice, provinceIds, qualificationImg
+        from product
+        where productID = #{productId}
+    </select>
 
 
 </mapper>

+ 96 - 9
src/main/resources/mapper/ShopMapper.xml

@@ -50,6 +50,30 @@
             <if test="productCode != null and  productCode != ''">
                 productCode,
             </if>
+            <if test="searchKey != null and  searchKey != ''">
+                searchKey,
+            </if>
+            <if test="allAreaFlag != null and  allAreaFlag != ''">
+                allAreaFlag,
+            </if>
+            <if test="step != null and  step != ''">
+                step,
+            </if>
+            <if test="costPrice != null and  costPrice != ''">
+                costPrice,
+            </if>
+            <if test="provinceIds != null and  provinceIds != ''">
+                provinceIds,
+            </if>
+            <if test="machineType != null and  machineType != ''">
+                machineType,
+            </if>
+            <if test="qualificationImg != null and  qualificationImg != ''">
+                qualificationImg,
+            </if>
+            <if test="invoiceType != null and  invoiceType != ''">
+                invoiceType,
+            </if>
             updateTime, validFlag
         ) values (
             #{shopId}, #{name}, #{aliasName}, #{commodityType}, #{bigTypeId}, #{smallTypeId}, #{tinyTypeId}, #{mainImage},
@@ -98,6 +122,30 @@
             </if>
             <if test="productCode != null and  productCode != ''">
                 #{productCode},
+            </if>
+            <if test="searchKey != null and  searchKey != ''">
+                #{searchKey},
+            </if>
+            <if test="allAreaFlag != null and  allAreaFlag != ''">
+                #{allAreaFlag},
+            </if>
+            <if test="step != null and  step != ''">
+                #{step},
+            </if>
+            <if test="costPrice != null and  costPrice != ''">
+                #{costPrice},
+            </if>
+            <if test="provinceIds != null and  provinceIds != ''">
+                #{provinceIds},
+            </if>
+            <if test="machineType != null and  machineType != ''">
+                #{machineType},
+            </if>
+            <if test="qualificationImg != null and  qualificationImg != ''">
+                #{qualificationImg},
+            </if>
+            <if test="invoiceType != null and  invoiceType != ''">
+                #{invoiceType},
             </if>
              #{updateTime}, #{validFlag}
         )
@@ -153,6 +201,30 @@
             <if test="productCode != null and  productCode != ''">
                 productCode = #{productCode},
             </if>
+            <if test="searchKey != null and  searchKey != ''">
+                searchKey = #{searchKey},
+            </if>
+            <if test="allAreaFlag != null and  allAreaFlag != ''">
+                allAreaFlag = #{allAreaFlag},
+            </if>
+            <if test="step != null and  step != ''">
+                step = #{step},
+            </if>
+            <if test="costPrice != null and  costPrice != ''">
+                costPrice = #{costPrice},
+            </if>
+            <if test="provinceIds != null and  provinceIds != ''">
+                provinceIds = #{provinceIds},
+            </if>
+            <if test="machineType != null and  machineType != ''">
+                machineType = #{machineType},
+            </if>
+            <if test="qualificationImg != null and  qualificationImg != ''">
+                qualificationImg = #{qualificationImg},
+            </if>
+            <if test="invoiceType != null and  invoiceType != ''">
+                invoiceType = #{invoiceType},
+            </if>
             updateTime = #{updateTime}, validFlag = #{validFlag}
         where productID = #{productId}
     </update>
@@ -299,15 +371,12 @@
         order by mainFlag DESC
     </select>
     <select id="getProductForm" resultType="com.caimei365.commodity.model.vo.ProductFormVo">
-        select productID as productId, shopID as shopId, name as name, aliasName as aliasName, commodityType as commodityType,
-            bigTypeId as bigTypeId, smallTypeId as smallTypeId, tinyTypeId as tinyTypeId, mainImage as mainImage,
-            brandId as brandId, productType as productType, tags as tags, unit as unit, normalPrice as normalPrice,
-            price1 as price, includedTax as includedTax, minBuyNumber as minBuyNumber, stock as stock,
-            productCategory as productCategory, serviceNumber as serviceNumber, supplierTaxPoint as supplierTaxPoint,
-            addTime as addTime, hasSkuFlag as hasSkuFlag, sellNumber as sellNumber, sortIndex as sortIndex,
-            featuredFlag as featuredFlag, costCheckFlag as costCheckFlag, recommendType as recommendType,
-            price1TextFlag as priceFlag, actFlag as actFlag, ladderPriceFlag as ladderPriceFlag, visibility as visibility,
-            productCode as productCode, updateTime as updateTime, validFlag as validFlag
+        select productID as productId, shopID as shopId,  name, aliasName, commodityType, mainImage, stock, invoiceType,
+            bigTypeID as bigTypeId, smallTypeID as smallTypeId, tinyTypeID as tinyTypeId, searchKey, visibility,
+            brandID as brandId,  productType, tags, unit, normalPrice, price1 as price, includedTax, minBuyNumber,
+            productCategory, serviceNumber, supplierTaxPoint, price1TextFlag as priceFlag, actFlag, ladderPriceFlag,
+            addTime, hasSkuFlag, sellNumber, sortIndex, featuredFlag, costCheckFlag, recommendType, machineType,
+            productCode, updateTime, validFlag, searchKey, allAreaFlag, step, costPrice, provinceIds, qualificationImg
         from product
         where productID = #{productId}
     </select>
@@ -330,4 +399,22 @@
         from productdetailinfo
         where productId = #{productId}
     </select>
+    <select id="getProductShopById" resultType="com.caimei365.commodity.model.vo.ShopVo">
+        select userID as userId, shopID as shopId, name, sname as shortName, linkMan, contractMobile,
+               contractEmail1 as contractEmail, contractEmail1 as email, provinceID as proviceId, cityID as cityId, townID as townId,
+               address, socialCreditCode, businessLicenseImage as businessLicense, firstShopType, secondShopType,
+               mainpro as mainProduct, productDesc as mainProductDesc,legalPerson,registeredCapital,fax as faxNumber,
+               nature as companyNature, turnover, medicalPracticeLicenseImg1 as medicalPracticeLicense, info as shopDesc,
+               businessScope, logo, addTime, status, contractPhone, validFlag, website, wxOfficialAccount, wxApplets
+        from shop where shopID = #{shopId}
+    </select>
+    <select id="getProductNumById" resultType="java.lang.Integer">
+        select COUNT(*) as normalNum from product p
+        where p.shopID = #{shopId} and p.validFlag = 2
+        group by p.shopID
+    </select>
+    <select id="getUserIdentityById" resultType="java.lang.Integer">
+        select userIdentity from user
+        where userID = #{userId}
+    </select>
 </mapper>

+ 10 - 3
src/test/java/com/caimei365/commodity/ProductApplicationTests.java

@@ -1,13 +1,20 @@
 package com.caimei365.commodity;
 
+import org.apache.commons.lang.StringUtils;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 
+import java.util.Arrays;
+
 @SpringBootTest
 class ProductApplicationTests {
 
-    @Test
-    void contextLoads() {
-    }
+//    @Test
+//    void contextLoads() {
+//        String[] split = new String[]{"wwe","dsfsdf","","","dsfds"};
+//        Object[] objects = Arrays.stream(split).filter(StringUtils::isNotEmpty).toArray();
+//        System.out.println(Arrays.toString(objects));
+//    }
+
 
 }