feat(iit-manager): Day 3 企业微信集成开发完成

- 新增WechatService(企业微信推送服务,支持文本/卡片/Markdown消息)
- 新增WechatCallbackController(异步回复模式,5秒内响应)
- 完善iit_quality_check Worker(调用WechatService推送通知)
- 新增企业微信回调路由(GET验证+POST接收消息)
- 实现LLM意图识别(query_weekly_summary/query_patient_info等)
- 安装依赖:@wecom/crypto, xml2js
- 更新开发记录文档和MVP开发计划

技术要点:
- 使用异步回复模式规避企业微信5秒超时限制
- 使用@wecom/crypto官方库处理XML加解密
- 使用setImmediate实现后台异步处理
- 支持主动推送消息返回LLM处理结果
- 完善审计日志记录(WECHAT_NOTIFICATION_SENT/WECHAT_INTERACTION)

相关文档:
- docs/03-业务模块/IIT Manager Agent/06-开发记录/Day3-企业微信集成开发完成记录.md
- docs/03-业务模块/IIT Manager Agent/04-开发计划/最小MVP闭环开发计划.md
- docs/03-业务模块/IIT Manager Agent/00-模块当前状态与开发指南.md
This commit is contained in:
2026-01-03 09:39:39 +08:00
parent 36ce1bbcb2
commit 5f089516cb
144 changed files with 144 additions and 0 deletions

View File

@@ -28,3 +28,4 @@ Status: Day 1 complete (11/11 tasks), ready for Day 2

View File

@@ -256,5 +256,6 @@

View File

@@ -51,5 +51,6 @@ WHERE table_schema = 'dc_schema'

View File

@@ -89,5 +89,6 @@ ORDER BY ordinal_position;

View File

@@ -102,5 +102,6 @@ runMigration()

View File

@@ -36,5 +36,6 @@ COMMENT ON COLUMN "dc_schema"."dc_tool_c_sessions"."column_mapping" IS '列名

View File

@@ -63,5 +63,6 @@ COMMENT ON COLUMN dc_schema.dc_tool_c_sessions.expires_at IS '过期时间(创

View File

@@ -105,3 +105,4 @@ Write-Host ""

View File

@@ -213,5 +213,6 @@ function extractCodeBlocks(obj, blocks = []) {

View File

@@ -232,5 +232,6 @@ checkDCTables();

View File

@@ -184,5 +184,6 @@ createAiHistoryTable()

View File

@@ -171,5 +171,6 @@ createToolCTable()

View File

@@ -168,5 +168,6 @@ createToolCTable()

View File

@@ -300,5 +300,6 @@ export function getBatchItems<T>(

View File

@@ -336,5 +336,6 @@ runTests().catch((error) => {

View File

@@ -315,5 +315,6 @@ Content-Type: application/json

View File

@@ -251,5 +251,6 @@ export const conflictDetectionService = new ConflictDetectionService();

View File

@@ -201,5 +201,6 @@ curl -X POST http://localhost:3000/api/v1/dc/tool-c/test/execute \

View File

@@ -255,5 +255,6 @@ export const streamAIController = new StreamAIController();

View File

@@ -152,3 +152,4 @@ testIitDatabase()

View File

@@ -222,3 +222,4 @@ export interface CachedProtocolRules {

View File

@@ -401,5 +401,6 @@ SET session_replication_role = 'origin';

View File

@@ -103,5 +103,6 @@ WHERE key = 'verify_test';

View File

@@ -246,5 +246,6 @@ verifyDatabase()

View File

@@ -36,5 +36,6 @@ export {}

View File

@@ -59,5 +59,6 @@ Write-Host "✅ 完成!" -ForegroundColor Green

View File

@@ -346,5 +346,6 @@ runAdvancedTests().catch(error => {

View File

@@ -412,5 +412,6 @@ runAllTests()

View File

@@ -370,5 +370,6 @@ runAllTests()

View File

@@ -154,5 +154,6 @@ Set-Location ..

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1067,3 +1067,4 @@ async function testIntegration() {
**这是IIT Manager Agent的技术基石文档请妥善保管** ⭐⭐⭐⭐⭐

View File

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

View File

@@ -634,3 +634,4 @@ backend/src/modules/iit-manager/
**最后更新**: 2026-01-02
**状态**: ✅ Day 2 开发完成

View File

@@ -541,3 +541,4 @@ Day 3 的开发工作虽然遇到了多个技术问题,但最终成功完成
**文档版本**v1.0
**最后更新**2026-01-02 23:55:00

View File

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

View File

@@ -756,3 +756,4 @@ docker exec redcap-apache php /tmp/create-redcap-password.php
**有问题?** 查看 [13-部署问题排查手册.md](./13-部署问题排查手册.md) 或提Issue

View File

@@ -138,3 +138,4 @@ AIclinicalresearch/redcap-docker-dev/
**准备好开始了吗?** 👉 [开始部署](./01-部署与配置/10-REDCap_Docker部署操作手册.md)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -57,3 +57,4 @@ models/

View File

@@ -43,5 +43,6 @@ __version__ = '1.0.0'

View File

@@ -176,5 +176,6 @@ def get_missing_summary(df: pd.DataFrame) -> dict:

View File

@@ -136,5 +136,6 @@ def apply_filter(

View File

@@ -302,3 +302,4 @@ def get_unpivot_preview(

Some files were not shown because too many files have changed in this diff Show More