Compare commits

...

2 Commits

Author SHA1 Message Date
c393b811c1 Merge branch 'master' of http://115.190.214.62:3001/Teams/kunshan-bzfm-mes-vue 2026-02-09 16:23:27 +08:00
d06c403f37 feat(工单管理): 添加工单不良品管理功能
- 新增工单不良品弹窗组件,支持报废单和转用单创建
- 在工单列表添加不良品操作入口和不良数列
- 调整出货数量计算逻辑,扣除不良品数量
- 优化交付进度表显示字段和布局
2026-02-09 16:23:25 +08:00
4 changed files with 578 additions and 19 deletions

View File

@@ -56,10 +56,11 @@
<vxe-column field="stoveCode" title="炉号" />
<vxe-column field="materialName" title="材料型号" />
<vxe-column field="materialCode" title="材料编码" />
<vxe-column field="planNum" align="center" title="计划数量" />
<vxe-column field="shipmentNum" align="center" title="完成数量" />
<vxe-column field="materialtextureCode" title="材质" />
<vxe-column field="drawingCode" title="图号" />
<vxe-column field="feedOrder" title="原料批号" />
<vxe-column field="planNum" align="center" title="计划数" />
<vxe-column field="shipmentNum" align="center" title="出货数" />
<!-- <vxe-column field="materialtextureCode" title="材质" /> -->
<!-- <vxe-column field="drawingCode" title="图号" />
<vxe-column field="priority" title="优先级" align="center">
<template #default="{ row }">
<dict-tag :options="priorityOptions" :value="row.priority" />
@@ -71,43 +72,44 @@
<dict-tag :options="statusOptions" :value="row.status" />
</template>
</vxe-column>
<vxe-column field="workshopCode" title="车间" />
<vxe-column field="workshopCode" title="车间" /> -->
</vxe-table>
</div>
</template>
</vxe-column>
<vxe-column field="importDate" title="创建日期" min-width="120" align="center" :formatter="formatTime" />
<vxe-column field="orderNoMes" title="订单扫描号" min-width="140" />
<vxe-column field="orderNoMes" title="订单号" min-width="140" />
<vxe-column field="materialName" title="产品名称" min-width="120" />
<vxe-column field="materialCode" title="产品编码" min-width="120" />
<!-- <vxe-column field="purchaseOrderErp" title="采购订单号" min-width="140" /> -->
<vxe-column field="orderindicator" title="订单是否完成" align="center" min-width="120">
<vxe-column field="orderindicator" title="是否完成" align="center" min-width="120">
<template #default="{ row }">
<dict-tag :options="boolOptions" :value="row.orderindicator" />
</template>
</vxe-column>
<vxe-column field="materialCode" title="物料号" min-width="120" />
<vxe-column field="demandQuantity" title="需求数量" align="center" min-width="100" />
<vxe-column field="deliveryQuantity" title="实际交货数量" align="center" min-width="120" />
<vxe-column align="center" title="完成进度" min-width="200">
<vxe-column align="center" title="完成进度" width="180">
<template #default="{ row }">
<el-progress :stroke-width="18" :percentage="getPercentage(row.demandQuantity, row.deliveryQuantity)" :color="customColors" />
</template>
</vxe-column>
<vxe-column field="documentDate" title="单据日期" min-width="120" />
<vxe-column field="deliveryDate" title="交货日期" min-width="120" align="center" :formatter="formatTime" />
<vxe-column field="startDate" title="基本开始日期" min-width="160" align="center" />
<vxe-column field="endDate" title="基本结束日期" min-width="160" align="center" />
<vxe-column field="materialName" title="物料" min-width="120" />
<!-- <vxe-column field="startDate" title="基本开始日期" min-width="160" align="center" />
<vxe-column field="endDate" title="基本结束日期" min-width="160" align="center" /> -->
<vxe-column field="specordindicator" title="是否非标" align="center" min-width="100">
<!-- <vxe-column field="specordindicator" title="是否非标" align="center" min-width="100">
<template #default="{ row }">
<dict-tag :options="boolOptions" :value="row.specordindicator" />
</template>
</vxe-column>
<vxe-column field="routeCode" title="计划产线" align="center" min-width="120" />
</vxe-column> -->
<!-- <vxe-column field="routeCode" title="计划产线" align="center" min-width="120" />
<vxe-column field="kdType" title="类型" align="center" min-width="100" />
<vxe-column field="documentDate" title="单据日期" min-width="120" />
<vxe-column field="seller" title="售达方" align="center" min-width="120" />
<vxe-column field="salesArea" title="销售地区" align="center" min-width="120" />
<vxe-column field="remark" title="备注" align="center" min-width="150" />
<vxe-column field="remark" title="备注" align="center" min-width="150" /> -->
</vxe-table>
</template>

View File

@@ -0,0 +1,540 @@
<template>
<el-dialog
:title="'不良品管理 - ' + workorderInfo.workorder"
:lock-scroll="false"
:model-value="dialogVisible"
@update:model-value="(val) => emit('update:dialogVisible', val)"
width="70%"
draggable
append-to-body
:close-on-click-modal="false">
<!-- 顶部操作按钮 -->
<div class="top-actions mb20">
<el-button type="primary" @click="handleCreateScrapOrder">报废单</el-button>
<el-button type="success" @click="handleCreateTransferOrder">转用单</el-button>
</div>
<!-- 不良品记录列表 -->
<div v-loading="loading" class="defect-list">
<el-table :data="defectList" border stripe style="width: 100%">
<el-table-column prop="scrapOrderNo" label="不良品单号" align="center" />
<el-table-column prop="materialCode" label="物料编码" align="center" />
<el-table-column prop="materialName" label="物料名称" align="center" />
<el-table-column prop="scrapQuantity" label="不良品数量" align="center" />
<el-table-column prop="scrapType" label="不良品类型" align="center" />
<el-table-column prop="scrapReason" label="不良品原因" align="center" />
<el-table-column prop="status" label="状态" align="center" />
<el-table-column prop="scrapDate" label="不良品日期" align="center" />
<el-table-column label="操作" align="center" width="120">
<template #default="scope">
<el-button type="info" size="small" icon="undo" v-if="scope.row.status === '已批准'" @click="handleRevoke(scope.row)"> 撤销 </el-button>
</template>
</el-table-column>
</el-table>
<!-- 列表下方的撤销按钮 -->
<div class="list-actions mt10" v-if="defectList.length > 0">
<el-button type="info" icon="undo" @click="handleBatchRevoke" :disabled="!canBatchRevoke"> 批量撤销 </el-button>
</div>
</div>
<!-- 创建报废单对话框 -->
<el-dialog append-to-body title="创建报废单" :lock-scroll="false" v-model="scrapOrderOpen" width="60%">
<el-form ref="scrapOrderFormRef" :model="scrapOrderForm" :rules="scrapOrderRules" label-width="100px">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item label="主体型号" prop="materialCode">
<el-input v-model="scrapOrderForm.materialCode" placeholder="主体型号" disabled />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="主体品名" prop="materialName">
<el-input v-model="scrapOrderForm.materialName" placeholder="主体品名" disabled />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="不良品类型" prop="scrapType">
<el-select v-model="scrapOrderForm.scrapType" placeholder="请选择不良品类型" disabled>
<el-option label="报废" value="报废" />
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="工单号" prop="workorder">
<el-input v-model="transferOrderForm.workorder" disabled placeholder="请输入工单号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="不良品数量" prop="scrapQuantity">
<el-input v-model="scrapOrderForm.scrapQuantity" placeholder="请输入不良品数量" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item label="不良品原因" prop="scrapReason">
<el-input v-model="scrapOrderForm.scrapReason" placeholder="请输入不良品原因" type="textarea" :rows="3" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item label="处置方式" prop="disposalMethod">
<el-input v-model="scrapOrderForm.disposalMethod" placeholder="请输入处置方式" type="textarea" :rows="3" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="操作员" prop="operator">
<el-select v-model="scrapOrderForm.operator" filterable placeholder="请选择操作员">
<el-option v-for="item in userOptions" :key="item.userId" :label="item.nickName" :value="item.nickName" />
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="质检员" prop="qualityInspector">
<el-select v-model="scrapOrderForm.qualityInspector" filterable placeholder="请选择质检员">
<el-option v-for="item in userOptions" :key="item.userId" :label="item.nickName" :value="item.nickName" />
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="报废日期" prop="scrapDate">
<el-date-picker v-model="scrapOrderForm.scrapDate" type="datetime" placeholder="选择日期时间" value-format="YYYY-MM-DD HH:mm:ss" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="scrapOrderForm.remark" placeholder="请输入备注" type="textarea" :rows="3" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button text @click="cancelScrapOrder">{{ $t('btn.cancel') }}</el-button>
<el-button type="primary" @click="submitScrapOrder">{{ $t('btn.submit') }}</el-button>
</template>
</el-dialog>
<!-- 创建转用单对话框 -->
<el-dialog append-to-body title="创建转用单" :lock-scroll="false" v-model="transferOrderOpen" width="60%">
<el-form ref="transferOrderFormRef" :model="transferOrderForm" :rules="transferOrderRules" label-width="100px">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item label="主体型号" prop="materialCode">
<el-input v-model="transferOrderForm.materialCode" placeholder="主体型号" disabled />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="主体品名" prop="materialName">
<el-input v-model="transferOrderForm.materialName" placeholder="主体品名" disabled />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="工单号" prop="workorder">
<el-input v-model="transferOrderForm.workorder" disabled placeholder="请输入工单号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="不良品类型" prop="scrapType">
<el-select v-model="transferOrderForm.scrapType" placeholder="请选择不良品类型" disabled>
<el-option label="转用" value="转用" />
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="不良品数量" prop="scrapQuantity">
<el-input v-model="transferOrderForm.scrapQuantity" placeholder="请输入不良品数量" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item label="不良品原因" prop="scrapReason">
<el-input v-model="transferOrderForm.scrapReason" placeholder="请输入不良品原因" type="textarea" :rows="3" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item label="处置方式" prop="disposalMethod">
<el-input v-model="transferOrderForm.disposalMethod" placeholder="请输入处置方式" type="textarea" :rows="3" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="操作员" prop="operator">
<el-select v-model="transferOrderForm.operator" filterable placeholder="请选择操作员">
<el-option v-for="item in userOptions" :key="item.userId" :label="item.nickName" :value="item.nickName" />
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="质检员" prop="qualityInspector">
<el-select v-model="transferOrderForm.qualityInspector" filterable placeholder="请选择质检员">
<el-option v-for="item in userOptions" :key="item.userId" :label="item.nickName" :value="item.nickName" />
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="转用日期" prop="scrapDate">
<el-date-picker
v-model="transferOrderForm.scrapDate"
type="datetime"
placeholder="选择日期时间"
value-format="YYYY-MM-DD HH:mm:ss" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="transferOrderForm.remark" placeholder="请输入备注" type="textarea" :rows="3" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button text @click="cancelTransferOrder">{{ $t('btn.cancel') }}</el-button>
<el-button type="primary" @click="submitTransferOrder">{{ $t('btn.submit') }}</el-button>
</template>
</el-dialog>
<!-- 撤销确认对话框 -->
<el-dialog append-to-body title="撤销确认" :lock-scroll="false" v-model="revokeConfirmOpen" width="400px">
<p>确定要撤销选中的不良品记录吗?</p>
<template #footer>
<el-button text @click="revokeConfirmOpen = false">{{ $t('btn.cancel') }}</el-button>
<el-button type="primary" @click="submitRevoke">{{ $t('btn.submit') }}</el-button>
</template>
</el-dialog>
</el-dialog>
</template>
<script setup name="WorkorderDefectDialog">
import { ref, reactive, toRefs, watch, getCurrentInstance } from 'vue'
import { listQcScrapRecords, createScrapOrder, createTransferOrder, revokeScrapRecord } from '@/api/qualityManagement/IPQC/qcscraprecords.js'
import { listUser } from '@/api/system/user.js'
// 获取组件实例
const { proxy } = getCurrentInstance()
// Props
const props = defineProps({
dialogVisible: {
type: Boolean,
default: false
},
workorderInfo: {
type: Object,
default: () => ({})
}
})
// Emits
const emit = defineEmits(['update:dialogVisible', 'submit'])
// 响应式数据
const loading = ref(false)
const defectList = ref([])
const userOptions = ref([])
// 弹窗状态
const scrapOrderOpen = ref(false)
const transferOrderOpen = ref(false)
const revokeConfirmOpen = ref(false)
// 选中的记录
const selectedRevokeId = ref(null)
// 表单引用
const scrapOrderFormRef = ref()
const transferOrderFormRef = ref()
// 表单数据
const state = reactive({
scrapOrderForm: {
materialCode: null,
materialName: null,
batchNo: null,
scrapQuantity: null,
scrapType: '报废',
scrapReason: null,
disposalMethod: null,
operator: null,
qualityInspector: null,
scrapDate: null,
remark: null
},
transferOrderForm: {
materialCode: null,
materialName: null,
workorder: null,
scrapQuantity: null,
scrapType: '转用',
scrapReason: null,
disposalMethod: null,
operator: null,
qualityInspector: null,
scrapDate: null,
remark: null
},
scrapOrderRules: {
materialCode: [{ required: true, message: '主体型号不能为空', trigger: 'blur' }],
scrapReason: [{ required: true, message: '不良品原因不能为空', trigger: 'blur' }],
scrapQuantity: [{ required: true, message: '不良品数量不能为空', trigger: 'blur' }],
// disposalMethod: [{ required: true, message: '处置方式不能为空', trigger: 'blur' }],
operator: [{ required: true, message: '操作员不能为空', trigger: 'change' }],
qualityInspector: [{ required: true, message: '质检员不能为空', trigger: 'change' }],
scrapDate: [{ required: true, message: '报废日期不能为空', trigger: 'blur' }]
},
transferOrderRules: {
materialCode: [{ required: true, message: '主体型号不能为空', trigger: 'blur' }],
workorder: [{ required: true, message: '工单号不能为空', trigger: 'blur' }],
scrapReason: [{ required: true, message: '不良品原因不能为空', trigger: 'blur' }],
scrapQuantity: [{ required: true, message: '不良品数量不能为空', trigger: 'blur' }],
// disposalMethod: [{ required: true, message: '处置方式不能为空', trigger: 'blur' }],
operator: [{ required: true, message: '操作员不能为空', trigger: 'change' }],
qualityInspector: [{ required: true, message: '质检员不能为空', trigger: 'change' }],
scrapDate: [{ required: true, message: '转用日期不能为空', trigger: 'blur' }]
}
})
const { scrapOrderForm, transferOrderForm, scrapOrderRules, transferOrderRules } = toRefs(state)
// 计算属性
const canBatchRevoke = ref(false)
// 监听弹窗显示,加载不良品记录
watch(
() => props.dialogVisible,
(newVal) => {
if (newVal && props.workorderInfo.workorder) {
getDefectList()
getUserList()
}
}
)
// 获取不良品记录列表
function getDefectList() {
loading.value = true
listQcScrapRecords({
pageNum: 1,
pageSize: 100,
workorder: props.workorderInfo.workorder
})
.then((res) => {
if (res.code === 200) {
defectList.value = res.data.result
// 检查是否有可批量撤销的记录
canBatchRevoke.value = defectList.value.some((item) => item.status === '已批准')
}
})
.catch(() => {
proxy.$modal.msgError('获取不良品记录失败')
})
.finally(() => {
loading.value = false
})
}
// 获取物料列表
function getMaterialCodeList() {
try {
getMaterialOption('materialCode').then((res) => {
if (res.code === 200) {
materialOptions.value = res.data
}
})
} catch (error) {
proxy.$modal.msgError(error.message)
}
}
// 获取用户列表
function getUserList() {
try {
listUser({ pageSize: 1000, status: 0 }).then((res) => {
if (res.code === 200) {
userOptions.value = res.data.result
}
})
} catch (error) {
proxy.$modal.msgError('获取用户列表失败: ' + error.message)
}
}
// 打开创建报废单对话框
function handleCreateScrapOrder() {
resetScrapOrderForm()
// 从工单信息带入数据
scrapOrderForm.value.workorder = props.workorderInfo.workorder
// 自动带入主体型号和主体品名
if (props.workorderInfo.productionCode) {
scrapOrderForm.value.materialCode = props.workorderInfo.productionCode
}
if (props.workorderInfo.productionName) {
scrapOrderForm.value.materialName = props.workorderInfo.productionName
}
// 设置默认日期
scrapOrderForm.value.scrapDate = new Date().toISOString().slice(0, 19).replace('T', ' ')
scrapOrderOpen.value = true
}
// 关闭创建报废单对话框
function cancelScrapOrder() {
scrapOrderOpen.value = false
resetScrapOrderForm()
}
// 重置报废单表单
function resetScrapOrderForm() {
state.scrapOrderForm = {
materialCode: null,
materialName: null,
batchNo: null,
scrapQuantity: null,
scrapType: '报废',
scrapReason: null,
disposalMethod: null,
operator: null,
qualityInspector: null,
scrapDate: null,
remark: null
}
proxy.resetForm('scrapOrderFormRef')
}
// 提交报废单
function submitScrapOrder() {
proxy.$refs['scrapOrderFormRef'].validate((valid) => {
if (valid) {
const formData = {
...scrapOrderForm.value,
workorder: props.workorderInfo.workorder
}
createScrapOrder(formData)
.then((res) => {
if (res.code === 200) {
proxy.$modal.msgSuccess('创建报废单成功')
scrapOrderOpen.value = false
getDefectList()
emit('submit', { type: 'scrap', data: formData })
}
})
.catch(() => {
proxy.$modal.msgError('创建报废单失败')
})
}
})
}
// 打开创建转用单对话框
function handleCreateTransferOrder() {
resetTransferOrderForm()
// 从工单信息带入数据
transferOrderForm.value.workorder = props.workorderInfo.workorder
// 自动带入主体型号和主体品名
if (props.workorderInfo.productionCode) {
transferOrderForm.value.materialCode = props.workorderInfo.productionCode
}
if (props.workorderInfo.productionName) {
transferOrderForm.value.materialName = props.workorderInfo.productionName
}
// 设置默认日期
transferOrderForm.value.scrapDate = new Date().toISOString().slice(0, 19).replace('T', ' ')
transferOrderOpen.value = true
}
// 关闭创建转用单对话框
function cancelTransferOrder() {
transferOrderOpen.value = false
resetTransferOrderForm()
}
// 重置转用单表单
function resetTransferOrderForm() {
state.transferOrderForm = {
materialCode: null,
materialName: null,
workorder: null,
scrapQuantity: null,
scrapType: '转用',
scrapReason: null,
disposalMethod: null,
operator: null,
qualityInspector: null,
scrapDate: null,
remark: null
}
proxy.resetForm('transferOrderFormRef')
}
// 提交转用单
function submitTransferOrder() {
proxy.$refs['transferOrderFormRef'].validate((valid) => {
if (valid) {
createTransferOrder(transferOrderForm.value)
.then((res) => {
if (res.code === 200) {
proxy.$modal.msgSuccess('创建转用单成功')
transferOrderOpen.value = false
getDefectList()
emit('submit', { type: 'transfer', data: transferOrderForm.value })
}
})
.catch(() => {
proxy.$modal.msgError('创建转用单失败')
})
}
})
}
// 处理撤销
function handleRevoke(row) {
selectedRevokeId.value = row.id
revokeConfirmOpen.value = true
}
// 处理批量撤销
function handleBatchRevoke() {
const approvedItems = defectList.value.filter((item) => item.status === '已批准')
if (approvedItems.length > 0) {
selectedRevokeId.value = approvedItems[0].id
revokeConfirmOpen.value = true
}
}
// 提交撤销
function submitRevoke() {
if (!selectedRevokeId.value) return
revokeScrapRecord(selectedRevokeId.value)
.then((res) => {
if (res.code === 200) {
proxy.$modal.msgSuccess('撤销成功')
revokeConfirmOpen.value = false
getDefectList()
emit('submit', { type: 'revoke', data: { id: selectedRevokeId.value } })
}
})
.catch(() => {
proxy.$modal.msgError('撤销失败')
})
.finally(() => {
selectedRevokeId.value = null
})
}
</script>
<style scoped>
.top-actions {
display: flex;
gap: 10px;
}
.mb20 {
margin-bottom: 20px;
}
.mt10 {
margin-top: 10px;
}
.list-actions {
display: flex;
justify-content: flex-end;
}
</style>

View File

@@ -285,7 +285,7 @@ function resetForm() {
// 重置表单数据
Object.assign(formData, {
selectedOrderNo: '',
shipmentQuantity: props.workorderInfo?.planNum || 1,
shipmentQuantity: props.workorderInfo?.planNum - props.workorderInfo?.defectNum || 1,
operator: '',
orderId: ''
})

View File

@@ -104,6 +104,7 @@
<el-table-column prop="productionCode" label="主体型号" width="180" />
<el-table-column prop="stoveCode" label="炉号" width="100" />
<el-table-column prop="planNum" align="center" label="计划数" width="60" />
<el-table-column prop="defectNum" align="center" label="不良数" width="60" />
<el-table-column prop="shipmentNum" align="center" label="出货数" width="60" />
<el-table-column prop="feedOrder" label="原料批次号" width="120" />
<el-table-column prop="customerOrder" label="订单号" width="120" />
@@ -155,6 +156,7 @@
<el-dropdown-item @click="handleWorkorderAction(scope.row, 'shipment')"
><el-text type="success">出货</el-text></el-dropdown-item
>
<el-dropdown-item @click="handleWorkorderAction(scope.row, 'defect')"><el-text type="danger">不良品</el-text></el-dropdown-item>
<!-- <el-dropdown-item @click="handleAdd(scope.row.id)"><el-text type="warning">插单</el-text></el-dropdown-item> -->
<el-dropdown-item @click="handleMove(scope.row, 1)"><el-text type="info">上移</el-text></el-dropdown-item>
<el-dropdown-item @click="handleMove(scope.row, 2)"><el-text type="info">下移</el-text></el-dropdown-item>
@@ -372,6 +374,9 @@
<!-- 出货弹窗 -->
<WorkorderShipmentDialog v-model:dialogVisible="shipmentDialogVisible" :workorderInfo="selectedWorkorderInfo" @submit="handleShipmentSubmit" />
<!-- 不良品弹窗 -->
<WorkorderDefectDialog v-model:dialogVisible="defectDialogVisible" :workorderInfo="selectedWorkorderInfo" @submit="handleDefectSubmit" />
</div>
</template>
@@ -406,6 +411,7 @@ import WorkorderDetailDialog from './components/WorkorderDetailDialog.vue'
import WorkorderMaterialPickDialog from './components/WorkorderMaterialPickDialog.vue'
import WorkorderProductStorageDialog from './components/WorkorderProductStorageDialog.vue'
import WorkorderShipmentDialog from './components/WorkorderShipmentDialog.vue'
import WorkorderDefectDialog from './components/WorkorderDefectDialog.vue'
const { proxy } = getCurrentInstance()
const ids = ref([])
const loading = ref(false)
@@ -430,6 +436,7 @@ const detailDialogVisible = ref(false)
const materialPickDialogVisible = ref(false)
const productStorageDialogVisible = ref(false)
const shipmentDialogVisible = ref(false)
const defectDialogVisible = ref(false)
const selectedWorkorderId = ref(null)
const selectedWorkorderInfo = ref({})
@@ -936,7 +943,7 @@ const handleFileUploadProgress = (event, file, fileList) => {
const handleFileSuccess = (response, file, fileList) => {
const { code, msg, data } = response
if (code === 500) {
proxy.$message.error('模板存在异常!')
proxy.$message.error(msg)
upload.isUploading = false
proxy.$refs['uploadRef'].clearFiles()
return
@@ -1020,6 +1027,9 @@ function handleWorkorderAction(row, action) {
case 'shipment':
shipmentDialogVisible.value = true
break
case 'defect':
defectDialogVisible.value = true
break
}
}
@@ -1050,6 +1060,13 @@ function handleShipmentSubmit(data) {
getList()
}
// 处理不良品提交
function handleDefectSubmit(data) {
console.log('不良品提交:', data)
// 这里应该调用实际的API接口处理不良品
getList()
}
// initDict()
getMaterialCodeList()
handleQuery()