package com.kiisoo.ic.customer.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.kiisoo.ic.customer.bean.OpCustomerDTO; 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.entity.PrivilageOrganizational; import com.kiisoo.ic.generalize.mapper.PoiCustomerContactDataStatMapper; import com.kiisoo.ic.generalize.mapper.RetailCompanyMapper; import com.kiisoo.ic.generalize.service.RetailCompanyService; 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; @Autowired private RetailCompanyService retailCompanyService; /** * 用户权限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; /** * 组织mapper */ @Autowired private RetailCompanyMapper retailCompanyMapper; /** * 客户概览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) .sorted(Comparator.comparing(CustomerViewZeroExtendVO::getZeroShopCount).reversed()) .limit(TEN).collect(Collectors.toList()); return zeroExtendList; } /** * 零推广list * @param newCustimerList 新增好友list * @param shopIds 管辖店铺ids * @return 零推广list */ List getZeroExtendList2(List newCustimerList, List shopIds, int pageNum, int pageSize){ //有推广的店铺ids List notZeroShopIds = newCustimerList.stream().map(OpCustomer::getShopId).distinct().collect(Collectors.toList()); //无推广id shopIds.removeAll(notZeroShopIds); PageHelper.startPage(pageNum,pageSize); List list = opCustomerDOMapper.selectOrgInfoByShopIds(shopIds); //区域,公司信息 getShopRegionInfo(list); AtomicInteger number = new AtomicInteger(1 + ((pageNum-1) * pageSize)); //求分页总数 Page pageList = (Page)list; Long totalSize = pageList.getTotal(); list.forEach(item -> { item.setTotalSize(totalSize); item.setNumb(0); item.setNumber(number.get()); number.incrementAndGet(); }); return list; } /** * 找到推广为0 * @param regionId 大区id * @param companyId 公司id * @param customerId 客户id * @param startTime 开始时间 * @param endTime 结束时间 * @return */ public List zeroExtendList(long userId, Long regionId , Long companyId, Long customerId, String startTime, String endTime, int pageNum, int pageSize){ Set shopIds; //根据店铺查询所有扫码客户信息 if(customerId != null){ shopIds = getCompanyShop(customerId, userId); }else if(companyId != null){ shopIds = getCompanyShop(companyId, userId); } else if(regionId != null){ shopIds = getCompanyShop(regionId, userId); }else{ //查询用户权限店铺 shopIds = new HashSet<>(privilageDomainService.listUserDatePermission(userId)); } if(CollectionUtils.isEmpty(shopIds)){ return new ArrayList<>(); } //柱状图好友list List customerList = opCustomerDOMapper.selectCustomerList(new ArrayList<>(shopIds), null, null, startTime, endTime); List zeroExtendList = getZeroExtendList2(customerList, new ArrayList<>(shopIds),pageNum,pageSize); return zeroExtendList; } public Set getCompanyShop(Long companyId, long userId){ //找到最小公司 Set param = new HashSet<>(); param.add(companyId); Set minCompany = new HashSet<>(); retailCompanyService.getMinCompany(param,minCompany); //找到公司店铺 List shops = new ArrayList<>(); minCompany.forEach(item -> { shops.addAll(retailCompanyService.selectShopByCompany(item)); }); //公司店铺和权限做交集 Set shopIds = shops.stream().map(p -> p.getId()).collect(Collectors.toSet()); List userAllShops = privilageDomainService.listUserDatePermission(userId); shopIds.retainAll(userAllShops); return shopIds; } /** * 零推广店铺区域信息 * @param shopList 店铺list */ public void getShopRegionInfo(List shopList){ if(shopList.size() == 0){ return; } //零售公司信息 List orgIds = shopList.stream().map(CustomerViewZeroExtendVO::getParentId).collect(Collectors.toList()); if(orgIds.size() == 0){ return; } QueryWrapper orgWrapper = new QueryWrapper<>(); orgWrapper.in("id", orgIds); List companyList = retailCompanyMapper.selectList(orgWrapper); shopList.forEach(zeroExtendVO -> { Long companyId = zeroExtendVO.getParentId(); List tmpCompanyList = companyList.stream().filter(companyDO -> companyDO.getId().equals(companyId)).collect(Collectors.toList()); if(tmpCompanyList.size() > 0){ zeroExtendVO.setRegionId(tmpCompanyList.get(0).getParentId()); zeroExtendVO.setCompany(tmpCompanyList.get(0).getName()); } }); //区域信息 List regionIds = companyList.stream().map(PrivilageOrganizational::getParentId).collect(Collectors.toList()); if(regionIds.size() == 0){ return; } QueryWrapper regionWrapper = new QueryWrapper<>(); regionWrapper.in("id", regionIds); List regionList = retailCompanyMapper.selectList(regionWrapper); shopList.forEach(zeroExtendVO -> { Long regionId = zeroExtendVO.getRegionId(); //区域 List tmpRegionList = regionList.stream().filter(regionDO -> regionDO.getId().equals(regionId)).collect(Collectors.toList()); if(tmpRegionList.size() > 0){ zeroExtendVO.setRegion(tmpRegionList.get(0).getName()); } }); } }