WarehouseForm.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <!-- ERP 仓库表单 -->
  2. <template>
  3. <Dialog :title="dialogTitle" v-model="dialogVisible">
  4. <el-form
  5. ref="formRef"
  6. :model="formData"
  7. :rules="formRules"
  8. label-width="100px"
  9. v-loading="formLoading"
  10. >
  11. <el-form-item label="仓库名称" prop="name">
  12. <el-input v-model="formData.name" placeholder="请输入仓库名称" />
  13. </el-form-item>
  14. <el-form-item label="仓库地址" prop="address">
  15. <el-input v-model="formData.address" placeholder="请输入仓库地址" />
  16. </el-form-item>
  17. <el-form-item label="仓库状态" prop="status">
  18. <el-radio-group v-model="formData.status">
  19. <el-radio
  20. v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
  21. :key="dict.value"
  22. :label="dict.value"
  23. >
  24. {{ dict.label }}
  25. </el-radio>
  26. </el-radio-group>
  27. </el-form-item>
  28. <el-form-item label="仓储费" prop="warehousePrice">
  29. <el-input-number
  30. v-model="formData.warehousePrice"
  31. placeholder="请输入仓储费,单位:元/天/KG"
  32. :min="0"
  33. :precision="2"
  34. class="!w-1/1"
  35. />
  36. </el-form-item>
  37. <el-form-item label="搬运费" prop="truckagePrice">
  38. <el-input-number
  39. v-model="formData.truckagePrice"
  40. placeholder="请输入搬运费,单位:元"
  41. :min="0"
  42. :precision="2"
  43. class="!w-1/1"
  44. />
  45. </el-form-item>
  46. <el-form-item label="负责人" prop="principal">
  47. <el-input v-model="formData.principal" placeholder="请输入负责人" />
  48. </el-form-item>
  49. <el-form-item label="排序" prop="sort">
  50. <el-input-number
  51. v-model="formData.sort"
  52. placeholder="请输入排序"
  53. :precision="0"
  54. class="!w-1/1"
  55. />
  56. </el-form-item>
  57. <el-form-item label="备注" prop="remark">
  58. <el-input type="textarea" v-model="formData.remark" placeholder="请输入备注" />
  59. </el-form-item>
  60. </el-form>
  61. <template #footer>
  62. <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
  63. <el-button @click="dialogVisible = false">取 消</el-button>
  64. </template>
  65. </Dialog>
  66. </template>
  67. <script setup lang="ts">
  68. import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
  69. import { WarehouseApi, WarehouseVO } from '@/api/erp/stock/warehouse'
  70. import { CommonStatusEnum } from '@/utils/constants'
  71. /** ERP 仓库表单 */
  72. defineOptions({ name: 'WarehouseForm' })
  73. const { t } = useI18n() // 国际化
  74. const message = useMessage() // 消息弹窗
  75. const dialogVisible = ref(false) // 弹窗的是否展示
  76. const dialogTitle = ref('') // 弹窗的标题
  77. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  78. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  79. const formData = ref({
  80. id: undefined,
  81. name: undefined,
  82. address: undefined,
  83. sort: undefined,
  84. remark: undefined,
  85. principal: undefined,
  86. warehousePrice: undefined,
  87. truckagePrice: undefined,
  88. status: undefined
  89. })
  90. const formRules = reactive({
  91. name: [{ required: true, message: '仓库名称不能为空', trigger: 'blur' }],
  92. sort: [{ required: true, message: '排序不能为空', trigger: 'blur' }],
  93. status: [{ required: true, message: '开启状态不能为空', trigger: 'blur' }]
  94. })
  95. const formRef = ref() // 表单 Ref
  96. /** 打开弹窗 */
  97. const open = async (type: string, id?: number) => {
  98. dialogVisible.value = true
  99. dialogTitle.value = t('action.' + type)
  100. formType.value = type
  101. resetForm()
  102. // 修改时,设置数据
  103. if (id) {
  104. formLoading.value = true
  105. try {
  106. formData.value = await WarehouseApi.getWarehouse(id)
  107. } finally {
  108. formLoading.value = false
  109. }
  110. }
  111. }
  112. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  113. /** 提交表单 */
  114. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  115. const submitForm = async () => {
  116. // 校验表单
  117. await formRef.value.validate()
  118. // 提交请求
  119. formLoading.value = true
  120. try {
  121. const data = formData.value as unknown as WarehouseVO
  122. if (formType.value === 'create') {
  123. await WarehouseApi.createWarehouse(data)
  124. message.success(t('common.createSuccess'))
  125. } else {
  126. await WarehouseApi.updateWarehouse(data)
  127. message.success(t('common.updateSuccess'))
  128. }
  129. dialogVisible.value = false
  130. // 发送操作成功的事件
  131. emit('success')
  132. } finally {
  133. formLoading.value = false
  134. }
  135. }
  136. /** 重置表单 */
  137. const resetForm = () => {
  138. formData.value = {
  139. id: undefined,
  140. name: undefined,
  141. address: undefined,
  142. sort: undefined,
  143. remark: undefined,
  144. principal: undefined,
  145. warehousePrice: undefined,
  146. truckagePrice: undefined,
  147. status: CommonStatusEnum.ENABLE
  148. }
  149. formRef.value?.resetFields()
  150. }
  151. </script>