diff --git a/db/db.sql b/db/db.sql index 38645ec..a34c594 100644 --- a/db/db.sql +++ b/db/db.sql @@ -63,4 +63,34 @@ CREATE TABLE liehe_message ( push_time datetime DEFAULT NULL COMMENT '上游推送时间', send_status tinyint(1) DEFAULT 0 COMMENT '下游推送状态', PRIMARY KEY (id) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +CREATE TABLE liehe_message ( + id bigint(20) NOT NULL AUTO_INCREMENT, + gmt_create datetime DEFAULT NULL, + gmt_modified datetime DEFAULT NULL, + rec_id bigint(20) DEFAULT NULL COMMENT '记录id', + pnum varchar(255) DEFAULT NULL COMMENT 'pnum', + act_name varchar(255) DEFAULT NULL COMMENT '业务名', + start_time datetime DEFAULT NULL COMMENT '业务开始时间', + client_type tinyint(1) DEFAULT NULL COMMENT '业务类别(1:A,2:B,3:C,4:D,5:E,6:F)', + app_id varchar(255) DEFAULT NULL COMMENT '上游推送用户id', + push_time datetime DEFAULT NULL COMMENT '上游推送时间', + send_status tinyint(1) DEFAULT 0 COMMENT '下游推送状态', + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +CREATE TABLE sms_message ( + id bigint(20) NOT NULL AUTO_INCREMENT, + gmt_create datetime DEFAULT NULL, + gmt_modified datetime DEFAULT NULL, + rec_id bigint(20) DEFAULT NULL COMMENT '记录id', + act_name varchar(255) DEFAULT NULL COMMENT '业务名', + start_time datetime DEFAULT NULL COMMENT '业务开始时间', + app_id varchar(255) DEFAULT NULL COMMENT '上游推送用户id', + push_time datetime DEFAULT NULL COMMENT '上游推送时间', + send_status tinyint(1) DEFAULT 0 COMMENT '下游推送状态', + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/src/main/java/com/yuyou/openapi/openapi/api/SmsClient.java b/src/main/java/com/yuyou/openapi/openapi/api/SmsClient.java new file mode 100644 index 0000000..00f84a5 --- /dev/null +++ b/src/main/java/com/yuyou/openapi/openapi/api/SmsClient.java @@ -0,0 +1,48 @@ +package com.yuyou.openapi.openapi.api; + +import com.yuyou.openapi.openapi.common.CommonResponse; +import com.yuyou.openapi.openapi.model.convert.SendSmsConverter; +import com.yuyou.openapi.openapi.model.dto.SendSmsMessageDTO; +import com.yuyou.openapi.openapi.model.vo.SendSmsClientMessageVo; +import com.yuyou.openapi.openapi.service.SendSmsMessageService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author Enzo + * @date : 2021/4/14 + * + * 用户接收下游加密信息 进行短信转发 + */ +@Slf4j +@RestController +public class SmsClient { + + + @Autowired + private SendSmsMessageService sendSmsService; + + /** + * 获取上游信息 + * 推送到短信端 + * + * @return 返回调用信息 + */ + @PostMapping("/api/req/taginfo/sendSms") + public CommonResponse sendMessage(@RequestBody SendSmsClientMessageVo vo) { + // 记录日志 + log.info("====== [ sendSms request comming, request content is {} ] ======", vo.toString()); + // 转换实体类映射 + List dtoList = SendSmsConverter.convertSendSmsMessageDTOFromVO(vo); + // 调用业务处理接口 返回校验成功的结果 + return sendSmsService.sendSmsRecord(dtoList) ? + CommonResponse.createBySuccess() : CommonResponse.createByErrorMessage("调用失败请重试"); + } + + +} diff --git a/src/main/java/com/yuyou/openapi/openapi/conf/ThreadPoolConfig.java b/src/main/java/com/yuyou/openapi/openapi/conf/ThreadPoolConfig.java index f439289..97c5298 100644 --- a/src/main/java/com/yuyou/openapi/openapi/conf/ThreadPoolConfig.java +++ b/src/main/java/com/yuyou/openapi/openapi/conf/ThreadPoolConfig.java @@ -33,6 +33,7 @@ public class ThreadPoolConfig { /** * AB 单的异步线程池的配置类 + * * @return */ @Bean @@ -51,6 +52,7 @@ public class ThreadPoolConfig { /** * AB 单的异步线程池的配置类 + * * @return */ @Bean @@ -67,4 +69,22 @@ public class ThreadPoolConfig { return threadPoolExecutor; } + /** + * 发送短信线程池 + * + * @return + */ + @Bean + public Executor sendSmsExecutors() { + return new ThreadPoolExecutor( + corePoolSize, + maxPoolSize, + 3, + TimeUnit.SECONDS, + new LinkedBlockingDeque<>(queueCapacity), + Executors.defaultThreadFactory(), + new ThreadPoolExecutor.DiscardOldestPolicy() + ); + } + } diff --git a/src/main/java/com/yuyou/openapi/openapi/consts/SmsConstant.java b/src/main/java/com/yuyou/openapi/openapi/consts/SmsConstant.java new file mode 100644 index 0000000..30b8539 --- /dev/null +++ b/src/main/java/com/yuyou/openapi/openapi/consts/SmsConstant.java @@ -0,0 +1,28 @@ +package com.yuyou.openapi.openapi.consts; + +/** + * @author Enzo + * @date : 2021/4/14 + */ +public class SmsConstant { + + /**APP_ID*/ + public static final String APP_ID = ""; + + /**TOKEN*/ + public static final String TOKEN = ""; + + + /**SEND_SMS_URL*/ + public static final String SEND_SMS_URL = "http://47.110.11.213:8000/api/tbSendSms/url/send"; + + /**时间转换格式*/ + public static final String FORMATE_TIMESTAMP = "yyyyMMddHHmmss"; + + /**黑名单链接*/ + public static final String BLACK_URL = "http://bl.hzdaba.cn/v2/Accounts/Bigdata/IsBlacklist"; + + + + +} diff --git a/src/main/java/com/yuyou/openapi/openapi/dao/SendSmsMessageRepository.java b/src/main/java/com/yuyou/openapi/openapi/dao/SendSmsMessageRepository.java new file mode 100644 index 0000000..e360422 --- /dev/null +++ b/src/main/java/com/yuyou/openapi/openapi/dao/SendSmsMessageRepository.java @@ -0,0 +1,27 @@ +package com.yuyou.openapi.openapi.dao; + +import com.yuyou.openapi.openapi.model.dataobject.SendSmsMessageDO; +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; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author + * + */ +@Repository +public interface SendSmsMessageRepository extends JpaRepository{ + + /** + * 修改更新状态值 + * @param sendStatus + * @param recId + */ + @Transactional(rollbackFor = Exception.class) + @Modifying + @Query("update SendSmsMessageDO t set t.sendStatus = ?1 where t.recId = ?2") + void updateSendSmsStatus(Integer sendStatus,Long recId); +} + diff --git a/src/main/java/com/yuyou/openapi/openapi/model/convert/SendSmsConverter.java b/src/main/java/com/yuyou/openapi/openapi/model/convert/SendSmsConverter.java new file mode 100644 index 0000000..ab17592 --- /dev/null +++ b/src/main/java/com/yuyou/openapi/openapi/model/convert/SendSmsConverter.java @@ -0,0 +1,115 @@ +package com.yuyou.openapi.openapi.model.convert; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.CharsetUtil; +import com.yuyou.openapi.openapi.model.dataobject.SendSmsMessageDO; +import com.yuyou.openapi.openapi.model.dto.SendSmsMessageDTO; +import com.yuyou.openapi.openapi.model.vo.SendSmsClientMessageVo; +import com.yuyou.openapi.openapi.utils.DateUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Enzo + * SendSms转换类 + */ +@Slf4j +public class SendSmsConverter { + + /** + * VO层转为DTO层 + * + * @param sendSmsClientMessageVo + * @return + */ + public static List convertSendSmsMessageDTOFromVO(SendSmsClientMessageVo sendSmsClientMessageVo) { + ArrayList dtoList = new ArrayList<>(); + if (sendSmsClientMessageVo == null) { + return dtoList; + } + List dataInfos = sendSmsClientMessageVo.getData(); + if (CollectionUtils.isEmpty(dataInfos)) { + return dtoList; + } + dataInfos.forEach( + each -> { + SendSmsMessageDTO smsMessageDTO = new SendSmsMessageDTO(); + smsMessageDTO.setAppId(sendSmsClientMessageVo.getAppId()); + smsMessageDTO.setTimestamp(sendSmsClientMessageVo.getTimestamp()); + // 对特殊的ActName进行处理 + checkSpecailAppName(each); + BeanUtils.copyProperties(each, smsMessageDTO); + dtoList.add(smsMessageDTO); + } + ); + return dtoList; + } + + + /** + * 批量转DTO为DO + * + * @param + * @return + */ + public static List convertSendSmsMessageDOFromDTO(List dtoList) { + if (CollectionUtils.isEmpty(dtoList)) { + return new ArrayList<>(); + } + List messageDOList = new ArrayList<>(); + dtoList.forEach(each -> { + SendSmsMessageDO abMessageDO = convertSendSmsMessageDOFromDTO(each); + if (abMessageDO != null) { + messageDOList.add(abMessageDO); + } + }); + return messageDOList; + } + + + /** + * Luoshi DTO层转为DO层 + * + * @param sendSmsDTO + * @return + */ + public static SendSmsMessageDO convertSendSmsMessageDOFromDTO(SendSmsMessageDTO sendSmsDTO) { + SendSmsMessageDO sendSmsMessageDO = new SendSmsMessageDO(); + if (sendSmsDTO == null) { + return sendSmsMessageDO; + } + + BeanUtils.copyProperties(sendSmsDTO, sendSmsMessageDO); + sendSmsMessageDO.setPushTime(DateUtils.date(sendSmsDTO.getTimestamp())); + try{ + sendSmsMessageDO.setRecId(Long.valueOf(sendSmsDTO.getRecId())); + }catch (Exception e){ + log.error("String convert Long type Error.", e); + } + return sendSmsMessageDO; + } + + /** + * 对特殊的AppName进行检查处理 + * 例如: + * 待处理 xxxx-1-1 + * 处理后 xxxx-1 + * 无需处理的直接进行返回原值 + * + * @param dataInfo 对需要处理的actName进行处理 + * @return 返回处理后的结果 + */ + private static void checkSpecailAppName(SendSmsClientMessageVo.SmsDataInfo dataInfo) { + String actName = dataInfo.getActName(); + String decodeStr = Base64.decodeStr(actName, CharsetUtil.UTF_8); + log.info("test decodeStr str is {}", decodeStr); + String matchActName = StringUtils.substringBeforeLast(decodeStr, "-"); + dataInfo.setActName(matchActName); + } + +} diff --git a/src/main/java/com/yuyou/openapi/openapi/model/dataobject/SendSmsMessageDO.java b/src/main/java/com/yuyou/openapi/openapi/model/dataobject/SendSmsMessageDO.java new file mode 100644 index 0000000..fdb9218 --- /dev/null +++ b/src/main/java/com/yuyou/openapi/openapi/model/dataobject/SendSmsMessageDO.java @@ -0,0 +1,78 @@ +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: + *