Merge remote-tracking branch 'origin/master'

master
bynt 10 months ago
commit f07a4b1df6

@ -0,0 +1,27 @@
package com.baiye.constant;
/**
*
*/
public class SecretConstant {
/**
* yuyou address
*/
public static final String SECRET_DECRYPT_YY_URL = "https://bd.hzdaba.cn:8085/v3/Accounts/yuyou_bd/BigData/DecryptTel";
/**
* yuyou sign
*/
public static final String SECRET_DECRYPT_YY_SIG = "7f49e3f9c17c0f3c8fca84168161ed37";
/**
* yuyou id
*/
public static final String SECRET_DECRYPT_YY_ID = "yuyou_bd";
/**
*
*/
public static final String SECRET_DECRYPT_TIME_FORMATE = "yyyyMMddHHmmss";
}

@ -0,0 +1,43 @@
package com.baiye.pojo;
public class SecretResponseBean {
private String result;
private String reason;
private String tels;
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public String getTels() {
return tels;
}
public void setTels(String tels) {
this.tels = tels;
}
@Override
public String toString() {
return "SecretResponseBean{" +
"result='" + result + '\'' +
", reason='" + reason + '\'' +
", tels='" + tels + '\'' +
'}';
}
}

@ -0,0 +1,106 @@
package com.baiye.util;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.constant.SecretConstant;
import com.baiye.pojo.SecretResponseBean;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
* @author jt
*/
@Slf4j
public class DecryptPnoUtil {
private static final String HTTP_RESPONSE_JSON_FORMATE = "application/x-www-form-urlencoded";
public static String decryptPno(String origins) {
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("sig", createSig());
paramMap.put("appid", SecretConstant.SECRET_DECRYPT_YY_ID);
paramMap.put("tels", Base64.encode(origins));
//链式构建请求
String result = HttpRequest.post(SecretConstant.SECRET_DECRYPT_YY_URL)
.header(Header.CONTENT_TYPE, HTTP_RESPONSE_JSON_FORMATE)
.form(paramMap)
.timeout(2_000)
.execute().body();
SecretResponseBean secretResponseBean = JSONUtil.toBean(result, SecretResponseBean.class);
return Base64.decodeStr(secretResponseBean.getTels());
}
/**
* sig
*
* @return sig
*/
private static String createSig() {
return SecureUtil.md5(
SecretConstant.SECRET_DECRYPT_YY_ID
+ SecretConstant.SECRET_DECRYPT_YY_SIG
+ DateUtil.format(new Date(), SecretConstant.SECRET_DECRYPT_TIME_FORMATE));
}
/**
*
*
* @param origins
* @return
*/
public static SecretResponseBean batchDecryptPno(String origins) {
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("sig", createSig());
paramMap.put("appid", SecretConstant.SECRET_DECRYPT_YY_ID);
paramMap.put("tels", origins);
//链式构建请求
String result = HttpRequest.post(SecretConstant.SECRET_DECRYPT_YY_URL)
.header(Header.CONTENT_TYPE, HTTP_RESPONSE_JSON_FORMATE)
.form(paramMap)
.timeout(2_000)
.execute().body();
// 解析响应内容
return JSONUtil.toBean(result, SecretResponseBean.class);
}
public static List<String> decryptPhoneList(List<String> phoneSets) {
List<String> decryptList = Lists.newArrayList();
// 集合分割
List<List<String>> partitions = ListUtil.partition(phoneSets, DefaultNumberConstants.TWO_HUNDRED);
for (List<String> partition : partitions) {
String join = Joiner.on(StrPool.COMMA).skipNulls().join(partition);
// 批量解析号码
SecretResponseBean responseBean = DecryptPnoUtil.batchDecryptPno
(Base64.encode(StringUtils.substringBeforeLast(join, StrPool.COMMA)));
if (ObjectUtil.isNotNull(responseBean) && ObjectUtil.isNotNull(responseBean.getTels())) {
String decodeStr = Base64.decodeStr(responseBean.getTels());
String[] split = decodeStr.split(StrPool.COMMA);
if (split.length > DefaultNumberConstants.ZERO_NUMBER) {
decryptList.addAll(Lists.newArrayList(Arrays.asList(split)));
}
}
}
return decryptList;
}
}

@ -1,19 +1,13 @@
package com.baiye.modules.distribute.controller;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.modules.distribute.dto.DirectClueDTO;
import com.baiye.modules.distribute.entity.DirectClueUserEntity;
import com.baiye.modules.distribute.qo.DirectClueQo;
import com.baiye.modules.distribute.service.DirectClueService;
import com.baiye.modules.distribute.service.OceanEngineClueService;
import com.baiye.modules.distribute.vo.DirectClueVO;
import com.baiye.result.BaseResultCode;
import com.baiye.result.R;
import com.baiye.security.util.SecurityUtils;
import com.baiye.validation.group.UpdateGroup;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
@ -31,8 +25,6 @@ public class DirectClueController {
private final DirectClueService directClueService;
private final OceanEngineClueService oceanEngineClueService;
@GetMapping("/page")
@Operation(summary = "分页查询资源")
public R<PageResult<DirectClueVO>> getClueRecordPage(@Validated PageParam pageParam, DirectClueQo qo) {
@ -44,25 +36,9 @@ public class DirectClueController {
return R.ok(directClueService.queryPage(pageParam, qo));
}
@PostMapping("/update")
@Operation(summary = "修改", description = "修改")
public R<Object> update(@Validated({UpdateGroup.class}) @RequestBody DirectClueDTO directClueDTO) {
return directClueService.update(directClueDTO) ? R.ok() : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "修改失败");
}
@PostMapping("/distribute")
@Operation(summary = "分发员分发")
public R<Object> distribute(@Valid @RequestBody List<DirectClueUserEntity> directClueUserList) {
return R.ok(directClueService.distribute(directClueUserList));
}
@GetMapping("/test")
@Operation(summary = "分页查询资源")
public R<Object> test() {
DateTime date = DateUtil.parse("2023-11-02 00:00:00");
DateTime date2 = DateUtil.parse("2023-11-03 23:00:00");
oceanEngineClueService.getFeiYuSource(date, date2);
return R.ok();
}
}

@ -56,4 +56,8 @@ public class DBPushClueDTO {
private String remark;
/**
* , mobile
*/
private String called;
}

@ -57,14 +57,9 @@ public class DirectClueEntity extends BaseEntity {
@Schema(title = "其它线索信息")
private String otherClue;
public DirectClueEntity(String batchNo, String customName, String nid, Integer originType, Integer effectiveStatus, Integer distributeType, LocalDateTime distributeDate, String otherClue) {
this.batchNo = batchNo;
public DirectClueEntity(String customName, String nid, String otherClue) {
this.customName = customName;
this.nid = nid;
this.originType = originType;
this.effectiveStatus = effectiveStatus;
this.distributeType = distributeType;
this.distributeDate = distributeDate;
this.otherClue = otherClue;
}
}

@ -1,7 +1,6 @@
package com.baiye.modules.distribute.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
@ -20,6 +19,7 @@ import com.baiye.system.enums.RoleCodeEnum;
import com.baiye.system.model.dto.SysUserNameRoleDTO;
import com.baiye.system.service.SysUserService;
import com.baiye.util.AESUtils;
import com.baiye.util.MobileUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import lombok.RequiredArgsConstructor;
@ -28,6 +28,9 @@ import org.ballcat.security.properties.SecurityProperties;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -51,13 +54,13 @@ public class DirectClueServiceImpl extends ExtendServiceImpl<DirectClueMapper, D
PageResult<DirectClueVO> pageResult = baseMapper.queryPage(pageParam, qo);
List<DirectClueVO> recordList = pageResult.getRecords();
if (CollUtil.isNotEmpty(recordList)){
if (CollUtil.isNotEmpty(recordList)) {
// 线索接收人映射信息
Map<Long, List<DirectClueUserEntity>> map = new HashMap<>();
if (qo.getDistributeUserId() != null){
if (qo.getDistributeUserId() != null) {
List<Long> ids = recordList.stream().map(DirectClueVO::getDirectClueId).collect(Collectors.toList());
List<DirectClueUserEntity> userEntities = directClueUserMapper.selectList(new LambdaQueryWrapper<DirectClueUserEntity>().in(DirectClueUserEntity::getClueId, ids));
map = userEntities.stream().collect(Collectors.groupingBy(DirectClueUserEntity::getClueId));
map = userEntities.stream().collect(Collectors.groupingBy(DirectClueUserEntity::getClueId));
}
for (DirectClueVO directClueVO : recordList) {
// 手机号解密 显示位数
@ -69,18 +72,18 @@ public class DirectClueServiceImpl extends ExtendServiceImpl<DirectClueMapper, D
directClueVO.setNid(decryptNid);
//标签类型转换
String clueLabelName = directClueVO.getClueLabelName();
if (StringUtils.isNotBlank(clueLabelName)){
if (StringUtils.isNotBlank(clueLabelName)) {
directClueVO.setClueLabelName("");
directClueVO.setClueLabel(JSONUtil.toList(clueLabelName, String.class));
}
// 线索接收人
if (qo.getDistributeUserId() != null && map.containsKey(directClueVO.getDirectClueId())){
if (qo.getDistributeUserId() != null && map.containsKey(directClueVO.getDirectClueId())) {
List<DirectClueUserEntity> directClueUserEntities = map.get(directClueVO.getDirectClueId());
List<String> userNames = directClueUserEntities.stream().map(DirectClueUserEntity::getUserName).collect(Collectors.toList());
directClueVO.setUserNameList(userNames);
}
// 其它线索信息转换
if (StringUtils.isNotBlank(directClueVO.getOtherClue())){
if (StringUtils.isNotBlank(directClueVO.getOtherClue())) {
directClueVO.setOtherClueObj(JSONUtil.parseObj(directClueVO.getOtherClue()));
directClueVO.setOtherClue("");
}
@ -105,18 +108,27 @@ public class DirectClueServiceImpl extends ExtendServiceImpl<DirectClueMapper, D
@Transactional(rollbackFor = Exception.class)
public void allocationClue(Long userId, List<DirectClueEntity> directClueEntityList) {
if (userId != null && CollUtil.isNotEmpty(directClueEntityList)) {
List<SysUserNameRoleDTO> sysUserNameRoleDTOS = sysUserService.listByRoleCodeAndUserId(RoleCodeEnum.find(25L), userId);
Date date = new Date();
LocalDateTime dateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
List<SysUserNameRoleDTO> sysUserNameRoleDTOS = sysUserService.listByRoleCodeAndUserId(RoleCodeEnum.find(25L), userId);
List<Long> userIdList = sysUserNameRoleDTOS.stream().map(SysUserNameRoleDTO::getUserId).collect(Collectors.toList());
int index = 0;
if (userIndexMap.containsKey(userId)) index = userIndexMap.get(userId);
for (DirectClueEntity directClueEntity : directClueEntityList) {
directClueEntity.setDistributeUserId(userIdList.get(index));
if (index < userIdList.size() - 1) index++;
else index = 0;
directClueEntity.setCreateBy(userId);
directClueEntity.setDistributeDate(dateTime);
directClueEntity.setOriginType(0);
directClueEntity.setEffectiveStatus(0);
directClueEntity.setDistributeType(0);
if (MobileUtil.checkPhone(directClueEntity.getNid())) {
directClueEntity.setNid(AESUtils.encrypt(directClueEntity.getNid(), securityProperties.getPasswordSecretKey()));
}
index = (index < userIdList.size() - 1) ? index + 1 : 0;
}
userIndexMap.put(userId, index);
baseMapper.insertBatchSomeColumn(directClueEntityList);
}
}

@ -3,7 +3,6 @@ package com.baiye.modules.distribute.service.impl;
import cn.hutool.core.collection.CollUtil;
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;
@ -18,17 +17,12 @@ import com.baiye.modules.distribute.mapper.OceanEngineSourceMapper;
import com.baiye.modules.distribute.service.DirectClueService;
import com.baiye.modules.distribute.service.OceanEngineClueService;
import com.baiye.modules.distribute.service.OceanEngineService;
import com.baiye.util.AESUtils;
import com.baiye.util.MobileUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.ballcat.security.properties.SecurityProperties;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.nio.charset.Charset;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@ -43,8 +37,6 @@ public class OceanEngineClueServiceImpl extends ExtendServiceImpl<OceanEngineSou
private final OceanEngineService oceanEngineService;
private final SecurityProperties securityProperties;
private final DirectClueService directClueService;
@Override
@ -196,17 +188,8 @@ public class OceanEngineClueServiceImpl extends ExtendServiceImpl<OceanEngineSou
oceanEngineSource.setContent(JSONUtil.toJsonStr(json));
oceanEngineSources.add(oceanEngineSource);
//传递线索
boolean bool = MobileUtil.checkPhone(phone);
if (bool) {
Date date = new Date();
LocalDateTime dateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
String nid = AESUtils.encrypt(phone, securityProperties.getPasswordSecretKey());
String jsonStr = JSONUtil.toJsonStr(map);
DirectClueEntity directClueEntity = new DirectClueEntity("", name, nid, 0, 0, 0, dateTime, jsonStr);
directClueEntity.setCreateBy(userId);
directClueEntityList.add(directClueEntity);
}
DirectClueEntity directClueEntity = new DirectClueEntity(name, phone, JSONUtil.toJsonStr(map));
directClueEntityList.add(directClueEntity);
}
directClueService.allocationClue(userId, directClueEntityList);
baseMapper.insertBatchSomeColumn(oceanEngineSources);

@ -11,11 +11,13 @@ import com.baiye.modules.distribute.mapper.UserSecretKeyMapper;
import com.baiye.modules.distribute.service.ClueService;
import com.baiye.modules.distribute.service.OutsideReqService;
import com.baiye.task.service.SyncTaskService;
import com.baiye.util.DecryptPnoUtil;
import com.baiye.util.MobileUtil;
import com.baiye.util.RsaUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@ -35,24 +37,30 @@ public class OutsideReqServiceImpl implements OutsideReqService {
@Override
public void pushClue(String appKey, DBPushClueDTO dbPushClueDTO) {
log.info("推送appKey{},推送信息:{}", appKey, dbPushClueDTO);
if (dbPushClueDTO != null && dbPushClueDTO.getMobile() != null) {
log.info("推送appKey{},推送信息:{}", appKey, dbPushClueDTO);
if (dbPushClueDTO != null && (dbPushClueDTO.getMobile() != null || dbPushClueDTO.getCalled() != null)) {
String mobileDecodeStr = null;
String remark = dbPushClueDTO.getRemark();
String empClientTypeName = dbPushClueDTO.getEmpClientTypeName();
String called = dbPushClueDTO.getCalled();
try {
byte[] mobileDecode = Base64.getDecoder().decode(dbPushClueDTO.getMobile());
mobileDecodeStr = new String(mobileDecode, StandardCharsets.UTF_8);
if (StringUtils.isNotBlank(dbPushClueDTO.getMobile())) {
byte[] mobileDecode = Base64.getDecoder().decode(dbPushClueDTO.getMobile());
mobileDecodeStr = new String(mobileDecode, StandardCharsets.UTF_8);
} else if (StringUtils.isNotBlank(called) && StringUtils.isNotBlank(empClientTypeName) && empClientTypeName.equals("A")) {
mobileDecodeStr = DecryptPnoUtil.decryptPno(called);
}else {
return;
}
} catch (Exception e) {
log.error("============推送解码手机号失败============");
log.error("============解密手机号失败============");
return;
}
// 添加线索
boolean bool = MobileUtil.checkPhone(mobileDecodeStr);
if (bool) {
syncTaskService.pushClueExecuteTask(appKey, mobileDecodeStr);
} else {
log.error("============推送手机号检验不通过============");
}
} else {
log.info("============推送了空数据或者空手机号============");
if (bool) syncTaskService.pushClueExecuteTask(appKey, mobileDecodeStr, remark);
else log.error("============号码非法============");
}
}
@ -61,8 +69,7 @@ public class OutsideReqServiceImpl implements OutsideReqService {
String appKey = receivePushLeadsDTO.getAppKey();
List<String> clueList = receivePushLeadsDTO.getClueList();
UserSecretKeyEntity entity = userSecretKeyMapper
.selectOne(new LambdaQueryWrapper<UserSecretKeyEntity>().eq(UserSecretKeyEntity::getAppKey, appKey));
UserSecretKeyEntity entity = userSecretKeyMapper.selectOne(new LambdaQueryWrapper<UserSecretKeyEntity>().eq(UserSecretKeyEntity::getAppKey, appKey));
if (entity != null && CollUtil.isNotEmpty(clueList)) {
List<ClueEntity> clueEntityList = new ArrayList<>();
for (String clueStr : clueList) {

@ -16,7 +16,6 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.Collections;
@Service
@ -36,8 +35,7 @@ public class PushLinkServiceImpl extends ExtendServiceImpl<PushLinkMapper, PushL
String dbPushUrl = urlsProperties.getDbPushUrl();
Long userId = pushLinkDTO.getUserId();
PushLinkEntity pushLinkEntity = baseMapper
.selectOne(new LambdaQueryWrapper<PushLinkEntity>().eq(PushLinkEntity::getUserId, userId));
PushLinkEntity pushLinkEntity = baseMapper.selectOne(new LambdaQueryWrapper<PushLinkEntity>().eq(PushLinkEntity::getUserId, userId));
if (pushLinkEntity != null) {
dbPushUrl = dbPushUrl.concat(pushLinkEntity.getAppKey()).concat("?dataType=detail&encrypt=1");
}
@ -45,18 +43,15 @@ public class PushLinkServiceImpl extends ExtendServiceImpl<PushLinkMapper, PushL
// 生成的appKey标识重复,重新生成
String appKey = AppUtils.getAppId();
while (true) {
PushLinkEntity entity = baseMapper
.selectOne(new LambdaQueryWrapper<PushLinkEntity>().eq(PushLinkEntity::getAppKey, appKey));
if (entity == null)
break;
PushLinkEntity entity = baseMapper.selectOne(new LambdaQueryWrapper<PushLinkEntity>().eq(PushLinkEntity::getAppKey, appKey));
if (entity == null) break;
appKey = AppUtils.getAppId();
}
dbPushUrl = dbPushUrl.concat(appKey).concat("?dataType=detail&encrypt=1");
// 创建记录(任务)
ClueRecordEntity clueRecordEntity = clueRecordService
.addDefaultRecordService(SecurityUtils.getCurrentUserId(), dtoName, dtoName);
ClueRecordEntity clueRecordEntity = clueRecordService.addDefaultRecordService(SecurityUtils.getCurrentUserId(), dtoName, dtoName);
Long recordId = clueRecordEntity.getClueRecordId();
// 插入数据
PushLinkEntity saveEntity = new PushLinkEntity();
saveEntity.setUserId(userId);
saveEntity.setAppKey(appKey);

@ -9,8 +9,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@ -22,7 +20,6 @@ public class DistributeTaskSyncServiceImpl implements DistributeTaskSyncService
private final DistributeTaskMapper distributeTaskMapper;
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public void executeTask(List<Long> userIdList, DistributeTaskService distributeTaskService) {
List<DistributeTaskEntity> taskEntities = distributeTaskMapper
.selectList(new LambdaQueryWrapper<DistributeTaskEntity>().eq(DistributeTaskEntity::getDefaultType, 0)

@ -37,7 +37,7 @@ public class SyncTaskServiceImpl implements SyncTaskService {
private final DistributeTaskService distributeTaskService;
@Override
public void pushClueExecuteTask(String appKey, String mobile) {
public void pushClueExecuteTask(String appKey, String mobile, String remark) {
// 查询appKey映射的记录
PushLinkEntity linkEntity = pushLinkService.getByAppKey(appKey);
if (linkEntity != null) {
@ -47,6 +47,7 @@ public class SyncTaskServiceImpl implements SyncTaskService {
clueEntity.setClueRecordId(linkEntity.getClueRecordId());
// clueEntity.setOtherClue(JSONUtil.toJsonStr(dbPushClueDTO));
clueEntity.setCreateBy(linkEntity.getCreateBy());
clueEntity.setRemark(remark);
clueService.save(clueEntity);
// 执行任务
DistributeTaskEntity entity = distributeTaskMapper.selectOne(

@ -6,7 +6,7 @@ import org.springframework.scheduling.annotation.Async;
public interface SyncTaskService {
@Async
void pushClueExecuteTask(String appKey, String mobile);
void pushClueExecuteTask(String appKey, String mobile, String remark);
@Async
void clueUpload(ClueRecordEntity clueRecordEntity);

@ -19,7 +19,7 @@ business:
#门店专员
storeCode: ROLE_STORE_SALESMAN
urls:
dbPushUrl: http://cs.tuoz.net:8100/outside/pushClue/
dbPushUrl: http://39.100.77.21:8001/api/outside/pushClue/
#mybatis plus 设置
mybatis-plus:

Loading…
Cancel
Save