核心修复: - 状态机加 SELECT FOR UPDATE 行锁,消除并发竞态 - hss_md_staff 加 role 列,登录从数据库读取真实角色 - 申请重复校验排除自身,全流程 20 步闭环通过 - 派单 SQL 修复 + 支付状态机过渡 + 完成服务 plan_item_id 修复 并发控制新增: - RedisLockService (SET NX PX + Lua 安全解锁) - RateLimiterService (Redis 滑动窗口 + API 拦截器) - TransactionIsolationConfig (SERIALIZABLE for 支付回调) - MqttPublisher (异步队列 + JDK TCP 探测) - ObjectStorageService (AWS SigV4 预签名, 纯 JDK) 冗余清理: - 删除 6 个死代码文件 (~620 行) - hutool-all → JDK MessageDigest, 去 MapStruct, 去 jsr310 - haversine 提取到 GeoUtil, count/round 提取到 JdbcUtil - 创建 platform layout 组件 前端修复: - 登录页移除角色选择器, 由后端 JWT 返回 - 移除 ClientOnly 包裹, 页面正常渲染 - SPA fallback Nginx 配置修复 Docker: 运行时镜像 eclipse-temurin:17-jre-jammy (缩小 ~300MB) 文档: 新增系统实现与修复报告.md Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
55 lines
2.1 KiB
TypeScript
55 lines
2.1 KiB
TypeScript
import { test, expect } from '@playwright/test'
|
||
|
||
test.describe('首页模块完整性', () => {
|
||
test.beforeEach(async ({ page }) => { await page.goto('/') })
|
||
|
||
test('Hero 首屏存在', async ({ page, viewport }) => {
|
||
await expect(page.locator('h1')).toBeVisible()
|
||
// CTA button is in collapsed menu on mobile/tablet
|
||
if (viewport && viewport.width && viewport.width >= 1024) {
|
||
await expect(page.getByText('预约演示').first()).toBeVisible()
|
||
}
|
||
})
|
||
|
||
test('行业痛点模块存在', async ({ page }) => {
|
||
await expect(page.getByText('居家上门服务,为什么这么难管?')).toBeVisible()
|
||
await expect(page.getByText('申请受理难')).toBeVisible()
|
||
await expect(page.getByText('派单调度难')).toBeVisible()
|
||
await expect(page.getByText('过程监管难')).toBeVisible()
|
||
})
|
||
|
||
test('服务闭环流程模块存在', async ({ page }) => {
|
||
await page.getByText('完整服务闭环').scrollIntoViewIfNeeded()
|
||
await page.waitForTimeout(500)
|
||
await expect(page.getByText('完整服务闭环')).toBeVisible()
|
||
})
|
||
|
||
test('核心能力模块存在', async ({ page }) => {
|
||
await expect(page.getByText('八大核心能力')).toBeVisible()
|
||
})
|
||
|
||
test('应用场景模块存在', async ({ page }) => {
|
||
await expect(page.getByText('覆盖五大应用场景')).toBeVisible()
|
||
await expect(page.getByText('政府监管')).toBeVisible()
|
||
await expect(page.getByText('医院延续护理')).toBeVisible()
|
||
})
|
||
|
||
test('数据看板模块存在', async ({ page }) => {
|
||
await expect(page.getByText('实时监管,数据驱动')).toBeVisible()
|
||
})
|
||
|
||
test('安全合规模块存在', async ({ page }) => {
|
||
await expect(page.getByText('医疗级安全合规')).toBeVisible()
|
||
})
|
||
|
||
test('CTA 区块存在', async ({ page }) => {
|
||
await expect(page.getByText('准备好提升居家服务管理效率了吗?')).toBeVisible()
|
||
})
|
||
|
||
test('SVG 图标渲染正常(非 emoji)', async ({ page }) => {
|
||
const svgs = page.locator('svg')
|
||
const count = await svgs.count()
|
||
expect(count).toBeGreaterThan(5)
|
||
})
|
||
})
|