更新双英相关的代码逻辑

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

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

@ -0,0 +1,25 @@
package com.yuyou.openapi.openapi.dao;
import com.yuyou.openapi.openapi.model.dataobject.ShuangYingMessageDO;
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 ShuangYingMessageRepository extends JpaRepository<ShuangYingMessageDO, Long>{
@Modifying
@Query("update ShuangYingMessageDO t set t.sendStatus = ?1 where t.recId = ?2")
void updateSendStatus(Integer sendStatus, Long recId);
}

@ -150,6 +150,27 @@ public class ABMessageConverter {
return abMessageDOs;
}
/**
* DTODO
* @param dtos
* @return
*/
public static List<ShuangYingMessageDO> convertShuangyingABMessageDOFromDTO(List<ABMessageDTO> dtos) {
if (CollectionUtils.isEmpty(dtos)) {
return null;
}
List<ShuangYingMessageDO> abMessageDOs = new ArrayList<>();
dtos.forEach(each -> {
ShuangYingMessageDO abMessageDO = convertShuangYingMessageDOFromDTO(each);
if (abMessageDO != null) {
abMessageDOs.add(abMessageDO);
}
});
return abMessageDOs;
}
/**
* DTODO
* @param dtos
@ -414,6 +435,37 @@ public class ABMessageConverter {
return luoshiMessageDO;
}
/**
* Luoshi DTODO
* @param abMessageDTO
* @return
*/
public static ShuangYingMessageDO convertShuangYingMessageDOFromDTO(ABMessageDTO abMessageDTO) {
ShuangYingMessageDO shuangYingMessageDO = new ShuangYingMessageDO();
if (abMessageDTO == null) {
return shuangYingMessageDO;
}
BeanUtils.copyProperties(abMessageDTO, shuangYingMessageDO);
shuangYingMessageDO.setPushTime(DateUtils.date(abMessageDTO.getTimestamp()));
shuangYingMessageDO.setStartTime(DateUtils.date(abMessageDTO.getStartTime()));
try{
shuangYingMessageDO.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);
shuangYingMessageDO.setPnum(encryptedMobile);
} catch (Exception e) {
log.error("Encrypt Mobile raise Error, recId = {}, error is :", abMessageDTO.getRecId(), e);
shuangYingMessageDO.setPnum(abMessageDTO.getMobile());
}
return shuangYingMessageDO;
}
/**
* 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: LuoshiMessageDO
* Author:
* Date: 2020/10/22 2:49 PM
* Description: TODO
* History:
* <author> <time> <version> <desc>
* 2020/10/22 v1.0
*/
@Data
@Table(name = "shuangying_message")
@Entity
@EntityListeners(AuditingEntityListener.class)
public class ShuangYingMessageDO {
@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,82 @@
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: ShuangYingMessageCovDTO
* 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 ShuangYingMessageCovDTO {
/**
* ID
*/
// @JSONField(serialize = false)
@JSONField(name = "app_id")
private String appId;
/**
*
*/
// @JSONField(serialize = false)
private Long timestamp;
/**
* : sha1(app_id=AppId&nonce_str=time_stamp)
*/
private String signature;
/**
* json
*/
private List<ShuangyingData> data;
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class ShuangyingData{
/**
* 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;
}
}

@ -32,6 +32,11 @@ public interface ABClientService {
*/
boolean recordAndSendABClientMsgLuoshi(List<ABMessageDTO> dtos);
/**
* ,
*/
boolean recordAndSendABClientMsgShuangYing(List<ABMessageDTO> dtos);
/**
* ,
*/

@ -46,6 +46,10 @@ public interface ABMessageService {
*/
boolean updateSendHeXXSatus(Long recId, boolean sucess);
/**
* -
*/
boolean updateSendShuangYingSatus(Long recId, boolean sucess);
/**
* -

@ -41,6 +41,9 @@ public class ABClientServiceImpl implements ABClientService {
@Autowired
private LuoshiMessageRepository luoshiMessageRepository;
@Autowired
private ShuangYingMessageRepository shuangYingMessageRepository;
@Autowired
private PandaMessageRepository pandaMessageRepository;
@ -248,6 +251,26 @@ public class ABClientServiceImpl implements ABClientService {
return Boolean.TRUE;
}
@Override
public boolean recordAndSendABClientMsgShuangYing(List<ABMessageDTO> dtos) {
if (CollectionUtils.isEmpty(dtos)) {
log.error("Param dtos is empty");
return Boolean.FALSE;
}
// 调用接口进行入库
List<ShuangYingMessageDO> abMessageDOS = ABMessageConverter.convertShuangyingABMessageDOFromDTO(dtos);
List<ShuangYingMessageDO> dos = shuangYingMessageRepository.saveAll(abMessageDOS);
if (CollectionUtils.isEmpty(dos)){
log.error("========== [insert data error , please check .] ==========");
return Boolean.FALSE;
}
// 调用异步任务进行转发AB单 - 这里是这有一条数据
// 返回处理结果
abDownTask.doRunShuangYingTask(dtos);
return Boolean.TRUE;
}
@Override
public boolean recordAndSendLieheMsg(List<LieheMessageDTO> dtos) {

@ -58,6 +58,11 @@ public class ABClientServiceProxy implements ABClientService {
return abClientService.recordAndSendABClientMsgLuoshi(dto);
}
@Override
public boolean recordAndSendABClientMsgShuangYing(List<ABMessageDTO> dtos) {
return abClientService.recordAndSendABClientMsgShuangYing(dtos);
}
/**
* fixme 使
* @param dto

@ -27,6 +27,9 @@ public class ABMessageServiceImpl implements ABMessageService {
@Autowired
private LieheMessageRepository lieheMessageRepository;
@Autowired
private ShuangYingMessageRepository shuangYingMessageRepository;
@Autowired
private ShijiMessageRepository shijiMessageRepository;
@Autowired
@ -122,6 +125,20 @@ public class ABMessageServiceImpl implements ABMessageService {
return Boolean.TRUE;
}
@Override
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public boolean updateSendShuangYingSatus(Long recId, boolean sucess) {
if (recId == null) {
return Boolean.FALSE;
}
if (sucess) {
shuangYingMessageRepository.updateSendStatus(1, recId);
}else {
shuangYingMessageRepository.updateSendStatus(0, recId);
}
return Boolean.TRUE;
}
@Override
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public boolean updateSendWxFansSatus(Long recId, boolean sucess) {

@ -130,6 +130,19 @@ public class ABDownTask {
@Value("${ab.hexx.secretKey}")
private String hexxSecretKey;
/**
* -
*/
@Value("${ab.sy.appId}")
private String shuangyingAppId;
@Value("${ab.sy.url}")
private String shuangyingUrl;
@Value("${ab.sy.secretKey}")
private String shuangyingSecretKey;
/**
* ,
*
@ -283,6 +296,97 @@ public class ABDownTask {
return Boolean.TRUE;
}
/**
* ,
*
*/
@Async(value = "abTaskExecutor")
public void doRunShuangYingTask(List<ABMessageDTO> messageDTOList){
Long satrtMilliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
log.info("====== [ task start running, task name is {} ] ======", "doRunShuangYingTask");
runShuangYingTask(messageDTOList);
Long endMilliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
log.info("====== [ task start end, task name is {},cost milliSecond is {} ] ======", "doRunShuangYingTask", (endMilliSecond-satrtMilliSecond));
}
/**
*
*
* @return
*/
private boolean runShuangYingTask(List<ABMessageDTO> messageDTOList){
int count = 0; // 设置请求失败计数
// 数据实体进行映射转换 - 目前是只有一条给
ShuangYingMessageCovDTO shuangYingMessageCovDTO = new ShuangYingMessageCovDTO();
// 对特殊情况进行过滤,只要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<ShuangYingMessageCovDTO.ShuangyingData> data = new ArrayList<>();
// 进行转换
collect.forEach(
each->{
ShuangYingMessageCovDTO.ShuangyingData shuangyingData = new ShuangYingMessageCovDTO.ShuangyingData();
// BeanUtils.copyProperties(each, luoshiData);
shuangyingData.setInfo(each.getMobile());
shuangyingData.setType(1);
shuangyingData.setTime(each.getStartTime());
shuangyingData.setActName(Base64.encode(each.getActName()));
data.add(shuangyingData);
}
);
// 进行设置
if (!CollectionUtils.isEmpty(data)){
shuangYingMessageCovDTO.setData(data);
}
// 补充其他的下游请求字段
long time = System.currentTimeMillis() / 1000;
shuangYingMessageCovDTO.setTimestamp(time);
shuangYingMessageCovDTO.setAppId(shuangyingAppId);
shuangYingMessageCovDTO.setSignature(SecureUtil.sha1("app_id="+ shuangyingAppId +"&timestamp="+ time + "&secret=" + shuangyingSecretKey));
// 数据实体转成Json 不忽略空kv 有序
String jsonStr = JSON.toJSONString(shuangYingMessageCovDTO);
log.info("========== [ready send json is {} ] =============", jsonStr);
// 请求的响应处理
// todo 失败重发请求3次
while (count <= 3){
// 调用HTTP请求发送数据
HttpResponse httpResponse = sendShuangYingReq(jsonStr);
if (httpResponse.isOk() && httpResponse.body().contains("添加成功")){
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.updateSendHeXXSatus(Long.valueOf(each.getRecId()), Boolean.TRUE)
);
return Boolean.TRUE;
}
/**
* ,
*
@ -825,6 +929,22 @@ public class ABDownTask {
return httpResponse;
}
/**
* HTTP
*
* @param json body
* @return
*/
private HttpResponse sendShuangYingReq(String json){
HttpResponse httpResponse = HttpRequest
.post(shuangyingUrl)
.body(json)
.execute();
return httpResponse;
}
/**
* HTTP
*

@ -1,6 +1,6 @@
spring:
profiles:
active: prod
active: dev
# 序列化忽略null的k-v配置
jackson:
default-property-inclusion: non_null
@ -60,6 +60,10 @@ ab:
taskid:
url: https://api.wooxin.cn/tketong/getLastAddId
secret: pmDclwRSYQgeiAKDghqXgs9m69OT7m69
sy:
appId: by_sy
url: http://linkon.natapp4.cc/sales/openClientController/addClientList
secretKey: 8b74dc958fe1196ebc77208b
---
# 端口
server:
@ -111,6 +115,10 @@ ab:
taskid:
url: https://api.wooxin.cn/tketong/getLastAddId
secret: pmDclwRSYQgeiAKDghqXgs9m69OT7m69
sy:
appId: by_sy
url: http://47.110.153.34/openClientController/addClientList
secretKey: 8b74dc958fe1196ebc77208b
logging:
config: classpath:logback.xml
---
@ -164,5 +172,9 @@ ab:
taskid:
url: https://api.wooxin.cn/tketong/getLastAddId
secret: pmDclwRSYQgeiAKDghqXgs9m69OT7m69
sy:
appId: by_sy
url: http://47.110.153.34/openClientController/addClientList
secretKey: 8b74dc958fe1196ebc77208b
#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>
Loading…
Cancel
Save