Files
AIclinicalresearch/docs/03-业务模块/IIT Manager Agent/06-开发记录/Day3-企业微信集成开发完成记录.md
HaHafeng 1b53ab9d52 feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
2026-01-14 19:15:01 +08:00

564 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Day 3 - 隡<><E99AA1>敺桐縑<E6A190><E7B891><EFBFBD><EFBFBD><E69298><EFBFBD><E7A983>鞱扇敶?
**撘<><E69298>烐𠯫<E78390>?*嚗?026-01-02
**撘<><E69298>𤏸<EFBFBD>?*嚗鋫I + <20><EFBFBD><E586BD><EFBFBD>
**<EFBFBD><EFBFBD>𧋦**嚗鯝1.3
**<EFBFBD><EFBFBD>?*嚗尠<E59A97><><E99AA1>敺桐縑URL撉諹<E69289><E8ABB9>𣂼<EFBFBD><EFBFBD>抅蝖<E68A85><E89D96><EFBFBD><EFBFBD>摰峕<E691B0>
---
## <20><><><E69298><EFBFBD>閫?
### <20><EFBFBD>
摰䂿緵隡<EFBFBD><EFBFBD>敺桐縑<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>舀綫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗䔶蛹 IIT Manager Agent 撱箇<E692B1>銝?PI <20><><EFBFBD><EFBFBD>𡁏<EFBFBD><F0A1818F><EFBFBD>?
### <20><EFBFBD>
- <20>?隡<><E99AA1>敺桐縑瘨<E7B891><E798A8><EFBFBD><EFBFBD><E588B8><EFBFBD><EFBFBD><EFBFBD>WechatService嚗?
- <20>?隡<><E99AA1>敺桐縑<E6A190><EFBFBD><EFBFBD><E686AD>嚗ÁechatCallbackController嚗?
- <20>?URL撉諹<E69289>瘚贝<E7989A><E8B49D><EFBFBD>
- <20>?摰<><E691B0>韐冽綉Worker嚗峕𣈲<E5B395><F0A388B2><EFBFBD>銝𡁜凝靽⊥綫<E28AA5>?
- <20>?natapp<70><70><EFBFBD>蝛輸<E89D9B><EFBFBD>蝵格<E89DB5><E6A0BC>?
### 餈𥕦漲
-<E79285><E288AA><EFBFBD>摰峕<E691B0>摨佗<E691A8>**35% <20>?50%**
-<><E99AA1>敺桐縑<E6A190><E7B891><EFBFBD>嚗?*0% <20>?80%**嚗㇎RL撉諹<E69289>摰峕<E691B0><EFBFBD><E59A97>蝡臬<E89DA1>蝡舀<E89DA1>霂𤏪<E99C82>
---
## <20><>儭?<3F><EFBFBD>霈曇恣
### <20><EFBFBD><EFBFBD>
```
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<EFBFBD>? 隡<><E99AA1>敺桐縑<E6A190><E7B891><EFBFBD><EFBFBD><EFBFBD> <20>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<EFBFBD>? <20>?
<EFBFBD>? REDCap DET <20><><EFBFBD><EFBFBD><EFBFBD>? WebhookController <20><><EFBFBD><EFBFBD><EFBFBD>? JobQueue <20>?
<EFBFBD>? <20>? <20>? <20>?
<EFBFBD>? Audit Logs iit_quality_check <20>?
<EFBFBD>? Worker <20>?
<EFBFBD>? <20>? <20>?
<EFBFBD>? WechatService <20>?
<EFBFBD>? <20>? <20>?
<EFBFBD>? 隡<><E99AA1>敺桐縑 API <20>?
<EFBFBD>? <20>? <20>?
<EFBFBD>? PI <20>𧢲㦤 <20>?
<EFBFBD>? <20>?
<EFBFBD>? 隡<><E99AA1>敺桐縑瘨<E7B891><E798A8> <20><><EFBFBD><EFBFBD><EFBFBD>? WechatCallbackController <20><><EFBFBD><EFBFBD><EFBFBD>? AI憭<49><E686AD> <20>?
<EFBFBD>? <20>? <20>?
<EFBFBD>? WechatService <20><><EFBFBD><EFBFBD><EFBFBD>? 銝餃𢆡<E9A483><EFBFBD><E588B8><EFBFBD>憭? <20>?
<EFBFBD>? <20>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
```
### <20><><EFBFBD><EFBFBD><EFBFBD>
| 蝏<>辣 | <20><><EFBFBD>舀䲮獢?| <20><EFBFBD> |
|------|----------|------|
| 瘨<><E798A8><EFBFBD>㰘圾撖?| @wecom/crypto | 隡<><E99AA1>敺桐縑摰䀹䲮<E480B9><EFBFBD>摨?|
| XML閫<4C><E996AB> | xml2js | <20><EFBFBD>蝔喳<E89D94><E596B3><EFBFBD>ML閫<4C><E996AB>摨?|
| <20><><EFBFBD>蝛輸<E89D9B>?| natapp | <20>砍𧑐撘<F0A79190><E69298>𤏸<EFBFBD>霂?|
| 撘<>郊憭<E9838A><E686AD> | setImmediate | 閫<><E996AB>5蝘坿<E89D98><E59DBF><EFBFBD><E59C92>?|
---
## <20>凃 隞<><E99A9E>摰䂿緵
### 1. WechatService.ts嚗<73><E59A97>銝𡁜凝靽⊥綫<E28AA5><E7B6AB><EFBFBD><EFBFBD><EFBFBD>
**<EFBFBD><EFBFBD>辣頝臬<EFBFBD>**嚗䫤backend/src/modules/iit-manager/services/WechatService.ts`
**隞<><E99A9E>銵峕㺭**嚗?14銵?
**<2A><EFBFBD><E8A9A8><EFBFBD>**嚗?
```typescript
class WechatService {
// 1. Access Token 蝞∠<E89D9E><EFBFBD><E59A97>摮?+ <20>芸𢆡<E88AB8>瑟鰵嚗?
async getAccessToken(): Promise<string>
// 2. <20><EFBFBD><E785BE><EFBFBD><EFBFBD><EFBFBD><E7A586>?
async sendTextMessage(userId: string, content: string): Promise<void>
// 3. <20><EFBFBD>?Markdown 瘨<><E798A8>
async sendMarkdownMessage(userId: string, content: string): Promise<void>
// 4. 摰∟恣<E2889F><EFBFBD>霈啣<E99C88>
private async recordAuditLog(data): Promise<void>
}
```
**<2A><><EFBFBD>臭漁<E887AD>?*嚗?
- <20>?Access Token 蝻枏<E89DBB><E69E8F><EFBFBD>嚗?200蝘𡜐<E89D98><F0A19C90>𣂼<EFBFBD>5<EFBFBD><35><EFBFBD><EFBFBD>瑟鰵嚗?
- <20>?摰峕㟲<E5B395><E39FB2><EFBFBD>霂臬<E99C82><E887AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBA9><EFBFBD>
- <20>?霂衣<E99C82><E8A1A3><EFBFBD>𠯫敹𡑒扇敶𤏪<E695B6>corpId<49><64>gentId蝑㚁<E89D91>
- <20>?摰∟恣<E2889F><EFBFBD><E4BA99>芸𢆡霈啣<E99C88>
**<2A><EFBFBD><E887AC><EFBFBD>**嚗?
```env
WECHAT_CORP_ID=ww6ab493470ab4f377
WECHAT_AGENT_ID=1000002
WECHAT_CORP_SECRET=AZIVxMtoLb0rEszXS81e4dBRl-I9kgTjygIS0cFfENU
```
---
### 2. WechatCallbackController.ts嚗<73><E59A97>銝𡁜凝靽<E99DBD><EFBFBD><E99D9A><EFBFBD><EFBFBD><EFBFBD>
**<2A><>辣頝臬<E9A09D>**嚗䫤backend/src/modules/iit-manager/controllers/WechatCallbackController.ts`
**隞<><E99A9E>銵峕㺭**嚗?01銵?
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?
```typescript
class WechatCallbackController {
// 1. URL 撉諹<E69289>嚗𠃑ET 霂瑟<E99C82>嚗?
async handleVerification(request, reply): Promise<void>
// 2. 瘨<><E798A8><EFBFBD>交𤣰嚗㇊OST 霂瑟<E99C82> + 撘<>郊憭<E9838A><E686AD>嚗?
async handleCallback(request, reply): Promise<void>
// 3. 撘<>郊瘨<E9838A><E798A8><EFBFBD><E686AD>
private async processMessageAsync(...): Promise<void>
// 4. <20><EFBFBD><EFBFBD><E798A8><EFBFBD><E686AD><EFBFBD><E59A97><EFBFBD><EFBFBD><E6A0AA><EFBFBD> + 銝𡁜𦛚<F0A1819C><EFBFBD>嚗?
private async processUserMessage(message): Promise<void>
// 5. 蝑曉<E89D91>撉諹<E69289>
private verifySignature(...): boolean
}
```
**<EFBFBD><EFBFBD><EFBFBD>臭漁<EFBFBD>?*嚗?
- <20>?**撘<><EFBFBD>𧼮<EFBFBD><E79285>**嚗𡁶<E59A97><F0A181B6><EFBFBD><E594BE>裇"success"`嚗<><E59A97><EFBFBD><EFBFBD>甇亙<E79487><E4BA99><EFBFBD><EFBFBD><EFBFBD><E996AB>5蝘坿<E89D98><E59DBF><EFBFBD>
- <20>?**瘨<><E798A8><EFBFBD><E996AB>**嚗帋蝙<E5B88B>?`@wecom/crypto` <20>?`decrypt(encodingAESKey, encrypt)` <20>賣㺭
- <20>?**蝑曉<E89D91>撉諹<E69289>**嚗帋蝙<E5B88B>?`@wecom/crypto` <20>?`getSignature(token, timestamp, nonce, data)` <20>賣㺭
- <20>?**<2A>誩㦛霂<E3A69B><E99C82>**嚗𡁏𣈲<F0A1818F>?瘙<><E79899>?<3F>?撣桀𨭌"<22>?<3F><EFBFBD><E594B3>?蝑匧<E89D91><E58CA7><EFBFBD>
- <20>?**銝餃𢆡<E9A483><EFBFBD>?*嚗𡁜<E59A97><F0A1819C><EFBFBD><EFBFBD><EFBFBD>𣂼<EFBFBD>銝餃𢆡靚<F0A286A1>鍂 WechatService <20><EFBFBD><E588B8><EFBFBD>憭?
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?
```env
WECHAT_TOKEN=oXlRBm1YnvMy2SbDLbvAdDd5Gq3oBGq
WECHAT_ENCODING_AES_KEY=v88eT3O9bMW897h4btr7v7qvQImlMf31edTQCmuhOhO
```
---
### 3. 頝舐眏<E88890>滨蔭嚗ǐoutes/index.ts嚗?
**<EFBFBD><EFBFBD>頝舐眏**嚗?
```typescript
// GET: URL撉諹<E69289><EFBFBD><E59A97>銝𡁜凝靽⊿<E99DBD>蝵桀<E89DB5><EFBFBD>RL<52>嗡蝙<E597A1><EFBFBD>
fastify.get('/api/v1/iit/wechat/callback',
wechatCallbackController.handleVerification.bind(wechatCallbackController)
);
// POST: <20>交𤣰隡<F0A4A3B0><E99AA1>敺桐縑瘨<E7B891><E798A8>
fastify.post('/api/v1/iit/wechat/callback',
wechatCallbackController.handleCallback.bind(wechatCallbackController)
);
```
---
### 4. 摰<><E691B0>韐冽綉Worker嚗ǎndex.ts嚗?
**<EFBFBD><EFBFBD>辣頝臬<EFBFBD>**嚗䫤backend/src/modules/iit-manager/index.ts`
**<2A><EFBFBD><E595A3><EFBFBD>**嚗朞捶<E69C9E><EFBFBD><E689B9>𣂼<EFBFBD><F0A382BC>芸𢆡<E88AB8><EFBFBD><E588B8><EFBFBD>銝𡁜凝靽⊿<E99DBD>𡁶䰻
**隞<><E99A9E><EFBFBD><EFBFBD>**嚗?
```typescript
jobQueue.process('iit_quality_check', async (job) => {
// 1. <20><EFBFBD>憿寧𤌍<E5AFA7>滨蔭
const project = await prisma.$queryRaw`...`;
const piUserId = project.notification_config.wechat_user_id;
// 2. <20><EFBFBD>韐冽綉璉<E7B689><E79289>?
const qualityCheckResult = await performSimpleQualityCheck(...);
// 3. <20><>遣隡<E981A3><E99AA1>敺桐縑<E6A190>𡁶䰻瘨<E4B0BB><E798A8>
const message = buildWechatNotification(...);
// 4. <20><EFBFBD><E588B8><EFBFBD><EFBFBD><E99AA1>敺桐縑
await wechatService.sendTextMessage(piUserId, message);
});
```
**<2A>𡁶䰻瘨<E4B0BB><E798A8><EFBFBD><EFBFBD>**嚗?
```
<EFBFBD><EFBFBD> IIT Manager <20>唳旿敶訫<E695B6><E8A8AB>𡁶䰻
憿寧𤌍嚗魩est0102
霈啣<EFBFBD>ID嚗鯴xx
銵典<EFBFBD>嚗鯴xx
<EFBFBD>園𡢿嚗?026-01-02 23:55:00
<EFBFBD>働 韐冽綉撱箄悅 (3憿?嚗?
1. <20>?<3F>唳旿敶訫<E695B6><E8A8AB>𦠜𧒄嚗?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2. <20>?霈啣<E99C88>ID<49><EFBFBD>
3. <20>?銵典<E98AB5>嚗飱emographics
<EFBFBD>?<3F>唳旿韐券<E99F90><E588B8>臬末嚗峕<E59A97><E5B395>擧遬<E693A7><EFBFBD>
<EFBFBD>俥 憒<><E68692><EFBFBD>煾䔮嚗諹窈<E8ABB9>𧼮<EFBFBD>"撣桀𨭌"<22><EFBFBD><E4BAA6><EFBFBD><E6B8B8><EFBFBD>
```
---
## <20>圲 撘<><E69298>𤏸<EFBFBD>蝔衤<E89D94><E8A1A4><EFBFBD><EFBFBD><E996AB>
### <20><EFBFBD>1嚗𡁶㴓憓<E3B493><E68693><EFBFBD><EFBFBD>蝘唬<E89D98><EFBFBD><E98A9D>?<3F>𩤃<EFBFBD>
**<2A>啗情**嚗?
```
hasSecret: false
Error: 隡<><E99AA1>敺桐縑<E6A190>滨蔭銝滚<E98A9D><E6BB9A><EFBFBD>霂瑟<E99C82><E7919F>亦㴓憓<E3B493><E68693><EFBFBD>?
```
**<2A><EFBFBD>**嚗?
- <20><EFBFBD><E887AC><EFBFBD>嚗䫤WECHAT_CORP_SECRET`
-<><E99A9E>霂餃<E99C82>嚗䫤WECHAT_AGENT_SECRET`
**閫<><E996AB><EFBFBD><EFBFBD>**嚗?
```typescript
// 靽格㺿<E6A0BC>?
agentSecret: process.env.WECHAT_AGENT_SECRET
// 靽格㺿<E6A0BC>?
agentSecret: process.env.WECHAT_CORP_SECRET
```
---
### <20><EFBFBD>2嚗鋣wecom/crypto 撖澆<E69296><E6BE86><EFBFBD><E5ADB5>躰秤 <20>?
**<EFBFBD>啗情**嚗?
```
TypeError: WXBizMsgCrypt is not a constructor
```
**<EFBFBD><EFBFBD>**嚗?
`@wecom/crypto` 銝齿糓銝<E7B393>銝芰掩嚗諹<E59A97>峕糓撖澆枂鈭?銝芰𡠺蝡讠<E89DA1><E8AEA0>賣㺭嚗?
```javascript
{
decrypt: [Function: decrypt],
encrypt: [Function: encrypt],
getJsApiSignature: [Function: getJsApiSignature],
getSignature: [Function: getSignature]
}
```
**閫<><E996AB><EFBFBD><EFBFBD>**嚗?
```typescript
// 靽格㺿<E6A0BC><EFBFBD><E3B5AA>躰秤嚗?
import WXBizMsgCrypt from '@wecom/crypto';
this.wxcrypt = new WXBizMsgCrypt(token, aesKey, corpId);
// 靽格㺿<E6A0BC>𠬍<EFBFBD><EFBFBD>嚗?
const require = createRequire(import.meta.url);
const { decrypt, encrypt, getSignature } = require('@wecom/crypto');
```
---
### <20><EFBFBD>3嚗飱ecrypt <20>賣㺭<E8B3A3><E3BAAD><EFBFBD>躰秤 <20>?
**<EFBFBD>啗情**嚗?
```
Error: invalid encodingAESKey
```
**<EFBFBD><EFBFBD>**嚗?
<EFBFBD><EFBFBD>瘚贝<EFBFBD><EFBFBD>𡁏𧋦<EFBFBD>𤑳緵嚗䈣decrypt` <20>賣㺭<E8B3A3><EFBFBD>閬?**2銝芸<E98A9D><E88AB8>?*嚗?
```javascript
function decrypt(encodingAESKey, encrypt) { ... }
```
**閫<><E996AB><EFBFBD><EFBFBD>**嚗?
```typescript
// 靽格㺿<E6A0BC><EFBFBD><E3B5AA>躰秤 - 4銝芸<E98A9D><E88AB8><EFBFBD>
const result = decrypt(this.token, this.encodingAESKey, this.corpId, echostr);
// 靽格㺿<E6A0BC>𠬍<EFBFBD><EFBFBD> - 2銝芸<E98A9D><E88AB8><EFBFBD>
const result = decrypt(this.encodingAESKey, echostr);
```
---
### <20><EFBFBD>4嚗関oken摮㛖泵霂<E6B3B5><E99C82><EFBFBD>躰秤 <20>𩤃<EFBFBD>
**<2A>啗情**嚗?
```
<EFBFBD>𩤃<EFBFBD> 蝑曉<E89D91>撉諹<E69289>憭梯揖
expected: 0b7cf05d6cb23ab9ce2efca6fdc659f32051eabe
calculated: 6f79cabd3e9eea5eb10f55abdcf087ce6393d51d
```
**<2A><EFBFBD>**嚗?
Token<EFBFBD><EFBFBD>洵3銝芸<EFBFBD>蝚血捆<EFBFBD>𤘪毽瘛<EFBFBD><EFBFBD>
- `oX1R...`嚗<>㺭摮?嚗?
- `oXlR...`嚗<><E59A97><EFBFBD><EFBFBD>瘥徃嚗?
<EFBFBD>𡒊垢<EFBFBD><EFBFBD><EFBFBD>曄內<EFBFBD><EFBFBD>糓 `oXlR...`嚗<><E59A97><EFBFBD>耱嚗㚁<E59A97><E39A81><EFBFBD>霂訫極<E8A8AB>瑚葉<E7919A><EFBFBD>颲枏<E9A2B2><EFBFBD>㺭摮?<3F>?
**閫<><E996AB><EFBFBD><EFBFBD>**嚗?
- <20>湔𦻖隞?`.env` <20><>辣憭滚<E686AD>蝎䁅斐嚗屸<E59A97><E5B1B8>齿<EFBFBD><E9BDBF><EFBFBD><E588BB>?
- 蝖株恕 Token 銝綽<E98A9D>`oXlRBm1YnvMy2SbDLbvAdDd5Gq3oBGq`
---
### <20><EFBFBD>5嚗鍃ncodingAESKey <20>湔鰵 <20><>
**<2A>啗情**嚗?
<EFBFBD><EFBFBD> EncodingAESKey <20><EFBFBD><E888AA><EFBFBD><E6BE86>厰䔮憸睃紡<E79D83>渲圾撖<E59CBE>仃韐乓<E99F90>?
**閫<><E996AB><EFBFBD><EFBFBD>**嚗?
<EFBFBD><EFBFBD>銝𡁜凝靽∠恣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
```
<EFBFBD><EFBFBD><EFBFBD>zE4tcdBeekCHPUV015jCh9RVUydnCITINqSmCzg9xtO
<EFBFBD><EFBFBD><EFBFBD>v88eT3O9bMW897h4btr7v7qvQImlMf31edTQCmuhOhO嚗?3雿㵪<E99BBF><E3B5AA><EFBFBD><EFBFBD>嚗?
```
---
### <20><EFBFBD>6嚗䭰atapp <20><><EFBFBD>蝛輸<E89D9B><EFBFBD>蝵?<3F><>
**<2A><>瘙?*嚗?
<EFBFBD>砍𧑐撘<EFBFBD><EFBFBD>𤑳㴓憓<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝵?HTTPS URL <20><EFBFBD><EFBFBD><E99AA1>敺桐縑<E6A190><EFBFBD><E599BC>?
**閫<><E996AB><EFBFBD><EFBFBD>**嚗?
1. 雿輻鍂 natapp <20>滚𦛚
2. <20>滨蔭<E6BBA8><EFBFBD>嚗䫤http://iit.nat100.top` <20>?`127.0.0.1:3001`
3. natapp <20>芸𢆡<E88AB8>𣂷<EFBFBD> HTTPS <20><EFBFBD>
**撉諹<E69289>**嚗?
```bash
curl https://iit.nat100.top/api/v1/iit/health
# 餈𥪜<E9A488>嚗㝯"status":"ok","module":"iit-manager",...}
```
---
## <20>妒 瘚贝<E7989A>撉諹<E69289>
### 瘚贝<E7989A>1嚗帋<E59A97>銝𡁜凝靽<E99DBD><E288AA>𤏸<EFBFBD><F0A48FB8><EFBFBD>霂訫極<E8A8AB><EFBFBD>霂?<3F>?
**撌亙<E6928C>**嚗帋<E59A97>銝𡁜凝靽∠恣<E288A0><E681A3><EFBFBD><EFBFBD>?<3F>?撘<><E69298>𤏸<EFBFBD><F0A48FB8><EFBFBD>?<3F>?瘚贝<E7989A><E8B49D><EFBFBD><E79285>
**<EFBFBD>滨蔭**嚗?
```
URL: https://iit.nat100.top/api/v1/iit/wechat/callback
Token: oXlRBm1YnvMy2SbDLbvAdDd5Gq3oBGq
EncodingAESKey: v88eT3O9bMW897h4btr7v7qvQImlMf31edTQCmuhOhO
EchoStr: test12345678901234567890123
ToUserName: ww6ab493470ab4f377
```
**瘚贝<E7989A>蝏𤘪<E89D8F>**嚗?
```
<EFBFBD>?餈𥪜<E9A488><F0A5AA9C><EFBFBD><E59786><EFBFBD>request: <20>𣂼<EFBFBD>
<EFBFBD>?餈𥪜<E9A488>蝏𤘪<E89D8F>嚗?23456789012345678901 25嚗<35>圾撖<E59CBE><E69296><EFBFBD>?3雿滚<E99BBF>蝚佗<E89D9A>
<EFBFBD>?HTTP<54><EFBFBD><E59786><EFBFBD>嚗?00
```
**<EFBFBD>𡒊垢<EFBFBD><EFBFBD>**嚗?
```
<EFBFBD>𢬢 <20><EFBFBD><EFBFBD><E99AA1>敺桐縑 URL 撉諹<E69289>霂瑟<E99C82>
nonce: "95zbplrrko5"
echostrLength: 88
<EFBFBD>?URL 撉諹<E69289><E8ABB9>𣂼<EFBFBD>
decryptedLength: 23
statusCode: 200
```
---
### 瘚贝<E7989A>2嚗䭰atapp <20><EFBFBD>餈鮋<E9A488>𡁏<EFBFBD><EFBFBD>霂?<3F>?
**瘚贝<E7989A><E8B49D>賭誘**嚗?
```bash
curl https://iit.nat100.top/api/v1/iit/health
```
**餈𥪜<E9A488>蝏𤘪<E89D8F>**嚗?
```json
{
"status": "ok",
"module": "iit-manager",
"version": "1.1.0",
"timestamp": "2026-01-02T15:53:06.000Z"
}
```
---
## <20><> <20>滨蔭皜<E894AD><E79A9C>
### <20>𡒊垢<F0A1928A><EFBFBD><E887AC><EFBFBD>嚗Ê̄ackend/.env嚗?
```env
# ==========================================
# 隡<><E99AA1>敺桐縑<E6A190>滨蔭
# ==========================================
# 隡<><E99AA1>敺桐縑<E6A190><EFBFBD><E7AE87>滨蔭嚗<E894AD><E59A97><EFBFBD>其縑<E585B6><EFBFBD>
WECHAT_CORP_ID=ww6ab493470ab4f377
WECHAT_AGENT_ID=1000002
WECHAT_CORP_SECRET=AZIVxMtoLb0rEszXS81e4dBRl-I9kgTjygIS0cFfENU
# 隡<><E99AA1>敺桐縑<E6A190><EFBFBD><E599BC>滨蔭嚗<E894AD><E59A97><EFBFBD><EFBFBD><EFBFBD><E996AB>嚗?
WECHAT_TOKEN=oXlRBm1YnvMy2SbDLbvAdDd5Gq3oBGq
WECHAT_ENCODING_AES_KEY=v88eT3O9bMW897h4btr7v7qvQImlMf31edTQCmuhOhO
```
### 隡<><E99AA1>敺桐縑摨𠉛鍂<F0A0899B>滨蔭
**摨𠉛鍂靽⊥<E99DBD>**嚗?
-<><E99AA1>ID嚗䫤ww6ab493470ab4f377`
- 摨𠉛鍂<F0A0899B>滨妍嚗䫤IIT Manager Agent`
- AgentID嚗䫤1000002`
**<EFBFBD><EFBFBD>URL<EFBFBD>滨蔭**嚗<><E59A97><EFBFBD><E79487>靽嘥<E99DBD>嚗㚁<E59A97>
```
URL: https://iit.nat100.top/api/v1/iit/wechat/callback
Token: oXlRBm1YnvMy2SbDLbvAdDd5Gq3oBGq
EncodingAESKey: v88eT3O9bMW897h4btr7v7qvQImlMf31edTQCmuhOhO
```
**<EFBFBD>臭縑<EFBFBD><EFBFBD>**嚗?
```
iit.xunzhengyixue.com嚗𠄎AE<41>煺漣<E785BA><EFBFBD>嚗?
```
### natapp <20>滨蔭
```
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Online
<EFBFBD><EFBFBD>URL嚗冴ttp://iit.nat100.top
<EFBFBD>砍𧑐蝡臬藁嚗?27.0.0.1:3001
HTTPS嚗朞䌊<EFBFBD>冽𣈲<EFBFBD>?
```
---
## <20><><><E99A9E>蝏蠘恣
| <20><>辣 | 隞<><E99A9E>銵峕㺭 | 銝餉<E98A9D><E9A489><EFBFBD> |
|------|---------|---------|
| WechatService.ts | 314銵?| 隡<><E99AA1>敺桐縑瘨<E7B891><E798A8><EFBFBD><EFBFBD>?|
| WechatCallbackController.ts | 501銵?| 隡<><E99AA1>敺桐縑<E6A190><EFBFBD><EFBFBD><E686AD> |
| index.ts嚗<73><EFBFBD>劬orker嚗?| +80銵?| 韐冽綉摰峕<E691B0><E5B395>擧綫<E693A7><E7B6AB><EFBFBD>𡁶䰻 |
| routes/index.ts | +48銵?| 隡<><E99AA1>敺桐縑頝舐眏瘜典<E7989C> |
| **<EFBFBD>餉恣** | **~943銵?* | 隡<><E99AA1>敺桐縑<E6A190><E7B891><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E99A9E> |
---
## <20>?撌脣<E6928C><E884A3><EFBFBD><E99E9F><EFBFBD>
- [x]<><E99AA1>敺桐縑 Access Token 蝞∠<E89D9E><EFBFBD><E59A97>摮?<3F>瑟鰵嚗?
- [x] <20><EFBFBD><E785BE><EFBFBD><EFBFBD><EFBFBD><E7A586><EFBFBD><EFBFBD><E99AA1>敺桐縑
- [x] <20><EFBFBD>?Markdown 瘨<><E798A8><EFBFBD><EFBFBD>銝𡁜凝靽?
- [x]<><E99AA1>敺桐縑 URL 撉諹<E69289>嚗𠃑ET霂瑟<E99C82><EFBFBD><E686AD>嚗?
- [x]<><E99AA1>敺桐縑瘨<E7B891><E798A8><EFBFBD>交𤣰嚗㇊OST霂瑟<E99C82><EFBFBD><E686AD>嚗?
- [x]<><E798A8><EFBFBD><E996AB><EFBFBD><EFBFBD>?@wecom/crypto嚗?
- [x] 蝑曉<E89D91>撉諹<E69289><EFBFBD><EFBFBD>?@wecom/crypto嚗?
- [x]<><EFBFBD>𧼮<EFBFBD><E79285><EFBFBD><E59A97><EFBFBD>?蝘坿<E89D98><E59DBF><EFBFBD>
- [x] <20>喲睸霂齿<E99C82><E9BDBF><EFBFBD><E69B87><EFBFBD><EFBFBD><E79899><EFBFBD><E9A2AF><EFBFBD><EFBFBD><E68ABC><EFBFBD><E9B0B5><EFBFBD><EFBFBD><EFBFBD>
- [x] 韐冽綉Worker<65><EFBFBD><E588B8><EFBFBD>銝𡁜凝靽⊿<E99DBD>𡁶䰻
- [x] 摰∟恣<E2889F><EFBFBD>霈啣<E99C88>
- [x] natapp <20><><EFBFBD>蝛輸<E89D9B><EFBFBD>蝵?
---
## <20>?敺<><E695BA><EFBFBD><EFBFBD><E99E9F><EFBFBD>
- [ ] 靽嘥<E99DBD><EFBFBD><E79487><EFBFBD><EFBFBD><EFBFBD>銝𡁜凝靽<E99DBD><EFBFBD>RL<52>滨蔭
- [ ] <20>滨蔭<E6BBA8>唳旿摨㮖葉<E3AE96>?`wechat_user_id`嚗㇊I<EFBFBD><EFBFBD><EFBFBD>銝𡁜凝靽serID嚗?
- [ ] 蝡臬<E89DA1>蝡舀<E89DA1>霂𤏪<E99C82>REDCap <20>?隡<><EFBFBD><EFBFBD><E588B8><EFBFBD>
- [ ] LLM<4C>誩㦛霂<E3A69B><E99C82><EFBFBD><E59A97>蝥批<E89DA5><E689B9><EFBFBD><E6A0AA><EFBFBD>嚗?
- [ ] 撖寡<E69296><E5AFA1><EFBFBD><EFBFBD><E691B0><EFBFBD>凒憭帋<E686AD><E5B88B><E288AA><EFBFBD>
- [ ] IP<49><EFBFBD><E8B3A2><EFBFBD>蝵殷<E89DB5><E6AEB7>函蔡<E587BD>訕AE<41><EFBFBD>
---
## <20><> 銝衤<E98A9D>甇亥恣<E4BAA5>?
### Day 3 銝见<E98A9D>/<2F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1. **靽嘥<E99DBD><EFBFBD><E99AA1>敺桐縑甇<E7B891><E79487><EFBFBD>滨蔭**嚗?<3F><><EFBFBD>嚗?
- <20><EFBFBD>銝𡁜凝靽∠恣<E288A0><E681A3><EFBFBD><EFBFBD><EFBFBD>摮睃<E691AE><EFBFBD>RL<52>滨蔭
- <20><EFBFBD><EFBFBD><EFBFBD>𦻖<EFBFBD><EFBFBD><EFBFBD><E798A8>蝐餃<E89D90>
2. **<EFBFBD>滨蔭憿寧𤌍<EFBFBD>𡁶䰻**嚗?0<><30><EFBFBD>嚗?
- <20><EFBFBD> PI <20><><EFBFBD>銝𡁜凝靽?UserID
- <20>湔鰵<E6B994>唳旿摨?`projects` 銵函<E98AB5> `notification_config` 摮埈挾
3. **蝡臬<E89DA1>蝡舀<E89DA1>霂?*嚗?0<><30><EFBFBD>嚗?
- <20>?REDCap 銝剖<E98A9D><E58996><EFBFBD>霂閙㺭<E99699>?
- 撉諹<E69289><EFBFBD><E99AA1>敺桐縑<E6A190><EFBFBD>摰墧𧒄<E5A2A7>𡁶䰻
- 瘚贝<E7989A>撖寡<E69296><E5AFA1><EFBFBD><EFBFBD><E59A97><EFBFBD>?撣桀𨭌"<22>?瘙<><E79899>?蝑匧<E89D91><E58CA7><EFBFBD>嚗?
### Day 4嚗<34><E59A97>蝏凋<E89D8F><E5878B><EFBFBD>
1. **LLM<4C>誩㦛霂<E3A69B><E99C82>**
- <20><EFBFBD> DeepSeek <20><EFBFBD>隞?LLM
- 摰䂿緵<E482BF><E7B7B5><EFBFBD>?AI Agent 撖寡<E69296>
2. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**
- <20><EFBFBD>撖寡<E69296><E5AFA1>箸艶嚗<E889B6><EFBFBD>格䰻霂<E99C82><EFBCB5><EFBFBD><E99C88><E288AA><EFBFBD>
- <20>躰秤憭<E7A7A4><E686AD>隡睃<E99AA1>
- <20><EFBFBD><E689AF>烐綉
3. **<EFBFBD><EFBFBD>﹝蝻硋<EFBFBD>**
- 雿輻鍂<E8BCBB><EFBFBD>
- API <20><>
- <20>函蔡<E587BD><E894A1><EFBFBD>
---
## <20><> <20><><EFBFBD><EFBFBD><EFBFBD>獢?
- [<EFBFBD><EFBFBD>敺桐縑API<EFBFBD><EFBFBD>](https://developer.work.weixin.qq.com/document/path/90664)
- [隡<><E99AA1>敺桐縑瘨<E7B891><E798A8><EFBFBD>㰘圾撖<E59CBE><EFBFBD>筕(https://developer.work.weixin.qq.com/document/path/90968)
- [@wecom/crypto GitHub](https://github.com/wecomteam/crypto)
- [<5B><>撠𦬅VP<56>剔㴓撘<E3B493><E69298>𤏸恣<F0A48FB8>哋(../04-撘<><E69298>𤏸恣<F0A48FB8>?<3F><>撠𦬅VP<56>剔㴓撘<E3B493><E69298>𤏸恣<F0A48FB8>?md)
---
## <20><> <20><EFBFBD>
Day 3 <20><><EFBFBD><EFBFBD>穃極雿𡏭蒾<F0A18FAD><EFBFBD><E59C92><EFBFBD>憭帋葵<E5B88B><E891B5><EFBFBD>舫䔮憸矋<E686B8><EFBFBD><E99BBF><EFBFBD><E89D8F><EFBFBD><EFBFBD><E7AC94>𣂷<EFBFBD><EFBFBD><E99AA1>敺桐縑<E6A190><E7B891><EFBFBD><EFBFBD><EFBFBD>瓲敹<E793B2><E695B9><EFBFBD><EFBFBD><E8B3AC><EFBFBD><EFBFBD><EFBFBD><E99D9A>撌亙<E6928C><E4BA99><EFBFBD><EFBFBD><EFBFBD><E99C82><EFBFBD><E99C82><EFBFBD><E988AD>
1. <20>?**<2A><><EFBFBD>舀䲮獢<E4B2AE>虾銵?*嚗鋣wecom/crypto 摨𤘪迤撣詨極雿?
2. <20>?**<2A><EFBFBD>霈曇恣<E69B87><E681A3><EFBFBD>**嚗𡁜<E59A97>甇亙<E79487>憭齿芋撘𤩺<E69298><F0A4A9BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8BCAF>園䔮憸?
3. <20>?**隞<><E99A9E>韐券<E99F90><E588B8>臬末**嚗朞祕蝏<E7A595><E89D8F><EFBFBD><EFBFBD><E4BA99><EFBFBD>霂臬<E99C82><E887AC>?
4. <20>?**撘<><E69298><EFBFBD>蝔见<E89D94><E8A781>?*嚗𡁻䔮憸䀹<E686B8><E480B9><EFBFBD>瘚贝<E7989A>撉諹<E69289><E8ABB9><EFBFBD><EFBFBD>扇敶?
**頝萘氖摰峕㟲<E5B395>?MVP <20>剔㴓<E58994>芸榆<E88AB8><E6A686><EFBFBD>𡒊<EFBFBD>蝡臬<E89DA1>蝡舀<E89DA1>霂蓥<E99C82>嚗?*
---
**霈啣<E99C88>鈭?*嚗鋫I Assistant
**摰⊥瓲鈭?*嚗𡁜<E59A97><F0A1819C>穃𣪧<E7A983>?
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦**嚗鯝1.0
**<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>?*嚗?026-01-02 23:55:00