소스 검색

Merge remote-tracking branch 'origin/developer' into developerL

kaick 1 년 전
부모
커밋
a3444994c0
27개의 변경된 파일1708개의 추가작업 그리고 20개의 파일을 삭제
  1. 11 7
      src/main/java/com/caimei365/user/controller/ProvidersController.java
  2. 26 0
      src/main/java/com/caimei365/user/controller/ShopApi.java
  3. 90 0
      src/main/java/com/caimei365/user/mapper/CmProvidersMapper.java
  4. 142 0
      src/main/java/com/caimei365/user/mapper/ShopMapper.java
  5. 42 0
      src/main/java/com/caimei365/user/model/vo/AdvertHitsVo.java
  6. 66 0
      src/main/java/com/caimei365/user/model/vo/ArticleReadVolumeVo.java
  7. 29 0
      src/main/java/com/caimei365/user/model/vo/CmMarketRemarkVo.java
  8. 89 0
      src/main/java/com/caimei365/user/model/vo/CmMarketShopVo.java
  9. 49 0
      src/main/java/com/caimei365/user/model/vo/FunnelModelVo.java
  10. 42 0
      src/main/java/com/caimei365/user/model/vo/ImpressionsVo.java
  11. 33 0
      src/main/java/com/caimei365/user/model/vo/PageDurationVo.java
  12. 41 0
      src/main/java/com/caimei365/user/model/vo/ProportionVo.java
  13. 42 0
      src/main/java/com/caimei365/user/model/vo/ReadVolumeVo.java
  14. 40 0
      src/main/java/com/caimei365/user/model/vo/ReturnDataVo.java
  15. 25 0
      src/main/java/com/caimei365/user/model/vo/ReturnEntityVo.java
  16. 4 0
      src/main/java/com/caimei365/user/model/vo/ShopVo.java
  17. 37 0
      src/main/java/com/caimei365/user/model/vo/StageVo.java
  18. 37 0
      src/main/java/com/caimei365/user/model/vo/SummaryVo.java
  19. 34 0
      src/main/java/com/caimei365/user/model/vo/VisitsVo.java
  20. 3 1
      src/main/java/com/caimei365/user/service/CmProvidersService.java
  21. 11 0
      src/main/java/com/caimei365/user/service/ShopService.java
  22. 6 3
      src/main/java/com/caimei365/user/service/impl/CmProvidersServiceImpl.java
  23. 6 0
      src/main/java/com/caimei365/user/service/impl/RegisterServiceImpl.java
  24. 503 6
      src/main/java/com/caimei365/user/service/impl/ShopServiceImpl.java
  25. 2 2
      src/main/java/com/caimei365/user/utils/BeanUtil.java
  26. 1 1
      src/main/resources/mapper/CmProvidersMapper.xml
  27. 297 0
      src/main/resources/mapper/ShopMapper.xml

+ 11 - 7
src/main/java/com/caimei365/user/controller/ProvidersController.java

@@ -5,12 +5,15 @@ import com.caimei365.user.model.po.CmProviders;
 import com.caimei365.user.model.vo.CmProvidersVO;
 import com.caimei365.user.model.vo.CmProvidersVO;
 import com.caimei365.user.service.CmProvidersService;
 import com.caimei365.user.service.CmProvidersService;
 import com.caimei365.user.utils.BeanUtil;
 import com.caimei365.user.utils.BeanUtil;
-import org.apache.commons.lang3.StringUtils;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 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.bind.annotation.RestController;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import java.util.List;
 
 
 /**
 /**
  * 服务商入驻Controller
  * 服务商入驻Controller
@@ -29,11 +32,12 @@ public class ProvidersController {
      * 服务商入驻信息查询
      * 服务商入驻信息查询
      */
      */
     @GetMapping("/from")
     @GetMapping("/from")
-    public ResponseJson getProvidersFrom(String providersId,String providersName) {
-        if (StringUtils.isBlank(providersId)&&StringUtils.isBlank(providersName)) {
-            return ResponseJson.error("参数异常!");
-        }
-        CmProviders cmProviders = cmProvidersService.getByCmProviders(new CmProviders().setId(providersId).setName(providersName).setStatus(90));
-        return ResponseJson.success(BeanUtil.setValue(cmProviders, CmProvidersVO.class));
+    public ResponseJson getProvidersFrom(String providersId,String providersName,
+                                         @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                         @RequestParam(value = "pageSize", defaultValue = "20") int pageSize
+                                         ) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<CmProviders> cmProviders = cmProvidersService.getByCmProviders(new CmProviders().setId(providersId).setName(providersName).setStatus(90));
+        return ResponseJson.success(new PageInfo<>(BeanUtil.setValues(cmProviders, CmProvidersVO.class)));
     }
     }
 }
 }

+ 26 - 0
src/main/java/com/caimei365/user/controller/ShopApi.java

@@ -344,4 +344,30 @@ public class ShopApi {
         }
         }
         return shopService.saveRecommendType(baikeProduct);
         return shopService.saveRecommendType(baikeProduct);
     }
     }
+
+    /**
+     * 供应商营销数据看板
+     * @param type
+     * @param marketReportId
+     * @param shopId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    @GetMapping("/preview")
+    public ResponseJson<Map<String, Object>> preview(Integer type, Integer marketReportId, Integer shopId, String startTime, String endTime) {
+        if (null == type) {
+            return ResponseJson.error(-1, "查询类型不能为空", null);
+        }
+        if (1 == type) {
+            if (null == marketReportId) {
+                return ResponseJson.error(-1, "供应商报表Id不能为空", null);
+            }
+        } else {
+            if (null == shopId) {
+                return ResponseJson.error(-1, "供应商Id不能为空", null);
+            }
+        }
+        return shopService.preview(type, marketReportId, shopId, startTime, endTime);
+    }
 }
 }

+ 90 - 0
src/main/java/com/caimei365/user/mapper/CmProvidersMapper.java

@@ -0,0 +1,90 @@
+package com.caimei365.user.mapper;
+
+import com.caimei365.user.model.po.CmProviders;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * Mapper接口
+ *
+ * @author Kaick
+ * @date 2023-12-14
+ */
+@Mapper
+public interface CmProvidersMapper
+{
+    /**
+     * 通过对象查询列表
+     *
+     * @param cmProviders
+     * @return 集合
+     */
+    List<CmProviders> getCmProvidersList(CmProviders cmProviders);
+
+    /**
+     * 通过Id查询对象
+     *
+     * @param id 主键
+     * @return
+     */
+    CmProviders getCmProvidersById(String id);
+
+    /**
+     * 通过对象查询对象
+     *
+     * @param cmProviders
+     * @return
+     */
+    CmProviders getByCmProviders(CmProviders cmProviders);
+
+    /**
+     * 通过对象查询Id
+     *
+     * @param cmProviders
+     * @return String
+     */
+    String getById(CmProviders cmProviders);
+
+
+    /**
+     * 通过对象查询记录总数
+     *
+     * @param cmProviders
+     * @return Integer
+     */
+    int getCount(CmProviders cmProviders);
+
+    /**
+     * 新增
+     *
+     * @param cmProviders
+     * @return 结果
+     */
+    int addCmProviders(CmProviders cmProviders);
+
+    /**
+     * 修改
+     *
+     * @param cmProviders
+     * @return 结果
+     */
+    int updateCmProviders(CmProviders cmProviders);
+
+    /**
+     * 删除
+     *
+     * @param id 主键
+     * @return 结果
+     */
+    int delCmProvidersById(String id);
+
+    /**
+     * 批量删除
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int delCmProviders(CmProviders cmProviders);
+
+}

+ 142 - 0
src/main/java/com/caimei365/user/mapper/ShopMapper.java

@@ -115,6 +115,13 @@ public interface ShopMapper {
      */
      */
     @MapKey("orderQuantity")
     @MapKey("orderQuantity")
     Map<String, Object> getSalesStatistics(Integer shopId, Integer organizeId, String startTime, String endTime);
     Map<String, Object> getSalesStatistics(Integer shopId, Integer organizeId, String startTime, String endTime);
+
+    /**
+     * 是否为营销供应商
+     * @param shopId
+     * @return
+     */
+    Integer getShopIsMark(@Param("shopId") Integer shopId);
     /**
     /**
      * 轮播图片数量
      * 轮播图片数量
      */
      */
@@ -131,4 +138,139 @@ public interface ShopMapper {
      * 删除轮播图
      * 删除轮播图
      */
      */
     void deleteShopHomeImage(Integer id);
     void deleteShopHomeImage(Integer id);
+    /**
+     * 获取报表对应的供应商信息
+     * @param shopId
+     * @param type
+     * @return
+     */
+    CmMarketShopVo getShopInfoById(@Param("shopId") Integer shopId, @Param("type") Integer type, @Param("marketReportId") Integer marketReportId);
+
+    /**
+     * 营销供应商报表Id
+     * @param marketId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<Integer> getMarketReportIds(@Param("marketId") Integer marketId, @Param("type") Integer type, @Param("marketReportId") Integer marketReportId, @Param("startTime") String startTime, @Param("endTime") String endTime);
+
+    /**
+     * 获取阶段描述
+     * @param marketReportIds
+     * @return
+     */
+    List<StageVo> getMarketStage(@Param("marketReportIds") List<Integer> marketReportIds);
+
+
+    /**
+     * 获取漏洞模型数据
+     * @param marketReportIds
+     * @return
+     */
+    List<FunnelModelVo> getMarketFunnelModel(@Param("marketReportIds") List<Integer> marketReportIds);
+
+    /**
+     * 获取推文数据
+     * @param marketReportIds
+     * @return
+     */
+    List<ArticleReadVolumeVo> getMarketArticleReadVolume(@Param("marketReportIds") List<Integer> marketReportIds);
+
+    /**
+     * 获取展现量数据
+     * @param marketReportIds
+     * @return
+     */
+    List<ImpressionsVo> getMarketImpressions(@Param("marketReportIds") List<Integer> marketReportIds);
+
+    /**
+     * 获取点击量数据
+     * @param marketReportIds
+     * @return
+     */
+    List<ReadVolumeVo> getMarketReadVolume(@Param("marketReportIds") List<Integer> marketReportIds);
+
+    /**
+     * 获取SEO汇总数据
+     * @param marketReportIds
+     * @return
+     */
+    List<SummaryVo> getMarketSummary(@Param("marketReportIds") List<Integer> marketReportIds);
+
+    /**
+     * 获取访问量数据
+     * @param marketReportIds
+     * @return
+     */
+    List<VisitsVo> getMarketVisits(@Param("marketReportIds") List<Integer> marketReportIds);
+
+    /**
+     * 获取访客来源分布数据
+     * @param marketReportIds
+     * @return
+     */
+    List<ProportionVo> getMarketProportion(@Param("marketReportIds") List<Integer> marketReportIds);
+
+    /**
+     * 获取页面平均访问时长数据
+     * @param marketReportIds
+     * @return
+     */
+    List<PageDurationVo> getMarketPageDuration(@Param("marketReportIds") List<Integer> marketReportIds);
+
+    /**
+     * 获取广告图点击量数据
+     * @param marketReportIds
+     * @return
+     */
+    List<AdvertHitsVo> getMarketAdvertHits(@Param("marketReportIds") List<Integer> marketReportIds);
+
+    /**
+     * 获取咨询数量数据
+     * @param marketReportIds
+     * @return
+     */
+    List<CmMarketRemarkVo> getMarketRemark(@Param("marketReportIds") List<Integer> marketReportIds);
+
+    /**
+     * 供应商包含的标签词
+     * @param shopId
+     * @return
+     */
+    List<String> getShopKeyword(@Param("shopId") Integer shopId);
+
+    /**
+     * 访问供应商相关用户所在地区
+     * @param startTime
+     * @param endTime
+     * @param labels
+     * @return
+     */
+    List<String> getRegion(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("labels") List<String> labels);
+
+    /**
+     * 用户身份
+     * @param startTime
+     * @param endTime
+     * @param labels
+     * @return
+     */
+    List<ReturnEntityVo> getUserIdentity(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("labels") List<String> labels);
+
+    /**
+     * 机构类型
+     * @param startTime
+     * @param endTime
+     * @param labels
+     * @return
+     */
+    List<ReturnEntityVo> getClubType(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("labels") List<String> labels);
+
+    /**
+     * 供应商下有报表的月份集合
+     * @param shopId
+     * @return
+     */
+    List<String> getMarketReportDataList(@Param("shopId") Integer shopId);
 }
 }

+ 42 - 0
src/main/java/com/caimei365/user/model/vo/AdvertHitsVo.java

@@ -0,0 +1,42 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description  全商城点击量
+ *
+ * @author : hzg
+ * @date : 2023/11/23
+ */
+@Data
+public class AdvertHitsVo {
+
+    /**
+     * 营销数据 id
+     */
+    private Integer marketReportId;
+    /**
+     * 日期
+     */
+    private String addTime;
+    /**
+     * 广告位置
+     */
+    private String position;
+    /**
+     * 首页
+     */
+    private String home;
+    /**
+     * 信息中心
+     */
+    private String infoCenter;
+    /**
+     * 点击量
+     */
+    private Integer hits;
+    /**
+     * 删除标记 0 未删除 1 已删除
+     */
+    private String delFlag;
+}

+ 66 - 0
src/main/java/com/caimei365/user/model/vo/ArticleReadVolumeVo.java

@@ -0,0 +1,66 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description  推文阅读量
+ *
+ * @author : hzg
+ * @date : 2023/11/22
+ */
+@Data
+public class ArticleReadVolumeVo {
+    /**
+     * 营销数据 id
+     */
+    private Integer marketReportId;
+    /**
+     * 日期
+     */
+    private String addTime;
+    /**
+     * 首发时间
+     */
+    private String firstTime;
+    /**
+     * 发文主题
+     */
+    private String title;
+    /**
+     * 跳转链接
+     */
+    private String link;
+    /**
+     * 主题简称
+     */
+    private String titleReferred;
+    /**
+     * 类型
+     */
+    private String type;
+    /**
+     * 首发时间
+     */
+    private String startTime;
+    /**
+     * 文章关键词
+     */
+    private String keyword;
+    /**
+     * 分发渠道
+     */
+    private String channel;
+    /**
+     * 总点击量
+     */
+    private Integer wechatNumber;
+    /**
+     * 总展现量
+     */
+    private Integer touchNumber;
+    /**
+     * 删除标记 0 未删除 1 已删除
+     */
+    private String delFlag;
+
+}

+ 29 - 0
src/main/java/com/caimei365/user/model/vo/CmMarketRemarkVo.java

@@ -0,0 +1,29 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description  咨询数量
+ *
+ * @author : hzg
+ * @date : 2023/11/23
+ */
+@Data
+public class CmMarketRemarkVo {
+    /**
+     * 营销数据 id
+     */
+    private Integer marketReportId;
+    /**
+     * 日期
+     */
+    private String addTime;
+    /**
+     * 咨询数量
+     */
+    private Integer remarkNumber;
+    /**
+     * 删除标记 0 未删除 1 已删除
+     */
+    private String delFlag;
+}

+ 89 - 0
src/main/java/com/caimei365/user/model/vo/CmMarketShopVo.java

@@ -0,0 +1,89 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : hzg
+ * @date : 2023/12/14
+ */
+@Data
+public class CmMarketShopVo {
+    /**
+     * id
+     */
+    private Integer id;
+    /**
+     * 供应商id
+     */
+    private Integer shopId;
+    /**
+     * 营销供应商logo
+     */
+    private String logo;
+    /**
+     * 添加时间
+     */
+    private String addTime;
+    /**
+     * 删除标记 0 未删除 1 已删除
+     */
+    private Integer delFlag;
+    /**
+     * 供应商名称
+     */
+    private String name;
+    /**
+     * 供应商联系人
+     */
+    private String linkMan;
+    /**
+     * 供应商联系电话
+     */
+    private String contractMobile;
+    /**
+     * 供应商状态
+     */
+    private Integer status;
+    /**
+     * 最近报表时间
+     */
+    private String recentlyTime;
+    /**
+     * 报表名称
+     */
+    private String chartTitle;
+    /**
+     * 展现量
+     */
+    private Integer impressions;
+    /**
+     * 点击量
+     */
+    private Integer hits;
+    /**
+     * 访问量
+     */
+    private Integer visits;
+    /**
+     * 咨询量
+     */
+    private Integer consultation;
+    /**
+     * 报备&成交量
+     */
+    private Integer report;
+    /**
+     * 报表日期
+     */
+    private String reportDate;
+    /**
+     * 开始时间
+     */
+    private String startDate;
+    /**
+     * 结束时间
+     */
+    private String endDate;
+}

+ 49 - 0
src/main/java/com/caimei365/user/model/vo/FunnelModelVo.java

@@ -0,0 +1,49 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description  用户意向分布
+ *
+ * @author : hzg
+ * @date : 2023/11/23
+ */
+@Data
+public class FunnelModelVo {
+    /**
+     * 营销数据 id
+     */
+    private Integer marketReportId;
+    /**
+     * 日期
+     */
+    private String addTime;
+    /**
+     * 是否可见 1 可见 2 不可见
+     */
+    private Integer visible;
+    /**
+     * 展现量
+     */
+    private Integer impressions;
+    /**
+     * 点击量
+     */
+    private Integer hits;
+    /**
+     * 访问量
+     */
+    private Integer visits;
+    /**
+     * 咨询量
+     */
+    private Integer consultation;
+    /**
+     * 报备&成交量
+     */
+    private Integer report;
+    /**
+     * 删除标记 0 未删除 1 已删除
+     */
+    private Integer delFlag;
+}

+ 42 - 0
src/main/java/com/caimei365/user/model/vo/ImpressionsVo.java

@@ -0,0 +1,42 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description  展现量
+ *
+ * @author : hzg
+ * @date : 2023/11/23
+ */
+@Data
+public class ImpressionsVo {
+
+    /**
+     * 营销数据 id
+     */
+    private Integer marketReportId;
+    /**
+     * 日期
+     */
+    private String addTime;
+    /**
+     * 公众号
+     */
+    private Integer generalNumber;
+    /**
+     * 微博
+     */
+    private Integer microBlog;
+    /**
+     * 小红书
+     */
+    private Integer redBookNumber;
+    /**
+     * 其它自媒体渠道
+     */
+    private Integer otherNumber;
+    /**
+     * 删除标记 0 未删除 1 已删除
+     */
+    private String delFlag;
+}

+ 33 - 0
src/main/java/com/caimei365/user/model/vo/PageDurationVo.java

@@ -0,0 +1,33 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description  页面平均时长
+ *
+ * @author : hzg
+ * @date : 2023/11/23
+ */
+@Data
+public class PageDurationVo {
+    /**
+     * 营销数据 id
+     */
+    private Integer marketReportId;
+    /**
+     * 日期
+     */
+    private String addTime;
+    /**
+     * 页面类型
+     */
+    private String pageLabel;
+    /**
+     * 平均停留时间
+     */
+    private Integer accessDuration;
+    /**
+     * 删除标记 0 未删除 1 已删除
+     */
+    private String delFlag;
+}

+ 41 - 0
src/main/java/com/caimei365/user/model/vo/ProportionVo.java

@@ -0,0 +1,41 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description  用户来源渠道占比
+ *
+ * @author : hzg
+ * @date : 2023/11/23
+ */
+@Data
+public class ProportionVo {
+    /**
+     * 营销数据 id
+     */
+    private Integer marketReportId;
+    /**
+     * 日期
+     */
+    private String addTime;
+    /**
+     * 搜索引擎
+     */
+    private Integer search;
+    /**
+     * 微信平台
+     */
+    private Integer general;
+    /**
+     * 微博
+     */
+    private Integer microBlog;
+    /**
+     * 直接访问
+     */
+    private Integer directAccess;
+    /**
+     * 删除标记 0 未删除 1 已删除
+     */
+    private String delFlag;
+}

+ 42 - 0
src/main/java/com/caimei365/user/model/vo/ReadVolumeVo.java

@@ -0,0 +1,42 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description  阅读量
+ *
+ * @author : hzg
+ * @date : 2023/11/23
+ */
+@Data
+public class ReadVolumeVo {
+
+    /**
+     * 营销数据 id
+     */
+    private Integer marketReportId;
+    /**
+     * 日期
+     */
+    private String addTime;
+    /**
+     * 公众号
+     */
+    private Integer generalNumber;
+    /**
+     * 微博
+     */
+    private Integer microBlog;
+    /**
+     * 小红书
+     */
+    private Integer redBookNumber;
+    /**
+     * 其它自媒体渠道
+     */
+    private Integer otherNumber;
+    /**
+     * 删除标记 0 未删除 1 已删除
+     */
+    private String delFlag;
+}

+ 40 - 0
src/main/java/com/caimei365/user/model/vo/ReturnDataVo.java

@@ -0,0 +1,40 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+
+
+/**
+ * Description
+ *
+ * @author : hzg
+ * @date : 2023/12/21
+ */
+@Data
+public class ReturnDataVo {
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 值
+     */
+    private Integer value;
+    /**
+     * seo图片地址
+     */
+    private String seo;
+    /**
+     * 名称集合
+     */
+    private ArrayList<String> names;
+    /**
+     * 值集合
+     */
+    private ArrayList<Integer> values;
+    /**
+     * 备份(第二个值)值集合
+     */
+    private ArrayList<Integer> backupsValues;
+}

+ 25 - 0
src/main/java/com/caimei365/user/model/vo/ReturnEntityVo.java

@@ -0,0 +1,25 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2023/3/16
+ */
+@Data
+public class ReturnEntityVo {
+    /**
+     * key
+     */
+    private String id;
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * value
+     */
+    private String value;
+}

+ 4 - 0
src/main/java/com/caimei365/user/model/vo/ShopVo.java

@@ -26,6 +26,10 @@ public class ShopVo implements Serializable {
      * 供应商ID
      * 供应商ID
      */
      */
     private Integer shopId;
     private Integer shopId;
+    /**
+     * 营销供应商Id
+     */
+    private Integer marketId;
     /**
     /**
      * 供应商公司名称
      * 供应商公司名称
      */
      */

+ 37 - 0
src/main/java/com/caimei365/user/model/vo/StageVo.java

@@ -0,0 +1,37 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description  用户身份分布
+ *
+ * @author : hzg
+ * @date : 2023/11/23
+ */
+@Data
+public class StageVo {
+    /**
+     * 营销数据 id
+     */
+    private Integer marketReportId;
+    /**
+     * 添加时间
+     */
+    private String addTime;
+    /**
+     * 报表日期
+     */
+    private String reportDate;
+    /**
+     * 阶段
+     */
+    private String stage;
+    /**
+     * 主题
+     */
+    private String theme;
+    /**
+     * 删除标记 0 未删除 1 已删除
+     */
+    private String delFlag;
+}

+ 37 - 0
src/main/java/com/caimei365/user/model/vo/SummaryVo.java

@@ -0,0 +1,37 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description  用户类型分布
+ *
+ * @author : hzg
+ * @date : 2023/11/23
+ */
+@Data
+public class SummaryVo {
+    /**
+     * 营销数据 id
+     */
+    private Integer marketReportId;
+    /**
+     * 日期
+     */
+    private String addTime;
+    /**
+     * 关键词
+     */
+    private String keyword;
+    /**
+     * SEO排名
+     */
+    private String seoRanking;
+    /**
+     * 占比
+     */
+    private Integer searchVolume;
+    /**
+     * 删除标记 0 未删除 1 已删除
+     */
+    private String delFlag;
+}

+ 34 - 0
src/main/java/com/caimei365/user/model/vo/VisitsVo.java

@@ -0,0 +1,34 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+/**
+ * Description  访问量
+ *
+ * @author : hzg
+ * @date : 2023/11/23
+ */
+@Data
+public class VisitsVo {
+
+    /**
+     * 营销数据 id
+     */
+    private Integer marketReportId;
+    /**
+     * 日期
+     */
+    private String addTime;
+    /**
+     * 机构访问量
+     */
+    private Integer clubNumber;
+    /**
+     * 游客访问量
+     */
+    private Integer touristNumber;
+    /**
+     * 删除标记 0 未删除 1 已删除
+     */
+    private String delFlag;
+}

+ 3 - 1
src/main/java/com/caimei365/user/service/CmProvidersService.java

@@ -2,6 +2,8 @@ package com.caimei365.user.service;
 
 
 import com.caimei365.user.model.po.CmProviders;
 import com.caimei365.user.model.po.CmProviders;
 
 
+import java.util.List;
+
 /**
 /**
  * Service接口
  * Service接口
  *
  *
@@ -18,5 +20,5 @@ public interface CmProvidersService
      * @param cmProviders
      * @param cmProviders
      * @return
      * @return
      */
      */
-    CmProviders getByCmProviders(CmProviders cmProviders);
+    List<CmProviders> getByCmProviders(CmProviders cmProviders);
 }
 }

+ 11 - 0
src/main/java/com/caimei365/user/service/ShopService.java

@@ -244,4 +244,15 @@ public interface ShopService {
      * @return
      * @return
      */
      */
     ResponseJson<Void> saveRecommendSort(BaikeRecommendVo baikeRecommend);
     ResponseJson<Void> saveRecommendSort(BaikeRecommendVo baikeRecommend);
+
+    /**
+     * 供应商营销数据看板
+     * @param type
+     * @param marketReportId
+     * @param shopId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    ResponseJson<Map<String, Object>> preview(Integer type, Integer marketReportId, Integer shopId, String startTime, String endTime);
 }
 }

+ 6 - 3
src/main/java/com/caimei365/user/service/impl/CmProvidersServiceImpl.java

@@ -8,6 +8,7 @@ import com.caimei365.user.service.CmProvidersService;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import java.util.List;
 
 
 /**
 /**
  * Service业务层处理
  * Service业务层处理
@@ -30,11 +31,13 @@ public class CmProvidersServiceImpl implements CmProvidersService
      * @return
      * @return
      */
      */
     @Override
     @Override
-    public CmProviders getByCmProviders(CmProviders cmProviders)
+    public List<CmProviders> getByCmProviders(CmProviders cmProviders)
     {
     {
-        CmProviders byCmProviders = cmProvidersMapper.getByCmProviders(cmProviders);
+        List<CmProviders> byCmProviders = cmProvidersMapper.getCmProvidersList(cmProviders);
         if(null!=byCmProviders){
         if(null!=byCmProviders){
-            byCmProviders.setTextRelateds(baseMapper.getRelatedImageList(new CmRelatedImage().setType("2").setAuthorId(byCmProviders.getId())));
+            byCmProviders.forEach(s->{
+                s.setTextRelateds(baseMapper.getRelatedImageList(new CmRelatedImage().setType("2").setAuthorId(s.getId())));
+            });
         }
         }
         return byCmProviders;
         return byCmProviders;
     }
     }

+ 6 - 0
src/main/java/com/caimei365/user/service/impl/RegisterServiceImpl.java

@@ -69,6 +69,8 @@ public class RegisterServiceImpl implements RegisterService {
     private WeChatService weChatService;
     private WeChatService weChatService;
     @Resource
     @Resource
     private ClubMapper clubMapper;
     private ClubMapper clubMapper;
+    @Resource
+    private AsyncService asyncService;
 
 
     /**
     /**
      * 检查账号可以注册
      * 检查账号可以注册
@@ -326,6 +328,10 @@ public class RegisterServiceImpl implements RegisterService {
                 }
                 }
             }
             }
         }
         }
+        // 自动分配协销给协销发送微信消息提醒模板 不是默认协销 Id 发送
+        if (null != spId && spId != 1342) {
+            asyncService.sendChoseServiceMessage(1, club.getClubId(), spId, 1342);
+        }
         //推送信息中心-账户通知
         //推送信息中心-账户通知
         MessageCenter messageCenter = new MessageCenter();
         MessageCenter messageCenter = new MessageCenter();
         messageCenter.setShopId(null);
         messageCenter.setShopId(null);

+ 503 - 6
src/main/java/com/caimei365/user/service/impl/ShopServiceImpl.java

@@ -26,7 +26,15 @@ import org.springframework.transaction.annotation.Transactional;
 import redis.clients.jedis.Jedis;
 import redis.clients.jedis.Jedis;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.YearMonth;
+import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 
 /**
 /**
  * Description
  * Description
@@ -68,12 +76,12 @@ public class ShopServiceImpl implements ShopService {
     @Override
     @Override
     public ResponseJson<UserLoginVo> shortcutLogin(Integer userId) {
     public ResponseJson<UserLoginVo> shortcutLogin(Integer userId) {
         UserLoginVo userLoginVo = shopMapper.getShopByUserId(userId);
         UserLoginVo userLoginVo = shopMapper.getShopByUserId(userId);
-        // 生成token给用户
-        String token = JwtUtil.createToken(userId);
-        // 为了过期续签,将token存入redis,并设置超时时间
-        redisService.set(token, token, JwtUtil.getExpireTime());
-        userLoginVo.setToken(token);
         if (null != userLoginVo) {
         if (null != userLoginVo) {
+            // 生成token给用户
+            String token = JwtUtil.createToken(userId);
+            // 为了过期续签,将token存入redis,并设置超时时间
+            redisService.set(token, token, JwtUtil.getExpireTime());
+            userLoginVo.setToken(token);
             if (null != userLoginVo.getShopId()) {
             if (null != userLoginVo.getShopId()) {
                 if (null != userLoginVo.getShopStatus() && null != userLoginVo.getUserIdentity() && 3 == userLoginVo.getUserIdentity()) {
                 if (null != userLoginVo.getShopStatus() && null != userLoginVo.getUserIdentity() && 3 == userLoginVo.getUserIdentity()) {
 
 
@@ -472,7 +480,13 @@ public class ShopServiceImpl implements ShopService {
         m4.put("time", "近一年");
         m4.put("time", "近一年");
         salesStatisticsList.add(m4);
         salesStatisticsList.add(m4);
         result.put("salesStatisticsList", salesStatisticsList);
         result.put("salesStatisticsList", salesStatisticsList);
-
+        // 是否为营销供应商
+        Integer shopIsMark = shopMapper.getShopIsMark(shop.getShopId());
+        if (null != shopIsMark) {
+            result.put("isMark", true);
+        } else {
+            result.put("isMark", false);
+        }
         return ResponseJson.success(result);
         return ResponseJson.success(result);
     }
     }
 
 
@@ -850,4 +864,487 @@ public class ShopServiceImpl implements ShopService {
         return ResponseJson.success(null);
         return ResponseJson.success(null);
     }
     }
 
 
+    /**
+     * 供应商营销数据看板
+     *
+     * @param type
+     * @param marketReportId
+     * @param shopId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    @Override
+    public ResponseJson<Map<String, Object>> preview(Integer type, Integer marketReportId, Integer shopId, String startTime, String endTime) {
+        Map<String, Object> map = new HashMap<>();
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
+        SimpleDateFormat formatDate = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            if (StringUtils.isNotBlank(startTime)) {
+                startTime = dateFormat.format(dateFormat.parse(startTime));
+            }
+            if (StringUtils.isNotBlank(endTime)) {
+                endTime = dateFormat.format(dateFormat.parse(endTime));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        // name集合
+        ArrayList<String> name = new ArrayList<>();
+        // value 集合
+        ArrayList<Integer> value = new ArrayList<>();
+        // 备份(第二value)集合
+        ArrayList<Integer> backupsValues = new ArrayList<>();
+        // 唯一name集合
+        Set<String> set = new HashSet<>();
+        // 获取报表对应供应商数据
+        CmMarketShopVo shopInfo = shopMapper.getShopInfoById(shopId, type, marketReportId);
+        List<Integer> marketReportIds = shopMapper.getMarketReportIds(shopInfo.getId(), type, marketReportId, startTime, endTime);
+        log.info("marketReportIds===="+marketReportIds);
+        // 获取阶段描述
+        List<StageVo> summarize = new ArrayList<>();
+        List<StageVo> summarize1 = new ArrayList<>();
+        List<StageVo> summarize2 = new ArrayList<>();
+        if (null != marketReportIds && marketReportIds.size() > 0) {
+            List<StageVo> marketStage = shopMapper.getMarketStage(marketReportIds);
+            if (null != marketStage && marketStage.size() > 0) {
+                for (StageVo stage : marketStage) {
+                    try {
+                        stage.setAddTime(dateFormat.format(dateFormat.parse(stage.getReportDate())));
+                        if ("1".equals(stage.getStage())) {
+                            summarize.add(stage);
+                        }
+                        if ("2".equals(stage.getStage())) {
+                            summarize1.add(stage);
+                        }
+                        if ("3".equals(stage.getStage())) {
+                            summarize2.add(stage);
+                        }
+                    } catch (ParseException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+        map.put("summarize", summarize);
+        map.put("summarize1", summarize1);
+        map.put("summarize2", summarize2);
+        // 获取漏斗模型数据
+        if (null != marketReportIds && marketReportIds.size() > 0) {
+            List<FunnelModelVo> marketFunnelModel = shopMapper.getMarketFunnelModel(marketReportIds);
+            int impressions = 0, hits = 0, visits = 0, consultation = 0, report = 0;
+            if (null != marketFunnelModel && marketFunnelModel.size() > 0) {
+                for (FunnelModelVo funnelModel : marketFunnelModel) {
+                    impressions += funnelModel.getImpressions();
+                    hits += funnelModel.getHits();
+                    visits += funnelModel.getVisits();
+                    consultation += funnelModel.getConsultation();
+                    report += funnelModel.getReport();
+                }
+            }
+            try {
+                if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) {
+                    shopInfo.setChartTitle("("+startTime.replaceAll("-", "/") + "-" + endTime.replaceAll("-", "/")+")");
+                } else if (1 == type && null != marketReportId) {
+                    shopInfo.setChartTitle("("+dateFormat.format(dateFormat.parse(shopInfo.getReportDate())).replaceAll("-", "/")+")");
+                } else {
+                    shopInfo.setChartTitle("("+ (StringUtils.isNotBlank(shopInfo.getEndDate()) ? dateFormat.format(dateFormat.parse(shopInfo.getEndDate())).replaceAll("-", "/") : "") + ")");
+                }
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+            shopInfo.setImpressions(impressions);
+            shopInfo.setHits(hits);
+            shopInfo.setVisits(visits);
+            shopInfo.setConsultation(consultation);
+            shopInfo.setReport(report);
+        }
+        map.put("shopInfo", shopInfo);
+        // 获取推文数据
+        List<ArticleReadVolumeVo> articleReadVolumeList = new ArrayList<>();
+        if (null != marketReportIds && marketReportIds.size() > 0) {
+            List<ArticleReadVolumeVo> marketArticleReadVolume = shopMapper.getMarketArticleReadVolume(marketReportIds);
+            if (null != marketArticleReadVolume && marketArticleReadVolume.size() > 0) {
+                for (ArticleReadVolumeVo articleReadVolume : marketArticleReadVolume) {
+                    try {
+                        articleReadVolume.setFirstTime(formatDate.format(formatDate.parse(articleReadVolume.getFirstTime())));
+                    } catch (ParseException e) {
+                        e.printStackTrace();
+                    }
+                    if (!set.contains(articleReadVolume.getTitle())) {
+                        set.add(articleReadVolume.getTitle());
+                        articleReadVolumeList.add(articleReadVolume);
+                    } else {
+                        // 将有重复的推文数据 总阅读量  总展现量相加为一组数据
+                        for (ArticleReadVolumeVo readVolume : articleReadVolumeList) {
+                            if (articleReadVolume.getTitle().equals(readVolume.getTitle())) {
+                                readVolume.setWechatNumber(MathUtil.add(readVolume.getWechatNumber(), articleReadVolume.getWechatNumber()).intValue());
+                                readVolume.setTouchNumber(MathUtil.add(readVolume.getTouchNumber(), articleReadVolume.getTouchNumber()).intValue());
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        map.put("volumeList", articleReadVolumeList);
+        // 公众号推文数据
+        ReturnDataVo articleReturnData = new ReturnDataVo();
+        if (null != marketReportIds && marketReportIds.size() > 0) {
+            if (null != articleReadVolumeList && articleReadVolumeList.size() > 0) {
+                name = new ArrayList<>(articleReadVolumeList.stream().map(ArticleReadVolumeVo::getTitleReferred).collect(Collectors.toList()));
+                articleReturnData.setNames(name);
+                value = new ArrayList<>(articleReadVolumeList.stream().map(ArticleReadVolumeVo::getWechatNumber).collect(Collectors.toList()));
+                articleReturnData.setValues(value);
+                backupsValues = new ArrayList<>(articleReadVolumeList.stream().map(ArticleReadVolumeVo::getTouchNumber).collect(Collectors.toList()));
+                articleReturnData.setBackupsValues(backupsValues);
+            }
+        }
+        map.put("wechats", articleReturnData);
+        // 获取展现量数据
+        name = new ArrayList<>();
+        value = new ArrayList<>();
+        int generalNumber = 0, microBlog = 0, redBookNumber = 0, otherNumber = 0;
+        if (null != marketReportIds && marketReportIds.size() > 0) {
+            List<ImpressionsVo> marketImpressions = shopMapper.getMarketImpressions(marketReportIds);
+            if (null != marketImpressions && marketImpressions.size() > 0) {
+                for (ImpressionsVo imp : marketImpressions) {
+                    generalNumber += imp.getGeneralNumber();
+                    microBlog += imp.getMicroBlog();
+                    redBookNumber += imp.getRedBookNumber();
+                    otherNumber += imp.getOtherNumber();
+                }
+            }
+        }
+        ReturnDataVo returnData = new ReturnDataVo();
+        name.add("公众号");
+        name.add("微博");
+        name.add("小红书");
+        name.add("其它自媒体渠道");
+        returnData.setNames(name);
+        value.add(generalNumber);
+        value.add(microBlog);
+        value.add(redBookNumber);
+        value.add(otherNumber);
+        returnData.setValues(value);
+        map.put("intention", returnData);
+        // 获取点击量数据
+        name = new ArrayList<>();
+        value = new ArrayList<>();
+        generalNumber = 0; microBlog = 0; redBookNumber = 0; otherNumber = 0;
+        if (null != marketReportIds && marketReportIds.size() > 0) {
+            List<ReadVolumeVo> marketReadVolume = shopMapper.getMarketReadVolume(marketReportIds);
+            if (null != marketReadVolume && marketReadVolume.size() > 0) {
+                for (ReadVolumeVo readVolume : marketReadVolume) {
+                    generalNumber += readVolume.getGeneralNumber();
+                    microBlog += readVolume.getMicroBlog();
+                    redBookNumber += readVolume.getRedBookNumber();
+                    otherNumber += readVolume.getOtherNumber();
+                }
+            }
+        }
+        ReturnDataVo readVolumeReturnData = new ReturnDataVo();
+        name.add("公众号");
+        name.add("微博");
+        name.add("小红书");
+        name.add("其它自媒体渠道");
+        readVolumeReturnData.setNames(name);
+        value.add(generalNumber);
+        value.add(microBlog);
+        value.add(redBookNumber);
+        value.add(otherNumber);
+        readVolumeReturnData.setValues(value);
+        map.put("allVisits", readVolumeReturnData);
+        // 获取SEO汇总数据
+        List<SummaryVo> summaryList = new ArrayList<>();
+        set = new HashSet<>();
+        if (null != marketReportIds && marketReportIds.size() > 0) {
+            List<SummaryVo> marketSummary = shopMapper.getMarketSummary(marketReportIds);
+            List<ReturnDataVo> returnDataList = new ArrayList<>();
+            if (null != marketSummary && marketSummary.size() > 0) {
+                for (SummaryVo summary : marketSummary) {
+                    if (!set.contains(summary.getKeyword())) {
+                        set.add(summary.getKeyword());
+                        summaryList.add(summary);
+                    } else {
+                        for (SummaryVo summary1 : summaryList) {
+                            if (summary.getKeyword().equals(summary1.getKeyword())) {
+                                summary1.setSearchVolume(MathUtil.add(summary1.getSearchVolume(), summary.getSearchVolume()).intValue());
+                            }
+                        }
+                    }
+                }
+            }
+            if (null != summaryList && summaryList.size() > 0) {
+                for (SummaryVo summary : summaryList) {
+                    ReturnDataVo summaryReturnData = new ReturnDataVo();
+                    summaryReturnData.setName(summary.getKeyword());
+                    summaryReturnData.setValue(summary.getSearchVolume());
+                    summaryReturnData.setSeo(summary.getSeoRanking());
+                    returnDataList.add(summaryReturnData);
+                }
+            }
+        }
+        map.put("keywordList", summaryList);
+        // 获取访问量数据
+        name = new ArrayList<>();
+        value = new ArrayList<>();
+        int clubNumber = 0, touristNumber = 0;
+        if (null != marketReportIds && marketReportIds.size() > 0) {
+            List<VisitsVo> marketVisits = shopMapper.getMarketVisits(marketReportIds);
+            if (null != marketVisits && marketVisits.size() > 0) {
+                for (VisitsVo vis : marketVisits) {
+                    clubNumber += vis.getClubNumber();
+                    touristNumber += vis.getTouristNumber();
+                }
+            }
+        }
+        ReturnDataVo visitsReturnData = new ReturnDataVo();
+        name.add("机构访问量");
+        name.add("游客访问量");
+        visitsReturnData.setNames(name);
+        value.add(clubNumber);
+        value.add(touristNumber);
+        visitsReturnData.setValues(value);
+        map.put("stationVisits", visitsReturnData);
+        // 获取访客来源分布数据
+        int search = 0, general = 0, proMicroBlog = 0, directAccess = 0;
+        if (null != marketReportIds && marketReportIds.size() > 0) {
+            List<ProportionVo> marketProportion = shopMapper.getMarketProportion(marketReportIds);
+            if (null != marketProportion && marketProportion.size() > 0) {
+                for (ProportionVo proportion : marketProportion) {
+                    search += proportion.getSearch();
+                    general += proportion.getGeneral();
+                    proMicroBlog += proportion.getMicroBlog();
+                    directAccess += proportion.getDirectAccess();
+                }
+            }
+        }
+        List<ReturnDataVo> proportionDataList = new ArrayList<>();
+        ReturnDataVo proportionReturnData = new ReturnDataVo();
+        proportionReturnData.setName("搜索引擎");
+        proportionReturnData.setValue(search);
+        proportionDataList.add(proportionReturnData);
+        proportionReturnData = new ReturnDataVo();
+        proportionReturnData.setName("微信平台");
+        proportionReturnData.setValue(general);
+        proportionDataList.add(proportionReturnData);
+        proportionReturnData = new ReturnDataVo();
+        proportionReturnData.setName("微博");
+        proportionReturnData.setValue(proMicroBlog);
+        proportionDataList.add(proportionReturnData);
+        proportionReturnData = new ReturnDataVo();
+        proportionReturnData.setName("直接访问");
+        proportionReturnData.setValue(directAccess);
+        proportionDataList.add(proportionReturnData);
+        map.put("proportion", proportionDataList);
+        // 获取页面平均访问时长数据
+        set = new HashSet<>();
+        List<PageDurationVo> pageDurationList = new ArrayList<>();
+        if (null != marketReportIds && marketReportIds.size() > 0) {
+            List<PageDurationVo> marketPageDuration = shopMapper.getMarketPageDuration(marketReportIds);
+            if (null != marketPageDuration && marketPageDuration.size() > 0) {
+                for (PageDurationVo pageDuration : marketPageDuration) {
+                    if (!set.contains(pageDuration.getPageLabel())) {
+                        set.add(pageDuration.getPageLabel());
+                        pageDurationList.add(pageDuration);
+                    } else {
+                        for (PageDurationVo pageDuration1 : pageDurationList) {
+                            if (pageDuration.getPageLabel().equals(pageDuration1.getPageLabel())) {
+                                pageDuration1.setAccessDuration(MathUtil.add(pageDuration1.getAccessDuration(), pageDuration.getAccessDuration()).intValue());
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        ReturnDataVo pageDurationReturnData = new ReturnDataVo();
+        name = new ArrayList<>(set);
+        pageDurationReturnData.setNames(name);
+        value = new ArrayList<>(pageDurationList.stream().map(PageDurationVo::getAccessDuration).collect(Collectors.toList()));
+        pageDurationReturnData.setValues(value);
+        map.put("visitTimes", pageDurationReturnData);
+        // 获取广告图点击量数据
+        List<AdvertHitsVo> marketAdvertHits = new ArrayList<>();
+        if (null != marketReportIds && marketReportIds.size() > 0) {
+            marketAdvertHits = shopMapper.getMarketAdvertHits(marketReportIds);
+        }
+        map.put("bannerList", marketAdvertHits);
+        // 获取咨询数量数据
+        name = new ArrayList<>();
+        value = new ArrayList<>();
+        if (null != marketReportIds && marketReportIds.size() > 0) {
+            List<CmMarketRemarkVo> marketRemark = shopMapper.getMarketRemark(marketReportIds);
+            if (null != marketRemark && marketRemark.size() > 0) {
+                for (CmMarketRemarkVo remark : marketRemark) {
+                    try {
+                        name.add(dateFormat.format(dateFormat.parse(remark.getAddTime())));
+                        value.add(remark.getRemarkNumber());
+                    } catch (ParseException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+        ReturnDataVo remarkReturnData = new ReturnDataVo();
+        remarkReturnData.setNames(name);
+        remarkReturnData.setValues(value);
+        map.put("leadUserMonthly", remarkReturnData);
+        // 供应商相关标签
+        List<String> shopKeyword = shopMapper.getShopKeyword(shopInfo.getShopId());
+
+        List<ReturnDataVo> regionMap = new ArrayList<>();
+        // 访问供应商用户对应身份
+        List<ReturnEntityVo> userIdentity = new ArrayList<>();
+        // 访问供应商用户对应机构类型
+        List<ReturnEntityVo> clubType = new ArrayList<>();
+        if (1 == type) {
+            // 预览
+            if (StringUtils.isBlank(startTime)) {
+                startTime = monthFirstDay(shopInfo.getReportDate());
+            }
+            if(StringUtils.isBlank(endTime)) {
+                endTime = monthLastDay(shopInfo.getReportDate());
+            }
+        } else{
+            // 供应商主页进入
+            if (StringUtils.isBlank(startTime)) {
+                startTime = shopInfo.getStartDate();
+            }
+            if(StringUtils.isBlank(endTime)) {
+                endTime = shopInfo.getEndDate();
+            }
+
+        }
+        log.info("startTime===="+startTime);
+        log.info("endTime===="+endTime);
+        log.info("shopKeyword===="+shopKeyword);
+        if (null != shopKeyword && shopKeyword.size() > 0) {
+            // 访问供应商用户对于所在地区
+            List<String> region = shopMapper.getRegion(startTime, endTime, shopKeyword);
+            region.removeIf(re -> re.length() < 2);
+            Set<String> province = new HashSet<>();
+            String com = "";
+            for (String str : region) {
+                String trim = str.trim();
+                com = trim.substring(0, 2);
+                province.add(com);
+            }
+            for (String str : province) {
+                ReturnDataVo rData = new ReturnDataVo();
+                rData.setName(str);
+                List<String> collect = region.stream().filter(pro -> pro.substring(0, 3).contains(str)).collect(Collectors.toList());
+                rData.setValue(collect.size());
+                regionMap.add(rData);
+            }
+            set = new HashSet<>();
+            List<ReturnEntityVo> userIdentity1 = shopMapper.getUserIdentity(startTime, endTime, shopKeyword);
+            // 所有值之和
+            AtomicInteger maxUserValue = new AtomicInteger(0);
+            if (null != userIdentity1 && userIdentity1.size() > 0) {
+                for (ReturnEntityVo returnEntityVo : userIdentity1) {
+                    maxUserValue.updateAndGet(max -> max + Integer.parseInt(returnEntityVo.getValue()));
+                    if (!set.contains(returnEntityVo.getName())) {
+                        set.add(returnEntityVo.getName());
+                        userIdentity.add(returnEntityVo);
+                    } else {
+                        for (ReturnEntityVo returnUserIdentity : userIdentity) {
+                            returnUserIdentity.setValue(MathUtil.add(returnUserIdentity.getValue(), returnEntityVo.getValue()).toString());
+                        }
+                    }
+                }
+                userIdentity.forEach(returnUserIdentity -> returnUserIdentity.setValue(MathUtil.div(returnUserIdentity.getValue(), maxUserValue.get(), 2).toString()));
+            }
+            set = new HashSet<>();
+            List<ReturnEntityVo> clubType1 = shopMapper.getClubType(startTime, endTime, shopKeyword);
+            if (null != clubType1 && clubType1.size() > 0) {
+                // 所有值之和
+                AtomicInteger maxClubTypeValue = new AtomicInteger(0);
+                for (ReturnEntityVo returnEntityVo : clubType1) {
+                    maxClubTypeValue.updateAndGet(max -> max + Integer.parseInt(returnEntityVo.getValue()));
+                    if (!set.contains(returnEntityVo.getName())) {
+                        set.add(returnEntityVo.getName());
+                        clubType.add(returnEntityVo);
+                    } else {
+                        for (ReturnEntityVo returnUserIdentity : clubType) {
+                            returnUserIdentity.setValue(MathUtil.add(returnUserIdentity.getValue(), returnEntityVo.getValue()).toString());
+                        }
+                    }
+                }
+                userIdentity.forEach(returnUserIdentity -> returnUserIdentity.setValue(MathUtil.div(returnUserIdentity.getValue(), maxClubTypeValue.get(), 2).toString()));
+            }
+        }
+        map.put("channels", regionMap);
+        map.put("userIdentity", userIdentity);
+        map.put("urbanize", clubType);
+        // 是否有数据
+        if (null == marketReportIds || marketReportIds.size() <= 0) {
+            map.put("code", -1);
+        } else {
+            map.put("code", 0);
+        }
+        // 时间筛选
+        List<String> marketReportDataList = new ArrayList<>();
+        if (null != shopInfo) {
+            marketReportDataList = shopMapper.getMarketReportDataList(shopInfo.getShopId());
+            List<String> yearMonth = monthList(marketReportDataList);
+            map.put("yearMonth", yearMonth);
+        } else {
+            List<String> yearMonth = monthList(marketReportDataList);
+            map.put("yearMonth", yearMonth);
+        }
+        return ResponseJson.success(map);
+    }
+
+    /**
+     * 获取该月份首日日期
+     * @param reportDate    2023-12
+     * @return
+     */
+    public String monthFirstDay(String reportDate) {
+        String[] split = reportDate.split("-");
+        Integer year = Integer.parseInt(split[0]);
+        Integer month = Integer.parseInt(split[1]);
+
+        LocalDate firstDayOfMonth = LocalDate.of(year, month, 1);
+        return firstDayOfMonth.toString();
+    }
+
+    /**
+     * 获取该月份最后一天日期
+     * @param reportDate    2023-12
+     * @return
+     */
+    public String monthLastDay(String reportDate) {
+        String[] split = reportDate.split("-");
+        Integer year = Integer.parseInt(split[0]);
+        Integer month = Integer.parseInt(split[1]);
+
+        LocalDate firstDayOfMonth = LocalDate.of(year, month, 1);
+        LocalDate lastDayOfMonth = firstDayOfMonth.with(TemporalAdjusters.lastDayOfMonth());
+        return lastDayOfMonth.toString();
+    }
+
+    /**
+     * 不包含的月份
+     * todo 暂定5年
+     * @param marketReportDataList
+     * @return
+     */
+    public List<String> monthList(List<String> marketReportDataList) {
+        Integer[] yearList = new Integer[]{2023, 2024, 2025, 2026, 2027};
+        ArrayList<String> yearMonth = new ArrayList<>();
+        for (Integer year : yearList) {
+            List<YearMonth> collect = Stream.iterate(YearMonth.of(year, 1), month -> month.plusMonths(1)).limit(12).collect(Collectors.toList());
+            String strip = StringUtils.strip(collect.toString(), "[]");
+            String[] split = strip.split(",");
+            for (String s : split) {
+                yearMonth.add(s.replaceAll("-", "").trim());
+            }
+        }
+        if (null != marketReportDataList && marketReportDataList.size() > 0) {
+            marketReportDataList.replaceAll(market -> market.replaceAll("-", ""));
+        }
+        yearMonth.removeIf(marketReportDataList::contains);
+        return yearMonth;
+    }
 }
 }

+ 2 - 2
src/main/java/com/caimei365/user/utils/BeanUtil.java

@@ -23,8 +23,8 @@ public class BeanUtil {
     }
     }
 
 
     public static <T, S> List<T> setValues(List<S> sourceList, Class<T> target) {
     public static <T, S> List<T> setValues(List<S> sourceList, Class<T> target) {
-        if (CollectionUtils.isEmpty(sourceList)) {
-            return null;
+        if (CollectionUtils.isEmpty(sourceList)&&sourceList.size()>0) {
+            return new ArrayList<>();
         }
         }
         List<T> targetList = new ArrayList<>(sourceList.size());
         List<T> targetList = new ArrayList<>(sourceList.size());
         sourceList.forEach(s -> targetList.add(setValue(s, target)));
         sourceList.forEach(s -> targetList.add(setValue(s, target)));

+ 1 - 1
src/main/resources/mapper/CmProvidersMapper.xml

@@ -49,7 +49,7 @@
         <where>
         <where>
             <if test="id != null  and id != ''"> and cm_providers.id = #{id}</if>
             <if test="id != null  and id != ''"> and cm_providers.id = #{id}</if>
             <if test="userId != null "> and cm_providers.userId = #{userId}</if>
             <if test="userId != null "> and cm_providers.userId = #{userId}</if>
-            <if test="name != null  and name != ''"> and cm_providers.name =#{name}</if>
+            <if test="name != null  and name != ''"> and cm_providers.name like concat('%', #{name}, '%')</if>
             <if test="serviceLevel != null "> and cm_providers.serviceLevel = #{serviceLevel}</if>
             <if test="serviceLevel != null "> and cm_providers.serviceLevel = #{serviceLevel}</if>
             <if test="serviceCategory != null "> and cm_providers.serviceCategory = #{serviceCategory}</if>
             <if test="serviceCategory != null "> and cm_providers.serviceCategory = #{serviceCategory}</if>
             <if test="address != null  and address != ''"> and cm_providers.address = #{address}</if>
             <if test="address != null  and address != ''"> and cm_providers.address = #{address}</if>

+ 297 - 0
src/main/resources/mapper/ShopMapper.xml

@@ -243,6 +243,11 @@
             AND o.orderTime <![CDATA[   <=  ]]> #{endTime}
             AND o.orderTime <![CDATA[   <=  ]]> #{endTime}
         </if>
         </if>
     </select>
     </select>
+
+    <select id="getShopIsMark" resultType="java.lang.Integer">
+        select id from cm_shop_statistics where shopId = #{shopId} and delFlag = 0 limit 1
+    </select>
+
     <select id="getShopHomeImageCount" resultType="java.lang.Integer">
     <select id="getShopHomeImageCount" resultType="java.lang.Integer">
         SELECT COUNT(*) FROM shopbanner WHERE shopID = #{shopId}
         SELECT COUNT(*) FROM shopbanner WHERE shopID = #{shopId}
     </select>
     </select>
@@ -258,4 +263,296 @@
     <delete id="deleteShopHomeImage">
     <delete id="deleteShopHomeImage">
         DELETE FROM shopbanner WHERE shopBannerID = #{id}
         DELETE FROM shopbanner WHERE shopBannerID = #{id}
     </delete>
     </delete>
+
+    <select id="getShopInfoById" resultType="com.caimei365.user.model.vo.CmMarketShopVo">
+        SELECT css.id,
+               s.shopId,
+               s.name,
+               s.linkMan,
+               s.contractMobile,
+               cmr.addTime,
+               <if test="type == 1">
+                (SELECT reportDate FROM cm_market_report WHERE id = #{marketReportId} LIMIT 1) AS reportDate,
+               </if>
+               <if test="type != 1">
+                (SELECT reportDate FROM cm_market_report WHERE marketId = css.id ORDER BY addTime ASC LIMIT 1) AS startDate,
+                (SELECT reportDate FROM cm_market_report WHERE marketId = css.id ORDER BY addTime DESC LIMIT 1) AS endDate,
+               </if>
+               css.logo
+        FROM cm_shop_statistics css
+                 LEFT JOIN cm_market_report cmr ON cmr.marketId = css.id
+                 LEFT JOIN shop s ON s.shopId = css.shopId
+        WHERE css.delFlag = 0
+          <if test="type == 1">
+              and cmr.id = #{marketReportId}
+          </if>
+            <if test="type != 1">
+                and css.shopId = #{shopId}
+            </if>
+        ORDER BY cmr.addTime DESC
+        limit 1
+    </select>
+
+    <select id="getMarketReportIds" resultType="java.lang.Integer">
+        select id from cm_market_report
+        where delFlag = 0
+        <if test="type == 1">
+            and id = #{marketReportId}
+        </if>
+        <if test="type != 1">
+            and marketId = #{marketId}
+            and visible = 1
+        </if>
+        <if test="startTime != null and startTime != ''">
+            and reportDate <![CDATA[ >= ]]> #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            and reportDate <![CDATA[ <= ]]> #{endTime}
+        </if>
+        <if test="marketReportId == null">
+            <if test="startTime == null or startTime == '' ">
+                <if test="endTime == null or endTime == ''">
+                    order by addTime desc
+                    limit 1
+                </if>
+            </if>
+        </if>
+    </select>
+
+    <select id="getMarketStage" resultType="com.caimei365.user.model.vo.StageVo">
+        SELECT cms.id,
+        cms.stage,
+        cms.theme,
+        cms.addTime,
+        cmr.reportDate
+        FROM cm_market_stage cms
+        LEFT JOIN cm_market_report cmr ON cmr.id = cms.marketReportId
+        where cms.marketReportId in
+              <foreach collection="marketReportIds" item="marketReportId" open="(" separator="," close=")">
+                  #{marketReportId}
+              </foreach>
+    </select>
+
+    <select id="getMarketFunnelModel" resultType="com.caimei365.user.model.vo.FunnelModelVo">
+        SELECT id,
+               impressions,
+               hits,
+               visits,
+               consultation,
+               report
+        FROM cm_market_funnelModel
+        WHERE marketReportId in
+        <foreach collection="marketReportIds" item="marketReportId" open="(" separator="," close=")">
+            #{marketReportId}
+        </foreach>
+    </select>
+
+    <select id="getMarketArticleReadVolume" resultType="com.caimei365.user.model.vo.ArticleReadVolumeVo">
+        SELECT id,
+               firstTime,
+               title,
+               link,
+               titleReferred,
+               type,
+               keyword,
+               channel,
+               touchNumber,
+               wechatNumber
+        FROM cm_market_articleReadVolume
+        WHERE marketReportId in
+        <foreach collection="marketReportIds" item="marketReportId" open="(" separator="," close=")">
+            #{marketReportId}
+        </foreach>
+    </select>
+
+    <select id="getMarketImpressions" resultType="com.caimei365.user.model.vo.ImpressionsVo">
+        SELECT id,
+               generalNumber,
+               microBlog,
+               redBookNumber,
+               otherNumber
+        FROM cm_market_impressions
+        WHERE marketReportId in
+        <foreach collection="marketReportIds" item="marketReportId" open="(" separator="," close=")">
+            #{marketReportId}
+        </foreach>
+    </select>
+
+    <select id="getMarketReadVolume" resultType="com.caimei365.user.model.vo.ReadVolumeVo">
+        SELECT id,
+               generalNumber,
+               microBlog,
+               redBookNumber,
+               otherNumber
+        FROM cm_market_readVolume
+        WHERE marketReportId in
+        <foreach collection="marketReportIds" item="marketReportId" open="(" separator="," close=")">
+            #{marketReportId}
+        </foreach>
+    </select>
+
+    <select id="getMarketSummary" resultType="com.caimei365.user.model.vo.SummaryVo">
+        SELECT id,
+               keyword,
+               seoRanking,
+               searchVolume
+        FROM cm_market_summary
+        WHERE marketReportId in
+        <foreach collection="marketReportIds" item="marketReportId" open="(" separator="," close=")">
+            #{marketReportId}
+        </foreach>
+    </select>
+
+    <select id="getMarketVisits" resultType="com.caimei365.user.model.vo.VisitsVo">
+        SELECT id,
+               clubNumber,
+               touristNumber
+        FROM cm_market_visits
+        WHERE marketReportId in
+        <foreach collection="marketReportIds" item="marketReportId" open="(" separator="," close=")">
+            #{marketReportId}
+        </foreach>
+    </select>
+
+    <select id="getMarketProportion" resultType="com.caimei365.user.model.vo.ProportionVo">
+        SELECT id,
+               search,
+               general,
+               microBlog,
+               directAccess
+        FROM cm_market_proportion
+        WHERE marketReportId in
+        <foreach collection="marketReportIds" item="marketReportId" open="(" separator="," close=")">
+            #{marketReportId}
+        </foreach>
+    </select>
+
+    <select id="getMarketPageDuration" resultType="com.caimei365.user.model.vo.PageDurationVo">
+        SELECT id,
+               pageLabel,
+               accessDuration
+        FROM cm_market_pageDuration
+        WHERE marketReportId in
+        <foreach collection="marketReportIds" item="marketReportId" open="(" separator="," close=")">
+            #{marketReportId}
+        </foreach>
+    </select>
+
+    <select id="getMarketAdvertHits" resultType="com.caimei365.user.model.vo.AdvertHitsVo">
+        SELECT id,
+               POSITION,
+               home,
+               infoCenter,
+               hits
+        FROM cm_market_advertHits
+        WHERE marketReportId in
+        <foreach collection="marketReportIds" item="marketReportId" open="(" separator="," close=")">
+            #{marketReportId}
+        </foreach>
+    </select>
+
+    <select id="getMarketRemark" resultType="com.caimei365.user.model.vo.CmMarketRemarkVo">
+        SELECT id,
+               remarkNumber,
+               addTime
+        FROM cm_market_remark
+        WHERE marketReportId in
+        <foreach collection="marketReportIds" item="marketReportId" open="(" separator="," close=")">
+            #{marketReportId}
+        </foreach>
+    </select>
+
+    <select id="getShopKeyword" resultType="java.lang.String">
+        SELECT cusf.keyword
+        FROM cm_user_search_frequency cusf
+                 LEFT JOIN cm_shop_label csl ON csl.keywordId = cusf.id
+                 LEFT JOIN cm_shop_relevance csr ON csr.id = csl.relevanceId
+        where csr.shopId = #{shopId}
+    </select>
+
+    <select id="getRegion" resultType="java.lang.String">
+        SELECT region FROM cm_behavior_record_index
+        where
+         (
+        <foreach collection="labels" item="label" open="(" separator="or" close=")">
+            label LIKE concat('%', #{label}, '%')
+        </foreach>
+        )
+        <if test="startTime != null and startTime != ''">
+            and accessDate <![CDATA[ >= ]]> #{startTime}
+        </if>
+        <if test="startTime != null and startTime != ''">
+            AND accessDate <![CDATA[ <= ]]> #{endTime}
+        </if>
+
+    </select>
+
+    <!--用户身份-->
+    <select id="getUserIdentity" resultType="com.caimei365.user.model.vo.ReturnEntityVo">
+        SELECT
+        (CASE c.linkManIdentity
+                WHEN 1 THEN '老板'
+                WHEN 2 THEN '采购'
+                WHEN 3 THEN '运营'
+                WHEN 4 THEN '运营'
+            END) AS name,
+            COUNT(c.userId) as value
+        FROM cm_behavior_record_index cbri
+        LEFT JOIN club c ON c.userId = cbri.userId
+        LEFT JOIN USER u ON u.userId = cbri.userId
+        WHERE
+            cbri.userId != 0
+            AND u.userIdentity = 2
+            <if test="startTime != null and startTime != ''">
+                and cbri.accessDate <![CDATA[ >= ]]> #{startTime}
+            </if>
+            <if test="startTime != null and startTime != ''">
+                AND cbri.accessDate <![CDATA[ <= ]]> #{endTime}
+            </if>
+            AND (
+            <foreach collection="labels" item="label" open="(" separator="or" close=")">
+                cbri.label LIKE concat('%', #{label}, '%')
+            </foreach>
+            )
+        GROUP BY c.linkManIdentity
+    </select>
+
+
+    <!--机构类型-->
+    <select id="getClubType" resultType="com.caimei365.user.model.vo.ReturnEntityVo">
+        SELECT
+        (CASE c.firstClubType
+                WHEN 1 THEN '医美'
+                WHEN 2 THEN '生美'
+                WHEN 3 THEN '其他'
+                WHEN 4 THEN '其他'
+                WHEN 5 THEN '其他'
+            END) AS name,
+            COUNT(c.userId) as value
+            FROM cm_behavior_record_index cbri
+        LEFT JOIN club c ON c.userId = cbri.userId
+        LEFT JOIN USER u ON u.userId = cbri.userId
+        WHERE
+            cbri.userId != 0
+            AND u.userIdentity = 2
+            <if test="startTime != null and startTime != ''">
+                and cbri.accessDate <![CDATA[ >= ]]> #{startTime}
+            </if>
+            <if test="startTime != null and startTime != ''">
+                AND cbri.accessDate <![CDATA[ <= ]]> #{endTime}
+            </if>
+            AND (
+            <foreach collection="labels" item="label" open="(" separator="or" close=")">
+                cbri.label LIKE concat('%', #{label}, '%')
+            </foreach>
+            )
+        GROUP BY c.firstClubType
+    </select>
+
+    <select id="getMarketReportDataList" resultType="java.lang.String">
+        select cmr.reportDate
+        from cm_market_report cmr
+        left join cm_shop_statistics css on css.id = cmr.marketId
+        where cmr.delFlag = 0 and cmr.visible = 1 and css.shopId = #{shopId}
+    </select>
 </mapper>
 </mapper>