package com.kiisoo.ic.customer.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.kiisoo.ic.customer.entity.*; import com.kiisoo.ic.customer.mapper.OpCustomerDOMapper; import com.kiisoo.ic.customer.mapper.OpVipDOMapper; import com.kiisoo.ic.domain.service.PrivilageDomainService; import com.kiisoo.ic.generalize.entity.PoiCustomerContactDataStat; import com.kiisoo.ic.generalize.mapper.PoiCustomerContactDataStatMapper; import com.kiisoo.ic.store.entity.PoiStore; import com.kiisoo.ic.store.mapper.PoiStoreDOMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** * @Description: 客户数据概览service * @Author: wangyinjia * @Date: 2020/4/9 * @Company: kiisoo * @Version: 1.0 */ @Slf4j @Service public class CustomerViewService { /**有效*/ static final Integer VALID = 1; static final Integer TEN = 10; /** * 用户权限mapper */ @Autowired private PrivilageDomainService privilageDomainService; /** * 店铺mapper */ @Autowired private PoiStoreDOMapper poiStoreDOMapper; /** * 客户mapper */ @Autowired private OpCustomerDOMapper opCustomerDOMapper; /** * 拉黑mapper */ @Autowired private PoiCustomerContactDataStatMapper poiCustomerContactDataStatMapper; /** * vip mapper */ @Autowired private OpVipDOMapper opVipDOMapper; /** * 客户概览main * @param userId 用户id * @param selectStartTime 选中开始时间 * @param selectEndTime 选中结束时间 * @param startTime 柱状图开始时间 * @param endTime 柱状图结束时间 * @return 客户概览VO */ public CustomerViewVO selectCustomerViewMain(Long userId, String selectStartTime, String selectEndTime, String startTime, String endTime){ CustomerViewVO customerViewVO = new CustomerViewVO(); //shopIds List shopIds = getShopIds(userId); if(CollectionUtils.isEmpty(shopIds)){ return customerViewVO; } //柱状图好友list List customerList = opCustomerDOMapper.selectCustomerList(shopIds, null, null, startTime, endTime); //好友总数 Long customerCount = opCustomerDOMapper.selectCustomerCount(shopIds, null, null, null); //好友总数(去重) Long validCustomerCount = opCustomerDOMapper.selectCustomerCount(shopIds, VALID, null, null); //删除拉黑数 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.in("store_id", shopIds).le("stat_time", selectEndTime).ge("stat_time", selectStartTime); Long validDeleteCustomerCount = poiCustomerContactDataStatMapper.selectList(wrapper).stream() .filter(contactDO -> contactDO.getNegativeFeedbackCnt() != null) .map(PoiCustomerContactDataStat::getNegativeFeedbackCnt).mapToLong(a -> a).sum(); //会员总数 Long vipCount = opVipDOMapper.selectVipCount(shopIds, null, null); //设置柱状图list List validCustomerList = customerList.stream().filter(customerDO -> VALID.equals(customerDO.getValidType())).collect(Collectors.toList()); customerViewVO.setCustomerList(customerList); customerViewVO.setValidCustomerList(validCustomerList); //设置新增好友,好友总数,拉黑数,vip人数,柱状图list等数据 setCustomerViewData(customerViewVO, customerCount, validCustomerCount, validDeleteCustomerCount, vipCount, customerList, validCustomerList, selectStartTime, selectEndTime); //前十名排行list等 List newCustimerList = customerList.stream().filter(customerDO -> filterCustomerByRegisterTime(customerDO, selectStartTime, selectEndTime)).collect(Collectors.toList()); List orgNewCustomerList = getOrgNewCustomerList(newCustimerList); List shopNewCustomerList = getShopNewCustomerList(newCustimerList); List zeroExtendList = getZeroExtendList(newCustimerList, shopIds); customerViewVO.setOrgNewCustomerList(orgNewCustomerList); customerViewVO.setShopNewCustomerList(shopNewCustomerList); customerViewVO.setZeroExtendList(zeroExtendList); return customerViewVO; } /** * shopIds * @param userId 用户id * @return shopIds */ List getShopIds(Long userId){ List shopIds = privilageDomainService.listUserDatePermission(userId); return shopIds; } /** * 新增好友,好友总数,拉黑数,vip人数,柱状图list等数据 * @param customerViewVO 客户概览VO * @param customerCount 好友总数 * @param validCustomerCount 好友总数(去重) * @param validDeleteCustomerCount 删除来黑数(累计去重) * @param vipCount 会员总数 * @param customerList 新增好友list * @param validCustomerList 新增好友(去重)list * @param selectStartTime 选中开始时间 * @param selectEndTime 选中结束时间 */ public void setCustomerViewData(CustomerViewVO customerViewVO, Long customerCount, Long validCustomerCount, Long validDeleteCustomerCount, Long vipCount, List customerList, List validCustomerList, String selectStartTime, String selectEndTime){ //新增好友 Long newCustomerCount = customerList.stream().filter(customerDO -> filterCustomerByRegisterTime(customerDO, selectStartTime, selectEndTime)).count(); customerViewVO.setNewCustomer(newCustomerCount); //新增好友(去重) Long newValidCustomerCount = validCustomerList.stream().filter(customerDO -> filterCustomerByRegisterTime(customerDO, selectStartTime, selectEndTime)).count(); customerViewVO.setNewValidCustomer(newValidCustomerCount); //好友总数 customerViewVO.setAllCustomer(customerCount); //好友总数(去重) customerViewVO.setAllValidCustomer(validCustomerCount); //删除拉黑数(累计去重) customerViewVO.setValidDeleteCustomer(validDeleteCustomerCount); //会员总数 customerViewVO.setAllVipCount(vipCount); } /** * 选中时间过滤客户 * @param customerDO 好友DO * @param selectStartTime 选中开始时间 * @param selectEndTime 选中结束时间 * @return true/false */ boolean filterCustomerByRegisterTime(OpCustomer customerDO, String selectStartTime, String selectEndTime){ Date registerDate = customerDO.getRegisterTime(); if(registerDate == null){ return false; } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { long startTime = sdf.parse(selectStartTime).getTime(); long endTime = sdf.parse(selectEndTime).getTime(); long registerTime = registerDate.getTime(); return startTime <= registerTime && endTime >= registerTime; }catch (Exception e){ log.error("格式化时间出错", e); return false; } } /** * 零售公司新增排行list * @param newCustimerList 新增好友list * @return 零售公司新增排行list */ List getOrgNewCustomerList(List newCustimerList){ List orgNewCustomerList = new ArrayList<>(); //店铺id-新增好友数map Map shopIdCountMap = newCustimerList.stream().collect(Collectors.groupingBy(OpCustomer::getShopId, Collectors.counting())); //店铺id→零售公司名称 List shopIds = newCustimerList.stream().map(OpCustomer::getShopId).collect(Collectors.toList()); if(CollectionUtils.isEmpty(shopIds)){ return orgNewCustomerList; } //公司id-公司店铺list map Map> orgShopListMap = opCustomerDOMapper.selectOrgByShopIds(shopIds).stream().distinct().collect(Collectors.groupingBy(CustomerViewShopVO::getOrgId)); //每个公司新增数 List tmpList = new ArrayList<>(); orgShopListMap.forEach((orgId,customerViewShopList) -> { CustomerViewCompanyVO orgViewDO = new CustomerViewCompanyVO(); orgViewDO.setOrgId(orgId); orgViewDO.setOrgName(customerViewShopList.get(0).getOrgName()); AtomicInteger newCustomerCount = new AtomicInteger(0); customerViewShopList.forEach(customerViewShopVO -> { Long shopId = customerViewShopVO.getShopId(); int tmpCount = shopIdCountMap.get(shopId) == null ? 0 : Math.toIntExact(shopIdCountMap.get(shopId)); newCustomerCount.updateAndGet(v -> v + tmpCount); }); orgViewDO.setNewCustomerCount(newCustomerCount.get()); tmpList.add(orgViewDO); }); //排序 orgNewCustomerList = tmpList.stream().sorted(Comparator.comparing(CustomerViewCompanyVO::getNewCustomerCount).reversed()).limit(TEN).collect(Collectors.toList()); return orgNewCustomerList; } /** * 店铺新增排行list * @param newCustimerList 新增好友list * @return 店铺新增排行list */ List getShopNewCustomerList(List newCustimerList){ //店铺分组 Map> shopIdMap = newCustimerList.stream().collect(Collectors.groupingBy(OpCustomer::getShopId)); List shopViewList = new ArrayList<>(); shopIdMap.forEach((k,v) -> { CustomerViewShopVO shopVO = new CustomerViewShopVO(); shopVO.setShopId(k); shopVO.setNewCustomerCount(v.size()); PoiStore shopDO = poiStoreDOMapper.selectById(k); if(shopDO != null){ shopVO.setShopName(shopDO.getName()); } shopViewList.add(shopVO); }); //排序 List shopNewCustomerList = shopViewList.stream().sorted(Comparator.comparing(CustomerViewShopVO::getNewCustomerCount).reversed()).limit(TEN).collect(Collectors.toList()); return shopNewCustomerList; } /** * 零推广list * @param newCustimerList 新增好友list * @param shopIds 管辖店铺ids * @return 零推广list */ List getZeroExtendList(List newCustimerList, List shopIds){ List zeroExtendList = new ArrayList<>(); //有推广的店铺ids List notZeroShopIds = newCustimerList.stream().map(OpCustomer::getShopId).distinct().collect(Collectors.toList()); //公司id-公司店铺list map Map> orgShopListMap = opCustomerDOMapper.selectOrgByShopIds(shopIds).stream().distinct().collect(Collectors.groupingBy(CustomerViewShopVO::getOrgId)); List tmpZeroExtendList = new ArrayList<>(); orgShopListMap.forEach((orgId, orgShopRelationList) -> { List tmpShopIds = orgShopRelationList.stream().map(CustomerViewShopVO::getShopId).distinct().collect(Collectors.toList()); int tmpShopCount = tmpShopIds.size(); CustomerViewZeroExtendVO zeroExtendVO = new CustomerViewZeroExtendVO(); zeroExtendVO.setOrgId(orgId); zeroExtendVO.setOrgName(orgShopRelationList.get(0).getOrgName()); zeroExtendVO.setAllShopCount(tmpShopCount); //推广的店铺 tmpShopIds.retainAll(notZeroShopIds); zeroExtendVO.setZeroShopCount(tmpShopCount - tmpShopIds.size()); tmpZeroExtendList.add(zeroExtendVO); }); zeroExtendList = tmpZeroExtendList.stream().filter(zeroExtendDO -> zeroExtendDO.getZeroShopCount() > 0).collect(Collectors.toList()); return zeroExtendList; } }