You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

428 lines
20 KiB
Java

6 years ago
package com.kiisoo.ic.generalize.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
6 years ago
import com.github.pagehelper.Page;
6 years ago
import com.github.pagehelper.PageHelper;
import com.kiisoo.ic.customer.entity.OpSellerCustomerRelation;
import com.kiisoo.ic.customer.mapper.OpSellerCustomerRelationDOMapper;
6 years ago
import com.kiisoo.ic.generalize.bean.*;
import com.kiisoo.ic.generalize.entity.CompanyStoreDO;
import com.kiisoo.ic.generalize.entity.PoiCustomerContactDataStat;
import com.kiisoo.ic.generalize.entity.PrivilageOrganizational;
import com.kiisoo.ic.generalize.entity.PrivilageOrganizationalMember;
6 years ago
import com.kiisoo.ic.generalize.mapper.OrganizationalMemberMapper;
import com.kiisoo.ic.generalize.mapper.PoiCustomerContactDataStatMapper;
import com.kiisoo.ic.generalize.mapper.RetailCompanyMapper;
import com.kiisoo.ic.store.entity.PoiStore;
6 years ago
import com.kiisoo.ic.store.entity.PoiStoreStaff;
6 years ago
import com.kiisoo.ic.store.mapper.PoiStoreDOMapper;
6 years ago
import com.kiisoo.ic.store.mapper.PoiStoreStaffDOMapper;
6 years ago
import com.kiisoo.ic.system.entity.PrivilageUserDO;
import com.kiisoo.ic.system.mapper.PrivilageUserDOMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
6 years ago
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
6 years ago
import java.util.*;
6 years ago
import java.util.stream.Collectors;
/**
* @ClassName: RetailCompanyService
* @Description:
* @Auther: Caps
* @Date: 2020/4/15 0015 11:08
* @Version:
*/
@Service
public class RetailCompanyService {
private RetailCompanyMapper retailCompanyMapper;
private OrganizationalMemberMapper organizationalMemberMapper;
private OpSellerCustomerRelationDOMapper opSellerCustomerRelationDOMapper;
private PoiCustomerContactDataStatMapper poiCustomerContactDataStatMapper;
private PoiStoreDOMapper poiStoreDOMapper;
private PrivilageUserDOMapper privilageUserDOMapper;
6 years ago
private PoiStoreStaffDOMapper poiStoreStaffDOMapper;
6 years ago
@Autowired
6 years ago
public RetailCompanyService(RetailCompanyMapper retailCompanyMapper,OrganizationalMemberMapper organizationalMemberMapper,OpSellerCustomerRelationDOMapper opSellerCustomerRelationDOMapper,PoiCustomerContactDataStatMapper poiCustomerContactDataStatMapper,PoiStoreDOMapper poiStoreDOMapper,PrivilageUserDOMapper privilageUserDOMapper,PoiStoreStaffDOMapper poiStoreStaffDOMapper){
6 years ago
this.retailCompanyMapper = retailCompanyMapper;
this.organizationalMemberMapper = organizationalMemberMapper;
this.opSellerCustomerRelationDOMapper = opSellerCustomerRelationDOMapper;
this.poiCustomerContactDataStatMapper = poiCustomerContactDataStatMapper;
this.poiStoreDOMapper = poiStoreDOMapper;
this.privilageUserDOMapper = privilageUserDOMapper;
6 years ago
this.poiStoreStaffDOMapper = poiStoreStaffDOMapper;
6 years ago
}
6 years ago
/**
*
* @param parentId id
6 years ago
* @param userId id
* @param level
* @return
*/
public List<PrivilageOrganizational> getUserOrg(Long parentId, long userId, int level){
6 years ago
QueryWrapper<PrivilageOrganizationalMember> wrapper1 = new QueryWrapper<>();
wrapper1.eq("user_id",userId);
PrivilageOrganizational p = new PrivilageOrganizational();
List<PrivilageOrganizationalMember> pm = organizationalMemberMapper.selectList(wrapper1);
QueryWrapper<PrivilageOrganizational> wrapper = new QueryWrapper<>();
if(pm.isEmpty()) {
return null;
}else {
wrapper.eq("type", 1).eq("status", 1).eq("level",level).
in("id", pm.stream().map(PrivilageOrganizationalMember::getOrgId).
collect(Collectors.toList()));
if(null != parentId){
wrapper.eq("parent_id",parentId);
6 years ago
}
return retailCompanyMapper.selectList(wrapper);
}
}
6 years ago
/**
*
*/
public List<PrivilageOrganizational> listOfRetailCompany(long userId){
QueryWrapper<PrivilageOrganizationalMember> wrapper1 = new QueryWrapper<>();
wrapper1.eq("user_id",userId);
List<PrivilageOrganizationalMember> pm = organizationalMemberMapper.selectList(wrapper1);
QueryWrapper<PrivilageOrganizational> wrapper = new QueryWrapper<>();
if(pm.isEmpty()) {
return null;
}else {
wrapper.eq("type", 1).eq("status", 1).in("id", pm.stream().map(PrivilageOrganizationalMember::getOrgId).collect(Collectors.toList()));
return retailCompanyMapper.selectList(wrapper);
}
}
/**
*
* @param orgId id
* @return
*/
public List<PoiStore> selectShopByCompany(long orgId){
return poiStoreDOMapper.selectShopByCompany(orgId);
}
/**
*
* @param shopId id
* @return
*/
public List<PrivilageUserDO> selectSellerByShop(long shopId){
return poiStoreDOMapper.selectSellerByShop(shopId);
}
/**
* 广
6 years ago
* @param startTime
* @param endTime
6 years ago
* @param orgId
* @return 广
*/
6 years ago
public OrganizationVO generalizeOfRetail(String startTime,String endTime,Long orgId,int pageNum,int pageSize){
6 years ago
//零售公司信息
QueryWrapper<PrivilageOrganizational> wrapper = new QueryWrapper<>();
wrapper.eq("type",1).eq("status",1);
if(orgId != null){
wrapper.eq("id",orgId);
}
PageHelper.startPage(pageNum, pageSize);
List<PrivilageOrganizational> listOfOrg = retailCompanyMapper.selectList(wrapper);
List<RetailOrganizationalVO> list = new ArrayList<>();
listOfOrg.forEach(org -> {
6 years ago
RetailOrganizationalVO organizationalVO = new RetailOrganizationalVO();
organizationalVO.setRetailCompany(org.getName());
//查询零售公司的门店
List<PoiStore> list1 = selectShopByCompany(org.getId());
List<Long> stores = list1.stream().map(PoiStore::getId).collect(Collectors.toList());
6 years ago
//组织成员
QueryWrapper<PrivilageOrganizationalMember> wrapper1 = new QueryWrapper<>();
wrapper1.eq("org_id",org.getId());
List<PrivilageOrganizationalMember> memberList = organizationalMemberMapper.selectList(wrapper1);
//组织成员的客户个数
QueryWrapper<OpSellerCustomerRelation> wrapper2 = new QueryWrapper<>();
wrapper2.in("user_id",memberList.stream().map(PrivilageOrganizationalMember::getUserId).collect(Collectors.toList()));
List<OpSellerCustomerRelation> opRelations = opSellerCustomerRelationDOMapper.selectList(wrapper2);
long count = opRelations.stream().map(OpSellerCustomerRelation::getCustomerId).distinct().count();
6 years ago
organizationalVO.setAllCustomer((int) count);
//组织成员的客户有效个数
QueryWrapper<OpSellerCustomerRelation> wrapper4 = new QueryWrapper<>();
wrapper4.in("user_id",memberList.stream().map(PrivilageOrganizationalMember::getUserId).collect(Collectors.toList()));
wrapper4.eq("type",1);
6 years ago
List<OpSellerCustomerRelation> opRelations1 = opSellerCustomerRelationDOMapper.selectList(wrapper4);
long countAble = opRelations1.stream().map(OpSellerCustomerRelation::getCustomerId).distinct().count();
organizationalVO.setEffectiveCustomer((int) countAble);
//计算新增客户数据
newCustomerUser(startTime,endTime,organizationalVO,memberList.stream().map(PrivilageOrganizationalMember::getUserId).collect(Collectors.toList()));
6 years ago
//被拉黑的客户数
QueryWrapper<PoiCustomerContactDataStat> wrapper3 = new QueryWrapper<>();
if(stores.isEmpty()){
stores.add(-1L);
}
wrapper3.in("store_id",stores);
List<PoiCustomerContactDataStat> dataStats = poiCustomerContactDataStatMapper.selectList(wrapper3);
long allAge = dataStats.stream().mapToLong(PoiCustomerContactDataStat::getNegativeFeedbackCnt).sum();
organizationalVO.setDelCustomer((int) allAge);
6 years ago
organizationalVO.setDelRate(check(allAge,count));
6 years ago
list.add(organizationalVO);
});
6 years ago
OrganizationVO vo = new OrganizationVO();
//总条数
if (listOfOrg.size() > 0) {
vo.setDataVOS(list);
Page<PrivilageOrganizational> pageList = (Page<PrivilageOrganizational>) listOfOrg;
long totalSize = pageList.getTotal();
vo.setSizeNum(totalSize);
} else {
return new OrganizationVO();
}
return vo;
6 years ago
}
6 years ago
/**
*
* @param startTime
* @param endTime
* @param organizationalVO
*/
private void newCustomerUser(String startTime, String endTime, DataVO organizationalVO, List<Long> userIds){
//最初时间的总客户人数
QueryWrapper<OpSellerCustomerRelation> wrapper2 = new QueryWrapper<>();
wrapper2.in("user_id",userIds);
wrapper2.lt("create_time",startTime);
List<OpSellerCustomerRelation> opRelations = opSellerCustomerRelationDOMapper.selectList(wrapper2);
long count = opRelations.stream().map(OpSellerCustomerRelation::getCustomerId).distinct().count();
//最初时间的有效总客户人数
wrapper2.in("user_id",userIds);
wrapper2.eq("type",1);
6 years ago
wrapper2.lt("create_time",startTime);
List<OpSellerCustomerRelation> opRelations2 = opSellerCustomerRelationDOMapper.selectList(wrapper2);
long count2 = opRelations2.stream().map(OpSellerCustomerRelation::getCustomerId).distinct().count();
//最后时间的总客户人数
QueryWrapper<OpSellerCustomerRelation> wrapper3 = new QueryWrapper<>();
wrapper3.in("user_id",userIds);
wrapper3.lt("create_time",endTime);
List<OpSellerCustomerRelation> opRelationsEnd = opSellerCustomerRelationDOMapper.selectList(wrapper3);
long countEnd = opRelationsEnd.stream().map(OpSellerCustomerRelation::getCustomerId).distinct().count();
//最后时间的有效总客户人数
wrapper3.in("user_id",userIds);
wrapper3.eq("type",1);
6 years ago
wrapper3.lt("create_time",endTime);
List<OpSellerCustomerRelation> opRelationsEnd2 = opSellerCustomerRelationDOMapper.selectList(wrapper3);
long countEnd2 = opRelationsEnd2.stream().map(OpSellerCustomerRelation::getCustomerId).distinct().count();
//计算两个时间间隔用于计算平均值
LocalDate start = LocalDate.parse(startTime);
LocalDate end = LocalDate.parse(endTime);
long days = end.until(start, ChronoUnit.DAYS);
organizationalVO.setNewCustomer((int) (countEnd - count));
organizationalVO.setNewEffectiveCustomer((int) (countEnd2 - count2));
organizationalVO.setAvgNewCustomer(check(countEnd - count,days));
organizationalVO.setAvgNewEffectiveCustomer(check(countEnd2 - count2,days));
}
private void newCustomerStore(String startTime, String endTime, DataVO organizationalVO, List<Long> storeIds){
//最初时间的总客户人数
QueryWrapper<OpSellerCustomerRelation> wrapper2 = new QueryWrapper<>();
wrapper2.in("store_id",storeIds);
wrapper2.lt("create_time",startTime);
List<OpSellerCustomerRelation> opRelations = opSellerCustomerRelationDOMapper.selectList(wrapper2);
long count = opRelations.stream().map(OpSellerCustomerRelation::getCustomerId).distinct().count();
//最初时间的有效总客户人数
wrapper2.in("store_id",storeIds);
wrapper2.eq("type",1);
6 years ago
wrapper2.lt("create_time",startTime);
List<OpSellerCustomerRelation> opRelations2 = opSellerCustomerRelationDOMapper.selectList(wrapper2);
long count2 = opRelations2.stream().map(OpSellerCustomerRelation::getCustomerId).distinct().count();
//最后时间的总客户人数
QueryWrapper<OpSellerCustomerRelation> wrapper3 = new QueryWrapper<>();
wrapper3.in("store_id",storeIds);
wrapper3.lt("create_time",endTime);
List<OpSellerCustomerRelation> opRelationsEnd = opSellerCustomerRelationDOMapper.selectList(wrapper3);
long countEnd = opRelationsEnd.stream().map(OpSellerCustomerRelation::getCustomerId).distinct().count();
//最后时间的有效总客户人数
wrapper3.in("store_id",storeIds);
wrapper3.eq("type",1);
6 years ago
wrapper3.lt("create_time",endTime);
List<OpSellerCustomerRelation> opRelationsEnd2 = opSellerCustomerRelationDOMapper.selectList(wrapper3);
long countEnd2 = opRelationsEnd2.stream().map(OpSellerCustomerRelation::getCustomerId).distinct().count();
//计算两个时间间隔用于计算平均值
LocalDate start = LocalDate.parse(startTime);
LocalDate end = LocalDate.parse(endTime);
long days = end.until(start, ChronoUnit.DAYS);
organizationalVO.setNewCustomer((int) (countEnd - count));
organizationalVO.setNewEffectiveCustomer((int) (countEnd2 - count2));
organizationalVO.setAvgNewCustomer(check(countEnd - count,days));
organizationalVO.setAvgNewEffectiveCustomer(check(countEnd2 - count2,days));
}
/**
*
* @param l1
* @param l2
* @return
*/
public Integer check(Long l1,Long l2){
if(l2 == null || l1 == null || l2 == 0){
return 0;
}else {
return Math.round((l1 / l2) * 100);
}
}
6 years ago
/**
* 广
6 years ago
* @param startTime
* @param endTime
6 years ago
* @param orgId id
* @param shopId id
* @param pageNum
* @param pageSize
* @return 广
*/
6 years ago
public OrganizationVO generalizeOfStore(String startTime, String endTime, Long orgId, Long shopId, int pageNum, int pageSize){
6 years ago
//根据零售公司查询门店
PageHelper.startPage(pageNum, pageSize);
6 years ago
List<CompanyStoreDO> list = retailCompanyMapper.selectShopIdByRetail(orgId,shopId);
6 years ago
List<StoreOrganizationalVO> list1 = new ArrayList<>();
list.forEach(li -> {
6 years ago
StoreOrganizationalVO storeOrganizationalVO = new StoreOrganizationalVO();
6 years ago
//查询所有的客户
QueryWrapper<OpSellerCustomerRelation> wrapper = new QueryWrapper<>();
6 years ago
wrapper.eq("store_id",li.getShopId());
6 years ago
long count = opSellerCustomerRelationDOMapper.selectCount(wrapper);
6 years ago
//查询所有的有效客户
QueryWrapper<OpSellerCustomerRelation> wrapper2 = new QueryWrapper<>();
wrapper2.eq("store_id",li.getShopId());
wrapper2.eq("type",1);
6 years ago
long countAble = opSellerCustomerRelationDOMapper.selectCount(wrapper2);
//计算新客户数据
newCustomerStore(startTime,endTime,storeOrganizationalVO, Collections.singletonList(li.getShopId()));
//查询店铺的名称
PoiStore poiStore = poiStoreDOMapper.selectById(li.getShopId());
6 years ago
//被拉黑的客户数
QueryWrapper<PoiCustomerContactDataStat> wrapper3 = new QueryWrapper<>();
6 years ago
wrapper3.eq("store_id",li.getShopId());
6 years ago
List<PoiCustomerContactDataStat> dataStats = poiCustomerContactDataStatMapper.selectList(wrapper3);
long allAge = dataStats.stream().mapToLong(PoiCustomerContactDataStat::getNegativeFeedbackCnt).sum();
6 years ago
storeOrganizationalVO.setShopName(poiStore == null ? null : poiStore.getName());
storeOrganizationalVO.setShopCode(poiStore == null ? null : poiStore.getCode());
6 years ago
storeOrganizationalVO.setAllCustomer((int) count);
6 years ago
storeOrganizationalVO.setEffectiveCustomer((int) countAble);
6 years ago
storeOrganizationalVO.setDelCustomer((int) allAge);
6 years ago
storeOrganizationalVO.setCompanyName(li.getCompanyName());
6 years ago
storeOrganizationalVO.setDelRate(check(allAge,count));
6 years ago
list1.add(storeOrganizationalVO);
});
6 years ago
OrganizationVO vo = new OrganizationVO();
//总条数
if (list.size() > 0) {
vo.setDataVOS(list1);
Page<CompanyStoreDO> pageList = (Page<CompanyStoreDO>) list;
long totalSize = pageList.getTotal();
vo.setSizeNum(totalSize);
} else {
return new OrganizationVO();
}
return vo;
6 years ago
}
/**
* 广
6 years ago
* @param startTime
* @param endTime
6 years ago
* @param orgId id
* @param shopId id
* @param sellerId id
* @param pageNum
* @param pageSize
* @return 广
*/
6 years ago
public OrganizationVO generalizeOfSeller(String startTime, String endTime, Long orgId, Long shopId,Long sellerId, int pageNum, int pageSize){
6 years ago
//根据零售公司查询门店
PageHelper.startPage(pageNum, pageSize);
List<Long> sellerIds = retailCompanyMapper.selectSellerIdsByShop(orgId,shopId,sellerId);
List<SellerOrganizationalVO> list = new ArrayList<>();
sellerIds.forEach(seller -> {
6 years ago
SellerOrganizationalVO sellerOrganizationalVO = new SellerOrganizationalVO();
6 years ago
//查询所有的客户
QueryWrapper<OpSellerCustomerRelation> wrapper = new QueryWrapper<>();
wrapper.eq("user_id",seller);
long count = opSellerCustomerRelationDOMapper.selectCount(wrapper);
//查询导购信息
PrivilageUserDO privilageUserDO = privilageUserDOMapper.selectById(seller);
6 years ago
QueryWrapper<PoiStoreStaff> wrapper1 = new QueryWrapper<>();
wrapper1.eq("user_id",seller).last("limit 1");
PoiStoreStaff poiStoreStaff = poiStoreStaffDOMapper.selectOne(wrapper1);
//计算新客户数据
newCustomerUser(startTime,endTime,sellerOrganizationalVO, Collections.singletonList(seller));
6 years ago
//查询导购所属公司门店
CompanyStoreDO companyStoreDO = poiStoreDOMapper.selectCompanyStore(seller);
6 years ago
sellerOrganizationalVO.setShopName(companyStoreDO == null ? null : companyStoreDO.getShopName());
6 years ago
sellerOrganizationalVO.setShopCode(companyStoreDO == null ? null : companyStoreDO.getShopCode());
sellerOrganizationalVO.setSellerCode(poiStoreStaff == null ? null : poiStoreStaff.getStaffCode());
6 years ago
sellerOrganizationalVO.setCompanyName(companyStoreDO == null ? null : companyStoreDO.getCompanyName());
6 years ago
sellerOrganizationalVO.setSellerName(privilageUserDO.getName());
sellerOrganizationalVO.setAllCustomer((int) count);
list.add(sellerOrganizationalVO);
});
6 years ago
OrganizationVO vo = new OrganizationVO();
//总条数
if (sellerIds.size() > 0) {
vo.setDataVOS(list);
Page<Long> pageList = (Page<Long>) sellerIds;
long totalSize = pageList.getTotal();
vo.setSizeNum(totalSize);
} else {
return new OrganizationVO();
}
return vo;
6 years ago
}
6 years ago
/**
*
*/
public Set<Long> getMinCompany(Set<Long> companys){
Set<Long> minest = new HashSet<>();
Set<Long> listOfOrg = retailCompanyMapper.selectChildList(companys);
//增加最小公司
if(listOfOrg.size() > 0){
companys.removeAll(listOfOrg);
minest.addAll(getMinCompany(companys));
}else{
minest.addAll(companys);
}
return minest;
}
6 years ago
}