同步飞鱼线索
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