Commit 48d243d0 by 王祖波

潜客数据接口

parent d6ea4ce3
...@@ -106,7 +106,7 @@ public class ContactLogServiceImpl implements ContactLogService { ...@@ -106,7 +106,7 @@ public class ContactLogServiceImpl implements ContactLogService {
contactLog.setContactTime(date); contactLog.setContactTime(date);
contactLog.setContactCycle(contactCycle); contactLog.setContactCycle(contactCycle);
contactLog.setContactCycleFirst(contactCycleFirst); contactLog.setContactCycleFirst(contactCycleFirst);
// todo 建联时间 // 成为潜客时间 无用暂不写
contactLog.setPotentialTime(null); contactLog.setPotentialTime(null);
contactLog.setEnterpriseId(enterpriseId); contactLog.setEnterpriseId(enterpriseId);
contactLogMapper.insert(contactLog); contactLogMapper.insert(contactLog);
......
package com.gic.haoban.manage.web.controller.content.adaptor; package com.gic.haoban.manage.web.controller.content.adaptor;
import cn.hutool.core.lang.Pair;
import com.gic.clerk.api.dto.ClerkDTO; import com.gic.clerk.api.dto.ClerkDTO;
import com.gic.clerk.api.dto.StoreInfoDTO; import com.gic.clerk.api.dto.StoreInfoDTO;
import com.gic.clerk.api.service.ClerkService; import com.gic.clerk.api.service.ClerkService;
...@@ -11,16 +12,15 @@ import com.gic.haoban.manage.api.dto.StaffDTO; ...@@ -11,16 +12,15 @@ import com.gic.haoban.manage.api.dto.StaffDTO;
import com.gic.haoban.manage.api.dto.role.StoreRoleDTO; import com.gic.haoban.manage.api.dto.role.StoreRoleDTO;
import com.gic.haoban.manage.api.service.StaffApiService; import com.gic.haoban.manage.api.service.StaffApiService;
import com.gic.haoban.manage.api.service.StaffClerkRelationApiService; import com.gic.haoban.manage.api.service.StaffClerkRelationApiService;
import com.gic.haoban.manage.web.vo.StoreClerkIdVO;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Collections; import java.util.*;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -128,4 +128,19 @@ public class ClerkStoreAdaptor { ...@@ -128,4 +128,19 @@ public class ClerkStoreAdaptor {
} }
return storeDTOS.stream().collect(Collectors.toMap(StoreDTO::getStoreId, storeDTO -> storeDTO)); return storeDTOS.stream().collect(Collectors.toMap(StoreDTO::getStoreId, storeDTO -> storeDTO));
} }
public Pair<Map<String, ClerkDTO>,Map<String, StoreDTO>> getClerkStoreIdMap(List<? extends StoreClerkIdVO> result) {
if (CollectionUtils.isEmpty(result)) {
return new Pair<>(new HashMap<>(), new HashMap<>());
}
Set<String> storeIdSet = new HashSet<>();
Set<String> clerkIdSet = new HashSet<>();
result.forEach(x->{
storeIdSet.add(x.getStoreId());
clerkIdSet.add(x.getClerkId());
});
Map<String, ClerkDTO> clerkMap = queryClerkMap(Lists.newArrayList(clerkIdSet));
Map<String, StoreDTO> storeMap = queryStoreMap(Lists.newArrayList(storeIdSet));
return new Pair<>(clerkMap, storeMap);
}
} }
package com.gic.haoban.manage.web.controller.potential; package com.gic.haoban.manage.web.controller.potential;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Pair;
import com.gic.api.base.commons.BasePageInfo; import com.gic.api.base.commons.BasePageInfo;
import com.gic.api.base.commons.Page; import com.gic.api.base.commons.Page;
import com.gic.api.base.commons.ServiceResponse; import com.gic.api.base.commons.ServiceResponse;
import com.gic.clerk.api.dto.ClerkDTO;
import com.gic.clerk.api.service.ClerkService;
import com.gic.commons.webapi.reponse.RestResponse; import com.gic.commons.webapi.reponse.RestResponse;
import com.gic.enterprise.api.dto.StoreDTO;
import com.gic.haoban.manage.api.dto.contact.ContactOrderDetailDTO; import com.gic.haoban.manage.api.dto.contact.ContactOrderDetailDTO;
import com.gic.haoban.manage.api.qdto.contact.ContactOrderSearchQDTO; import com.gic.haoban.manage.api.qdto.contact.ContactOrderSearchQDTO;
import com.gic.haoban.manage.api.service.contact.ContactOrderApiService; import com.gic.haoban.manage.api.service.contact.ContactOrderApiService;
import com.gic.haoban.manage.web.controller.content.adaptor.ClerkStoreAdaptor;
import com.gic.haoban.manage.web.controller.potential.adaptor.PotentialDataAdaptor;
import com.gic.haoban.manage.web.qo.contact.ContactOrderPageQO; import com.gic.haoban.manage.web.qo.contact.ContactOrderPageQO;
import com.gic.haoban.manage.web.qo.potential.*;
import com.gic.haoban.manage.web.utils.EsMemberInfoUtils;
import com.gic.haoban.manage.web.utils.storestatusfilter.StoreStatusFilterUtils;
import com.gic.haoban.manage.web.vo.potential.*;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.*;
import java.util.stream.Collectors;
/** /**
* 潜客雷达-数据 * 潜客雷达-数据
*/ */
...@@ -23,6 +40,15 @@ public class PotentialDataController { ...@@ -23,6 +40,15 @@ public class PotentialDataController {
@Autowired @Autowired
private ContactOrderApiService contactOrderApiService; private ContactOrderApiService contactOrderApiService;
@Autowired
private ClerkService clerkService;
@Autowired
private ClerkStoreAdaptor clerkStoreAdaptor;
@Autowired
private PotentialDataAdaptor potentialDataAdaptor;
@Autowired
private EsMemberInfoUtils esMemberInfoUtils;
/** /**
* 分页查询转化记录 * 分页查询转化记录
* @param contactOrderPageQO * @param contactOrderPageQO
...@@ -46,4 +72,262 @@ public class PotentialDataController { ...@@ -46,4 +72,262 @@ public class PotentialDataController {
return RestResponse.successResult(serviceResponse.getResult()); return RestResponse.successResult(serviceResponse.getResult());
} }
/**
* 建联/转化概览 周/月报
*
* @return
*/
@RequestMapping(path = "/potential/overview")
public RestResponse<PotentialOverviewVO> queryPotentialOverviewReport(@RequestBody PotentialBusiOverviewQO potentialOverviewQO) {
String clerkId = potentialOverviewQO.getClerkId();
List<String> storeIds = getStoreIds(potentialOverviewQO);
// 建联数据
PotentialContactOverviewVO contactOverviewVO = null;
// 转化数据
PotentialConvOverviewVO convOverviewVO = null;
PotentialOverviewVO overviewVO = new PotentialOverviewVO();
// 查询的业务列表 默认所有 1建联数据 2转化数据
List<Integer> queryBiz = potentialOverviewQO.getQueryBiz();
if (CollectionUtils.isEmpty(queryBiz)) {
contactOverviewVO = potentialDataAdaptor.potentialContactOverview(potentialOverviewQO,storeIds);
convOverviewVO = potentialDataAdaptor.potentialConvOverview(potentialOverviewQO,storeIds);
} else if (queryBiz.contains(1)) {
contactOverviewVO = potentialDataAdaptor.potentialContactOverview(potentialOverviewQO,storeIds);
} else if (queryBiz.contains(2)) {
convOverviewVO = potentialDataAdaptor.potentialConvOverview(potentialOverviewQO,storeIds);
}
overviewVO.setConv(convOverviewVO);
overviewVO.setContact(contactOverviewVO);
Pair<String, String> datePair = potentialDataAdaptor.getDateParam(potentialOverviewQO.getReportType(), potentialOverviewQO.getBizDate());
if (StringUtils.isNotBlank(datePair.getKey())) {
overviewVO.setStartTime(DateUtil.parseDate(datePair.getKey()));
}
if (StringUtils.isNotBlank(datePair.getValue())) {
overviewVO.setEndTime(DateUtil.parseDate(datePair.getValue()));
}
if (StringUtils.isNotBlank(clerkId)) {
ClerkDTO clerkInfo = clerkService.getClerkByClerkId(clerkId);
overviewVO.setClerk(clerkInfo);
}
return RestResponse.successResult(overviewVO);
}
/**
* 潜客转化会员明细
*
* @return
*/
@RequestMapping(path = "/potential/conv-member")
public RestResponse<Page<PotentialMemberConvVO>> queryPotentialConvMember(@RequestBody PotentialConvMemberQO potentialOverviewQO) {
List<String> storeIds = getStoreIds(potentialOverviewQO);
Page<PotentialMemberConvVO> page = potentialDataAdaptor.pagePotentialConvMember(potentialOverviewQO, storeIds);
List<PotentialMemberConvVO> result = page.getResult();
if (CollectionUtils.isNotEmpty(result)) {
esMemberInfoUtils.setMemberInfo(potentialOverviewQO.getEnterpriseId(), result, Sets.newHashSet("memberName", "memberNick", "memberImage", "memberCard"));
}
return RestResponse.successResult(page);
}
/**
* 建联明细概览 周/月报
*
* @return
*/
@RequestMapping(path = "/potential/contact-detail")
public RestResponse<Page<PotentialContactDetailOverviewVO>> queryPotentialContactReport(@RequestBody PotentialContactOverviewQO potentialOverviewQO) {
List<String> storeIds = getStoreIds(potentialOverviewQO);
Page<PotentialContactOverviewVO> page = potentialDataAdaptor.pagePotentialContactOverview(potentialOverviewQO, storeIds);
List<PotentialContactOverviewVO> result = page.getResult();
List<PotentialContactDetailOverviewVO> list = null;
if (CollectionUtils.isNotEmpty(result)) {
Pair<Map<String, ClerkDTO>, Map<String, StoreDTO>> pair = clerkStoreAdaptor.getClerkStoreIdMap(result);
Map<String, ClerkDTO> clerkMap = pair.getKey();
Map<String, StoreDTO> storeMap = pair.getValue();
list = result.stream().map(x -> {
ClerkDTO clerkDTO = clerkMap.getOrDefault(x.getClerkId(), new ClerkDTO());
StoreDTO storeDTO = storeMap.getOrDefault(x.getStoreId(), new StoreDTO());
PotentialContactDetailOverviewVO overviewVO = new PotentialContactDetailOverviewVO();
overviewVO.setContact(x);
overviewVO.setStore(storeDTO);
overviewVO.setClerk(clerkDTO);
return overviewVO;
}).collect(Collectors.toList());
}
Page<PotentialContactDetailOverviewVO> res = new Page<>();
res.setCurrentPage(page.getCurrentPage());
res.setPageSize(page.getPageSize());
res.setTotalPage(page.getTotalPage());
res.setTotalCount(page.getTotalCount());
res.setResult(list);
return RestResponse.successResult(res);
}
/**
* 转化明细概览 周/月报
*
* @return
*/
@RequestMapping(path = "/potential/conv-detail")
public RestResponse<Page<PotentialConvDetailOverviewVO>> queryPotentialConvReport(@RequestBody PotentialConvOverviewQO potentialOverviewQO) {
List<String> storeIds = getStoreIds(potentialOverviewQO);
Page<PotentialConvOverviewVO> page = potentialDataAdaptor.pagePotentialConvOverview(potentialOverviewQO, storeIds);
List<PotentialConvOverviewVO> result = page.getResult();
List<PotentialConvDetailOverviewVO> list = null;
if (CollectionUtils.isNotEmpty(result)) {
Pair<Map<String, ClerkDTO>, Map<String, StoreDTO>> pair = clerkStoreAdaptor.getClerkStoreIdMap(result);
Map<String, ClerkDTO> clerkMap = pair.getKey();
Map<String, StoreDTO> storeMap = pair.getValue();
list = result.stream().map(x -> {
ClerkDTO clerkDTO = clerkMap.getOrDefault(x.getClerkId(), new ClerkDTO());
StoreDTO storeDTO = storeMap.getOrDefault(x.getStoreId(), new StoreDTO());
PotentialConvDetailOverviewVO overviewVO = new PotentialConvDetailOverviewVO();
overviewVO.setConv(x);
overviewVO.setStore(storeDTO);
overviewVO.setClerk(clerkDTO);
return overviewVO;
}).collect(Collectors.toList());
}
Page<PotentialConvDetailOverviewVO> res = new Page<>();
res.setCurrentPage(page.getCurrentPage());
res.setPageSize(page.getPageSize());
res.setTotalPage(page.getTotalPage());
res.setTotalCount(page.getTotalCount());
res.setResult(list);
return RestResponse.successResult(res);
}
/**
* 人货匹配推荐概览
*
* @return
*/
@RequestMapping(path = "/recommend/overview")
public RestResponse<RecommendOverviewVO> queryRecommendOverviewReport(@RequestBody RecommendBusiOverviewQO potentialOverviewQO) {
List<String> storeIds = getStoreIds(potentialOverviewQO);
// 使用数据
RecommendUsedOverviewVO usedOverviewVO = null;
// 转化数据
RecommendConvOverviewVO convOverviewVO = null;
RecommendOverviewVO overviewVO = new RecommendOverviewVO();
// 查询的业务列表 默认所有 1使用数据 2转化数据
List<Integer> queryBiz = potentialOverviewQO.getQueryBiz();
if (CollectionUtils.isEmpty(queryBiz)) {
usedOverviewVO = potentialDataAdaptor.recommendUsedOverview(potentialOverviewQO,storeIds);
convOverviewVO = potentialDataAdaptor.recommendConvOverview(potentialOverviewQO,storeIds);
} else if (queryBiz.contains(1)) {
usedOverviewVO = potentialDataAdaptor.recommendUsedOverview(potentialOverviewQO,storeIds);
} else if (queryBiz.contains(2)) {
convOverviewVO = potentialDataAdaptor.recommendConvOverview(potentialOverviewQO,storeIds);
}
overviewVO.setUsed(usedOverviewVO);
overviewVO.setConv(convOverviewVO);
return RestResponse.successResult(overviewVO);
}
/**
* 人货匹配使用概览明细
*
* @return
*/
@RequestMapping(path = "/recommend/used-detail")
public RestResponse<Page<RecommendUsedDetailOverviewVO>> queryRecommendUsedReport(@RequestBody RecommendUsedOverviewQO potentialOverviewQO) {
List<String> storeIds = getStoreIds(potentialOverviewQO);
Page<RecommendUsedOverviewVO> page = potentialDataAdaptor.pageRecommendUsedOverview(potentialOverviewQO, storeIds);
List<RecommendUsedOverviewVO> result = page.getResult();
List<RecommendUsedDetailOverviewVO> list = null;
if (CollectionUtils.isNotEmpty(result)) {
Pair<Map<String, ClerkDTO>, Map<String, StoreDTO>> pair = clerkStoreAdaptor.getClerkStoreIdMap(result);
Map<String, ClerkDTO> clerkMap = pair.getKey();
Map<String, StoreDTO> storeMap = pair.getValue();
list = result.stream().map(x -> {
ClerkDTO clerkDTO = clerkMap.getOrDefault(x.getClerkId(), new ClerkDTO());
StoreDTO storeDTO = storeMap.getOrDefault(x.getStoreId(), new StoreDTO());
RecommendUsedDetailOverviewVO overviewVO = new RecommendUsedDetailOverviewVO();
overviewVO.setUsed(x);
overviewVO.setStore(storeDTO);
overviewVO.setClerk(clerkDTO);
return overviewVO;
}).collect(Collectors.toList());
}
Page<RecommendUsedDetailOverviewVO> res = new Page<>();
res.setCurrentPage(page.getCurrentPage());
res.setPageSize(page.getPageSize());
res.setTotalPage(page.getTotalPage());
res.setTotalCount(page.getTotalCount());
res.setResult(list);
return RestResponse.successResult(res);
}
/**
* 人货匹配转化概览明细
*
* @return
*/
@RequestMapping(path = "/recommend/conv-detail")
public RestResponse<Page<RecommendConvDetailOverviewVO>> queryRecommendConvReport(@RequestBody RecommendConvOverviewQO potentialOverviewQO) {
List<String> storeIds = getStoreIds(potentialOverviewQO);
Page<RecommendConvOverviewVO> page = potentialDataAdaptor.pageRecommendConvOverview(potentialOverviewQO, storeIds);
List<RecommendConvOverviewVO> result = page.getResult();
List<RecommendConvDetailOverviewVO> list = null;
if (CollectionUtils.isNotEmpty(result)) {
Pair<Map<String, ClerkDTO>, Map<String, StoreDTO>> pair = clerkStoreAdaptor.getClerkStoreIdMap(result);
Map<String, ClerkDTO> clerkMap = pair.getKey();
Map<String, StoreDTO> storeMap = pair.getValue();
list = result.stream().map(x -> {
ClerkDTO clerkDTO = clerkMap.getOrDefault(x.getClerkId(), new ClerkDTO());
StoreDTO storeDTO = storeMap.getOrDefault(x.getStoreId(), new StoreDTO());
RecommendConvDetailOverviewVO overviewVO = new RecommendConvDetailOverviewVO();
overviewVO.setConv(x);
overviewVO.setStore(storeDTO);
overviewVO.setClerk(clerkDTO);
return overviewVO;
}).collect(Collectors.toList());
}
Page<RecommendConvDetailOverviewVO> res = new Page<>();
res.setCurrentPage(page.getCurrentPage());
res.setPageSize(page.getPageSize());
res.setTotalPage(page.getTotalPage());
res.setTotalCount(page.getTotalCount());
res.setResult(list);
return RestResponse.successResult(res);
}
/**
* 人货匹配使用趋势
*
* @return
*/
@RequestMapping(path = "/recommend/used-trend")
public RestResponse<Page<RecommendUsedTrendVO>> queryRecommendUsedTrend(@RequestBody RecommendUsedTrendQO potentialOverviewQO) {
List<String> storeIds = getStoreIds(potentialOverviewQO);
Page<RecommendUsedTrendVO> page = potentialDataAdaptor.pageRecommendUsedTrend(potentialOverviewQO, storeIds);
return RestResponse.successResult(page);
}
/**
* 人货匹配转化趋势
*
* @return
*/
@RequestMapping(path = "/recommend/conv-trend")
public RestResponse<Page<RecommendConvTrendVO>> queryRecommendConvTrend(@RequestBody RecommendConvTrendQO potentialOverviewQO) {
List<String> storeIds = getStoreIds(potentialOverviewQO);
Page<RecommendConvTrendVO> page = potentialDataAdaptor.pageRecommendConvTrend(potentialOverviewQO, storeIds);
return RestResponse.successResult(page);
}
private List<String> getStoreIds(PotentialStatisticsBaseQO potentialStatisticsBaseQO) {
String wxEnterpriseId = potentialStatisticsBaseQO.getWxEnterpriseId();
String storeId = potentialStatisticsBaseQO.getStoreId();
Integer storeStatusFilter = potentialStatisticsBaseQO.getStoreStatusFilter();
List<String> storeIds = new ArrayList<>();
if (StringUtils.isBlank(storeId)) {
storeIds = clerkStoreAdaptor.queryClerkStoreIds(storeId, wxEnterpriseId,
StoreStatusFilterUtils.getStoreStatusList(storeStatusFilter));
} else {
storeIds.add(storeId);
}
return storeIds;
}
} }
package com.gic.haoban.manage.web.controller.potential.adaptor;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.lang.Pair;
import com.alibaba.fastjson.JSON;
import com.gic.api.base.commons.Page;
import com.gic.commons.util.DataApiUtils;
import com.gic.haoban.manage.api.enums.content.MaterialReportType;
import com.gic.haoban.manage.web.qo.potential.PotentialOverviewQO;
import com.gic.haoban.manage.web.qo.potential.PotentialStatisticsBaseQO;
import com.gic.haoban.manage.web.vo.potential.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by wangzubo on 2025/3/21.
*/
@Slf4j
@Component
public class PotentialDataAdaptor {
/**
* 潜客建联
*/
private static final String POTENTIAL_CONTACT_OVERVIEW = "data_mkt_pos_cut_haoban_overview";
/**
* 潜客转化
*/
private static final String POTENTIAL_CONV_OVERVIEW = "data_mkt_pos_cut_haoban_conv";
/**
* 潜客转化会员
*/
private static final String POTENTIAL_CONV_MEMBER = "data_mkt_pos_cut_haoban_detail";
/**
* 推荐使用
*/
private static final String RECOMMEND_USED_OVERVIEW = "data_mkt_pos_cut_haoban_goods_match_use";
/**
* 推荐转化
*/
private static final String RECOMMEND_CONV_OVERVIEW = "data_mkt_pos_cut_haoban_goods_match_conv";
/**
* 推荐使用趋势
*/
private static final String RECOMMEND_USED_TREND = "data_mkt_pos_cut_haoban_goods_match_use_date";
/**
* 推荐转化趋势
*/
private static final String RECOMMEND_CONV_TREND = "data_mkt_pos_cut_haoban_conv_date";
private <T> T fetchOverviewData(PotentialOverviewQO potentialOverviewQO, List<String> storeIds, String url, Class<T> clazz) {
potentialOverviewQO.setPotGroup(3);
Map<String, Object> inlineParams = getOverviewParams(potentialOverviewQO, storeIds);
Map<String, Object> result = DataApiUtils.http(JSON.toJSONString(inlineParams), url);
if (result.get("data") == null) {
return null;
}
List<T> dataList = DataApiUtils.parsePageDataList(result, clazz);
if (CollectionUtils.isEmpty(dataList)) {
return null;
}
return dataList.get(0);
}
private <T> Page<T> fetchPageData(PotentialOverviewQO potentialOverviewQO, List<String> storeIds, String url, Class<T> clazz) {
Map<String, Object> inlineParams = getOverviewParams(potentialOverviewQO, storeIds);
convertPageParams(potentialOverviewQO, inlineParams);
Map<String, Object> result = DataApiUtils.http(JSON.toJSONString(inlineParams), url);
if (result.get("data") == null) {
return new Page<>();
}
return DataApiUtils.getPageData(result, clazz);
}
private <T> Page<T> fetchPageDataBase(PotentialStatisticsBaseQO potentialOverviewQO, List<String> storeIds, String url, Class<T> clazz) {
Map<String, Object> inlineParams = getOverviewBaseParams(potentialOverviewQO, storeIds);
convertPageParams(potentialOverviewQO, inlineParams);
Map<String, Object> result = DataApiUtils.http(JSON.toJSONString(inlineParams), url);
if (result.get("data") == null) {
return new Page<>();
}
return DataApiUtils.getPageData(result, clazz);
}
/**
* 潜客建联概览
* @return
*/
public PotentialContactOverviewVO potentialContactOverview(PotentialOverviewQO potentialOverviewQO, List<String> storeIds) {
return fetchOverviewData(potentialOverviewQO, storeIds, POTENTIAL_CONTACT_OVERVIEW, PotentialContactOverviewVO.class);
}
/**
* 潜客转化概览
* @return
*/
public PotentialConvOverviewVO potentialConvOverview(PotentialOverviewQO potentialOverviewQO, List<String> storeIds) {
return fetchOverviewData(potentialOverviewQO, storeIds, POTENTIAL_CONV_OVERVIEW, PotentialConvOverviewVO.class);
}
/**
* 推荐使用概览
* @return
*/
public RecommendUsedOverviewVO recommendUsedOverview(PotentialOverviewQO potentialOverviewQO, List<String> storeIds) {
return fetchOverviewData(potentialOverviewQO, storeIds, RECOMMEND_USED_OVERVIEW, RecommendUsedOverviewVO.class);
}
/**
* 推荐转化概览
* @return
*/
public RecommendConvOverviewVO recommendConvOverview(PotentialOverviewQO potentialOverviewQO, List<String> storeIds) {
return fetchOverviewData(potentialOverviewQO, storeIds, RECOMMEND_CONV_OVERVIEW, RecommendConvOverviewVO.class);
}
/**
* 潜客转化客户
* @return
*/
public Page<PotentialMemberConvVO> pagePotentialConvMember(PotentialStatisticsBaseQO potentialOverviewQO, List<String> storeIds) {
return fetchPageDataBase(potentialOverviewQO, storeIds, POTENTIAL_CONV_MEMBER, PotentialMemberConvVO.class);
}
/**
* 潜客建联明细概览
* @return
*/
public Page<PotentialContactOverviewVO> pagePotentialContactOverview(PotentialOverviewQO potentialOverviewQO, List<String> storeIds) {
return fetchPageData(potentialOverviewQO, storeIds, POTENTIAL_CONTACT_OVERVIEW, PotentialContactOverviewVO.class);
}
/**
* 潜客转化明细概览
* @return
*/
public Page<PotentialConvOverviewVO> pagePotentialConvOverview(PotentialOverviewQO potentialOverviewQO, List<String> storeIds) {
return fetchPageData(potentialOverviewQO, storeIds, POTENTIAL_CONV_OVERVIEW, PotentialConvOverviewVO.class);
}
/**
* 推荐使用明细概览
* @return
*/
public Page<RecommendUsedOverviewVO> pageRecommendUsedOverview(PotentialOverviewQO potentialOverviewQO, List<String> storeIds) {
return fetchPageData(potentialOverviewQO, storeIds, RECOMMEND_USED_OVERVIEW, RecommendUsedOverviewVO.class);
}
/**
* 潜客转化明细概览
* @return
*/
public Page<RecommendConvOverviewVO> pageRecommendConvOverview(PotentialOverviewQO potentialOverviewQO, List<String> storeIds) {
return fetchPageData(potentialOverviewQO, storeIds, RECOMMEND_CONV_OVERVIEW, RecommendConvOverviewVO.class);
}
/**
* 推荐使用趋势
* @return
*/
public Page<RecommendUsedTrendVO> pageRecommendUsedTrend(PotentialStatisticsBaseQO potentialOverviewQO, List<String> storeIds) {
return fetchPageDataBase(potentialOverviewQO, storeIds, RECOMMEND_USED_TREND, RecommendUsedTrendVO.class);
}
/**
* 推荐转化趋势
* @return
*/
public Page<RecommendConvTrendVO> pageRecommendConvTrend(PotentialStatisticsBaseQO potentialOverviewQO, List<String> storeIds) {
return fetchPageDataBase(potentialOverviewQO, storeIds, RECOMMEND_CONV_TREND, RecommendConvTrendVO.class);
}
private Map<String, Object> getOverviewParams(PotentialOverviewQO potentialOverviewQO, List<String> storeIds) {
Integer reportType = potentialOverviewQO.getReportType();
String bizDate = potentialOverviewQO.getBizDate();
Integer potGroup = potentialOverviewQO.getPotGroup();
Map<String, Object> inlineParams = getOverviewBaseParams(potentialOverviewQO, storeIds);
Pair<String, String> dateParam = getDateParam(reportType, bizDate);
String startDate = dateParam.getKey();
String endDate = dateParam.getValue();
if (StringUtils.isBlank(startDate)) {
inlineParams.put("startDate", startDate);
}
if (StringUtils.isBlank(endDate)) {
inlineParams.put("endDate", endDate);
}
// 1 门店维度 2 导购维度 3 合计
if (potGroup != null) {
inlineParams.put("potGroup", potGroup);
}
if (reportType != null) {
inlineParams.put("reportType", reportType);
}
return inlineParams;
}
private Map<String, Object> getOverviewBaseParams(PotentialStatisticsBaseQO baseQO, List<String> storeIds) {
String clerkId = baseQO.getClerkId();
String enterpriseId = baseQO.getEnterpriseId();
String startDate = "";
String endDate = "";
Map<String, Object> inlineParams = new HashMap<>();
if (StringUtils.isNotBlank(clerkId)) {
inlineParams.put("clerkId", clerkId);
}
if (CollectionUtils.isNotEmpty(storeIds)) {
inlineParams.put("storeId", String.join(",", storeIds));
}
if (StringUtils.isNotBlank(baseQO.getStartDate())) {
startDate = baseQO.getStartDate();
}
if (StringUtils.isNotBlank(baseQO.getEndDate())) {
endDate = baseQO.getEndDate();
}
inlineParams.put("enterpriseId", enterpriseId);
inlineParams.put("startDate", startDate);
inlineParams.put("endDate", endDate);
inlineParams.put("orderByFields", 2);
inlineParams.put("orderByType", 1);
return inlineParams;
}
private void convertPageParams(PotentialStatisticsBaseQO potentialOverviewQO, Map<String, Object> inlineParams) {
inlineParams.put("pageNum", potentialOverviewQO.getPageNum());
inlineParams.put("pageSize", potentialOverviewQO.getPageSize());
int orderByFields = DataApiUtils.getOrderByFields(potentialOverviewQO.getOrderByField(), potentialOverviewQO.getDefaultFields(), potentialOverviewQO.getFieldsOrder());
inlineParams.put("orderByFields", orderByFields);
inlineParams.put("orderByType", DataApiUtils.getOrderByType(potentialOverviewQO.getOrder()));
}
public Pair<String, String> getDateParam(Integer reportType, String bizDate) {
if (reportType == null) {
return new Pair<>("", "");
}
String endDate = bizDate;
String beginDate = bizDate;
if (MaterialReportType.MONTH.getCode().equals(reportType)) {
DateTime date = cn.hutool.core.date.DateUtil.parse("yyyy-MM");
beginDate = cn.hutool.core.date.DateUtil.format(cn.hutool.core.date.DateUtil.beginOfMonth(date), "yyyy-MM-dd");
endDate = cn.hutool.core.date.DateUtil.format(cn.hutool.core.date.DateUtil.endOfMonth(date), "yyyy-MM-dd");
}else {
DateTime date = cn.hutool.core.date.DateUtil.parse("yyyy-MM-dd");
endDate = cn.hutool.core.date.DateUtil.format(cn.hutool.core.date.DateUtil.endOfWeek(date), "yyyy-MM-dd");
}
Pair<String, String> pair = new Pair<>(beginDate, endDate);
return pair;
}
}
package com.gic.haoban.manage.web.qo.potential;
import lombok.Data;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Data
public class PotentialBusiOverviewQO extends PotentialOverviewQO {
private static final long serialVersionUID = -4105397589798480404L;
/**
* 查询的业务列表 默认所有 1建联数据 2转化数据
*/
private List<Integer> queryBiz;
}
package com.gic.haoban.manage.web.qo.potential;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class PotentialContactOverviewQO extends PotentialOverviewQO {
private static final long serialVersionUID = -4105397589798480404L;
public Map<String, Integer> getFieldsOrder() {
Map<String, Integer> map = new HashMap<>();
map.put("potCusNum", 1); // 潜力客户数
map.put("connPotCusNum", 2); // 建联客户数
map.put("potCusConnRate", 3); // 建联率
map.put("convsPotCusNum", 4); // 转化客户数
map.put("connConvsRate", 5); // 转化率
map.put("connConvsAmt", 6); // 潜客转化金额
map.put("noConnPotCusNum", 7); // 当前未建联潜客数
return map;
}
public String getDefaultFields() {
return "potCusConnRate";
}
}
package com.gic.haoban.manage.web.qo.potential;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class PotentialConvMemberQO extends PotentialStatisticsBaseQO {
private static final long serialVersionUID = -4105397589798480404L;
public Map<String, Integer> getFieldsOrder() {
Map<String, Integer> map = new HashMap<>();
map.put("connConvsAmt", 1); // 潜客转化金额
return map;
}
public String getDefaultFields() {
return "connConvsAmt";
}
}
package com.gic.haoban.manage.web.qo.potential;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class PotentialConvOverviewQO extends PotentialOverviewQO {
private static final long serialVersionUID = -4105397589798480404L;
public Map<String, Integer> getFieldsOrder() {
Map<String, Integer> map = new HashMap<>();
map.put("onlineConnConvsMbrNum", 1); // 商城转化客户数
map.put("onlineConnConvsAmt", 2); // 商城转化金额
map.put("offlineConnConvsMbrNum", 3); // 线下转化客户数
map.put("offlineConnConvsAmt", 4); // 线下转化金额
map.put("potCusRdrOnlineConvsMbrNum", 5); // 潜客雷达商城转化客户数
map.put("potCusRdrOnlineConvsAmt", 6); // 潜客雷达商城转化金额
map.put("potCusRdrOfflineConvsMbrNum", 7); // 潜客雷达线下转化客户数
map.put("potCusRdrOfflineConvsAmt", 8); // 潜客雷达线下转化金额
return map;
}
public String getDefaultFields() {
return "onlineConnConvsMbrNum";
}
}
package com.gic.haoban.manage.web.qo.potential;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class PotentialOverviewQO extends PotentialStatisticsBaseQO {
private static final long serialVersionUID = -4105397589798480404L;
/**
* 数据类型
* 1 周报; 2 月报
* @see com.gic.haoban.manage.api.enums.content.MaterialReportType
*/
private Integer reportType;
/**
* 周报/月报传业务周期
*/
private String bizDate;
/**
* 1 门店维度 2 导购维度
*/
private Integer potGroup;
}
package com.gic.haoban.manage.web.qo.potential;
import com.gic.api.base.commons.BasePageInfo;
import com.gic.haoban.common.utils.DateUtil;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Data
public class PotentialStatisticsBaseQO extends BasePageInfo {
/**
* 企业id
*/
private String enterpriseId;
/**
* 微信企业id
*/
private String wxEnterpriseId;
/**
* 导购id
*/
private String clerkId;
/**
* 门店id
*/
private String storeId;
/**
* 门店id列表
*/
private List<String> storeIdList;
/**
* 门店过滤
*/
private Integer storeStatusFilter;
/**
* 开始时间
*/
private String startDate;
/**
* 结束时间
*/
private String endDate;
/**
* 排序字段
*/
private String orderByField;
/**
* asc
* desc
*/
private String order;
public String getEndDate() {
if (StringUtils.isBlank(this.endDate)) {
return DateUtil.dateToStr(DateUtils.addDays(new Date(), -1), "yyyy-MM-dd");
}
return endDate;
}
public Map<String, Integer> getFieldsOrder() {
Map<String, Integer> map = new HashMap<>();
return map;
}
public String getDefaultFields() {
return "";
}
}
package com.gic.haoban.manage.web.qo.potential;
import lombok.Data;
import java.util.List;
@Data
public class RecommendBusiOverviewQO extends PotentialOverviewQO {
private static final long serialVersionUID = -4105397589798480404L;
/**
* 查询的业务列表 默认所有 1使用数据 2转化数据
*/
private List<Integer> queryBiz;
}
package com.gic.haoban.manage.web.qo.potential;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class RecommendConvOverviewQO extends PotentialOverviewQO {
private static final long serialVersionUID = -4105397589798480404L;
public Map<String, Integer> getFieldsOrder() {
Map<String, Integer> map = new HashMap<>();
map.put("matchingOnlineConvsMbrNum", 1); // 人货匹配商城转化人数
map.put("matchingOnlineConvsAmt", 2); // 人货匹配商城转化金额
map.put("matchingOfflineConvsMbrNum", 3); // 人货匹配线下转化人数
map.put("matchingOfflineConvsAmt", 4); // 人货匹配线下转化金额
map.put("matchingOnlineConvsMbrNumOverview", 5);// 人货匹配商城转化人数(总览)
map.put("matchingOnlineConvsAmtOverview", 6); // 人货匹配商城转化金额(总览)
map.put("matchingOfflineConvsMbrNumOverview", 7);// 人货匹配线下转化人数(总览)
map.put("matchingOfflineConvsAmtOverview", 8); // 人货匹配线下转化金额(总览)
return map;
}
public String getDefaultFields() {
return "matchingOnlineConvsMbrNum";
}
}
package com.gic.haoban.manage.web.qo.potential;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class RecommendConvTrendQO extends PotentialStatisticsBaseQO {
private static final long serialVersionUID = -4105397589798480404L;
public Map<String, Integer> getFieldsOrder() {
Map<String, Integer> map = new HashMap<>();
map.put("matchingOnlineConvsMbrNum", 1); // 1 人货匹配商城转化客户数
map.put("matchingOnlineConvsAmt", 2); // 2 人货匹配商城转化金额
map.put("matchingOfflineConvsMbrNum", 3); // 3 人货匹配线下转化客户数
map.put("matchingOfflineConvsAmt", 4); // 4 人货匹配线下转化金额
map.put("matchingOnlineConvsMbrNumOverview", 5);// 5 人货匹配商城转化客户数(总览)
map.put("matchingOnlineConvsAmtOverview", 6); // 6 人货匹配商城转化金额(总览)
map.put("matchingOfflineConvsMbrNumOverview", 7);// 7 人货匹配线下转化客户数(总览)
map.put("matchingOfflineConvsAmtOverview", 8); // 8 人货匹配线下转化金额(总览)
map.put("bizDate", 9); // 日期
return map;
}
public String getDefaultFields() {
return "bizDate";
}
}
package com.gic.haoban.manage.web.qo.potential;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class RecommendUsedOverviewQO extends PotentialOverviewQO {
private static final long serialVersionUID = -4105397589798480404L;
public Map<String, Integer> getFieldsOrder() {
Map<String, Integer> map = new HashMap<>();
map.put("matchingTouchMbrNum", 1); // 人货匹配触达客户数
map.put("matchingReachClickMbrNum", 2); // 人货匹配访问人数
map.put("matchingCTR", 3); // 人货匹配触达访问率
map.put("matchingTouchConvsMbrNum", 4); // 人货匹配触达转化人数
map.put("matchingConvsRate", 5); // 人货匹配触达转化率
map.put("matchingTouchConvsAmt", 6); // 人货匹配触达转化金额
return map;
}
public String getDefaultFields() {
return "matchingTouchMbrNum";
}
}
package com.gic.haoban.manage.web.qo.potential;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class RecommendUsedTrendQO extends PotentialStatisticsBaseQO {
private static final long serialVersionUID = -4105397589798480404L;
public Map<String, Integer> getFieldsOrder() {
Map<String, Integer> map = new HashMap<>();
map.put("matchingTouchMbrNum", 1); // 人货匹配触达客户数
map.put("matchingReachClickMbrNum", 2); // 人货匹配访问人数
map.put("matchingCTR", 3); // 人货匹配触达访问率
map.put("matchingTouchConvsMbrNum", 4); // 人货匹配触达转化人数
map.put("matchingConvsRate", 5); // 人货匹配触达转化率
map.put("matchingTouchConvsAmt", 6); // 人货匹配触达转化金额
map.put("bizDate", 7); // 日期
return map;
}
public String getDefaultFields() {
return "bizDate";
}
}
...@@ -41,7 +41,7 @@ public class EsMemberInfoUtils { ...@@ -41,7 +41,7 @@ public class EsMemberInfoUtils {
} }
} }
if (CollectionUtils.isNotEmpty(memberIdList)) { if (CollectionUtils.isNotEmpty(memberIdList)) {
List<JSONObject> memberJson = queryDataBatch(enterpriseId, memberIdList, "memberId,name,mainStoreId,phoneNumber,name,nickName,mainClerkId,photoUrl"); List<JSONObject> memberJson = queryDataBatch(enterpriseId, memberIdList, "memberId,name,mainStoreId,phoneNumber,name,nickName,mainClerkId,photoUrl,cardNo");
if (CollectionUtils.isNotEmpty(memberJson)) { if (CollectionUtils.isNotEmpty(memberJson)) {
Map<String, JSONObject> map = memberJson.stream() Map<String, JSONObject> map = memberJson.stream()
.collect(Collectors.toMap(e -> e.getString("memberId"), e -> e)); .collect(Collectors.toMap(e -> e.getString("memberId"), e -> e));
...@@ -94,6 +94,12 @@ public class EsMemberInfoUtils { ...@@ -94,6 +94,12 @@ public class EsMemberInfoUtils {
if (fieldName.contains("memberScene")) { if (fieldName.contains("memberScene")) {
ReflectUtils.setDateFieldValue(vo, "memberScene", 3); ReflectUtils.setDateFieldValue(vo, "memberScene", 3);
} }
if (fieldName.contains("memberCard")) {
ReflectUtils.setDateFieldValue(vo, "memberCard", jsonValue.getString("cardNo"));
}
if (fieldName.contains("memberImage")) {
ReflectUtils.setDateFieldValue(vo, "memberImage", jsonValue.getString("photoUrl"));
}
if (isQueryStore) { if (isQueryStore) {
String mainStoreId = jsonValue.getString("mainStoreId"); String mainStoreId = jsonValue.getString("mainStoreId");
......
package com.gic.haoban.manage.web.vo;
import lombok.Data;
/**
* Created by wangzubo on 2025/3/22.
*/
@Data
public class StoreClerkIdVO {
/**
* 导购id
*/
private String clerkId;
/**
* 门店id
*/
private String storeId;
}
package com.gic.haoban.manage.web.vo;
import com.gic.clerk.api.dto.ClerkDTO;
import com.gic.enterprise.api.dto.StoreDTO;
import lombok.Data;
/**
* Created by wangzubo on 2025/3/22.
*/
@Data
public class StoreClerkInfoVO {
/**
* 导购id
*/
private String clerkId;
/**
* 导购code
*/
private String clerkCode;
/**
* 导购名称
*/
private String clerkName;
/**
* 门店id
*/
private String storeId;
/**
* 门店code
*/
private String storeCode;
/**
* 门店名称
*/
private String storeName;
public void setClerk(ClerkDTO clerkDTO) {
if (clerkDTO == null) {
return;
}
this.setClerkId(clerkDTO.getClerkId());
this.setClerkCode(clerkDTO.getClerkCode());
this.setClerkName(clerkDTO.getClerkName());
}
public void setStore(StoreDTO storeDTO) {
if (storeDTO == null) {
return;
}
this.setStoreId(storeDTO.getStoreId());
this.setStoreCode(storeDTO.getStoreCode());
this.setStoreName(storeDTO.getStoreName());
}
}
...@@ -13,35 +13,7 @@ import java.util.Date; ...@@ -13,35 +13,7 @@ import java.util.Date;
public class MaterialPersonalUsedDataVO implements Serializable { public class MaterialPersonalUsedDataVO implements Serializable {
private static final long serialVersionUID = 6148710247246321358L; private static final long serialVersionUID = 6148710247246321358L;
/**
* 开始时间
*/
private Date startTime;
/**
* 结束时间
*/
private Date endTime;
/**
* 导购id
*/
private String clerkId;
/**
* 导购code
*/
private String clerkCode;
/**
* 导购名称
*/
private String clerkName;
/**
* 导购头像
*/
private String imageUrl;
/** /**
* 使用素材数量 * 使用素材数量
......
package com.gic.haoban.manage.web.vo.potential;
import com.gic.haoban.manage.web.vo.StoreClerkInfoVO;
import lombok.Data;
/**
* Created by wangzubo on 2025/3/22.
*/
@Data
public class PotentialContactDetailOverviewVO extends StoreClerkInfoVO {
/**
* 建联数据
*/
private PotentialContactOverviewVO contact;
}
package com.gic.haoban.manage.web.vo.potential;
import com.gic.haoban.manage.web.vo.StoreClerkIdVO;
import lombok.Data;
/**
* Created by wangzubo on 2025/3/21.
*/
@Data
public class PotentialContactOverviewVO extends StoreClerkIdVO {
/**
* 潜力客户数
*/
private Integer potCusNum;
/**
* 建联客户数
*/
private Integer connPotCusNum;
/**
* 建联率
*/
private Double potCusConnRate;
/**
* 转化客户数
*/
private Integer convsPotCusNum;
/**
* 转化率
*/
private Double connConvsRate;
/**
* 潜客转化金额
*/
private Double connConvsAmt;
/**
* 当前未建联潜客数
*/
private Integer noConnPotCusNum;
/**
* 潜力客户数上一周期环比
*/
private Double potCusNumLast;
/**
* 建联客户数上一周期环比
*/
private Double connPotCusNumLast;
/**
* 建联率上一周期环比
*/
private Double potCusConnRateLast;
/**
* 转化客户数上一周期环比
*/
private Integer convsPotCusNumLast;
/**
* 转化率上一周期环比
*/
private Double connConvsRateLast;
/**
* 潜客转化金额上一周期环比
*/
private Double connConvsAmtLast;
/**
* 建联率排名
*/
private Integer potCusConnRateRank;
}
package com.gic.haoban.manage.web.vo.potential;
import com.gic.haoban.manage.web.vo.StoreClerkInfoVO;
import lombok.Data;
/**
* Created by wangzubo on 2025/3/22.
*/
@Data
public class PotentialConvDetailOverviewVO extends StoreClerkInfoVO {
/**
* 转化数据
*/
private PotentialConvOverviewVO conv;
}
package com.gic.haoban.manage.web.vo.potential;
import com.gic.haoban.manage.web.vo.StoreClerkIdVO;
import lombok.Data;
/**
* Created by wangzubo on 2025/3/22.
*/
@Data
public class PotentialConvOverviewVO extends StoreClerkIdVO {
/**
* 商城转化金额
*/
private Double onlineConnConvsAmt;
/**
* 商城转化客户数
*/
private Integer onlineConnConvsMbrNum;
/**
* 线下转化金额
*/
private Double offlineConnConvsAmt;
/**
* 线下转化客户数
*/
private Integer offlineConnConvsMbrNum;
/**
* 商城转化金额上一周期环比
*/
private Double onlineConnConvsAmtLast;
/**
* 商城转化客户数上一周期环比
*/
private Double onlineConnConvsMbrNumLast;
/**
* 线下转化金额上一周期环比
*/
private Double offlineConnConvsAmtLast;
/**
* 线下转化客户数上一周期环比 (必须)
*/
private Integer offlineConnConvsMbrNumLast;
/**
* 商城转化金额排名 (必须)
*/
private Integer onlineConnConvsAmtRank;
/**
* 线下转化金额排名 (必须)
*/
private Integer offlineConnConvsAmtRank;
/**
* 潜客雷达商城转化客户数
*/
private Integer potCusRdrOnlineConvsMbrNum;
/**
* 潜客雷达商城转化金额
*/
private Double potCusRdrOnlineConvsAmt;
/**
* 潜客雷达线下转化客户数
*/
private Integer potCusRdrOfflineConvsMbrNum;
/**
* 潜客雷达线下转化金额
*/
private Double potCusRdrOfflineConvsAmt;
}
package com.gic.haoban.manage.web.vo.potential;
import lombok.Data;
/**
* Created by wangzubo on 2025/3/22.
*/
@Data
public class PotentialMemberConvVO {
/**
* 会员id
*/
private String memberId;
/**
* 潜客转化金额
*/
private Double connConvsAmt;
/**
* 会员名称
*/
private String memberName;
/**
* 会员昵称
*/
private String memberNick;
/**
* 会员卡号
*/
private String memberCard;
/**
* 会员头像
*/
private String memberImage;
}
package com.gic.haoban.manage.web.vo.potential;
import com.gic.clerk.api.dto.ClerkDTO;
import lombok.Data;
import java.util.Date;
/**
* Created by wangzubo on 2025/3/22.
*/
@Data
public class PotentialOverviewVO {
/**
* 建联数据
*/
private PotentialContactOverviewVO contact;
/**
* 转化数据
*/
private PotentialConvOverviewVO conv;
/**
* 开始时间
*/
private Date startTime;
/**
* 结束时间
*/
private Date endTime;
/**
* 导购id
*/
private String clerkId;
/**
* 导购code
*/
private String clerkCode;
/**
* 导购名称
*/
private String clerkName;
/**
* 导购头像
*/
private String imageUrl;
public void setClerk(ClerkDTO clerkDTO) {
if (clerkDTO == null) {
return;
}
this.clerkId = clerkDTO.getClerkId();
this.clerkCode = clerkDTO.getClerkCode();
this.clerkName = clerkDTO.getClerkName();
this.imageUrl = clerkDTO.getImageUrl();
}
}
package com.gic.haoban.manage.web.vo.potential;
import com.gic.haoban.manage.web.vo.StoreClerkInfoVO;
import lombok.Data;
/**
* Created by wangzubo on 2025/3/22.
*/
@Data
public class RecommendConvDetailOverviewVO extends StoreClerkInfoVO {
/**
* 转化数据
*/
private RecommendConvOverviewVO conv;
}
package com.gic.haoban.manage.web.vo.potential;
import com.gic.haoban.manage.web.vo.StoreClerkIdVO;
import lombok.Data;
/**
* Created by wangzubo on 2025/3/22.
*/
@Data
public class RecommendConvOverviewVO extends StoreClerkIdVO {
/**
* 人货匹配商城转化人数
*/
private Integer matchingOnlineConvsMbrNum;
/**
* 人货匹配商城转化金额
*/
private Double matchingOnlineConvsAmt;
/**
* 人货匹配线下转化人数
*/
private Integer matchingOfflineConvsMbrNum;
/**
* 人货匹配线下转化金额
*/
private Double matchingOfflineConvsAmt;
/**
* 人货匹配商城转化人数(总览)
*/
private Integer matchingOnlineConvsMbrNumOverview;
/**
* 人货匹配商城转化金额(总览)
*/
private Double matchingOnlineConvsAmtOverview;
/**
* 人货匹配线下转化人数(总览)
*/
private Integer matchingOfflineConvsMbrNumOverview;
/**
* 人货匹配线下转化金额(总览)
*/
private Double matchingOfflineConvsAmtOverview;
}
package com.gic.haoban.manage.web.vo.potential;
import lombok.Data;
/**
* Created by wangzubo on 2025/3/22.
*/
@Data
public class RecommendConvTrendVO {
/**
* 人货匹配商城转化客户数
*/
private Integer matchingOnlineConvsMbrNum;
/**
* 人货匹配商城转化金额
*/
private Double matchingOnlineConvsAmt;
/**
* 人货匹配线下转化客户数
*/
private Integer matchingOfflineConvsMbrNum;
/**
* 人货匹配线下转化金额
*/
private Double matchingOfflineConvsAmt;
/**
* 人货匹配商城转化客户数(总览)
*/
private Integer matchingOnlineConvsMbrNumOverview;
/**
* 人货匹配商城转化金额(总览)
*/
private Double matchingOnlineConvsAmtOverview;
/**
* 人货匹配线下转化客户数(总览)
*/
private Integer matchingOfflineConvsMbrNumOverview;
/**
* 人货匹配线下转化金额(总览)
*/
private Double matchingOfflineConvsAmtOverview;
/**
* 日期
*/
private String bizDate;
}
package com.gic.haoban.manage.web.vo.potential;
import lombok.Data;
/**
* Created by wangzubo on 2025/3/22.
*/
@Data
public class RecommendOverviewVO {
/**
* 使用数据
*/
private RecommendUsedOverviewVO used;
/**
* 转化数据
*/
private RecommendConvOverviewVO conv;
}
package com.gic.haoban.manage.web.vo.potential;
import com.gic.haoban.manage.web.vo.StoreClerkInfoVO;
import lombok.Data;
/**
* Created by wangzubo on 2025/3/22.
*/
@Data
public class RecommendUsedDetailOverviewVO extends StoreClerkInfoVO {
/**
* 使用数据
*/
private RecommendUsedOverviewVO used;
}
package com.gic.haoban.manage.web.vo.potential;
import com.gic.haoban.manage.web.vo.StoreClerkIdVO;
import lombok.Data;
/**
* Created by wangzubo on 2025/3/22.
*/
@Data
public class RecommendUsedOverviewVO extends StoreClerkIdVO {
/**
* 人货匹配触达客户数
*/
private Integer matchingTouchMbrNum;
/**
* 人货匹配访问人数
*/
private Integer matchingReachClickMbrNum;
/**
* 人货匹配触达访问率
*/
private Double matchingCTR;
/**
* 人货匹配触达转化人数
*/
private Integer matchingTouchConvsMbrNum;
/**
* 人货匹配触达转化率
*/
private Double matchingConvsRate;
/**
* 人货匹配触达转化金额
*/
private Double matchingTouchConvsAmt;
}
package com.gic.haoban.manage.web.vo.potential;
import lombok.Data;
/**
* Created by wangzubo on 2025/3/22.
*/
@Data
public class RecommendUsedTrendVO {
/**
* 人货匹配触达客户数
*/
private Integer matchingTouchMbrNum;
/**
* 人货匹配访问人数
*/
private Integer matchingReachClickMbrNum;
/**
* 人货匹配触达访问率
*/
private Double matchingCTR;
/**
* 人货匹配触达转化人数
*/
private Integer matchingTouchConvsMbrNum;
/**
* 人货匹配触达转化率
*/
private Double matchingConvsRate;
/**
* 人货匹配触达转化金额
*/
private Double matchingTouchConvsAmt;
/**
* 日期
*/
private String bizDate;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment