/** * I18n Mock Handlers * 国际化相关的 mock 处理器 */ /** * 获取多语言列表 - 成功场景 * * @description 获取系统支持的语言列表 * @method GET * @url /dr/api/v1/pub/language * @access 公开接口 * * @returns {Object[]} data - 语言列表 * @returns {string} data[].language - 语言代码(en/zh) * @returns {string} data[].display - 语言显示名称 * * @example * mockGetLanguageListSuccess(); * cy.wait('@getLanguageListSuccess').its('response.body.data').should('have.length', 2); * * @see docs/DR.md - 章节4 */ export function mockGetLanguageListSuccess() { cy.intercept('GET', '/dr/api/v1/pub/language', { statusCode: 200, body: { code: "0x000000", data: [ { language: "en", display: "English" }, { language: "zh", display: "简体中文" } ], description: "Success", solution: "" } }).as('getLanguageListSuccess'); } /** * 获取多语言列表 - 空列表场景 * * @description 获取多语言列表,返回空列表 * @method GET * @url /dr/api/v1/pub/language * @access 公开接口 * * @returns {Object[]} data - 空语言列表 * * @example * mockGetLanguageListEmpty(); * cy.wait('@getLanguageListEmpty'); * * @see docs/DR.md - 章节4 */ export function mockGetLanguageListEmpty() { cy.intercept('GET', '/dr/api/v1/pub/language', { statusCode: 200, body: { code: "0x000000", data: [], description: "Success", solution: "" } }).as('getLanguageListEmpty'); } /** * 获取翻译文件 - 成功场景 * * @description 获取指定语言的翻译文件 * @method GET * @url /dr/api/v1/pub/trans/{locale}/{locale}.js * @access 公开接口 * * @param {string} locale - 语言代码(zh_CN/en_US) * * @returns {Object} 翻译键值对 * * @example * mockI18nSuccess('en_US'); * cy.wait('@getI18nZHSuccess'); * * @see docs/DR.md - 章节3 */ export function mockI18nSuccess(locale: 'zh_CN' | 'en_US') { const mockData = locale === 'zh_CN' ? { "greeting": "你好,世界!", "name": "张三", "patient": "患者管理", "animal.patient": "宠物管理", "register": "注册", "tasklist": "任务清单", "historylist": "历史清单", "archivelist": "归档清单", "bin": "回收站", "outputlist": "传输清单", "exam": "检查", "examlist": "检查清单", "process": "处理", "print": "打印", "printlist": "打印清单", "worklist": "任务清单", "worklist.operationPanel": "操作面板", "register.basicInfoPanel": "基本信息表单区域", "register.protocolListPanel": "待选择协议列表区域", "register.selectedProtocolListPanel": "已选择协议列表区域", "worklistTable.patientId": "患者编号22", "worklistTable.name": "患者姓名", "worklistTable.alias": "曾用名", "worklistTable.englishName": "英文名", "worklistTable.registrationId": "登记号", "worklistTable.birthDate": "出生日期", "worklistTable.age": "年龄", "worklistTable.gender": "性别", "worklistTable.bodyType": "病人体型", "worklistTable.weight": "体重", "worklistTable.height": "身高", "worklistTable.pregnancyStatus": "怀孕状态", "worklistTable.referringDoctor": "转诊医师", "searchPanel.name": "按姓名查询", "searchPanel.patientId": "按患者编号查询", "searchPanel.registrationId": "按登记号查询", "searchPanel.startDate": "开始日期", "searchPanel.endDate": "结束日期", "searchPanel.search": "查询", "register.patientId": "患者编号", "animal.register.patientId": "宠物编号", "register.patientId.placeholder": "请输入患者编号", "animal.register.patientId.placeholder": "请输入宠物编号", "register.patientName": "患者姓名", "animal.register.patientName": "宠物昵称", "register.patientName.placeholder": "请输入患者姓名", "animal.register.patientName.placeholder": "请输入宠物昵称", "register.previousName": "曾用名", "register.previousName.placeholder": "请输入曾用名", "register.englishName": "英文名", "register.englishName.placeholder": "请输入英文名", "register.registrationNo": "登记号", "register.registrationNo.placeholder": "请输入登记号", "register.dateOfBirth": "出生日期", "register.age": "年龄", "register.gender": "性别", "register.gender.male": "男", "register.gender.female": "女", "register.gender.other": "其他", "register.gender.unknown": "未知", "register.gender.male_pet": "公", "register.gender.female_pet": "母", "register.gender.other_pet": "其他", "register.gender.unknown_pet": "未知", "register.gender.castration": "阉割", "register.gender.sterilization": "绝育", "register.owner_name": "宠主姓名", "register.owner_name.placeholder": "请输入宠主姓名", "register.bodyType": "病人体型", "register.bodyType.slim": "瘦", "register.bodyType.average": "平均", "register.bodyType.fat": "重", "register.weight": "体重", "register.height": "身高", "register.pregnancyStatus": "怀孕状态", "register.pregnancyStatus.yes": "是", "register.pregnancyStatus.no": "否", "register.pregnancyStatus.na": "不适用", "register.referringPhysician": "转诊医师", "register.referringPhysician.placeholder": "请输入转诊医师姓名", "register.bodyPart": "身体部位", "register.bodyPart.head": "头部", "register.bodyPart.chest": "胸部", "register.accessionNumber": "登记号", "register.accessionNumber.placeholder": "请输入登记号", "register.protocol.A": "协议A", "register.protocol.B": "协议B", "register.protocol.C": "协议C", "register.protocol.D": "协议D", "register.protocol.E": "协议E", "register.protocol.F": "协议F", "register.selectedProtocol.A": "已选协议A", "register.selectedProtocol.B": "已选协议B", "register.selectedProtocol.C": "已选协议C", "register.selectedProtocol.remove": "移除", "outputTable.name": "病人姓名", "outputTable.id": "病人ID", "outputTable.priority": "优先级", "outputTable.status": "状态", "outputTable.retryCount": "重试次数", "outputTable.target": "目标", "outputAction.retry": "重试", "outputAction.delete": "删除", "bin.diskCapacity": "磁盘容量:", "bin.freeSpace": "剩余空间:", "bin.binCapacity": "回收站容量:", "bin.delete": "删除", "bin.restore": "恢复", "bin.empty": "清空", "dicomNodeDetail.title": "DICOM节点详情", "dicomNodeDetail.nodeList": "DICOM节点列表", "dicomNodeDetail.selectNode": "请选择DICOM节点", "dicomNodeDetail.host": "主机名称", "dicomNodeDetail.ip": "主机IP", "dicomNodeDetail.port": "主机端口", "dicomNodeDetail.calledAET": "被叫实体名", "dicomNodeDetail.callingAET": "主叫实体名", "dicomNodeDetail.testConnection": "测试连接状态", "dicomNodeDetail.archive": "归档", "actionPanel.deleteTask": "删除检查任务", "actionPanel.editPatient": "编辑患者信息", "actionPanel.lockTask": "锁定任务", "actionPanel.risSync": "RIS同步", "actionPanel.reRegister": "再登记", "actionPanel.saveLocal": "保存本地", "actionPanel.importXLS": "从XLS导入", "actionPanel.sortList": "列表排序", "actionPanel.cloudShare": "云分享", "actionPanel.imageExchange": "图像交换", "actionPanel.qrPrint": "二维码打印", "actionPanel.send": "发送", "actionPanel.burn": "刻录", "actionPanel.export": "导出", "actionPanel.import": "导入", "actionPanel.showReport": "显示报告", "Small": "小", "Medium": "中", "Large": "大", "workstation.free": "自由位", "workstation.direct": "传统位", "workstation.table": "卧位", "workstation.wall": "立位", "register.patientSize": "患者体型", "register.patientSize.placeholder": "请输入患者体型", "animal.register.patientSize": "宠物体型", "animal.register.patientSize.placeholder": "请输入宠物体型", "register.sexNeutered": "绝育情况", "register.sexNeutered.placeholder": "请输入绝育情况", "register.sexNeutered.altered": "绝育", "register.sexNeutered.unaltered": "未绝育", "register.chipNumber": "芯片编号", "register.chipNumber.placeholder": "请输入芯片编号", "register.variety": "品种", "register.variety.placeholder": "请输入品种", "register.patientType": "患者类型", "register.patientType.placeholder": "请输入患者类型", "register.operatorId": "操作员ID", "register.operatorId.placeholder": "请输入操作员ID", "register.modality": "物理疗法", "register.modality.placeholder": "请输入物理疗法", "register.thickness": "厚度", "register.studyType": "检查类型", "register.studyType.placeholder": "请输入检查类型", "register.comment": "备注", "register.comment.placeholder": "请输入备注", "register.cat": "猫", "register.dog": "狗", "register.equine": "马", "register.lizard": "蜥蜴", "register.birds": "鸟类", "register.rabbit": "兔", "register.snake": "蛇", "register.turtle": "龟", "register.gnawer": "啮齿类", "worklistTable.StudyInstanceUID": "检查实例UID", "worklistTable.StudyID": "检查ID", "worklistTable.SpecificCharacterSet": "特定字符集", "worklistTable.AccessionNumber": "登记号", "worklistTable.PatientID": "患者ID", "worklistTable.PatientName": "患者姓名", "worklistTable.DisplayPatientName": "显示患者姓名", "worklistTable.PatientSize": "患者体型", "worklistTable.PatientAge": "患者年龄", "worklistTable.PatientSex": "患者性别", "animal.worklistTable.PatientID": "宠物ID", "animal.worklistTable.PatientName": "宠物昵称", "animal.worklistTable.PatientAge": "宠物年龄", "animal.worklistTable.PatientSex": "宠物性别", "worklistTable.AdmittingTime": "入院时间", "worklistTable.RegSource": "登记来源", "worklistTable.StudyStatus": "检查状态", "worklistTable.RequestedProcedureID": "请求的程序ID", "worklistTable.PerformedProtocolCodeValue": "执行的协议代码值", "worklistTable.PerformedProtocolCodeMeaning": "执行的协议代码含义", "worklistTable.PerformedProcedureStepID": "执行的程序步骤ID", "worklistTable.StudyDescription": "检查描述", "worklistTable.StudyStartDatetime": "检查开始日期时间", "worklistTable.ScheduledProcedureStepStartDate": "计划的程序步骤开始日期", "worklistTable.StudyLock": "检查锁定", "worklistTable.OperatorID": "操作员ID", "worklistTable.Modality": "模态", "worklistTable.Views": "视图", "worklistTable.Thickness": "厚度", "worklistTable.PatientType": "患者类型", "worklistTable.StudyType": "检查类型", "worklistTable.QRCode": "二维码", "worklistTable.IsExported": "是否已导出", "worklistTable.IsEdited": "是否已编辑", "worklistTable.WorkRef": "工作参考", "worklistTable.IsAppended": "是否已附加", "worklistTable.CreationTime": "创建时间", "worklistTable.MappedStatus": "映射状态", "worklistTable.IsDelete": "是否已删除", "login.username": "用户名", "login.username.placeholder": "请输入用户名", "login.username.required": "请输入用户名", "login.password": "密码", "login.password.placeholder": "请输入密码", "login.password.required": "请输入密码", "login.submit": "登录", "login.emergency": "急诊", "login.success": "登录成功", "login.failed": "登录失败", "login.failedDetail": ",详情:", "login.networkError": ",网络错误:", "login.unknownError": "未知错误", "login.emergency.success": "急诊模式启动成功", "login.emergency.failed": "急诊操作失败:", "nav.config": "配置", "nav.logout": "退出", "register.filter.protocol": "协议", "register.filter.view": "体位", "register.register": "注册", "register.exam": "检查", "register.no.views": "暂无可选择体位", "state.quota": "配额", "exam.close.aec": "关闭 AEC", "exam.open.aec": "打开 AEC", "exam.thinkness": "厚度", "exam.exposure.mode": "曝光模式", "exam.bodysize.placeholder": "选择体型", "exam.thickness.label": "厚度 (cm)", "exam.thickness.placeholder": "厚度", "exam.exposureMode.label": "曝光模式", "exam.exposureMode.placeholder": "选择曝光模式", "exam.aec.enabled": "开启AEC", "exam.aec.disabled": "关闭AEC", "exam.action.resetParams": "重置参数", "exam.action.deletePosition": "删除选择的体位", "exam.action.copyPosition": "复制选择的体位", "exam.action.saveParams": "保存参数", "exam.action.toggleCamera": "打开/关闭摄像头", "exam.action.reject": "拒绝", "exam.action.restore": "恢复", "exam.action.addMorePositions": "添加更多体位", } : { greeting: 'Hello, world!', name: 'John Doe', patient: 'Patient Management', register: 'Register', tasklist: 'Task List', historylist: 'History List', archivelist: 'Archive List', bin: 'Recycle Bin', outputlist: 'Transfer List', exam: 'Examination', examlist: 'Examination List', process: 'Process', print: 'Print', printlist: 'Print List', worklist: 'Task List', 'worklist.operationPanel': 'Operation Panel', 'register.basicInfoPanel': 'Basic Information Form Area', 'register.protocolListPanel': 'Protocol Selection List Area', 'register.selectedProtocolListPanel': 'Selected Protocol List Area', 'worklistTable.patientId': 'Patient ID', 'worklistTable.name': 'Patient Name', 'register.patientId': 'Patient ID', 'register.patientName': 'Patient Name', 'register.gender': 'Gender', 'register.gender.male': 'Male', 'register.gender.female': 'Female', // Login page 'login.username': 'Username', 'login.username.placeholder': 'Enter username', 'login.username.required': 'Please enter username', 'login.password': 'Password', 'login.password.placeholder': 'Enter password', 'login.password.required': 'Please enter password', 'login.submit': 'Login', 'login.emergency': 'Emergency', 'login.success': 'Login successful', 'login.failed': 'Login failed', 'login.failedDetail': ', details: ', 'login.networkError': ', network error: ', 'login.unknownError': 'Unknown error', 'login.emergency.success': 'Emergency mode activated successfully', 'login.emergency.failed': 'Emergency operation failed: ' }; cy.intercept('GET', `/dr/api/v1/pub/trans/${locale}/${locale.split('_')[0]}.js`, (req) => { req.reply({ statusCode: 200, body: mockData }); }).as(`getI18n${locale.toUpperCase()}Success`); } // 封装获取多语言资源失败的 mock (404错误) export function mockI18nError(locale: 'zh_CN' | 'en_US') { cy.intercept('GET', `/dr/api/v1/pub/trans/${locale}/${locale.split('_')[0]}.js`, (req) => { req.reply({ statusCode: 404, body: { message: 'Not Found', error: 'Translation file not found' } }); }).as(`getI18n${locale.toUpperCase()}Error`); } // 封装获取多语言资源服务器错误的 mock (500错误) export function mockI18nServerError(locale: 'zh_CN' | 'en_US') { cy.intercept('GET', `/dr/api/v1/pub/trans/${locale}/${locale.split('_')[0]}.js`, (req) => { req.reply({ statusCode: 500, body: { message: 'Internal Server Error', error: 'Server error occurred' } }); }).as(`getI18n${locale.toUpperCase()}ServerError`); } // 封装获取多语言资源超时的 mock export function mockI18nTimeout(locale: 'zh_CN' | 'en_US') { cy.intercept('GET', `/dr/api/v1/pub/trans/${locale}/${locale.split('_')[0]}.js`, (req) => { req.reply({ delay: 30000, // 30秒延迟,模拟超时 statusCode: 200, body: {} }); }).as(`getI18n${locale.toUpperCase()}Timeout`); } // 封装获取多语言资源格式错误的 mock export function mockI18nInvalidFormat(locale: 'zh_CN' | 'en_US') { cy.intercept('GET', `/dr/api/v1/pub/trans/${locale}/${locale.split('_')[0]}.js`, (req) => { req.reply({ statusCode: 200, body: "invalid json format" // 返回非JSON格式数据 }); }).as(`getI18n${locale.toUpperCase()}InvalidFormat`); } // 封装获取多语言资源空数据的 mock export function mockI18nEmptyData(locale: 'zh_CN' | 'en_US') { cy.intercept('GET', `/dr/api/v1/pub/trans/${locale}/${locale.split('_')[0]}.js`, (req) => { req.reply({ statusCode: 200, body: {} // 返回空对象 }); }).as(`getI18n${locale.toUpperCase()}EmptyData`); } // 封装获取多语言资源网络错误的 mock export function mockI18nNetworkError(locale: 'zh_CN' | 'en_US') { cy.intercept('GET', `/dr/api/v1/pub/trans/${locale}/${locale.split('_')[0]}.js`, (req) => { req.reply({ forceNetworkError: true }); }).as(`getI18n${locale.toUpperCase()}NetworkError`); } // 封装软件信息API的 mock,避免影响页面加载 export function mockSoftwareInfo(locale: 'zh_CN' | 'en_US' = 'zh_CN') { cy.intercept('GET', '/dr/api/v1/pub/software_info', (req) => { req.reply({ statusCode: 200, body: { code: "0x000000", data: { FPD: "Physics", GEN: "Physics", current_locale: locale, default_locale: "zh_CN", guest: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NjA0OTc2NDksImlkIjoyLCJuYW1lIjoiZ3Vlc3QifQ.hUV5_GOzlWKDeFioJCsHMG2IXa0oJPfNNlPsr69ypqc", language: ["en", "zh"], product: "VETDROS", server: { auth: { build: "2025-10-08 11:06:08", desc: "Authentication Server repo", submodule: ["0baa8db0[rpc_idl]"], version: "0.4.0-21-g4a37cc7" }, dcmtk: { build: "2025-09-29 16:35:39", desc: "Dcmtk Server repo", submodule: ["c2039235[rpc_idl]"], version: "0.4.0-2-g36bc18f" }, imgProc: { build: "2025-09-29 16:36:36", desc: "Img Proc Server repo", submodule: [ "d00bfca5[auto_wwwl]", "89fd9218[collimator_circle]", "c9582bbe[collimator_rect]", "98c510bd[enhance]", "6f9bf7de[enhance_v3]", "5905e001[rpc_idl]" ], version: "0.4.0-7-gca1c8a4" }, protocol: { build: "2025-10-08 11:06:13", desc: "Protocol Server repo", submodule: ["0baa8db0[rpc_idl]"], version: "0.4.0-8-g47990eb" }, resource: { build: "2025-10-08 11:06:17", desc: "Resource Server repo", submodule: ["9725e654[rpc_idl]"], version: "0.4.0-9-g10766e8" }, study: { build: "2025-10-08 11:06:15", desc: "Study Server repo", submodule: ["8595ea2d[rpc_idl]"], version: "0.5.0-1-g7620712" }, task: { build: "2025-10-08 11:06:19", desc: "Task Server repo", submodule: ["8595ea2d[rpc_idl]"], version: "0.4.0-11-g494849d" } }, sn: "19d5d2eb-8b720370-7d617b19-670dd1ae" }, description: "Success", solution: "" } }); }).as('getSoftwareInfo'); } // 封装logger API的 mock,避免影响页面加载 export function mockLogger() { cy.intercept('POST', '/log', (req) => { req.reply({ statusCode: 204, // No Content - 更适合日志请求,不会被误认为页面导航 body: null, // 明确返回 null,避免任何可能的页面影响 headers: { 'content-type': 'application/json', 'cache-control': 'no-cache' } }); }).as('postLog'); } // 封装所有必要的API mock,避免影响页面加载 export function mockAllRequiredAPIs(locale: 'zh_CN' | 'en_US' = 'zh_CN') { mockSoftwareInfo(locale); mockLogger(); }