diff --git a/src/main/java/com/yuyou/openapi/openapi/api/ABClient.java b/src/main/java/com/yuyou/openapi/openapi/api/ABClient.java index b83b065..6f037ab 100644 --- a/src/main/java/com/yuyou/openapi/openapi/api/ABClient.java +++ b/src/main/java/com/yuyou/openapi/openapi/api/ABClient.java @@ -83,6 +83,23 @@ public class ABClient { CommonResponse.createBySuccess() : CommonResponse.createByErrorMessage("调用失败请重试"); } + /** + * 获取上游公司的AB数据推送接口 - 推送到墨杭 + * + * @return 返回调用信息 + */ + @PostMapping("/api/req/taginfo/mohang") + @ResponseBody + public CommonResponse getDBTagInfoMohang(@RequestBody ABClientInterMessageVO vo) { + // 记录日志 + log.info("====== [ one request comming, request content is {} ] ======", vo.toString()); + // 转换实体类映射 + List dtos = ABMessageConverter.convertABMessageDTOFromVO(vo); + // 调用业务处理接口 返回校验成功的结果 + return abClientService.recordAndSendABClientMsgMohang(dtos) ? + CommonResponse.createBySuccess() : CommonResponse.createByErrorMessage("调用失败请重试"); + } + /** * 获取上游公司的AB数据推送接口 - 推送到罗氏 * diff --git a/src/main/java/com/yuyou/openapi/openapi/dao/MohangMessageRepository.java b/src/main/java/com/yuyou/openapi/openapi/dao/MohangMessageRepository.java new file mode 100644 index 0000000..e4e0a65 --- /dev/null +++ b/src/main/java/com/yuyou/openapi/openapi/dao/MohangMessageRepository.java @@ -0,0 +1,14 @@ +package com.yuyou.openapi.openapi.dao; + +import com.yuyou.openapi.openapi.model.dataobject.MohangMessageDO; +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; + +@Repository +public interface MohangMessageRepository extends JpaRepository { + @Modifying + @Query("update MohangMessageDO t set t.sendStatus = ?1 where t.recId = ?2") + void updateSendStatus(Integer sendStatus, Long recId); +} diff --git a/src/main/java/com/yuyou/openapi/openapi/model/convert/ABMessageConverter.java b/src/main/java/com/yuyou/openapi/openapi/model/convert/ABMessageConverter.java index 3be247d..e7c2e30 100644 --- a/src/main/java/com/yuyou/openapi/openapi/model/convert/ABMessageConverter.java +++ b/src/main/java/com/yuyou/openapi/openapi/model/convert/ABMessageConverter.java @@ -131,6 +131,24 @@ public class ABMessageConverter { return abMessageDOs; } + /** + * 批量转DTO为DO + * @param dtos + * @return + */ + public static List convertMohangABMessageDOFromDTO(List dtos) { + if (CollectionUtils.isEmpty(dtos)) { + return null; + } + List abMessageDOs = new ArrayList<>(); + dtos.forEach(each -> { + MohangMessageDO abMessageDO = convertMohangMessageDOFromDTO(each); + if (abMessageDO != null) { + abMessageDOs.add(abMessageDO); + } + }); + return abMessageDOs; + } /** * 批量转DTO为DO * @param dtos @@ -445,6 +463,37 @@ public class ABMessageConverter { return shijiMessageDO; } + /** + * Mohang DTO层转为DO层 + * @param abMessageDTO + * @return + */ + public static MohangMessageDO convertMohangMessageDOFromDTO(ABMessageDTO abMessageDTO) { + MohangMessageDO mohangMessageDO = new MohangMessageDO(); + if (abMessageDTO == null) { + return mohangMessageDO; + } + + BeanUtils.copyProperties(abMessageDTO, mohangMessageDO); + mohangMessageDO.setPushTime(DateUtils.date(abMessageDTO.getTimestamp())); + mohangMessageDO.setStartTime(DateUtils.date(abMessageDTO.getStartTime())); + try{ + mohangMessageDO.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); + mohangMessageDO.setPnum(encryptedMobile); + } catch (Exception e) { + log.error("Encrypt Mobile raise Error, recId = {}, error is :", abMessageDTO.getRecId(), e); + mohangMessageDO.setPnum(abMessageDTO.getMobile()); + } + return mohangMessageDO; + } + /** * Luoshi DTO层转为DO层 * @param abMessageDTO diff --git a/src/main/java/com/yuyou/openapi/openapi/model/dataobject/MohangMessageDO.java b/src/main/java/com/yuyou/openapi/openapi/model/dataobject/MohangMessageDO.java new file mode 100644 index 0000000..383ab54 --- /dev/null +++ b/src/main/java/com/yuyou/openapi/openapi/model/dataobject/MohangMessageDO.java @@ -0,0 +1,80 @@ +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; + +/** + * liehe AB表单数据层映射类 + * @version 1.0 + * @date 2021/4/1 + */ +@Data +@Table(name = "mohang_message") +@Entity +@EntityListeners(AuditingEntityListener.class) +public class MohangMessageDO { + @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; +} diff --git a/src/main/java/com/yuyou/openapi/openapi/model/dto/MohangMessageCovDTO.java b/src/main/java/com/yuyou/openapi/openapi/model/dto/MohangMessageCovDTO.java new file mode 100644 index 0000000..87bd2a6 --- /dev/null +++ b/src/main/java/com/yuyou/openapi/openapi/model/dto/MohangMessageCovDTO.java @@ -0,0 +1,79 @@ +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 MohangMessageCovDTO { + /** + * 推送用户的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 data; + + + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class MohangData{ + /** + * poneNum 这个字段是用Base64进行加密 + */ + @JSONField(name = "info") + private String mobile; + /** + * 呼叫开始时间 时间戳 + */ + @JSONField(name = "time") + private Long startTime; + + /** + * 业务名称 这个字段是用Base64进行加密 + */ + @JSONField(name = "subType") + private String actName; + + /** + * 用于下游声明的标识 统一为 HM + */ + @JSONField(name = "type") + private Integer type; + } + /* + *//** + * 业务名称 这个字段是用Base64进行加密 + *//* + @JSONField(name = "actname") + private String actName; + + *//** + * 单条记录标识ID + *//* + @JSONField(name = "id") + private String recId;*/ +} diff --git a/src/main/java/com/yuyou/openapi/openapi/service/ABClientService.java b/src/main/java/com/yuyou/openapi/openapi/service/ABClientService.java index 3fba293..5cae7f9 100644 --- a/src/main/java/com/yuyou/openapi/openapi/service/ABClientService.java +++ b/src/main/java/com/yuyou/openapi/openapi/service/ABClientService.java @@ -29,6 +29,11 @@ public interface ABClientService { */ boolean recordAndSendABClientMsgShiJi(List dtos); + /** + * 记录接口推送信息对数据进行入库,并异步进行发送给下游 + */ + boolean recordAndSendABClientMsgMohang(List dtos); + /** * 记录接口推送信息对数据进行入库,并异步进行发送给下游 */ diff --git a/src/main/java/com/yuyou/openapi/openapi/service/ABMessageService.java b/src/main/java/com/yuyou/openapi/openapi/service/ABMessageService.java index 44bfeeb..bed1615 100644 --- a/src/main/java/com/yuyou/openapi/openapi/service/ABMessageService.java +++ b/src/main/java/com/yuyou/openapi/openapi/service/ABMessageService.java @@ -31,6 +31,11 @@ public interface ABMessageService { */ boolean updateSendSJSatus(Long recId, boolean sucess); + /** + * 更新时机发送记录 - 单条更新 + */ + boolean updateSendMHSatus(Long recId, boolean sucess); + /** * 更新罗什发送记录 - 单条更新 */ diff --git a/src/main/java/com/yuyou/openapi/openapi/service/impl/ABClientServiceImpl.java b/src/main/java/com/yuyou/openapi/openapi/service/impl/ABClientServiceImpl.java index fd22c27..b501f66 100644 --- a/src/main/java/com/yuyou/openapi/openapi/service/impl/ABClientServiceImpl.java +++ b/src/main/java/com/yuyou/openapi/openapi/service/impl/ABClientServiceImpl.java @@ -45,6 +45,9 @@ public class ABClientServiceImpl implements ABClientService { @Autowired private ShijiMessageRepository shijiMessageRepository; + @Autowired + private MohangMessageRepository MohangMessageRepository; + @Autowired private LuoshiMessageRepository luoshiMessageRepository; @@ -151,6 +154,26 @@ public class ABClientServiceImpl implements ABClientService { return Boolean.TRUE; } + @Override + public boolean recordAndSendABClientMsgMohang(List dtos) { + if (CollectionUtils.isEmpty(dtos)) { + log.error("Param dtos is empty"); + return Boolean.FALSE; + } + // 调用接口进行入库 + List abMessageDOS = ABMessageConverter.convertMohangABMessageDOFromDTO(dtos); + // TODO: 2021/4/1 0010 加密存储 + List dos = MohangMessageRepository.saveAll(abMessageDOS); + if (CollectionUtils.isEmpty(dos)){ + log.error("========== [insert data error , please check .] =========="); + return Boolean.FALSE; + } + // 调用异步任务进行转发AB单 - 这里是这有一条数据 + // 返回处理结果 + abDownTask.doRunMohangTask(dtos); + return Boolean.TRUE; + } + @Override public boolean recordAndSendABClientMsgPanda(List dtos) { if (CollectionUtils.isEmpty(dtos)) { diff --git a/src/main/java/com/yuyou/openapi/openapi/service/impl/ABClientServiceProxy.java b/src/main/java/com/yuyou/openapi/openapi/service/impl/ABClientServiceProxy.java index 352b85c..b95ca0a 100644 --- a/src/main/java/com/yuyou/openapi/openapi/service/impl/ABClientServiceProxy.java +++ b/src/main/java/com/yuyou/openapi/openapi/service/impl/ABClientServiceProxy.java @@ -49,6 +49,11 @@ public class ABClientServiceProxy implements ABClientService { return abClientService.recordAndSendABClientMsgShiJi(dto); } + @Override + public boolean recordAndSendABClientMsgMohang(List dtos) { + return abClientService.recordAndSendABClientMsgMohang(dtos); + } + /** * fixme 代理类 暂时不用 留在后续使用 * @param dto diff --git a/src/main/java/com/yuyou/openapi/openapi/service/impl/ABMessageServiceImpl.java b/src/main/java/com/yuyou/openapi/openapi/service/impl/ABMessageServiceImpl.java index 4da00b7..d3877ca 100644 --- a/src/main/java/com/yuyou/openapi/openapi/service/impl/ABMessageServiceImpl.java +++ b/src/main/java/com/yuyou/openapi/openapi/service/impl/ABMessageServiceImpl.java @@ -39,6 +39,8 @@ public class ABMessageServiceImpl implements ABMessageService { @Autowired private ShijiMessageRepository shijiMessageRepository; @Autowired + private MohangMessageRepository mohangMessageRepository; + @Autowired private LuoshiMessageRepository luoshiMessageRepository; @Autowired private PandaMessageRepository pandaMessageRepository; @@ -92,6 +94,20 @@ public class ABMessageServiceImpl implements ABMessageService { return Boolean.TRUE; } + @Override + @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) + public boolean updateSendMHSatus(Long recId, boolean sucess) { + if (recId == null) { + return Boolean.FALSE; + } + if (sucess) { + mohangMessageRepository.updateSendStatus(1, recId); + }else { + mohangMessageRepository.updateSendStatus(0, recId); + } + return Boolean.TRUE; + } + @Override @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) public boolean updateSendLSSatus(Long recId, boolean sucess) { diff --git a/src/main/java/com/yuyou/openapi/openapi/task/ABDownTask.java b/src/main/java/com/yuyou/openapi/openapi/task/ABDownTask.java index 32482a3..90ada15 100644 --- a/src/main/java/com/yuyou/openapi/openapi/task/ABDownTask.java +++ b/src/main/java/com/yuyou/openapi/openapi/task/ABDownTask.java @@ -94,12 +94,25 @@ public class ABDownTask { @Value("${ab.shiji.appId}") private String shiJiAppId; + @Value("${ab.shiji.url}") private String shiJiUrl; @Value("${ab.shiji.secretKey}") private String shiJiSecretKey; + /** + * 配置文件中加载配置信息 - 墨杭 + */ + @Value("${ab.mohang.appId}") + private String mohangAppId; + + @Value("${ab.mohang.url}") + private String mohangJiUrl; + + @Value("${ab.mohang.secretKey}") + private String mohangSecretKey; + /** * 配置文件中加载配置信息 - 罗石 */ @@ -268,6 +281,97 @@ public class ABDownTask { log.info("====== [ task start end, task name is {},cost milliSecond is {} ] ======", "ABDownTask", (endMilliSecond-satrtMilliSecond)); } + /** + * 任务处理入口,主要用于时间记录 + * + * @return + */ + @Async(value = "abTaskExecutor") + public void doRunMohangTask(List messageDTOList){ + Long satrtMilliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(); + log.info("====== [ task start running, task name is {} ] ======", "ABDownTask"); + runMohangTask(messageDTOList); + Long endMilliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(); + log.info("====== [ task start end, task name is {},cost milliSecond is {} ] ======", "ABDownTask", (endMilliSecond-satrtMilliSecond)); + } + + /** + * 真实的任务执行入口 + * + * @return + */ + private boolean runMohangTask(List messageDTOList){ + int count = 0; // 设置请求失败计数 + // 数据实体进行映射转换 - 目前是只有一条给 + MohangMessageCovDTO mohangMessageCovDTO = new MohangMessageCovDTO(); +// ShijiMessageCovDTO shijiMessageCovDTO = new ShijiMessageCovDTO(); + // 对特殊情况进行过滤,只要AB单的用户,且字段加密规则要重新进行制定 + List 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 data = new ArrayList<>(); + // 进行转换 + collect.forEach( + each->{ + MohangMessageCovDTO.MohangData mohangData = new MohangMessageCovDTO.MohangData(); + BeanUtils.copyProperties(each, mohangData); + mohangData.setType(each.getClientType()); + byte[] bytes = each.getActName().getBytes(); + + //Base64 加密 + String encoded = java.util.Base64.getEncoder().encodeToString(bytes); + mohangData.setActName(encoded); + data.add(mohangData); + } + ); + // 进行设置 + if (!CollectionUtils.isEmpty(data)){ + mohangMessageCovDTO.setData(data); + } + // 补充其他的下游请求字段 + long time = System.currentTimeMillis() / 1000; + mohangMessageCovDTO.setTimestamp(time); + mohangMessageCovDTO.setAppId(mohangAppId); + mohangMessageCovDTO.setSignature(SecureUtil.sha1("app_id="+ mohangAppId +"×tamp="+ time + "&secret=" + mohangSecretKey)); + // 数据实体转成Json 不忽略空kv 有序 + String jsonStr = JSON.toJSONString(mohangMessageCovDTO); + log.info("========== [ready send json is {} ] =============", jsonStr); + // 请求的响应处理 + // todo 失败重发请求3次 + while (count <= 3){ + // 调用HTTP请求发送数据 + HttpResponse httpResponse = sendMohangReq(jsonStr); + log.info("-----------"+httpResponse.isOk()+httpResponse.body().contains("record")); + log.info("--------- "+httpResponse.body()); + if (httpResponse.isOk()){ + log.info("========== [request success, response is {} ] ==========", httpResponse.body()); + break; + }else{ + count ++; + log.error("========== [request fail, response is {} ] ==========", httpResponse.body()); + } + } + if (count > 3) { + return Boolean.FALSE; + } + collect.forEach( + // FIXME: 2021/4/1 0012 可能会造成更新失败,检查更新语句 + each -> abMessageService.updateSendMHSatus(Long.valueOf(each.getRecId()), Boolean.TRUE) + ); + return Boolean.TRUE; + } + /** * 真实的任务执行入口 * @@ -1191,6 +1295,19 @@ public class ABDownTask { return httpResponse; } + /** + * 调用HTTP请求发送数据 + * + * @param json 请求的body内容 + * @return + */ + private HttpResponse sendMohangReq(String json){ + HttpResponse httpResponse = HttpRequest + .post(mohangJiUrl) + .body(json) + .execute(); + return httpResponse; + } /** * 调用HTTP请求发送数据 * diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 6d7245e..0783c59 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -48,6 +48,10 @@ ab: appId: excin4hg3n29yc73ns9x url: https://www.shijikj.cn/ex/infoColl secretKey: ex456c24iejto89pavp + mohang: + appId: TZRamCan + url: http://175.27.191.107:8080//highseas/api/tz + secretKey: 77ea829b727913a87f8aa461b392dbb5 luoshi: appId: Hangzhouyunuo url: https://data.hzluoshi.cn/index/phoneapi