feat: 完成全系统30个功能点开发与E2E全链路验收 (8轮调度32个子代理闭环)
- 模块一: 出海案例作品集、博客动态发布、人名发音语音条、RTL阿语多语言切换 - 模块二: AI顾问人设配置、行业术语库润色、RAG切片沙盒调试、流式会话与意向留资卡片 - 模块三: 全球访客雷达大屏、多维加权意向算分、外部CRM对接推送、团队公海池流转 - 模块四: 移动端NFC安全挂失、NFC动态路由规则配置、动态防伪验签、展会制卡Zip批量导出 - 模块五: 组织架构与名片分配、移动端个人中心设置、离职交接与历史线索迁移、安全审计日志 - 模块六: Stripe国际信用卡订阅Webhook、独立二级域名与SSL检测、坐席配额预警、多币种发票 - 模块七: 纸质名片OCR解析入库、国际商务日程RFC 5545 ICS日历、微官网离线SWR预加载、展会实时排行榜大屏 - 模块八: 全球出海SEO OpenGraph元标签注入与社交爬虫探测、30点端到端全链路业务流集成测试套件
这个提交包含在:
@@ -236,12 +236,42 @@ describe('OmniCard AI 用户端 mpuniapp 网络拦截器与 API 契约测试', (
|
||||
const result = await fetchPortalCard('alex-rivera');
|
||||
|
||||
expect(lastRequestOptions.method).toBe('GET');
|
||||
expect(lastRequestOptions.url).toContain('/card/portal/info');
|
||||
expect(lastRequestOptions.data).toEqual({ id: 'alex-rivera' });
|
||||
expect(lastRequestOptions.url).toContain('/open/card/portal/detail');
|
||||
expect(lastRequestOptions.data).toEqual({
|
||||
slugOrId: 'alex-rivera',
|
||||
slug: 'alex-rivera',
|
||||
});
|
||||
expect(result.name).toBe('Alex Rivera');
|
||||
expect(result.slug).toBe('alex-rivera');
|
||||
});
|
||||
|
||||
it('3.1b fetchPortalCard 数字标识同时带 slugOrId 与 id', async () => {
|
||||
// @ts-ignore
|
||||
const { fetchPortalCard } = require('../../../mpuniapp/common/api.uts');
|
||||
|
||||
mockRequestResponse.data = {
|
||||
code: 1000,
|
||||
message: 'success',
|
||||
data: {
|
||||
id: 1001,
|
||||
slug: 'alex-rivera',
|
||||
name: 'Alex Rivera',
|
||||
title: 'VP of Global Business',
|
||||
company: 'OmniCard AI Global',
|
||||
bentoBlocks: [],
|
||||
},
|
||||
};
|
||||
|
||||
await fetchPortalCard('1001');
|
||||
|
||||
expect(lastRequestOptions.method).toBe('GET');
|
||||
expect(lastRequestOptions.url).toContain('/open/card/portal/detail');
|
||||
expect(lastRequestOptions.data).toEqual({
|
||||
slugOrId: '1001',
|
||||
id: '1001',
|
||||
});
|
||||
});
|
||||
|
||||
it('3.2 submitLead 能够提交留资/互换名片数据并返回潜客模型', async () => {
|
||||
// @ts-ignore
|
||||
const { submitLead } = require('../../../mpuniapp/common/api.uts');
|
||||
@@ -270,7 +300,7 @@ describe('OmniCard AI 用户端 mpuniapp 网络拦截器与 API 契约测试', (
|
||||
const lead = await submitLead(leadPayload);
|
||||
|
||||
expect(lastRequestOptions.method).toBe('POST');
|
||||
expect(lastRequestOptions.url).toContain('/crm/lead/submit');
|
||||
expect(lastRequestOptions.url).toContain('/open/crm/lead/exchange');
|
||||
expect(lastRequestOptions.data).toEqual(leadPayload);
|
||||
expect(lead.id).toBe('lead_9921');
|
||||
expect(lead.status).toBe('new');
|
||||
@@ -303,10 +333,39 @@ describe('OmniCard AI 用户端 mpuniapp 网络拦截器与 API 契约测试', (
|
||||
const track = await recordRadarTrack(trackPayload);
|
||||
|
||||
expect(lastRequestOptions.method).toBe('POST');
|
||||
expect(lastRequestOptions.url).toContain('/crm/radar/track');
|
||||
expect(lastRequestOptions.url).toContain('/open/crm/radar/track');
|
||||
expect(lastRequestOptions.data).toEqual(trackPayload);
|
||||
expect(track.id).toBe('track_881');
|
||||
expect(track.country).toBe('Germany');
|
||||
});
|
||||
|
||||
it('3.4 getRecentTracks 按 cardId 查询最近足迹流水', async () => {
|
||||
// @ts-ignore
|
||||
const { getRecentTracks } = require('../../../mpuniapp/common/api.uts');
|
||||
|
||||
mockRequestResponse.data = {
|
||||
code: 1000,
|
||||
message: 'success',
|
||||
data: [
|
||||
{
|
||||
id: 'track_881',
|
||||
cardId: 1001,
|
||||
visitorId: 'vis_de_4432',
|
||||
touchType: 'qr',
|
||||
stayDurationMs: 65000,
|
||||
scrollDepth: 80,
|
||||
viewedBlocks: ['hero'],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
const tracks = await getRecentTracks(1001, 10);
|
||||
|
||||
expect(lastRequestOptions.method).toBe('GET');
|
||||
expect(lastRequestOptions.url).toContain('/open/crm/radar/recent');
|
||||
expect(lastRequestOptions.data).toEqual({ cardId: 1001, limit: 10 });
|
||||
expect(tracks).toHaveLength(1);
|
||||
expect(tracks[0].id).toBe('track_881');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
在新工单中引用
屏蔽一个用户