fix:【system 系统功能】腾讯云短信回调没有 logId 需要 serialNo 来更新本地记录
This commit is contained in:
@@ -22,4 +22,8 @@ public interface SmsLogMapper extends BaseMapperX<SmsLogDO> {
|
|||||||
.orderByDesc(SmsLogDO::getId));
|
.orderByDesc(SmsLogDO::getId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default SmsLogDO selectByApiSerialNo(String apiSerialNo) {
|
||||||
|
return selectOne(SmsLogDO::getApiSerialNo, apiSerialNo);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -119,6 +119,7 @@ public class TencentSmsClient extends AbstractSmsClient {
|
|||||||
return new SmsReceiveRespDTO()
|
return new SmsReceiveRespDTO()
|
||||||
.setSuccess("SUCCESS".equals(statusObj.getStr("report_status"))) // 是否接收成功
|
.setSuccess("SUCCESS".equals(statusObj.getStr("report_status"))) // 是否接收成功
|
||||||
.setErrorCode(statusObj.getStr("errmsg")) // 状态报告编码
|
.setErrorCode(statusObj.getStr("errmsg")) // 状态报告编码
|
||||||
|
.setErrorMsg(statusObj.getStr("description")) // 状态报告描述
|
||||||
.setMobile(statusObj.getStr("mobile")) // 手机号
|
.setMobile(statusObj.getStr("mobile")) // 手机号
|
||||||
.setReceiveTime(statusObj.getLocalDateTime("user_receive_time", null)) // 状态报告时间
|
.setReceiveTime(statusObj.getLocalDateTime("user_receive_time", null)) // 状态报告时间
|
||||||
.setSerialNo(statusObj.getStr("sid")); // 发送序列号
|
.setSerialNo(statusObj.getStr("sid")); // 发送序列号
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import java.util.Map;
|
|||||||
* 短信日志 Service 接口
|
* 短信日志 Service 接口
|
||||||
*
|
*
|
||||||
* @author zzf
|
* @author zzf
|
||||||
* @date 13:48 2021/3/2
|
* @since 13:48 2021/3/2
|
||||||
*/
|
*/
|
||||||
public interface SmsLogService {
|
public interface SmsLogService {
|
||||||
|
|
||||||
@@ -49,12 +49,13 @@ public interface SmsLogService {
|
|||||||
* 更新日志的接收结果
|
* 更新日志的接收结果
|
||||||
*
|
*
|
||||||
* @param id 日志编号
|
* @param id 日志编号
|
||||||
|
* @param apiSerialNo 发送编号
|
||||||
* @param success 是否接收成功
|
* @param success 是否接收成功
|
||||||
* @param receiveTime 用户接收时间
|
* @param receiveTime 用户接收时间
|
||||||
* @param apiReceiveCode API 接收结果的编码
|
* @param apiReceiveCode API 接收结果的编码
|
||||||
* @param apiReceiveMsg API 接收结果的说明
|
* @param apiReceiveMsg API 接收结果的说明
|
||||||
*/
|
*/
|
||||||
void updateSmsReceiveResult(Long id, Boolean success,
|
void updateSmsReceiveResult(Long id, String apiSerialNo, Boolean success,
|
||||||
LocalDateTime receiveTime, String apiReceiveCode, String apiReceiveMsg);
|
LocalDateTime receiveTime, String apiReceiveCode, String apiReceiveMsg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -63,10 +64,17 @@ public class SmsLogServiceImpl implements SmsLogService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateSmsReceiveResult(Long id, Boolean success, LocalDateTime receiveTime,
|
public void updateSmsReceiveResult(Long id, String apiSerialNo, Boolean success, LocalDateTime receiveTime,
|
||||||
String apiReceiveCode, String apiReceiveMsg) {
|
String apiReceiveCode, String apiReceiveMsg) {
|
||||||
SmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ?
|
SmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ?
|
||||||
SmsReceiveStatusEnum.SUCCESS : SmsReceiveStatusEnum.FAILURE;
|
SmsReceiveStatusEnum.SUCCESS : SmsReceiveStatusEnum.FAILURE;
|
||||||
|
if (id == null || id == 0) {
|
||||||
|
SmsLogDO log = smsLogMapper.selectByApiSerialNo(apiSerialNo);
|
||||||
|
if (log == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
id = log.getId();
|
||||||
|
}
|
||||||
smsLogMapper.updateById(SmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus())
|
smsLogMapper.updateById(SmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus())
|
||||||
.receiveTime(receiveTime).apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build());
|
.receiveTime(receiveTime).apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ public class SmsSendServiceImpl implements SmsSendService {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新
|
// 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新
|
||||||
receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(),
|
receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(), result.getSerialNo(),
|
||||||
result.getSuccess(), result.getReceiveTime(), result.getErrorCode(), result.getErrorMsg()));
|
result.getSuccess(), result.getReceiveTime(), result.getErrorCode(), result.getErrorMsg()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,47 +41,47 @@ public class SmsLogServiceImplTest extends BaseDbUnitTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetSmsLogPage() {
|
public void testGetSmsLogPage() {
|
||||||
// mock 数据
|
// mock 数据
|
||||||
SmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到
|
SmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到
|
||||||
o.setChannelId(1L);
|
o.setChannelId(1L);
|
||||||
o.setTemplateId(10L);
|
o.setTemplateId(10L);
|
||||||
o.setMobile("15601691300");
|
o.setMobile("15601691300");
|
||||||
o.setSendStatus(SmsSendStatusEnum.INIT.getStatus());
|
o.setSendStatus(SmsSendStatusEnum.INIT.getStatus());
|
||||||
o.setSendTime(buildTime(2020, 11, 11));
|
o.setSendTime(buildTime(2020, 11, 11));
|
||||||
o.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
|
o.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
|
||||||
o.setReceiveTime(buildTime(2021, 11, 11));
|
o.setReceiveTime(buildTime(2021, 11, 11));
|
||||||
});
|
});
|
||||||
smsLogMapper.insert(dbSmsLog);
|
smsLogMapper.insert(dbSmsLog);
|
||||||
// 测试 channelId 不匹配
|
// 测试 channelId 不匹配
|
||||||
smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setChannelId(2L)));
|
smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setChannelId(2L)));
|
||||||
// 测试 templateId 不匹配
|
// 测试 templateId 不匹配
|
||||||
smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setTemplateId(20L)));
|
smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setTemplateId(20L)));
|
||||||
// 测试 mobile 不匹配
|
// 测试 mobile 不匹配
|
||||||
smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setMobile("18818260999")));
|
smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setMobile("18818260999")));
|
||||||
// 测试 sendStatus 不匹配
|
// 测试 sendStatus 不匹配
|
||||||
smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendStatus(SmsSendStatusEnum.IGNORE.getStatus())));
|
smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendStatus(SmsSendStatusEnum.IGNORE.getStatus())));
|
||||||
// 测试 sendTime 不匹配
|
// 测试 sendTime 不匹配
|
||||||
smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12))));
|
smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12))));
|
||||||
// 测试 receiveStatus 不匹配
|
// 测试 receiveStatus 不匹配
|
||||||
smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveStatus(SmsReceiveStatusEnum.SUCCESS.getStatus())));
|
smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveStatus(SmsReceiveStatusEnum.SUCCESS.getStatus())));
|
||||||
// 测试 receiveTime 不匹配
|
// 测试 receiveTime 不匹配
|
||||||
smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12))));
|
smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12))));
|
||||||
// 准备参数
|
// 准备参数
|
||||||
SmsLogPageReqVO reqVO = new SmsLogPageReqVO();
|
SmsLogPageReqVO reqVO = new SmsLogPageReqVO();
|
||||||
reqVO.setChannelId(1L);
|
reqVO.setChannelId(1L);
|
||||||
reqVO.setTemplateId(10L);
|
reqVO.setTemplateId(10L);
|
||||||
reqVO.setMobile("156");
|
reqVO.setMobile("156");
|
||||||
reqVO.setSendStatus(SmsSendStatusEnum.INIT.getStatus());
|
reqVO.setSendStatus(SmsSendStatusEnum.INIT.getStatus());
|
||||||
reqVO.setSendTime(buildBetweenTime(2020, 11, 1, 2020, 11, 30));
|
reqVO.setSendTime(buildBetweenTime(2020, 11, 1, 2020, 11, 30));
|
||||||
reqVO.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
|
reqVO.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
|
||||||
reqVO.setReceiveTime(buildBetweenTime(2021, 11, 1, 2021, 11, 30));
|
reqVO.setReceiveTime(buildBetweenTime(2021, 11, 1, 2021, 11, 30));
|
||||||
|
|
||||||
// 调用
|
// 调用
|
||||||
PageResult<SmsLogDO> pageResult = smsLogService.getSmsLogPage(reqVO);
|
PageResult<SmsLogDO> pageResult = smsLogService.getSmsLogPage(reqVO);
|
||||||
// 断言
|
// 断言
|
||||||
assertEquals(1, pageResult.getTotal());
|
assertEquals(1, pageResult.getTotal());
|
||||||
assertEquals(1, pageResult.getList().size());
|
assertEquals(1, pageResult.getList().size());
|
||||||
assertPojoEquals(dbSmsLog, pageResult.getList().get(0));
|
assertPojoEquals(dbSmsLog, pageResult.getList().get(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -153,13 +153,14 @@ public class SmsLogServiceImplTest extends BaseDbUnitTest {
|
|||||||
smsLogMapper.insert(dbSmsLog);
|
smsLogMapper.insert(dbSmsLog);
|
||||||
// 准备参数
|
// 准备参数
|
||||||
Long id = dbSmsLog.getId();
|
Long id = dbSmsLog.getId();
|
||||||
|
String apiSerialNo = dbSmsLog.getApiSerialNo();
|
||||||
Boolean success = randomBoolean();
|
Boolean success = randomBoolean();
|
||||||
LocalDateTime receiveTime = randomLocalDateTime();
|
LocalDateTime receiveTime = randomLocalDateTime();
|
||||||
String apiReceiveCode = randomString();
|
String apiReceiveCode = randomString();
|
||||||
String apiReceiveMsg = randomString();
|
String apiReceiveMsg = randomString();
|
||||||
|
|
||||||
// 调用
|
// 调用
|
||||||
smsLogService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg);
|
smsLogService.updateSmsReceiveResult(id, apiSerialNo, success, receiveTime, apiReceiveCode, apiReceiveMsg);
|
||||||
// 断言
|
// 断言
|
||||||
dbSmsLog = smsLogMapper.selectById(id);
|
dbSmsLog = smsLogMapper.selectById(id);
|
||||||
assertEquals(success ? SmsReceiveStatusEnum.SUCCESS.getStatus()
|
assertEquals(success ? SmsReceiveStatusEnum.SUCCESS.getStatus()
|
||||||
|
|||||||
@@ -291,7 +291,7 @@ public class SmsSendServiceImplTest extends BaseMockitoUnitTest {
|
|||||||
// 调用
|
// 调用
|
||||||
smsSendService.receiveSmsStatus(channelCode, text);
|
smsSendService.receiveSmsStatus(channelCode, text);
|
||||||
// 断言
|
// 断言
|
||||||
receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSuccess()),
|
receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSerialNo()), eq(result.getSuccess()),
|
||||||
eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode())));
|
eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user