From cdb15a30dd95988bc8be4e9bf5a76cee09667091 Mon Sep 17 00:00:00 2001 From: wyj2080 <1603068044@qq.com> Date: Thu, 9 Apr 2020 20:46:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E6=95=B0=E6=8D=AE=E6=A6=82?= =?UTF-8?q?=E8=A7=88=E5=90=8E=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CustomerViewController.java | 58 ++++++ .../ic/customer/entity/CustomerViewVO.java | 38 ++++ .../kiisoo/ic/customer/entity/OpCustomer.java | 6 + .../com/kiisoo/ic/customer/entity/OpVip.java | 10 + .../customer/mapper/OpCustomerDOMapper.java | 7 + .../ic/customer/mapper/OpVipDOMapper.java | 10 +- .../customer/service/CustomerViewService.java | 193 ++++++++++++++++++ .../resources/mapper/OpCustomerDOMapper.xml | 26 +++ src/main/resources/mapper/OpVipDOMapper.xml | 24 +++ 9 files changed, 370 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/kiisoo/ic/customer/controller/CustomerViewController.java create mode 100644 src/main/java/com/kiisoo/ic/customer/entity/CustomerViewVO.java create mode 100644 src/main/java/com/kiisoo/ic/customer/service/CustomerViewService.java create mode 100644 src/main/resources/mapper/OpVipDOMapper.xml diff --git a/src/main/java/com/kiisoo/ic/customer/controller/CustomerViewController.java b/src/main/java/com/kiisoo/ic/customer/controller/CustomerViewController.java new file mode 100644 index 0000000..43687b1 --- /dev/null +++ b/src/main/java/com/kiisoo/ic/customer/controller/CustomerViewController.java @@ -0,0 +1,58 @@ +package com.kiisoo.ic.customer.controller; + +import com.kiisoo.ic.common.BaseController; +import com.kiisoo.ic.customer.entity.CustomerViewVO; +import com.kiisoo.ic.customer.service.CustomerViewService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Map; + +/** + * @Description: 客户数据概览 + * @Author: wangyinjia + * @Date: 2020/4/9 + * @Company: kiisoo + * @Version: 1.0 + */ +@Slf4j +@Controller +@RequestMapping("/customer/view") +public class CustomerViewController extends BaseController { + + /** + * 客户数据概览service + */ + @Autowired + private CustomerViewService customerViewService; + + /** + * 客户概览main + * @param userId 用户id + * @param regionId 区域id + * @param shopId 店铺id + * @param sellerId 导购id + * @param sevenDayStartTime 近七天开始时间 + * @param sevenDayEndTime 近七天结束时间 + * @return 客户概览VO + */ + @ResponseBody + @RequestMapping(value = "/main", method = RequestMethod.GET) + public Map getMainData(@RequestParam("userId")Long userId, Long regionId, Long shopId, Long sellerId, + @RequestParam("sevenDayStartTime")String sevenDayStartTime, @RequestParam("sevenDayEndTime")String sevenDayEndTime){ + try{ + CustomerViewVO result = customerViewService.selectCustomerViewMain(userId, regionId, shopId, sellerId, sevenDayStartTime, sevenDayEndTime); + return data(result); + }catch (Exception e){ + log.error("查询客户数据概览出错", e); + return fail(); + } + } + + +} diff --git a/src/main/java/com/kiisoo/ic/customer/entity/CustomerViewVO.java b/src/main/java/com/kiisoo/ic/customer/entity/CustomerViewVO.java new file mode 100644 index 0000000..177d109 --- /dev/null +++ b/src/main/java/com/kiisoo/ic/customer/entity/CustomerViewVO.java @@ -0,0 +1,38 @@ +package com.kiisoo.ic.customer.entity; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: 客户概览VO + * @Author: wangyinjia + * @Date: 2020/4/9 + * @Company: kiisoo + * @Version: 1.0 + */ +@Data +public class CustomerViewVO { + /**未关联的客户*/ + private Long customer; + /**已关联人数*/ + private Long common; + /**未关联的会员*/ + private Long vip; + /**近七天新增客户list*/ + List sevenDayCustomerList; + /**近七天新增会员list*/ + List sevenDayVipList; + + /** + * 初始化 + */ + public CustomerViewVO(){ + customer = 0L; + common = 0L; + vip = 0L; + sevenDayCustomerList = new ArrayList<>(); + sevenDayVipList = new ArrayList<>(); + } +} diff --git a/src/main/java/com/kiisoo/ic/customer/entity/OpCustomer.java b/src/main/java/com/kiisoo/ic/customer/entity/OpCustomer.java index 81fbbc4..b35d009 100644 --- a/src/main/java/com/kiisoo/ic/customer/entity/OpCustomer.java +++ b/src/main/java/com/kiisoo/ic/customer/entity/OpCustomer.java @@ -98,4 +98,10 @@ public class OpCustomer { */ private String updateBy; + /** + * 注册时间 + */ + @TableField(exist = false) + private Date registerTime; + } diff --git a/src/main/java/com/kiisoo/ic/customer/entity/OpVip.java b/src/main/java/com/kiisoo/ic/customer/entity/OpVip.java index 3857c80..5a99c6b 100644 --- a/src/main/java/com/kiisoo/ic/customer/entity/OpVip.java +++ b/src/main/java/com/kiisoo/ic/customer/entity/OpVip.java @@ -1,6 +1,7 @@ package com.kiisoo.ic.customer.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -56,6 +57,11 @@ public class OpVip { */ private String mail; + /** + * 注册时间 + */ + private Date registerTime; + /** * 创建时间 */ @@ -76,4 +82,8 @@ public class OpVip { */ private String updateBy; + /**注册店铺id*/ + @TableField(exist = false) + private Long shopId; + } diff --git a/src/main/java/com/kiisoo/ic/customer/mapper/OpCustomerDOMapper.java b/src/main/java/com/kiisoo/ic/customer/mapper/OpCustomerDOMapper.java index 3b03535..65b6fda 100644 --- a/src/main/java/com/kiisoo/ic/customer/mapper/OpCustomerDOMapper.java +++ b/src/main/java/com/kiisoo/ic/customer/mapper/OpCustomerDOMapper.java @@ -34,4 +34,11 @@ public interface OpCustomerDOMapper extends BaseMapper { * @return */ List selectCustomerInfoBySellerId(@Param("sellerId") long sellerId, @Param("startDate") Date startDate,@Param("endDate") Date endDate); + + /** + * 客户list + */ + List selectCustomerList(@Param("shopIds") List shopIds, @Param("sellerId") Long sellerId, @Param("memberId") Long memberId, @Param("startDate") Date startDate, @Param("endDate") Date endDate); + + } diff --git a/src/main/java/com/kiisoo/ic/customer/mapper/OpVipDOMapper.java b/src/main/java/com/kiisoo/ic/customer/mapper/OpVipDOMapper.java index f8d0696..8ab4158 100644 --- a/src/main/java/com/kiisoo/ic/customer/mapper/OpVipDOMapper.java +++ b/src/main/java/com/kiisoo/ic/customer/mapper/OpVipDOMapper.java @@ -2,13 +2,19 @@ package com.kiisoo.ic.customer.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.kiisoo.ic.customer.entity.OpVip; -import com.kiisoo.ic.customer.entity.OpVipAttr; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; +import java.util.Date; +import java.util.List; + /** * 客户vip */ @Repository public interface OpVipDOMapper extends BaseMapper { - + /** + * 会员list + */ + List selectVipList(@Param("shopIds") List shopIds, @Param("startDate") Date startDate, @Param("endDate") Date endDate); } diff --git a/src/main/java/com/kiisoo/ic/customer/service/CustomerViewService.java b/src/main/java/com/kiisoo/ic/customer/service/CustomerViewService.java new file mode 100644 index 0000000..5b2e647 --- /dev/null +++ b/src/main/java/com/kiisoo/ic/customer/service/CustomerViewService.java @@ -0,0 +1,193 @@ +package com.kiisoo.ic.customer.service; + +import com.kiisoo.ic.customer.entity.CustomerViewVO; +import com.kiisoo.ic.customer.entity.OpCustomer; +import com.kiisoo.ic.customer.entity.OpVip; +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.store.entity.PoiStore; +import com.kiisoo.ic.store.service.PoiStoreService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; +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 Long ZERO_L= 0L; + + /** + * 用户权限mapper + */ + @Autowired + private PrivilageDomainService privilageDomainService; + + /** + * 店铺mapper + */ + @Autowired + private PoiStoreService poiStoreService; + + /** + * 客户mapper + */ + @Autowired + private OpCustomerDOMapper opCustomerDOMapper; + + /** + * vip mapper + */ + @Autowired + private OpVipDOMapper opVipDOMapper; + + /** + * 客户概览main + * @param userId 用户id + * @param regionId 区域id + * @param shopId 店铺id + * @param sellerId 导购id + * @param sevenDayStartTime 近七天开始时间 + * @param sevenDayEndTime 近七天结束时间 + * @return 客户概览VO + */ + public CustomerViewVO selectCustomerViewMain(Long userId, Long regionId, Long shopId, Long sellerId, String sevenDayStartTime, String sevenDayEndTime){ + CustomerViewVO customerViewVO = new CustomerViewVO(); + //shopIds + List shopIds = getShopIds(userId, regionId, shopId); + //客户list + List customerList = opCustomerDOMapper.selectCustomerList(shopIds, sellerId, null, null, null); + //会员list + List vipList = opVipDOMapper.selectVipList(shopIds, null, null); + + //设置客户,关联,vip人数 + setCustomerAndVipSize(customerList, vipList, customerViewVO); + //近七天新增list + List sevenDayCustomerList = customerList.stream().filter(customerDO -> filterSevenDayCustomer(customerDO, sevenDayStartTime, sevenDayEndTime)).collect(Collectors.toList()); + List sevenDayVipList = vipList.stream().filter(vipDO -> filterSevenDayVip(vipDO, sevenDayStartTime, sevenDayEndTime)).collect(Collectors.toList()); + customerViewVO.setSevenDayCustomerList(sevenDayCustomerList); + customerViewVO.setSevenDayVipList(sevenDayVipList); + return customerViewVO; + } + + /** + * shopIds + * @param userId 用户id + * @param regionId 区域id + * @param shopId 店铺id + * @return shopIds + */ + List getShopIds(Long userId, Long regionId, Long shopId){ + List shopIds = new ArrayList<>(); + //单店 + if(shopId != null){ + shopIds.add(shopId); + return shopIds; + } + //单区域 + if(regionId != null){ + List shopList = poiStoreService.getRegionShop(regionId); + shopIds = shopList.stream().map(PoiStore::getId).collect(Collectors.toList()); + return shopIds; + } + //所有shopIds + shopIds = privilageDomainService.listUserDatePermission(userId); + return shopIds; + } + + /** + * 客户,关联,vip人数 + * @param customerList 客户List + * @param vipList vipList + * @param customerViewVO 客户概览VO + */ + public void setCustomerAndVipSize(List customerList, List vipList, CustomerViewVO customerViewVO){ + //关联人数(手机号确定) + List customerPhoneList = customerList.stream().map(OpCustomer::getPhone).distinct().collect(Collectors.toList()); + List vipPhoneList = vipList.stream().map(OpVip::getPhone).distinct().collect(Collectors.toList()); + AtomicLong commonInt = new AtomicLong(0); + customerPhoneList.forEach(customerPhone -> { + if(vipPhoneList.contains(customerPhone)){ + commonInt.incrementAndGet(); + } + }); + Long common = commonInt.get(); + customerViewVO.setCommon(common); + //未关联的客户数 + Long customer = customerList.stream().filter(customerDO -> ZERO_L.equals(customerDO.getMemberId())).map(OpCustomer::getPhone).distinct().count(); + customerViewVO.setCustomer(customer - common); + //未关联会员数 + Long vip = vipList.stream().map(OpVip::getPhone).distinct().count(); + customerViewVO.setVip(vip - common); + } + + /** + * 过滤客户list + * @param customerDO 客户DO + * @param sevenDayStartTime 开始时间 + * @param sevenDayEndTime 结束时间 + * @return 客户list + */ + Boolean filterSevenDayCustomer(OpCustomer customerDO, String sevenDayStartTime, String sevenDayEndTime){ + try { + if(customerDO.getRegisterTime() != null){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Long start = sdf.parse(sevenDayStartTime).getTime(); + Long end = sdf.parse(sevenDayEndTime).getTime(); + if(customerDO.getRegisterTime().getTime() >= start && customerDO.getRegisterTime().getTime() <= end){ + return true; + }else{ + return false; + } + }else{ + return false; + } + }catch (Exception e){ + log.error("过滤近7天客户出错", e); + return false; + } + } + + /** + * 过滤会员list + * @param vipDO 会员DO + * @param sevenDayStartTime 开始时间 + * @param sevenDayEndTime 结束时间 + * @return 会员list + */ + Boolean filterSevenDayVip(OpVip vipDO, String sevenDayStartTime, String sevenDayEndTime){ + try { + if(vipDO.getRegisterTime() != null){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Long start = sdf.parse(sevenDayStartTime).getTime(); + Long end = sdf.parse(sevenDayEndTime).getTime(); + if(vipDO.getRegisterTime().getTime() >= start && vipDO.getRegisterTime().getTime() <= end){ + return true; + }else{ + return false; + } + }else{ + return false; + } + }catch (Exception e){ + log.error("过滤近7天会员出错", e); + return false; + } + } + +} diff --git a/src/main/resources/mapper/OpCustomerDOMapper.xml b/src/main/resources/mapper/OpCustomerDOMapper.xml index 9349d7c..7bc6b8a 100644 --- a/src/main/resources/mapper/OpCustomerDOMapper.xml +++ b/src/main/resources/mapper/OpCustomerDOMapper.xml @@ -52,4 +52,30 @@ GROUP BY t2.id order by t2.id asc + + + + diff --git a/src/main/resources/mapper/OpVipDOMapper.xml b/src/main/resources/mapper/OpVipDOMapper.xml new file mode 100644 index 0000000..45dbf80 --- /dev/null +++ b/src/main/resources/mapper/OpVipDOMapper.xml @@ -0,0 +1,24 @@ + + + + + + + +