# 发送邀请 — 待确认参数清单 > 开发已按「默认口径」推进,下面这些值未最终确认,代码里全部做成配置项/占位符,等确认后回填即可,**不需要改代码结构**。 ## 一、短信(新增独立模板,不复用 SMS_512040098) | 项 | 当前值/占位 | 状态 | |---|---|---| | 短信模板 code | **待确认**(阿里云控制台新建「邀请」模板后填入) | 未确认 | | 模板占位符 | 建议 1 个:`${link}`(邀请链接) | 未确认 | | 短信正文参考 | `北京整合医学学会诚挚邀请您参加,请点击链接确认:${link}` | 待定稿 | | 签名 | 北京整合医学学会(复用 `ruoyi.sms.signName`) | 已确认 | | accessKeyId/Secret | 复用 `ruoyi.sms.accessKeyId` / `accessKeySecret` | 已确认 | > 落地:`application.yml` 新增 `ruoyi.sms.inviteTemplate: 待填`。 ## 二、邮件(参考 xxl-job EmailJobAlarm,走 spring-boot-starter-mail) | 项 | 当前值/占位 | 状态 | |---|---|---| | 发件账号 (from) | `contactus@bahim.org.cn`(原型稿) | 待确认 SMTP 账号 | | SMTP host | **待确认** | 未确认 | | SMTP port | **待确认**(465 SSL / 587 STARTTLS) | 未确认 | | SMTP 用户名/密码 | **待确认** | 未确认 | | 邮件主题 | `诚邀您参加"{会议名称}"项目` | 待定稿 | | 邮件正文 | 富文本邀请内容 + 邀请链接(点开即邀请函页) | 待定稿 | > 落地:`application.yml` 新增 `spring.mail.*`;`pom.xml` 新增 `spring-boot-starter-mail`(**需重新 mvn install**)。 ## 三、邀请链接 baseUrl | 项 | 生产 | 测试 | |---|---|---| | 域名 | 待确认(参考 esignBaseUrl prod=`https://hegui.bahim.org.cn`) | `https://risingdoctor.com/hg` | > 落地:`application.yml` 新增 `ruoyi.invite.baseUrl`,公开链接 = `{baseUrl}/#/invite/{token}`。 ## 四、数据库(2 张新表 + biz_expert 补列) > 库结构手工维护,未生成 .sql。**建表前需按下方清单核对,确认字段名/类型后执行**。 ### biz_invite(批次/邀请函主表) `id, project_no, meeting_name, period_no, meeting_time(datetime), send_time(datetime), content(longtext), redhead_file_url(varchar), send_channel(varchar), create_by, create_time` ### biz_invite_recipient(收件人明细) `id, invite_id, name, phone, email, source(char1), remark(char1), send_status(char1), fail_reason, confirm_status(char1), confirmed_at(datetime), token(varchar36), create_time` ### biz_expert 补列 `email varchar` — **待确认**是否新增(邮件渠道前置依赖)。 ## 五、业务口径(已按默认实现,可回改) | 决策 | 默认口径 | |---|---| | 确认是否可逆 | 不可逆(已确认→不可取消) | | 备注语义 | `1`=发 / 空=不发(原型「备注空默认已确认」判为 demo 示意) | | 未发专家 | 详情仍列出,发送状态标「未发送」 | | 确认与参会人表 | v1 不联动 biz_meeting_attendee | ## 六、代码落地对照(已开发,待你确认参数后回填) ### 后端(新增/改动文件) | 文件 | 说明 | |---|---| | `domain/BizInvite.java` | 主表对象(含聚合列 recipientCount/confirmedCount、暂存 recipients) | | `domain/BizInviteRecipient.java` | 收件人明细对象 | | `mapper/BizInviteMapper.java` + `.xml` | 主表 CRUD + 列表聚合 + 回填 send_time | | `mapper/BizInviteRecipientMapper.java` + `.xml` | 明细 CRUD + insertBatch + updateConfirmByToken + updateSendStatus | | `service/IBizInviteService.java` + `impl/BizInviteServiceImpl.java` | create(含 token 生成)/send/confirm/delete | | `controller/BizInviteController.java` | manager 端点 `/business/invite/*` | | `controller/BizPublicController.java` | 公开端点 `/business/public/invite/{token}` + `/{token}/confirm`(已加 inviteService) | | `mail/InviteMailSender.java` | 邮件发送(spring-boot-starter-mail,JavaMailSender 未配置时降级返回 false) | | `sms/AliyunSmsSender.java` | 已加 `sendInvite(phone, link)` + `inviteLink(token)` + `inviteTemplate` 字段 | | `ruoyi-business/pom.xml` | 已加 `spring-boot-starter-mail`(**需重新 mvn install**) | ### 配置落点 | 配置项 | 文件 | 当前值 | |---|---|---| | `ruoyi.sms.inviteTemplate` | application.yml | `待填`(阿里云新建模板后回填) | | `ruoyi.invite.baseUrl` | application.yml / -prod / -test | prod=`https://hegui.bahim.org.cn`,test=`https://risingdoctor.com/hg` | | `spring.mail.*` | application.yml | host=`待确认`、port=`465`、username=`contactus@bahim.org.cn`、password=`待确认` | ### 前端(新增/改动文件) | 文件 | 说明 | |---|---| | `api/business/invite.js` | manager + 公开 API | | `views/manager/InviteList.vue` | 列表页(新建/详情/发送/删除) | | `views/manager/InviteNew.vue` | 新建页(手输字段 + RichEditor + 专家库选择 + 批量导入) | | `views/manager/InviteDetail.vue` | 详情页(含收件人发送/确认状态) | | `views/portal/InviteView.vue` | 公开邀请页(富文本 + 底部确认按钮) | | `router/index.js` | 加 `invite/:token`(公开)+ `invites*`(manager) | | `layout/AdminLayout.vue` | manager 菜单加「发送邀请」(icon Promotion) | ### 上线前待办(对应上面的待确认项) 1. 阿里云新建「邀请」短信模板 → 回填 `ruoyi.sms.inviteTemplate`。 2. 确认 SMTP host/port/账号密码 → 回填 `spring.mail.*`。 3. 确认生产邀请链接域名 `ruoyi.invite.baseUrl`。 4. 建 2 张表 `biz_invite` / `biz_invite_recipient`(手工库,无 .sql,字段见第四节)。 5. `biz_expert.email` 是否补列(邮件渠道前置依赖,否则邮件渠道需手工填邮箱)。 6. `mvn install`(新增 spring-boot-starter-mail 依赖后)。