MaintainMaterialDrawer.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <template>
  2. <el-drawer
  3. :title="t('workOrderMaterial.added')"
  4. :append-to-body="true"
  5. :model-value="modelValue"
  6. @update:model-value="$emit('update:modelValue', $event)"
  7. :show-close="false"
  8. direction="rtl"
  9. :size="computedSize"
  10. :before-close="handleClose"
  11. >
  12. <el-form
  13. ref="drawerRef"
  14. :model="drawerFormData"
  15. :rules="formRules"
  16. label-width="100px"
  17. v-loading="formLoading"
  18. >
  19. <el-form-item :label="t('stock.MaterialMaster')" prop="code1" style="margin-bottom: 30px">
  20. <el-select
  21. v-model="drawerFormData.code1"
  22. :model-value="materialLabel"
  23. :placeholder="t('stock.MaterialMaster')"
  24. @click="openForm"
  25. />
  26. </el-form-item>
  27. <el-form-item :label="t('workOrderMaterial.materialCode')" prop="code1" style="margin-bottom: 30px">
  28. <el-input v-model="drawerFormData.code1" disabled />
  29. </el-form-item>
  30. <el-form-item :label="t('workOrderMaterial.materialName')" prop="name1" style="margin-bottom: 30px">
  31. <el-input v-model="drawerFormData.name1" disabled />
  32. </el-form-item>
  33. <el-form-item :label="t('workOrderMaterial.unit')" prop="unit1" style="margin-bottom: 30px">
  34. <el-input v-model="drawerFormData.unit1" disabled :placeholder="t('workOrderMaterial.unit')" />
  35. </el-form-item>
  36. <el-form-item :label="t('workOrderMaterial.ConsumptionQuantity')" prop="depleteCount1" style="margin-bottom: 30px">
  37. <el-input-number
  38. v-model="drawerFormData.depleteCount1"
  39. :min="0"
  40. :precision="2"
  41. :step="0.1"
  42. style="width: 50%"
  43. class="w-100%"
  44. controls-position="right"
  45. />
  46. </el-form-item>
  47. <el-form-item :label="t('workOrderMaterial.unitPrice')" prop="price1" style="margin-bottom: 30px">
  48. <el-input-number
  49. v-model="drawerFormData.price1"
  50. :min="0"
  51. :precision="2"
  52. :step="0.1"
  53. style="width: 50%"
  54. controls-position="right"
  55. />
  56. </el-form-item>
  57. <el-form-item :label="t('deviceForm.remark')" prop="remark1" style="margin-bottom: 30px">
  58. <el-input v-model="drawerFormData.remark1" type="textarea" :placeholder="t('deviceForm.remarkHolder')" />
  59. </el-form-item>
  60. </el-form>
  61. <template #footer>
  62. <el-button @click="submitForm" type="primary" :disabled="formLoading">{{ t('common.ok') }}</el-button>
  63. <el-button @click="handleClose">{{ t('common.cancel') }}</el-button>
  64. </template>
  65. </el-drawer>
  66. <MaterialSelect ref="materialFormRef" @choose="materialChoose" />
  67. </template>
  68. <script setup lang="ts">
  69. import { defineEmits, defineOptions, ref, watch } from 'vue'
  70. import { ElMessage } from 'element-plus'
  71. import * as PmsMaterialApi from '@/api/pms/material'
  72. import { CommonStatusEnum } from '@/utils/constants'
  73. import MaterialSelect from './MaterialSelect.vue'
  74. const { t } = useI18n() // 国际化
  75. const drawerVisible = ref<boolean>(false)
  76. const emit = defineEmits(['update:modelValue', 'add'])
  77. const materialLabel = ref('') // 表单的类型:create - 新增;update - 修改
  78. defineOptions({
  79. name: 'MaintainMaterialDrawer'
  80. })
  81. const materialChoose = (row) => {
  82. drawerFormData.value.code1 = row.code
  83. drawerFormData.value.name1 = row.name
  84. drawerFormData.value.unit1 = row.unit
  85. materialLabel.value = row.name
  86. }
  87. const queryParams = reactive({
  88. pageNo: 1,
  89. pageSize: 10,
  90. createTime: [],
  91. bomId: '',
  92. name: '',
  93. code: ''
  94. })
  95. const drawerFormData = ref({
  96. id: undefined,
  97. code1: undefined,
  98. name1: undefined,
  99. unit1: undefined,
  100. price1: undefined,
  101. sourceType: undefined,
  102. depleteCount1: undefined,
  103. totalCount: undefined,
  104. sapCode: undefined,
  105. status1: undefined,
  106. remark1: undefined
  107. })
  108. const resetDrawerForm = () => {
  109. drawerFormData.value = {
  110. id: undefined,
  111. code1: undefined,
  112. name1: undefined,
  113. unit1: undefined,
  114. price1: undefined,
  115. sourceType: undefined,
  116. depleteCount: undefined,
  117. totalCount: undefined,
  118. sapCode: undefined,
  119. status: undefined,
  120. remark1: undefined
  121. }
  122. drawerRef.value?.resetFields()
  123. }
  124. const formRules = reactive({
  125. code1: [{ required: true, message: '物料编码不能为空', trigger: 'blur' }],
  126. name1: [{ required: true, message: '物料名称不能为空', trigger: 'blur' }],
  127. depleteCount1: [{ required: true, message: '消耗数量不能为空', trigger: 'blur' }],
  128. price1:[{ required: true, message: '单价不能为空', trigger: 'blur' }],
  129. })
  130. const materialFormRef = ref()
  131. const openForm = () => {
  132. materialFormRef.value.open()
  133. }
  134. const windowWidth = ref(window.innerWidth)
  135. // 动态计算百分比
  136. const computedSize = computed(() => {
  137. return windowWidth.value > 800 ? '40%' : '60%'
  138. })
  139. const loading = ref(false)
  140. const total = ref(0) // 列表的总页数
  141. const materials = ref([])
  142. const props = defineProps({
  143. modelValue: Boolean
  144. })
  145. // 打开抽屉
  146. const openDrawer = () => {
  147. drawerVisible.value = true
  148. resetDrawerForm()
  149. materialLabel.value = undefined
  150. }
  151. // 关闭抽屉
  152. const closeDrawer = () => {
  153. drawerVisible.value = false
  154. }
  155. // 关闭抽屉
  156. const handleClose = () => {
  157. emit('update:modelValue', false)
  158. }
  159. const drawerRef = ref()
  160. const submitForm = async () => {
  161. await drawerRef.value.validate()
  162. drawerFormData.value.sourceType = '手动添加'
  163. emit('add', drawerFormData.value)
  164. emit('update:modelValue', false)
  165. }
  166. defineExpose({ openDrawer, closeDrawer }) // 暴露方法给父组件
  167. </script>
  168. <style lang="scss" scoped></style>