同步飞鱼线索

master
wjt 11 months ago
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);
}
}

@ -1,19 +1,15 @@
package com.baiye.modules.distribute.controller;
import com.baiye.modules.distribute.dto.OceanEngineTokenDto;
import com.baiye.modules.distribute.entity.OceanEngineToken;
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.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
* 广
@ -28,7 +24,7 @@ import java.util.List;
public class OceanEngineController {
private final OceanEngineService oceanEngineService;
private final OceanEngineClueService oceanEngineClueService;
@GetMapping(value = "/url")
public ResponseEntity<String> query(Long companyId, String authorizeName) {
@ -62,4 +58,6 @@ public class OceanEngineController {
response.sendRedirect("https://baiyee.vip/dashboard");
return new ResponseEntity<>(HttpStatus.OK);
}
}

@ -9,48 +9,49 @@ import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
/**
* @author Enzo
* @date : 2023/11/2
*/
@MappedJdbcTypes({JdbcType.VARCHAR})
public class JsonStringArrayTypeHandler extends BaseTypeHandler<String[]> {
private static final ObjectMapper mapper = new ObjectMapper();
public class JsonStringArrayTypeHandler extends BaseTypeHandler<List<String>> {
private static final ObjectMapper MAPPER = new ObjectMapper();
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i,toJson(parameter));
public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, toJson(parameter));
}
@Override
public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
return this.toObject(rs.getString(columnName));
}
@Override
public String[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return this.toObject(rs.getString(columnIndex));
}
@Override
public String[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return this.toObject(cs.getString(columnIndex));
}
private String toJson(String[] params) {
private String toJson(List<String> params) {
try {
return mapper.writeValueAsString(params);
return MAPPER.writeValueAsString(params);
} catch (Exception e) {
e.printStackTrace();
}
return "[]";
}
private String[] toObject(String content) {
private List<String> toObject(String content) {
if (content != null && !content.isEmpty()) {
try {
return (String[]) mapper.readValue(content, String[].class);
return MAPPER.readValue(content, List.class);
} catch (Exception e) {
throw new RuntimeException(e);
}

@ -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;
}

@ -48,7 +48,7 @@ public class OceanEngineToken {
@Schema(name = "refresh_token")
private String refreshToken;
@TableField(typeHandler = JsonStringArrayTypeHandler.class)
@TableField(value = "advertiser_ids", typeHandler = JsonStringArrayTypeHandler.class)
@Schema(name = "advertiser_ids")
private List<String> advertiserIds;

@ -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);
}

@ -43,7 +43,7 @@ public interface OceanEngineService {
* @param companyId
* @return
*/
Boolean updateOceanEnginByResponse(RefreshTokenResponse.Data data, Long id, Long companyId);
Boolean updateOceanEngineByResponse(RefreshTokenResponse.Data data, Long id, Long companyId);
/**
* id
@ -60,7 +60,7 @@ public interface OceanEngineService {
* @param authorizeName
* @return
*/
OceanEngineToken getOceanEnginByCompanyId(Long companyId, String authorizeName);
OceanEngineToken getOceanEngineByCompanyId(Long companyId, String authorizeName);
/**

@ -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));
}
}
/**
* idtoken 广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();
}
}

@ -13,10 +13,13 @@ import com.baiye.modules.auth.AccessTokenResponse;
import com.baiye.modules.auth.RefreshTokenRequest;
import com.baiye.modules.auth.RefreshTokenResponse;
import com.baiye.modules.distribute.entity.OceanEngineToken;
import com.baiye.modules.distribute.entity.StoreEntity;
import com.baiye.modules.distribute.mapper.OceanEngineTokenMapper;
import com.baiye.modules.distribute.service.OceanEngineService;
import com.baiye.properties.OceanEngineConfig;
import com.baiye.security.util.SecurityUtils;
import com.baiye.util.AESUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@ -111,11 +114,13 @@ public class OceanEngineServiceImpl implements OceanEngineService {
@Override
public List<OceanEngineToken> findByStatus(int oneNumber) {
return null;
LambdaQueryWrapper<OceanEngineToken> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OceanEngineToken::getStatus, 1);
return oceanEngineTokenMapper.selectList(wrapper);
}
@Override
public Boolean updateOceanEnginByResponse(RefreshTokenResponse.Data data, Long id, Long companyId) {
public Boolean updateOceanEngineByResponse(RefreshTokenResponse.Data data, Long id, Long companyId) {
return null;
}
@ -125,7 +130,7 @@ public class OceanEngineServiceImpl implements OceanEngineService {
}
@Override
public OceanEngineToken getOceanEnginByCompanyId(Long companyId, String authorizeName) {
public OceanEngineToken getOceanEngineByCompanyId(Long companyId, String authorizeName) {
return null;
}

@ -65,18 +65,26 @@ public class StoreServiceImpl extends ExtendServiceImpl<StoreMapper, StoreEntity
List<SysUserNameRoleDTO> sysUserNameRoleS = sysUserService.listUserNameByUserIds(userIds);
userInfo = sysUserNameRoleS.stream().collect(Collectors.toMap(SysUserNameRoleDTO::getUserId, SysUserNameRoleDTO::getUserName));
}
String city = "";
String province = "";
String county = "";
String detail = "";
for (StoreVO vo : records) {
StringBuilder address = new StringBuilder();
if (StrUtil.isNotBlank(vo.getProvince())) {
address.append(vo.getProvince());
}
if (StrUtil.isNotBlank(vo.getCity())) {
address.append(vo.getCity());
}
if (StrUtil.isNotBlank(vo.getCounty())) {
address.append(vo.getCounty());
}
if (StrUtil.isNotBlank(vo.getDetail())) {
address.append(vo.getDetail());
}
vo.setAddress(address.toString());
String tradeTime = vo.getTradeStartTime() +
" - " +
vo.getTradeEndTime();
vo.setTradeTime(tradeTime);
vo.setReservationNum(map.get(vo.getId()));
city = vo.getCity();
province = vo.getProvince();
county = vo.getCounty();
detail = vo.getDetail();
vo.setAddress(province + city + county + detail);
vo.setTradeTime(vo.getTradeStartTime() + " - " + vo.getTradeEndTime());
if (vo.getUserId() != null) {
vo.setUserName(userInfo.get(vo.getUserId()));
}

@ -51,7 +51,7 @@ public class RefreshTokenTask {
if (refreshTokenResponse.getCode() == DefaultNumberConstants.ZERO_NUMBER) {
RefreshTokenResponse.Data data = refreshTokenResponse.getData();
if (StringUtils.isNotBlank(data.getAccessToken()) && StringUtils.isNotBlank(data.getRefreshToken())) {
Boolean response = oceanEngineService.updateOceanEnginByResponse(data, engineToken.getId(), engineToken.getCompanyId());
Boolean response = oceanEngineService.updateOceanEngineByResponse(data, engineToken.getId(), engineToken.getCompanyId());
log.info("============= update token former token as {}, response token as {}, update response as {} =============",
engineToken.getAccessToken(), data.getAccessToken(), response);
}

Loading…
Cancel
Save