同步飞鱼线索
parent
2c07188b2d
commit
df5e23ad85
@ -0,0 +1,33 @@
|
|||||||
|
package com.baiye.job;
|
||||||
|
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import com.baiye.modules.distribute.service.OceanEngineClueService;
|
||||||
|
import com.dangdang.ddframe.job.api.ShardingContext;
|
||||||
|
import com.dangdang.ddframe.job.api.simple.SimpleJob;
|
||||||
|
import com.example.jobInstance.ElasticSimpleJob;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wjt
|
||||||
|
* @date 2023/11/3
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
@ElasticSimpleJob(jobName = "OceanEngineClueJob", cron = "0 0/15 * * * ?")
|
||||||
|
public class OceanEngineClueJob implements SimpleJob {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private OceanEngineClueService oceanEngineClueService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(ShardingContext shardingContext) {
|
||||||
|
Date currentTime = DateUtil.date();
|
||||||
|
Date startTime = DateUtil.beginOfMinute(DateUtil.offsetMinute(currentTime, -15));
|
||||||
|
Date endTime = DateUtil.endOfMinute(DateUtil.offsetMinute(currentTime, -1));
|
||||||
|
oceanEngineClueService.getFeiYuSource(startTime, endTime);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.baiye.modules.distribute.entity;
|
||||||
|
|
||||||
|
import com.baiye.entity.BaseEntity;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wjt
|
||||||
|
* @date 2023/11/2
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@ToString
|
||||||
|
@TableName(value = "tb_ocean_engine_source", autoResultMap = true)
|
||||||
|
public class OceanEngineSourceEntity extends BaseEntity {
|
||||||
|
|
||||||
|
@TableId
|
||||||
|
@Schema(title = "id")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(title = "user_id")
|
||||||
|
private Long userId;
|
||||||
|
|
||||||
|
@Schema(title = "content")
|
||||||
|
private String content;
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.baiye.modules.distribute.mapper;
|
||||||
|
|
||||||
|
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
|
||||||
|
import com.baiye.modules.distribute.entity.OceanEngineSourceEntity;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wjt
|
||||||
|
* @date 2023/11/2
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface OceanEngineSourceMapper extends ExtendMapper<OceanEngineSourceEntity> {
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package com.baiye.modules.distribute.service;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wjt
|
||||||
|
* @date 2023/11/2
|
||||||
|
* 获取巨量线索
|
||||||
|
*/
|
||||||
|
public interface OceanEngineClueService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 飞 鱼线索
|
||||||
|
*
|
||||||
|
* @param startTime 开始时间
|
||||||
|
* @param endTime 结束时间
|
||||||
|
*/
|
||||||
|
void getFeiYuSource(Date startTime, Date endTime);
|
||||||
|
}
|
@ -0,0 +1,197 @@
|
|||||||
|
package com.baiye.modules.distribute.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import cn.hutool.core.util.URLUtil;
|
||||||
|
import cn.hutool.http.HttpRequest;
|
||||||
|
|
||||||
|
import cn.hutool.json.JSONArray;
|
||||||
|
import cn.hutool.json.JSONObject;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.baiye.constant.DefaultNumberConstants;
|
||||||
|
import com.baiye.constant.UrlConstant;
|
||||||
|
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
|
||||||
|
import com.baiye.modules.distribute.entity.OceanEngineSourceEntity;
|
||||||
|
import com.baiye.modules.distribute.entity.OceanEngineToken;
|
||||||
|
import com.baiye.modules.distribute.mapper.OceanEngineSourceMapper;
|
||||||
|
import com.baiye.modules.distribute.service.OceanEngineClueService;
|
||||||
|
import com.baiye.modules.distribute.service.OceanEngineService;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wjt
|
||||||
|
* @date 2023/11/2
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Slf4j
|
||||||
|
public class OceanEngineClueServiceImpl extends ExtendServiceImpl<OceanEngineSourceMapper, OceanEngineSourceEntity> implements OceanEngineClueService {
|
||||||
|
|
||||||
|
private final OceanEngineService oceanEngineService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getFeiYuSource(Date startTime, Date endTime) {
|
||||||
|
|
||||||
|
//查询需要同步线索的token
|
||||||
|
List<OceanEngineToken> oceanEngineTokens = oceanEngineService.findByStatus(1);
|
||||||
|
if (CollUtil.isEmpty(oceanEngineTokens)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (OceanEngineToken oceanEngineToken : oceanEngineTokens) {
|
||||||
|
String accessToken = oceanEngineToken.getAccessToken();
|
||||||
|
//管家ids
|
||||||
|
List<String> advertiserIds = oceanEngineToken.getAdvertiserIds();
|
||||||
|
log.info("=================== 获取到的广告主ids {} ===================", JSONUtil.toJsonStr(advertiserIds));
|
||||||
|
CompletableFuture.runAsync(() -> getAdvertiser(oceanEngineToken.getUserId(), accessToken, advertiserIds, startTime, endTime));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过管家id和token 查询广告商id
|
||||||
|
*
|
||||||
|
* @param accessToken token
|
||||||
|
* @param advertisers 管家id
|
||||||
|
*/
|
||||||
|
private void getAdvertiser(Long userId, String accessToken, List<String> advertisers, Date startTime, Date endTime) {
|
||||||
|
|
||||||
|
if (CollUtil.isEmpty(advertisers)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<String> advertiseList = getAdvertiseIds(accessToken, advertisers);
|
||||||
|
if (CollUtil.isEmpty(advertiseList)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Map<String, Object> map = new HashMap<>(5);
|
||||||
|
map.put("advertiser_ids", advertiseList.toString());
|
||||||
|
map.put("start_time", startTime);
|
||||||
|
map.put("end_time", endTime);
|
||||||
|
log.info("=================== 巨量飞鱼请求 {} ===================", JSONUtil.toJsonStr(map));
|
||||||
|
JSONArray array = reqOceanEngineClue(accessToken, map);
|
||||||
|
if (CollUtil.isEmpty(array)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
log.info("=================== 巨量飞鱼返回{} ===================", array.size());
|
||||||
|
parseAndSaveData(userId, array);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 跟据管家号获取广告商号
|
||||||
|
*
|
||||||
|
* @param accessToken token
|
||||||
|
* @param advertisers 管家号
|
||||||
|
* @return 广告主id
|
||||||
|
*/
|
||||||
|
public static List<String> getAdvertiseIds(String accessToken, List<String> advertisers) {
|
||||||
|
//所有广告主的id
|
||||||
|
List<String> advertiseList = new ArrayList<>();
|
||||||
|
for (String id : advertisers) {
|
||||||
|
String body = HttpRequest.get(UrlConstant.GET_ADVERTISER + "?" + "advertiser_id=" + id).
|
||||||
|
header("Access-Token", accessToken).
|
||||||
|
execute().
|
||||||
|
body();
|
||||||
|
JSONObject response = JSONUtil.parseObj(body);
|
||||||
|
if (response.getInt("code") == 0 && response.getStr("data") != null) {
|
||||||
|
JSONObject json = JSONUtil.parseObj(response.getStr("data"));
|
||||||
|
JSONArray results = json.getJSONArray("list");
|
||||||
|
for (int i = 0; i < results.size(); i++) {
|
||||||
|
JSONObject jsonObject = results.getJSONObject(i);
|
||||||
|
String advertiserId = jsonObject.getStr("advertiser_id");
|
||||||
|
advertiseList.add(advertiserId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.info("advertiseList===={}", advertiseList.size());
|
||||||
|
return advertiseList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 同步飞鱼线索
|
||||||
|
*
|
||||||
|
* @param accessToken token
|
||||||
|
* @param map 时间参数
|
||||||
|
*/
|
||||||
|
public JSONArray reqOceanEngineClue(String accessToken, Map<String, Object> map) {
|
||||||
|
JSONObject data = getClueList(map, accessToken);
|
||||||
|
if (data == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
JSONObject pageInfo = data.getJSONObject("page_info");
|
||||||
|
//总数
|
||||||
|
int totalNumber = pageInfo.getInt("total_number");
|
||||||
|
|
||||||
|
if (totalNumber > DefaultNumberConstants.TEN_NUMBER) {
|
||||||
|
map.put("page", 1);
|
||||||
|
map.put("page_size", totalNumber);
|
||||||
|
data = getClueList(map, accessToken);
|
||||||
|
if (data == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data.getJSONArray("list");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JSONObject getClueList(Map<String, Object> map, String accessToken) {
|
||||||
|
String body = HttpRequest.get(UrlConstant.SYNC_CLUE_URL + "?" + URLUtil.buildQuery(map, Charset.defaultCharset())).header("Access-Token", accessToken).execute().body();
|
||||||
|
JSONObject response = JSONUtil.parseObj(body);
|
||||||
|
if (response.getInt("code") == 0 && response.getStr("data") != null) {
|
||||||
|
return JSONUtil.parseObj(response.getStr("data"));
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解析线索
|
||||||
|
*
|
||||||
|
* @param userId
|
||||||
|
* @param array
|
||||||
|
*/
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void parseAndSaveData(Long userId, JSONArray array) {
|
||||||
|
List<OceanEngineSourceEntity> oceanEngineSources = new ArrayList<>();
|
||||||
|
for (int i = 0; i < array.size(); i++) {
|
||||||
|
JSONObject json = array.getJSONObject(i);
|
||||||
|
//飞鱼线索id
|
||||||
|
String clueId = json.getStr("clue_id");
|
||||||
|
String createTime = json.getStr("create_time_detail");
|
||||||
|
//广告商名称
|
||||||
|
String advertiserName = json.getStr("advertiser_name");
|
||||||
|
//线索名
|
||||||
|
String name = json.getStr("name");
|
||||||
|
String phone = json.getStr("telephone");
|
||||||
|
String weixin = json.getStr("weixin");
|
||||||
|
String address = json.getStr("location");
|
||||||
|
//线索留资(key-value形式的备注)
|
||||||
|
String remark_dict = json.getStr("remark_dict");
|
||||||
|
|
||||||
|
//===========原数据保存
|
||||||
|
OceanEngineSourceEntity oceanEngineSource = new OceanEngineSourceEntity();
|
||||||
|
oceanEngineSource.setUserId(userId);
|
||||||
|
oceanEngineSource.setContent(JSONUtil.toJsonStr(json));
|
||||||
|
oceanEngineSources.add(oceanEngineSource);
|
||||||
|
//todo =====传递线索
|
||||||
|
|
||||||
|
}
|
||||||
|
baseMapper.insertBatchSomeColumn(oceanEngineSources);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断是否含中文
|
||||||
|
*
|
||||||
|
* @param countName 检查的字段
|
||||||
|
*/
|
||||||
|
private boolean checkCountName(String countName) {
|
||||||
|
Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
|
||||||
|
Matcher m = p.matcher(countName);
|
||||||
|
return m.find();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue