Gaosheng 2 dni temu
rodzic
commit
a7f7b32229
22 zmienionych plików z 742 dodań i 3 usunięć
  1. 396 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/statistics/screen/ScreenAnalysisController.java
  2. 8 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/dao/read/goods/GoodsReadMapper.java
  3. 6 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/dao/read/goods/GoodsSearchWordsReadMapper.java
  4. 9 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/dao/read/member/MemberEnquiryReadMapper.java
  5. 8 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/dao/read/member/MemberReadMapper.java
  6. 9 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/goods/GoodsModel.java
  7. 13 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/goods/GoodsSearchWordsModel.java
  8. 22 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/MemberModel.java
  9. 12 1
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/advich/MemberEnquiryModel.java
  10. 1 1
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/seller/StoreModel.java
  11. 22 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/ScreenDataSummary.java
  12. 17 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/ScreenEnquiryDistribution.java
  13. 32 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/ScreenEnquiryTrendVO.java
  14. 47 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/ScreenFlowTrendVO.java
  15. 22 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/ScreenGoodsTrendVO.java
  16. 17 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/ScreenMemberDistribution.java
  17. 22 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/ScreenMemberTrendVO.java
  18. 1 0
      xinkeaboard-server/b2b2c-web/src/main/resources/application.yml
  19. 21 1
      xinkeaboard-server/b2b2c-web/src/main/resources/mapper/read/goods/GoodsReadMapper.xml
  20. 14 0
      xinkeaboard-server/b2b2c-web/src/main/resources/mapper/read/goods/GoodsSearchWordsReadMapper.xml
  21. 11 0
      xinkeaboard-server/b2b2c-web/src/main/resources/mapper/read/member/MemberEnquiryReadMapper.xml
  22. 32 0
      xinkeaboard-server/b2b2c-web/src/main/resources/mapper/read/member/MemberReadMapper.xml

+ 396 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/statistics/screen/ScreenAnalysisController.java

@@ -0,0 +1,396 @@
+package com.slodon.b2b2c.controller.statistics.screen;
+
+import com.slodon.b2b2c.core.constant.GoodsConst;
+import com.slodon.b2b2c.core.constant.StoreConst;
+import com.slodon.b2b2c.core.controller.BaseController;
+import com.slodon.b2b2c.core.response.JsonResult;
+import com.slodon.b2b2c.core.response.PageVO;
+import com.slodon.b2b2c.core.response.PagerInfo;
+import com.slodon.b2b2c.core.response.SldResponse;
+import com.slodon.b2b2c.core.util.StringUtil;
+import com.slodon.b2b2c.core.util.WebUtil;
+import com.slodon.b2b2c.enums.ProvinceJson;
+import com.slodon.b2b2c.enums.StatsTimeType;
+import com.slodon.b2b2c.enums.WebSiteConstant;
+import com.slodon.b2b2c.goods.example.GoodsExample;
+import com.slodon.b2b2c.member.example.MemberExample;
+import com.slodon.b2b2c.member.pojo.MemberEnquiry;
+import com.slodon.b2b2c.model.goods.GoodsExtendModel;
+import com.slodon.b2b2c.model.goods.GoodsModel;
+import com.slodon.b2b2c.model.goods.GoodsSearchWordsModel;
+import com.slodon.b2b2c.model.member.MemberModel;
+import com.slodon.b2b2c.model.member.advich.MemberEnquiryModel;
+import com.slodon.b2b2c.model.seller.StoreModel;
+import com.slodon.b2b2c.model.statistics.StoreDayModel;
+import com.slodon.b2b2c.seller.dto.StoreStatisticsDTO;
+import com.slodon.b2b2c.seller.example.StoreExample;
+import com.slodon.b2b2c.statistics.example.StoreDayExample;
+import com.slodon.b2b2c.statistics.pojo.base.StoreBase;
+import com.slodon.b2b2c.util.StatsModelUtil;
+import com.slodon.b2b2c.vo.statistics.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.util.CollectionUtils;
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.*;
+
+@Api(tags = "screen-大屏")
+@RestController
+@RequestMapping("v3/statistics/screen/analysis")
+public class ScreenAnalysisController extends BaseController {
+
+    @Resource
+    private StatsModelUtil statsModelUtil;
+
+    @Resource
+    private MemberEnquiryModel memberEnquiryModel;
+
+    @Resource
+    private MemberModel memberModel;
+
+    @Resource
+    private StoreModel storeModel;
+
+    @Resource
+    private GoodsModel goodsModel;
+
+    @Resource
+    private StoreDayModel storeDayModel;
+
+    @Resource
+    private GoodsSearchWordsModel goodsSearchWordsModel;
+    @ApiOperation("流量趋势")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "startTime", value = "开始时间", required = true),
+            @ApiImplicitParam(name = "endTime", value = "结束时间", required = true),
+    })
+    @GetMapping("flowTrend")
+    public JsonResult<ScreenFlowTrendVO> flowTrend(HttpServletRequest request, Date startTime, Date endTime) {
+        StatsTimeType timeType = StatsTimeType.checkTimeType(startTime, endTime, true);
+        ScreenFlowTrendVO vo = new ScreenFlowTrendVO();
+
+        // 处理海外用户数据
+        List<MovableGoodsVO> overseasList = statsModelUtil.getPlatformTrendList(
+                timeType, startTime, endTime, WebSiteConstant.MEMBER_OVERSEA);
+
+        List<ScreenFlowTrendVO.VisitorNumVO> visitorNumList = new ArrayList<>();
+        List<ScreenFlowTrendVO.ViewNumVO> viewNumList = new ArrayList<>();
+
+        populateVisitorAndViewData(overseasList, visitorNumList, viewNumList);
+
+        vo.setVisitorNumList(visitorNumList);
+        vo.setViewNumList(viewNumList);
+
+        // 处理分销商数据
+        List<MovableGoodsVO> distributorList = statsModelUtil.getPlatformTrendList(
+                timeType, startTime, endTime, WebSiteConstant.MEMBER_DISTRIBUTOR);
+
+        List<ScreenFlowTrendVO.VisitorNumVO> visitorCNNumList = new ArrayList<>();
+        List<ScreenFlowTrendVO.ViewNumVO> viewNumCNList = new ArrayList<>();
+
+        populateVisitorAndViewData(distributorList, visitorCNNumList, viewNumCNList);
+
+        vo.setVisitorNumCNList(visitorCNNumList);
+        vo.setViewNumCNList(viewNumCNList);
+
+        return SldResponse.success(vo);
+    }
+
+
+    private void populateVisitorAndViewData(List<MovableGoodsVO> list,
+                                            List<ScreenFlowTrendVO.VisitorNumVO> visitorList,
+                                            List<ScreenFlowTrendVO.ViewNumVO> viewList) {
+        if (!CollectionUtils.isEmpty(list)) {
+            list.forEach(trendVO -> {
+                // 访客数
+                ScreenFlowTrendVO.VisitorNumVO visitorNumVO = new ScreenFlowTrendVO.VisitorNumVO();
+                visitorNumVO.setStatsTime(trendVO.getStatsTime());
+                visitorNumVO.setVisitorNum(trendVO.getVisitorNum());
+                visitorList.add(visitorNumVO);
+
+                // 访问量
+                ScreenFlowTrendVO.ViewNumVO viewNumVO = new ScreenFlowTrendVO.ViewNumVO();
+                viewNumVO.setStatsTime(trendVO.getStatsTime());
+                viewNumVO.setViewNum(trendVO.getViewNum());
+                viewList.add(viewNumVO);
+            });
+        }
+    }
+
+
+    /**
+     * 询盘趋势
+     *
+     * @param request
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    @GetMapping("enquiryTrend")
+    public JsonResult<ScreenEnquiryTrendVO> getEnquiryTrend(HttpServletRequest request, Date startTime, Date endTime) throws Exception {
+        ScreenEnquiryTrendVO vo = new ScreenEnquiryTrendVO();
+
+        if (startTime != null && endTime != null) {
+            StatsTimeType timeType = StatsTimeType.checkTimeType(startTime, endTime, true);
+
+            // 处理海外用户询盘数据
+            List<MemberEnquiry> overseasList = memberEnquiryModel.getAdminEnquiryTrendList(
+                    timeType, startTime, endTime, WebSiteConstant.MEMBER_OVERSEA);
+            List<ScreenEnquiryTrendVO.EnquiryNumVO> enquiryNumVOList = new ArrayList<>();
+            populateEnquiryData(overseasList, enquiryNumVOList);
+            vo.setEnquiryTrendList(enquiryNumVOList);
+
+            // 处理分销商询盘数据
+            List<MemberEnquiry> distributorList = memberEnquiryModel.getAdminEnquiryTrendList(
+                    timeType, startTime, endTime, WebSiteConstant.MEMBER_DISTRIBUTOR);
+            List<ScreenEnquiryTrendVO.EnquiryNumVO> enquiryNumVOCNList = new ArrayList<>();
+            populateEnquiryData(distributorList, enquiryNumVOCNList);
+            vo.setEnquiryTrendCNList(enquiryNumVOCNList);
+        }
+
+        return SldResponse.success(vo);
+    }
+
+    private void populateEnquiryData(List<MemberEnquiry> list, List<ScreenEnquiryTrendVO.EnquiryNumVO> targetList) {
+        if (!CollectionUtils.isEmpty(list)) {
+            list.forEach(memberEnquiry -> {
+                ScreenEnquiryTrendVO.EnquiryNumVO enquiryNumVO = new ScreenEnquiryTrendVO.EnquiryNumVO();
+                enquiryNumVO.setStatsTime(memberEnquiry.getEnquiryDay());
+                enquiryNumVO.setViewNum(memberEnquiry.getEnquiryNum());
+                targetList.add(enquiryNumVO);
+            });
+        }
+    }
+
+    /**
+     * 询盘地域分布
+     * @param request
+     * @param webSite
+     * @return
+     */
+    @GetMapping("enquiryDistribution")
+    @ApiOperation("询盘地域分布")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "webSite", value = "站点"),
+    })
+    public JsonResult<List<ScreenEnquiryDistribution>> getEnquiryDistribution(HttpServletRequest request, @RequestParam(value = "webSite", required = false, defaultValue = "1") String webSite) {
+        return SldResponse.success(memberEnquiryModel.getEnquiryDistribution(webSite));
+    }
+
+
+    @ApiOperation("供应链企业分布")
+    @GetMapping("regionDistribution")
+    public JsonResult<List<ProvincePercentVO>> regionDistribution(HttpServletRequest request) {
+        StoreExample example = new StoreExample();
+        example.setStateNotEquals(StoreConst.STORE_STATE_DELETE);
+        example.setOrderBy("storeNum DESC");
+        List<StoreStatisticsDTO> list = storeModel.getStoreStatisticList(example);
+        List<ProvincePercentVO> vos = getRegionDistributionPercent(list);
+        return SldResponse.success(vos);
+    }
+
+    /**
+     * 地域分布
+     *
+     * @param list
+     * @return
+     */
+    public List<ProvincePercentVO> getRegionDistributionPercent(List<StoreStatisticsDTO> list) {
+        List<ProvincePercentVO> result = new ArrayList<>();
+        if (CollectionUtils.isEmpty(list)) {
+            return result;
+        }
+        //查询总店铺数,用于计算各省份占比
+        StoreExample example = new StoreExample();
+        example.setStateNotEquals(StoreConst.STORE_STATE_DELETE);
+        int totalNum = storeModel.getStoreCount(example);
+        //key为省份名称,value为店铺数量
+        Map<String, Integer> dataMap = new HashMap<>();
+        for (StoreStatisticsDTO dto : list) {
+            String provinceCode = dto.getProvinceCode();
+            //如果编码为空,按未知处理
+            if (StringUtil.isEmpty(dto.getProvinceCode())) {
+                provinceCode = ProvinceJson.defaultProvinceCode;
+            }
+            //如果省份为空,按未知处理
+            String provinceName = ProvinceJson.provinceMap.getOrDefault(provinceCode, ProvinceJson.defaultProvinceName);
+            //店铺数量
+            Integer storeNum = dto.getStoreNum();
+            if (dataMap.containsKey(provinceName)) {
+                dataMap.put(provinceName, dataMap.get(provinceName) + storeNum);
+            } else {
+                dataMap.put(provinceName, storeNum);
+            }
+        }
+        List<Map.Entry<String, Integer>> mapList = new ArrayList<>(dataMap.entrySet());
+        //排序
+        Collections.sort(mapList, (o1, o2) -> o2.getValue().compareTo(o1.getValue()));
+        //只取前5个省份数据
+        int count = 0;
+        int otherNum = totalNum;
+        for (Map.Entry<String, Integer> entry : mapList) {
+            if (count >= 5) {
+                //累加第5名之后的所有店铺数量到"其他"
+                otherNum -= entry.getValue();
+                continue;
+            }
+
+            ProvincePercentVO vo = new ProvincePercentVO();
+            vo.setProvinceName(entry.getKey());
+            vo.setStoreNum(entry.getValue());
+            result.add(vo);
+            //数据计算
+            otherNum -= entry.getValue();
+            count++;
+        }
+
+        //如果有其他省份数据,添加"其他"项
+        if (otherNum > 0 && mapList.size() > 5) {
+            ProvincePercentVO vo = new ProvincePercentVO();
+            vo.setProvinceName("其他");
+            vo.setStoreNum(otherNum);
+            result.add(vo);
+        }
+
+        return result;
+    }
+
+
+    /**
+     * 平台数据汇总
+     * @param request
+     * @return
+     */
+    @GetMapping("data/summary ")
+    @ApiOperation("平台数据汇总")
+    public JsonResult<ScreenDataSummary> getDataSummary(HttpServletRequest request) {
+        ScreenDataSummary vo = new ScreenDataSummary();
+        MemberExample memberExample = new MemberExample();
+        memberExample.setWebSite(WebSiteConstant.MEMBER_OVERSEA);
+        vo.setMemberNum(memberModel.getMemberCount(memberExample));
+        memberExample.setWebSite(WebSiteConstant.MEMBER_DISTRIBUTOR);
+        vo.setDistributorNum(memberModel.getMemberCount(memberExample));
+        StoreExample storeExample = new StoreExample();
+        storeExample.setStateNotEquals(StoreConst.STORE_STATE_DELETE);
+        vo.setStoreNum(storeModel.getStoreCount(storeExample));
+        GoodsExample goodsExample = new GoodsExample();
+        goodsExample.setWebSite(WebSiteConstant.MEMBER_OVERSEA);
+        goodsExample.setStateNotEquals(GoodsConst.GOODS_STATE_DELETE);
+        vo.setProductNum(goodsModel.getGoodsCount(goodsExample));
+        vo.setServiceProviderNum(999);
+        return SldResponse.success(vo);
+    }
+
+
+    /**
+     * 会员地域分布
+     * @param request
+     * @return
+     */
+    @GetMapping("memberDistribution")
+    @ApiOperation("会员地域分布")
+    public JsonResult<List<ScreenMemberDistribution>> getMemberDistribution(HttpServletRequest request,@RequestParam(value = "webSite", required = false, defaultValue = "1") String webSite) {
+        return SldResponse.success(memberModel.getMemberDistribution(webSite));
+    }
+
+
+    /**
+     * 会员新增趋势
+     * @param request
+     * @return
+     */
+    @GetMapping("memberTrend")
+    @ApiOperation("会员新增趋势")
+    public JsonResult<List<ScreenMemberTrendVO>> memberTrend(HttpServletRequest request,@RequestParam(value = "webSite", required = false, defaultValue = "1") String webSite) {
+        return SldResponse.success(memberModel.getMemberTrend(webSite));
+    }
+
+
+    /**
+     * 商品新增趋势
+     * @param request
+     * @return
+     */
+    @GetMapping("goodsTrend")
+    @ApiOperation("商品新增趋势")
+    public JsonResult<List<ScreenGoodsTrendVO>> goodsTrend(HttpServletRequest request,@RequestParam(value = "webSite", required = false, defaultValue = "1") String webSite) {
+        return SldResponse.success(goodsModel.getGoodsTrend(webSite));
+    }
+
+
+    /**
+     * 搜索词排行
+     * @param request
+     * @return
+     */
+    @GetMapping("searchRank")
+    @ApiOperation("搜索词排行")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "startTime", value = "开始时间", required = true),
+            @ApiImplicitParam(name = "endTime", value = "结束时间", required = true),
+            @ApiImplicitParam(name = "type", value = "排序类型;desc-降序;asc-升序;默认类型为降序"),
+            @ApiImplicitParam(name = "webSite", value = "站点"),
+    })
+    public JsonResult<List<String>> searchRank(HttpServletRequest request, Date startTime, Date endTime,
+                                                           @RequestParam(value = "type", required = false, defaultValue = "desc") String type,
+                                                           @RequestParam(value = "webSite", required = false, defaultValue = "1") String webSite,
+                                                           @RequestParam(value = "pageSize", required =false,defaultValue = "10") Integer pageSize,
+                                                           @RequestParam(value = "current", required =false,defaultValue = "1") Integer current) {
+        PagerInfo pager = new PagerInfo(pageSize, current);
+        List<String> list = goodsSearchWordsModel.getSearchWordsRank(startTime, endTime, type, webSite, pager);
+        return SldResponse.success(list);
+    }
+
+
+
+    /**
+     * 店铺流量排行
+     *
+     * @param request
+     * @param startTime
+     * @param endTime
+     * @param type
+     * @param webSite
+     * @return
+     */
+    @ApiOperation("店铺流量排行")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "startTime", value = "开始时间", required = true),
+            @ApiImplicitParam(name = "endTime", value = "结束时间", required = true),
+            @ApiImplicitParam(name = "type", value = "排序类型;desc-降序;asc-升序;默认类型为降序"),
+            @ApiImplicitParam(name = "sort", value = "排序:viewNum-店铺浏览量;visitorNum-店铺访客数"),
+            @ApiImplicitParam(name = "webSite", value = "站点"),
+    })
+    @GetMapping("storeFlowRank")
+    public JsonResult<PageVO<StoreReportVO>> storeFlowRank(HttpServletRequest request, Date startTime, Date endTime,
+                                                           @RequestParam(value = "type", required = false, defaultValue = "desc") String type,
+                                                           @RequestParam(value = "webSite", required = false, defaultValue = "1") String webSite,
+                                                           @RequestParam(value = "pageSize", required =false,defaultValue = "10") Integer pageSize,
+                                                           @RequestParam(value = "current", required =false,defaultValue = "1") Integer current) {
+        PagerInfo pager = new PagerInfo(pageSize, current);
+        StoreDayExample example = new StoreDayExample();
+        example.setWebSite(webSite);
+        example.setStatsTimeAfter(startTime);
+        example.setStatsTimeBefore(endTime);
+        example.setOrderBy("viewNum " + type + " ,visitorNum " + type);
+        List<StoreBase> list = storeDayModel.getStoreList(example, pager);
+        List<StoreReportVO> vos = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(list)) {
+            list.forEach(storeBase -> {
+                vos.add(new StoreReportVO(storeBase));
+            });
+        }
+        return SldResponse.success(new PageVO<>(vos, pager));
+    }
+
+
+}

+ 8 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/dao/read/goods/GoodsReadMapper.java

@@ -3,6 +3,7 @@ package com.slodon.b2b2c.dao.read.goods;
 import com.slodon.b2b2c.core.database.BaseReadMapper;
 import com.slodon.b2b2c.goods.example.GoodsExample;
 import com.slodon.b2b2c.goods.pojo.Goods;
+import com.slodon.b2b2c.vo.statistics.ScreenGoodsTrendVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -24,4 +25,11 @@ public interface GoodsReadMapper extends BaseReadMapper<Goods, GoodsExample> {
      */
     int countByGoodsExample(@Param("fields") String fields,
                             @Param("example") GoodsExample example);
+
+    /**
+     * 获取商品新增趋势
+     * @param webSite
+     * @return
+     */
+    List<ScreenGoodsTrendVO> getGoodsTrend(@Param("webSite")String webSite);
 }

+ 6 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/dao/read/goods/GoodsSearchWordsReadMapper.java

@@ -1,11 +1,17 @@
 package com.slodon.b2b2c.dao.read.goods;
 
 import com.slodon.b2b2c.core.database.BaseReadMapper;
+import com.slodon.b2b2c.core.response.PagerInfo;
 import com.slodon.b2b2c.goods.example.GoodsSearchWordsExample;
 import com.slodon.b2b2c.goods.pojo.GoodsSearchWords;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
 
 /**
  * 高频搜索词表readDao
  */
 public interface GoodsSearchWordsReadMapper extends BaseReadMapper<GoodsSearchWords, GoodsSearchWordsExample> {
+    List<String> getSearchWordsRank(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("type") String type, @Param("webSite") String webSite, @Param("pager") PagerInfo pager);
 }

+ 9 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/dao/read/member/MemberEnquiryReadMapper.java

@@ -4,6 +4,7 @@ import com.slodon.b2b2c.core.database.BaseReadMapper;
 import com.slodon.b2b2c.member.example.MemberEnquiryExample;
 import com.slodon.b2b2c.member.pojo.MemberEnquiry;
 import com.slodon.b2b2c.system.pojo.Enquiry;
+import com.slodon.b2b2c.vo.statistics.ScreenEnquiryDistribution;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
@@ -160,4 +161,12 @@ public interface MemberEnquiryReadMapper extends BaseReadMapper<MemberEnquiry, M
     List<MemberEnquiry> getAdminEnquiryTrendByHour(@Param("startTime") Date startTime,
                                                    @Param("endTime") Date endTime,
                                                    @Param("webSite") String webSite);
+
+    /**
+     * 询盘分布
+     *
+     * @param webSite
+     * @return
+     */
+   List<ScreenEnquiryDistribution>getEnquiryDistribution(@Param("webSite")String webSite);
 }

+ 8 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/dao/read/member/MemberReadMapper.java

@@ -3,7 +3,15 @@ package com.slodon.b2b2c.dao.read.member;
 import com.slodon.b2b2c.core.database.BaseReadMapper;
 import com.slodon.b2b2c.member.example.MemberExample;
 import com.slodon.b2b2c.member.pojo.Member;
+import com.slodon.b2b2c.vo.statistics.ScreenMemberDistribution;
+import com.slodon.b2b2c.vo.statistics.ScreenMemberTrendVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface MemberReadMapper extends BaseReadMapper<Member, MemberExample> {
 
+    List<ScreenMemberDistribution> getMemberDistribution(@Param("webSite") String webSite);
+
+    List<ScreenMemberTrendVO> getMemberTrend(@Param("webSite")String webSite);
 }

+ 9 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/goods/GoodsModel.java

@@ -22,6 +22,7 @@ import com.slodon.b2b2c.model.seller.VendorModel;
 import com.slodon.b2b2c.seller.example.VendorExample;
 import com.slodon.b2b2c.seller.pojo.Vendor;
 import com.slodon.b2b2c.starter.mq.entity.MessageSendVO;
+import com.slodon.b2b2c.vo.statistics.ScreenGoodsTrendVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.data.redis.core.StringRedisTemplate;
@@ -384,4 +385,12 @@ public class GoodsModel {
         GoodsCategory goodsCategoryDB = goodsCategoryReadMapper.getByPrimaryKey(goodsCategoryId);
         return goodsCategoryDB.getGrade();
     }
+
+    /**
+     * 获取商品新增趋势
+     * @return
+     */
+    public List<ScreenGoodsTrendVO> getGoodsTrend(String webSite) {
+        return goodsReadMapper.getGoodsTrend(webSite);
+    }
 }

+ 13 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/goods/GoodsSearchWordsModel.java

@@ -139,4 +139,17 @@ public class GoodsSearchWordsModel {
         goodsSearchWords.setSearchFrequency(goodsSearchWords.getSearchFrequency() + 1);
         goodsSearchWordsWriteMapper.updateByPrimaryKeySelective(goodsSearchWords);
     }
+
+    /**
+     * 搜索词排行
+     * @param startTime
+     * @param endTime
+     * @param type
+     * @param webSite
+     * @param pager
+     * @return
+     */
+    public List<String> getSearchWordsRank(Date startTime, Date endTime, String type, String webSite, PagerInfo pager) {
+        return goodsSearchWordsReadMapper.getSearchWordsRank(startTime, endTime, type, webSite, pager);
+    }
 }

+ 22 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/MemberModel.java

@@ -29,6 +29,8 @@ import com.slodon.b2b2c.member.pojo.Member;
 import com.slodon.b2b2c.promotion.example.CouponMemberExample;
 import com.slodon.b2b2c.promotion.pojo.CouponMember;
 import com.slodon.b2b2c.vo.member.MemberDetailVO;
+import com.slodon.b2b2c.vo.statistics.ScreenMemberDistribution;
+import com.slodon.b2b2c.vo.statistics.ScreenMemberTrendVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.beanutils.PropertyUtils;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -368,4 +370,24 @@ public class MemberModel {
         //2.移除缓存中的登录权限信息
         objectRedisTemplate.delete("front" + memberId);
     }
+
+    /**
+     * 会员分布
+     *
+     * @param webSite
+     * @return
+     */
+    public List<ScreenMemberDistribution> getMemberDistribution(String webSite) {
+        return memberReadMapper.getMemberDistribution(webSite);
+    }
+
+    /**
+     * 会员趋势
+     *
+     * @param webSite
+     * @return
+     */
+    public List<ScreenMemberTrendVO> getMemberTrend(String webSite) {
+        return memberReadMapper.getMemberTrend(webSite);
+    }
 }

+ 12 - 1
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/advich/MemberEnquiryModel.java

@@ -46,6 +46,7 @@ import com.slodon.b2b2c.system.example.EnquiryExample;
 import com.slodon.b2b2c.system.pojo.AdminEnquiryReceiveMailSetting;
 import com.slodon.b2b2c.system.pojo.Enquiry;
 import com.slodon.b2b2c.vo.member.MemberEnquiryVO;
+import com.slodon.b2b2c.vo.statistics.ScreenEnquiryDistribution;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.beanutils.PropertyUtils;
 import org.springframework.beans.factory.annotation.Value;
@@ -146,7 +147,7 @@ public class MemberEnquiryModel {
             //城市
             City city = response.getCity();
             dto.setCityZhCN(city.getNames().get("zh-CN"));
-            dto.setCityIsoCode(StringUtil.isEmpty(city.getName()) ? country.getIsoCode() : city.getName());
+
             //省份
             Subdivision subdivision = response.getMostSpecificSubdivision();
             dto.setSubdivisionIsoCode(subdivision.getIsoCode());
@@ -156,6 +157,7 @@ public class MemberEnquiryModel {
             if (!StringUtil.isEmpty(location.getTimeZone())) {
                 dto.setTimeZone(location.getTimeZone());
             }
+            dto.setCityIsoCode(StringUtil.isEmpty(city.getName()) ? subdivision.getNames().get("en") : city.getName());
         } catch (IOException | GeoIp2Exception e) {
             e.printStackTrace();
         }
@@ -704,4 +706,13 @@ public class MemberEnquiryModel {
         //发邮件
         msgSendModel.sendHtmlMail(toAddress, subject, content);
     }
+
+    /**
+     * 询盘地域分布
+     * @param webSite
+     * @return
+     */
+    public List<ScreenEnquiryDistribution> getEnquiryDistribution(String webSite) {
+        return memberEnquiryReadMapper.getEnquiryDistribution(webSite);
+    }
 }

+ 1 - 1
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/seller/StoreModel.java

@@ -446,7 +446,7 @@ public class StoreModel {
         headers.put(InvestmentConst.AUTHORIZATION, storeConfig.getToken());
         JSONObject param = new JSONObject();
         param.set("storeId", storeId.toString());
-        param.set("authorName", authorName);
+        param.set("authorName", authorName + "_" + storeId);
         String result;
         try {
             result = HttpClientUtil.httpPost201(storeConfig.getUrl(), param.toString(), headers);

+ 22 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/ScreenDataSummary.java

@@ -0,0 +1,22 @@
+package com.slodon.b2b2c.vo.statistics;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 平台数据汇总
+ * @author gaosheng
+ */
+@Data
+public class ScreenDataSummary {
+    @ApiModelProperty("会员数")
+    private Integer memberNum;
+    @ApiModelProperty("分销商数")
+    private Integer distributorNum;
+    @ApiModelProperty("店铺数")
+    private Integer storeNum;
+    @ApiModelProperty("服务商数")
+    private Integer serviceProviderNum;
+    @ApiModelProperty("商品总数")
+    private Integer productNum;
+}

+ 17 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/ScreenEnquiryDistribution.java

@@ -0,0 +1,17 @@
+package com.slodon.b2b2c.vo.statistics;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 询盘地域分布
+ * @author gaosheng
+ */
+@Data
+public class ScreenEnquiryDistribution {
+    @ApiModelProperty("国家/地区")
+    private String country;
+
+    @ApiModelProperty("询盘次数")
+    private Integer enquiryNum;
+}

+ 32 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/ScreenEnquiryTrendVO.java

@@ -0,0 +1,32 @@
+package com.slodon.b2b2c.vo.statistics;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * 询盘趋势Vo对象
+ * @author gaosheng
+ */
+@Data
+public class ScreenEnquiryTrendVO {
+
+    @ApiModelProperty("海外询盘趋势")
+    private List<EnquiryNumVO> enquiryTrendList = new ArrayList<>();
+
+    @ApiModelProperty("分销商询盘趋势")
+    private List<EnquiryNumVO> enquiryTrendCNList = new ArrayList<>();
+
+    @Data
+    public static class EnquiryNumVO {
+        @ApiModelProperty("统计时间")
+        private String statsTime;
+
+        @ApiModelProperty("询盘量")
+        private Integer viewNum;
+    }
+
+}

+ 47 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/ScreenFlowTrendVO.java

@@ -0,0 +1,47 @@
+package com.slodon.b2b2c.vo.statistics;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * 流量趋势Vo对象
+ * @author gaosheng
+ */
+@Data
+public class ScreenFlowTrendVO {
+
+    @ApiModelProperty("海外访客数列表")
+    private List<VisitorNumVO> visitorNumList = new ArrayList<>();
+
+    @ApiModelProperty("海外访问量列表")
+    private List<ViewNumVO> viewNumList = new ArrayList<>();
+
+    @ApiModelProperty("国内访客数列表")
+    private List<VisitorNumVO> visitorNumCNList = new ArrayList<>();
+
+    @ApiModelProperty("国内访问量列表")
+    private List<ViewNumVO> viewNumCNList = new ArrayList<>();
+
+    @Data
+    public static class VisitorNumVO {
+        @ApiModelProperty("统计时间")
+        private String statsTime;
+
+        @ApiModelProperty("访客数")
+        private Integer visitorNum;
+    }
+
+    @Data
+    public static class ViewNumVO {
+        @ApiModelProperty("统计时间")
+        private String statsTime;
+
+        @ApiModelProperty("访问量")
+        private Integer viewNum;
+    }
+
+}

+ 22 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/ScreenGoodsTrendVO.java

@@ -0,0 +1,22 @@
+package com.slodon.b2b2c.vo.statistics;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * 商品新增趋势Vo对象
+ * @author gaosheng
+ */
+@Data
+public class ScreenGoodsTrendVO {
+
+    @ApiModelProperty("年月")
+    private String month;
+
+    @ApiModelProperty("新增商品数")
+    private String newGoodsNum;
+
+
+
+}

+ 17 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/ScreenMemberDistribution.java

@@ -0,0 +1,17 @@
+package com.slodon.b2b2c.vo.statistics;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 会员地域分布
+ * @author gaosheng
+ */
+@Data
+public class ScreenMemberDistribution {
+    @ApiModelProperty("城市")
+    private String city;
+
+    @ApiModelProperty("询盘次数")
+    private Integer memberNum;
+}

+ 22 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/ScreenMemberTrendVO.java

@@ -0,0 +1,22 @@
+package com.slodon.b2b2c.vo.statistics;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * 会员新增趋势Vo对象
+ * @author gaosheng
+ */
+@Data
+public class ScreenMemberTrendVO {
+
+    @ApiModelProperty("年月")
+    private String month;
+
+    @ApiModelProperty("新增会员数")
+    private String newMemberNum;
+
+
+
+}

+ 1 - 0
xinkeaboard-server/b2b2c-web/src/main/resources/application.yml

@@ -47,6 +47,7 @@ secure:
       - "/openapi/**"
       - "/analysis/**"
       - "/dify/**"
+      - "/v3/statistics/screen/analysis/**"
     #      - "/v3/seller/seller/enquiry/sendMsgStr"
     login-urls: #登录接口
       - "/v3/frontLogin/**"

+ 21 - 1
xinkeaboard-server/b2b2c-web/src/main/resources/mapper/read/goods/GoodsReadMapper.xml

@@ -412,5 +412,25 @@
     </if>) b
   </select>
 
-
+  <select id="getGoodsTrend" resultType="com.slodon.b2b2c.vo.statistics.ScreenGoodsTrendVO">
+    SELECT DATE_FORMAT(months.month_date, '%Y-%m') as month,
+    COALESCE(COUNT(g.goods_id), 0) as newGoodsNum
+    FROM (
+      SELECT DATE_SUB(CURDATE(), INTERVAL (a.a + (10 * b.a)) MONTH) as month_date
+      FROM (SELECT 0 as a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
+      UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
+      UNION ALL SELECT 8 UNION ALL SELECT 9) as a
+      CROSS JOIN (SELECT 0 as a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
+      UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
+      UNION ALL SELECT 8 UNION ALL SELECT 9) as b
+      ) months
+      LEFT JOIN goods g
+    ON DATE_FORMAT(g.create_time, '%Y-%m') = DATE_FORMAT(months.month_date, '%Y-%m')
+      AND g.web_site = #{webSite}
+    WHERE months.month_date <![CDATA[ >= ]]> DATE_SUB(CURDATE()
+        , INTERVAL 6 MONTH)
+      AND months.month_date <![CDATA[ <= ]]> CURDATE()
+    GROUP BY months.month_date
+    ORDER BY months.month_date
+  </select>
 </mapper>

+ 14 - 0
xinkeaboard-server/b2b2c-web/src/main/resources/mapper/read/goods/GoodsSearchWordsReadMapper.xml

@@ -174,4 +174,18 @@
     </choose>
     <include refid="limit" />
   </select>
+
+  <select id="getSearchWordsRank" resultType="java.lang.String">
+    SELECT words_content
+    FROM `goods_search_words`
+    WHERE web_site = #{webSite}
+    <if test="startTime != null">
+      AND create_time <![CDATA[ >= ]]> #{startTime}
+    </if>
+    <if test="endTime != null">
+      AND create_time <![CDATA[ <= ]]> #{endTime}
+    </if>
+    order by search_frequency ${type}
+    limit #{pager.start},#{pager.pageSize}
+  </select>
 </mapper>

+ 11 - 0
xinkeaboard-server/b2b2c-web/src/main/resources/mapper/read/member/MemberEnquiryReadMapper.xml

@@ -389,4 +389,15 @@
         ORDER BY
             enquiry_day
     </select>
+
+    <select id="getEnquiryDistribution" resultType="com.slodon.b2b2c.vo.statistics.ScreenEnquiryDistribution">
+        SELECT country, COUNT(*) as enquiryNum
+        FROM enquiry
+        WHERE country IS NOT NULL
+          AND country != ''
+          AND web_site=#{webSite}
+        GROUP BY country
+        ORDER BY enquiryNum DESC
+            LIMIT 5
+    </select>
 </mapper>

+ 32 - 0
xinkeaboard-server/b2b2c-web/src/main/resources/mapper/read/member/MemberReadMapper.xml

@@ -321,4 +321,36 @@
         </choose>
         <include refid="limit"/>
     </select>
+
+    <select id="getMemberDistribution" resultType="com.slodon.b2b2c.vo.statistics.ScreenMemberDistribution">
+        SELECT city, COUNT(*) as memberNum
+        FROM member
+        WHERE city IS NOT NULL
+          AND city != ''
+          AND web_site = #{webSite}
+        GROUP BY city
+        ORDER BY memberNum DESC
+    </select>
+
+    <select id="getMemberTrend" resultType="com.slodon.b2b2c.vo.statistics.ScreenMemberTrendVO">
+        SELECT DATE_FORMAT(months.month_date, '%Y-%m') as month,
+        COALESCE(COUNT(m.member_id), 0) as newMemberNum
+        FROM (
+            SELECT DATE_SUB(CURDATE(), INTERVAL (a.a + (10 * b.a)) MONTH) as month_date
+            FROM (SELECT 0 as a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
+            UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
+            UNION ALL SELECT 8 UNION ALL SELECT 9) as a
+            CROSS JOIN (SELECT 0 as a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
+            UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
+            UNION ALL SELECT 8 UNION ALL SELECT 9) as b
+            ) months
+            LEFT JOIN member m
+        ON DATE_FORMAT(m.register_time, '%Y-%m') = DATE_FORMAT(months.month_date, '%Y-%m')
+            AND m.web_site = #{webSite}
+        WHERE months.month_date <![CDATA[ >= ]]> DATE_SUB(CURDATE()
+            , INTERVAL 6 MONTH)
+          AND months.month_date<![CDATA[ <= ]]> CURDATE()
+        GROUP BY months.month_date
+        ORDER BY months.month_date;
+    </select>
 </mapper>