feat(iit-manager): Add WeChat Official Account integration for patient notifications

Features:
- PatientWechatCallbackController for URL verification and message handling
- PatientWechatService for template and customer messages
- Support for secure mode (message encryption/decryption)
- Simplified route /wechat/patient/callback for WeChat config
- Event handlers for subscribe/unsubscribe/text messages
- Template message for visit reminders

Technical details:
- Reuse @wecom/crypto for encryption (compatible with Official Account)
- Relaxed Fastify schema validation to prevent early request blocking
- Access token caching (7000s with 5min pre-refresh)
- Comprehensive logging for debugging

Testing: Local URL verification passed, ready for SAE deployment

Status: Code complete, waiting for WeChat platform configuration
This commit is contained in:
2026-01-04 22:53:42 +08:00
parent dfc472810b
commit b31255031e
167 changed files with 3055 additions and 2 deletions

View File

@@ -601,3 +601,4 @@ async saveProcessedData(recordId, newData) {

View File

@@ -788,3 +788,4 @@ export const AsyncProgressBar: React.FC<AsyncProgressBarProps> = ({

View File

@@ -1279,5 +1279,6 @@ interface FulltextScreeningResult {

View File

@@ -393,5 +393,6 @@ GET /api/v1/asl/fulltext-screening/tasks/:taskId/export

View File

@@ -495,5 +495,6 @@ Failed to open file '\\tmp\\extraction_service\\temp_10000_test.pdf'

View File

@@ -561,5 +561,6 @@ df['creatinine'] = pd.to_numeric(df['creatinine'], errors='coerce')

View File

@@ -976,5 +976,6 @@ export const aiController = new AIController();

View File

@@ -1310,5 +1310,6 @@ npm install react-markdown

View File

@@ -218,5 +218,6 @@ FMA___基线 | FMA___1个月 | FMA___2个月

View File

@@ -376,5 +376,6 @@ formula = "FMA总分0-100 / 100"

View File

@@ -210,5 +210,6 @@ async handleFillnaMice(request, reply) {

View File

@@ -182,5 +182,6 @@ method: 'mean' | 'median' | 'mode' | 'constant' | 'ffill' | 'bfill'

View File

@@ -633,5 +633,6 @@ import { logger } from '../../../../common/logging/index.js';

View File

@@ -436,5 +436,6 @@ import { ChatContainer } from '@/shared/components/Chat';

View File

@@ -346,5 +346,6 @@ const initialMessages = defaultMessages.length > 0 ? defaultMessages : [{

View File

@@ -634,5 +634,6 @@ http://localhost:5173/data-cleaning/tool-c

View File

@@ -422,5 +422,6 @@ Docs: docs/03-业务模块/DC-数据清洗整理/06-开发记录/DC模块重建

View File

@@ -295,5 +295,6 @@ ConflictDetectionService // 冲突检测(字段级对比)

View File

@@ -459,5 +459,6 @@ Tool B后端代码**100%复用**了平台通用能力层,无任何重复开发

View File

@@ -236,5 +236,6 @@ $ node scripts/check-dc-tables.mjs

View File

@@ -469,5 +469,6 @@ ${fields.map((f, i) => `${i + 1}. ${f.name}${f.desc}`).join('\n')}

View File

@@ -676,3 +676,4 @@ private async processMessageAsync(xmlData: any) {
**版本历史**:
- v1.0 (2026-01-04): 初始版本Phase 1.5完成

View File

@@ -1070,3 +1070,4 @@ async function testIntegration() {

View File

@@ -211,3 +211,4 @@ Content-Type: application/json

View File

@@ -631,3 +631,4 @@ REDCap API: exportRecords success { recordCount: 1 }
**✅ 测试状态**: 全部通过
**✅ 部署状态**: 已部署到开发环境

View File

@@ -637,3 +637,4 @@ backend/src/modules/iit-manager/

View File

@@ -787,3 +787,4 @@ CREATE TABLE iit_schema.wechat_tokens (

View File

@@ -544,3 +544,4 @@ Day 3 的开发工作虽然遇到了多个技术问题,但最终成功完成

View File

@@ -311,3 +311,4 @@ AI: "出生日期2017-01-04
**下一步**: Phase 2 - Function Calling + Dify知识库

View File

@@ -255,3 +255,4 @@ Day 4: REDCap EMWebhook推送← 作为增强,而非核心

View File

@@ -669,3 +669,4 @@ const answer = `根据研究方案[1]和CRF表格[2],纳入标准包括:
**版本历史**:
- v1.0 (2026-01-04): 初始版本Phase 1.5完成后整理

View File

@@ -759,3 +759,4 @@ docker exec redcap-apache php /tmp/create-redcap-password.php

View File

@@ -141,3 +141,4 @@ AIclinicalresearch/redcap-docker-dev/

View File

@@ -876,5 +876,6 @@ ACR镜像仓库

View File

@@ -1365,3 +1365,4 @@ SAE应用配置:

View File

@@ -1181,3 +1181,4 @@ docker exec -e PGPASSWORD="密码" ai-clinical-postgres psql -h RDS地址 -U air

View File

@@ -592,3 +592,4 @@ scripts/*.ts

View File

@@ -280,3 +280,4 @@ Node.js后端部署成功后

View File

@@ -503,3 +503,4 @@ Node.js后端 (SAE) ← http://172.17.173.88:3001

View File

@@ -218,3 +218,4 @@ curl http://localhost:3001/health

View File

@@ -256,3 +256,4 @@ npm run dev

View File

@@ -480,3 +480,4 @@ pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432

View File

@@ -1808,3 +1808,4 @@ curl http://8.140.53.236/

View File

@@ -356,3 +356,4 @@ crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-se

View File

@@ -678,3 +678,4 @@ docker login --username=gofeng117@163.com \

View File

@@ -487,5 +487,6 @@ NAT网关成本¥100/月,对初创团队是一笔开销

View File

@@ -392,5 +392,6 @@ curl http://你的SAE地址:3001/health

View File

@@ -724,5 +724,6 @@ const job = await queue.getJob(jobId);

View File

@@ -491,5 +491,6 @@ processLiteraturesInBackground(task.id, projectId, testLiteratures);

View File

@@ -968,5 +968,6 @@ ROI = (¥22,556 - ¥144) / ¥144 × 100% = 15,564%

View File

@@ -1025,5 +1025,6 @@ Redis 实例¥500/月

View File

@@ -483,5 +483,6 @@ import { ChatContainer } from '@/shared/components/Chat';

View File

@@ -925,3 +925,4 @@ CREATE INDEX idx_rvw_tasks_created_at ON rvw_schema.review_tasks(created_at);