更新了代码

master
土豆兄弟 4 years ago
parent 5ce0f65f4e
commit 0b01523d4e

@ -0,0 +1,40 @@
/*
Navicat Premium Data Transfer
Source Server : -
Source Server Type : MySQL
Source Server Version : 50731
Source Host : 47.99.218.9:3306
Source Schema : push
Target Server Type : MySQL
Target Server Version : 50731
File Encoding : 65001
Date: 22/10/2020 20:35:31
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for xxx_message
-- ----------------------------
DROP TABLE IF EXISTS `xxx_message`;
CREATE TABLE `xxx_message` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`gmt_create` datetime(0) NULL DEFAULT NULL,
`gmt_modified` datetime(0) NULL DEFAULT NULL,
`rec_id` bigint(20) NULL DEFAULT NULL COMMENT '记录id',
`pnum` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'pnum',
`act_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '业务名',
`start_time` datetime(0) NULL DEFAULT NULL COMMENT '业务开始时间',
`client_type` tinyint(1) NULL DEFAULT NULL COMMENT '业务类别(1:A,2:B,3:C,4:D,5:E,6:F)',
`app_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '上游推送用户id',
`push_time` datetime(0) NULL DEFAULT NULL COMMENT '上游推送时间',
`send_status` tinyint(1) NULL DEFAULT 0 COMMENT '下游推送状态',
PRIMARY KEY (`id`) USING BTREE,
INDEX `ind_rec_id`(`rec_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;

@ -81,6 +81,11 @@
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
</dependencies>
<build>

@ -187,6 +187,20 @@ public class ABClient {
CommonResponse.createBySuccess() : CommonResponse.createByErrorMessage("调用失败请重试");
}
@PostMapping("/api/req/taginfo/local")
@ResponseBody
public CommonResponse getDBTagInfoLocal(@RequestBody ABClientInterMessageVO vo) {
// 记录日志
log.info("====== [ Taginfo local request is comming, request content is {} ] ======", vo.toString());
// 转换实体类映射
List<ABMessageDTO> dtos = ABMessageConverter.convertABMessageDTOFromVO(vo);
// 调用业务处理接口 返回校验成功的结果
return abClientService.recordAndSendABClientMsgWxFans(dtos, false) ?
CommonResponse.createBySuccess() : CommonResponse.createByErrorMessage("调用失败请重试");
}
/**
* AB
*
@ -223,15 +237,33 @@ public class ABClient {
@ResponseBody
public CommonResponse getLieheTagInfo(@RequestBody ABClientInterMessageVO vo) {
// 记录日志
log.info("====== [ one request comming, request content is {} ] ======", vo.toString());
log.info("====== [ LieheTagInfo request comming, request content is {} ] ======", vo.toString());
// 转换实体类映射
List<ABMessageDTO> dtos = ABMessageConverter.convertABMessageDTOFromVO(vo);
List<LieheMessageDTO> dtos = ABMessageConverter.convertLieheMessageDTOFromVO(vo);
// 调用业务处理接口 返回校验成功的结果
return abClientService.recordAndSendLieheMsg(dtos) ?
CommonResponse.createBySuccess() : CommonResponse.createByErrorMessage("调用失败请重试");
}
/**
* AB
*
* @return
*/
@PostMapping("/api/req/taginfo/liehe/quke")
@ResponseBody
public CommonResponse getLieheQukeTagInfo(@RequestBody ABClientInterMessageVO vo) {
// 记录日志
log.info("====== [ LieheQukeTagInfo request comming, request content is {} ] ======", vo.toString());
// 转换实体类映射
List<LieheMessageDTO> dtos = ABMessageConverter.convertLieheMessageDTOFromVO(vo);
// 调用业务处理接口 返回校验成功的结果
return abClientService.recordAndSendLieheQKMsg(dtos) ?
CommonResponse.createBySuccess() : CommonResponse.createByErrorMessage("调用失败请重试");
}
/**
*
*

@ -13,8 +13,10 @@ public enum LuoShiAppIDEnum {
/**
* -
*/
LS_WY_MATH("网易有道-数学","A"),
LS_WY_OTHER("其他","B")
LS_WY_MATH("网易有道课-数学-罗实","C"),
LS_WY_OTHER("作业帮-数学-罗实","D"),
LS_QEFD_MATH("企鹅辅导-数学-罗实","E"),
NO_MATCH("不匹配","XX")
;
LuoShiAppIDEnum(String actName, String tag) {
@ -34,13 +36,13 @@ public enum LuoShiAppIDEnum {
*/
public static String tagOf(String matchStr) {
if (StrUtil.isBlank(matchStr)) {
return LuoShiAppIDEnum.LS_WY_OTHER.getTag();
return NO_MATCH.getTag();
}
for (LuoShiAppIDEnum luoShiAppIDEnum : LuoShiAppIDEnum.values()) {
if (StringUtils.countMatches(matchStr, luoShiAppIDEnum.getActName()) >= 0){
if (StringUtils.contains(matchStr, luoShiAppIDEnum.getActName())){
return luoShiAppIDEnum.getTag();
}
}
return LuoShiAppIDEnum.LS_WY_OTHER.getTag();
return NO_MATCH.getTag();
}
}

@ -0,0 +1,20 @@
package com.yuyou.openapi.openapi.common.enums;
import lombok.Getter;
@Getter
public enum SourceEnum {
MY_SOURCE_TAG(1, "BY-LH");
private Integer tagCode;
private String tagValue;
SourceEnum(Integer tagCode, String tagValue) {
this.tagCode = tagCode;
this.tagValue = tagValue;
}
}

@ -0,0 +1,25 @@
package com.yuyou.openapi.openapi.dao;
import com.yuyou.openapi.openapi.model.dataobject.LocalDataMessageDO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
/**
* Copyright (C), 2012 - 2018, qyx
* FileName: LuoshiMessageRepository
* Author:
* Date: 2020/10/22 2:52 PM
* Description: TODO
* History:
* <author> <time> <version> <desc>
* 2020/10/22 v1.0
*/
@Repository
public interface LocalDataMessageRepository extends JpaRepository<LocalDataMessageDO, Long>{
@Modifying
@Query("update LocalDataMessageDO t set t.sendStatus = ?1 where t.recId = ?2")
void updateSendStatus(Integer sendStatus, Long recId);
}

@ -6,6 +6,9 @@ import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
/**
* Copyright (C), 2012 - 2018, qyx
* FileName: LuoshiMessageRepository
@ -21,5 +24,10 @@ public interface LuoshiMessageRepository extends JpaRepository<LuoshiMessageDO,
@Modifying
@Query("update LuoshiMessageDO t set t.sendStatus = ?1 where t.recId = ?2")
void updateSendStatus(Integer sendStatus, Long recId);
@Query("from LuoshiMessageDO a where a.pushTime >= ?1 and a.pushTime < ?2 and a.sendStatus = ?3 ")
List<LuoshiMessageDO> findAllByPushTimeAndSendStatus(Date startPushTime, Date endPushTime, Integer sendStatus);
}

@ -6,6 +6,7 @@ import com.yuyou.openapi.openapi.common.security.SecurityConstants;
import com.yuyou.openapi.openapi.common.security.SecurityService;
import com.yuyou.openapi.openapi.model.dataobject.*;
import com.yuyou.openapi.openapi.model.dto.ABMessageDTO;
import com.yuyou.openapi.openapi.model.dto.LieheMessageDTO;
import com.yuyou.openapi.openapi.model.vo.ABClientInterMessageVO;
import com.yuyou.openapi.openapi.utils.DateUtils;
import lombok.extern.slf4j.Slf4j;
@ -44,6 +45,10 @@ public class ABMessageConverter {
ABMessageDTO abMessageDTO = new ABMessageDTO();
abMessageDTO.setAppId(abMessageVO.getAppId());
abMessageDTO.setTimestamp(abMessageVO.getTimestamp());
// 设置默认的坐席ID为 0
if (each.getEmpId() == null){
each.setEmpId(0);
}
// 对特殊的ActName进行处理
checkSpecailAppName(each);
BeanUtils.copyProperties(each, abMessageDTO);
@ -54,6 +59,40 @@ public class ABMessageConverter {
return dataList;
}
/**
* VODTO
* @param abMessageVO
* @return
*/
public static List<LieheMessageDTO> convertLieheMessageDTOFromVO(ABClientInterMessageVO abMessageVO) {
List<LieheMessageDTO> dataList = new ArrayList<>();
if (abMessageVO == null){
return new ArrayList<>();
}
List<ABClientInterMessageVO.DetailInfo> detailInfoList = abMessageVO.getData();
if (CollectionUtils.isEmpty(detailInfoList)){
return new ArrayList<>();
}
detailInfoList.forEach(
each->{
LieheMessageDTO lieheMessageDTO = new LieheMessageDTO();
lieheMessageDTO.setAppId(abMessageVO.getAppId());
lieheMessageDTO.setTimestamp(abMessageVO.getTimestamp());
// 对特殊的ActName进行处理
checkSpecailAppName(each);
BeanUtils.copyProperties(each, lieheMessageDTO);
dataList.add(lieheMessageDTO);
}
);
return dataList;
}
/**
* DTODO
* @param list
@ -179,7 +218,7 @@ public class ABMessageConverter {
}
List<WxFansMessageDO> abMessageDOs = new ArrayList<>();
dtos.forEach(each -> {
WxFansMessageDO abMessageDO = convertWxFansMessageDOFromDTO(each);
WxFansMessageDO abMessageDO = converWxDataDOFromDTO(each);
if (abMessageDO != null) {
abMessageDOs.add(abMessageDO);
}
@ -187,6 +226,26 @@ public class ABMessageConverter {
return abMessageDOs;
}
/**
* DTODO
* @param dtos
* @return
*/
public static List<LocalDataMessageDO> convertLocalDataABMessageDOFromDTO(List<ABMessageDTO> dtos) {
if (CollectionUtils.isEmpty(dtos)) {
return null;
}
List<LocalDataMessageDO> abMessageDOs = new ArrayList<>();
dtos.forEach(each -> {
LocalDataMessageDO abMessageDO = converLocalDataDOFromDTO(each);
if (abMessageDO != null) {
abMessageDOs.add(abMessageDO);
}
});
return abMessageDOs;
}
/**
* DTODO
@ -225,7 +284,7 @@ public class ABMessageConverter {
* @param list
* @return
*/
public static List<LieheMessageDO> convertLieheMessageDOFromDTO(List<ABMessageDTO> list) {
public static List<LieheMessageDO> convertLieheMessageDOFromDTO(List<LieheMessageDTO> list) {
if (CollectionUtils.isEmpty(list)) {
return null;
}
@ -251,6 +310,8 @@ public class ABMessageConverter {
}
BeanUtils.copyProperties(abMessageDTO, lieheMessageDO);
// 对特殊的名称进行处理
checkActName(abMessageDTO, lieheMessageDO);
lieheMessageDO.setPushTime(DateUtils.date(abMessageDTO.getTimestamp()));
lieheMessageDO.setStartTime(DateUtils.date(abMessageDTO.getStartTime()));
try{
@ -270,6 +331,27 @@ public class ABMessageConverter {
return lieheMessageDO;
}
/**
* id--1
*
* @param abMessageDTO
* @param lieheMessageDO
*/
private static void checkActName(ABMessageDTO abMessageDTO, LieheMessageDO lieheMessageDO) {
String actName = abMessageDTO.getActName();
if (StringUtils.isBlank(actName)){
log.error("ABMessageConverter:checkActName is ERROR,check param abMessageDTO is {}", abMessageDTO);
}
// String decodeStr = Base64.decodeStr(actName, CharsetUtil.UTF_8);
// log.info("test decodeStr str is {}", decodeStr);
String trueName = actName;
if (StringUtils.split(actName,"-").length == 2){
// 通配规则为 id-名称
trueName = StringUtils.substringAfterLast(actName, "-");
}
lieheMessageDO.setActName(trueName);
}
/**
* Shiji DTODO
* @param abMessageDTO
@ -432,7 +514,7 @@ public class ABMessageConverter {
* @param abMessageDTO
* @return
*/
public static WxFansMessageDO convertWxFansMessageDOFromDTO(ABMessageDTO abMessageDTO) {
public static WxFansMessageDO converWxDataDOFromDTO(ABMessageDTO abMessageDTO) {
WxFansMessageDO wxFansMessageDO = new WxFansMessageDO();
if (abMessageDTO == null) {
return wxFansMessageDO;
@ -459,6 +541,37 @@ public class ABMessageConverter {
}
/**
* Luoshi DTODO
* @param abMessageDTO
* @return
*/
public static LocalDataMessageDO converLocalDataDOFromDTO(ABMessageDTO abMessageDTO) {
LocalDataMessageDO localDataMessageDO = new LocalDataMessageDO();
if (abMessageDTO == null) {
return localDataMessageDO;
}
BeanUtils.copyProperties(abMessageDTO, localDataMessageDO);
localDataMessageDO.setPushTime(DateUtils.date(abMessageDTO.getTimestamp()));
localDataMessageDO.setStartTime(DateUtils.date(abMessageDTO.getStartTime()));
try{
localDataMessageDO.setRecId(Long.valueOf(abMessageDTO.getRecId()));
}catch (Exception e){
log.error("String convert Long type Error.", e);
}
// AES加密
try {
String encryptedMobile = SecurityService.encrypt(abMessageDTO.getMobile(), SecurityConstants.PHONE);
localDataMessageDO.setPnum(encryptedMobile);
} catch (Exception e) {
log.error("Encrypt Mobile raise Error, recId = {}, error is :", abMessageDTO.getRecId(), e);
localDataMessageDO.setPnum(abMessageDTO.getMobile());
}
return localDataMessageDO;
}
/**

@ -0,0 +1,76 @@
package com.yuyou.openapi.openapi.model.dataobject;
import lombok.Data;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.util.Date;
@Data
@Table(name = "local_data_message")
@Entity
@EntityListeners(AuditingEntityListener.class)
public class LocalDataMessageDO {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
@Column(name = "gmt_create")
@CreatedDate
private Date gmtCreate;
@Column(name = "gmt_modified")
@LastModifiedDate
private Date gmtModified;
/**
* id
*/
@Column(name = "rec_id")
private Long recId;
/**
*
*/
@Column(name = "pnum")
private String pnum;
/**
*
*/
@Column(name = "act_name")
private String actName;
/**
*
*/
@Column(name = "start_time")
private Date startTime;
/**
* (1:A,2:B,3:C,4:D,5:E,6:F)
*/
@Column(name = "client_type")
private Integer clientType;
/**
* id
*/
@Column(name = "app_id")
private String appId;
/**
*
*/
@Column(name = "push_time")
private Date pushTime;
/**
* 0 0 - 1 -
*/
@Column(name = "send_status")
private Integer sendStatus = 0;
}

@ -57,4 +57,12 @@ public class ABMessageDTO {
*/
@JSONField(name = "id")
private String recId;
/**
* ,
*/
@JSONField(name = "third_user_code")
private Integer empId;
}

@ -1,67 +1,61 @@
package com.yuyou.openapi.openapi.model.dto;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.*;
import java.util.Date;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LieheMessageCovDTO {
/**
* ID
*/
@JSONField(name = "tip_id")
private String recId;
/**
*
*/
@JSONField(name = "tip_time", format = "yyyy/MM/dd HH:mm:ss")
private Date pushTime;
/**
* pNum
*/
@JSONField(name = "phone")
private String pNum;
/**
*
*/
private String province = "未知";
/**
*
*/
private String city = "未知";
/**
*
*/
@JSONField(name = "intention")
private String intention;
/**
*
*/
@JSONField(name = "project_name")
private String actName;
/**
* ID
*/
private String channel = "quke_yy";
/**
*
*/
private String sign;
@JSONField(name = "app_id")
private String appId;
@JSONField(name = "timestamp")
private Long timestamp;
@JSONField(name = "signature")
private String signature;
@JSONField(name = "data")
private List<LieheData> data;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public static class LieheData {
/**
*
*/
@JSONField(name = "subType")
private String subName;
/**
*
*/
@JSONField(name = "info")
private String phone;
/**
*
*/
@JSONField(name = "time")
private Long time;
/**
*
*/
@JSONField(name = "type")
private Integer type;
/**
*
*/
private String recId;
}
}

@ -0,0 +1,50 @@
package com.yuyou.openapi.openapi.model.dto;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LieheMessageCovDTO2 {
/**
* ID
*/
@JSONField(name = "taskCode")
private String taskCode;
/**
* pNum
*/
@JSONField(name = "mobile")
private String mobile;
/**
* tag
*/
@JSONField(name = "tag")
private String tag;
/**
*
*/
@JSONField(name = "source")
private String source;
/**
*
*/
@JSONField(name = "messages")
private List< LieheMessageDTO.ChatMsg> messages;
/**
* ID
*/
private String recId;
}

@ -0,0 +1,32 @@
package com.yuyou.openapi.openapi.model.dto;
import lombok.*;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class LieheMessageDTO extends ABMessageDTO{
/**
* ,
*/
private List<ChatMsg> messages;
/**
*
*/
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public static class ChatMsg {
private Long talkTime;
private Integer talkerType;
private String message;
}
}

@ -1,10 +1,7 @@
package com.yuyou.openapi.openapi.model.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.*;
import java.io.Serializable;
import java.util.List;
@ -74,5 +71,37 @@ public class ABClientInterMessageVO extends ABClientBaseVO implements Serializab
*/
@JsonProperty(value = "rec_id")
private String recId;
/**
* ,
*/
private List<ChatMsg> messages;
// modify by x 2021-1-29
/**
* , , 0
*/
@JsonProperty(value = "emp_id", defaultValue = "0")
private Integer empId;
/**
*
*/
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public static class ChatMsg {
private Long talkTime;
private Integer talkerType;
private String message;
}
}
}

@ -52,12 +52,25 @@ public interface ABClientService {
*/
boolean recordAndSendABClientMsgWxFans(List<ABMessageDTO> dtos, boolean tag);
/**
* ,
*/
boolean recordAndSendABClientMsgToLocal(List<ABMessageDTO> dtos);
/**
* TODO:.recordAndSendABClientMsg
* @param dtos
* @return
*/
boolean recordAndSendLieheMsg(List<LieheMessageDTO> dtos);
/**
* TODO:.recordAndSendABClientMsg
* @param dtos
* @return
*/
boolean recordAndSendLieheMsg(List<ABMessageDTO> dtos);
boolean recordAndSendLieheQKMsg(List<LieheMessageDTO> dtos);
/**
* ,

@ -34,10 +34,13 @@ public class ABClientServiceImpl implements ABClientService {
@Autowired
private ABMessageRepository abMessageRepository;
@Autowired
private ShijiMessageRepository shijiMessageRepository;
@Autowired
private LuoshiMessageRepository luoshiMessageRepository;
@Autowired
private PandaMessageRepository pandaMessageRepository;
@ -67,9 +70,13 @@ public class ABClientServiceImpl implements ABClientService {
@Autowired
private SongshuMessageRepository songshuMessageRepository;
@Autowired
private WxFansMessageRepository wxFansMessageRepository;
@Autowired
private LocalDataMessageRepository localDataMessageRepository;
@Autowired
private XuebaMessageRepository xuebaMessageRepository;
@ -81,6 +88,7 @@ public class ABClientServiceImpl implements ABClientService {
@Autowired
private FudaojunMessageRepository fudaojunMessageRepository;
@Autowired
private JiaDongLiMessageRepository jiaDongLiMessageRepository;
@ -202,6 +210,23 @@ public class ABClientServiceImpl implements ABClientService {
return Boolean.TRUE;
}
@Override
public boolean recordAndSendABClientMsgToLocal(List<ABMessageDTO> dtos) {
if (CollectionUtils.isEmpty(dtos)) {
log.error("Param dtos is empty");
return Boolean.FALSE;
}
// 调用接口进行入库
List<LocalDataMessageDO> abMessageDOS = ABMessageConverter.convertLocalDataABMessageDOFromDTO(dtos);
// TODO: 2020/8/10 0010 加密存储
List<LocalDataMessageDO> dos = localDataMessageRepository.saveAll(abMessageDOS);
if (CollectionUtils.isEmpty(dos)){
log.error("========== [insert data error , please check .] ==========");
return Boolean.FALSE;
}
return Boolean.TRUE;
}
@Override
public boolean recordAndSendABClientMsgLuoshi(List<ABMessageDTO> dtos) {
@ -225,14 +250,36 @@ public class ABClientServiceImpl implements ABClientService {
@Override
public boolean recordAndSendLieheMsg(List<ABMessageDTO> dtos) {
public boolean recordAndSendLieheMsg(List<LieheMessageDTO> dtos) {
// 进行判空校验
if (CollectionUtils.isEmpty(dtos)) {
log.error("Param dtos is empty");
return Boolean.FALSE;
}
// 调用接口进行入库
List<LieheMessageDO> lieheMessageDOs = ABMessageConverter.convertLieheMessageDOFromDTO(dtos);
List<LieheMessageDO> dos = lieheMessageRepository.saveAll(lieheMessageDOs);
if (CollectionUtils.isEmpty(dos)){
log.error("========== [insert data error , please check .] ==========");
return Boolean.FALSE;
}
// 调用异步任务进行转发AB单 - 这里是这有一条数据
// 返回处理结果
// fixme 猎河这边有2个推送方式 - 这边分别进行推送
// abDownTask.doLieheRunTask(dtos);
abDownTask.doLieheRunTask2(dtos);
return Boolean.TRUE;
}
@Override
public boolean recordAndSendLieheQKMsg(List<LieheMessageDTO> dtos) {
// 进行判空校验
if (CollectionUtils.isEmpty(dtos)) {
log.error("Param dtos is empty");
return Boolean.FALSE;
}
// 调用接口进行入库
List<LieheMessageDO> lieheMessageDOs = ABMessageConverter.convertLieheMessageDOFromDTO(dtos);
// TODO: 2020/8/10 0010 加密存储
List<LieheMessageDO> dos = lieheMessageRepository.saveAll(lieheMessageDOs);
if (CollectionUtils.isEmpty(dos)){
log.error("========== [insert data error , please check .] ==========");
@ -240,10 +287,12 @@ public class ABClientServiceImpl implements ABClientService {
}
// 调用异步任务进行转发AB单 - 这里是这有一条数据
// 返回处理结果
// 这里是猎河老的推送
abDownTask.doLieheRunTask(dtos);
return Boolean.TRUE;
}
/**
*
*

@ -84,10 +84,20 @@ public class ABClientServiceProxy implements ABClientService {
}
@Override
public boolean recordAndSendLieheMsg(List<ABMessageDTO> dtos) {
public boolean recordAndSendABClientMsgToLocal(List<ABMessageDTO> dtos) {
return abClientService.recordAndSendABClientMsgToLocal(dtos);
}
@Override
public boolean recordAndSendLieheMsg(List<LieheMessageDTO> dtos) {
return abClientService.recordAndSendLieheMsg(dtos);
}
@Override
public boolean recordAndSendLieheQKMsg(List<LieheMessageDTO> dtos) {
return abClientService.recordAndSendLieheQKMsg(dtos);
}
@Override
public boolean recordZMClientMsg(ABZMMessageDTO dto) {
return abClientService.recordZMClientMsg(dto);

@ -2,6 +2,7 @@ package com.yuyou.openapi.openapi.task;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpRequest;
@ -10,9 +11,9 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yuyou.openapi.openapi.api.enums.LuoShiAppIDEnum;
import com.yuyou.openapi.openapi.common.enums.IntentionEnum;
import com.yuyou.openapi.openapi.common.enums.SourceEnum;
import com.yuyou.openapi.openapi.model.dto.*;
import com.yuyou.openapi.openapi.service.ABMessageService;
import com.yuyou.openapi.openapi.utils.DateUtils;
import com.yuyou.openapi.openapi.utils.SignUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@ -27,7 +28,6 @@ import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@ -61,13 +61,16 @@ public class ABDownTask {
*/
@Value("${ab.liehe.channel}")
private String channel;
@Value("${ab.liehe.url}")
private String lieheUrl;
@Value("${ab.liehe.appID}")
private String lieheAppId;
@Value("${ab.liehe.secretkey}")
private String signSecretKey;
private String lieheSecretKey;
@Value("${ab.liehe.url2}")
private String lieheUrl2;
@Value("${ab.liehe.secretkey2}")
private String lieheSecretKey2;
/**
* -
@ -326,7 +329,8 @@ public class ABDownTask {
// BeanUtils.copyProperties(each, luoshiData);
luoshiData.setActName(LuoShiAppIDEnum.tagOf(each.getActName()));
luoshiData.setInfo(each.getMobile());
luoshiData.setType(1);
// FIXME: 2020/12/17 罗什客户要求AB单给他们,然后结算不变
luoshiData.setType(each.getClientType());
luoshiData.setTime(each.getStartTime());
data.add(luoshiData);
}
@ -633,19 +637,18 @@ public class ABDownTask {
return Boolean.TRUE;
}
/**
* ,
* , -
*
* @return
*/
@Async(value = "abTaskExecutor")
public void doLieheRunTask(List<ABMessageDTO> messageDTOList){
public void doLieheRunTask2(List<LieheMessageDTO> messageDTOList){
Long satrtMilliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
log.info("====== [ liehe task start running, task name is {} ] ======", "LieheABDownTask");
messageDTOList.forEach(this::lieheRunTask);
log.info("====== [ liehe task2 start running, task name is {} ] ======", "LieheABDownTask");
messageDTOList.forEach(this::lieheRunTask2);
Long endMilliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
log.info("====== [ liehe task start end, task name is {},cost milliSecond is {} ] ======", "LieheABDownTask", (endMilliSecond-satrtMilliSecond));
log.info("====== [ liehe task start2 end, task name is {},cost milliSecond is {} ] ======", "LieheABDownTask", (endMilliSecond-satrtMilliSecond));
}
/**
@ -653,7 +656,7 @@ public class ABDownTask {
*
* @return
*/
private boolean lieheRunTask(ABMessageDTO messageDTO){
private boolean lieheRunTask2(LieheMessageDTO messageDTO){
int count = 0; // 设置请求失败计数
if (Objects.isNull(messageDTO)) {
@ -666,7 +669,7 @@ public class ABDownTask {
}
// 数据实体进行映射转换 - 目前是只有一条给
LieheMessageCovDTO lieheMessageCovDTO = convertLieheMessageCovDTOFromABMessageDTO(messageDTO);
LieheMessageCovDTO2 lieheMessageCovDTO = convertLieheMessageCovDTOFromABMessageDTO2(messageDTO);
if (lieheMessageCovDTO == null) {
log.error("lieheMessageCovDTO is null.");
return false;
@ -679,8 +682,8 @@ public class ABDownTask {
// 失败重发请求3次
while (count <= 3){
// 调用HTTP请求发送数据
HttpResponse httpResponse = sendLieheReq(jsonStr);
if (httpResponse.isOk() && httpResponse.body().contains("ok")){
HttpResponse httpResponse = sendLieheReq2(jsonStr);
if (httpResponse.isOk() && httpResponse.body().contains("0")){
log.info("========== [liehe request success, response is {} ] ==========", httpResponse.body());
break;
}else{
@ -701,6 +704,71 @@ public class ABDownTask {
}
/**
* ,
*
* @return
*/
@Async(value = "abTaskExecutor")
public void doLieheRunTask(List<LieheMessageDTO> messageDTOList){
Long satrtMilliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
log.info("====== [ liehe task start running, task name is {} ] ======", "LieheABDownTask");
lieheRunTask(messageDTOList);
Long endMilliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
log.info("====== [ liehe task start end, task name is {},cost milliSecond is {} ] ======", "LieheABDownTask", (endMilliSecond-satrtMilliSecond));
}
/**
*
*
* @return
*/
private boolean lieheRunTask(List<LieheMessageDTO> messageDTOList){
int count = 0; // 设置请求失败计数
if (CollectionUtil.isEmpty(messageDTOList)){
return Boolean.FALSE;
}
// 数据实体进行映射转换 - 目前是只有一条给
LieheMessageCovDTO lieheMessageCovDTO = convertLieheMessageCovDTOFromABMessageDTO(messageDTOList);
if (lieheMessageCovDTO == null) {
log.error("lieheMessageCovDTO is null.");
return false;
}
// 数据实体转成Json 不忽略空kv 有序
String jsonStr = JSON.toJSONString(lieheMessageCovDTO);
log.info("========== [liehe ready send json is {} ] =============", jsonStr);
// 请求的响应处理
// 失败重发请求3次
while (count <= 3){
// 调用HTTP请求发送数据
HttpResponse httpResponse = sendLieheReq(jsonStr);
if (httpResponse.isOk() && httpResponse.body().contains("SUCCESS")){
log.info("========== [liehe request success, response is {} ] ==========", httpResponse.body());
break;
}else{
count ++;
log.error("========== [liehe request fail, response is {} ] ==========", httpResponse.body());
}
}
if (count > 3) {
return Boolean.FALSE;
}
lieheMessageCovDTO.getData().forEach(one->{
// 更新记录
boolean updateSendStatus = abMessageService.updateSendLHStatus(Long.valueOf(one.getRecId()), Boolean.TRUE);
if (!updateSendStatus){
// 这里仅仅打日志, 不影响正常返回
log.error("========== [liehe update send status fail, recId is {} ] ==========",one.getRecId());
}
});
return Boolean.TRUE;
}
/**
* HTTP
*
@ -818,42 +886,110 @@ public class ABDownTask {
return httpResponse;
}
/**
* liehe HTTP
* @param json
* @return
*/
private HttpResponse sendLieheReq2(String json) {
HttpResponse httpResponse = HttpRequest
.post(lieheUrl2)
.header("secretKey",lieheSecretKey2) // bc5be930
.body(json)
.execute();
return httpResponse;
}
/**
* ABMessageDTOLieheMessage
* @param abMessageDTO
* @param
* @return
*/
private LieheMessageCovDTO convertLieheMessageCovDTOFromABMessageDTO(ABMessageDTO abMessageDTO) {
if (Objects.isNull(abMessageDTO)) {
private LieheMessageCovDTO convertLieheMessageCovDTOFromABMessageDTO(List<LieheMessageDTO> messageDTOList) {
if (CollectionUtil.isEmpty(messageDTOList)) {
log.error("liehe convert list is Null");
return null;
}
LieheMessageCovDTO lieheMessageCovDTO = new LieheMessageCovDTO();
BeanUtils.copyProperties(abMessageDTO, lieheMessageCovDTO);
lieheMessageCovDTO.setPushTime(DateUtils.date(abMessageDTO.getTimestamp()));
lieheMessageCovDTO.setIntention(IntentionEnum.codeOf(abMessageDTO.getClientType()));
lieheMessageCovDTO.setChannel(channel);
// 加密字段
String pnum = encryptByApi(new String(Base64.decode(abMessageDTO.getMobile())));
if (StrUtil.isBlank(pnum)) {
log.error("pnum encrypt fail.");
return null;
}
lieheMessageCovDTO.setPNum(pnum);
lieheMessageCovDTO.setAppId(lieheAppId);
long timeStamp = System.currentTimeMillis();
lieheMessageCovDTO.setTimestamp(timeStamp);
// 加签处理
JSON jsons = (JSON)JSON.toJSON(lieheMessageCovDTO);
System.out.println(jsons);
Map paramMap = (Map) JSONObject.parseObject(jsons.toString());
String sign = SignUtils.createSign(paramMap, signSecretKey);
String sign = SignUtils.createSignSimple(lieheAppId, lieheMessageCovDTO.getTimestamp(), lieheSecretKey);
if (StrUtil.isBlank(sign)) {
log.error("sign is null");
if (StringUtils.isBlank(sign)) {
log.error("liehe sign is null");
return null;
}
lieheMessageCovDTO.setSign(sign);
lieheMessageCovDTO.setSignature(sign);
List<LieheMessageCovDTO.LieheData> lieheDataList = new ArrayList<>();
messageDTOList.forEach(each->{
LieheMessageCovDTO.LieheData lieheData = new LieheMessageCovDTO.LieheData();
Integer clientType = each.getClientType();
if (Objects.nonNull(clientType) && (clientType == 1 || clientType == 2)){
// 只传 AB单
lieheData.setType(clientType);
}
String mobile = each.getMobile();
if(StringUtils.isNotBlank(mobile)){
// String pnum = encryptByApi(new String(Base64.decode(abMessageDTO.getMobile())));
lieheData.setPhone(StringUtils.reverse(mobile));
}
Long timestamp = each.getTimestamp();
if (timeStamp > 0){
lieheData.setTime(timestamp);
}
String actName = each.getActName();
if (StringUtils.isNotBlank(actName)){
lieheData.setSubName(Base64.encode(actName));
}
String recId = each.getRecId();
if (StringUtils.isNotBlank(recId)){
lieheData.setRecId(recId);
}
lieheDataList.add(lieheData);
});
lieheMessageCovDTO.setData(lieheDataList);
return lieheMessageCovDTO;
}
/**
* ABMessageDTOLieheMessage
* @param lieheMessageDTO
* @return
*/
private LieheMessageCovDTO2 convertLieheMessageCovDTOFromABMessageDTO2(LieheMessageDTO lieheMessageDTO) {
if (Objects.isNull(lieheMessageDTO)) {
return null;
}
LieheMessageCovDTO2 lieheMessageCovDTO2 = new LieheMessageCovDTO2();
BeanUtils.copyProperties(lieheMessageDTO, lieheMessageCovDTO2);
String actName = lieheMessageDTO.getActName();
if (StringUtils.isBlank(actName)){
log.error("ABDownTask:convertLieheMessageCovDTOFromABMessageDTO2 , actName is Null, source lieheMessageDTO is {}", lieheMessageDTO);
}
// 这边是进行通配的逻辑
// String trueName = Base64.decodeStr(actName, "UTF-8");
String trueName = StringUtils.substringBefore(actName, "-");
lieheMessageCovDTO2.setTaskCode(trueName); // fixme 上次修改 WH20201206230538580
lieheMessageCovDTO2.setSource(SourceEnum.MY_SOURCE_TAG.getTagValue());
lieheMessageCovDTO2.setTag(IntentionEnum.codeOf(lieheMessageDTO.getClientType()));
// 加密字段
String reverse = StringUtils.reverse(lieheMessageDTO.getMobile());
lieheMessageCovDTO2.setMobile(reverse);
// 补充字段处理
lieheMessageCovDTO2.setMessages(lieheMessageDTO.getMessages());
return lieheMessageCovDTO2;
}
/**
* API
* @param context

@ -36,6 +36,34 @@ public class SignUtils {
return createSign(params, secretKey, DEFAULT_SEPARATOR, DEFAULT_KV_SEPARATOR);
}
/**
* - - sha1(app_id=[appId]&timestamp=[timestamp]&secret=[secretKey])
*
* @param appId APPId
* @param timestamp
* @param secretKey
*
* @return
*/
public static String createSignSimple(String appId,Long timestamp,String secretKey) {
return createSign(appId, timestamp, secretKey);
}
private static String createSign(String appId, Long timestamp, String secretKey) {
return SecureUtil.sha1("app_id" +
DEFAULT_KV_SEPARATOR +
appId +
DEFAULT_SEPARATOR +
"timestamp" +
DEFAULT_KV_SEPARATOR +
timestamp +
DEFAULT_SEPARATOR +
"secret" +
DEFAULT_KV_SEPARATOR +
secretKey);
}
/**
*
* @param params
@ -44,7 +72,7 @@ public class SignUtils {
* @param keyValueSeparator kv
* @return
*/
public static String createSign(Map<String, String> params, String secretKey, String separator, String keyValueSeparator) {
private static String createSign(Map<String, String> params, String secretKey, String separator, String keyValueSeparator) {
StringBuilder sbKey = new StringBuilder();
if (Objects.isNull(params) || StrUtil.isBlank(secretKey)) {

@ -25,7 +25,7 @@ spring:
# 下游请求配置信息
ab:
customer:
url: http://sandbox.openapi.ppke.com.cn/openapi/tmk/clues/receive
url: http://sandbox.openapi.ppke.com.cn/openapi/tmk/valid/receive
app_id: YY9X8XCZ
thread_pool:
corePoolSize: 2
@ -33,9 +33,12 @@ ab:
queueCapacity: 3
ThreadNamePrefix: "AB-Req-"
liehe:
url: http://qkapi.liehe.com/v1.0/create_phone_tip
appID: 29cb2b84cf2bb0
url: http://qkapi.liehe.com/v1.0/create_phone_tip_yy
channel: quke_yy
secretkey: c49bb9dd6860fe5630f1894b3723b430
secretkey: 860fe5630f1894b3723b430
url2: https://dev-chunhua.kuaikeguanjia.com/ai/outCallResult.json
secretkey2: d68d9b6f
shiji:
appId: excin4hg3n29yc73ns9x
url: https://www.shijikj.cn/ex/infoColl
@ -73,7 +76,7 @@ spring:
# 下游请求配置信息
ab:
customer:
url: https://openapi.ppke.com.cn/openapi/tmk/clues/receive
url: https://openapi.ppke.com.cn/openapi/tmk/valid/receive
app_id: YY9X8XCZ
thread_pool:
corePoolSize: 2
@ -81,9 +84,12 @@ ab:
queueCapacity: 3
ThreadNamePrefix: "AB-Req-"
liehe:
url: http://qkapi.liehe.com/v1.0/create_phone_tip
appID: 29cb2b84cf2bb0
url: http://qkapi.liehe.com/v1.0/create_phone_tip_yy
channel: quke_yy
secretkey: c49bb9dd6860fe5630f1894b3723b430
secretkey: 860fe5630f1894b3723b430
url2: https://chunhua.kuaikeguanjia.com/ai/outCallResult.json
secretkey2: bc5be930
shiji:
appId: excin4hg3n29yc73ns9x
url: https://www.shijikj.cn/ex/infoColl
@ -123,7 +129,7 @@ spring:
# 下游请求配置信息
ab:
customer:
url: https://openapi.ppke.com.cn/openapi/tmk/clues/receive
url: https://sandbox.openapi.ppke.com.cn/openapi/tmk/valid/receive
app_id: YY9X8XCZ
thread_pool:
corePoolSize: 2
@ -131,9 +137,12 @@ ab:
queueCapacity: 3
ThreadNamePrefix: "AB-Req-"
liehe:
url: http://qkapi.liehe.com/v1.0/create_phone_tip
appID: 29cb2b84cf2bb0
url: http://qkapi.liehe.com/v1.0/create_phone_tip_yy
channel: quke_yy
secretkey: c49bb9dd6860fe5630f1894b3723b430
secretkey: 860fe5630f1894b3723b430
url2: https://chunhua.kuaikeguanjia.com/ai/outCallResult.json
secretkey2: bc5be930
shiji:
appId: excin4hg3n29yc73ns9x
url: https://www.shijikj.cn/ex/infoColl

@ -0,0 +1,65 @@
package com.yuyou.openapi.openapi;
import cn.hutool.core.bean.BeanUtil;
import com.google.common.collect.Lists;
import com.yuyou.openapi.openapi.common.security.SecurityConstants;
import com.yuyou.openapi.openapi.common.security.SecurityService;
import com.yuyou.openapi.openapi.dao.LuoshiMessageRepository;
import com.yuyou.openapi.openapi.exception.SecretException;
import com.yuyou.openapi.openapi.model.dataobject.LuoshiMessageDO;
import com.yuyou.openapi.openapi.model.dto.ABMessageDTO;
import com.yuyou.openapi.openapi.task.ABDownTask;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class LuoshiTest extends OpenapiApplicationTest{
@Autowired
private LuoshiMessageRepository luoshiMessageRepository;
@Autowired
private ABDownTask abDownTask;
@Test
public void testRePushToLuoshi() throws ParseException, InterruptedException {
// 查出需要的AB单
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startDate = simpleDateFormat.parse("2020-11-20 00:00:00");
Date endDate = simpleDateFormat.parse("2020-11-21 00:00:00");
List<LuoshiMessageDO> result = luoshiMessageRepository.findAllByPushTimeAndSendStatus(startDate, endDate, 1);
// Map<String, List<LuoshiMessageDO>> collect = result.stream().collect(Collectors.groupingBy(LuoshiMessageDO::getActName));
List<ABMessageDTO> messageDTOList = new ArrayList<>();
result.forEach(
each ->{
ABMessageDTO abMessageDTO = new ABMessageDTO();
BeanUtil.copyProperties(each, abMessageDTO);
try {
abMessageDTO.setMobile(SecurityService.decrypt(each.getPnum(), SecurityConstants.PHONE));
} catch (SecretException e) {
e.printStackTrace();
}
messageDTOList.add(abMessageDTO);
}
);
List<List<ABMessageDTO>> partition = Lists.partition(messageDTOList, 100);
partition.forEach(
one-> abDownTask.doRunLuoshiTask(one)
);
Thread.sleep(60*60*1000);
}
}

@ -1,8 +1,12 @@
package com.yuyou.openapi.openapi;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.CharsetUtil;
import com.alibaba.fastjson.JSON;
import com.yuyou.openapi.openapi.api.enums.LuoShiAppIDEnum;
import com.yuyou.openapi.openapi.model.pojo.ResultBean;
import com.yuyou.openapi.openapi.model.pojo.YiZaoLocalDTO;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import java.io.IOException;
@ -42,12 +46,39 @@ public class SimpleTest {
Path write = Files.write(Paths.get("C:\\Users\\Administrator\\Desktop\\2-1.json"), JSON.toJSONString(resultBean).getBytes(), StandardOpenOption.CREATE_NEW);
} catch (IOException e) {
e.printStackTrace();
}
}
}
);
}
@Test
public void testTag(){
String a = "网易有道课-数学-罗实";
String b = "作业帮-数学-罗实";
String c = "数学";
System.out.println(LuoShiAppIDEnum.tagOf(a));
System.out.println(LuoShiAppIDEnum.tagOf(b));
System.out.println(LuoShiAppIDEnum.tagOf(c));
}
@Test
public void testError(){
String str = "6Laj6K++5a2m6ICM5oCd572R5qCh5pWw5a2mLTg=";
str = "V0gyMDIwMTIyNDEwNTkwNDY1MC3lrabogIzmgJ3mlbDlraYtMg==";
checkSpecailAppName(str);
}
private static void checkSpecailAppName(String str){
String decodeStr = Base64.decodeStr(str, CharsetUtil.UTF_8);
System.out.println(decodeStr);
String matchActName = StringUtils.substringBeforeLast(decodeStr, "-");
System.out.println(matchActName);
}
}

@ -82,4 +82,6 @@ public class ZMSortTest extends OpenapiApplicationTest{
Files.write(Paths.get("C:\\Users\\Administrator\\Desktop\\254_1.json"),result);
}
}

Loading…
Cancel
Save