RecognitionResult.vue 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <script setup lang="ts">
  2. import { inject, onMounted, useTemplateRef } from 'vue';
  3. import { message } from 'ant-design-vue';
  4. import SvgIcon from '@/components/SvgIcon.vue';
  5. import { useRequest } from '@/hooks/request';
  6. import { t } from '@/i18n';
  7. import { completeProtocolConfig, downloadUserProtocol, getProtocolBaseInfo, updateProtocolBaseInfo } from '@/api';
  8. import { downloadBlob } from '@/utils';
  9. import { FINISH_MODAL_GUIDANCE } from '@/constants/inject-key';
  10. import ProtocolContent from './ProtocolContent.vue';
  11. import type { SetupProtocolForm, UseGuideStepItemExpose, UseGuideStepItemProps } from '@/types';
  12. const props = defineProps<UseGuideStepItemProps<SetupProtocolForm>>();
  13. const { handleRequest } = useRequest();
  14. let fileName = '';
  15. onMounted(() => {
  16. handleRequest(async () => {
  17. const { protocolInfo } = props.form;
  18. const { id, protocolType, protocolName } = protocolInfo;
  19. fileName = `${protocolType} - ${protocolName}.xlsx`;
  20. if (id) {
  21. const data = await getProtocolBaseInfo(id);
  22. Object.assign(protocolInfo, data);
  23. }
  24. });
  25. });
  26. const reRecognize = () => {
  27. props.goToStep(props.stepIndex - 2);
  28. };
  29. const exportData = () => {
  30. handleRequest(async () => {
  31. await protocolContentRef.value?.isAtLeastOneParam();
  32. const { id } = props.form.protocolInfo;
  33. if (id) {
  34. const file = await downloadUserProtocol(id);
  35. downloadBlob(file, fileName);
  36. message.success(t('setupProtocol.downloadProtocolSuccessful', { name: fileName }));
  37. }
  38. });
  39. };
  40. const goBack = () => {
  41. reRecognize();
  42. return true;
  43. };
  44. const protocolContentRef = useTemplateRef('protocolContent');
  45. const finishModalGuidance = inject(FINISH_MODAL_GUIDANCE, undefined);
  46. const finish = async () => {
  47. await protocolContentRef.value?.validateProtocolInfo();
  48. await protocolContentRef.value?.isAtLeastOneParam();
  49. await updateProtocolBaseInfo(props.form.protocolInfo);
  50. await completeProtocolConfig(props.form.protocolInfo.id as number);
  51. finishModalGuidance?.();
  52. };
  53. defineExpose<UseGuideStepItemExpose>({
  54. exportData,
  55. goBack,
  56. finish,
  57. });
  58. </script>
  59. <template>
  60. <div class="result-container">
  61. <AButton class="icon-button recognize-button" @click="reRecognize">
  62. <SvgIcon name="reload" />
  63. {{ $t('setupProtocol.reRecognize') }}
  64. </AButton>
  65. <ProtocolContent ref="protocolContent" :info="form.protocolInfo" :is-recognized="true" />
  66. </div>
  67. </template>
  68. <style lang="scss" scoped>
  69. .result-container {
  70. position: relative;
  71. }
  72. .recognize-button {
  73. position: absolute;
  74. top: -103px;
  75. }
  76. </style>