Application.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. <template>
  2. <div class="application-dialog-container">
  3. <el-dialog
  4. :title="state.dialog.title"
  5. @close="onCancel"
  6. :close-on-click-modal="false"
  7. v-model="state.dialog.isShowDialog"
  8. width="100%"
  9. >
  10. <el-form
  11. ref="expertDialogFormRef"
  12. :model="state.form"
  13. :rules="rules"
  14. size="default"
  15. label-width="140px"
  16. label-position="top"
  17. >
  18. <h4 class="mb8 mt8">基本信息</h4>
  19. <el-row :gutter="20">
  20. <el-col :span="12">
  21. <el-form-item
  22. label="课题名称"
  23. prop="projectGroupId"
  24. >
  25. <el-select
  26. v-model="state.form.projectGroupId"
  27. placeholder="请选择"
  28. >
  29. <el-option
  30. v-for="item in projects"
  31. :key="item.id"
  32. :label="item.projectName"
  33. :value="item.id"
  34. />
  35. </el-select>
  36. </el-form-item>
  37. </el-col>
  38. <el-col :span="12">
  39. <el-form-item
  40. label="姓名"
  41. prop="group"
  42. >
  43. <el-input
  44. v-model="userInfos.userName"
  45. disabled
  46. />
  47. </el-form-item>
  48. </el-col>
  49. </el-row>
  50. <h4 class="mb8 mt10">实验动物笼位预约信息</h4>
  51. <el-row
  52. class="mt10"
  53. :gutter="20"
  54. >
  55. <el-col :span="12">
  56. <el-form-item
  57. label="笼位数量"
  58. prop="number"
  59. >
  60. <el-input-number
  61. v-model="state.form.number"
  62. style="width: 100%"
  63. :min="1"
  64. />
  65. </el-form-item>
  66. </el-col>
  67. <el-col :span="12">
  68. <el-form-item
  69. label="选择时间"
  70. prop="startDate"
  71. >
  72. <el-date-picker
  73. v-model="state.form.startDate"
  74. type="date"
  75. placeholder="请选择时间"
  76. clearable
  77. style="width: 100%"
  78. />
  79. </el-form-item>
  80. </el-col>
  81. </el-row>
  82. <el-row
  83. class="mt10"
  84. :gutter="20"
  85. >
  86. <el-col :span="12">
  87. <el-form-item
  88. label="品种品系"
  89. prop="categoryId"
  90. >
  91. <el-select
  92. v-model="state.form.categoryId"
  93. placeholder="请选择"
  94. >
  95. <el-option
  96. v-for="item in animalTypeList"
  97. :key="item.id"
  98. :label="item.name"
  99. :value="item.id"
  100. />
  101. </el-select>
  102. </el-form-item>
  103. </el-col>
  104. <el-col :span="12">
  105. <el-form-item
  106. label="级别"
  107. prop="level"
  108. >
  109. <el-select
  110. v-model="state.form.level"
  111. placeholder="请选择"
  112. >
  113. <el-option
  114. v-for="item in LeavelList"
  115. :key="item.id"
  116. :label="item.name"
  117. :value="item.id"
  118. />
  119. </el-select>
  120. </el-form-item>
  121. </el-col>
  122. </el-row>
  123. <el-row
  124. class="mt10"
  125. :gutter="20"
  126. >
  127. <el-col :span="12">
  128. <el-form-item
  129. label="雄性"
  130. prop="maleNumber"
  131. >
  132. <el-input-number
  133. style="width: 100%"
  134. placeholder="雄性数量"
  135. v-model="state.form.maleNumber"
  136. :min="0"
  137. />
  138. </el-form-item>
  139. </el-col>
  140. <el-col :span="12">
  141. <el-form-item
  142. label="雌性"
  143. prop="famaleNumber"
  144. >
  145. <el-input-number
  146. style="width: 100%"
  147. placeholder="雌性数量"
  148. v-model="state.form.famaleNumber"
  149. :min="0"
  150. />
  151. </el-form-item>
  152. </el-col>
  153. <!-- <el-col :span="24">
  154. <el-form-item
  155. label="数量(雄性+雌性)"
  156. prop="maleNumber"
  157. >
  158. <div style="width: 100%; display: flex; justify-content: space-between">
  159. <el-input-number
  160. placeholder="雄性数量"
  161. v-model="state.form.maleNumber"
  162. :min="0"
  163. />
  164. +
  165. <el-input-number
  166. placeholder="雌性数量"
  167. v-model="state.form.famaleNumber"
  168. :min="0"
  169. />
  170. </div>
  171. <div style="width: 100%; margin-top: 10px">
  172. <el-input
  173. placeholder="总数"
  174. v-model="animalNumber"
  175. />
  176. </div>
  177. </el-form-item>
  178. </el-col> -->
  179. </el-row>
  180. <el-row
  181. class="mt10"
  182. :gutter="20"
  183. >
  184. <el-col :span="24">
  185. <el-form-item
  186. label="体重"
  187. prop="weight"
  188. >
  189. <el-input-number
  190. v-model="state.form.weight"
  191. style="width: 100%"
  192. :min="0"
  193. />
  194. </el-form-item>
  195. </el-col>
  196. </el-row>
  197. <el-row
  198. class="mt10"
  199. :gutter="20"
  200. >
  201. <el-col :span="24">
  202. <el-form-item
  203. label="周龄"
  204. prop="age"
  205. >
  206. <el-input-number
  207. v-model="state.form.age"
  208. style="width: 100%"
  209. :min="0"
  210. />
  211. </el-form-item>
  212. </el-col>
  213. </el-row>
  214. <el-row
  215. class="mt10"
  216. :gutter="20"
  217. >
  218. <el-col :span="24">
  219. <el-form-item
  220. label="饲养总天数"
  221. prop="feedingDay"
  222. >
  223. <el-input-number
  224. v-model="state.form.feedingDay"
  225. style="width: 100%"
  226. :min="1"
  227. />
  228. </el-form-item>
  229. </el-col>
  230. </el-row>
  231. <h4 class="mb8 mt20">采购渠道</h4>
  232. <el-row
  233. class="mt10"
  234. :gutter="20"
  235. >
  236. <el-col :span="24">
  237. <el-form-item
  238. label="采购渠道"
  239. prop="buyFrom"
  240. >
  241. <el-radio-group v-model="state.form.buyFrom">
  242. <el-radio
  243. :label="ProcurementChannels.PURCHASED_BY_OTHERS"
  244. size="large"
  245. >
  246. 动物房代购
  247. </el-radio>
  248. <el-radio
  249. :label="ProcurementChannels.PURCHASED_BY_MYSELF"
  250. size="large"
  251. >
  252. 自行购买
  253. </el-radio>
  254. </el-radio-group>
  255. </el-form-item>
  256. </el-col>
  257. </el-row>
  258. <el-row
  259. v-if="state.form.buyFrom === ProcurementChannels.PURCHASED_BY_MYSELF"
  260. class="mt10"
  261. :gutter="20"
  262. >
  263. <el-col :span="24">
  264. <el-form-item
  265. label="外购来源单位"
  266. prop="comeFromUnit"
  267. >
  268. <el-input v-model="state.form.comeFromUnit" />
  269. </el-form-item>
  270. </el-col>
  271. </el-row>
  272. <el-row
  273. class="mt10"
  274. :gutter="20"
  275. >
  276. <el-col :span="24">
  277. <el-form-item
  278. label="动物到达时间"
  279. prop="comeTime"
  280. >
  281. <el-date-picker
  282. v-model="state.form.comeTime"
  283. type="date"
  284. placeholder="请选择到达时间"
  285. clearable
  286. style="width: 100%"
  287. />
  288. </el-form-item>
  289. </el-col>
  290. </el-row>
  291. <el-row
  292. class="mt10"
  293. :gutter="20"
  294. v-if="state.form.buyFrom === ProcurementChannels.PURCHASED_BY_MYSELF"
  295. >
  296. <el-col :span="24">
  297. <el-form-item
  298. label="生产许可证副本"
  299. prop="licenseNumberFile"
  300. :rules="{ required: state.form.buyFrom === ProcurementChannels.PURCHASED_BY_MYSELF, message: '不能为空', trigger: 'change' }"
  301. >
  302. <el-upload
  303. v-model:file-list="licenseNumberFileList"
  304. class="upload-demo"
  305. :action="uploadUrl"
  306. :limit="1"
  307. style="width: 100%"
  308. :before-upload="beforeAvatarFileUpload"
  309. :on-remove="() => handleRemove(UploadFileType.LICENSE_NUMBER)"
  310. :on-success="(res: any, file: UploadFile) => handleSuccess(res, UploadFileType.LICENSE_NUMBER, file)"
  311. >
  312. <el-button type="primary">点击上传</el-button>
  313. <div class="el-upload__tip ml10">支持格式:jpg png pdf等,单个文件不超过20MB</div>
  314. </el-upload>
  315. </el-form-item>
  316. </el-col>
  317. </el-row>
  318. <el-row
  319. class="mt10"
  320. :gutter="20"
  321. v-if="state.form.buyFrom === ProcurementChannels.PURCHASED_BY_MYSELF"
  322. >
  323. <el-col :span="24">
  324. <el-form-item
  325. label="近三个月动物质量检测证明"
  326. prop="animalTestDateFile"
  327. :rules="{ required: state.form.buyFrom === ProcurementChannels.PURCHASED_BY_MYSELF, message: '不能为空', trigger: 'change' }"
  328. >
  329. <el-upload
  330. v-model:file-list="animalTestDateFileList"
  331. class="upload-demo"
  332. :action="uploadUrl"
  333. :limit="1"
  334. style="width: 100%"
  335. :before-upload="beforeAvatarFileUpload"
  336. :on-remove="() => handleRemove(UploadFileType.ANIMAL_TEST_DATE)"
  337. :on-success="(res: any, file: UploadFile) => handleSuccess(res, UploadFileType.ANIMAL_TEST_DATE, file)"
  338. >
  339. <el-button type="primary">点击上传</el-button>
  340. <div class="el-upload__tip ml10">支持格式:jpg png pdf等,单个文件不超过20MB</div>
  341. </el-upload>
  342. </el-form-item>
  343. </el-col>
  344. </el-row>
  345. <el-row
  346. class="mt10"
  347. :gutter="20"
  348. v-if="state.form.buyFrom === ProcurementChannels.PURCHASED_BY_MYSELF"
  349. >
  350. <el-col :span="24">
  351. <el-form-item
  352. label="基因鉴定报告"
  353. prop="geneIdentificationFile"
  354. >
  355. <el-upload
  356. v-model:file-list="geneIdentificationFileList"
  357. class="upload-demo"
  358. :action="uploadUrl"
  359. :limit="1"
  360. style="width: 100%"
  361. :before-upload="beforeAvatarFileUpload"
  362. :on-remove="() => handleRemove(UploadFileType.ENV_TEST_DATE)"
  363. :on-success="(res: any, file: UploadFile) => handleSuccess(res, UploadFileType.ENV_TEST_DATE, file)"
  364. >
  365. <el-button type="primary">点击上传</el-button>
  366. <div class="el-upload__tip ml10">支持格式:jpg png pdf等,单个文件不超过20MB</div>
  367. </el-upload>
  368. </el-form-item>
  369. </el-col>
  370. </el-row>
  371. <h4 class="mb8 mt20">特殊要求和附件</h4>
  372. <el-row
  373. class="mt10"
  374. :gutter="20"
  375. >
  376. <el-col :span="24">
  377. <el-form-item
  378. label="是否有特殊饲养要求"
  379. prop="hasFeedingSpecial"
  380. >
  381. <el-radio-group v-model="state.form.hasFeedingSpecial">
  382. <el-radio
  383. :label="FeedingSpecial.HAVE_FEEDING_SPECIAL"
  384. size="large"
  385. >
  386. </el-radio>
  387. <el-radio
  388. :label="FeedingSpecial.NO_FEEDING_SPECIAL"
  389. size="large"
  390. >
  391. </el-radio>
  392. </el-radio-group>
  393. </el-form-item>
  394. </el-col>
  395. </el-row>
  396. <el-row
  397. class="mt10"
  398. :gutter="20"
  399. >
  400. <el-col
  401. :span="24"
  402. v-if="state.form.hasFeedingSpecial === FeedingSpecial.HAVE_FEEDING_SPECIAL"
  403. >
  404. <el-form-item
  405. label="特殊饲养要求"
  406. prop="feedingSpecialDesc"
  407. >
  408. <el-input
  409. placeholder="输入特殊饲养要求,如每天更换垫料等"
  410. v-model="state.form.feedingSpecialDesc"
  411. />
  412. </el-form-item>
  413. </el-col>
  414. </el-row>
  415. <!-- <el-row
  416. class="mt10"
  417. :gutter="20"
  418. >
  419. <el-col :span="24">
  420. <el-form-item
  421. label="笼位预约表"
  422. prop="cageAppointFile"
  423. >
  424. <el-upload
  425. v-model:file-list="cageAppointFileList"
  426. class="upload-demo"
  427. :action="uploadUrl"
  428. :limit="1"
  429. style="width: 100%"
  430. :before-upload="beforeAvatarFileUpload"
  431. :on-remove="() => handleRemove(UploadFileType.CAGE_APPOINT_FILE)"
  432. :on-success="(res: any, file: UploadFile) => handleSuccess(res, UploadFileType.CAGE_APPOINT_FILE, file)"
  433. >
  434. <el-button type="primary">点击上传</el-button>
  435. <div class="el-upload__tip ml10">支持格式:jpg png pdf等,单个文件不超过20MB</div>
  436. </el-upload>
  437. </el-form-item>
  438. </el-col>
  439. </el-row> -->
  440. <el-row
  441. class="mt10"
  442. :gutter="20"
  443. >
  444. <el-col :span="24">
  445. <el-form-item
  446. label="实验动物福利伦理审查申请表"
  447. prop="ethicsCheckFile"
  448. >
  449. <el-upload
  450. v-model:file-list="ethicsCheckFileList"
  451. class="upload-demo"
  452. :action="uploadUrl"
  453. :limit="1"
  454. style="width: 100%"
  455. :before-upload="beforeAvatarFileUpload"
  456. :on-remove="() => handleRemove(UploadFileType.ETHICS_CHECK_FILE)"
  457. :on-success="(res: any, file: UploadFile) => handleSuccess(res, UploadFileType.ETHICS_CHECK_FILE, file)"
  458. >
  459. <el-button type="primary">点击上传</el-button>
  460. <div class="el-upload__tip ml10">支持格式:jpg png pdf等,单个文件不超过20MB</div>
  461. </el-upload>
  462. </el-form-item>
  463. </el-col>
  464. </el-row>
  465. <el-row
  466. class="mt10"
  467. :gutter="20"
  468. >
  469. <el-col :span="24">
  470. <el-form-item
  471. label="实验动物福利伦理审查意见表"
  472. prop="ethicsAdviceFile"
  473. >
  474. <el-upload
  475. v-model:file-list="ethicsAdviceFileList"
  476. class="upload-demo"
  477. :action="uploadUrl"
  478. :limit="1"
  479. style="width: 100%"
  480. :before-upload="beforeAvatarFileUpload"
  481. :on-remove="() => handleRemove(UploadFileType.ETHICS_ADVICE_FILE)"
  482. :on-success="(res: any, file: UploadFile) => handleSuccess(res, UploadFileType.ETHICS_ADVICE_FILE, file)"
  483. >
  484. <el-button type="primary">点击上传</el-button>
  485. <div class="el-upload__tip ml10">支持格式:jpg png pdf等,单个文件不超过20MB</div>
  486. </el-upload>
  487. </el-form-item>
  488. </el-col>
  489. </el-row>
  490. <el-checkbox
  491. style="margin-top: 30px; margin-bottom: 30px"
  492. v-model="safePromise"
  493. >
  494. <div class="safePromise">
  495. 本人(以上所述课题的负责人)谨此声明:本项目所包含的实验动物、实验方法、实验材料及试剂无放射性、感染性和化学毒性,所有参与实验人员在实验过程中自愿遵守遵义医科大学附属医院实验动物房的管理制度和操作流程,愿意根据其规定的付费方式向遵义医科大学附属医院实验动物房支付所有的费用。
  496. </div>
  497. </el-checkbox>
  498. </el-form>
  499. <template #footer>
  500. <span class="dialog-footer">
  501. <el-button
  502. type="info"
  503. @click="onCancel"
  504. size="default"
  505. >
  506. 取 消
  507. </el-button>
  508. <el-button
  509. color="#2c78ff"
  510. @click="onSubmit()"
  511. size="default"
  512. >
  513. 提交
  514. </el-button>
  515. </span>
  516. </template>
  517. </el-dialog>
  518. </div>
  519. </template>
  520. <script setup lang="ts" name="systemProDialog">
  521. import { reactive, ref, computed } from 'vue'
  522. import to from 'await-to-js'
  523. import { ElMessage } from 'element-plus'
  524. import { UploadFile } from 'element-plus/es/components'
  525. import dayjs from 'dayjs'
  526. import { storeToRefs } from 'pinia'
  527. import { usePlatAnimalCageApplicationApi } from '/@/api/platform/animal'
  528. import { LeavelList } from '/@/constants/pageConstants'
  529. import { deepClone } from '/@/utils/other'
  530. import { useUserInfo } from '/@/stores/userInfo'
  531. import { ProcurementChannels, FeedingSpecial, UploadFileType } from '/@/constants/pageConstants'
  532. const uploadUrl = (import.meta as any).env.VITE_UPLOAD
  533. const stores = useUserInfo()
  534. const { userInfos } = storeToRefs(stores)
  535. // 定义子组件向父组件传值/事件
  536. const emit = defineEmits(['refresh'])
  537. const platAnimalCageApplicationApi = usePlatAnimalCageApplicationApi()
  538. const expertDialogFormRef = ref()
  539. const projectGroupList = ref<any[]>([])
  540. const projects = ref<any[]>([])
  541. const rules = {
  542. projectGroupId: { required: true, message: '不能为空', trigger: 'change' },
  543. categoryId: { required: true, message: '不能为空', trigger: 'change' },
  544. number: { required: true, message: '不能为空', trigger: 'change' },
  545. startDate: { required: true, message: '不能为空', trigger: 'change' },
  546. // maleNumber: { required: true, message: '不能为空', trigger: 'change' },
  547. // weight: { required: true, message: '不能为空', trigger: 'change' },
  548. buyFrom: { required: true, message: '不能为空', trigger: 'change' },
  549. feedingDay: { required: true, message: '不能为空', trigger: 'change' },
  550. comeFromUnit: { required: true, message: '不能为空', trigger: 'change' },
  551. feedingSpecialDesc: { required: true, message: '不能为空', trigger: 'change' },
  552. ethicsCheckFile: { required: true, message: '不能为空', trigger: 'change' },
  553. ethicsAdviceFile: { required: true, message: '不能为空', trigger: 'change' },
  554. }
  555. // const animalNumber = computed(() => {
  556. // const maleNumber = state.form.maleNumber || 0
  557. // const famaleNumber = state.form.famaleNumber || 0
  558. // return maleNumber + famaleNumber
  559. // })
  560. const licenseNumberFileList = ref<UploadFile[]>([])
  561. const animalTestDateFileList = ref<UploadFile[]>([])
  562. const geneIdentificationFileList = ref<UploadFile[]>([])
  563. const cageAppointFileList = ref<UploadFile[]>([])
  564. const ethicsCheckFileList = ref<UploadFile[]>([])
  565. const ethicsAdviceFileList = ref<UploadFile[]>([])
  566. const safePromise = ref<boolean>(false)
  567. const animalTypeList = ref<any[]>([])
  568. const state = reactive({
  569. form: {
  570. projectGroupName: '',
  571. projectGroupId: null,
  572. categoryName: '',
  573. categoryId: null,
  574. level: null,
  575. number: 1,
  576. startDate: '',
  577. maleNumber: 0,
  578. famaleNumber: 0,
  579. weight: 0,
  580. age: 0,
  581. feedingDay: 0,
  582. buyFrom: ProcurementChannels.PURCHASED_BY_OTHERS,
  583. comeTime: '',
  584. comeFromUnit: '',
  585. licenseNumberFile: [],
  586. animalTestDateFile: [],
  587. geneIdentificationFile: [],
  588. hasFeedingSpecial: FeedingSpecial.HAVE_FEEDING_SPECIAL,
  589. feedingSpecialDesc: '',
  590. cageAppointFile: [],
  591. ethicsCheckFile: [],
  592. ethicsAdviceFile: [],
  593. },
  594. safePromise: false,
  595. safeRead: false,
  596. dialog: {
  597. isShowDialog: false,
  598. type: '',
  599. title: '',
  600. submitTxt: '',
  601. },
  602. })
  603. const getDicts = () => {
  604. Promise.all([
  605. platAnimalCageApplicationApi.getAnimalTypeList({}),
  606. platAnimalCageApplicationApi.getProjectGroup({}),
  607. ]).then(([animalType, projectGroup]) => {
  608. animalTypeList.value = animalType.data
  609. if (projectGroup && projectGroup.data) {
  610. projectGroupList.value = projectGroup.data
  611. const currentProject = projectGroup.data[0]?.projects
  612. if (currentProject) {
  613. projects.value = currentProject
  614. }
  615. }
  616. })
  617. }
  618. // 打开弹窗
  619. const openDialog = async (type: 'add' | 'edit') => {
  620. getDicts()
  621. state.dialog.type = type
  622. state.dialog.isShowDialog = true
  623. }
  624. // 关闭弹窗
  625. const closeDialog = () => {
  626. expertDialogFormRef.value.resetFields()
  627. state.dialog.isShowDialog = false
  628. }
  629. // 取消
  630. const onCancel = () => {
  631. closeDialog()
  632. }
  633. const beforeAvatarFileUpload = (file: { size: number }) => {
  634. let isLt10m = file.size / 1024 / 1024 / 20 < 1
  635. if (!isLt10m) {
  636. ElMessage.error('上传文件大小不能超过 20MB!')
  637. return false
  638. }
  639. return true
  640. }
  641. const handleRemove = (type: UploadFileType) => {
  642. if (type === UploadFileType.LICENSE_NUMBER) {
  643. licenseNumberFileList.value = []
  644. state.form.licenseNumberFile = []
  645. } else if (type === UploadFileType.ANIMAL_TEST_DATE) {
  646. animalTestDateFileList.value = []
  647. state.form.animalTestDateFile = []
  648. } else if (type === UploadFileType.ENV_TEST_DATE) {
  649. geneIdentificationFileList.value = []
  650. state.form.geneIdentificationFile = []
  651. } else if (type === UploadFileType.CAGE_APPOINT_FILE) {
  652. cageAppointFileList.value = []
  653. state.form.cageAppointFile = []
  654. } else if (type === UploadFileType.ETHICS_CHECK_FILE) {
  655. ethicsCheckFileList.value = []
  656. state.form.ethicsCheckFile = []
  657. } else if (type === UploadFileType.ETHICS_ADVICE_FILE) {
  658. ethicsAdviceFileList.value = []
  659. state.form.ethicsAdviceFile = []
  660. }
  661. }
  662. const handleSuccess = (res: { Data: string }, type: UploadFileType, file: UploadFile) => {
  663. console.log('ressss', res, file)
  664. if (type === UploadFileType.LICENSE_NUMBER) {
  665. state.form.licenseNumberFile = [{ name: file.name, url: res?.Data }]
  666. } else if (type === UploadFileType.ANIMAL_TEST_DATE) {
  667. state.form.animalTestDateFile = [{ name: file.name, url: res?.Data }]
  668. } else if (type === UploadFileType.ENV_TEST_DATE) {
  669. state.form.geneIdentificationFile = [{ name: file.name, url: res?.Data }]
  670. } else if (type === UploadFileType.CAGE_APPOINT_FILE) {
  671. state.form.cageAppointFile = [{ name: file.name, url: res?.Data }]
  672. } else if (type === UploadFileType.ETHICS_CHECK_FILE) {
  673. state.form.ethicsCheckFile = [{ name: file.name, url: res?.Data }]
  674. } else if (type === UploadFileType.ETHICS_ADVICE_FILE) {
  675. state.form.ethicsAdviceFile = [{ name: file.name, url: res?.Data }]
  676. }
  677. }
  678. // 提交
  679. const onSubmit = async () => {
  680. expertDialogFormRef.value.validate(async (valid: boolean) => {
  681. if (!valid) return
  682. if (!safePromise.value) {
  683. ElMessage.error('请阅读并勾选安全承诺!')
  684. return
  685. }
  686. if (!state.form.maleNumber && !state.form.famaleNumber) {
  687. ElMessage.error('请输入雄性或雌性数量!')
  688. return
  689. }
  690. const params = {
  691. ...deepClone(state.form),
  692. categoryName: animalTypeList.value.find((item) => item.id == state.form.categoryId)?.name,
  693. projectGroupName: projects.value.find((item) => item.id == state.form.projectGroupId)?.projectName,
  694. startDate: dayjs(state.form.startDate).format('YYYY-MM-DD'),
  695. comeTime: state.form.comeTime ? dayjs(state.form.comeTime).format('YYYY-MM-DD') : '',
  696. licenseNumberFile: JSON.stringify(state.form.licenseNumberFile),
  697. animalTestDateFile: JSON.stringify(state.form.animalTestDateFile),
  698. geneIdentificationFile: JSON.stringify(state.form.geneIdentificationFile),
  699. cageAppointFile: JSON.stringify(state.form.cageAppointFile),
  700. ethicsCheckFile: JSON.stringify(state.form.ethicsCheckFile),
  701. ethicsAdviceFile: JSON.stringify(state.form.ethicsAdviceFile),
  702. }
  703. Object.entries(params).forEach(([key, value]) => {
  704. if (value === '' || value === null) {
  705. delete params[key as keyof typeof params]
  706. }
  707. })
  708. const post = platAnimalCageApplicationApi.create
  709. const [err]: ToResponse = await to(post(params))
  710. if (err) return
  711. ElMessage.success('操作成功')
  712. closeDialog()
  713. emit('refresh')
  714. })
  715. }
  716. // 暴露变量
  717. defineExpose({
  718. openDialog,
  719. })
  720. </script>
  721. <style lang="scss" scoped>
  722. .application-dialog-container {
  723. .el-select {
  724. width: 100%;
  725. }
  726. .el-dialog {
  727. max-height: 80%;
  728. overflow: auto;
  729. }
  730. .safePromise {
  731. white-space: pre-wrap;
  732. }
  733. }
  734. h4 {
  735. font-size: 18px;
  736. }
  737. ul {
  738. padding-left: 20px;
  739. }
  740. .text {
  741. p {
  742. text-indent: 2em;
  743. }
  744. }
  745. .el-upload + .el-button {
  746. vertical-align: top;
  747. }
  748. </style>