Ver código fonte

新增excel导入

ghost 4 anos atrás
pai
commit
5b8f92c75f

+ 2 - 3
forest-admin/admin-server/pom.xml

@@ -73,14 +73,13 @@
             <artifactId>poi-ooxml</artifactId>
             <version>3.17</version>
         </dependency>
-        <!-- easyexcel依赖包 -->
+        <!--easyexcel,推荐使用2.0 以上版本,功能更加完善-->
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>easyexcel</artifactId>
-            <version>1.1.2-beat1</version>
+            <version>2.2.6</version>
         </dependency>
 
-
     </dependencies>
 
     <build>

+ 20 - 4
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/controller/PmsProductController.java

@@ -1,10 +1,14 @@
 package com.hwrj.cloud.admin.controller;
 
 
+import com.alibaba.excel.EasyExcel;
 import com.hwrj.cloud.admin.common.PmsProductOutput;
+import com.hwrj.cloud.admin.dao.PmsProductExcelDao;
+import com.hwrj.cloud.admin.dto.param.PmsProductExcel;
+import com.hwrj.cloud.admin.dto.param.PmsProductParam;
+import com.hwrj.cloud.admin.listener.PmsProductExcelListener;
 import com.hwrj.cloud.common.api.CommonPage;
 import com.hwrj.cloud.common.api.CommonResult;
-import com.hwrj.cloud.admin.dto.PmsProductParam;
 import com.hwrj.cloud.admin.dto.PmsProductQueryParam;
 import com.hwrj.cloud.admin.dto.PmsProductResult;
 import com.hwrj.cloud.admin.model.PmsProduct;
@@ -15,14 +19,16 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
 
 /**
  * 商品管理Controller
  * Created by macro on 2018/4/26.
  */
-@Controller
+@RestController
 @Api(tags = "PmsProductController", description = "商品管理")
 @RequestMapping("/product")
 public class PmsProductController {
@@ -32,7 +38,7 @@ public class PmsProductController {
     @ApiOperation("创建商品")
     @RequestMapping(value = "/create", method = RequestMethod.POST)
     @ResponseBody
-    public CommonResult create(@RequestBody PmsProductParam productParam, BindingResult bindingResult) {
+    public CommonResult create(@RequestBody com.hwrj.cloud.admin.dto.PmsProductParam productParam, BindingResult bindingResult) {
         int count = productService.create(productParam);
         if (count > 0) {
             return CommonResult.success(count);
@@ -52,7 +58,7 @@ public class PmsProductController {
     @ApiOperation("更新商品")
     @RequestMapping(value = "/update/{id}", method = RequestMethod.POST)
     @ResponseBody
-    public CommonResult update(@PathVariable Long id, @RequestBody PmsProductParam productParam, BindingResult bindingResult) {
+    public CommonResult update(@PathVariable Long id, @RequestBody com.hwrj.cloud.admin.dto.PmsProductParam productParam, BindingResult bindingResult) {
         int count = productService.update(id, productParam);
         if (count > 0) {
             return CommonResult.success(count);
@@ -154,5 +160,15 @@ public class PmsProductController {
         return CommonResult.success(pmsProduct);
     }
 
+    @Autowired
+    private PmsProductExcelDao productExcelDao;
+
+    @PostMapping(value = "/import")
+    public CommonResult importBasic(MultipartFile file) throws IOException {
+        PmsProductExcelListener basicExcelListener = new PmsProductExcelListener(productExcelDao);
+        EasyExcel.read(file.getInputStream(), PmsProductExcel.class, basicExcelListener).headRowNumber(1).sheet().doRead();
+        return CommonResult.success();
+    }
+
 
 }

+ 11 - 0
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/dao/PmsProductExcelDao.java

@@ -0,0 +1,11 @@
+package com.hwrj.cloud.admin.dao;
+
+import com.hwrj.cloud.admin.dto.param.PmsProductParam;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+@Mapper
+public interface PmsProductExcelDao {
+    void saveData(@Param("list") List<PmsProductParam> list);
+}

+ 73 - 0
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/dto/param/PmsProductExcel.java

@@ -0,0 +1,73 @@
+package com.hwrj.cloud.admin.dto.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class PmsProductExcel implements Serializable {
+    /**
+     * 商品名称
+     */
+    private String name;
+    /**
+     * 品牌名称
+     */
+    private String brandName;
+    /**
+     * 商品图片
+     */
+    private String pic;
+    /**
+     *规格
+     */
+    private String spec;
+    /**
+     * 单位
+     */
+    private String unit;
+
+    /**
+     * 产品标准代号
+     * */
+    private String productStandardCode;
+    /**
+     * 零售价格
+     */
+    private BigDecimal price;
+    /**
+     * 批发价
+     */
+    private BigDecimal tradePrice;
+    /**
+     * 生产日期
+     */
+    private int dateOfManufacture;
+    /**
+     * 保质期
+     */
+    private String qualityGuaranteePeriod;
+    /**
+     * 生产地
+     * */
+    private String placeOfProduction;
+    /**
+     * 供应商
+     */
+    private String umsCompanyInfo;
+    /**
+     * 商品描述
+     */
+    private String description;
+
+    /**
+     * 使用说明
+     * */
+    private String instructions;
+    /**
+     * 注意事项
+     * */
+    private String pointsForAttention;
+}

+ 245 - 0
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/dto/param/PmsProductParam.java

@@ -0,0 +1,245 @@
+package com.hwrj.cloud.admin.dto.param;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class PmsProductParam {
+    @ExcelIgnore
+    private Long id;
+    @ExcelIgnore
+    private Long brandId;
+    @ExcelIgnore
+    private Long productCategoryId;
+    @ExcelIgnore
+    private Long feightTemplateId;
+    @ExcelIgnore
+    private Long productAttributeCategoryId;
+    /****/
+    @ExcelProperty("名称")
+    private String name;
+    /****/
+    @ExcelProperty("图片")
+    private String pic;
+    /**
+     * 货号
+     **/
+    @ExcelProperty("货号")
+    private String productSn;
+    /**
+     * 删除状态:0->未删除;1->已删除
+     **/
+    @ExcelProperty("删除状态:0->未删除;1->已删除")
+    private int deleteStatus;
+    /**
+     * 上架状态:0->下架;1->上架
+     **/
+    @ExcelProperty("上架状态:0->下架;1->上架")
+    private int publishStatus;
+    /**
+     * 新品状态:0->不是新品;1->新品
+     **/
+    @ExcelProperty("新品状态:0->不是新品;1->新品")
+    private int newStatus;
+    /**
+     * 推荐状态;0->不推荐;1->推荐
+     **/
+    @ExcelProperty("推荐状态;0->不推荐;1->推荐")
+    private int recommandStatus;
+    /**
+     * 审核状态:0->未审核;1->审核通过
+     **/
+    @ExcelProperty("审核状态:0->未审核;1->审核通过")
+    private int verifyStatus;
+    /**
+     * 排序
+     **/
+    @ExcelProperty("排序")
+    private int sort;
+    /**
+     * 销量
+     **/
+    @ExcelProperty("销量")
+    private int sale;
+    /**价格**/
+    @ExcelProperty("价格")
+    private BigDecimal price;
+    /**
+     * 促销价格
+     **/
+    @ExcelProperty("促销价格")
+    private BigDecimal promotionPrice;
+    /**
+     * 赠送的成长值
+     **/
+    @ExcelProperty("赠送的成长值")
+    private int giftGrowth;
+    /**
+     * 赠送的积分
+     **/
+    @ExcelProperty("赠送的积分")
+    private int giftPoint;
+    /**
+     * 限制使用的积分数
+     **/
+    @ExcelProperty("限制使用的积分数")
+    private int usePointLimit;
+    /**
+     * 副标题
+     **/
+    @ExcelProperty("副标题")
+    private String subTitle;
+    /**
+     * 商品描述
+     **/
+    @ExcelProperty("商品描述")
+    private String description;
+    /**
+     * 市场价
+     **/
+    @ExcelProperty("市场价")
+    private BigDecimal originalPrice;
+    /**
+     * 库存
+     **/
+    @ExcelProperty("库存")
+    private int stock;
+    /**
+     * 库存预警值
+     **/
+    @ExcelProperty("库存预警值")
+    private int lowStock;
+    /**
+     * 单位
+     **/
+    @ExcelProperty("单位")
+    private String unit;
+    /**
+     * 商品重量,默认为克
+     **/
+    @ExcelProperty("商品重量,默认为克")
+    private int weight;
+    /**
+     * 是否为预告商品
+     **/
+    @ExcelProperty("是否为预告商品")
+    private int previewStatus;
+    /**
+     * 以逗号分割的产品服务
+     **/
+    @ExcelProperty("以逗号分割的产品服务")
+    private String serviceIds;
+    @ExcelIgnore
+    private String keywords;
+    @ExcelIgnore
+    private String note;
+    /**
+     * 画册图片
+     **/
+    @ExcelProperty("画册图片")
+    private String albumPics;
+    @ExcelIgnore
+    private String detailTitle;
+    @ExcelIgnore
+    private String detailDesc;
+    /**
+     * 产品详情网页内容
+     **/
+    @ExcelProperty("产品详情网页内容")
+    private String detailHtml;
+    /**
+     * 移动端网页详情
+     **/
+    @ExcelProperty("移动端网页详情")
+    private String detailMobileHtml;
+    /**
+     * 促销开始时间
+     **/
+    @ExcelProperty("促销开始时间")
+    private Date promotionStartTime;
+    /**
+     * 促销结束时间
+     **/
+    @ExcelProperty("促销结束时间")
+    private Date promotionEndTime;
+    /**
+     * 活动限购数量
+     **/
+    @ExcelProperty("活动限购数量")
+    private int promotionPerLimit;
+    /**
+     * 促销类型
+     **/
+    @ExcelProperty("促销类型")
+    private String promotionType;
+    /**
+     * 品牌名称
+     **/
+    @ExcelProperty("品牌名称")
+    private String brandName;
+    /**
+     * 商品分类名称
+     **/
+    @ExcelProperty("商品分类名称")
+    private String productCategoryName;
+    /**
+     * 供应商id
+     **/
+    @ExcelProperty("供应商id")
+    private Long umsCompanyInfoId;
+    /**
+     * 供应商
+     **/
+    @ExcelProperty("供应商")
+    private String umsCompanyInfo;
+    /**
+     * 批发价
+     **/
+    @ExcelProperty("批发价")
+    private BigDecimal tradePrice;
+    /**
+     * 规格
+     **/
+    @ExcelProperty("规格")
+    private String spec;
+    /**
+     * 产品标准代号
+     **/
+    @ExcelProperty("产品标准代号")
+    private String productStandardCode;
+    /**
+     * 生产日期
+     **/
+    @ExcelProperty("生产日期")
+    private int dateOfManufacture;
+    /**
+     * 生产地id
+     **/
+    @ExcelProperty("生产地id")
+    private Long placeOfProductionId;
+    /**
+     * 生产地
+     **/
+    @ExcelProperty("生产地")
+    private String placeOfProduction;
+    /**
+     * 使用说明
+     **/
+    @ExcelProperty("使用说明")
+    private String instructions;
+    /**
+     * 注意事项
+     **/
+    @ExcelProperty("注意事项")
+    private String pointsForAttention;
+    /**
+     * 保质期
+     **/
+    @ExcelProperty("保质期")
+    private String qualityGuaranteePeriod;
+}

+ 107 - 0
forest-admin/admin-server/src/main/java/com/hwrj/cloud/admin/listener/PmsProductExcelListener.java

@@ -0,0 +1,107 @@
+package com.hwrj.cloud.admin.listener;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.hwrj.cloud.admin.dao.PmsProductExcelDao;
+import com.hwrj.cloud.admin.dto.param.PmsProductExcel;
+import com.hwrj.cloud.admin.dto.param.PmsProductParam;
+import com.hwrj.cloud.security.util.SpringUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+/*
+ * 监听器批处理数据
+ * */
+@Component
+public class PmsProductExcelListener extends AnalysisEventListener<PmsProductExcel> {
+
+    private PmsProductExcelDao productExcelDao;
+
+    public PmsProductExcelListener() {
+
+    }
+
+    public PmsProductExcelListener(PmsProductExcelDao productExcelDao) {
+        this.productExcelDao = productExcelDao;
+    }
+
+
+    /**
+     * 批处理阈值2000
+     */
+    private static final int BATCH_COUNT = 2000;
+
+    List<PmsProductParam> list = new ArrayList();
+
+    List<PmsProductParam> erroList = new ArrayList<>();
+
+
+    @Override
+    public void invoke(PmsProductExcel pmsProductExcel, AnalysisContext analysisContext) {
+        //获取对应的行数
+        int num = analysisContext.readRowHolder().getRowIndex();
+        PmsProductParam pmsProductParam=new PmsProductParam();
+        BeanUtils.copyProperties(pmsProductExcel,pmsProductParam);
+
+
+        pmsProductParam.setProductSn(pmsProductExcel.getProductStandardCode());
+        String name = pmsProductExcel.getName();
+        //标题
+        pmsProductParam.setDetailTitle(name);
+        //笔记
+        pmsProductParam.setNote(name);
+        //关键字
+        pmsProductParam.setKeywords(name);
+
+        String description = pmsProductExcel.getDescription();
+
+        //商品描述
+        pmsProductParam.setDescription(description);
+        //简述
+        pmsProductParam.setSubTitle(description);
+        //使用说明
+        String instructions = pmsProductExcel.getInstructions();
+        //默认文本
+        pmsProductParam.setDetailDesc(instructions);
+        //web网页显示
+        pmsProductParam.setDetailHtml(instructions);
+        //手机网页显示
+        pmsProductParam.setDetailMobileHtml(instructions);
+        BigDecimal price = pmsProductExcel.getPrice();
+        //市场价
+        pmsProductParam.setOriginalPrice(price);
+        list.add(pmsProductParam);
+        if (list.size() >= BATCH_COUNT) {
+            saveData();
+            list.clear();
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        saveData();
+        // log.info("所有数据解析完成!");
+
+    }
+
+    private void saveData(){
+        try {
+            //调用saveData()方法
+            productExcelDao.saveData(list);
+        } catch (Exception e) {
+            e.getMessage();
+            erroList.addAll(list);
+            String name="导入失败数据";
+            String templateFileName = "D:\\file"+ File.separator + name+System.currentTimeMillis()+".xlsx";
+            EasyExcel.write(templateFileName, PmsProductParam.class).sheet(name).doWrite(erroList);
+        }
+
+    }
+}

+ 117 - 0
forest-admin/admin-server/src/main/resources/dao/ProductExcelDao.xml

@@ -0,0 +1,117 @@
+<?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.hwrj.cloud.admin.dao.PmsProductExcelDao">
+    <insert id="saveData">
+         INSERT INTO pms_product
+           (
+            brand_id,
+            product_category_id,
+            feight_template_id,
+            product_attribute_category_id,
+            name,
+            pic,
+            product_sn,
+            delete_status,
+            publish_status,
+            new_status,
+            recommand_status,
+            verify_status,
+            sort,
+            sale,
+            price,
+            promotion_price,
+            gift_growth,
+            gift_point,
+            use_point_limit,
+            sub_title,
+            description,
+            original_price,
+            stock,
+            low_stock,
+            unit,
+            weight,
+            preview_status,
+            service_ids,
+            keywords,
+            note,
+            album_pics,
+            detail_title,
+            detail_desc,
+            detail_html,
+            detail_mobile_html,
+            promotion_start_time,
+            promotion_end_time,
+            promotion_per_limit,
+            promotion_type,
+            brand_name,
+            product_category_name,
+            ums_company_info_id,
+            ums_company_info,
+            trade_price,
+            spec,
+            product_standard_code,
+            date_of_manufacture,
+            place_of_production_id,
+            place_of_production,
+            instructions,
+            points_for_attention,
+            quality_guarantee_period)
+        VALUES
+        <foreach collection="list" item="item" index="index" separator=",">
+         <trim prefix="(" suffix=")" suffixOverrides=",">
+             #{item.brandId},
+             #{item.productCategoryId},
+             #{item.feightTemplateId},
+             #{item.productAttributeCategoryId},
+             #{item.name},
+             #{item.pic},
+             #{item.productSn},
+             #{item.deleteStatus},
+             #{item.publishStatus},
+             #{item.newStatus},
+             #{item.recommandStatus},
+             #{item.verifyStatus},
+             #{item.sort},
+             #{item.sale},
+             #{item.price},
+             #{item.promotionPrice},
+             #{item.giftGrowth},
+             #{item.giftPoint},
+             #{item.usePointLimit},
+             #{item.subTitle},
+             #{item.description},
+             #{item.originalPrice},
+             #{item.stock},
+             #{item.lowStock},
+             #{item.unit},
+             #{item.weight},
+             #{item.previewStatus},
+             #{item.serviceIds},
+             #{item.keywords},
+             #{item.note},
+             #{item.albumPics},
+             #{item.detailTitle},
+             #{item.detailDesc},
+             #{item.detailHtml},
+             #{item.detailMobileHtml},
+             #{item.promotionStartTime},
+             #{item.promotionEndTime},
+             #{item.promotionPerLimit},
+             #{item.promotionType},
+             #{item.brandName},
+             #{item.productCategoryName},
+             #{item.umsCompanyInfoId},
+             #{item.umsCompanyInfo},
+             #{item.tradePrice},
+             #{item.spec},
+             #{item.productStandardCode},
+             #{item.dateOfManufacture},
+             #{item.placeOfProductionId},
+             #{item.placeOfProduction},
+             #{item.instructions},
+             #{item.pointsForAttention},
+             #{item.qualityGuaranteePeriod}
+         </trim>
+        </foreach>
+    </insert>
+</mapper>