pull/871/MERGE
YunaiV 2026-02-21 11:15:00 +08:00
parent 170b9e0857
commit eab4883204
2 changed files with 120 additions and 86 deletions

View File

@ -1,6 +1,5 @@
<!-- MES 生产报工表单 -->
<template>
<!-- TODO @AI一行 3 -->
<Dialog :title="dialogTitle" v-model="dialogVisible" width="960px">
<el-form
ref="formRef"
@ -9,14 +8,14 @@
label-width="120px"
v-loading="formLoading"
>
<el-row>
<el-col :span="12">
<!-- TODO @AI生成前端处理参考别的模块 -->
<!-- 基本信息 -->
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="报工单号" prop="code">
<el-input v-model="formData.code" disabled placeholder="自动生成" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="报工类型" prop="type">
<el-select
v-model="formData.type"
@ -33,10 +32,8 @@
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<!-- TODO @芋艿报告途径是不是非必须 -->
<el-col :span="12">
<el-col :span="8">
<!-- TODO @芋艿报告途径是不是非必须 -->
<el-form-item label="报工途径" prop="channel">
<el-select
v-model="formData.channel"
@ -53,20 +50,11 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="批次号" prop="batchCode">
<el-input
v-model="formData.batchCode"
placeholder="请输入批次号"
:disabled="isDetail"
/>
</el-form-item>
</el-col>
</el-row>
<!-- 工单选择 -->
<!-- 工单 / 任务 / 工作站 -->
<!-- TODO @AI生产工单 select -->
<el-row>
<el-col :span="12">
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="生产工单" prop="workOrderId">
<el-select
v-model="formData.workOrderId"
@ -74,7 +62,7 @@
remote
reserve-keyword
:remote-method="searchWorkOrder"
placeholder="请搜索工单编码/名称"
placeholder="请搜索工单编码"
:disabled="isDetail"
class="!w-1/1"
@change="handleWorkOrderChange"
@ -88,7 +76,7 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="生产任务" prop="taskId">
<el-select
v-model="formData.taskId"
@ -110,11 +98,7 @@
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- 工作站 / 工序任务选中后自动填充也支持手动选择 -->
<!-- TODO @AI工作站 select -->
<el-row>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="工作站" prop="workstationId">
<el-select
v-model="formData.workstationId"
@ -135,36 +119,27 @@
</el-select>
</el-form-item>
</el-col>
<!-- TODO @AI生产任务 select -->
<el-col :span="12">
</el-row>
<!-- 工序 / 批次号 -->
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="工序" prop="processId">
<el-input v-model="processDisplay" disabled placeholder="由任务自动带入" />
</el-form-item>
</el-col>
</el-row>
<!-- 物料 / 单位 / 工艺路线自动填充只读 -->
<!-- TODO 下面的 itemDisplayscheduledQuantity 不需要 -->
<el-row>
<el-col :span="12">
<el-form-item label="产品物料" prop="itemId">
<el-input v-model="itemDisplay" disabled placeholder="由任务自动带入" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="排产数量" prop="scheduledQuantity">
<el-input-number
v-model="formData.scheduledQuantity"
:min="0"
:precision="2"
disabled
class="!w-1/1"
<el-col :span="8">
<el-form-item label="批次号" prop="batchCode">
<el-input
v-model="formData.batchCode"
placeholder="请输入批次号"
:disabled="isDetail"
/>
</el-form-item>
</el-col>
</el-row>
<!-- 数量区域 -->
<el-divider content-position="left">报工数量</el-divider>
<el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="报工数量" prop="feedbackQuantity">
<el-input-number
@ -215,7 +190,7 @@
</el-row>
<!-- 废品分类不良品>0 时展开 -->
<!-- TODO @芋艿在评审下 -->
<el-row v-if="formData.unqualifiedQuantity > 0">
<el-row :gutter="20" v-if="formData.unqualifiedQuantity > 0">
<el-col :span="8">
<el-form-item label="工废数量">
<el-input-number
@ -250,8 +225,27 @@
</el-form-item>
</el-col>
</el-row>
<!-- TODO @AI报工人报工时间审批人 -->
<el-row>
<!-- TODO @AI报工人报工时间审批人select 模式 -->
<!-- 报工人 / 报工时间 / 审核人仅编辑/详情模式展示 -->
<el-row :gutter="20" v-if="formData.id">
<el-col :span="8">
<el-form-item label="报工人">
<el-input :model-value="formData.feedbackUserNickname" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="报工时间">
<el-input :model-value="formData.feedbackTime" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="审核人">
<el-input :model-value="formData.approveUserNickname" disabled />
</el-form-item>
</el-col>
</el-row>
<!-- 备注 -->
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input
@ -277,8 +271,6 @@ import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { ProFeedbackApi, ProFeedbackVO } from '@/api/mes/pro/feedback'
import { ProWorkOrderApi } from '@/api/mes/pro/workorder'
// TODO @AI
defineOptions({ name: 'FeedbackForm' })
const { t } = useI18n()
@ -289,8 +281,9 @@ const dialogTitle = ref('')
const formLoading = ref(false)
const formType = ref('') // 'create' | 'update' | 'detail'
const formData = ref({
const formData = ref<Record<string, any>>({
id: undefined,
code: undefined,
type: undefined,
channel: undefined,
workstationId: undefined,
@ -302,7 +295,6 @@ const formData = ref({
unitMeasureId: undefined,
expireDate: undefined,
batchCode: undefined,
scheduledQuantity: 0,
feedbackQuantity: 0,
qualifiedQuantity: 0,
unqualifiedQuantity: 0,
@ -311,7 +303,10 @@ const formData = ref({
materialScrapQuantity: 0,
otherScrapQuantity: 0,
remark: undefined,
code: undefined
// RespVO
feedbackUserNickname: undefined,
feedbackTime: undefined,
approveUserNickname: undefined
})
const formRules = reactive({
@ -329,9 +324,8 @@ const isDetail = computed(() => formType.value === 'detail')
/** 是否需要检验checkFlag */
const checkFlag = ref(false)
/** 显示字段(只读) */
/** 工序显示(只读) */
const processDisplay = ref('')
const itemDisplay = ref('')
// ==================== ====================
@ -362,23 +356,19 @@ const searchTask = async (query: string) => {
/** 搜索工作站 */
const searchWorkstation = async (query: string) => {
if (!query) return
// 使 API
// TODO @ API
workstationOptions.value = []
}
/** 工单变更 */
const handleWorkOrderChange = (workOrderId: number) => {
//
/** 工单变更:清空任务相关字段 */
const handleWorkOrderChange = () => {
formData.value.taskId = undefined
formData.value.routeId = undefined
formData.value.processId = undefined
formData.value.itemId = undefined
formData.value.unitMeasureId = undefined
formData.value.workstationId = undefined
formData.value.scheduledQuantity = 0
processDisplay.value = ''
itemDisplay.value = ''
taskOptions.value = []
checkFlag.value = false
}
@ -392,12 +382,31 @@ const handleTaskChange = (taskId: number) => {
formData.value.itemId = task.itemId
formData.value.unitMeasureId = task.unitMeasureId
formData.value.workstationId = task.workstationId
formData.value.scheduledQuantity = task.quantity
processDisplay.value = task.processCode ? task.processCode + ' - ' + task.processName : ''
itemDisplay.value = task.itemCode ? task.itemCode + ' - ' + task.itemName : ''
// TODO @ checkFlag routeProcess
}
// ==================== ====================
/** 生成报工单编号(前端生成) */
const generateCode = () => {
const now = new Date()
const pad = (n: number) => n.toString().padStart(2, '0')
const dateStr =
now.getFullYear().toString() +
pad(now.getMonth() + 1) +
pad(now.getDate()) +
pad(now.getHours()) +
pad(now.getMinutes()) +
pad(now.getSeconds())
const random = Math.floor(Math.random() * 1000)
.toString()
.padStart(3, '0')
return 'FB' + dateStr + random
}
// ==================== ====================
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
@ -407,12 +416,11 @@ const open = async (type: string, id?: number) => {
if (id) {
formLoading.value = true
try {
const data = (await ProFeedbackApi.getFeedback(id)) as any
formData.value = data
const data = await ProFeedbackApi.getFeedback(id)
formData.value = data as any
//
processDisplay.value = data.processCode ? data.processCode + ' - ' + data.processName : ''
itemDisplay.value = data.itemCode ? data.itemCode + ' - ' + data.itemName : ''
checkFlag.value = data.checkFlag || false
checkFlag.value = (data as any).checkFlag || false
// select
if (data.workOrderId) {
workOrderOptions.value = [
@ -430,6 +438,9 @@ const open = async (type: string, id?: number) => {
} finally {
formLoading.value = false
}
} else {
//
formData.value.code = generateCode()
}
}
@ -460,6 +471,7 @@ const submitForm = async () => {
const resetForm = () => {
formData.value = {
id: undefined,
code: undefined,
type: undefined,
channel: undefined,
workstationId: undefined,
@ -471,7 +483,6 @@ const resetForm = () => {
unitMeasureId: undefined,
expireDate: undefined,
batchCode: undefined,
scheduledQuantity: 0,
feedbackQuantity: 0,
qualifiedQuantity: 0,
unqualifiedQuantity: 0,
@ -480,13 +491,14 @@ const resetForm = () => {
materialScrapQuantity: 0,
otherScrapQuantity: 0,
remark: undefined,
code: undefined
feedbackUserNickname: undefined,
feedbackTime: undefined,
approveUserNickname: undefined
}
workOrderOptions.value = []
taskOptions.value = []
workstationOptions.value = []
processDisplay.value = ''
itemDisplay.value = ''
checkFlag.value = false
formRef.value?.resetFields()
}

View File

@ -33,15 +33,25 @@
/>
</el-select>
</el-form-item>
<!-- TODO @AIselect -->
<el-form-item label="工单编号" prop="workOrderId">
<el-input
<!-- TODO @AIselect增加一个 workOrder select 组件 -->
<el-form-item label="生产工单" prop="workOrderId">
<el-select
v-model="queryParams.workOrderId"
placeholder="请输入工单编号"
filterable
remote
reserve-keyword
:remote-method="searchWorkOrder"
placeholder="请搜索工单编码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
>
<el-option
v-for="item in workOrderOptions"
:key="item.id"
:label="item.code"
:value="item.id"
/>
</el-select>
</el-form-item>
<!-- TODO @AI产品物料 select -->
<!-- TODO @AI报工人 select -->
@ -136,21 +146,24 @@
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:pro-feedback:update']">
v-hasPermi="['mes:pro-feedback:update']"
>
编辑
</el-button>
<el-button
link
type="success"
@click="handleSubmit(scope.row.id)"
v-hasPermi="['mes:pro-feedback:update']">
v-hasPermi="['mes:pro-feedback:update']"
>
提交
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:pro-feedback:delete']">
v-hasPermi="['mes:pro-feedback:delete']"
>
删除
</el-button>
</template>
@ -160,14 +173,16 @@
link
type="warning"
@click="handleReject(scope.row.id)"
v-hasPermi="['mes:pro-feedback:update']">
v-hasPermi="['mes:pro-feedback:update']"
>
驳回
</el-button>
<el-button
link
type="success"
@click="handleExecute(scope.row.id)"
v-hasPermi="['mes:pro-feedback:update']">
v-hasPermi="['mes:pro-feedback:update']"
>
执行
</el-button>
<el-button
@ -206,12 +221,11 @@
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { ProFeedbackApi, ProFeedbackVO } from '@/api/mes/pro/feedback'
import { ProWorkOrderApi } from '@/api/mes/pro/workorder'
import FeedbackForm from './FeedbackForm.vue'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { MesProFeedbackStatusEnum } from '@/views/mes/utils/constants'
// TODO @AI
defineOptions({ name: 'MesProFeedback' })
const message = useMessage()
@ -232,6 +246,14 @@ const queryParams = reactive({
const queryFormRef = ref()
const exportLoading = ref(false)
/** 工单远程搜索选项 */
const workOrderOptions = ref<any[]>([])
const searchWorkOrder = async (query: string) => {
if (!query) return
const data = await ProWorkOrderApi.getWorkOrderPage({ pageNo: 1, pageSize: 20, code: query })
workOrderOptions.value = data.list
}
/** 查询列表 */
const getList = async () => {
loading.value = true