更新河小象

master
土豆兄弟 4 years ago
parent 406a7e90c7
commit b20182354e

@ -118,6 +118,22 @@ public class ABClient {
CommonResponse.createBySuccess() : CommonResponse.createByErrorMessage("调用失败请重试");
}
/**
* AB -
*
* @return
*/
@PostMapping("/api/req/taginfo/hxx")
@ResponseBody
public CommonResponse getDBTagInfoHeXiaoXiang(@RequestBody ABClientInterMessageVO vo) {
// 记录日志
log.info("====== [ HeXiaoXiang request comming, request content is {} ] ======", vo.toString());
// 转换实体类映射
List<ABMessageDTO> dtos = ABMessageConverter.convertABMessageDTOFromVO(vo);
// 调用业务处理接口 返回校验成功的结果
return abClientService.recordAndSendABClientMsgHeXiaoXiang(dtos) ?
CommonResponse.createBySuccess() : CommonResponse.createByErrorMessage("调用失败请重试");
}
/**
* AB -

@ -0,0 +1,25 @@
package com.yuyou.openapi.openapi.dao;
import com.yuyou.openapi.openapi.model.dataobject.HeXiaoXiangMessageDO;
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: HeXiaoXiangMessageRepository
* Author:
* Date: 2020/10/22 2:52 PM
* Description: TODO
* History:
* <author> <time> <version> <desc>
* 2020/10/22 v1.0
*/
@Repository
public interface HeXiaoXiangMessageRepository extends JpaRepository<HeXiaoXiangMessageDO, Long>{
@Modifying
@Query("update HeXiaoXiangMessageDO t set t.sendStatus = ?1 where t.recId = ?2")
void updateSendStatus(Integer sendStatus, Long recId);
}

@ -130,6 +130,25 @@ public class ABMessageConverter {
return abMessageDOs;
}
/**
* DTODO
* @param dtos
* @return
*/
public static List<HeXiaoXiangMessageDO> convertHeXiaoXiangABMessageDOFromDTO(List<ABMessageDTO> dtos) {
if (CollectionUtils.isEmpty(dtos)) {
return null;
}
List<HeXiaoXiangMessageDO> abMessageDOs = new ArrayList<>();
dtos.forEach(each -> {
HeXiaoXiangMessageDO abMessageDO = convertHeXiaoXiangMessageDOFromDTO(each);
if (abMessageDO != null) {
abMessageDOs.add(abMessageDO);
}
});
return abMessageDOs;
}
/**
* DTODO
@ -326,6 +345,39 @@ public class ABMessageConverter {
return pandaMessageDO;
}
/**
* Luoshi DTODO
* @param abMessageDTO
* @return
*/
public static HeXiaoXiangMessageDO convertHeXiaoXiangMessageDOFromDTO(ABMessageDTO abMessageDTO) {
HeXiaoXiangMessageDO heXiaoXiangMessageDO = new HeXiaoXiangMessageDO();
if (abMessageDTO == null) {
return heXiaoXiangMessageDO;
}
BeanUtils.copyProperties(abMessageDTO, heXiaoXiangMessageDO);
heXiaoXiangMessageDO.setPushTime(DateUtils.date(abMessageDTO.getTimestamp()));
heXiaoXiangMessageDO.setStartTime(DateUtils.date(abMessageDTO.getStartTime()));
try{
heXiaoXiangMessageDO.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);
heXiaoXiangMessageDO.setPnum(encryptedMobile);
} catch (Exception e) {
log.error("Encrypt Mobile raise Error, recId = {}, error is :", abMessageDTO.getRecId(), e);
heXiaoXiangMessageDO.setPnum(abMessageDTO.getMobile());
}
return heXiaoXiangMessageDO;
}
/**
* Luoshi DTODO
* @param abMessageDTO

@ -0,0 +1,86 @@
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;
/**
* Copyright (C), 2012 - 2018, qyx
* FileName: HeXiaoXiangMessageDO
* Author:
* Date: 2020/10/22 2:49 PM
* Description: TODO
* History:
* <author> <time> <version> <desc>
* 2020/10/22 v1.0
*/
@Data
@Table(name = "hexiaoxiang_message")
@Entity
@EntityListeners(AuditingEntityListener.class)
public class HeXiaoXiangMessageDO {
@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;
}

@ -0,0 +1,81 @@
package com.yuyou.openapi.openapi.model.dto;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* Copyright (C), 2012 - 2018, qyx
* FileName: LuoshiMessageCovDTO
* Author:
* Date: 2020/10/22 2:55 PM
* Description: TODO
* History:
* <author> <time> <version> <desc>
* 2020/10/22 v1.0
*/
/**
*
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class HeXXMessageCovDTO {
/**
* ID
*/
// @JSONField(serialize = false)
private String appId;
/**
*
*/
// @JSONField(serialize = false)
private Long timestamp;
/**
* : sha1(app_id=AppId&nonce_str=time_stamp)
*/
private String signature;
/**
* json
*/
private List<HeXXData> data;
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class HeXXData{
/**
* poneNum Base64
*/
@JSONField(name = "info")
private String info;
/**
*
*/
@JSONField(name = "time")
private Long time;
/**
* Base64
*/
@JSONField(name = "subType")
@JsonIgnore
private String actName;
/**
* ABA-1B-2
*/
@JSONField(name = "type")
private Integer type;
}
}

@ -37,6 +37,10 @@ public interface ABClientService {
*/
boolean recordAndSendABClientMsgPanda(List<ABMessageDTO> dtos);
/**
* ,
*/
boolean recordAndSendABClientMsgHeXiaoXiang(List<ABMessageDTO> dtos);
/**
* ,

@ -73,6 +73,9 @@ public class ABClientServiceImpl implements ABClientService {
@Autowired
private XuebaMessageRepository xuebaMessageRepository;
@Autowired
private HeXiaoXiangMessageRepository heXiaoXiangMessageRepository;
@Override
public boolean recordAndSendABClientMsg(List<ABMessageDTO> dtos) {
if (CollectionUtils.isEmpty(dtos)) {
@ -133,6 +136,26 @@ public class ABClientServiceImpl implements ABClientService {
return Boolean.TRUE;
}
@Override
public boolean recordAndSendABClientMsgHeXiaoXiang(List<ABMessageDTO> dtos) {
if (CollectionUtils.isEmpty(dtos)) {
log.error("Param dtos is empty");
return Boolean.FALSE;
}
// 调用接口进行入库
List<HeXiaoXiangMessageDO> abMessageDOS = ABMessageConverter.convertHeXiaoXiangABMessageDOFromDTO(dtos);
// TODO: 2020/8/10 0010 加密存储
List<HeXiaoXiangMessageDO> dos = heXiaoXiangMessageRepository.saveAll(abMessageDOS);
if (CollectionUtils.isEmpty(dos)){
log.error("========== [insert data error , please check .] ==========");
return Boolean.FALSE;
}
// 调用异步任务进行转发AB单 - 这里是这有一条数据
// 返回处理结果
abDownTask.doRunHeXXTask(dtos);
return Boolean.TRUE;
}
@Override
public boolean recordAndSendABClientMsgWxFans(List<ABMessageDTO> dtos) {
if (CollectionUtils.isEmpty(dtos)) {

@ -68,6 +68,11 @@ public class ABClientServiceProxy implements ABClientService {
return abClientService.recordAndSendABClientMsgPanda(dto);
}
@Override
public boolean recordAndSendABClientMsgHeXiaoXiang(List<ABMessageDTO> dtos) {
return abClientService.recordAndSendABClientMsgHeXiaoXiang(dtos);
}
@Override
public boolean recordAndSendABClientMsgWxFans(List<ABMessageDTO> dtos) {
return abClientService.recordAndSendABClientMsgWxFans(dtos);

@ -109,6 +109,10 @@ public class ABDownTask {
*/
@Value("${ab.wxfans.url}")
private String wxFansUrl;
@Value("${ab.wxfans.taskid.url}")
private String wxFansTaskIdUrl;
@Value("${ab.wxfans.secret}")
private String wxSecretKey;
/**
* ,
@ -443,6 +447,95 @@ public class ABDownTask {
return Boolean.TRUE;
}
/**
* ,
*
* @return
*/
@Async(value = "abTaskExecutor")
public void doRunHeXXTask(List<ABMessageDTO> messageDTOList){
Long satrtMilliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
log.info("====== [ task start running, task name is {} ] ======", "doRunHeXXTask");
runHeXXTask(messageDTOList);
Long endMilliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
log.info("====== [ task start end, task name is {},cost milliSecond is {} ] ======", "doRunHeXXTask", (endMilliSecond-satrtMilliSecond));
}
/**
*
*
* @return
*/
private boolean runHeXXTask(List<ABMessageDTO> messageDTOList){
int count = 0; // 设置请求失败计数
// 数据实体进行映射转换 - 目前是只有一条给
HeXXMessageCovDTO heXXMessageCovDTO = new HeXXMessageCovDTO();
// 对特殊情况进行过滤,只要AB单的用户,且字段加密规则要重新进行制定
List<ABMessageDTO> collect = messageDTOList.stream()
.filter(item -> (1 == item.getClientType()) || 2 == item.getClientType())
.map(item -> {
// pno通配
String reverse = StringUtils.reverse(item.getMobile());
item.setMobile(reverse);
// startTime 通配下游到秒
Long startTime = item.getStartTime();
if (startTime != null && startTime.toString().length() == 13) {
item.setStartTime(startTime / 1000);
}
return item;
})
.collect(Collectors.toList());
List<HeXXMessageCovDTO.HeXXData> data = new ArrayList<>();
// 进行转换
collect.forEach(
each->{
HeXXMessageCovDTO.HeXXData heXXData = new HeXXMessageCovDTO.HeXXData();
// BeanUtils.copyProperties(each, luoshiData);
heXXData.setInfo(each.getMobile());
heXXData.setType(1);
heXXData.setTime(each.getStartTime());
data.add(heXXData);
}
);
// 进行设置
if (!CollectionUtils.isEmpty(data)){
heXXMessageCovDTO.setData(data);
}
// 补充其他的下游请求字段
long time = System.currentTimeMillis() / 1000;
heXXMessageCovDTO.setTimestamp(time);
heXXMessageCovDTO.setAppId(panDaAppId);
heXXMessageCovDTO.setSignature(SecureUtil.sha1("app_id="+ panDaAppId +"&timestamp="+ time + "&secret=" + panDaSecretKey));
// 数据实体转成Json 不忽略空kv 有序
String jsonStr = JSON.toJSONString(heXXMessageCovDTO);
log.info("========== [ready send json is {} ] =============", jsonStr);
// 请求的响应处理
// todo 失败重发请求3次
while (count <= 3){
// 调用HTTP请求发送数据
HttpResponse httpResponse = sendPandaReq(jsonStr);
if (httpResponse.isOk() && httpResponse.body().contains("success")){
log.info("========== [request success, response is {} ] ==========", httpResponse.body());
break;
}else{
count ++;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
log.error("sleep error!");
}
log.error("========== [request fail, response is {} ] ==========", httpResponse.body());
}
}
if (count > 3) {
return Boolean.FALSE;
}
collect.forEach(
// FIXME: 2020/8/12 0012 可能会造成更新失败,检查更新语句
each -> abMessageService.updateSendPDSatus(Long.valueOf(each.getRecId()), Boolean.TRUE)
);
return Boolean.TRUE;
}
/**
* ,
@ -483,11 +576,26 @@ public class ABDownTask {
String jsonStr = JSON.toJSONString(wxFansMessageCovDTO);
log.info("========== [ready send json is {} ] =============", jsonStr);
// 请求的响应处理
HttpResponse wxTaskIdResponse = getWxTaskId();
Integer wxTaskId = null;
if (wxTaskIdResponse.isOk() && wxTaskIdResponse.body().contains("true")){
JSONObject jsonObject = JSON.parseObject(wxTaskIdResponse.body());
if (jsonObject != null){
wxTaskId = (Integer)jsonObject.get("data");
}
if (wxTaskId == null || wxTaskId <= 0){
log.error("========== [wxTaskId is null,please check . ] =============");
return Boolean.FALSE;
}
}else {
log.error("========== [get WX taskId task error, http error response is {} . ] =============" ,wxTaskIdResponse.body());
return Boolean.FALSE;
}
// todo 失败重发请求3次
while (count <= 3){
// 调用HTTP请求发送数据
HttpResponse httpResponse = sendWxReq(jsonStr);
if (httpResponse.isOk() && httpResponse.body().contains("true")){
HttpResponse httpResponse = sendWxReq(jsonStr, wxTaskId);
if (httpResponse!= null && httpResponse.isOk() && httpResponse.body().contains("true")){
log.info("========== [request success, response is {} ] ==========", httpResponse.body());
break;
}else{
@ -640,14 +748,34 @@ public class ABDownTask {
* @param json body
* @return
*/
private HttpResponse sendWxReq(String json){
private HttpResponse sendWxReq(String json, Integer wxTaskId){
HttpResponse httpResponse = HttpRequest
.post(wxFansUrl)
.post(wxFansUrl + wxTaskId)
.body(json)
.execute();
return httpResponse;
}
/**
* Id
* @return
*/
private HttpResponse getWxTaskId(){
// 拼装请求
StringBuilder url = new StringBuilder();
url.append(wxFansTaskIdUrl)
.append("?")
.append("secret=")
.append(wxSecretKey);
// 发送get请求
HttpResponse response = HttpRequest
.get(url.toString())
.execute();
return response;
}
/**
* liehe HTTP
* @param json

@ -1,6 +1,6 @@
spring:
profiles:
active: prod
active: dev
# 序列化忽略null的k-v配置
jackson:
default-property-inclusion: non_null
@ -15,7 +15,7 @@ server:
port: 8090
# 环境
spring:
profiles: prod
profiles: dev
# 数据库相关配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
@ -49,7 +49,10 @@ ab:
url: https://pre-api.aircourses.com/common/open/n/stuClue/add/callback
secretKey: fee2824fb2e0d1f166084cb66fc9d391
wxfans:
url: https://api.wooxin.cn/tketong/30
url: https://api.wooxin.cn/tketong/
taskid:
url: https://api.wooxin.cn/tketong/getLastAddId
secret: pmDclwRSYQgeiAKDghqXgs9m69OT7m69
---
# 端口
server:
@ -90,7 +93,10 @@ ab:
url: https://api.aircourses.com/common/open/n/stuClue/add/callback
secretKey: fee2824fb2e0d1f166084cb66fc9d391
wxfans:
url: https://api.wooxin.cn/tketong/30
url: https://api.wooxin.cn/tketong/
taskid:
url: https://api.wooxin.cn/tketong/getLastAddId
secret: pmDclwRSYQgeiAKDghqXgs9m69OT7m69
logging:
config: classpath:logback.xml
---
@ -133,6 +139,9 @@ ab:
url: https://data.hzluoshi.cn/index/phoneapi
secretKey: fee2824fb2e0d1f166084cb66fc9d391
wxfans:
url: https://api.wooxin.cn/tketong/30
url: https://api.wooxin.cn/tketong/
taskid:
url: https://api.wooxin.cn/tketong/getLastAddId
secret: pmDclwRSYQgeiAKDghqXgs9m69OT7m69
#logging:
# config: classpath:logback.xml

@ -37,7 +37,7 @@
<root level="INFO">
<!-- TODO prod 环境去掉std -->
<!--<appender-ref ref="stdAppender"/>-->
<appender-ref ref="fileAppender"/>
<appender-ref ref="stdAppender"/>
<!--<appender-ref ref="fileAppender"/>-->
</root>
</configuration>

@ -0,0 +1,19 @@
package com.yuyou.openapi.openapi;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.junit.Test;
public class HttpTest {
@Test
public void test(){
String str = "{\"data\":127,\"success\":true,\"message\":\"Everything is ok\",\"time\":1604466616,\"formatTime\":\"2020-11-04 13:10:16\"}";
JSONObject jsonObject = JSON.parseObject(str);
Integer id = (Integer) jsonObject.get("data");
System.out.println(id);
}
}
Loading…
Cancel
Save