SpecimenInfoForm.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. <template>
  2. <Dialog :title="dialogTitle" v-model="dialogVisible">
  3. <el-form
  4. ref="formRef"
  5. :model="formData"
  6. :rules="formRules"
  7. label-width="100px"
  8. v-loading="formLoading"
  9. >
  10. <el-form-item label="标本类型" prop="specimenType">
  11. <el-select v-model="formData.specimenType"
  12. placeholder="请选择标本类型">
  13. <el-option
  14. v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_TYPE)"
  15. :key="dict.value"
  16. :label="dict.label"
  17. :value="dict.value"
  18. />
  19. </el-select>
  20. </el-form-item>
  21. <el-form-item label="标本编号" prop="specimenNumber">
  22. <el-input v-model="formData.assetNumber" placeholder="请输入标本编号"/>
  23. </el-form-item>
  24. <el-form-item label="资产号" prop="assetNumber">
  25. <el-input v-model="formData.assetNumber" placeholder="请输入资产号"/>
  26. </el-form-item>
  27. <el-form-item label="存放位置" prop="storageLocation">
  28. <el-input v-model="formData.storageLocation" placeholder="请输入存放位置"/>
  29. </el-form-item>
  30. <el-form-item label="中文名称" prop="chineseName">
  31. <el-input v-model="formData.chineseName" placeholder="请输入中文名称"/>
  32. </el-form-item>
  33. <el-form-item label="英文名称" prop="englishName">
  34. <el-input v-model="formData.englishName" placeholder="请输入英文名称"/>
  35. </el-form-item>
  36. <el-form-item label="成分" prop="composition">
  37. <el-input v-model="formData.composition" placeholder="请输入成分"/>
  38. </el-form-item>
  39. <el-form-item label="产地" prop="origin">
  40. <el-input v-model="formData.origin" placeholder="请输入产地"/>
  41. </el-form-item>
  42. <el-form-item label="时代" prop="era">
  43. <el-input v-model="formData.era" placeholder="请输入时代"/>
  44. </el-form-item>
  45. <el-form-item label="保存地层" prop="preservedLayer">
  46. <el-input v-model="formData.preservedLayer" placeholder="请输入保存地层"/>
  47. </el-form-item>
  48. <el-form-item label="陨石类型" prop="meteoriteType">
  49. <el-input v-model="formData.meteoriteType" placeholder="请输入陨石类型"/>
  50. </el-form-item>
  51. <el-form-item label="国际命名" prop="internationalName">
  52. <el-input v-model="formData.internationalName" placeholder="请输入国际命名"/>
  53. </el-form-item>
  54. <el-form-item label="发现时间" prop="discoveryTime">
  55. <el-date-picker
  56. v-model="formData.discoveryTime"
  57. type="date"
  58. value-format="x"
  59. placeholder="选择发现时间"
  60. />
  61. </el-form-item>
  62. <el-form-item label="降落时间" prop="fallTime">
  63. <el-date-picker
  64. v-model="formData.fallTime"
  65. type="date"
  66. value-format="x"
  67. placeholder="选择降落时间"
  68. />
  69. </el-form-item>
  70. <el-form-item label="保存类型" prop="preservationType">
  71. <el-select v-model="formData.preservationType"
  72. placeholder="请选择保存类型">
  73. <el-option
  74. v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_INFO)"
  75. :key="dict.value"
  76. :label="dict.label"
  77. :value="dict.value"
  78. />
  79. </el-select>
  80. </el-form-item>
  81. <el-form-item label="尺寸" prop="size">
  82. <el-input v-model="formData.size" placeholder="请输入尺寸"/>
  83. </el-form-item>
  84. <el-form-item label="重量" prop="weight">
  85. <el-input v-model="formData.weight" placeholder="请输入重量"/>
  86. </el-form-item>
  87. <el-form-item label="来源" prop="source">
  88. <el-select v-model="formData.source" placeholder="请选择来源">
  89. <el-option
  90. v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SOURCE)"
  91. :key="dict.value"
  92. :label="dict.label"
  93. :value="dict.value"
  94. />
  95. </el-select>
  96. </el-form-item>
  97. <el-form-item label="标本提供者" prop="provider">
  98. <el-input v-model="formData.provider" placeholder="请输入标本提供者"/>
  99. </el-form-item>
  100. <el-form-item label="入藏时间" prop="acquisitionTime">
  101. <el-date-picker
  102. v-model="formData.acquisitionTime"
  103. type="date"
  104. value-format="x"
  105. placeholder="选择入藏时间"
  106. />
  107. </el-form-item>
  108. <el-form-item label="用途" prop="purpose">
  109. <el-input v-model="formData.purpose" placeholder="请输入用途"/>
  110. </el-form-item>
  111. <el-form-item label="描述" prop="description">
  112. <Editor v-model="formData.description" height="150px"/>
  113. </el-form-item>
  114. <el-form-item label="馆藏状态" prop="collectionStatus">
  115. <el-radio-group v-model="formData.collectionStatus">
  116. <el-radio
  117. v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_COLLECTION_STATUS)"
  118. :key="dict.value"
  119. :label="dict.value"
  120. >
  121. {{ dict.label }}
  122. </el-radio>
  123. </el-radio-group>
  124. </el-form-item>
  125. <el-form-item label="备注" prop="notes">
  126. <el-input v-model="formData.notes" placeholder="请输入备注"/>
  127. </el-form-item>
  128. <el-form-item label="图片名称" prop="imageName">
  129. <el-input v-model="formData.imageName" placeholder="请输入图片名称"/>
  130. </el-form-item>
  131. <el-form-item label="图片路径" prop="imagePath">
  132. <UploadImg v-model="formData.imagePath" />
  133. <!-- <el-upload-->
  134. <!-- v-model="formData.imagePath"-->
  135. <!-- class="upload-demo"-->
  136. <!-- drag-->
  137. <!-- :action="importUrl + '?updateSupport=' + updateSupport"-->
  138. <!-- :on-success="submitFormSuccess"-->
  139. <!-- style="max-width:250px;max-height: 20vh;margin-left: 20px"-->
  140. <!-- >-->
  141. <!-- <el-icon class="el-icon&#45;&#45;upload"><upload-filled /></el-icon>-->
  142. <!-- <div class="el-upload__text">-->
  143. <!-- <em>点击批量上传图片</em>-->
  144. <!-- </div>-->
  145. <!-- <template #tip>-->
  146. <!-- <div class="el-upload__tip">-->
  147. <!-- <el-checkbox v-model="updateSupport" />-->
  148. <!-- 是否更新已经存在的标本图片-->
  149. <!-- </div>-->
  150. <!-- </template>-->
  151. <!-- </el-upload>-->
  152. </el-form-item>
  153. <el-form-item label="注销原因" prop="deletedReason">
  154. <el-input v-model="formData.deletedReason" placeholder="请输入注销原因"/>
  155. </el-form-item>
  156. <el-form-item label="入库操作员" prop="operator">
  157. <el-input v-model="formData.operator" placeholder="请输入入库操作员"/>
  158. </el-form-item>
  159. <el-form-item label="入库时间" prop="entryDate">
  160. <el-date-picker
  161. v-model="formData.entryDate"
  162. type="date"
  163. value-format="x"
  164. placeholder="选择入库时间"
  165. />
  166. </el-form-item>
  167. </el-form>
  168. <template #footer>
  169. <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
  170. <el-button @click="dialogVisible = false">取 消</el-button>
  171. </template>
  172. </Dialog>
  173. </template>
  174. <script setup lang="ts">
  175. import {getIntDictOptions, DICT_TYPE} from '@/utils/dict'
  176. import {SpecimenInfoApi, SpecimenInfoVO} from '@/api/museums/specimeninfo'
  177. //import type {UploadProps, UploadUserFile} from 'element-plus'
  178. import { UploadFilled } from '@element-plus/icons-vue'
  179. import { ref, reactive, defineExpose, defineEmits } from 'vue'
  180. //import {log} from "echarts/types/src/util/log";
  181. /** 标本管理 表单 */
  182. defineOptions({name: 'SpecimenInfoForm'})
  183. const {t} = useI18n() // 国际化
  184. const message = useMessage() // 消息弹窗
  185. const dialogVisible = ref(false) // 弹窗的是否展示
  186. const dialogTitle = ref('') // 弹窗的标题
  187. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  188. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  189. const formData = ref({
  190. id: undefined,
  191. specimenType: undefined,
  192. specimenNumber: undefined,
  193. assetNumber: undefined,
  194. storageLocation: undefined,
  195. chineseName: undefined,
  196. englishName: undefined,
  197. composition: undefined,
  198. origin: undefined,
  199. era: undefined,
  200. preservedLayer: undefined,
  201. meteoriteType: undefined,
  202. internationalName: undefined,
  203. discoveryTime: undefined,
  204. fallTime: undefined,
  205. preservationType: undefined,
  206. size: undefined,
  207. weight: undefined,
  208. source: undefined,
  209. provider: undefined,
  210. acquisitionTime: undefined,
  211. purpose: undefined,
  212. description: undefined,
  213. collectionStatus: undefined,
  214. notes: undefined,
  215. imageName: undefined,
  216. imagePath: undefined,
  217. deletedReason: undefined,
  218. operator: undefined,
  219. entryDate: undefined
  220. })
  221. const formRules = reactive({
  222. specimenType: [{
  223. required: true,
  224. message: '标本类型(矿物、岩石矿石、化石、陨石)不能为空',
  225. trigger: 'change'
  226. }],
  227. specimenNumber: [{required: true, message: '标本编号不能为空', trigger: 'blur'}]
  228. })
  229. const formRef = ref() // 表单 Ref
  230. const updateSupport = ref(0) // 是否更新已经存在的用户数据
  231. const importUrl =
  232. import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/museums/specimen-info/import-specimen-images'
  233. /** 打开弹窗 */
  234. const open = async (type: string, id?: number) => {
  235. dialogVisible.value = true
  236. dialogTitle.value = t('action.' + type)
  237. formType.value = type
  238. //updateSupport.value = 0
  239. resetForm()
  240. // 修改时,设置数据
  241. if (id) {
  242. formLoading.value = true
  243. try {
  244. formData.value = await SpecimenInfoApi.getSpecimenInfo(id)
  245. } finally {
  246. formLoading.value = false
  247. }
  248. }
  249. }
  250. defineExpose({open}) // 提供 open 方法,用于打开弹窗
  251. /** 提交表单 */
  252. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  253. const submitForm = async () => {
  254. // 校验表单
  255. await formRef.value.validate()
  256. // 提交请求
  257. formLoading.value = true
  258. try {
  259. const data = formData.value as unknown as SpecimenInfoVO
  260. if (formType.value === 'create') {
  261. await SpecimenInfoApi.createSpecimenInfo(data)
  262. message.success(t('common.createSuccess'))
  263. } else {
  264. await SpecimenInfoApi.updateSpecimenInfo(data)
  265. message.success(t('common.updateSuccess'))
  266. }
  267. dialogVisible.value = false
  268. // 发送操作成功的事件
  269. emit('success')
  270. } finally {
  271. formLoading.value = false
  272. }
  273. }
  274. /**图片上传**/
  275. // /** 图片上传成功 */
  276. //
  277. // const submitFormSuccess = (response: any) => {
  278. // console.log('tj',response)
  279. // if (response.code !== 0) {
  280. // message.error(response.msg)
  281. // formLoading.value = false
  282. // return
  283. // }
  284. // formLoading.value = false
  285. // dialogVisible.value = false
  286. // // 发送操作成功的事件
  287. //
  288. // }
  289. /** 重置表单 */
  290. const resetForm = () => {
  291. formData.value = {
  292. id: undefined,
  293. specimenType: undefined,
  294. specimenNumber: undefined,
  295. assetNumber: undefined,
  296. storageLocation: undefined,
  297. chineseName: undefined,
  298. englishName: undefined,
  299. composition: undefined,
  300. origin: undefined,
  301. era: undefined,
  302. preservedLayer: undefined,
  303. meteoriteType: undefined,
  304. internationalName: undefined,
  305. discoveryTime: undefined,
  306. fallTime: undefined,
  307. preservationType: undefined,
  308. size: undefined,
  309. weight: undefined,
  310. source: undefined,
  311. provider: undefined,
  312. acquisitionTime: undefined,
  313. purpose: undefined,
  314. description: undefined,
  315. collectionStatus: undefined,
  316. notes: undefined,
  317. imageName: undefined,
  318. imagePath: undefined,
  319. deletedReason: undefined,
  320. operator: undefined,
  321. entryDate: undefined
  322. }
  323. formRef.value?.resetFields()
  324. }
  325. </script>