fix(repair): add edit action, mandatory validations, default date, and fix outbound SN mapping

This commit is contained in:
DXC
2026-04-09 08:49:50 +08:00
parent 09936cb045
commit 0a9c8cd39c
2 changed files with 65 additions and 20 deletions

View File

@ -94,7 +94,8 @@ class OutboundService:
'source_table': 'trans_repair', 'source_table': 'trans_repair',
'stock_quantity': 1, 'stock_quantity': 1,
'available_quantity': 1, 'available_quantity': 1,
'batch_number': '', 'batch_number': repair.serial_number or '',
'serial_number': repair.serial_number or '',
'warehouse_location': repair.customer_location or '', 'warehouse_location': repair.customer_location or '',
'barcode': repair.sku, 'barcode': repair.sku,
'price': float(repair.sale_price) if repair.sale_price else 0 'price': float(repair.sale_price) if repair.sale_price else 0

View File

@ -49,12 +49,15 @@
</el-table-column> </el-table-column>
<el-table-column prop="arrival_date" label="接收时间" width="120" /> <el-table-column prop="arrival_date" label="接收时间" width="120" />
<el-table-column prop="fault_description" label="故障描述" min-width="150" show-overflow-tooltip /> <el-table-column prop="fault_description" label="故障描述" min-width="150" show-overflow-tooltip />
<el-table-column label="操作" width="220" fixed="right" align="center"> <el-table-column label="操作" width="280" fixed="right" align="center">
<template #default="{ row }"> <template #default="{ row }">
<el-button v-if="userStore.hasPermission('inbound_repair:edit')" type="warning" link size="small" @click="handlePrint(row)"> <el-button v-if="userStore.hasPermission('inbound_repair:edit')" type="warning" link size="small" @click="handlePrint(row)">
<el-icon><Printer /></el-icon> 打印 <el-icon><Printer /></el-icon> 打印
</el-button> </el-button>
<el-button v-if="userStore.hasPermission('inbound_repair:edit')" type="primary" link size="small" @click="handleUpdateStatus(row)"> <el-button v-if="userStore.hasPermission('inbound_repair:edit')" type="primary" link size="small" @click="handleEdit(row)">
编辑
</el-button>
<el-button v-if="userStore.hasPermission('inbound_repair:edit')" type="success" link size="small" @click="handleUpdateStatus(row)">
更新状态 更新状态
</el-button> </el-button>
<el-button v-if="userStore.hasPermission('inbound_repair:delete')" type="danger" link size="small" @click="handleDelete(row)"> <el-button v-if="userStore.hasPermission('inbound_repair:delete')" type="danger" link size="small" @click="handleDelete(row)">
@ -77,8 +80,8 @@
/> />
</div> </div>
<!-- 新增维修单弹窗 --> <!-- 新增/编辑维修单弹窗 -->
<el-dialog v-model="dialogVisible" title="新增维修单" width="650px" destroy-on-close :close-on-click-modal="false"> <el-dialog v-model="dialogVisible" :title="dialogTitle" width="650px" destroy-on-close :close-on-click-modal="false">
<el-form ref="formRef" :model="form" :rules="formRules" label-width="100px"> <el-form ref="formRef" :model="form" :rules="formRules" label-width="100px">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
@ -213,11 +216,12 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, onMounted } from 'vue' import { ref, reactive, onMounted, computed } from 'vue'
import { Plus, Search, Refresh, Printer, Camera } from '@element-plus/icons-vue' import dayjs from 'dayjs'
import { Plus, Search, Refresh, Printer, Camera, Edit } from '@element-plus/icons-vue'
import { ElMessage, ElMessageBox, ElFormRules } from 'element-plus' import { ElMessage, ElMessageBox, ElFormRules } from 'element-plus'
import { useUserStore } from '@/stores/user' import { useUserStore } from '@/stores/user'
import { getRepairList, createRepair, updateRepairStatus, deleteRepair } from '@/api/inbound/repair' import { getRepairList, createRepair, updateRepair, updateRepairStatus, deleteRepair } from '@/api/inbound/repair'
import { getLabelPreview, executePrint } from '@/api/common/print' import { getLabelPreview, executePrint } from '@/api/common/print'
import SmartScannerDialog from '@/components/SmartScannerDialog.vue' import SmartScannerDialog from '@/components/SmartScannerDialog.vue'
@ -240,11 +244,15 @@ const pagination = reactive({
total: 0 total: 0
}) })
// 新增弹窗 // 弹窗标题
const dialogTitle = computed(() => form.id ? '编辑维修单' : '新增维修单')
// 新增/编辑弹窗
const dialogVisible = ref(false) const dialogVisible = ref(false)
const submitLoading = ref(false) const submitLoading = ref(false)
const formRef = ref() const formRef = ref()
const form = reactive({ const form = reactive({
id: undefined as number | undefined,
material_name: '', material_name: '',
serial_number: '', serial_number: '',
source_table: 'independent', source_table: 'independent',
@ -257,10 +265,11 @@ const form = reactive({
sale_price: undefined as number | undefined sale_price: undefined as number | undefined
}) })
// 表单校验 // 表单校验规则
const formRules: ElFormRules = [ const formRules: ElFormRules = [
{ required: true, message: '请输入物料名称', trigger: 'blur', field: 'material_name' }, { required: true, message: '请输入物料名称', trigger: 'blur', field: 'material_name' },
{ required: true, message: '请输入序列号', trigger: 'blur', field: 'serial_number' } { required: true, message: '请输入序列号', trigger: 'blur', field: 'serial_number' },
{ required: true, message: '请输入客户名称', trigger: 'blur', field: 'customer_name' }
] ]
// 状态更新弹窗 // 状态更新弹窗
@ -346,13 +355,19 @@ const handleReset = () => {
handleSearch() handleSearch()
} }
// 新增 // 获取默认时间
const getDefaultDate = () => {
return dayjs().format('YYYY-MM-DD')
}
// 新增 - 打开弹窗
const handleCreate = () => { const handleCreate = () => {
// 重置表单 // 重置表单
form.id = undefined
form.material_name = '' form.material_name = ''
form.serial_number = '' form.serial_number = ''
form.source_table = 'independent' form.source_table = 'independent'
form.arrival_date = '' form.arrival_date = getDefaultDate()
form.fault_description = '' form.fault_description = ''
form.customer_name = '' form.customer_name = ''
form.customer_location = '' form.customer_location = ''
@ -362,13 +377,41 @@ const handleCreate = () => {
dialogVisible.value = true dialogVisible.value = true
} }
// 提交新增 // 编辑 - 打开弹窗
const handleEdit = (row: any) => {
form.id = row.id
form.material_name = row.material_name || ''
form.serial_number = row.serial_number || ''
form.source_table = row.source_table || 'independent'
form.arrival_date = row.arrival_date || getDefaultDate()
form.fault_description = row.fault_description || ''
form.customer_name = row.customer_name || ''
form.customer_location = row.customer_location || ''
form.repair_manager = row.repair_manager || ''
form.cost_price = row.cost_price ?? undefined
form.sale_price = row.sale_price ?? undefined
dialogVisible.value = true
}
// 提交新增/编辑
const handleSubmit = async () => { const handleSubmit = async () => {
if (!formRef.value) return if (!formRef.value) return
await formRef.value.validate() await formRef.value.validate()
submitLoading.value = true submitLoading.value = true
try { try {
if (form.id) {
// 编辑
const res = await updateRepair(form.id, form)
if (res.code === 200) {
ElMessage.success('编辑成功')
dialogVisible.value = false
fetchData()
} else {
ElMessage.error(res.msg || '编辑失败')
}
} else {
// 新增
const res = await createRepair(form) const res = await createRepair(form)
if (res.code === 200) { if (res.code === 200) {
ElMessage.success('新增成功') ElMessage.success('新增成功')
@ -377,6 +420,7 @@ const handleSubmit = async () => {
} else { } else {
ElMessage.error(res.msg || '新增失败') ElMessage.error(res.msg || '新增失败')
} }
}
} finally { } finally {
submitLoading.value = false submitLoading.value = false
} }