Commit 4c5134ae1cc17815ace13f86fece03f91174d695

Authored by YunaiV
1 parent 5107322e

fix:【system 系统功能】腾讯云短信回调没有 logId 需要 serialNo 来更新本地记录

yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsLogMapper.java
@@ -22,4 +22,8 @@ public interface SmsLogMapper extends BaseMapperX<SmsLogDO> { @@ -22,4 +22,8 @@ public interface SmsLogMapper extends BaseMapperX<SmsLogDO> {
22 .orderByDesc(SmsLogDO::getId)); 22 .orderByDesc(SmsLogDO::getId));
23 } 23 }
24 24
  25 + default SmsLogDO selectByApiSerialNo(String apiSerialNo) {
  26 + return selectOne(SmsLogDO::getApiSerialNo, apiSerialNo);
  27 + }
  28 +
25 } 29 }
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/framework/sms/core/client/impl/TencentSmsClient.java
@@ -119,6 +119,7 @@ public class TencentSmsClient extends AbstractSmsClient { @@ -119,6 +119,7 @@ public class TencentSmsClient extends AbstractSmsClient {
119 return new SmsReceiveRespDTO() 119 return new SmsReceiveRespDTO()
120 .setSuccess("SUCCESS".equals(statusObj.getStr("report_status"))) // 是否接收成功 120 .setSuccess("SUCCESS".equals(statusObj.getStr("report_status"))) // 是否接收成功
121 .setErrorCode(statusObj.getStr("errmsg")) // 状态报告编码 121 .setErrorCode(statusObj.getStr("errmsg")) // 状态报告编码
  122 + .setErrorMsg(statusObj.getStr("description")) // 状态报告描述
122 .setMobile(statusObj.getStr("mobile")) // 手机号 123 .setMobile(statusObj.getStr("mobile")) // 手机号
123 .setReceiveTime(statusObj.getLocalDateTime("user_receive_time", null)) // 状态报告时间 124 .setReceiveTime(statusObj.getLocalDateTime("user_receive_time", null)) // 状态报告时间
124 .setSerialNo(statusObj.getStr("sid")); // 发送序列号 125 .setSerialNo(statusObj.getStr("sid")); // 发送序列号
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java
@@ -12,7 +12,7 @@ import java.util.Map; @@ -12,7 +12,7 @@ import java.util.Map;
12 * 短信日志 Service 接口 12 * 短信日志 Service 接口
13 * 13 *
14 * @author zzf 14 * @author zzf
15 - * @date 13:48 2021/3/2 15 + * @since 13:48 2021/3/2
16 */ 16 */
17 public interface SmsLogService { 17 public interface SmsLogService {
18 18
@@ -49,12 +49,13 @@ public interface SmsLogService { @@ -49,12 +49,13 @@ public interface SmsLogService {
49 * 更新日志的接收结果 49 * 更新日志的接收结果
50 * 50 *
51 * @param id 日志编号 51 * @param id 日志编号
  52 + * @param apiSerialNo 发送编号
52 * @param success 是否接收成功 53 * @param success 是否接收成功
53 * @param receiveTime 用户接收时间 54 * @param receiveTime 用户接收时间
54 * @param apiReceiveCode API 接收结果的编码 55 * @param apiReceiveCode API 接收结果的编码
55 * @param apiReceiveMsg API 接收结果的说明 56 * @param apiReceiveMsg API 接收结果的说明
56 */ 57 */
57 - void updateSmsReceiveResult(Long id, Boolean success, 58 + void updateSmsReceiveResult(Long id, String apiSerialNo, Boolean success,
58 LocalDateTime receiveTime, String apiReceiveCode, String apiReceiveMsg); 59 LocalDateTime receiveTime, String apiReceiveCode, String apiReceiveMsg);
59 60
60 /** 61 /**
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java
@@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j; @@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
11 import org.springframework.stereotype.Service; 11 import org.springframework.stereotype.Service;
12 12
13 import jakarta.annotation.Resource; 13 import jakarta.annotation.Resource;
  14 +
14 import java.time.LocalDateTime; 15 import java.time.LocalDateTime;
15 import java.util.Map; 16 import java.util.Map;
16 import java.util.Objects; 17 import java.util.Objects;
@@ -63,10 +64,17 @@ public class SmsLogServiceImpl implements SmsLogService { @@ -63,10 +64,17 @@ public class SmsLogServiceImpl implements SmsLogService {
63 } 64 }
64 65
65 @Override 66 @Override
66 - public void updateSmsReceiveResult(Long id, Boolean success, LocalDateTime receiveTime, 67 + public void updateSmsReceiveResult(Long id, String apiSerialNo, Boolean success, LocalDateTime receiveTime,
67 String apiReceiveCode, String apiReceiveMsg) { 68 String apiReceiveCode, String apiReceiveMsg) {
68 SmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? 69 SmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ?
69 SmsReceiveStatusEnum.SUCCESS : SmsReceiveStatusEnum.FAILURE; 70 SmsReceiveStatusEnum.SUCCESS : SmsReceiveStatusEnum.FAILURE;
  71 + if (id == null || id == 0) {
  72 + SmsLogDO log = smsLogMapper.selectByApiSerialNo(apiSerialNo);
  73 + if (log == null) {
  74 + return;
  75 + }
  76 + id = log.getId();
  77 + }
70 smsLogMapper.updateById(SmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()) 78 smsLogMapper.updateById(SmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus())
71 .receiveTime(receiveTime).apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build()); 79 .receiveTime(receiveTime).apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build());
72 } 80 }
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java
@@ -184,7 +184,7 @@ public class SmsSendServiceImpl implements SmsSendService { @@ -184,7 +184,7 @@ public class SmsSendServiceImpl implements SmsSendService {
184 return; 184 return;
185 } 185 }
186 // 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新 186 // 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新
187 - receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(), 187 + receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(), result.getSerialNo(),
188 result.getSuccess(), result.getReceiveTime(), result.getErrorCode(), result.getErrorMsg())); 188 result.getSuccess(), result.getReceiveTime(), result.getErrorCode(), result.getErrorMsg()));
189 } 189 }
190 190
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImplTest.java
@@ -41,47 +41,47 @@ public class SmsLogServiceImplTest extends BaseDbUnitTest { @@ -41,47 +41,47 @@ public class SmsLogServiceImplTest extends BaseDbUnitTest {
41 41
42 @Test 42 @Test
43 public void testGetSmsLogPage() { 43 public void testGetSmsLogPage() {
44 - // mock 数据  
45 - SmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到  
46 - o.setChannelId(1L);  
47 - o.setTemplateId(10L);  
48 - o.setMobile("15601691300");  
49 - o.setSendStatus(SmsSendStatusEnum.INIT.getStatus());  
50 - o.setSendTime(buildTime(2020, 11, 11));  
51 - o.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());  
52 - o.setReceiveTime(buildTime(2021, 11, 11));  
53 - });  
54 - smsLogMapper.insert(dbSmsLog);  
55 - // 测试 channelId 不匹配  
56 - smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setChannelId(2L)));  
57 - // 测试 templateId 不匹配  
58 - smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setTemplateId(20L)));  
59 - // 测试 mobile 不匹配  
60 - smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setMobile("18818260999")));  
61 - // 测试 sendStatus 不匹配  
62 - smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendStatus(SmsSendStatusEnum.IGNORE.getStatus())));  
63 - // 测试 sendTime 不匹配  
64 - smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12))));  
65 - // 测试 receiveStatus 不匹配  
66 - smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveStatus(SmsReceiveStatusEnum.SUCCESS.getStatus())));  
67 - // 测试 receiveTime 不匹配  
68 - smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12))));  
69 - // 准备参数  
70 - SmsLogPageReqVO reqVO = new SmsLogPageReqVO();  
71 - reqVO.setChannelId(1L);  
72 - reqVO.setTemplateId(10L);  
73 - reqVO.setMobile("156");  
74 - reqVO.setSendStatus(SmsSendStatusEnum.INIT.getStatus());  
75 - reqVO.setSendTime(buildBetweenTime(2020, 11, 1, 2020, 11, 30));  
76 - reqVO.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());  
77 - reqVO.setReceiveTime(buildBetweenTime(2021, 11, 1, 2021, 11, 30));  
78 -  
79 - // 调用  
80 - PageResult<SmsLogDO> pageResult = smsLogService.getSmsLogPage(reqVO);  
81 - // 断言  
82 - assertEquals(1, pageResult.getTotal());  
83 - assertEquals(1, pageResult.getList().size());  
84 - assertPojoEquals(dbSmsLog, pageResult.getList().get(0)); 44 + // mock 数据
  45 + SmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到
  46 + o.setChannelId(1L);
  47 + o.setTemplateId(10L);
  48 + o.setMobile("15601691300");
  49 + o.setSendStatus(SmsSendStatusEnum.INIT.getStatus());
  50 + o.setSendTime(buildTime(2020, 11, 11));
  51 + o.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
  52 + o.setReceiveTime(buildTime(2021, 11, 11));
  53 + });
  54 + smsLogMapper.insert(dbSmsLog);
  55 + // 测试 channelId 不匹配
  56 + smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setChannelId(2L)));
  57 + // 测试 templateId 不匹配
  58 + smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setTemplateId(20L)));
  59 + // 测试 mobile 不匹配
  60 + smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setMobile("18818260999")));
  61 + // 测试 sendStatus 不匹配
  62 + smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendStatus(SmsSendStatusEnum.IGNORE.getStatus())));
  63 + // 测试 sendTime 不匹配
  64 + smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12))));
  65 + // 测试 receiveStatus 不匹配
  66 + smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveStatus(SmsReceiveStatusEnum.SUCCESS.getStatus())));
  67 + // 测试 receiveTime 不匹配
  68 + smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12))));
  69 + // 准备参数
  70 + SmsLogPageReqVO reqVO = new SmsLogPageReqVO();
  71 + reqVO.setChannelId(1L);
  72 + reqVO.setTemplateId(10L);
  73 + reqVO.setMobile("156");
  74 + reqVO.setSendStatus(SmsSendStatusEnum.INIT.getStatus());
  75 + reqVO.setSendTime(buildBetweenTime(2020, 11, 1, 2020, 11, 30));
  76 + reqVO.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
  77 + reqVO.setReceiveTime(buildBetweenTime(2021, 11, 1, 2021, 11, 30));
  78 +
  79 + // 调用
  80 + PageResult<SmsLogDO> pageResult = smsLogService.getSmsLogPage(reqVO);
  81 + // 断言
  82 + assertEquals(1, pageResult.getTotal());
  83 + assertEquals(1, pageResult.getList().size());
  84 + assertPojoEquals(dbSmsLog, pageResult.getList().get(0));
85 } 85 }
86 86
87 @Test 87 @Test
@@ -153,13 +153,14 @@ public class SmsLogServiceImplTest extends BaseDbUnitTest { @@ -153,13 +153,14 @@ public class SmsLogServiceImplTest extends BaseDbUnitTest {
153 smsLogMapper.insert(dbSmsLog); 153 smsLogMapper.insert(dbSmsLog);
154 // 准备参数 154 // 准备参数
155 Long id = dbSmsLog.getId(); 155 Long id = dbSmsLog.getId();
  156 + String apiSerialNo = dbSmsLog.getApiSerialNo();
156 Boolean success = randomBoolean(); 157 Boolean success = randomBoolean();
157 LocalDateTime receiveTime = randomLocalDateTime(); 158 LocalDateTime receiveTime = randomLocalDateTime();
158 String apiReceiveCode = randomString(); 159 String apiReceiveCode = randomString();
159 String apiReceiveMsg = randomString(); 160 String apiReceiveMsg = randomString();
160 161
161 // 调用 162 // 调用
162 - smsLogService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg); 163 + smsLogService.updateSmsReceiveResult(id, apiSerialNo, success, receiveTime, apiReceiveCode, apiReceiveMsg);
163 // 断言 164 // 断言
164 dbSmsLog = smsLogMapper.selectById(id); 165 dbSmsLog = smsLogMapper.selectById(id);
165 assertEquals(success ? SmsReceiveStatusEnum.SUCCESS.getStatus() 166 assertEquals(success ? SmsReceiveStatusEnum.SUCCESS.getStatus()
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImplTest.java
@@ -291,7 +291,7 @@ public class SmsSendServiceImplTest extends BaseMockitoUnitTest { @@ -291,7 +291,7 @@ public class SmsSendServiceImplTest extends BaseMockitoUnitTest {
291 // 调用 291 // 调用
292 smsSendService.receiveSmsStatus(channelCode, text); 292 smsSendService.receiveSmsStatus(channelCode, text);
293 // 断言 293 // 断言
294 - receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSuccess()), 294 + receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSerialNo()), eq(result.getSuccess()),
295 eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode()))); 295 eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode())));
296 } 296 }
297 297