diff --git a/src/main/java/com/kiisoo/ic/customer/CustomerService.java b/src/main/java/com/kiisoo/ic/customer/CustomerService.java index be1efb6..e01cf58 100644 --- a/src/main/java/com/kiisoo/ic/customer/CustomerService.java +++ b/src/main/java/com/kiisoo/ic/customer/CustomerService.java @@ -225,11 +225,14 @@ public class CustomerService { * @date 2020/05/24 13:46 */ private void handleAddCustomer (TurnBackDTO turnBackDTOS) throws Exception { + if(turnBackDTOS.getWxData().getUserId().equals("wmA--5DgAAo8v4QbbVbYrU9c3Kp7_HBA")){ + System.out.println("1"); + } OpCustomer opCustomer = null; if (turnBackDTOS.getWxData().getUnionId() == null && turnBackDTOS.getWxData().getUserId() != null) { //此时说明是企业微信扫码添加 QueryWrapper customerWrapper = new QueryWrapper<>(); - customerWrapper.eq("wechat_uni_id", null).eq("external_userid", turnBackDTOS.getWxData().getUserId()).last("limit 1"); + customerWrapper.eq("external_userid", turnBackDTOS.getWxData().getUserId()).last("limit 1"); opCustomer = opCustomerDOMapper.selectOne(customerWrapper); }else if (turnBackDTOS.getWxData().getUnionId() != null && turnBackDTOS.getUserId() != null){ //客户信息 @@ -421,7 +424,7 @@ public class CustomerService { public void sellerCustomerRelation(OpCustomer opCustomer, Date joinTime, long shopId, long sellerId) { QueryWrapper wrapper1 = new QueryWrapper<>(); //一个客户只能添加一个店的店长微信,所以根据店铺判断即可 - wrapper1.eq("customer_id", opCustomer.getId()).eq("store_id", shopId).last("limit 1"); + wrapper1.eq("customer_id", opCustomer.getId()).eq("store_id", shopId).eq("user_id", sellerId).last("limit 1"); OpSellerCustomerRelation opSellerCustomerRelation = opSellerCustomerRelationDOMapper.selectOne(wrapper1); if (null == opSellerCustomerRelation) { //不存在就添加 diff --git a/src/main/java/com/kiisoo/ic/customer/mapper/OpSellerCustomerRelationDOMapper.java b/src/main/java/com/kiisoo/ic/customer/mapper/OpSellerCustomerRelationDOMapper.java index 29899b0..1219846 100644 --- a/src/main/java/com/kiisoo/ic/customer/mapper/OpSellerCustomerRelationDOMapper.java +++ b/src/main/java/com/kiisoo/ic/customer/mapper/OpSellerCustomerRelationDOMapper.java @@ -101,4 +101,8 @@ public interface OpSellerCustomerRelationDOMapper extends BaseMapper> selectCustomersByCpUserId(); + + List> selectCustomersByCpUserIdByList(@Param("cpUserIds")List cpUserIds); + } diff --git a/src/main/java/com/kiisoo/ic/employee/mapper/PrivilageCpUserDOMapper.java b/src/main/java/com/kiisoo/ic/employee/mapper/PrivilageCpUserDOMapper.java index 89f4adf..f5936eb 100644 --- a/src/main/java/com/kiisoo/ic/employee/mapper/PrivilageCpUserDOMapper.java +++ b/src/main/java/com/kiisoo/ic/employee/mapper/PrivilageCpUserDOMapper.java @@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Map; @Repository public interface PrivilageCpUserDOMapper extends BaseMapper { @@ -29,4 +30,5 @@ public interface PrivilageCpUserDOMapper extends BaseMapper { Long selectStoresCount(@Param("cpUserIds")List cpUserIds); Long selectDistinctStoresCount(@Param("cpUserIds")List cpUserIds); + } diff --git a/src/main/java/com/kiisoo/ic/job/detail/CustomerDataJob.java b/src/main/java/com/kiisoo/ic/job/detail/CustomerDataJob.java index e1ffe19..15a5838 100644 --- a/src/main/java/com/kiisoo/ic/job/detail/CustomerDataJob.java +++ b/src/main/java/com/kiisoo/ic/job/detail/CustomerDataJob.java @@ -18,7 +18,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.*; /** @@ -76,15 +78,43 @@ public class CustomerDataJob { int index =0; DetailDTOMessageEventProducer producer = new DetailDTOMessageEventProducer(ringBuffer, qwMailListManageService, customerService, poiStoreStaffDOMapper); if (StringUtils.isBlank(cpUserIds)){ + // 获取账号的总数 List privilageCpUserDOS = privilageCpUserDOMapper.selectList(null); + // 获取账号的总客户数 + List> customerList = opSellerCustomerRelationDOMapper.selectCustomersByCpUserId(); + Map customerMap = new HashMap<>(); + for (int i = 0; i < customerList.size(); i++) { + Map item = customerList.get(i); + customerMap.put(item.get("cpUserId").toString(), item.get("sumCustomer")); + } + for (PrivilageCpUserDO privilageCpUserDO : privilageCpUserDOS) { Long storeId = privilageCpUserStoreDOMapper.selectOneByCpUserId(privilageCpUserDO.getCpUserId()); - producer.produceData(index,storeId,privilageCpUserDO.getCpUserId()); + + ProduceDTO produceDTO = new ProduceDTO(); + produceDTO.setIndex(index); + produceDTO.setStoreId(storeId); + produceDTO.setCpUserId(privilageCpUserDO.getCpUserId()); + if(null != customerMap.get(privilageCpUserDO.getCpUserId())){ + String sumCustomer = customerMap.get(privilageCpUserDO.getCpUserId()).toString(); + produceDTO.setSumCustomer(Integer.parseInt(sumCustomer)); + }else{ + produceDTO.setSumCustomer(0); + } + producer.produceData(produceDTO); index++; } }else{ String[] split = cpUserIds.split(","); List cpUserIdList = Arrays.asList(split); + // 获取账号的总客户数 + List> customerList = opSellerCustomerRelationDOMapper.selectCustomersByCpUserIdByList(cpUserIdList); + Map customerMap = new HashMap<>(); + for (int i = 0; i < customerList.size(); i++) { + Map item = customerList.get(i); + customerMap.put(item.get("cpUserId").toString(), item.get("sumCustomer")); + } + for (String cpUserId : cpUserIdList) { QueryWrapper cpUserDOQueryWrapper = new QueryWrapper<>(); cpUserDOQueryWrapper.eq("cp_user_id",cpUserId).last("limit 1"); @@ -97,7 +127,19 @@ public class CustomerDataJob { relationQueryWrapper.eq("type",3).eq("user_id",privilageCpUserDO.getId()); opSellerCustomerRelationDOMapper.delete(relationQueryWrapper); Long storeId = privilageCpUserStoreDOMapper.selectOneByCpUserId(cpUserId); - producer.produceData(index,storeId,cpUserId); + + ProduceDTO produceDTO = new ProduceDTO(); + produceDTO.setIndex(index); + produceDTO.setStoreId(storeId); + produceDTO.setCpUserId(privilageCpUserDO.getCpUserId()); + if(null != customerMap.get(privilageCpUserDO.getCpUserId())){ + String sumCustomer = customerMap.get(privilageCpUserDO.getCpUserId()).toString(); + produceDTO.setSumCustomer(Integer.parseInt(sumCustomer)); + }else{ + produceDTO.setSumCustomer(0); + } + producer.produceData(produceDTO); + index++; } } diff --git a/src/main/java/com/kiisoo/ic/job/detail/DetailDTOMessage.java b/src/main/java/com/kiisoo/ic/job/detail/DetailDTOMessage.java index cffe06f..79d872e 100644 --- a/src/main/java/com/kiisoo/ic/job/detail/DetailDTOMessage.java +++ b/src/main/java/com/kiisoo/ic/job/detail/DetailDTOMessage.java @@ -26,4 +26,9 @@ public class DetailDTOMessage { private PoiStoreStaffDOMapper poiStoreStaffDOMapper; private List customers; + /** + * 账号的总客户数 + */ + private Integer sumCustomer; + } diff --git a/src/main/java/com/kiisoo/ic/job/detail/DetailDTOMessageEventProducer.java b/src/main/java/com/kiisoo/ic/job/detail/DetailDTOMessageEventProducer.java index 8321937..798c4d2 100644 --- a/src/main/java/com/kiisoo/ic/job/detail/DetailDTOMessageEventProducer.java +++ b/src/main/java/com/kiisoo/ic/job/detail/DetailDTOMessageEventProducer.java @@ -34,6 +34,27 @@ public class DetailDTOMessageEventProducer { ringBuffer.get(seq).setQwMailListManageService(qwMailListManageService); ringBuffer.get(seq).setCustomerService(customerService); ringBuffer.get(seq).setPoiStoreStaffDOMapper(poiStoreStaffDOMapper); +// ringBuffer.get(seq).setCustomers(customers); + } finally { + // 发布Event,激活观察者去消费, 将sequence传递给该消费者 + // 注意,最后的 ringBuffer.publish() 方法必须包含在 finally 中以确保必须得到调用;如果某个请求的 sequence 未被提交,将会堵塞后续的发布操作或者其它的 producer。 + ringBuffer.publish(seq); + } + } + + public void produceData(ProduceDTO produceDTO) { + // 获得下一个Event槽的下标 + long seq = ringBuffer.next(); + try { + // 给Event填充数据 + //给这个区块放入 数据 如果此处不理解,想想RingBuffer的结构图 + ringBuffer.get(seq).setIndex(produceDTO.getIndex()); + ringBuffer.get(seq).setCpUserId(produceDTO.getCpUserId()); + ringBuffer.get(seq).setStoreId(produceDTO.getStoreId()); + ringBuffer.get(seq).setQwMailListManageService(qwMailListManageService); + ringBuffer.get(seq).setCustomerService(customerService); + ringBuffer.get(seq).setPoiStoreStaffDOMapper(poiStoreStaffDOMapper); + ringBuffer.get(seq).setSumCustomer(produceDTO.getSumCustomer()); // ringBuffer.get(seq).setCustomers(customers); } finally { // 发布Event,激活观察者去消费, 将sequence传递给该消费者 diff --git a/src/main/java/com/kiisoo/ic/job/detail/DetailDTOMessageGroupConsumer.java b/src/main/java/com/kiisoo/ic/job/detail/DetailDTOMessageGroupConsumer.java index ee1f4d8..6a80854 100644 --- a/src/main/java/com/kiisoo/ic/job/detail/DetailDTOMessageGroupConsumer.java +++ b/src/main/java/com/kiisoo/ic/job/detail/DetailDTOMessageGroupConsumer.java @@ -45,7 +45,11 @@ public class DetailDTOMessageGroupConsumer implements WorkHandler customers = null; try { - customers = qwMailListManageService.getCustomer(cpUserId); + if(null == detailDtoMessage.getSumCustomer()){ + customers = qwMailListManageService.getCustomer(cpUserId); + }else { + customers = qwMailListManageService.getCustomer(cpUserId, detailDtoMessage.getSumCustomer()); + } } catch (Exception e) { log.error("查询联系人失败:" + cpUserId, e); } @@ -54,10 +58,8 @@ public class DetailDTOMessageGroupConsumer implements WorkHandler followedUsers = customer.getFollowedUsers(); - turnBackDTO.setEaCode(""); if (CollectionUtils.isNotEmpty(followedUsers)) { for (WxCpUserExternalContactInfo.FollowedUser followedUser : followedUsers) { @@ -103,7 +105,6 @@ public class DetailDTOMessageGroupConsumer implements WorkHandler getCustomer(String cpUserId) throws WxErrorException { //查询店铺id——店铺ID存在说明该账号的客户都绑在店上,不存在则说明绑在账号上 - Long storeId = privilageCpUserStoreDOMapper.selectOneByCpUserId(cpUserId); +// Long storeId = privilageCpUserStoreDOMapper.selectOneByCpUserId(cpUserId); //账号一定存在,不存在则返回null QueryWrapper cpQw = new QueryWrapper<>(); @@ -321,4 +321,56 @@ public class QWMailListManageService { } return customers; } + + public List getCustomer(String cpUserId, Integer sumCustomer) throws WxErrorException { + //查询店铺id——店铺ID存在说明该账号的客户都绑在店上,不存在则说明绑在账号上 +// Long storeId = privilageCpUserStoreDOMapper.selectOneByCpUserId(cpUserId); + + //账号一定存在,不存在则返回null + QueryWrapper cpQw = new QueryWrapper<>(); + cpQw.eq("cp_user_id",cpUserId).last("limit 1"); + PrivilageCpUserDO privilageCpUserDO = privilageCpUserDOMapper.selectOne(cpQw); + if (privilageCpUserDO == null){ + return null; + } + + //获取第三方接口方法 + List customers = null; + wxCpService = WxCpConfiguration.getCpService(applicationid); + WxCpExternalContactService externalContactService = wxCpService.getExternalContactService(); + List customerStrs = externalContactService.listExternalContacts(cpUserId); + + //查询客户列表为空则直接返回 + if (CollectionUtils.isNotEmpty(customerStrs)){ + customers = new ArrayList<>(); + // 判断总客户数是否一致, 不一致就拉取明细 + if(sumCustomer.equals(customerStrs.size())){ + return customers; + }else{ + log.info("客户总数不一致 :" + cpUserId + " | 系统总数=" + sumCustomer + " | 企业微信后台总数=" + customerStrs.size()); + } + for (String customerStr:customerStrs){ + //查询该客户id的关系是否存在 +// QueryWrapper customerQueryWrapper = new QueryWrapper<>(); +// customerQueryWrapper.eq("external_userid",customerStr).last("limit 1"); +// OpCustomer opCustomer = opCustomerDOMapper.selectOne(customerQueryWrapper); +// //客户都不存在则直接下一步 +// if (opCustomer != null){ +// Long relationId = opSellerCustomerRelationDOMapper.selectSellerCustomerRelation(opCustomer.getId(), privilageCpUserDO.getId(), storeId); +// //关系存在则不查询明细 +// if (relationId != null){ +// continue; +// } +// } + try{ + WxCpUserExternalContactInfo contactDetail = externalContactService.getContactDetail(customerStr); + customers.add(contactDetail); + }catch (Exception e){ + log.error("企业微信查询客户明细失败",e); + continue; + } + } + } + return customers; + } } diff --git a/src/main/resources/mapper/OpSellerCustomerRelationDOMapper.xml b/src/main/resources/mapper/OpSellerCustomerRelationDOMapper.xml index 4a398d8..569bb40 100644 --- a/src/main/resources/mapper/OpSellerCustomerRelationDOMapper.xml +++ b/src/main/resources/mapper/OpSellerCustomerRelationDOMapper.xml @@ -217,4 +217,44 @@ limit 1 + + + +