فهرست منبع

用户行为记录1.0.3

huangzhiguo 1 سال پیش
والد
کامیت
5f734f17f4
33فایلهای تغییر یافته به همراه1332 افزوده شده و 263 حذف شده
  1. 167 0
      src/main/java/com/caimei365/manager/controller/caimei/user/CmMarketShopApi.java
  2. 150 0
      src/main/java/com/caimei365/manager/dao/user/CmMarketShopDao.java
  3. 4 8
      src/main/java/com/caimei365/manager/entity/caimei/shopImport/AdvertHits.java
  4. 9 8
      src/main/java/com/caimei365/manager/entity/caimei/shopImport/ArticleReadVolume.java
  5. 41 0
      src/main/java/com/caimei365/manager/entity/caimei/shopImport/CmMarketReport.java
  6. 33 0
      src/main/java/com/caimei365/manager/entity/caimei/shopImport/CmMarketShop.java
  7. 3 3
      src/main/java/com/caimei365/manager/entity/caimei/shopImport/FunnelModel.java
  8. 3 12
      src/main/java/com/caimei365/manager/entity/caimei/shopImport/Impressions.java
  9. 2 6
      src/main/java/com/caimei365/manager/entity/caimei/shopImport/PageDuration.java
  10. 4 8
      src/main/java/com/caimei365/manager/entity/caimei/shopImport/Proportion.java
  11. 5 14
      src/main/java/com/caimei365/manager/entity/caimei/shopImport/ReadVolume.java
  12. 3 7
      src/main/java/com/caimei365/manager/entity/caimei/shopImport/Remark.java
  13. 3 7
      src/main/java/com/caimei365/manager/entity/caimei/shopImport/Stage.java
  14. 11 10
      src/main/java/com/caimei365/manager/entity/caimei/shopImport/Summary.java
  15. 2 6
      src/main/java/com/caimei365/manager/entity/caimei/shopImport/Visits.java
  16. 74 0
      src/main/java/com/caimei365/manager/service/caimei/listener/AdvertHitsListener.java
  17. 20 6
      src/main/java/com/caimei365/manager/service/caimei/listener/ArticleReadVolumeListener.java
  18. 26 11
      src/main/java/com/caimei365/manager/service/caimei/listener/FunnelModelListener.java
  19. 20 6
      src/main/java/com/caimei365/manager/service/caimei/listener/ImpressionsListener.java
  20. 0 49
      src/main/java/com/caimei365/manager/service/caimei/listener/MallHitsListener.java
  21. 20 6
      src/main/java/com/caimei365/manager/service/caimei/listener/PageDurationListener.java
  22. 20 6
      src/main/java/com/caimei365/manager/service/caimei/listener/ProportionListener.java
  23. 18 4
      src/main/java/com/caimei365/manager/service/caimei/listener/ReadVolumeListener.java
  24. 20 6
      src/main/java/com/caimei365/manager/service/caimei/listener/RemarkListener.java
  25. 25 11
      src/main/java/com/caimei365/manager/service/caimei/listener/StageListener.java
  26. 69 0
      src/main/java/com/caimei365/manager/service/caimei/listener/SummaryListener.java
  27. 0 49
      src/main/java/com/caimei365/manager/service/caimei/listener/TypeDistributionListener.java
  28. 20 6
      src/main/java/com/caimei365/manager/service/caimei/listener/VisitsLisener.java
  29. 73 0
      src/main/java/com/caimei365/manager/service/caimei/user/CmMarketShopService.java
  30. 144 0
      src/main/java/com/caimei365/manager/service/caimei/user/impl/CmMarketShopServiceImpl.java
  31. 13 0
      src/main/java/com/caimei365/manager/utils/formDataUtils.java
  32. 155 0
      src/main/resources/mapper/user/CmMarketShopDao.xml
  33. 175 14
      src/test/java/com/caimei365/manager/ManagerApplicationTests.java

+ 167 - 0
src/main/java/com/caimei365/manager/controller/caimei/user/CmMarketShopApi.java

@@ -0,0 +1,167 @@
+package com.caimei365.manager.controller.caimei.user;
+
+import com.caimei.utils.StringUtils;
+import com.caimei365.manager.entity.PaginationVo;
+import com.caimei365.manager.entity.ResponseJson;
+import com.caimei365.manager.entity.caimei.CmShop;
+import com.caimei365.manager.entity.caimei.shopImport.CmMarketReport;
+import com.caimei365.manager.entity.caimei.shopImport.CmMarketShop;
+import com.caimei365.manager.service.caimei.user.CmMarketShopService;
+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 org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+
+/**
+ * Description
+ *
+ * @author : hzg
+ * @date : 2023/12/14
+ */
+@RestController
+@RequestMapping("/user/market")
+public class CmMarketShopApi {
+
+    @Resource private CmMarketShopService marketShopService;
+
+    /**
+     * 供应商列表
+     * @param shopName
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @GetMapping("/getShop")
+    public ResponseJson<PaginationVo<CmShop>> getShop(String shopName,
+                                                      @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                      @RequestParam(value = "pageSize",defaultValue = "20") int pageSize) {
+
+        return marketShopService.getShop(shopName, pageNum, pageSize);
+    }
+
+    /**
+     * 营销供应商列表
+     * @param shopName
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @GetMapping("/getMarkShopList")
+    public ResponseJson<PaginationVo<CmMarketShop>> getMarkShopList(String shopName,
+                                                                    @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                                    @RequestParam(value = "pageSize",defaultValue = "20") int pageSize) {
+
+        return marketShopService.getMarkShopList(shopName, pageNum, pageSize);
+    }
+
+    /**
+     * 添加营销供应商
+     * @param ids
+     * @return
+     */
+    @GetMapping("/saveMarketShop")
+    public ResponseJson saveMarketShop(String ids) {
+        if (StringUtils.isEmpty(ids) || StringUtils.isBlank(ids)) {
+            return  ResponseJson.error(-1, "供应商营销id不能为空", null);
+        }
+        return marketShopService.saveMarketShop(ids);
+    }
+
+    /**
+     * 上传供应商营销logo
+     * @param id
+     * @param logo
+     * @return
+     */
+    @GetMapping("/uploadShopLogo")
+    public ResponseJson uploadShopLogo(Integer id, String logo) {
+        if (null == id) {
+            return  ResponseJson.error(-1, "供应商营销id不能为空", null);
+        }
+        if (StringUtils.isBlank(logo) || StringUtils.isEmpty(logo)) {
+            return  ResponseJson.error(-1, "供应商营销id不能为空", null);
+        }
+        return marketShopService.uploadShopLogo(id, logo);
+    }
+
+    /**
+     * 数据报表列表
+     * @param marketId
+     * @param reportName
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @GetMapping("/getMarketReport")
+    public ResponseJson<PaginationVo<CmMarketReport>> getMarketReport(Integer marketId, String reportName,
+                                                                      @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                                      @RequestParam(value = "pageSize",defaultValue = "20") int pageSize) {
+        if (null == marketId) {
+            return  ResponseJson.error(-1, "供应商营销id不能为空", null);
+        }
+        return marketShopService.getMarketReport(marketId, reportName, pageNum, pageSize);
+    }
+
+    /**
+     * 编辑回显
+     * @param id
+     * @return
+     */
+    @GetMapping("/getMarketReportById")
+    public ResponseJson<CmMarketReport> getMarketReportById(Integer id) {
+        if (null == id) {
+            return  ResponseJson.error(-1, "供应商营销id不能为空", null);
+        }
+        return marketShopService.getMarketReportById(id);
+    }
+
+    /**
+     * 启用数据报表
+     * @param id
+     * @return
+     */
+    @GetMapping("/updateVisible")
+    public ResponseJson updateVisible(Integer id) {
+        if (null == id) {
+            return  ResponseJson.error(-1, "供应商营销id不能为空", null);
+        }
+        return marketShopService.updateMarketReportVisible(id);
+    }
+
+    /**
+     * 删除数据报表
+     * @param id
+     * @return
+     */
+    @GetMapping("/deleteMarketReport")
+    public ResponseJson deleteMarketReport(Integer id) {
+        if (null == id) {
+            return  ResponseJson.error(-1, "供应商营销id不能为空", null);
+        }
+        return marketShopService.updateMarketReport(id);
+    }
+
+    /**
+     * 保存报表数据
+     * @param reportDate
+     * @param reportName
+     * @param reportFile
+     * @return
+     */
+    public ResponseJson saveMarketReport(String reportDate, String reportName, MultipartFile reportFile) {
+        if (StringUtils.isBlank(reportDate) || StringUtils.isEmpty(reportDate)) {
+            return ResponseJson.error(-1, "报表时间不能为空", null);
+        }
+        if (StringUtils.isBlank(reportName) || StringUtils.isEmpty(reportName)) {
+            return ResponseJson.error(-1, "报表名称不能为空", null);
+        }
+        if (reportFile.isEmpty()) {
+            return ResponseJson.error(-1, "报表文件不能为空", null);
+        }
+        return null;
+    }
+
+}

+ 150 - 0
src/main/java/com/caimei365/manager/dao/user/CmMarketShopDao.java

@@ -0,0 +1,150 @@
+package com.caimei365.manager.dao.user;
+
+import com.caimei365.manager.entity.caimei.CmShop;
+import com.caimei365.manager.entity.caimei.shopImport.*;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : hzg
+ * @date : 2023/12/14
+ */
+@Mapper
+public interface CmMarketShopDao {
+
+    /**
+     * 供应商列表
+     * @param shopName
+     * @return
+     */
+    List<CmShop> getShopList(@Param("shopName") String shopName);
+
+    /**
+     * 营销已包含的供应商
+     * @return
+     */
+    List<Integer> getMarketShopIdList();
+
+    /**
+     * 营销供应商列表
+     * @param shopName
+     * @return
+     */
+    List<CmMarketShop> getMarketShopList(@Param("shopName") String shopName);
+
+    /**
+     * 添加营销供应商
+     * @param shopId
+     */
+    void insertMarketShop(@Param("shopId") Integer shopId);
+
+    /**
+     * 上传营销供应商logo
+     * @param id
+     * @param logo
+     */
+    void updateShopLogo(@Param("id") Integer id, @Param("logo") String logo);
+
+    /**
+     * 数据报表数据
+     * @param marketId
+     * @param reportName
+     * @return
+     */
+    List<CmMarketReport> getMarketReport(@Param("marketId") Integer marketId, @Param("reportName") String reportName);
+
+    /**
+     * 根据数据报表Id 查询报表数据
+     * @param id
+     * @return
+     */
+    CmMarketReport getMarketReportById(@Param("id") Integer id);
+
+    /**
+     * 启用数据报表
+     * @param id
+     */
+    void updateMarketReportVisible(@Param("id") Integer id);
+
+    /**
+     * 删除数据报表
+     * @param id
+     */
+    void updateMarketReport(@Param("id") Integer id);
+
+    /**
+     * 添加营销供应商数据报表
+     * @param cmMarketReport
+     */
+    void insertMarketReport(CmMarketReport cmMarketReport);
+
+    /**
+     * 阶段描述
+     * @param stage
+     */
+    void insertMarketStaget(Stage stage);
+
+    /**
+     * 漏斗模型数据
+     * @param funnelModel
+     */
+    void insertMarketFunnelModel(FunnelModel funnelModel);
+
+    /**
+     * 推文数据
+     * @param articleReadVolume
+     */
+    void insertMarketArticleReadVolume(ArticleReadVolume articleReadVolume);
+
+    /**
+     * 展现量
+     * @param impressions
+     */
+    void insertMarketImpressions(Impressions impressions);
+
+    /**
+     * 点击量
+     * @param readVolume
+     */
+    void insertMarketReadVolume(ReadVolume readVolume);
+
+    /**
+     * SEO汇总
+     * @param summary
+     */
+    void insertMarketSummary(Summary summary);
+
+    /**
+     * 访问量
+     * @param visits
+     */
+    void insertMarketVisits(Visits visits);
+
+    /**
+     * 访客来源分布
+     * @param proportion
+     */
+    void insertMarketProportion(Proportion proportion);
+
+    /**
+     * 页面平均时长
+     * @param pageDuration
+     */
+    void insertMarketPageDuration(PageDuration pageDuration);
+
+    /**
+     * 广告图点击量
+     * @param mallHits
+     */
+    void insertMarketMallHits(AdvertHits mallHits);
+
+    /**
+     * 咨询数量
+     * @param remark
+     */
+    void insertMarketRemark(Remark remark);
+}

+ 4 - 8
src/main/java/com/caimei365/manager/entity/caimei/shopImport/MallHits.java → src/main/java/com/caimei365/manager/entity/caimei/shopImport/AdvertHits.java

@@ -10,20 +10,16 @@ import lombok.Data;
  * @date : 2023/11/23
  */
 @Data
-public class MallHits {
+public class AdvertHits {
 
     /**
-     * 供应商Id
-      */
-    private String shopId;
+     * 营销数据 id
+     */
+    private Integer marketReportId;
     /**
      * 日期
      */
     private String dateTime;
-    /**
-     * 是否可见 1 可见 2 不可见
-     */
-    private Integer visible;
     /**
      * 广告位置
      */

+ 9 - 8
src/main/java/com/caimei365/manager/entity/caimei/shopImport/ArticleReadVolume.java

@@ -12,17 +12,13 @@ import lombok.Data;
 @Data
 public class ArticleReadVolume {
     /**
-     * 供应商Id
+     * 营销数据 id
      */
-    private Integer shopId;
+    private Integer marketReportId;
     /**
      * 日期
      */
     private String dateTime;
-    /**
-     * 是否可见 1 可见 2 不可见
-     */
-    private Integer visible;
     /**
      * 发文主题
      */
@@ -33,6 +29,11 @@ public class ArticleReadVolume {
      */
     @ExcelProperty("跳转链接")
     private String link;
+    /**
+     * 主题简称
+     */
+    @ExcelProperty("主题简称")
+    private String titleReferred;
     /**
      * 类型
      */
@@ -56,12 +57,12 @@ public class ArticleReadVolume {
     /**
      * 公众号阅读量
      */
-    @ExcelProperty("公众号阅读量")
+    @ExcelProperty("总点击量")
     private String wechatNumber;
     /**
      * 触达用户量
      */
-    @ExcelProperty("触达用户量")
+    @ExcelProperty("总展现量")
     private String touchNumber;
 
 }

+ 41 - 0
src/main/java/com/caimei365/manager/entity/caimei/shopImport/CmMarketReport.java

@@ -0,0 +1,41 @@
+package com.caimei365.manager.entity.caimei.shopImport;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : hzg
+ * @date : 2023/12/15
+ */
+@Data
+public class CmMarketReport {
+    /**
+     * id
+     */
+    private Integer id;
+    /**
+     * 营销id
+     */
+    private Integer marketId;
+    /**
+     * 报表日期
+     */
+    private String reportDate;
+    /**
+     * 报表名称
+     */
+    private String reportName;
+    /**
+     * 是否启用 1 启用 2 未启用
+     */
+    private Integer visible;
+    /**
+     * '添加时间'
+     */
+    private String addTime;
+    /**
+     * 删除标记 0 未删除 1 已删除
+     */
+    private Integer delFlag;
+}

+ 33 - 0
src/main/java/com/caimei365/manager/entity/caimei/shopImport/CmMarketShop.java

@@ -0,0 +1,33 @@
+package com.caimei365.manager.entity.caimei.shopImport;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : hzg
+ * @date : 2023/12/14
+ */
+@Data
+public class CmMarketShop {
+    /**
+     * id
+     */
+    private Integer id;
+    /**
+     * 供应商id
+     */
+    private Integer shopId;
+    /**
+     * 营销供应商logo
+     */
+    private String logo;
+    /**
+     * 添加时间
+     */
+    private String addTime;
+    /**
+     * 删除标记 0 未删除 1 已删除
+     */
+    private Integer delFlag;
+}

+ 3 - 3
src/main/java/com/caimei365/manager/entity/caimei/shopImport/funnelModel.java → src/main/java/com/caimei365/manager/entity/caimei/shopImport/FunnelModel.java

@@ -10,11 +10,11 @@ import lombok.Data;
  * @date : 2023/11/23
  */
 @Data
-public class funnelModel {
+public class FunnelModel {
     /**
-     * 供应商Id
+     * 营销数据 id
      */
-    private String shopId;
+    private Integer marketReportId;
     /**
      * 日期
      */

+ 3 - 12
src/main/java/com/caimei365/manager/entity/caimei/shopImport/Impressions.java

@@ -13,22 +13,13 @@ import lombok.Data;
 public class Impressions {
 
     /**
-     * 供应商Id
+     * 营销数据 id
      */
-    private String shopId;
+    private Integer marketReportId;
     /**
      * 日期
      */
     private String dateTime;
-    /**
-     * 是否可见 1 可见 2 不可见
-     */
-    private Integer visible;
-    /**
-     * 官网
-     */
-    @ExcelProperty("官网")
-    private String websiteNumber;
     /**
      * 公众号
      */
@@ -38,7 +29,7 @@ public class Impressions {
      * 微博
      */
     @ExcelProperty("微博")
-    private String twitter;
+    private String microBlog;
     /**
      * 小红书
      */

+ 2 - 6
src/main/java/com/caimei365/manager/entity/caimei/shopImport/PageDuration.java

@@ -12,17 +12,13 @@ import lombok.Data;
 @Data
 public class PageDuration {
     /**
-     * 供应商Id
+     * 营销数据 id
      */
-    private String shopId;
+    private Integer marketReportId;
     /**
      * 日期
      */
     private String dateTime;
-    /**
-     * 是否可见 1 可见 2 不可见
-     */
-    private Integer visible;
     /**
      * 页面类型
      */

+ 4 - 8
src/main/java/com/caimei365/manager/entity/caimei/shopImport/Proportion.java

@@ -12,22 +12,18 @@ import lombok.Data;
 @Data
 public class Proportion {
     /**
-     * 供应商Id
-      */
-    private String shopId;
+     * 营销数据 id
+     */
+    private Integer marketReportId;
     /**
      * 日期
      */
     private String dateTime;
-    /**
-     * 是否可见 1 可见 2 不可见
-     */
-    private Integer visible;
     /**
      * 搜索引擎
      */
     @ExcelProperty("搜索引擎")
-    private String search ;
+    private String search;
     /**
      * 微信平台
      */

+ 5 - 14
src/main/java/com/caimei365/manager/entity/caimei/shopImport/ReadVolume.java

@@ -13,32 +13,23 @@ import lombok.Data;
 public class ReadVolume {
 
     /**
-     * 供应商Id
+     * 营销数据 id
      */
-    private String shopId;
+    private Integer marketReportId;
     /**
      * 日期
      */
     private String dateTime;
-    /**
-     * 是否可见 1 可见 2 不可见
-     */
-    private Integer visible;
-    /**
-     * 信息中心
-     */
-    @ExcelProperty("信息中心")
-    private String informationCenter;
     /**
      * 公众号
      */
     @ExcelProperty("公众号")
-    private String accNumber;
+    private String generalNumber;
     /**
      * 微博
      */
     @ExcelProperty("微博")
-    private String generalNumber;
+    private String microBlog;
     /**
      * 小红书
      */
@@ -48,5 +39,5 @@ public class ReadVolume {
      * 其它自媒体渠道
      */
     @ExcelProperty("其它自媒体渠道")
-    private String other;
+    private String otherNumber;
 }

+ 3 - 7
src/main/java/com/caimei365/manager/entity/caimei/shopImport/Remark.java

@@ -12,17 +12,13 @@ import lombok.Data;
 @Data
 public class Remark {
     /**
-     * 供应商Id
-      */
-    private String shopId;
+     * 营销数据 id
+     */
+    private Integer marketReportId;
     /**
      * 日期
      */
     private String dateTime;
-    /**
-     * 是否可见 1 可见 2 不可见
-     */
-    private Integer visible;
     /**
      * 咨询数量
      */

+ 3 - 7
src/main/java/com/caimei365/manager/entity/caimei/shopImport/stage.java → src/main/java/com/caimei365/manager/entity/caimei/shopImport/Stage.java

@@ -10,19 +10,15 @@ import lombok.Data;
  * @date : 2023/11/23
  */
 @Data
-public class stage {
+public class Stage {
     /**
-     * 供应商Id
+     * 营销数据 id
      */
-    private String shopId;
+    private Integer marketReportId;
     /**
      * 添加时间
      */
     private String dateTime;
-    /**
-     * 是否可见 1 可见 2 不可见
-     */
-    private Integer visible;
     /**
      * 阶段
      */

+ 11 - 10
src/main/java/com/caimei365/manager/entity/caimei/shopImport/TypeDistribution.java → src/main/java/com/caimei365/manager/entity/caimei/shopImport/Summary.java

@@ -10,27 +10,28 @@ import lombok.Data;
  * @date : 2023/11/23
  */
 @Data
-public class TypeDistribution {
+public class Summary {
     /**
-     * 供应商Id
+     * 营销数据 id
      */
-    private String shopId;
+    private Integer marketReportId;
     /**
      * 日期
      */
     private String dateTime;
     /**
-     * 是否可见 1 可见 2 不可见
+     * 关键词
      */
-    private Integer visible;
+    @ExcelProperty("关键词")
+    private String keyword;
     /**
-     * 机构类型
+     * SEO排名
      */
-    @ExcelProperty("机构类型")
-    private String clubType;
+    @ExcelProperty("SEO排名")
+    private String seoRanking;
     /**
      * 占比
      */
-    @ExcelProperty("占比")
-    private String proportion;
+    @ExcelProperty("月度搜索量")
+    private String searchVolume;
 }

+ 2 - 6
src/main/java/com/caimei365/manager/entity/caimei/shopImport/Visits.java

@@ -13,17 +13,13 @@ import lombok.Data;
 public class Visits {
 
     /**
-     * 供应商Id
+     * 营销数据 id
      */
-    private String shopId;
+    private Integer marketReportId;
     /**
      * 日期
      */
     private String dateTime;
-    /**
-     * 是否可见 1 可见 2 不可见
-     */
-    private Integer visible;
     /**
      * 机构访问量
      */

+ 74 - 0
src/main/java/com/caimei365/manager/service/caimei/listener/AdvertHitsListener.java

@@ -0,0 +1,74 @@
+package com.caimei365.manager.service.caimei.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.caimei365.manager.dao.user.CmMarketShopDao;
+import com.caimei365.manager.entity.caimei.shopImport.AdvertHits;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : hzg
+ * @date : 2023/11/23
+ */
+public class AdvertHitsListener extends AnalysisEventListener<AdvertHits> {
+
+    private Integer marketReportId;
+
+    private CmMarketShopDao marketShopDao;
+
+    private List<String> advertImageHomeList;
+
+    private List<String> advertImageInfoList;
+
+    private final Integer SIZE = 100;
+    private Integer INDEX = 0;
+
+    private final List<AdvertHits> dataList = new ArrayList();
+
+    public AdvertHitsListener(Integer marketReportId, CmMarketShopDao marketShopDao, List<String> advertImageHomeList, List<String> advertImageInfoList) {
+        this.marketReportId = marketReportId;
+        this.marketShopDao = marketShopDao;
+        this.advertImageHomeList = advertImageHomeList;
+        this.advertImageInfoList = advertImageInfoList;
+    }
+
+    @Override
+    public void invoke(AdvertHits data, AnalysisContext analysisContext) {
+        dataList.add(data);
+        if (dataList.size() >= SIZE) {
+            saveData(dataList);
+            dataList.clear();
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        System.out.println("-----------广告图点击量----------");
+        System.out.println("dataList======="+dataList);
+        saveData(dataList);
+    }
+
+    @Override
+    public boolean hasNext(AnalysisContext analysisContext) {
+        return true;
+    }
+
+    /**
+     * 保存数据
+     */
+    public void saveData(List<AdvertHits> dataList) {
+
+        for (AdvertHits advertHits : dataList){
+            advertHits.setMarketReportId(marketReportId);
+            advertHits.setHome(advertImageHomeList.get(INDEX));
+            advertHits.setInfoCenter(advertImageInfoList.get(INDEX));
+            marketShopDao.insertMarketMallHits(advertHits);
+            INDEX++;
+        }
+    }
+}

+ 20 - 6
src/main/java/com/caimei365/manager/service/caimei/listener/ArticleReadVolumeListener.java

@@ -2,6 +2,7 @@ package com.caimei365.manager.service.caimei.listener;
 
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
+import com.caimei365.manager.dao.user.CmMarketShopDao;
 import com.caimei365.manager.entity.caimei.shopImport.ArticleReadVolume;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -16,13 +17,21 @@ import java.util.List;
  * @date : 2023/11/22
  */
 @Slf4j
-@Service
 public class ArticleReadVolumeListener extends AnalysisEventListener<ArticleReadVolume> {
 
+    private Integer marketReportId;
+
+    private CmMarketShopDao marketShopDao;
+
     private final Integer SIZE = 100;
 
     private final List<ArticleReadVolume> dataList = new ArrayList();
 
+    public ArticleReadVolumeListener(Integer marketReportId, CmMarketShopDao marketShopDao) {
+        this.marketReportId = marketReportId;
+        this.marketShopDao = marketShopDao;
+    }
+
     /**
      * 数据解析
      * @param data
@@ -31,9 +40,10 @@ public class ArticleReadVolumeListener extends AnalysisEventListener<ArticleRead
     @Override
     public void invoke(ArticleReadVolume data, AnalysisContext analysisContext) {
         dataList.add(data);
-        /*if (dataList.size() >= SIZE) {
-            saveData();
-        }*/
+        if (dataList.size() >= SIZE) {
+            saveData(dataList);
+            dataList.clear();
+        }
     }
 
     /**
@@ -44,6 +54,7 @@ public class ArticleReadVolumeListener extends AnalysisEventListener<ArticleRead
     public void doAfterAllAnalysed(AnalysisContext analysisContext) {
         System.out.println("-----------推文阅读量----------");
         System.out.println("dataList======="+dataList);
+        saveData(dataList);
     }
 
     @Override
@@ -54,7 +65,10 @@ public class ArticleReadVolumeListener extends AnalysisEventListener<ArticleRead
     /**
      * 保存数据
      */
-    public void saveData() {
-
+    public void saveData(List<ArticleReadVolume> dataList) {
+        dataList.forEach(articleReadVolume -> {
+            articleReadVolume.setMarketReportId(marketReportId);
+            marketShopDao.insertMarketArticleReadVolume(articleReadVolume);
+        });
     }
 }

+ 26 - 11
src/main/java/com/caimei365/manager/service/caimei/listener/FunnelModelListener.java

@@ -2,7 +2,8 @@ package com.caimei365.manager.service.caimei.listener;
 
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
-import com.caimei365.manager.entity.caimei.shopImport.funnelModel;
+import com.caimei365.manager.dao.user.CmMarketShopDao;
+import com.caimei365.manager.entity.caimei.shopImport.FunnelModel;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
@@ -14,24 +15,35 @@ import java.util.List;
  * @author : hzg
  * @date : 2023/11/23
  */
-@Service
-public class FunnelModelListener extends AnalysisEventListener<funnelModel> {
+public class FunnelModelListener extends AnalysisEventListener<FunnelModel> {
+
+    private Integer marketReportId;
+
+    private CmMarketShopDao marketShopDao;
 
     private final Integer SIZE = 100;
 
-    private final List<funnelModel> dataList = new ArrayList();
+    private final List<FunnelModel> dataList = new ArrayList();
+
+    public FunnelModelListener(Integer marketReportId, CmMarketShopDao marketShopDao) {
+        this.marketReportId = marketReportId;
+        this.marketShopDao = marketShopDao;
+    }
+
     @Override
-    public void invoke(funnelModel data, AnalysisContext analysisContext) {
+    public void invoke(FunnelModel data, AnalysisContext analysisContext) {
         dataList.add(data);
-        /*if (dataList.size() >= SIZE) {
-            saveData();
-        }*/
+        if (dataList.size() >= SIZE) {
+            saveData(dataList);
+            dataList.clear();
+        }
     }
 
     @Override
     public void doAfterAllAnalysed(AnalysisContext analysisContext) {
-        System.out.println("-----------用户身份分布----------");
+        System.out.println("-----------漏斗模型数据----------");
         System.out.println("dataList======="+dataList);
+        saveData(dataList);
     }
 
     @Override
@@ -42,7 +54,10 @@ public class FunnelModelListener extends AnalysisEventListener<funnelModel> {
     /**
      * 保存数据
      */
-    public void saveData() {
-
+    public void saveData(List<FunnelModel> dataList) {
+        dataList.forEach(funnelModel -> {
+            funnelModel.setMarketReportId(marketReportId);
+            marketShopDao.insertMarketFunnelModel(funnelModel);
+        });
     }
 }

+ 20 - 6
src/main/java/com/caimei365/manager/service/caimei/listener/ImpressionsListener.java

@@ -2,6 +2,7 @@ package com.caimei365.manager.service.caimei.listener;
 
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
+import com.caimei365.manager.dao.user.CmMarketShopDao;
 import com.caimei365.manager.entity.caimei.shopImport.Impressions;
 import org.springframework.stereotype.Service;
 
@@ -14,13 +15,21 @@ import java.util.List;
  * @author : hzg
  * @date : 2023/11/23
  */
-@Service
 public class ImpressionsListener extends AnalysisEventListener<Impressions> {
 
+    private Integer marketReportId;
+
+    private CmMarketShopDao marketShopDao;
+
     private final Integer SIZE = 100;
 
     private final List<Impressions> dataList = new ArrayList();
 
+    public ImpressionsListener(Integer marketReportId, CmMarketShopDao marketShopDao) {
+        this.marketReportId = marketReportId;
+        this.marketShopDao = marketShopDao;
+    }
+
     /**
      * 解析数据
      * @param data
@@ -29,9 +38,10 @@ public class ImpressionsListener extends AnalysisEventListener<Impressions> {
     @Override
     public void invoke(Impressions data, AnalysisContext analysisContext) {
         dataList.add(data);
-        /*if (dataList.size() >= SIZE) {
-            saveData();
-        }*/
+        if (dataList.size() >= SIZE) {
+            saveData(dataList);
+            dataList.clear();
+        }
     }
 
     /**
@@ -42,6 +52,7 @@ public class ImpressionsListener extends AnalysisEventListener<Impressions> {
     public void doAfterAllAnalysed(AnalysisContext analysisContext) {
         System.out.println("-----------展现量----------");
         System.out.println("dataList====="+dataList);
+        saveData(dataList);
     }
 
     @Override
@@ -52,7 +63,10 @@ public class ImpressionsListener extends AnalysisEventListener<Impressions> {
     /**
      * 保存数据
      */
-    public void saveData() {
-
+    public void saveData(List<Impressions> dataList) {
+        dataList.forEach(impressions -> {
+            impressions.setMarketReportId(marketReportId);
+            marketShopDao.insertMarketImpressions(impressions);
+        });
     }
 }

+ 0 - 49
src/main/java/com/caimei365/manager/service/caimei/listener/MallHitsListener.java

@@ -1,49 +0,0 @@
-package com.caimei365.manager.service.caimei.listener;
-
-import com.alibaba.excel.context.AnalysisContext;
-import com.alibaba.excel.event.AnalysisEventListener;
-import com.caimei365.manager.entity.caimei.shopImport.MallHits;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Description
- *
- * @author : hzg
- * @date : 2023/11/23
- */
-@Service
-public class MallHitsListener extends AnalysisEventListener<MallHits> {
-
-    private final Integer SIZE = 100;
-
-    private final List<MallHits> dataList = new ArrayList();
-
-    @Override
-    public void invoke(MallHits data, AnalysisContext analysisContext) {
-        dataList.add(data);
-        /*if (dataList.size() >= SIZE) {
-            saveData();
-        }*/
-    }
-
-    @Override
-    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
-        System.out.println("-----------全商城点击量----------");
-        System.out.println("dataList======="+dataList);
-    }
-
-    @Override
-    public boolean hasNext(AnalysisContext analysisContext) {
-        return true;
-    }
-
-    /**
-     * 保存数据
-     */
-    public void saveData() {
-
-    }
-}

+ 20 - 6
src/main/java/com/caimei365/manager/service/caimei/listener/PageDurationListener.java

@@ -2,6 +2,7 @@ package com.caimei365.manager.service.caimei.listener;
 
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
+import com.caimei365.manager.dao.user.CmMarketShopDao;
 import com.caimei365.manager.entity.caimei.shopImport.PageDuration;
 import org.springframework.stereotype.Service;
 
@@ -14,25 +15,35 @@ import java.util.List;
  * @author : hzg
  * @date : 2023/11/23
  */
-@Service
 public class PageDurationListener extends AnalysisEventListener<PageDuration> {
 
+    private Integer marketReportId;
+
+    private CmMarketShopDao marketShopDao;
+
     private final Integer SIZE = 100;
 
     private final List<PageDuration> dataList = new ArrayList();
 
+    public PageDurationListener(Integer marketReportId, CmMarketShopDao marketShopDao) {
+        this.marketReportId = marketReportId;
+        this.marketShopDao = marketShopDao;
+    }
+
     @Override
     public void invoke(PageDuration data, AnalysisContext analysisContext) {
         dataList.add(data);
-        /*if (dataList.size() >= SIZE) {
-            saveData();
-        }*/
+        if (dataList.size() >= SIZE) {
+            saveData(dataList);
+            dataList.clear();
+        }
     }
 
     @Override
     public void doAfterAllAnalysed(AnalysisContext analysisContext) {
         System.out.println("-----------页面平均时长----------");
         System.out.println("dataList======="+dataList);
+        saveData(dataList);
     }
 
     @Override
@@ -43,7 +54,10 @@ public class PageDurationListener extends AnalysisEventListener<PageDuration> {
     /**
      * 保存数据
      */
-    public void saveData() {
-
+    public void saveData(List<PageDuration> dataList) {
+        dataList.forEach(pageDuration -> {
+            pageDuration.setMarketReportId(marketReportId);
+            marketShopDao.insertMarketPageDuration(pageDuration);
+        });
     }
 }

+ 20 - 6
src/main/java/com/caimei365/manager/service/caimei/listener/ProportionListener.java

@@ -2,6 +2,7 @@ package com.caimei365.manager.service.caimei.listener;
 
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
+import com.caimei365.manager.dao.user.CmMarketShopDao;
 import com.caimei365.manager.entity.caimei.shopImport.Proportion;
 import org.springframework.stereotype.Service;
 
@@ -14,25 +15,35 @@ import java.util.List;
  * @author : hzg
  * @date : 2023/11/23
  */
-@Service
 public class ProportionListener extends AnalysisEventListener<Proportion> {
 
+    private Integer marketReportId;
+
+    private CmMarketShopDao marketShopDao;
+
     private final Integer SIZE = 100;
 
     private final List<Proportion> dataList = new ArrayList();
 
+    public ProportionListener(Integer marketReportId, CmMarketShopDao marketShopDao) {
+        this.marketReportId = marketReportId;
+        this.marketShopDao = marketShopDao;
+    }
+
     @Override
     public void invoke(Proportion data, AnalysisContext analysisContext) {
         dataList.add(data);
-        /*if (dataList.size() >= SIZE) {
-            saveData();
-        }*/
+        if (dataList.size() >= SIZE) {
+            saveData(dataList);
+            dataList.clear();
+        }
     }
 
     @Override
     public void doAfterAllAnalysed(AnalysisContext analysisContext) {
         System.out.println("-----------访客来源分布----------");
         System.out.println("dataList======="+dataList);
+        saveData(dataList);
     }
 
     @Override
@@ -43,7 +54,10 @@ public class ProportionListener extends AnalysisEventListener<Proportion> {
     /**
      * 保存数据
      */
-    public void saveData() {
-
+    public void saveData(List<Proportion> dataList) {
+        dataList.forEach(proportion -> {
+            proportion.setMarketReportId(marketReportId);
+            marketShopDao.insertMarketProportion(proportion);
+        });
     }
 }

+ 18 - 4
src/main/java/com/caimei365/manager/service/caimei/listener/ReadVolumeListener.java

@@ -2,6 +2,7 @@ package com.caimei365.manager.service.caimei.listener;
 
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
+import com.caimei365.manager.dao.user.CmMarketShopDao;
 import com.caimei365.manager.entity.caimei.shopImport.ReadVolume;
 import org.springframework.stereotype.Service;
 
@@ -14,18 +15,27 @@ import java.util.List;
  * @author : hzg
  * @date : 2023/11/23
  */
-@Service
 public class ReadVolumeListener extends AnalysisEventListener<ReadVolume> {
 
+    private Integer marketReportId;
+
+    private CmMarketShopDao marketShopDao;
+
     private final Integer SIZE = 100;
 
     private final List<ReadVolume> dataList = new ArrayList();
 
+    public ReadVolumeListener(Integer marketReportId, CmMarketShopDao marketShopDao) {
+        this.marketReportId = marketReportId;
+        this.marketShopDao = marketShopDao;
+    }
+
     @Override
     public void invoke(ReadVolume data, AnalysisContext analysisContext) {
         dataList.add(data);
         if (dataList.size() >= SIZE) {
-            saveData();
+            saveData(dataList);
+            dataList.clear();
         }
     }
 
@@ -33,6 +43,7 @@ public class ReadVolumeListener extends AnalysisEventListener<ReadVolume> {
     public void doAfterAllAnalysed(AnalysisContext analysisContext) {
         System.out.println("-----------阅读量----------");
         System.out.println("dataList======"+dataList);
+        saveData(dataList);
     }
 
     @Override
@@ -43,7 +54,10 @@ public class ReadVolumeListener extends AnalysisEventListener<ReadVolume> {
     /**
      * 保存数据
      */
-    public void saveData() {
-
+    public void saveData(List<ReadVolume> dataList) {
+        dataList.forEach(readVolume -> {
+            readVolume.setMarketReportId(marketReportId);
+            marketShopDao.insertMarketReadVolume(readVolume);
+        });
     }
 }

+ 20 - 6
src/main/java/com/caimei365/manager/service/caimei/listener/RemarkListener.java

@@ -2,6 +2,7 @@ package com.caimei365.manager.service.caimei.listener;
 
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
+import com.caimei365.manager.dao.user.CmMarketShopDao;
 import com.caimei365.manager.entity.caimei.shopImport.Remark;
 import org.springframework.stereotype.Service;
 
@@ -14,25 +15,35 @@ import java.util.List;
  * @author : hzg
  * @date : 2023/11/23
  */
-@Service
 public class RemarkListener extends AnalysisEventListener<Remark> {
 
+    private Integer marketReportId;
+
+    private CmMarketShopDao marketShopDao;
+
     private final Integer SIZE = 100;
 
     private final List<Remark> dataList = new ArrayList();
 
+    public RemarkListener(Integer marketReportId, CmMarketShopDao marketShopDao) {
+        this.marketReportId = marketReportId;
+        this.marketShopDao = marketShopDao;
+    }
+
     @Override
     public void invoke(Remark data, AnalysisContext analysisContext) {
         dataList.add(data);
-        /*if (dataList.size() >= SIZE) {
-            saveData();
-        }*/
+        if (dataList.size() >= SIZE) {
+            saveData(dataList);
+            dataList.clear();
+        }
     }
 
     @Override
     public void doAfterAllAnalysed(AnalysisContext analysisContext) {
         System.out.println("-----------咨询数量----------");
         System.out.println("dataList======="+dataList);
+        saveData(dataList);
     }
 
     @Override
@@ -43,7 +54,10 @@ public class RemarkListener extends AnalysisEventListener<Remark> {
     /**
      * 保存数据
      */
-    public void saveData() {
-
+    public void saveData(List<Remark> dataList) {
+        dataList.forEach(remark -> {
+            remark.setMarketReportId(marketReportId);
+            marketShopDao.insertMarketRemark(remark);
+        });
     }
 }

+ 25 - 11
src/main/java/com/caimei365/manager/service/caimei/listener/StageListener.java

@@ -2,7 +2,8 @@ package com.caimei365.manager.service.caimei.listener;
 
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
-import com.caimei365.manager.entity.caimei.shopImport.stage;
+import com.caimei365.manager.dao.user.CmMarketShopDao;
+import com.caimei365.manager.entity.caimei.shopImport.Stage;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
@@ -14,25 +15,35 @@ import java.util.List;
  * @author : hzg
  * @date : 2023/11/23
  */
-@Service
-public class StageListener extends AnalysisEventListener<stage> {
+public class StageListener extends AnalysisEventListener<Stage> {
+
+    private Integer marketReportId;
+
+    private CmMarketShopDao marketShopDao;
 
     private final Integer SIZE = 100;
 
-    private final List<stage> dataList = new ArrayList();
+    private final List<Stage> dataList = new ArrayList();
+
+    public StageListener(Integer marketReportId, CmMarketShopDao marketShopDao) {
+        this.marketReportId = marketReportId;
+        this.marketShopDao = marketShopDao;
+    }
 
     @Override
-    public void invoke(stage data, AnalysisContext analysisContext) {
+    public void invoke(Stage data, AnalysisContext analysisContext) {
         dataList.add(data);
-        /*if (dataList.size() >= SIZE) {
-            saveData();
-        }*/
+        if (dataList.size() >= SIZE) {
+            saveData(dataList);
+            dataList.clear();
+        }
     }
 
     @Override
     public void doAfterAllAnalysed(AnalysisContext analysisContext) {
-        System.out.println("-----------用户身份分布----------");
+        System.out.println("-----------阶段描述----------");
         System.out.println("dataList======="+dataList);
+        saveData(dataList);
     }
 
     @Override
@@ -43,7 +54,10 @@ public class StageListener extends AnalysisEventListener<stage> {
     /**
      * 保存数据
      */
-    public void saveData() {
-
+    public void saveData(List<Stage> dataList) {
+        dataList.forEach( stage -> {
+            stage.setMarketReportId(marketReportId);
+            marketShopDao.insertMarketStaget(stage);
+        });
     }
 }

+ 69 - 0
src/main/java/com/caimei365/manager/service/caimei/listener/SummaryListener.java

@@ -0,0 +1,69 @@
+package com.caimei365.manager.service.caimei.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.caimei365.manager.dao.user.CmMarketShopDao;
+import com.caimei365.manager.entity.caimei.shopImport.Summary;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : hzg
+ * @date : 2023/11/23
+ */
+public class SummaryListener extends AnalysisEventListener<Summary> {
+
+    private Integer marketReportId;
+
+    private CmMarketShopDao marketShopDao;
+
+    private List<String> seoImagePathList;
+
+    private final Integer SIZE = 100;
+    private Integer INDEX = 0;
+
+    private final List<Summary> dataList = new ArrayList();
+
+    public SummaryListener(Integer marketReportId, CmMarketShopDao marketShopDao, List<String> seoImagePathList) {
+        this.marketReportId = marketReportId;
+        this.marketShopDao = marketShopDao;
+        this.seoImagePathList = seoImagePathList;
+    }
+
+    @Override
+    public void invoke(Summary data, AnalysisContext analysisContext) {
+        dataList.add(data);
+        if (dataList.size() >= SIZE) {
+            saveData(dataList);
+            dataList.clear();
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        System.out.println("-----------SEO汇总----------");
+        System.out.println("dataList======="+dataList);
+        saveData(dataList);
+    }
+
+    @Override
+    public boolean hasNext(AnalysisContext analysisContext) {
+        return true;
+    }
+
+    /**
+     * 保存数据
+     */
+    public void saveData(List<Summary> dataList) {
+        dataList.forEach(summary -> {
+            summary.setMarketReportId(marketReportId);
+            summary.setSeoRanking(seoImagePathList.get(INDEX));
+            marketShopDao.insertMarketSummary(summary);
+            INDEX++;
+        });
+    }
+}

+ 0 - 49
src/main/java/com/caimei365/manager/service/caimei/listener/TypeDistributionListener.java

@@ -1,49 +0,0 @@
-package com.caimei365.manager.service.caimei.listener;
-
-import com.alibaba.excel.context.AnalysisContext;
-import com.alibaba.excel.event.AnalysisEventListener;
-import com.caimei365.manager.entity.caimei.shopImport.TypeDistribution;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Description
- *
- * @author : hzg
- * @date : 2023/11/23
- */
-@Service
-public class TypeDistributionListener extends AnalysisEventListener<TypeDistribution> {
-
-    private final Integer SIZE = 100;
-
-    private final List<TypeDistribution> dataList = new ArrayList();
-
-    @Override
-    public void invoke(TypeDistribution data, AnalysisContext analysisContext) {
-        dataList.add(data);
-        /*if (dataList.size() >= SIZE) {
-            saveData();
-        }*/
-    }
-
-    @Override
-    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
-        System.out.println("-----------用户类型分布----------");
-        System.out.println("dataList======="+dataList);
-    }
-
-    @Override
-    public boolean hasNext(AnalysisContext analysisContext) {
-        return true;
-    }
-
-    /**
-     * 保存数据
-     */
-    public void saveData() {
-
-    }
-}

+ 20 - 6
src/main/java/com/caimei365/manager/service/caimei/listener/VisitsLisener.java

@@ -2,6 +2,7 @@ package com.caimei365.manager.service.caimei.listener;
 
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
+import com.caimei365.manager.dao.user.CmMarketShopDao;
 import com.caimei365.manager.entity.caimei.shopImport.Visits;
 import org.springframework.stereotype.Service;
 
@@ -14,25 +15,35 @@ import java.util.List;
  * @author : hzg
  * @date : 2023/11/23
  */
-@Service
 public class VisitsLisener extends AnalysisEventListener<Visits> {
 
+    private Integer marketReportId;
+
+    private CmMarketShopDao marketShopDao;
+
     private final Integer SIZE = 100;
 
     private final List<Visits> dataList = new ArrayList();
 
+    public VisitsLisener(Integer marketReportId, CmMarketShopDao marketShopDao) {
+        this.marketReportId = marketReportId;
+        this.marketShopDao = marketShopDao;
+    }
+
     @Override
     public void invoke(Visits data, AnalysisContext analysisContext) {
         dataList.add(data);
-        /*if (dataList.size() >= SIZE) {
-            saveData();
-        }*/
+        if (dataList.size() >= SIZE) {
+            saveData(dataList);
+            dataList.clear();
+        }
     }
 
     @Override
     public void doAfterAllAnalysed(AnalysisContext analysisContext) {
         System.out.println("-----------访问量----------");
         System.out.println("dataList======="+dataList);
+        saveData(dataList);
     }
 
     @Override
@@ -43,7 +54,10 @@ public class VisitsLisener extends AnalysisEventListener<Visits> {
     /**
      * 保存数据
      */
-    public void saveData() {
-
+    public void saveData(List<Visits> dataList) {
+        dataList.forEach(visits -> {
+            visits.setMarketReportId(marketReportId);
+            marketShopDao.insertMarketVisits(visits);
+        });
     }
 }

+ 73 - 0
src/main/java/com/caimei365/manager/service/caimei/user/CmMarketShopService.java

@@ -0,0 +1,73 @@
+package com.caimei365.manager.service.caimei.user;
+
+import com.caimei365.manager.entity.PaginationVo;
+import com.caimei365.manager.entity.ResponseJson;
+import com.caimei365.manager.entity.caimei.CmShop;
+import com.caimei365.manager.entity.caimei.shopImport.CmMarketReport;
+import com.caimei365.manager.entity.caimei.shopImport.CmMarketShop;
+
+/**
+ * Description
+ *
+ * @author : hzg
+ * @date : 2023/12/14
+ */
+public interface CmMarketShopService {
+    /**
+     * 供应商列表
+     * @return
+     */
+    ResponseJson<PaginationVo<CmShop>> getShop(String shopName, int pageNum, int pageSize);
+    /**
+     * 营销供应商列表
+     * @param shopName
+     * @return
+     */
+    ResponseJson<PaginationVo<CmMarketShop>> getMarkShopList(String shopName, int pageNum, int pageSize);
+
+    /**
+     * 添加营销供应商
+     * @param ids
+     * @return
+     */
+    ResponseJson saveMarketShop(String ids);
+
+    /**
+     * 上传供应商营销logo
+     * @param id
+     * @param logo
+     * @return
+     */
+    ResponseJson uploadShopLogo(Integer id, String logo);
+
+    /**
+     * 数据报表列表
+     * @param marketId
+     * @param reportName
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    ResponseJson<PaginationVo<CmMarketReport>> getMarketReport(Integer marketId, String reportName, int pageNum, int pageSize);
+
+    /**
+     * 根据数据报表Id 查询报表数据
+     * @param id
+     * @return
+     */
+    ResponseJson<CmMarketReport> getMarketReportById(Integer id);
+
+    /**
+     * 启用数据报表
+     * @param id
+     * @return
+     */
+    ResponseJson updateMarketReportVisible(Integer id);
+
+    /**
+     * 删除数据报表
+     * @param id
+     * @return
+     */
+    ResponseJson updateMarketReport(Integer id);
+}

+ 144 - 0
src/main/java/com/caimei365/manager/service/caimei/user/impl/CmMarketShopServiceImpl.java

@@ -0,0 +1,144 @@
+package com.caimei365.manager.service.caimei.user.impl;
+
+import com.caimei365.manager.dao.user.CmMarketShopDao;
+import com.caimei365.manager.entity.PaginationVo;
+import com.caimei365.manager.entity.ResponseJson;
+import com.caimei365.manager.entity.caimei.CmShop;
+import com.caimei365.manager.entity.caimei.shopImport.CmMarketReport;
+import com.caimei365.manager.entity.caimei.shopImport.CmMarketShop;
+import com.caimei365.manager.service.caimei.user.CmMarketShopService;
+import com.github.pagehelper.PageHelper;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : hzg
+ * @date : 2023/12/14
+ */
+@Service
+public class CmMarketShopServiceImpl implements CmMarketShopService {
+
+    @Resource private CmMarketShopDao marketShopDao;
+
+    /**
+     * 供应商列表
+     * @return
+     */
+    @Override
+    public ResponseJson<PaginationVo<CmShop>> getShop(String shopName, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<CmShop> shopList = marketShopDao.getShopList(shopName);
+        List<Integer> marketShopIdList = marketShopDao.getMarketShopIdList();
+        shopList.forEach(shop -> {
+            if (marketShopIdList.contains(shop.getShopId())) {
+                shop.setFlag(false);
+            } else {
+                shop.setFlag(true);
+            }
+        });
+        PaginationVo<CmShop> page = new PaginationVo<>(shopList);
+        return ResponseJson.success(page);
+    }
+
+    /**
+     * 营销供应商列表
+     *
+     * @param shopName
+     * @return
+     */
+    @Override
+    public ResponseJson<PaginationVo<CmMarketShop>> getMarkShopList(String shopName, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<CmMarketShop> marketShopList = marketShopDao.getMarketShopList(shopName);
+        PaginationVo<CmMarketShop> page = new PaginationVo<>(marketShopList);
+        return ResponseJson.success(page);
+    }
+
+    /**
+     * 添加营销供应商
+     *
+     * @param ids
+     * @return
+     */
+    @Override
+    public ResponseJson saveMarketShop(String ids) {
+        if (ids.contains(",")) {
+            String[] split = ids.split(",");
+            for(String id : split) {
+                marketShopDao.insertMarketShop(Integer.parseInt(id));
+            }
+        } else {
+            marketShopDao.insertMarketShop(Integer.parseInt(ids));
+        }
+        return ResponseJson.success();
+    }
+
+    /**
+     * 上传供应商营销logo
+     *
+     * @param id
+     * @param logo
+     * @return
+     */
+    @Override
+    public ResponseJson uploadShopLogo(Integer id, String logo) {
+        marketShopDao.updateShopLogo(id, logo);
+        return ResponseJson.success();
+    }
+
+    /**
+     * 数据报表列表
+     *
+     * @param marketId
+     * @param reportName
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @Override
+    public ResponseJson<PaginationVo<CmMarketReport>> getMarketReport(Integer marketId, String reportName, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<CmMarketReport> marketReport = marketShopDao.getMarketReport(marketId, reportName);
+        PaginationVo<CmMarketReport> page = new PaginationVo<>(marketReport);
+        return ResponseJson.success(page);
+    }
+
+    /**
+     * 根据数据报表Id 查询报表数据
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public ResponseJson<CmMarketReport> getMarketReportById(Integer id) {
+        return ResponseJson.success(marketShopDao.getMarketReportById(id));
+    }
+
+    /**
+     * 启用数据报表
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public ResponseJson updateMarketReportVisible(Integer id) {
+        marketShopDao.updateMarketReportVisible(id);
+        return ResponseJson.success();
+    }
+
+    /**
+     * 删除数据报表
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public ResponseJson updateMarketReport(Integer id) {
+        marketShopDao.updateMarketReport(id);
+        return ResponseJson.success();
+    }
+}

+ 13 - 0
src/main/java/com/caimei365/manager/utils/formDataUtils.java

@@ -60,4 +60,17 @@ public class formDataUtils {
         String file1 = client.uploadFile(filePath);
         return file1;
     }
+
+    public String saveShopFile(MultipartFile file) throws IOException {
+        String originalFilename = file.getOriginalFilename();
+        String randomUUID = UUID.randomUUID().toString();
+        int index = originalFilename.lastIndexOf(".");
+        String exet = originalFilename.substring(index);
+        String filePath = "/mnt/newdatadrive/data/runtime/jar-instance/manager-api/tempImage/";
+        filePath += "\\" + randomUUID + exet;
+        file.transferTo(new File(filePath));
+        log.info(">>>>>>>>>>>>>>>>图片上传路径:" + filePath);
+        String file1 = client.uploadFile(filePath);
+        return file1;
+    }
 }

+ 155 - 0
src/main/resources/mapper/user/CmMarketShopDao.xml

@@ -0,0 +1,155 @@
+<?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.manager.dao.user.CmMarketShopDao">
+
+    <select id="getShopList" resultType="com.caimei365.manager.entity.caimei.CmShop">
+        SELECT
+            name,
+            linkMan,
+            contractMobile,
+            Status
+        FROM shop
+        <where>
+            <if test="shopName != null and shopName != ''">
+                name like concat('%',#{shopName},'%')
+            </if>
+        </where>
+    </select>
+
+    <select id="getMarketShopIdList" resultType="java.lang.Integer">
+        select shopId from cm_market_shop where delFlag = 0
+    </select>
+
+    <select id="getMarketShopList" resultType="com.caimei365.manager.entity.caimei.shopImport.CmMarketShop">
+        SELECT
+            cms.id,
+            s.name,
+            s.linkMan,
+            s.contractMobile,
+            s.status,
+            (SELECT ADDTIME FROM cm_market_report WHERE marketId = cms.id ORDER BY ADDTIME DESC LIMIT 1) AS recentlyTime,
+            cms.addTime
+        FROM cm_market_shop cms
+                 LEFT JOIN shop s ON s.shopId = cms.shopId
+        <where>
+            delFlag = 0
+            <if test="shopName != null and shopName != ''">
+                and s.name LIKE concat('%',#{shopName},'%')
+            </if>
+        </where>
+    </select>
+
+    <insert id="insertMarketShop">
+        insert into cm_market_shop(shopId, addTime, delFlag)
+        values (#{shopId}, now(), 0)
+    </insert>
+
+    <update id="updateShopLogo">
+        update cm_market_shop
+        set logo = #{logo}
+        where id = #{id}
+    </update>
+
+    <select id="getMarketReport" resultType="com.caimei365.manager.entity.caimei.shopImport.CmMarketReport">
+        SELECT
+            id,
+            marketId,
+            reportDate,
+            reportName,
+            visible,
+            addTime,
+            delFlag
+        FROM cm_market_report
+        <where>
+            marketId = #{marketId} AND delFlag = 0
+            <if test="reportName != null anf reportName != ''">
+                AND reportName LIKE concat('%', #{reportName}, '%')
+            </if>
+        </where>
+    </select>
+
+    <select id="getMarketReportById" resultType="com.caimei365.manager.entity.caimei.shopImport.CmMarketReport">
+        SELECT
+        id,
+        marketId,
+        reportDate,
+        reportName,
+        visible,
+        addTime,
+        delFlag
+        FROM cm_market_report
+        where id = #{id} AND delFlag = 0
+    </select>
+
+    <update id="updateMarketReportVisible">
+        update cm_market_report
+        set visible = 1
+        where id = #{id}
+    </update>
+
+    <update id="updateMarketReport">
+        update cm_market_report
+        set delFlag = 1
+        where id = #{id}
+    </update>
+
+    <insert id="insertMarketReport">
+        insert into cm_market_report (marketId, reportDate, reportName, visible, addTime, delFlag)
+        values (#{marketId}, #{reportDate}, #{reportName}, 1, now(), 0)
+    </insert>
+
+    <insert id="insertMarketStaget">
+        insert into cm_market_staget (marketReportId, stage, theme, addTime)
+        values (#{marketReportId}, #{stage}, #{theme}, now())
+    </insert>
+
+    <insert id="insertMarketFunnelModel">
+        insert into cm_market_funnelModel (marketReportId, impressions, hits, visits, consultation, report, addTime)
+        values (#{marketReportId}, #{impressions}, #{hits}, #{visits}, #{consultation}, #{report}, now())
+    </insert>
+
+    <insert id="insertMarketArticleReadVolume">
+        insert into cm_market_articleReadVolume (marketReportId, title, link, titleReferred, type, keyword, channel, touchNumber, wechatNumber, addTime)
+        values (#{marketReportId}, #{title}, #{link}, #{titleReferred}, #{type}, #{keyword}, #{channel}, #{touchNumber}, #{wechatNumber}, now())
+    </insert>
+
+    <insert id="insertMarketImpressions">
+        insert into cm_market_impressions (marketReportId, generalNumber, microBlog, redBookNumber, otherNumber, addTime)
+        values (#{marketReportId}, #{generalNumber}, #{microBlog}, #{redBookNumber}, #{otherNumber}, now())
+    </insert>
+
+    <insert id="insertMarketReadVolume">
+        insert into cm_market_readVolume (marketReportId, generalNumber, microBlog, redBookNumber, otherNumber, addTime)
+        values (#{marketReportId}, #{generalNumber}, #{microBlog}, #{redBookNumber}, #{otherNumber}, now())
+    </insert>
+
+    <insert id="insertMarketSummary">
+        insert into cm_market_summary (marketReportId, keyword, seoRanking, searchVolume, addTime)
+        values (#{marketReportId}, #{keyword}, #{seoRanking}, #{searchVolume}, now())
+    </insert>
+
+    <insert id="insertMarketVisits">
+        insert into cm_market_visits (marketReportId, clubNumber, touristNumber, addTime)
+        values (#{marketReportId}, #{clubNumber}, #{touristNumber}, now())
+    </insert>
+
+    <insert id="insertMarketProportion">
+        insert into cm_market_proportion (marketReportId, search, general, microBlog, directAccess, addTime)
+        values (#{marketReportId}, #{search}, #{general}, #{microBlog}, #{directAccess}, now())
+    </insert>
+
+    <insert id="insertMarketPageDuration">
+        insert into cm_market_pageDuration (marketReportId, pageLabel, accessDuration, addTime)
+        values (#{marketReportId}, #{pageLabel}, #{accessDuration}, now())
+    </insert>
+
+    <insert id="insertMarketMallHits">
+        insert into cm_market_mallHits (marketReportId, position, home, infoCenter, hits, addTime)
+        values (#{marketReportId}, #{position}, #{home}, #{infoCenter}, #{hits}, now())
+    </insert>
+
+    <insert id="insertMarketRemark">
+        insert into cm_market_remark (marketReportId, remarkNumber, addTime)
+        values (#{marketReportId}, #{remarkNumber}, now())
+    </insert>
+</mapper>

+ 175 - 14
src/test/java/com/caimei365/manager/ManagerApplicationTests.java

@@ -1,30 +1,191 @@
 package com.caimei365.manager;
 
+import cn.hutool.core.util.ZipUtil;
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.caimei365.manager.dao.user.CmMarketShopDao;
 import com.caimei365.manager.entity.caimei.shopImport.*;
 import com.caimei365.manager.service.caimei.listener.*;
+import com.caimei365.manager.utils.formDataUtils;
+import org.apache.commons.fileupload.disk.DiskFileItem;
+import org.apache.commons.io.IOUtils;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
+import javax.annotation.Resource;
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
 
 @SpringBootTest
 class ManagerApplicationTests {
 
+    @Resource private formDataUtils formDataUtils;
+    @Resource private CmMarketShopDao marketShopDao;
+
+    @Test
+    void contextLoads() throws Exception{
+        String filePath = "E:\\Users\\Desktop\\采美\\报表文件上传模板.zip";
+
+        String inputPath = "E:\\Users\\Desktop\\dest\\test.zip";
+        String outPath = "E:\\Users\\Desktop\\extract";
+
+        File inputFile = new File(inputPath);
+        if (!inputFile.exists() && !inputFile.isDirectory()) {
+            inputFile.mkdirs();
+        }
+        File outFile = new File(outPath);
+        if (!inputFile.exists() && !outFile.isDirectory()) {
+            outFile.mkdirs();
+        }
+        File zipFile = new File(filePath);
+        /*MultipartFile multipartFile = fileToMultipartFileConverter(zipFile);
+        try {
+            multipartFile.transferTo(inputFile);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }*/
+        ZipUtil.unzip(inputFile, outFile);
+        System.out.println("inputFile======"+inputFile.getPath());
+
+    }
+
     @Test
-    void contextLoads() {
-        String fileName = "E:\\Users\\Desktop\\采美\\shop-xlsx\\test.xlsx";
-
-        EasyExcel.read(fileName, stage.class, new StageListener()).sheet("阶段描述").doRead();
-        EasyExcel.read(fileName, funnelModel.class, new FunnelModelListener()).sheet("漏斗模型数据").doRead();
-        EasyExcel.read(fileName, ArticleReadVolume.class, new ArticleReadVolumeListener()).sheet("推文阅读量").doRead();
-        EasyExcel.read(fileName, Impressions.class, new ImpressionsListener()).sheet("展现量").doRead();
-        EasyExcel.read(fileName, ReadVolume.class, new ReadVolumeListener()).sheet("阅读量").doRead();
-        EasyExcel.read(fileName, TypeDistribution.class, new TypeDistributionListener()).sheet("SEO汇总").doRead();
-        EasyExcel.read(fileName, Visits.class, new VisitsLisener()).sheet("访问量").doRead();
-        EasyExcel.read(fileName, Proportion.class, new ProportionListener()).sheet("访客来源分布").doRead();
-        EasyExcel.read(fileName, PageDuration.class, new PageDurationListener()).sheet("页面平均时长").doRead();
-        EasyExcel.read(fileName, MallHits.class, new MallHitsListener()).sheet("广告图点击量").doRead();
-        EasyExcel.read(fileName, Remark.class, new RemarkListener()).sheet("咨询数量").doRead();
+    void test() throws IOException {
+        String fileDirectory = "E:\\Users\\Desktop\\采美\\报表文件上传模板";
+        // SEO 图片集合
+        List<String> seoImagePathList = new ArrayList<>();
+        // 广告图点击量 图片集合
+        List<String> advertImageHomeList = new ArrayList<>();
+        List<String> advertImageInfoList = new ArrayList<>();
+        File file = new File(fileDirectory);
+        if (file.exists() && file.isDirectory()) {
+            for (File fileSpecific: file.listFiles()) {
+                if (fileSpecific.getName().equals("SEO汇总图片") && fileSpecific.exists() && fileSpecific.isDirectory()) {
+                    for (File fileSpecificContain : fileSpecific.listFiles()) {
+                        if (fileSpecificContain.getName().contains("SEO汇总图")) {
+                            // 上传图到服务器并获取图链接,存入数据库,图片顺序需与 SEO 列表顺序一致
+                            MultipartFile filex = fileToMultipartFileConverter(fileSpecificContain);
+                            String seoImagePath = formDataUtils.saveShopFile(filex);
+                            seoImagePathList.add(seoImagePath);
+                        }
+                    }
+                }
+                if (fileSpecific.getName().equals("广告图片") && fileSpecific.exists() && fileSpecific.isDirectory()) {
+                    for (File fileSpecificContain : fileSpecific.listFiles()) {
+                        if (fileSpecificContain.getName().contains("首页")) {
+                            // 上传图到服务器并获取图链接,存入数据库,图片顺序需与 广告图点击量 列表顺序一致
+                            MultipartFile filex = fileToMultipartFileConverter(fileSpecificContain);
+                            String advertImagePath = formDataUtils.saveShopFile(filex);
+                            advertImageHomeList.add(advertImagePath);
+                        }
+                        if (fileSpecificContain.getName().contains("信息中心")) {
+                            // 上传图到服务器并获取图链接,存入数据库,图片顺序需与 广告图点击量 列表顺序一致
+                            MultipartFile filex = fileToMultipartFileConverter(fileSpecificContain);
+                            String advertImagePath = formDataUtils.saveShopFile(filex);
+                            advertImageInfoList.add(advertImagePath);
+                        }
+                    }
+                }
+                if (fileSpecific.getName().endsWith(".xlsx")) {
+                    updateFile(fileSpecific, seoImagePathList, advertImageHomeList, advertImageInfoList);
+                }
+            }
+        }
+        System.out.println("seoImagePathList====="+seoImagePathList);
+        System.out.println("advertImageHomeList====="+advertImageHomeList);
+        System.out.println("advertImageInfoList====="+advertImageInfoList);
+    }
+
+
+    void updateFile(File file, List<String> seoImagePathList, List<String> advertImageHomeList, List<String> advertImageInfoList) throws IOException {
+        String excelType = "XLSX";
+        if (file.getName().endsWith(".xls")) {
+            excelType = "XLS";
+        }
+        Integer marketReportId = 1;
+        MultipartFile multipartFile = fileToMultipartFileConverter(file);
+        InputStream inputStream = new BufferedInputStream(multipartFile.getInputStream());
+        InputStream is = inputStream;
+        EasyExcel.read(is, Stage.class, new StageListener(marketReportId, marketShopDao)).excelType(ExcelTypeEnum.valueOf(excelType)).sheet("阶段描述").doRead();
+        is = new BufferedInputStream(multipartFile.getInputStream());
+        EasyExcel.read(is, FunnelModel.class, new FunnelModelListener(marketReportId, marketShopDao)).excelType(ExcelTypeEnum.valueOf(excelType)).sheet("漏斗模型数据").doRead();
+        is = new BufferedInputStream(multipartFile.getInputStream());
+        EasyExcel.read(is, ArticleReadVolume.class, new ArticleReadVolumeListener(marketReportId, marketShopDao)).excelType(ExcelTypeEnum.valueOf(excelType)).sheet("推文阅读量").doRead();
+        is = new BufferedInputStream(multipartFile.getInputStream());
+        EasyExcel.read(is, Impressions.class, new ImpressionsListener(marketReportId, marketShopDao)).excelType(ExcelTypeEnum.valueOf(excelType)).sheet("展现量").doRead();
+        is = new BufferedInputStream(multipartFile.getInputStream());
+        EasyExcel.read(is, ReadVolume.class, new ReadVolumeListener(marketReportId, marketShopDao)).excelType(ExcelTypeEnum.valueOf(excelType)).sheet("点击量").doRead();
+        is = new BufferedInputStream(multipartFile.getInputStream());
+        EasyExcel.read(is, Summary.class, new SummaryListener(marketReportId, marketShopDao, seoImagePathList)).excelType(ExcelTypeEnum.valueOf(excelType)).sheet("SEO汇总").doRead();
+        is = new BufferedInputStream(multipartFile.getInputStream());
+        EasyExcel.read(is, Visits.class, new VisitsLisener(marketReportId, marketShopDao)).excelType(ExcelTypeEnum.valueOf(excelType)).sheet("访问量").doRead();
+        is = new BufferedInputStream(multipartFile.getInputStream());
+        EasyExcel.read(is, Proportion.class, new ProportionListener(marketReportId, marketShopDao)).excelType(ExcelTypeEnum.valueOf(excelType)).sheet("访客来源分布").doRead();
+        is = new BufferedInputStream(multipartFile.getInputStream());
+        EasyExcel.read(is, PageDuration.class, new PageDurationListener(marketReportId, marketShopDao)).excelType(ExcelTypeEnum.valueOf(excelType)).sheet("页面平均时长").doRead();
+        is = new BufferedInputStream(multipartFile.getInputStream());
+        EasyExcel.read(is, AdvertHits.class, new AdvertHitsListener(marketReportId, marketShopDao, advertImageHomeList, advertImageInfoList)).excelType(ExcelTypeEnum.valueOf(excelType)).sheet("广告图点击量").doRead();
+        is = new BufferedInputStream(multipartFile.getInputStream());
+        EasyExcel.read(is, Remark.class, new RemarkListener(marketReportId, marketShopDao)).excelType(ExcelTypeEnum.valueOf(excelType)).sheet("咨询数量").doRead();
+    }
+
+    MultipartFile fileToMultipartFileConverter(File file) throws IOException {
+        DiskFileItem diskFileItem = new DiskFileItem("File", "application/octet-stream", true, file.getName(), (int) file.length(), file.getParentFile());
+        try(InputStream is = new FileInputStream(file)) {
+            diskFileItem.getOutputStream().write(IOUtils.toByteArray(is));
+        }
+        return new CommonsMultipartFile(diskFileItem);
+    }
+
+    @Test
+    void testNumber() {
+        String zipFilePath = "E:\\Users\\Desktop\\dest\\test.zip";
+        String destDirectory = "E:\\Users\\Desktop\\extract";
+        try {
+            unzip(zipFilePath, destDirectory);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void unzip(String zipFilePath, String destDirectory) throws IOException {
+        File destDir = new File(destDirectory);
+        if (!destDir.exists()) {
+            destDir.mkdir();
+        }
+        ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));
+        ZipEntry entry = zipIn.getNextEntry();
+        while (entry != null) {
+            String filePath = destDirectory + File.separator + entry.getName();
+            if (!entry.isDirectory()) {
+                extractFile(zipIn, filePath);
+            } else {
+                File dir = new File(filePath);
+                dir.mkdir();
+            }
+            zipIn.closeEntry();
+            entry = zipIn.getNextEntry();
+        }
+        zipIn.close();
+    }
 
+    private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
+        File file = new File(filePath);
+        file.getParentFile().mkdirs();
+        try (FileOutputStream fos = new FileOutputStream(file)) {
+            byte[] bytes = new byte[4096];
+            int length;
+            while ((length = zipIn.read(bytes)) != -1) {
+                fos.write(bytes, 0, length);
+            }
+        }
     }
 
 }