study.ts 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. /**
  2. * Study Mock Handlers
  3. * 检查信息管理相关的 mock 处理器
  4. */
  5. /**
  6. * 登记检查信息 - 成功场景
  7. *
  8. * @description 登记新的检查信息
  9. * @method POST
  10. * @url /dr/api/v1/auth/study
  11. * @access 需要认证
  12. *
  13. * @param {Object} requestBody - 请求体(包含患者信息、体位列表等)
  14. *
  15. * @returns {Object} data - 新创建的检查信息
  16. * @returns {string} data.study_id - 检查ID
  17. * @returns {Object[]} data.series - 序列列表
  18. *
  19. * @example
  20. * mockRegisterStudySuccess();
  21. * cy.wait('@registerStudySuccess');
  22. *
  23. * @see docs/DR.md - 章节13
  24. */
  25. export function mockRegisterStudySuccess() {
  26. cy.intercept('POST', '/dr/api/v1/auth/study', {
  27. statusCode: 200,
  28. body: {
  29. code: "0x000000",
  30. description: "Success",
  31. solution: "",
  32. data: {
  33. "@type": "type.googleapis.com/dr.study.Study",
  34. study_instance_uid: "1.2.276.0.1000000.5.1.2.701601461.33458.1750833219.482097",
  35. study_id: "20250625143339389",
  36. patient_name: "Test Patient",
  37. patient_id: "PET007",
  38. study_status: "Arrived",
  39. series: []
  40. }
  41. }
  42. }).as('registerStudySuccess');
  43. }
  44. /**
  45. * 获取检查信息 - Arrived状态(简化版)
  46. *
  47. * @description 根据study_id获取检查详细信息(已到达状态)
  48. * @method GET
  49. * @url /dr/api/v1/auth/study/{id}
  50. * @access 需要认证
  51. *
  52. * @param {string} id - 检查ID(study_id),路径参数
  53. *
  54. * @returns {Object} data - 检查详细信息
  55. * @returns {string} data.study_status - 检查状态(Arrived/InProgress/Completed)
  56. *
  57. * @example
  58. * mockGetStudyArrived();
  59. * cy.wait('@getStudyArrived');
  60. *
  61. * @see docs/DR.md - 章节16
  62. */
  63. export function mockGetStudyArrived() {
  64. cy.intercept('GET', '/dr/api/v1/auth/study/*', {
  65. statusCode: 200,
  66. body: {
  67. code: "0x000000",
  68. description: "Success",
  69. solution: "",
  70. data: {
  71. study_id: "250929163817805",
  72. patient_name: "Test Patient",
  73. study_status: "Arrived",
  74. series: []
  75. }
  76. }
  77. }).as('getStudyArrived');
  78. }
  79. /**
  80. * 获取检查信息 - 完整详情
  81. *
  82. * @description 根据study_id获取完整的检查详细信息,包含series和images
  83. * @method GET
  84. * @url /dr/api/v1/auth/study/{id}
  85. * @access 需要认证
  86. *
  87. * @param {string} id - 检查ID(study_id),路径参数
  88. *
  89. * @returns {Object} data - 完整的检查详细信息,包含series和images
  90. *
  91. * @example
  92. * mockGetStudyDetails();
  93. * cy.wait('@getStudyDetails');
  94. *
  95. * @see docs/DR.md - 章节19
  96. */
  97. export function mockGetStudyDetails(studyId:string) {
  98. cy.intercept('GET', `/dr/api/v1/auth/study/${studyId}`, {
  99. statusCode: 200,
  100. body: {
  101. code: "0x000000",
  102. description: "成功",
  103. solution: "",
  104. data: {
  105. "@type": "type.googleapis.com/dr.study.Study",
  106. study_instance_uid: "2.25.156.999999.0000.1.2.8323328.269954.1759135097.323784",
  107. study_id: studyId,
  108. public_study_id: "",
  109. specific_character_set: "ISO_IR 192",
  110. accession_number: "ACC0012345",
  111. ref_physician: "Dr. Smith (Vet)",
  112. patient_id: "PET007",
  113. patient_name: "Buddy (Dog)",
  114. patient_english_name: "Buddy en",
  115. patient_former_name: "Buddy f",
  116. patient_size: "Large",
  117. other_patient_ids: "",
  118. other_patient_names: "",
  119. patient_age: "008Y",
  120. patient_dob: "2025-06-10T03:12:36.181739Z",
  121. patient_sex: "M",
  122. sex_neutered: "",
  123. pregnancy_status: "",
  124. patient_state: "",
  125. admitting_time: null,
  126. priority: "",
  127. reg_source: "",
  128. study_description: "",
  129. study_start_datetime: "2025-09-29T08:38:17.283651Z",
  130. study_end_datetime: null,
  131. scheduled_procedure_step_start_date: null,
  132. performed_physician: "",
  133. study_lock: "Unlocked",
  134. folder_path: "",
  135. operator_name: "OP987",
  136. modality: "DX",
  137. weight: 25,
  138. thickness: 15,
  139. length: 60,
  140. patient_type: "Human",
  141. study_type: "Normal",
  142. owner_name: "owner1",
  143. chip_number: "CHIP123456789",
  144. variety: "Golden Retriever",
  145. is_anaesthesia: true,
  146. is_sedation: true,
  147. mwl: "",
  148. is_exported: false,
  149. is_edited: false,
  150. is_appended: false,
  151. department: "",
  152. mapped_status: false,
  153. qc_result: false,
  154. comment: "一二三四五六七八九十",
  155. study_status: "Arrived",
  156. sort: 0,
  157. product: "DROS",
  158. create_time: "2025-09-29T08:38:17.353598Z",
  159. series: [
  160. {
  161. series_instance_uid: "2.25.156.999999.0000.1.3.8323328.269954.1759135097.323785",
  162. study_instance_uid: "2.25.156.999999.0000.1.2.8323328.269954.1759135097.323784",
  163. study_id: studyId,
  164. procedure_id: "P0-0002",
  165. patient_type: "Human",
  166. body_part: "Human_SKULL",
  167. performed_datetime: null,
  168. performed_protocol_code_meaning: "颅骨前后位 + 侧位",
  169. performed_protocol_code_value: "P0-0002",
  170. sort: 1,
  171. product: "DROS",
  172. is_pre_install: true,
  173. create_time: "2025-09-29T08:38:17.359308Z",
  174. images: [
  175. {
  176. sop_instance_uid: "2.25.156.999999.0000.1.4.8323328.269954.1759135097.323786",
  177. series_instance_uid: "2.25.156.999999.0000.1.3.8323328.269954.1759135097.323785",
  178. study_instance_uid: "2.25.156.999999.0000.1.2.8323328.269954.1759135097.323784",
  179. secondary_sop_uid: "",
  180. study_id: studyId,
  181. view_id: "View_DX_T_A_SK_AP_00",
  182. view_description: "颅骨前后位",
  183. patient_type: "Human",
  184. body_part_id: "Human_SKULL",
  185. anatomic_region: "Skull",
  186. image_type: "expose",
  187. image_file_path: "",
  188. image_file: "",
  189. thumbnail_file: "",
  190. acquisition_mode: "RAD",
  191. acquisition_context: null,
  192. img_proc_context: null,
  193. comment: "",
  194. expose_status: "Unexposed",
  195. expose_time: null,
  196. judged_status: "NotJudged",
  197. send_status: "Unsent",
  198. export_status: "NotExported",
  199. storage_status: "NotSaved",
  200. ticket: "",
  201. sort: 1,
  202. product: "DROS",
  203. is_pre_install: true,
  204. create_time: "2025-09-29T08:38:17.361002Z"
  205. },
  206. {
  207. sop_instance_uid: "2.25.156.999999.0000.1.4.8323328.269954.1759135097.323787",
  208. series_instance_uid: "2.25.156.999999.0000.1.3.8323328.269954.1759135097.323785",
  209. study_instance_uid: "2.25.156.999999.0000.1.2.8323328.269954.1759135097.323784",
  210. secondary_sop_uid: "",
  211. study_id: studyId,
  212. view_id: "View_DX_T_A_SK_LAT_00",
  213. view_description: "颅骨左侧位",
  214. patient_type: "Human",
  215. body_part_id: "Human_SKULL",
  216. anatomic_region: "Skull",
  217. image_type: "expose",
  218. image_file_path: "",
  219. image_file: "",
  220. thumbnail_file: "",
  221. acquisition_mode: "RAD",
  222. acquisition_context: null,
  223. img_proc_context: null,
  224. comment: "",
  225. expose_status: "Unexposed",
  226. expose_time: null,
  227. judged_status: "NotJudged",
  228. send_status: "Unsent",
  229. export_status: "NotExported",
  230. storage_status: "NotSaved",
  231. ticket: "",
  232. sort: 2,
  233. product: "DROS",
  234. is_pre_install: true,
  235. create_time: "2025-09-29T08:38:17.362195Z"
  236. }
  237. ]
  238. }
  239. ]
  240. }
  241. }
  242. }).as('getStudyDetails');
  243. }
  244. /**
  245. * 获取检查信息状态 - 成功场景
  246. *
  247. * @description 获取检查的统计信息(总数、已曝光数)
  248. * @method GET
  249. * @url /dr/api/v1/auth/study/{id}/stat
  250. * @access 需要认证
  251. *
  252. * @param {string} id - 检查ID(study_id),路径参数
  253. *
  254. * @returns {Object} data - 统计信息
  255. * @returns {number} data.total - 总体位数
  256. * @returns {number} data.exposed - 已曝光数
  257. *
  258. * @example
  259. * mockGetStudyStatSuccess();
  260. * cy.wait('@getStudyStatSuccess');
  261. *
  262. * @see docs/DR.md - 章节17
  263. */
  264. export function mockGetStudyStatSuccess() {
  265. cy.intercept('GET', '/dr/api/v1/auth/study/*/stat', {
  266. statusCode: 200,
  267. body: {
  268. code: "0x000000",
  269. description: "Success",
  270. solution: "",
  271. data: {
  272. "@type": "type.googleapis.com/dr.study.Stat",
  273. total: 3,
  274. exposed: 1
  275. }
  276. }
  277. }).as('getStudyStatSuccess');
  278. }
  279. /**
  280. * 变更登记信息 - 成功场景
  281. *
  282. * @description 更新已登记的检查信息
  283. * @method PUT
  284. * @url /dr/api/v1/auth/study/{id}
  285. * @access 需要认证
  286. *
  287. * @param {string} id - 检查ID(study_id),路径参数
  288. * @param {Object} requestBody - 更新的患者信息
  289. *
  290. * @returns {Object} data - 更新后的检查信息
  291. *
  292. * @example
  293. * mockUpdateStudySuccess();
  294. * cy.wait('@updateStudySuccess');
  295. *
  296. * @see docs/DR.md - 章节14
  297. */
  298. export function mockUpdateStudySuccess() {
  299. cy.intercept('PUT', '/dr/api/v1/auth/study/*', {
  300. statusCode: 200,
  301. body: {
  302. code: "0x000000",
  303. description: "Success",
  304. solution: "",
  305. data: {
  306. study_id: "20250625140057649",
  307. patient_name: "Updated Patient",
  308. study_status: "Arrived"
  309. }
  310. }
  311. }).as('updateStudySuccess');
  312. }
  313. /**
  314. * 删除检查信息(批量)- 成功场景
  315. *
  316. * @description 批量删除检查信息
  317. * @method DELETE
  318. * @url /dr/api/v1/auth/study
  319. * @access 需要认证
  320. *
  321. * @param {string[]} requestBody - 检查ID列表
  322. *
  323. * @returns {Object} 成功响应
  324. *
  325. * @example
  326. * mockDeleteStudyBatchSuccess();
  327. * cy.wait('@deleteStudyBatchSuccess');
  328. *
  329. * @see docs/DR.md - 章节18
  330. */
  331. export function mockDeleteStudyBatchSuccess() {
  332. cy.intercept('DELETE', '/dr/api/v1/auth/study', {
  333. statusCode: 200,
  334. body: {
  335. code: "0x000000",
  336. description: "Success",
  337. solution: "",
  338. data: {}
  339. }
  340. }).as('deleteStudyBatchSuccess');
  341. }
  342. /**
  343. * 存储急诊患者影像 - 成功场景
  344. *
  345. * @description 存储拍摄的急诊患者影像
  346. * @method POST
  347. * @url /api/v1/auth/study/portrait
  348. * @access 需要认证
  349. *
  350. * @param {Object} formData - 表单数据
  351. * @param {string} formData.instance_uid - study实例UID
  352. * @param {File} formData.data - PNG图片文件
  353. *
  354. * @returns {Object} data - DCM文件路径
  355. * @returns {string} data.path - 文件路径
  356. *
  357. * @example
  358. * mockStorePortraitSuccess();
  359. * cy.wait('@storePortraitSuccess');
  360. *
  361. * @see docs/DR.md - 章节19
  362. */
  363. export function mockStorePortraitSuccess() {
  364. cy.intercept('POST', '/api/v1/auth/study/portrait', {
  365. statusCode: 200,
  366. body: {
  367. code: "0x000000",
  368. description: "Success",
  369. solution: "",
  370. data: {
  371. "@type": "type.googleapis.com/dr.task.DcmPath",
  372. path: "1.2.276.0.1000000.5.1.5.701601461.33458.1750830395.482043.dcm"
  373. }
  374. }
  375. }).as('storePortraitSuccess');
  376. }
  377. /**
  378. * 挂起检查 - 成功场景
  379. *
  380. * @description 挂起当前检查(状态设为InProgress)
  381. * @method POST
  382. * @url /api/v1/auth/task/inspection/leave
  383. * @access 需要认证
  384. *
  385. * @param {Object} requestBody - 请求体
  386. * @param {string} requestBody.study_id - 检查ID
  387. * @param {string} requestBody.study_status - 检查状态(InProgress)
  388. *
  389. * @returns {Object} 成功响应
  390. *
  391. * @example
  392. * mockLeaveStudyInProgress();
  393. * cy.wait('@leaveStudyInProgress');
  394. *
  395. * @see docs/DR.md - 章节35
  396. */
  397. export function mockLeaveStudyInProgress() {
  398. cy.intercept('POST', '/api/v1/auth/task/inspection/leave', (req) => {
  399. if (req.body.study_status === 'InProgress') {
  400. req.reply({
  401. statusCode: 200,
  402. body: {
  403. code: "0x000000",
  404. description: "Success",
  405. solution: "",
  406. data: {}
  407. }
  408. });
  409. }
  410. }).as('leaveStudyInProgress');
  411. }
  412. /**
  413. * 完成检查 - 成功场景
  414. *
  415. * @description 完成当前检查(状态设为Completed)
  416. * @method POST
  417. * @url /api/v1/auth/task/inspection/leave
  418. * @access 需要认证
  419. *
  420. * @param {Object} requestBody - 请求体
  421. * @param {string} requestBody.study_id - 检查ID
  422. * @param {string} requestBody.study_status - 检查状态(Completed)
  423. *
  424. * @returns {Object} 成功响应
  425. *
  426. * @example
  427. * mockLeaveStudyCompleted();
  428. * cy.wait('@leaveStudyCompleted');
  429. *
  430. * @see docs/DR.md - 章节35
  431. */
  432. export function mockLeaveStudyCompleted() {
  433. cy.intercept('POST', '/api/v1/auth/task/inspection/leave', (req) => {
  434. if (req.body.study_status === 'Completed') {
  435. req.reply({
  436. statusCode: 200,
  437. body: {
  438. code: "0x000000",
  439. description: "Success",
  440. solution: "",
  441. data: {}
  442. }
  443. });
  444. }
  445. }).as('leaveStudyCompleted');
  446. }