package com.ruoyi.web.controller.wechat; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.config.WechatConfig; import com.ruoyi.common.utils.WechatUtils; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysTask; import com.ruoyi.system.domain.SysTaskEmergency; import com.ruoyi.system.mapper.SysTaskMapper; import com.ruoyi.system.mapper.SysTaskEmergencyMapper; import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.system.service.IWechatTaskNotifyService; import com.ruoyi.system.service.IWechatAccessTokenService; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 微信接口Controller * * @author ruoyi */ @RestController @RequestMapping("/wechat") public class WechatController extends BaseController { @Autowired private WechatConfig wechatConfig; @Autowired private SysTaskMapper sysTaskMapper; @Autowired private SysTaskEmergencyMapper sysTaskEmergencyMapper; @Autowired private SysUserMapper sysUserMapper; @Autowired private IWechatTaskNotifyService wechatTaskNotifyService; @Autowired private IWechatAccessTokenService wechatAccessTokenService; /** * 获取微信AccessToken(使用应用级缓存) */ @GetMapping("/accessToken") public AjaxResult getAccessToken() { try { String accessToken = wechatAccessTokenService.getAppAccessToken(); if (accessToken == null || accessToken.isEmpty()) { return error("获取微信AccessToken失败"); } return success(accessToken); } catch (Exception e) { return error("获取微信AccessToken异常:" + e.getMessage()); } } /** * 获取微信配置信息(匿名访问) * 返回前端需要的配置信息,如订阅消息模板ID等 */ @Anonymous @GetMapping("/config") public AjaxResult getConfig() { Map config = new HashMap<>(); config.put("taskNotifyTemplateId", wechatConfig.getTaskNotifyTemplateId()); config.put("taskDetailPage", wechatConfig.getTaskDetailPage()); return success(config); } /** * 匿名接口:根据任务ID手动触发一次任务微信通知 * 方便通过Postman调试,前提是任务已有执行人/创建人并绑定了openId */ @Anonymous @PostMapping("/task/notify") public AjaxResult notifyTaskByWechat(@RequestParam("taskId") Long taskId) { if (taskId == null) { return error("任务ID不能为空"); } SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId); if (task == null) { return error("任务不存在"); } // 简化:给任务创建人发一条(如果绑定了openId),方便快速验证模板和跳转 if (task.getCreatorId() == null) { return error("任务未指定创建人"); } SysUser creator = sysUserMapper.selectUserById(task.getCreatorId()); if (creator == null || StringUtils.isEmpty(creator.getOpenId())) { return error("创建人未绑定微信openId"); } // 调用统一的微信通知服务 List userIds = new ArrayList<>(); userIds.add(task.getCreatorId()); int successCount = wechatTaskNotifyService.sendTaskNotifyMessage(taskId, userIds); if (successCount == 0) { return error("微信通知发送失败"); } return success("已触发微信通知,成功发送条数:" + successCount); } }