From 9d077f92056d79a24014a6b23180bafef0945342 Mon Sep 17 00:00:00 2001 From: Lx <935448346@qq.com> Date: Wed, 30 Apr 2025 13:25:39 +0800 Subject: [PATCH] 0430-1 --- .../controller/app/MessageController.java | 131 ++++++++++++++++++ .../service/DlDriveSchoolStudentService.java | 5 +- .../impl/DlDriveSchoolStudentServiceImpl.java | 78 ++++++++++- .../module/base/utils/WxMaConfiguration.java | 25 ++++ .../base/vo/SubscriptionMessageDTO.java | 19 +++ .../service/impl/ProcessServiceImpl.java | 4 + .../impl/ExamBatchItemServiceImpl.java | 8 ++ yudao-server/pom.xml | 6 + .../src/main/resources/application-local.yaml | 10 ++ .../src/main/resources/application-prod.yaml | 7 + 10 files changed, 284 insertions(+), 9 deletions(-) create mode 100644 dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/controller/app/MessageController.java create mode 100644 dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/utils/WxMaConfiguration.java create mode 100644 dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/vo/SubscriptionMessageDTO.java diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/controller/app/MessageController.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/controller/app/MessageController.java new file mode 100644 index 00000000..3d36514c --- /dev/null +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/controller/app/MessageController.java @@ -0,0 +1,131 @@ +package cn.iocoder.yudao.module.base.controller.app; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; +import cn.binarywang.wx.miniapp.config.WxMaConfig; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.module.jx.domain.DriveSchoolGuide; +import cn.iocoder.yudao.module.jx.service.DriveSchoolGuideService; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import cn.iocoder.yudao.util.SendSmsUtil; +import lombok.Data; +import me.chanjar.weixin.common.error.WxErrorException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import cn.iocoder.yudao.module.base.vo.SubscriptionMessageDTO; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/wxPush/message") +public class MessageController { + + @Autowired + @Qualifier("jxWxMaService") + private WxMaService jxWxMaService; + + @Autowired + private DriveSchoolGuideService driveSchoolGuideService; + + @Resource + private AdminUserApi userApi; + + + /** + * 发送一次性订阅消息 + */ + @PostMapping("/sendOnce") + public ResponseEntity> sendOnce( + @RequestBody SubscriptionMessageDTO messageDTO) { + + Map response = new HashMap<>(); + + try { + + // 构建消息 + WxMaSubscribeMessage message = new WxMaSubscribeMessage(); + message.setToUser(messageDTO.getOpenid()); + message.setTemplateId(messageDTO.getTemplateId()); + // 设置跳转页面 + message.setPage(messageDTO.getPage()); + + // 添加模板内容 + messageDTO.getData().forEach((key, value) -> { + message.addData(new WxMaSubscribeMessage.MsgData(key, value.getValue())); + }); + + // 发送订阅消息 + jxWxMaService.getMsgService().sendSubscribeMsg(message); + + // 发送短信 + /*if(messageDTO.getPage() != null){ + String page = messageDTO.getPage(); + if (page.contains("tenantId=")) { + String tenantId = page.substring(page.indexOf("tenantId=") + 9); + this.sendSms(tenantId); + } + }*/ + + response.put("success", true); + response.put("message", "发送成功"); + return ResponseEntity.ok(response); + + } catch (WxErrorException e) { + // 微信接口错误处理 + response.put("success", false); + response.put("errorCode", e.getError().getErrorCode()); + response.put("message", "微信接口错误: " + e.getError().getErrorMsg()); + return ResponseEntity.status(500).body(response); + + } catch (Exception e) { + // 其他错误处理 + response.put("success", false); + response.put("message", "系统错误: " + e.getMessage()); + return ResponseEntity.status(500).body(response); + } + } + + /** + * 向用户发送短信 + * @return + */ + @GetMapping("/sendSms") + public void sendSms(String tenantId) { + // 通过tenantId获取需要发送的短信内容 + List driveSchoolGuides = driveSchoolGuideService.listByTenantId(tenantId); + Long userId = SecurityFrameworkUtils.getLoginUserId(); + AdminUserRespDTO user = userApi.getUser(userId); + String mobile = user.getUsername(); + if(!driveSchoolGuides.isEmpty()){ + String msgText = driveSchoolGuides.get(0).getMsgText(); + // 发送短信 + if(!msgText.isEmpty() && !mobile.isEmpty()){ + SendSmsUtil.sendMsgCommon(new String[]{msgText}, mobile, "1400852709", "驾悦同行小程序", "2143603"); + } + } + } + + + @GetMapping("/checkConfig") + @PermitAll + public String checkConfig() { + // 获取当前 WxMaService 的配置 + WxMaConfig config = jxWxMaService.getWxMaConfig(); + + return String.format( + "当前使用的配置:\nAppID: %s\nSecret: %s\nToken: %s\nAESKey: %s", + config.getAppid(), + config.getSecret(), + config.getToken(), + config.getAesKey() + ); + } +} diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/service/DlDriveSchoolStudentService.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/service/DlDriveSchoolStudentService.java index 2cb88619..d6f09316 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/service/DlDriveSchoolStudentService.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/service/DlDriveSchoolStudentService.java @@ -30,10 +30,10 @@ public interface DlDriveSchoolStudentService extends IService wrapper = new QueryWrapper<>(); + wrapper.select("driving_student_code") + .likeRight("driving_student_code", yearMonth) + .eq("tenant_id", tenantId) + .orderByDesc("driving_student_code") + .last("LIMIT 1"); + + DlDriveSchoolStudent maxStudent = dlDriveSchoolStudentMapper.selectOne(wrapper); + + int next = 1; + if (maxStudent != null && StringUtils.isNotBlank(maxStudent.getDrivingStudentCode())) { + String code = maxStudent.getDrivingStudentCode(); + String suffix = code.substring(6); + next = Integer.parseInt(suffix) + 1; + } + + return yearMonth + String.format("%04d", next); } @@ -382,6 +423,29 @@ public class DlDriveSchoolStudentServiceImpl extends ServiceImpl data; + + @Data + public static class TemplateData { + private String value; + } +} diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/ProcessServiceImpl.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/ProcessServiceImpl.java index dfc60f44..736f1d20 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/ProcessServiceImpl.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/ProcessServiceImpl.java @@ -400,6 +400,10 @@ public class ProcessServiceImpl extends ServiceImpl impl } + /** + * 科目一、科目四考试成绩录入 + * @param process + */ @Override public void updateProcess(Process process) { Long userId = SecurityFrameworkUtils.getLoginUserId(); diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/exam/service/impl/ExamBatchItemServiceImpl.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/exam/service/impl/ExamBatchItemServiceImpl.java index bc642531..1bc68200 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/exam/service/impl/ExamBatchItemServiceImpl.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/exam/service/impl/ExamBatchItemServiceImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.exam.service.impl; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.module.base.constant.SchoolBaseConstants; +import cn.iocoder.yudao.module.base.service.DlDriveSchoolStudentService; import cn.iocoder.yudao.module.base.service.SchoolNotifyMessageSendService; import cn.iocoder.yudao.module.course.entity.Process; import cn.iocoder.yudao.module.course.mapper.ProcessMapper; @@ -56,6 +57,9 @@ public class ExamBatchItemServiceImpl extends ServiceImplyudao-spring-boot-starter-protection + + com.github.binarywang + wx-java-miniapp-spring-boot-starter + 4.6.0 + + diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index ae71216a..90db63fd 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -184,6 +184,7 @@ logging: cn.iocoder.yudao.module.property.mapper: debug # cn.iocoder.yudao.module.tickets.mapper: debug # cn.iocoder.yudao.module.project.mapper: debug # + com.github.binarywang: debug # 打印 WxJava 详细日志 debug: false @@ -210,6 +211,13 @@ wx: type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 key-prefix: wa # Redis Key 的前缀 http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 + jx-miniapp: # 小程序配置(必填) + appid: wx684fc832e96cee65 + secret: d1fecac806c5f3cd9aca9f3d5c3759c7 + config-storage: + type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 + key-prefix: jx + http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 --- #################### 芋道相关配置 #################### @@ -256,3 +264,5 @@ justauth: prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE:: timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 + + diff --git a/yudao-server/src/main/resources/application-prod.yaml b/yudao-server/src/main/resources/application-prod.yaml index e268f596..3cccc2e9 100644 --- a/yudao-server/src/main/resources/application-prod.yaml +++ b/yudao-server/src/main/resources/application-prod.yaml @@ -203,6 +203,13 @@ wx: type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 key-prefix: wa # Redis Key 的前缀 http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 + jx-miniapp: # 小程序配置(必填) + appid: wx684fc832e96cee65 + secret: d1fecac806c5f3cd9aca9f3d5c3759c7 + config-storage: + type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 + key-prefix: jx + http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 --- #################### 芋道相关配置 ####################