Browse Source

二手小程序

zhijiezhao 1 tuần trước cách đây
mục cha
commit
404147690c

+ 40 - 6
src/main/java/com/caimei365/commodity/controller/SecondHandApi.java

@@ -45,7 +45,7 @@ public class SecondHandApi {
             @ApiImplicitParam(required = false, name = "pageNum", value = "页码"),
             @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
     })
-    @IpSave(saveName = "二手商品列表",saveParams = true)
+    @IpSave(saveName = "二手商品列表", saveParams = true)
     @GetMapping("/list")
     public ResponseJson<PaginationVo<SecondListVo>> getSecondHandList(Integer userId, Integer secondHandType, Integer instrumentType, String name,
                                                                       @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
@@ -53,6 +53,32 @@ public class SecondHandApi {
         return secondHandService.getSecondHandList(userId, secondHandType, instrumentType, name, pageNum, pageSize);
     }
 
+    @ApiOperation("二手商品列表(旧:/product/getSecondHandProductList)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = true, name = "userId", value = "机构用户id"),
+            @ApiImplicitParam(required = false, name = "name", value = "二手商品名称搜索关键词"),
+            @ApiImplicitParam(required = true, name = "buyFlag", value = "1卖出 2买入"),
+            @ApiImplicitParam(required = false, name = "pageNum", value = "页码"),
+            @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
+    })
+    @IpSave(saveName = "二手商品列表", saveParams = true)
+    @GetMapping("/products")
+    public ResponseJson<PaginationVo<SecondListVo>> getSecondHandProducts(Integer buyFlag, Integer userId, String name,
+                                                                          @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                                          @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
+        return secondHandService.getSecondHandProducts(buyFlag, userId, name, pageNum, pageSize);
+    }
+
+    @ApiOperation("二手商品详情(旧:/product/getSecondHandProductDetail)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = true, name = "userId", value = "机构用户id"),
+            @ApiImplicitParam(required = true, name = "productId", value = "商品Id")
+    })
+    @IpSave(saveName = "获取二手商品详情", saveParams = true)
+    @GetMapping("/second/detail")
+    public ResponseJson<SecondDetailVo> getSecondProductDetail(Integer userId, Integer productId) {
+        return secondHandService.getSecondProductDetail(userId, productId);
+    }
     /**
      * 获取二手商品详情
      *
@@ -63,7 +89,7 @@ public class SecondHandApi {
             @ApiImplicitParam(required = true, name = "userId", value = "机构用户id"),
             @ApiImplicitParam(required = true, name = "productId", value = "商品Id")
     })
-    @IpSave(saveName = "获取二手商品详情",saveParams = true)
+    @IpSave(saveName = "获取二手商品详情", saveParams = true)
     @GetMapping("/detail")
     public ResponseJson<SecondDetailVo> getSecondDetail(Integer userId, Integer productId) {
         return secondHandService.getSecondHandDetail(userId, productId);
@@ -99,21 +125,29 @@ public class SecondHandApi {
      *                  ,"fileType" : 商品包含的文件类型,1,仪器原始合同,2,仪器注册证,3,仪器发票,4,仪器报关单,5,无任何文件'
      *                  (fileType字符串逗号拼接)
      *                  ,"checkCode" : 验证码
-     *                  ,"authenticationBackImage" : 身份证背面照片
-     *                  ,"cardNumber" : 收款卡号
      *                  ,"userId" : userId
      *                  ,"buyFlag" : 1卖出 2买入
+     *                  ,publishMethod: 1, //发布方式 1自行发布 2区域经理发布
+     *                  ,productImages 资料图片
      *                  }
      * @param headers   HttpHeaders
      */
     @ApiOperation("发布二手商品(旧:/product/releaseSecondHandProduct)")
-    @IpSave(saveName = "发布二手商品",saveParams = false)
+    @IpSave(saveName = "发布二手商品", saveParams = false)
     @Idempotent(prefix = "idempotent_secondhand", keys = {"#secondDto"}, expire = 5)
     @PostMapping("/release")
     public ResponseJson releaseSecondHand(SecondDto secondDto, @RequestHeader HttpHeaders headers) {
         return secondHandService.releaseSecondHand(secondDto, headers);
     }
 
+    @ApiOperation("小程序发布二手商品")
+    @IpSave(saveName = "小程序发布二手商品", saveParams = false)
+    @Idempotent(prefix = "idempotent_secondhands", keys = {"#secondDto"}, expire = 5)
+    @PostMapping("/release/second")
+    public ResponseJson releaseSecondHands(SecondDto secondDto, @RequestHeader HttpHeaders headers) {
+        return secondHandService.releaseSecondHands(secondDto, headers);
+    }
+
     /**
      * 二手下单页面商品
      *
@@ -152,7 +186,7 @@ public class SecondHandApi {
     @ApiOperation("计算二手商品浏览量(旧:/product/updateSecondHandProductCount)")
     @ApiImplicitParam(required = true, name = "productId", value = "商品Id")
     @GetMapping("/views")
-    public ResponseJson<Integer> updateSecondHandViews(Integer productId){
+    public ResponseJson<Integer> updateSecondHandViews(Integer productId) {
         if (null == productId) {
             return ResponseJson.error("商品Id不能为空!", null);
         }

+ 2 - 0
src/main/java/com/caimei365/commodity/mapper/SecondHandMapper.java

@@ -101,4 +101,6 @@ public interface SecondHandMapper {
     void insertProductValidFlag(Integer productId, Integer validFlag);
 
     List<Integer> getNewAddProductIds(Integer secondHandType);
+
+    List<SecondListVo> getSecondHandProducts(@Param("buyFlag") Integer buyFlag, @Param("userId") Integer userId, @Param("name") String name);
 }

+ 7 - 1
src/main/java/com/caimei365/commodity/model/dto/SecondDto.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * Description
@@ -52,7 +53,7 @@ public class SecondDto implements Serializable {
     /**
      * 二手商品分类,1二手仪1器,2临期产品,3其他
      */
-    @ApiModelProperty("二手商品分类,1二手仪1器,2临期产品,3其他")
+    @ApiModelProperty("二手商品分类,1二手仪器,2临期产品,3其他")
     private String secondHandType;
     /**
      * 二手仪器分类的类型,1轻光电、2重光电、3耗材配件(仅适用于二手仪器分类多个用英文逗号分分隔)
@@ -198,4 +199,9 @@ public class SecondDto implements Serializable {
     @ApiModelProperty("二手商品状态 1.二手预成交商品 2.二手估价商品")
     private Integer announType;
 
+    @ApiModelProperty("发布方式 1自行发布 2区域经理发布")
+    private Integer publishMethod;
+
+    @ApiModelProperty("二手商品资料图:发票、购买合同等截图")
+    private List<String> productImages;
 }

+ 6 - 1
src/main/java/com/caimei365/commodity/model/po/ProductPo.java

@@ -1,8 +1,8 @@
 package com.caimei365.commodity.model.po;
 
 import com.caimei365.commodity.model.dto.Sku;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
@@ -15,6 +15,7 @@ import java.util.List;
  * @author : Charles
  * @date : 2021/4/16
  */
+@Accessors(chain = true)
 @Data
 public class ProductPo implements Serializable {
     private static final long serialVersionUID = 1L;
@@ -278,4 +279,8 @@ public class ProductPo implements Serializable {
      * 库存skus
      */
     public List<Sku> skus;
+    /**
+     * 发布方式 1自行发布 2区域经理发布
+     */
+    private Integer publishMethod;
 }

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

@@ -46,5 +46,8 @@ public class SecondListVo implements Serializable {
     private String provinceCityDistrict;
     /** 二手商品列表图片数据集合 */
     private List<String> imageList;
-
+    /**
+     * 商品状态
+     */
+    private Integer validFlag;
 }

+ 8 - 0
src/main/java/com/caimei365/commodity/service/SecondHandService.java

@@ -85,13 +85,21 @@ public interface SecondHandService {
 
     /**
      * 计算二手商品浏览量
+     *
      * @param productId 商品Id
      */
     ResponseJson<Integer> updateSecondHandViews(Integer productId);
 
     /**
      * 二手商品-相关推荐
+     *
      * @param productId 商品Id
      */
     ResponseJson<List<SecondListVo>> getSecondRecommends(Integer productId);
+
+    ResponseJson releaseSecondHands(SecondDto secondDto, HttpHeaders headers);
+
+    ResponseJson<PaginationVo<SecondListVo>> getSecondHandProducts(Integer buyFlag, Integer userId, String name, int pageNum, int pageSize);
+
+    ResponseJson<SecondDetailVo> getSecondProductDetail(Integer userId, Integer productId);
 }

+ 142 - 48
src/main/java/com/caimei365/commodity/service/impl/SecondHandServiceImpl.java

@@ -19,13 +19,11 @@ import com.github.pagehelper.PageHelper;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.redis.serializer.StringRedisSerializer;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
-import java.io.Serializable;
 import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
@@ -106,7 +104,7 @@ public class SecondHandServiceImpl implements SecondHandService {
                 // 获取二手商品图片
                 List<String> images = secondHandMapper.getImageByProductId(second.getProductId());
                 images.forEach(img -> {
-                    img = ImageUtils.getImageURL("product", img, 0, domain);
+                    ImageUtils.getImageURL("product", img, 0, domain);
                 });
                 second.setImageList(images);
             }
@@ -406,38 +404,10 @@ public class SecondHandServiceImpl implements SecondHandService {
     }
 
     private ResponseJson saveSecondHandProduct(SecondDto secondDto) {
-        /**
-         *  当前版本二手商品作为黄页性质,不参与交易,shopId不需要
-         //根据银行卡判断是否注册过特殊二手供应商,有则挂在之前的供应商名下,否则注册新供应商
-         Integer shopId = secondHandMapper.findSecondShop(secondDto.getCardNumber());
-         if (null == shopId || shopId <= 0) {
-         //保存为特殊二手供应商
-         ShopVo shopVo = new ShopVo();
-         //1个人,2公司
-         String name = 1 == secondDto.getPublishIdentity() ? secondDto.getContactName() : secondDto.getCompanyName();
-         shopVo.setName(name);
-         shopVo.setLinkMan(secondDto.getContactName());
-         shopVo.setContractMobile(secondDto.getContactMobile());
-         shopVo.setCardNumber(secondDto.getCardNumber());
-         if (secondDto.getBanOfDeposit() != null) {
-         shopVo.setBanOfDeposit(secondDto.getBanOfDeposit());
-         }
-         if (secondDto.getAccountName() != null) {
-         shopVo.setAccountName(secondDto.getAccountName());
-         }
-
-         if (secondDto.getAccountType() != null) {
-         shopVo.setAccountType(secondDto.getAccountType());
-         }
-         secondHandMapper.insertShop(shopVo);
-         shopId = shopVo.getShopId();
-         }*/
         // 设置日期时间格式
         Date date = new Date();
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         String current = dateFormat.format(date);
-        // 图片
-
         // 组装数据
         ProductPo product = new ProductPo();
         if (null != secondDto.getImage()) {
@@ -458,6 +428,18 @@ public class SecondHandServiceImpl implements SecondHandService {
                 secondHandMapper.insertProductImage(imagePo);
             }
         }
+        if (null != secondDto.getProductImages()) {
+            List<String> productImages = secondDto.getProductImages();
+            productImages.forEach(image -> {
+                ProductImagePo imagePo = new ProductImagePo();
+                imagePo.setProductId(product.getProductId());
+                imagePo.setShopId(1252);
+                imagePo.setAddTime(current);
+                imagePo.setImage(image);
+                secondHandMapper.insertProductImage(imagePo);
+            });
+        }
+        product.setPublishMethod(secondDto.getPublishMethod());
         product.setBrandId(secondDto.getBrandId());
         product.setName(secondDto.getName());
         product.setAliasName(secondDto.getName());
@@ -493,6 +475,7 @@ public class SecondHandServiceImpl implements SecondHandService {
         secondHandMapper.insertProductValidFlag(product.getProductId(), product.getValidFlag());
         /*保存sku数据*/
         Sku sku = new Sku();
+        sku.setOrganizeId(5);
         sku.setPrice(secondDto.getPrice());
         sku.setStock(secondDto.getStock());
         sku.setNormalPrice(secondDto.getNormalPrice());
@@ -532,7 +515,7 @@ public class SecondHandServiceImpl implements SecondHandService {
         }
         secondPo.setBuyFlag(secondDto.getBuyFlag());
         secondPo.setUserId(secondDto.getUserId());
-        secondPo.setSecondHandType(secondDto.getSecondHandType());
+        secondPo.setSecondHandType("1");
         secondPo.setInstrumentType(secondDto.getInstrumentType());
         secondPo.setFixedYears(secondDto.getFixedYears());
         secondPo.setMaturityYears(secondDto.getMaturityYears());
@@ -552,24 +535,8 @@ public class SecondHandServiceImpl implements SecondHandService {
         secondPo.setOssName(secondDto.getOssName());
         secondPo.setAuthenticationImage(secondDto.getAuthenticationImage());
         secondPo.setCommitmentImage(secondDto.getCommitmentImage());
-        //新增字段,用户身份,营业执照,身份证背面
-        secondPo.setPublishIdentity(secondDto.getPublishIdentity());
-        secondPo.setLicenseImage(secondDto.getLicenseImage());
-        secondPo.setAuthenticationBackImage(secondDto.getAuthenticationBackImage());
         /* 保存商品二手附加详细信息 */
         secondHandMapper.saveSencondHandProduct(secondPo);
-        //保存商品包含文件
-        if (!"".equals(secondDto.getFileType()) || secondDto.getFileType() != null) {
-            String fileTypes = secondDto.getFileType();
-            if (fileTypes.contains(",")) {
-                String[] split = fileTypes.split(",");
-                for (String fileType : split) {
-                    secondHandMapper.insertSecondFileType(fileType, secondPo.getId(), product.getProductId());
-                }
-            } else {
-                secondHandMapper.insertSecondFileType(fileTypes, secondPo.getId(), product.getProductId());
-            }
-        }
         return ResponseJson.success(product.getProductId());
     }
 
@@ -679,4 +646,131 @@ public class SecondHandServiceImpl implements SecondHandService {
         }
         return ResponseJson.success(recommendList);
     }
+
+    @Override
+    public ResponseJson releaseSecondHands(SecondDto secondDto, HttpHeaders headers) {
+        //校验手机号
+        String contactMobile = secondDto.getContactMobile();
+        String result = ValidateUtil.validateMobile(contactMobile);
+        if (result != null) {
+            return ResponseJson.error("参数异常:联系方式不正确");
+        }
+        //校验验证码
+        String checkCode = secondDto.getCheckCode();
+        if (StringUtils.isBlank(checkCode)) {
+            return ResponseJson.error("参数异常:请输入验证码");
+        }
+        if (StringUtils.isNotBlank(checkCode)) {
+            String redisSmsCode = stringRedisService.get("code:" + contactMobile);
+            // 开发 和 测试环境 固定短信验证码 666666
+            if ("dev".equals(profile) || "beta".equals(profile)) {
+                redisSmsCode = (null != redisSmsCode && !"null".equals(redisSmsCode) ? redisSmsCode : "666666");
+            }
+            if (!checkCode.equals(redisSmsCode)) {
+                return ResponseJson.error("参数异常:手机验证码错误");
+            }
+        }
+        // 验证传入参数
+        Integer brandId = secondDto.getBrandId();
+        String name = secondDto.getName();
+        String source = secondDto.getSource();
+        Integer townId = secondDto.getTownId();
+        String address = secondDto.getAddress();
+        if (null == brandId) {
+            return ResponseJson.error("参数异常:请选择商品品牌");
+        }
+        if (StringUtils.isEmpty(name)) {
+            return ResponseJson.error("参数异常:请输入商品名称");
+        }
+        if (null == townId) {
+            return ResponseJson.error("参数异常:请完善联系地址");
+        }
+        if (StringUtils.isEmpty(address)) {
+            return ResponseJson.error("参数异常:请填写详细地址");
+        }
+        if (StringUtils.isEmpty(source)) {
+            return ResponseJson.error("参数异常:请输入发布来源");
+        }
+        // 保存二手商品
+        return saveSecondHandProduct(secondDto);
+    }
+
+    @Override
+    public ResponseJson<PaginationVo<SecondListVo>> getSecondHandProducts(Integer buyFlag, Integer userId, String name, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<SecondListVo> secondList = secondHandMapper.getSecondHandProducts(buyFlag,userId, name);
+        if (!CollectionUtils.isEmpty(secondList)) {
+            // 初始化商品产品标签
+            int initNewNum = 0;
+            for (SecondListVo second : secondList) {
+                initNewNum++;
+                if (initNewNum > 10) {
+                    second.setNewAdded(0);
+                } else {
+                    second.setNewAdded(1);
+                }
+                // 优化地址信息
+                String provinceCityDistrict = second.getProvinceCityDistrict();
+                if (StringUtils.isNotBlank(provinceCityDistrict)) {
+                    provinceCityDistrict = provinceCityDistrict.replace("/", "").replace("市辖区", "");
+                }
+                second.setProvinceCityDistrict(provinceCityDistrict);
+                //价格千分位处理
+                second.setPriceStr(priceFormatStr(second.getPrice()));
+                // 处理时间格式化
+                second.setOnLineDateStr(dateFormatStr(second.getOnLineDate()));
+                // 获取二手商品图片
+                List<String> images = secondHandMapper.getImageByProductId(second.getProductId());
+                images.forEach(img -> {
+                    ImageUtils.getImageURL("product", img, 0, domain);
+                });
+                second.setImageList(images);
+            }
+        }
+        PaginationVo<SecondListVo> pageData = new PaginationVo<SecondListVo>(secondList);
+        return ResponseJson.success(pageData);
+    }
+
+    @Override
+    public ResponseJson<SecondDetailVo> getSecondProductDetail(Integer userId, Integer productId) {
+        SecondDetailVo second = secondHandMapper.getSecondHandDetail(productId);
+        Integer type = null == second.getSecondHandType() ? 0 : second.getSecondHandType();
+        List<Integer> ids = secondHandMapper.getNewAddProductIds(type);
+        Integer newFlag = ids.contains(second.getProductId()) ? 1 : 0;
+        second.setNewAdded(newFlag.toString());
+        // 优化地址信息
+        String provinceCityDistrict = second.getProvinceCityDistrict();
+        provinceCityDistrict = provinceCityDistrict.replace("/", "").replace("市辖区", "");
+        second.setProvinceCityDistrict(provinceCityDistrict);
+        //价格千分位处理
+        second.setPriceStr(priceFormatStr(second.getPrice()));
+        second.setNormalPriceStr(priceFormatStr(second.getNormalPrice()));
+        second.setOriginalPriceStr(priceFormatStr(second.getOriginalPrice()));
+        // 处理时间格式化
+        second.setOnLineDateStr(dateFormatStr(second.getOnLineDate()));
+        // 获取二手商品图片
+        List<String> images = secondHandMapper.getImageByProductId(second.getProductId());
+        // 获取二手商品图片(处理老的非全路径图片)
+        images.forEach(img -> {
+            img = ImageUtils.getImageURL("product", img, 0, domain);
+        });
+        second.setImageList(images);
+        // 初始商品分类
+        String typeStr = "";
+        Integer secondHandType = second.getSecondHandType();
+        if (1 == secondHandType) {
+            typeStr += "二手仪器";
+        } else if (2 == secondHandType) {
+            typeStr += "临期产品";
+        } else {
+            typeStr += "其他";
+        }
+        // 二手仪器分类
+        Integer instrumentType = second.getInstrumentType();
+        if (1 == instrumentType) {
+            typeStr += "-美容仪器";
+        }
+        second.setTypeStr(typeStr);
+        return ResponseJson.success(second);
+    }
 }

+ 35 - 0
src/main/resources/mapper/SecondHandMapper.xml

@@ -268,4 +268,39 @@
         order by cshd.onLineDate desc
         limit 10
     </select>
+
+    <select id="getSecondHandProducts" resultType="com.caimei365.commodity.model.vo.SecondListVo">
+        select
+        p.productID as productId,
+        p.actStatus,
+        p.`name` as name,
+        p.mainImage as image,
+        cs.price,
+        p.brandID as brandId,
+        IF(p.brandID != 161,cb.name ,cshd.brandName) as "brandName",
+        cshd.sold as "sold",
+        cshd.detailTalkFlag as "detailTalkFlag",
+        cshd.onLineDate as "onLineDate",
+        cshd.viewingNum as "viewingNum",
+        cshd.provinceCityDistrict as "provinceCityDistrict",
+        cshd.buyFlag,
+        copi.validFlag
+        from product p
+        left join cm_organize_product_info copi on copi.productId = p.productID and copi.organizeId = 0
+        left join cm_sku cs on p.productID=cs.productId
+        left join cm_second_hand_detail cshd on p.productID = cshd.productID
+        left join cm_brand cb on cb.id = p.brandID
+        where
+        p.productCategory = 2
+        <if test="buyFlag != null and buyFlag != ''">
+            and cshd.buyFlag = #{buyFlag}
+        </if>
+          <if test="userId != null and userId != ''">
+            and cshd.userId = #{userId}
+        </if>
+        <if test="name != null and name != ''">
+            and p.name like CONCAT('%',#{name},'%')
+        </if>
+        order by cshd.sold, cshd.onLineDate desc
+    </select>
 </mapper>