|
|
|
@ -1,9 +1,13 @@
|
|
|
|
|
package com.kiisoo.ic.customer.service;
|
|
|
|
|
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
|
|
import com.github.pagehelper.Page;
|
|
|
|
|
import com.github.pagehelper.PageHelper;
|
|
|
|
|
import com.kiisoo.ic.common.utils.MD5FileUtil;
|
|
|
|
|
import com.kiisoo.ic.common.utils.httpClientUtil.HttpClientUtil;
|
|
|
|
|
import com.kiisoo.ic.config.WxCpConfiguration;
|
|
|
|
|
import com.kiisoo.ic.constants.Constants;
|
|
|
|
|
import com.kiisoo.ic.customer.entity.*;
|
|
|
|
|
import com.kiisoo.ic.customer.mapper.OpCustomerDOMapper;
|
|
|
|
|
import com.kiisoo.ic.customer.mapper.OpVipDOMapper;
|
|
|
|
@ -16,6 +20,9 @@ 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.bean.BsdShareCodeResponse;
|
|
|
|
|
import com.kiisoo.ic.store.bean.BsdVipResponse;
|
|
|
|
|
import com.kiisoo.ic.store.bean.MemberDtlDTO;
|
|
|
|
|
import com.kiisoo.ic.store.entity.PoiStore;
|
|
|
|
|
import com.kiisoo.ic.store.entity.PoiStoreStaff;
|
|
|
|
|
import com.kiisoo.ic.store.entity.PrivilageCpUserStoreDO;
|
|
|
|
@ -31,6 +38,7 @@ import me.chanjar.weixin.cp.bean.WxCpUserExternalContactInfo;
|
|
|
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
@ -115,6 +123,10 @@ public class CustomerViewService {
|
|
|
|
|
@Autowired
|
|
|
|
|
private RetailCompanyMapper retailCompanyMapper;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Value("${bsd.vip}")
|
|
|
|
|
private String vipBsdUrl;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 客户概览main——趋势图
|
|
|
|
|
* @param userId 用户id
|
|
|
|
@ -699,4 +711,95 @@ public class CustomerViewService {
|
|
|
|
|
countDownLatch.await();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 同步会员数据
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public void syncVip() throws InterruptedException {
|
|
|
|
|
//初始化线程
|
|
|
|
|
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(8);
|
|
|
|
|
|
|
|
|
|
//查询现有企业微信账号
|
|
|
|
|
List<OpCustomer> customers = opCustomerDOMapper.selectList(null);
|
|
|
|
|
|
|
|
|
|
if (CollectionUtils.isNotEmpty(customers)){
|
|
|
|
|
//分组
|
|
|
|
|
final List<List<OpCustomer>> afterPageList = com.kiisoo.ic.utils.CollectionUtils.portListByQuantity(customers, 100);
|
|
|
|
|
//定义线程池长度
|
|
|
|
|
int threadPoolSize = afterPageList.size();
|
|
|
|
|
//定义countDownLatch
|
|
|
|
|
final CountDownLatch countDownLatch = new CountDownLatch(threadPoolSize);
|
|
|
|
|
for (int i = 0; i < afterPageList.size(); i++) {
|
|
|
|
|
List<OpCustomer> opCustomers = afterPageList.get(i);
|
|
|
|
|
newFixedThreadPool.execute(new Runnable() {
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
try {
|
|
|
|
|
//查询企业微信已配置联系我的用户
|
|
|
|
|
for (OpCustomer customer : opCustomers) {
|
|
|
|
|
String wechatUniId = customer.getWechatUniId();
|
|
|
|
|
if (StringUtils.isBlank(wechatUniId)){
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
String url = "";
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
Map<String, Object> params = new HashMap<>();
|
|
|
|
|
params.put("unionId", wechatUniId);
|
|
|
|
|
String message = HttpClientUtil.httpPost(vipBsdUrl + MD5FileUtil.getMD5String("BOSIDENG" + sdf.format(new Date())), JSONObject.toJSONString(params)).getMessage();
|
|
|
|
|
if (StringUtils.isBlank(message)){
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
JSONObject vipJson = JSONObject.parseObject(message);
|
|
|
|
|
BsdVipResponse bsdResponse = vipJson.toJavaObject(BsdVipResponse.class);
|
|
|
|
|
if (bsdResponse.getSuccess() && bsdResponse.getData() != null){
|
|
|
|
|
MemberDtlDTO data = bsdResponse.getData();
|
|
|
|
|
|
|
|
|
|
OpCustomer opCustomer = new OpCustomer(data.getMemberName(), data.getMobileNo());
|
|
|
|
|
opCustomer.setUpdateBy(Constants.SYS_OPERATION);
|
|
|
|
|
|
|
|
|
|
// 根据手机号码去重
|
|
|
|
|
QueryWrapper<OpVip> wrapper = new QueryWrapper<>();
|
|
|
|
|
wrapper.eq("phone", data.getMobileNo());
|
|
|
|
|
OpVip opVip = opVipDOMapper.selectOne(wrapper);
|
|
|
|
|
OpVip opVip1 = new OpVip();
|
|
|
|
|
opVip1.setStatus(1L);
|
|
|
|
|
opVip1.setLevel(data.getMemberLevel().toString());
|
|
|
|
|
opVip1.setPhone(data.getMobileNo());
|
|
|
|
|
opVip1.setName(data.getMemberName());
|
|
|
|
|
opVip1.setBirthday(data.getBirthday());
|
|
|
|
|
opVip1.setRegisterTime(data.getCreateDate());
|
|
|
|
|
if (opVip == null) {
|
|
|
|
|
//数据库没有这个数据--新建数据
|
|
|
|
|
opVip1.setCreateBy(Constants.SYS_OPERATION);
|
|
|
|
|
opVip1.setCreateTime(new Date());
|
|
|
|
|
opVipDOMapper.insert(opVip1);
|
|
|
|
|
//有vip信息就绑定信息
|
|
|
|
|
opCustomer.setMemberId(opVip1.getId());
|
|
|
|
|
} else {
|
|
|
|
|
opVip1.setId(opVip.getId());
|
|
|
|
|
opVip1.setUpdateTime(new Date());
|
|
|
|
|
opVip1.setUpdateBy(Constants.SYS_OPERATION);
|
|
|
|
|
opVipDOMapper.updateById(opVip1);
|
|
|
|
|
//有vip信息就绑定信息
|
|
|
|
|
opCustomer.setMemberId(opVip.getId());
|
|
|
|
|
}
|
|
|
|
|
QueryWrapper<OpCustomer> wrapper1 = new QueryWrapper<>();
|
|
|
|
|
wrapper1.eq("wechat_uni_id", wechatUniId);
|
|
|
|
|
opCustomerDOMapper.update(opCustomer, wrapper1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("同步会员数据", e);
|
|
|
|
|
} finally {
|
|
|
|
|
//每次减去一,避免死锁
|
|
|
|
|
countDownLatch.countDown();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
countDownLatch.await();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|