register.tsx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. import React from 'react';
  2. import {
  3. Row,
  4. Col,
  5. Collapse,
  6. Grid,
  7. Divider,
  8. Button,
  9. Space,
  10. Form,
  11. message,
  12. } from 'antd';
  13. import { FormattedMessage } from 'react-intl';
  14. import BasicInfoForm from './components/register.form';
  15. import SelectedProtocolList from './components/register.selected.view.list';
  16. import RegisterAvailableList from './components/register.available.list';
  17. import {
  18. RegisterInfo,
  19. registerWork,
  20. RegisterWorkResponse,
  21. RegisterWorkResponseData,
  22. } from '@/API/patient/workActions';
  23. import useRegisterState from '@/hooks/useRegisterState';
  24. import registerformSchema from '@/validation/patient/registerSchema';
  25. import registerToExam from '@/domain/patient/registerToExam';
  26. import dayjs from 'dayjs';
  27. import utc from 'dayjs/plugin/utc';
  28. import { View } from '@/API/patient/viewActions';
  29. dayjs.extend(utc);
  30. const { useBreakpoint } = Grid;
  31. const { Panel } = Collapse;
  32. const RegisterPage: React.FC = () => {
  33. const screens = useBreakpoint();
  34. const [form] = Form.useForm();
  35. const { selectedViews, currentPatientType } = useRegisterState();
  36. const handleRegister = async (): Promise<{
  37. success: boolean;
  38. data?: RegisterWorkResponseData;
  39. views?: View[];
  40. }> => {
  41. try {
  42. let values = form.getFieldsValue();
  43. const formatDob = values.patient_dob
  44. ? dayjs.utc(values.patient_dob).format('YYYY-MM-DDTHH:mm:ss.SSS[Z]') //values.patient_dob.toString('YYYY-MM-DD[T00:00:00.000000Z]')
  45. : '';
  46. console.log(`转换后的日期:${formatDob}`);
  47. values = { ...values, patient_dob: formatDob };
  48. console.log(`${JSON.stringify(values, null, 2)}`);
  49. const validateResult = registerformSchema.safeParse(values);
  50. if (!validateResult.success) {
  51. message.error(`必填项未填写或者不合规则`);
  52. // todo 更详细和人性化的提示
  53. // message.error(JSON.stringify(validateResult.error, null, 2));
  54. console.log(JSON.stringify(validateResult.error, null, 2));
  55. return { success: false, views: [] as [] };
  56. }
  57. const registerInfo: RegisterInfo = {
  58. ...values,
  59. patient_type: currentPatientType?.patient_type_id,
  60. modality: 'dx',
  61. study_type: 'Normal',
  62. views: selectedViews.map((view) => ({
  63. view_id: view.view_id,
  64. procedure_id: view.procedure_id,
  65. })),
  66. };
  67. const response: RegisterWorkResponse = await registerWork(registerInfo);
  68. console.log('Work registered successfully:', response);
  69. message.info('Work registered successfully');
  70. return { success: true, data: response.data, views: selectedViews };
  71. } catch (error) {
  72. console.error('Error registering work:', error);
  73. message.error(
  74. 'Error registering work, please check the console for details.'
  75. );
  76. return { success: false, views: [] };
  77. }
  78. };
  79. return (
  80. <>
  81. {screens.xl || screens.xxl ? (
  82. <Row className="flex-1 h-full">
  83. <Col
  84. xs={24}
  85. sm={24}
  86. md={8}
  87. lg={8}
  88. xl={8}
  89. xxl={8}
  90. style={{
  91. display: 'flex',
  92. flexDirection: 'column',
  93. }}
  94. className="h-full px-4"
  95. >
  96. <BasicInfoForm form={form} style={{ overflow: 'auto' }} />
  97. </Col>
  98. <Col xs={24} sm={24} md={8} lg={8} xl={8} xxl={8} className="h-full">
  99. <RegisterAvailableList />
  100. </Col>
  101. <Col xs={24} sm={24} md={8} lg={8} xl={8} xxl={8} className="h-full">
  102. <SelectedProtocolList />
  103. </Col>
  104. </Row>
  105. ) : screens.md || screens.lg ? (
  106. <Row className="h-full flex-1 ">
  107. <Col
  108. xs={24}
  109. sm={24}
  110. md={12}
  111. lg={12}
  112. className="h-full flex flex-column"
  113. >
  114. <BasicInfoForm
  115. form={form}
  116. style={{ overflow: 'auto', width: '100%' }}
  117. />
  118. </Col>
  119. <Col xs={24} sm={24} md={12} lg={12}>
  120. <Row gutter={[0, 16]}>
  121. <Col span={24}>
  122. <RegisterAvailableList />
  123. </Col>
  124. <Divider />
  125. <Col span={24}>
  126. <SelectedProtocolList className="" />
  127. </Col>
  128. </Row>
  129. </Col>
  130. </Row>
  131. ) : (
  132. <Collapse
  133. accordion
  134. defaultActiveKey={['1']}
  135. style={{ overflow: 'auto', height: '100%' }}
  136. >
  137. <Panel
  138. header={
  139. <FormattedMessage
  140. id="register.basicInfoPanel"
  141. defaultMessage="register.basicInfoPanel"
  142. />
  143. }
  144. key="1"
  145. >
  146. <BasicInfoForm form={form} />
  147. </Panel>
  148. <Panel
  149. header={
  150. <FormattedMessage
  151. id="register.protocolListPanel"
  152. defaultMessage="register.protocolListPanel"
  153. />
  154. }
  155. key="2"
  156. >
  157. <RegisterAvailableList />
  158. </Panel>
  159. <Panel
  160. header={
  161. <FormattedMessage
  162. id="register.selectedProtocolListPanel"
  163. defaultMessage="register.selectedProtocolListPanel"
  164. />
  165. }
  166. key="3"
  167. >
  168. <SelectedProtocolList />
  169. </Panel>
  170. </Collapse>
  171. )}
  172. <Space
  173. style={{
  174. position: 'fixed',
  175. bottom: '20px',
  176. right: '20px',
  177. zIndex: 1000,
  178. }}
  179. >
  180. <Button type="primary" onClick={handleRegister}>
  181. 注册
  182. </Button>
  183. <Button
  184. type="default"
  185. onClick={async () => {
  186. const registerResult = await handleRegister();
  187. if (registerResult.success && registerResult.data) {
  188. await registerToExam(registerResult.data);
  189. }
  190. }}
  191. >
  192. 检查
  193. </Button>
  194. </Space>
  195. </>
  196. );
  197. };
  198. export default RegisterPage;