From ea9cde75a9ab5bb83b3cd6b747f37578216b80a5 Mon Sep 17 00:00:00 2001 From: huangyuzhi Date: Thu, 19 Mar 2026 16:42:26 +0800 Subject: [PATCH] Kimi-k25 --- .vscode/settings.json | 3 + .../cl/controller/YishengyuyueController.java | 136 ++++++++++++++- .../main/java/com/cl/service/SmsService.java | 34 ++++ .../com/cl/service/impl/SmsServiceImpl.java | 143 ++++++++++++++++ .../controller/YishengyuyueController.class | Bin 14289 -> 17420 bytes .../classes/com/cl/service/SmsService.class | Bin 0 -> 400 bytes .../com/cl/service/impl/SmsServiceImpl.class | Bin 0 -> 5295 bytes .../compile/default-compile/createdFiles.lst | 0 .../compile/default-compile/inputFiles.lst | 159 ++++++++++++++++++ 9 files changed, 474 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json create mode 100644 server_code/src/main/java/com/cl/service/SmsService.java create mode 100644 server_code/src/main/java/com/cl/service/impl/SmsServiceImpl.java create mode 100644 server_code/target/classes/com/cl/service/SmsService.class create mode 100644 server_code/target/classes/com/cl/service/impl/SmsServiceImpl.class create mode 100644 server_code/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 server_code/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..7b016a89f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.compile.nullAnalysis.mode": "automatic" +} \ No newline at end of file diff --git a/server_code/src/main/java/com/cl/controller/YishengyuyueController.java b/server_code/src/main/java/com/cl/controller/YishengyuyueController.java index fa30f8a91..fc9b1b760 100644 --- a/server_code/src/main/java/com/cl/controller/YishengyuyueController.java +++ b/server_code/src/main/java/com/cl/controller/YishengyuyueController.java @@ -25,9 +25,14 @@ import com.cl.annotation.SysLog; import com.cl.entity.YishengyuyueEntity; +import com.cl.entity.YishengEntity; +import com.cl.entity.YonghuEntity; import com.cl.entity.view.YishengyuyueView; import com.cl.service.YishengyuyueService; +import com.cl.service.YishengService; +import com.cl.service.YonghuService; +import com.cl.service.SmsService; import com.cl.service.TokenService; import com.cl.utils.PageUtils; import com.cl.utils.R; @@ -48,6 +53,15 @@ public class YishengyuyueController { @Autowired private YishengyuyueService yishengyuyueService; + @Autowired + private YishengService yishengService; + + @Autowired + private YonghuService yonghuService; + + @Autowired + private SmsService smsService; + @@ -159,7 +173,19 @@ public R save(@RequestBody YishengyuyueEntity yishengyuyue, HttpServletRequest r @RequestMapping("/add") public R add(@RequestBody YishengyuyueEntity yishengyuyue, HttpServletRequest request){ //ValidatorUtils.validateEntity(yishengyuyue); + + // 校验用户手机号码 + if (yishengyuyue.getShouji() != null && !yishengyuyue.getShouji().trim().isEmpty()) { + if (!smsService.isValidPhoneNumber(yishengyuyue.getShouji())) { + return R.error("用户手机号码格式不正确"); + } + } + yishengyuyueService.insert(yishengyuyue); + + // 预约成功后发送短信通知医生 + sendSmsToDoctor(yishengyuyue); + return R.ok(); } @@ -190,13 +216,121 @@ public R update(@RequestBody Long[] ids, @RequestParam String sfsh, @RequestPara yishengyuyue.setSfsh(sfsh); yishengyuyue.setShhf(shhf); list.add(yishengyuyue); + + // 审核通过后发送短信通知用户 + if ("是".equals(sfsh)) { + sendSmsToUser(yishengyuyue); + } } yishengyuyueService.updateBatchById(list); return R.ok(); } + /** + * 发送短信通知医生 + * @param yishengyuyue 预约信息 + */ + private void sendSmsToDoctor(YishengyuyueEntity yishengyuyue) { + try { + // 获取医生信息 + String yishengzhanghao = yishengyuyue.getYishengzhanghao(); + if (yishengzhanghao == null || yishengzhanghao.trim().isEmpty()) { + return; + } - + YishengEntity yisheng = yishengService.selectOne( + new EntityWrapper().eq("yishengzhanghao", yishengzhanghao) + ); + + if (yisheng == null) { + return; + } + + // 校验医生手机号码 + String doctorPhone = yisheng.getDianhua(); + if (doctorPhone == null || doctorPhone.trim().isEmpty()) { + return; + } + + if (!smsService.isValidPhoneNumber(doctorPhone)) { + return; + } + + // 构建短信内容 + String message = String.format( + "【医疗预约系统】您好,%s医生,用户%s预约了您的诊疗服务,预约时间:%s,请登录系统查看详情。", + yisheng.getYishengxingming() != null ? yisheng.getYishengxingming() : yishengzhanghao, + yishengyuyue.getZhanghao() != null ? yishengyuyue.getZhanghao() : "未知用户", + yishengyuyue.getYuyueshijian() != null ? + new SimpleDateFormat("yyyy-MM-dd HH:mm").format(yishengyuyue.getYuyueshijian()) : "待定" + ); + + // 发送短信(带重试机制,最多重试2次) + smsService.sendSmsWithRetry(doctorPhone, message, 2); + + } catch (Exception e) { + // 短信发送失败不影响主业务流程 + } + } + + /** + * 发送短信通知用户 + * @param yishengyuyue 预约信息 + */ + private void sendSmsToUser(YishengyuyueEntity yishengyuyue) { + try { + // 获取用户信息 + String zhanghao = yishengyuyue.getZhanghao(); + if (zhanghao == null || zhanghao.trim().isEmpty()) { + return; + } + + YonghuEntity yonghu = yonghuService.selectOne( + new EntityWrapper().eq("zhanghao", zhanghao) + ); + + if (yonghu == null) { + return; + } + + // 校验用户手机号码 + String userPhone = yonghu.getShouji(); + if (userPhone == null || userPhone.trim().isEmpty()) { + return; + } + + if (!smsService.isValidPhoneNumber(userPhone)) { + return; + } + + // 获取医生信息 + String yishengzhanghao = yishengyuyue.getYishengzhanghao(); + String yishengName = yishengzhanghao; + if (yishengzhanghao != null && !yishengzhanghao.trim().isEmpty()) { + YishengEntity yisheng = yishengService.selectOne( + new EntityWrapper().eq("yishengzhanghao", yishengzhanghao) + ); + if (yisheng != null && yisheng.getYishengxingming() != null) { + yishengName = yisheng.getYishengxingming(); + } + } + + // 构建短信内容 + String message = String.format( + "【医疗预约系统】您好,%s,您的预约申请已被%s医生审核通过,预约时间:%s,请按时就诊。", + yonghu.getXingming() != null ? yonghu.getXingming() : zhanghao, + yishengName, + yishengyuyue.getYuyueshijian() != null ? + new SimpleDateFormat("yyyy-MM-dd HH:mm").format(yishengyuyue.getYuyueshijian()) : "待定" + ); + + // 发送短信(带重试机制,最多重试2次) + smsService.sendSmsWithRetry(userPhone, message, 2); + + } catch (Exception e) { + // 短信发送失败不影响主业务流程 + } + } /** * 删除 diff --git a/server_code/src/main/java/com/cl/service/SmsService.java b/server_code/src/main/java/com/cl/service/SmsService.java new file mode 100644 index 000000000..b056f2ee8 --- /dev/null +++ b/server_code/src/main/java/com/cl/service/SmsService.java @@ -0,0 +1,34 @@ +package com.cl.service; + +/** + * 短信服务接口 + * @author + * @email + * @date 2025-03-27 15:44:15 + */ +public interface SmsService { + + /** + * 发送短信 + * @param phoneNumber 手机号码 + * @param message 短信内容 + * @return 是否发送成功 + */ + boolean sendSms(String phoneNumber, String message); + + /** + * 发送短信(带重试机制) + * @param phoneNumber 手机号码 + * @param message 短信内容 + * @param maxRetries 最大重试次数 + * @return 是否发送成功 + */ + boolean sendSmsWithRetry(String phoneNumber, String message, int maxRetries); + + /** + * 验证手机号码格式 + * @param phoneNumber 手机号码 + * @return 是否有效 + */ + boolean isValidPhoneNumber(String phoneNumber); +} diff --git a/server_code/src/main/java/com/cl/service/impl/SmsServiceImpl.java b/server_code/src/main/java/com/cl/service/impl/SmsServiceImpl.java new file mode 100644 index 000000000..3e4a92ae6 --- /dev/null +++ b/server_code/src/main/java/com/cl/service/impl/SmsServiceImpl.java @@ -0,0 +1,143 @@ +package com.cl.service.impl; + +import com.cl.service.SmsService; +import com.cl.service.SyslogService; +import com.cl.entity.SyslogEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.regex.Pattern; + +/** + * 短信服务实现类 + * @author + * @email + * @date 2025-03-27 15:44:15 + */ +@Service("smsService") +public class SmsServiceImpl implements SmsService { + + private static final Logger logger = LoggerFactory.getLogger(SmsServiceImpl.class); + + private static final Pattern PHONE_PATTERN = Pattern.compile("^1[3-9]\\d{9}$"); + + private static final int DEFAULT_MAX_RETRIES = 2; + + @Autowired + private SyslogService syslogService; + + @Override + public boolean sendSms(String phoneNumber, String message) { + if (!isValidPhoneNumber(phoneNumber)) { + logger.error("手机号码格式不正确: {}", phoneNumber); + saveSmsLog(phoneNumber, message, "发送失败:手机号码格式不正确", 0); + return false; + } + + try { + boolean success = doSendSms(phoneNumber, message); + if (success) { + saveSmsLog(phoneNumber, message, "发送成功", 100); + logger.info("短信发送成功,手机号: {}", phoneNumber); + } else { + saveSmsLog(phoneNumber, message, "发送失败", 0); + logger.error("短信发送失败,手机号: {}", phoneNumber); + } + return success; + } catch (Exception e) { + saveSmsLog(phoneNumber, message, "发送异常:" + e.getMessage(), 0); + logger.error("短信发送异常,手机号: {},错误: {}", phoneNumber, e.getMessage()); + return false; + } + } + + @Override + public boolean sendSmsWithRetry(String phoneNumber, String message, int maxRetries) { + if (!isValidPhoneNumber(phoneNumber)) { + logger.error("手机号码格式不正确: {}", phoneNumber); + saveSmsLog(phoneNumber, message, "发送失败:手机号码格式不正确", 0); + return false; + } + + int attempt = 0; + boolean success = false; + String lastError = ""; + + while (attempt <= maxRetries && !success) { + attempt++; + try { + success = doSendSms(phoneNumber, message); + if (success) { + saveSmsLog(phoneNumber, message, "发送成功,第" + attempt + "次尝试", 100); + logger.info("短信发送成功,手机号: {},第{}次尝试", phoneNumber, attempt); + return true; + } else { + lastError = "发送失败"; + logger.warn("短信发送失败,手机号: {},第{}次尝试", phoneNumber, attempt); + if (attempt <= maxRetries) { + Thread.sleep(1000); + } + } + } catch (Exception e) { + lastError = e.getMessage(); + logger.error("短信发送异常,手机号: {},第{}次尝试,错误: {}", phoneNumber, attempt, e.getMessage()); + if (attempt <= maxRetries) { + try { + Thread.sleep(1000); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + } + } + } + } + + saveSmsLog(phoneNumber, message, "发送失败,已重试" + maxRetries + "次,最后错误:" + lastError, 0); + logger.error("短信发送最终失败,手机号: {},已重试{}次", phoneNumber, maxRetries); + return false; + } + + @Override + public boolean isValidPhoneNumber(String phoneNumber) { + if (phoneNumber == null || phoneNumber.trim().isEmpty()) { + return false; + } + return PHONE_PATTERN.matcher(phoneNumber.trim()).matches(); + } + + /** + * 实际发送短信的模拟实现 + * @param phoneNumber 手机号码 + * @param message 短信内容 + * @return 是否发送成功 + */ + private boolean doSendSms(String phoneNumber, String message) { + logger.info("【模拟短信发送】手机号: {},内容: {}", phoneNumber, message); + return true; + } + + /** + * 保存短信发送日志到syslog表 + * @param phoneNumber 手机号码 + * @param message 短信内容 + * @param result 发送结果 + * @param time 耗时 + */ + private void saveSmsLog(String phoneNumber, String message, String result, long time) { + try { + SyslogEntity syslog = new SyslogEntity(); + syslog.setUsername("SMS_SERVICE"); + syslog.setOperation("短信发送"); + syslog.setMethod("SmsService.sendSms"); + syslog.setParams("手机号: " + phoneNumber + ", 内容: " + message + ", 结果: " + result); + syslog.setTime(time); + syslog.setIp("127.0.0.1"); + syslog.setAddtime(new Date()); + syslogService.insert(syslog); + } catch (Exception e) { + logger.error("保存短信日志失败: {}", e.getMessage()); + } + } +} diff --git a/server_code/target/classes/com/cl/controller/YishengyuyueController.class b/server_code/target/classes/com/cl/controller/YishengyuyueController.class index 6f07a1eabd6cb427b85ed9369cefae08e1cb98f0..da18f983937d8dcbc4f11a1eba07236fe7cda2d3 100644 GIT binary patch literal 17420 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 literal 0 HcmV?d00001 diff --git a/server_code/target/classes/com/cl/service/impl/SmsServiceImpl.class b/server_code/target/classes/com/cl/service/impl/SmsServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..3cb6f7da4b3dc31f8700edc45f2c2d884bc1045c GIT binary patch literal 5295 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