PurchaseDetail.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <script setup lang="ts">
  2. import { ref, reactive, nextTick, computed } from 'vue'
  3. import Drawer from '@/components/Drawer/index.vue'
  4. import type { FormInstance, FormRules } from 'element-plus'
  5. import { ColumnProps } from '@/components/TableBase/interface/index'
  6. import { generateRandom } from '@/utils/common'
  7. const isNew = ref(true)
  8. const tableData = ref<any[]>([])
  9. const formLabelWidth = ref('140px')
  10. const ruleFormRef = ref<FormInstance>()
  11. const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
  12. const form = ref({
  13. id: '',
  14. T_name:'',
  15. T_model:'',
  16. T_spec:'',
  17. T_quantity:'',
  18. T_demand:'',
  19. T_remark:'',
  20. T_state:1,
  21. T_date:'',
  22. T_unit_price:'',
  23. T_amount:'',
  24. T_reference_site:'',
  25. })
  26. const rules = reactive<FormRules>({
  27. T_name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
  28. T_quantity: [{ required: true, message: '数量', trigger: 'blur' }]
  29. })
  30. const columns: ColumnProps[] = [
  31. { type: 'index', label: '序号', width: 80, align: 'center' },
  32. { prop: 'T_name', label: '名称', align: 'center' },
  33. { prop: 'T_model', label: '型号', align: 'center', width: 100 },
  34. { prop: 'T_spec', label: '规格', align: 'center', width: 100 },
  35. { prop: 'T_quantity', label: '数量', align: 'center'},
  36. { prop: 'T_reference_site', label: '参考网址', align: 'center', width: 140 },
  37. { prop: 'T_demand', label: '需求', align: 'center', width: 140 },
  38. { prop: 'T_remark', label: '备注', align: 'center', width: 140 },
  39. { prop: 'T_state', label: '状态', align: 'center', width: 80 },
  40. { prop: 'T_date', label: '采购时间', align: 'center', width: 120 },
  41. { prop: 'T_unit_price', label: '采购单价', align: 'center', width: 100},
  42. { prop: 'T_amount', label: '采购金额', align: 'center', width: 100},
  43. { prop: 'operation', label: '操作', width: 160, fixed: 'right', align: 'center' }
  44. ]
  45. const openProductionDetailed = (type: string, row?: any) => {
  46. isNew.value = type === 'new' ? true : false
  47. if (!isNew.value) {
  48. form.value = { ...row }
  49. }
  50. drawerRef.value?.openDrawer()
  51. }
  52. const callbackDrawer = (done: () => void) => {
  53. done()
  54. resetForm(ruleFormRef.value)
  55. }
  56. const resetForm = (formEl: FormInstance | undefined) => {
  57. if (!formEl) return
  58. formEl.resetFields()
  59. }
  60. const deletePurchaseDetail = (id: string) => {
  61. tableData.value = tableData.value.filter((item: any) => item.id !== id)
  62. emit('onPlanning', tableData.value)
  63. }
  64. const addPurchaseDetail = (formEl: FormInstance | undefined) => {
  65. if (!formEl) return
  66. formEl.validate(valid => {
  67. if (valid) {
  68. if (isNew.value) {
  69. tableData.value.push({ ...form.value, id: generateRandom() })
  70. } else {
  71. const index = tableData.value.findIndex(item => item.id === form.value.id)
  72. tableData.value[index] = { ...form.value }
  73. }
  74. nextTick(() => {
  75. isNew.value = true
  76. drawerRef.value?.closeDrawer()
  77. resetForm(ruleFormRef.value)
  78. emit('onPlanning', tableData.value)
  79. })
  80. }
  81. })
  82. }
  83. const emit = defineEmits<{ (event: 'onPlanning', value: any): void }>()
  84. const getDetailInfo = () => tableData.value
  85. const clearDetail = () => (tableData.value = [])
  86. const setDetailData = (info: any[]) => {
  87. tableData.value = info.map((item: any) => {
  88. item.id = generateRandom()
  89. return item
  90. })
  91. }
  92. defineExpose({
  93. getDetailInfo,
  94. clearDetail,
  95. setDetailData
  96. })
  97. const props = defineProps<{ disabled: boolean; isShow?: string;typeTip?:string }>()
  98. const disabled = computed(() => props.disabled)
  99. const isShow = ref(props.isShow)
  100. const typeTip = ref(props.typeTip)
  101. </script>
  102. <template>
  103. <el-table
  104. stripe
  105. :data="tableData"
  106. style="width: 100%"
  107. :header-cell-style="{
  108. background: 'rgb(225 226 228)',
  109. color: '#000'
  110. }"
  111. >
  112. <template v-for="item in columns" :key="item.prop">
  113. <el-table-column
  114. v-if="item.prop === 'T_state'"
  115. :label="item.label"
  116. :width="item.width"
  117. align="center"
  118. >
  119. <template v-slot="scope">
  120. <el-text v-if="scope.row.T_state === 1" effect="dark">待采购</el-text>
  121. <el-text v-else type="success" effect="dark">已采购</el-text>
  122. </template>
  123. </el-table-column>
  124. <el-table-column show-overflow-tooltip v-bind="item" v-else-if="item.type === 'index'"></el-table-column>
  125. <el-table-column show-overflow-tooltip v-bind="item" v-else-if="item.fixed !== 'right' && item.type !== 'index'"> </el-table-column>
  126. <el-table-column show-overflow-tooltip v-bind="item" v-else-if="item.fixed === 'right'">
  127. <template #default="{ row }">
  128. <el-button size="small" :disabled="typeTip === 'view'" type="primary" @click="openProductionDetailed('edit', row)"
  129. >编辑</el-button
  130. >
  131. <el-button size="small" :disabled="isShow !== 'myPurchase' || typeTip === 'view'" type="danger" @click="deletePurchaseDetail(row.id)"
  132. >删除</el-button>
  133. </template>
  134. </el-table-column>
  135. </template>
  136. <template #append v-if="isShow === 'myPurchase'">
  137. <el-button type="primary" :disabled="disabled" @click="openProductionDetailed('new')">
  138. <el-icon><Plus /></el-icon><span style="margin-left: 6px">添加</span>
  139. </el-button>
  140. </template>
  141. </el-table>
  142. <Drawer ref="drawerRef" :handleClose="callbackDrawer">
  143. <template #header="{ params }">
  144. <h4 :id="params.titleId" :class="params.titleClass">{{ isNew ? '添加' : '编辑' }} - 采购明细</h4>
  145. </template>
  146. <el-form ref="ruleFormRef" :model="form" :rules="rules">
  147. <el-form-item label="名称:" :label-width="formLabelWidth" prop="T_name">
  148. <el-input v-model="form.T_name" type="text" autocomplete="off" placeholder="请输入名称" />
  149. </el-form-item>
  150. <el-form-item label="型号:" :label-width="formLabelWidth" prop="T_model">
  151. <el-input v-model="form.T_model" type="text" autocomplete="off" placeholder="请输入型号" />
  152. </el-form-item>
  153. <el-form-item label="规格:" :label-width="formLabelWidth" prop="T_spec">
  154. <el-input v-model="form.T_spec" type="text" autocomplete="off" placeholder="请输入规格" />
  155. </el-form-item>
  156. <el-form-item label="数量:" :label-width="formLabelWidth" prop="T_quantity">
  157. <el-input v-model="form.T_quantity" type="text" autocomplete="off" placeholder="请输入数量" />
  158. </el-form-item>
  159. <el-form-item label="参考网址:" :label-width="formLabelWidth" prop="T_reference_site">
  160. <el-input v-model="form.T_reference_site" type="text" autocomplete="off" placeholder="请输入参考网址" />
  161. </el-form-item>
  162. <el-form-item label="需求:" :label-width="formLabelWidth" prop="T_demand">
  163. <el-input v-model="form.T_demand" type="text" autocomplete="off" placeholder="请输入需求" />
  164. </el-form-item>
  165. <el-form-item label="备注:" :label-width="formLabelWidth" prop="T_remark">
  166. <el-input v-model="form.T_remark" type="text" autocomplete="off" placeholder="请输入备注" />
  167. </el-form-item>
  168. <el-form-item v-if="isShow !== 'myPurchase'" label="状态:" :label-width="formLabelWidth" prop="T_state">
  169. <el-radio-group v-model="form.T_state">
  170. <el-radio :label="1">待采购</el-radio>
  171. <el-radio :label="2">已采购</el-radio>
  172. </el-radio-group>
  173. </el-form-item>
  174. <el-form-item v-if="isShow !== 'myPurchase'" label="采购时间:" :label-width="formLabelWidth" prop="T_date">
  175. <el-date-picker
  176. style="flex: 0 0 50%"
  177. class="my-date-picker"
  178. v-model="form.T_date"
  179. type="date"
  180. placeholder="采购时间"
  181. format="YYYY-MM-DD"
  182. value-format="YYYY-MM-DD"
  183. />
  184. </el-form-item>
  185. <el-form-item label="采购单价:" :label-width="formLabelWidth" prop="T_unit_price">
  186. <el-input v-model="form.T_unit_price" type="text" autocomplete="off" placeholder="请输入采购单价" />
  187. </el-form-item>
  188. <el-form-item v-if="isShow !== 'myPurchase'" label="采购金额:" :label-width="formLabelWidth" prop="T_amount">
  189. <el-input v-model="form.T_amount" type="text" autocomplete="off" placeholder="请输入采购金额" />
  190. </el-form-item>
  191. <el-form-item :label-width="formLabelWidth">
  192. <el-button v-if="isNew" class="btn" type="primary" @click="addPurchaseDetail(ruleFormRef)"
  193. >添加</el-button
  194. >
  195. <el-button v-else class="btn" type="primary" @click="addPurchaseDetail(ruleFormRef)"
  196. >修改</el-button
  197. >
  198. </el-form-item>
  199. </el-form>
  200. </Drawer>
  201. </template>
  202. <style scoped lang="scss">
  203. :deep(.el-drawer__body .el-table .cell) {
  204. white-space: normal !important;
  205. }
  206. .el-form-item {
  207. margin-bottom: 18px;
  208. }
  209. </style>