Compare commits
2 Commits
ac39e5ba90
...
c393b811c1
| Author | SHA1 | Date | |
|---|---|---|---|
| c393b811c1 | |||
| d06c403f37 |
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
@@ -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: ''
|
||||
})
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user