diff --git a/admin/src/main/java/com/baiye/job/OceanEngineClueJob.java b/admin/src/main/java/com/baiye/job/OceanEngineClueJob.java new file mode 100644 index 0000000..c5046df --- /dev/null +++ b/admin/src/main/java/com/baiye/job/OceanEngineClueJob.java @@ -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); + } +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/controller/OceanEngineController.java b/admin/src/main/java/com/baiye/modules/distribute/controller/OceanEngineController.java index 97c4862..7c71384 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/controller/OceanEngineController.java +++ b/admin/src/main/java/com/baiye/modules/distribute/controller/OceanEngineController.java @@ -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 query(Long companyId, String authorizeName) { @@ -62,4 +58,6 @@ public class OceanEngineController { response.sendRedirect("https://baiyee.vip/dashboard"); return new ResponseEntity<>(HttpStatus.OK); } + + } diff --git a/admin/src/main/java/com/baiye/modules/distribute/converter/JsonStringArrayTypeHandler.java b/admin/src/main/java/com/baiye/modules/distribute/converter/JsonStringArrayTypeHandler.java index de7e49f..fc15c13 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/converter/JsonStringArrayTypeHandler.java +++ b/admin/src/main/java/com/baiye/modules/distribute/converter/JsonStringArrayTypeHandler.java @@ -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 { - private static final ObjectMapper mapper = new ObjectMapper(); +public class JsonStringArrayTypeHandler extends BaseTypeHandler> { + 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 parameter, JdbcType jdbcType) throws SQLException { + ps.setString(i, toJson(parameter)); } @Override - public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException { + public List 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 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 getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return this.toObject(cs.getString(columnIndex)); } - private String toJson(String[] params) { + private String toJson(List params) { try { - return mapper.writeValueAsString(params); + return MAPPER.writeValueAsString(params); } catch (Exception e) { e.printStackTrace(); } return "[]"; } - private String[] toObject(String content) { + private List 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); } diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/OceanEngineSourceEntity.java b/admin/src/main/java/com/baiye/modules/distribute/entity/OceanEngineSourceEntity.java new file mode 100644 index 0000000..5442020 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/OceanEngineSourceEntity.java @@ -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; +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/OceanEngineToken.java b/admin/src/main/java/com/baiye/modules/distribute/entity/OceanEngineToken.java index 15b23d3..b7219b2 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/entity/OceanEngineToken.java +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/OceanEngineToken.java @@ -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 advertiserIds; diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/OceanEngineSourceMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/OceanEngineSourceMapper.java new file mode 100644 index 0000000..89e0a5c --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/OceanEngineSourceMapper.java @@ -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 { +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/OceanEngineClueService.java b/admin/src/main/java/com/baiye/modules/distribute/service/OceanEngineClueService.java new file mode 100644 index 0000000..966742b --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/OceanEngineClueService.java @@ -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); +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/OceanEngineService.java b/admin/src/main/java/com/baiye/modules/distribute/service/OceanEngineService.java index 817e9b2..b0b0fd5 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/OceanEngineService.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/OceanEngineService.java @@ -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); /** diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineClueServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineClueServiceImpl.java new file mode 100644 index 0000000..2d6dff6 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineClueServiceImpl.java @@ -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 implements OceanEngineClueService { + + private final OceanEngineService oceanEngineService; + + @Override + public void getFeiYuSource(Date startTime, Date endTime) { + + //查询需要同步线索的token + List oceanEngineTokens = oceanEngineService.findByStatus(1); + if (CollUtil.isEmpty(oceanEngineTokens)) { + return; + } + + for (OceanEngineToken oceanEngineToken : oceanEngineTokens) { + String accessToken = oceanEngineToken.getAccessToken(); + //管家ids + List 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 advertisers, Date startTime, Date endTime) { + + if (CollUtil.isEmpty(advertisers)) { + return; + } + List advertiseList = getAdvertiseIds(accessToken, advertisers); + if (CollUtil.isEmpty(advertiseList)) { + return; + } + Map 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 getAdvertiseIds(String accessToken, List advertisers) { + //所有广告主的id + List 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 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 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 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(); + } +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineServiceImpl.java index eb8abe2..5f6bdd9 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/OceanEngineServiceImpl.java @@ -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 findByStatus(int oneNumber) { - return null; + LambdaQueryWrapper 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; } diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/StoreServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/StoreServiceImpl.java index 3e48a3a..ec1853e 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/impl/StoreServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/StoreServiceImpl.java @@ -65,18 +65,26 @@ public class StoreServiceImpl extends ExtendServiceImpl 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())); } diff --git a/admin/src/main/java/com/baiye/task/RefreshTokenTask.java b/admin/src/main/java/com/baiye/task/RefreshTokenTask.java index fef9fa6..a680359 100644 --- a/admin/src/main/java/com/baiye/task/RefreshTokenTask.java +++ b/admin/src/main/java/com/baiye/task/RefreshTokenTask.java @@ -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); }