✨ feat(mes): 添加报工审批功能,优化状态管理

新增报工审批功能,包括审批通过和驳回的逻辑,优化了状态枚举和表单交互,提升用户体验。
pull/871/MERGE
YunaiV 2026-03-19 13:09:37 +08:00
parent 424f3d04c1
commit 434d68ac11
3 changed files with 74 additions and 68 deletions

View File

@ -207,9 +207,16 @@
</el-col>
</el-row>
</el-form>
<template #footer v-if="!isDetail">
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
<el-button @click="dialogVisible = false">取 消</el-button>
<template #footer>
<template v-if="formType === 'approve'">
<el-button type="success" @click="handleApprove" :disabled="formLoading">通过</el-button>
<el-button type="danger" @click="handleReject" :disabled="formLoading">不通过</el-button>
<el-button @click="dialogVisible = false">取 消</el-button>
</template>
<template v-else-if="!isDetail">
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
<el-button @click="dialogVisible = false">取 消</el-button>
</template>
</template>
</Dialog>
</template>
@ -239,6 +246,9 @@ const dialogTitle = computed(() => {
if (formType.value === 'create') {
return '添加生产报工记录'
}
if (formType.value === 'approve') {
return '审批生产报工'
}
return '修改生产报工记录'
})
const formData = ref<Record<string, any>>({
@ -275,7 +285,7 @@ const formRules = reactive({
approveUserId: [{ required: true, message: '审核人不能为空', trigger: 'change' }]
})
const formRef = ref() // 表单 Ref
const isDetail = computed(() => formType.value === 'detail') // 是否为详情模式
const isDetail = computed(() => formType.value === 'detail' || formType.value === 'approve') // 是否为只读模式(详情/审批)
const checkFlag = ref(true) // 是否需要检验(默认 true,未选任务时只展示报工数量)
// ==================== 级联选择回调 ====================
@ -415,6 +425,36 @@ const submitForm = async () => {
}
}
/** 审批通过 */
const handleApprove = async () => {
formLoading.value = true
try {
const finished = await ProFeedbackApi.approveFeedback(formData.value.id!)
if (finished) {
message.success('报工单已审批完成')
} else {
message.success('报工成功,请等待质量检验完成!')
}
dialogVisible.value = false
emit('success')
} finally {
formLoading.value = false
}
}
/** 审批不通过(驳回) */
const handleReject = async () => {
formLoading.value = true
try {
await ProFeedbackApi.rejectFeedback(formData.value.id!)
message.success('报工单已驳回')
dialogVisible.value = false
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {

View File

@ -107,7 +107,6 @@
:show-overflow-tooltip="true"
row-key="id"
>
<!-- DONE @AI:这里点击后,跳转详情;然后,去掉下面的【详情】按钮 -->
<el-table-column label="报工单号" align="center" prop="code" width="160">
<template #default="scope">
<el-button link type="primary" @click="openForm('detail', scope.row.id)">{{
@ -171,14 +170,11 @@
删除
</el-button>
</template>
<!-- 审批中状态:驳回、执行、取消 -->
<!-- DONE @AI:把【审批】【驳回】融合,点击后弹出一个界面,里面通过/不通过 -->
<!-- TODO @AI:弹出,继续是 Form 组件,参考 /Users/yunai/Java/yudao-all-in-one/yudao-ui-admin-vue3/src/views/mes/wm/returnvendor/ReturnVendorForm.vue -->
<template v-if="scope.row.status === MesProFeedbackStatusEnum.APPROVING">
<template v-if="scope.row.status === MesProFeedbackStatusEnum.APPROVING && scope.row.approveUserId === currentUserId">
<el-button
link
type="primary"
@click="openApproveDialog(scope.row.id)"
@click="openForm('approve', scope.row.id)"
v-hasPermi="['mes:pro-feedback:approve']"
>
审批
@ -198,17 +194,6 @@
<!-- 表单弹窗:添加/修改 -->
<FeedbackForm ref="formRef" @success="getList" />
<!-- 审批弹窗 -->
<Dialog title="审批报工" v-model="approveDialogVisible" width="400px">
<div style="text-align: center; padding: 20px 0">
<p style="margin-bottom: 20px; font-size: 14px">请确认审批结果</p>
<el-button type="success" size="large" @click="handleApprove">通过</el-button>
<el-button type="danger" size="large" @click="handleReject" style="margin-left: 24px"
>不通过</el-button
>
</div>
</Dialog>
</template>
<script setup lang="ts">
@ -221,15 +206,17 @@ import UserSelect from '@/views/system/user/components/UserSelect.vue'
import FeedbackForm from './FeedbackForm.vue'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { MesProFeedbackStatusEnum } from '@/views/mes/utils/constants'
import { useUserStore } from '@/store/modules/user'
defineOptions({ name: 'MesProFeedback' })
const message = useMessage()
const { t } = useI18n()
const message = useMessage() // 消息弹窗
const { t } = useI18n() // 国际化
const currentUserId = useUserStore().getUser.id // 当前登录用户 ID
const loading = ref(true)
const list = ref<ProFeedbackVO[]>([])
const total = ref(0)
const loading = ref(true) // 列表的加载中
const list = ref<ProFeedbackVO[]>([]) // 列表的数据
const total = ref(0) // 列表的总页数
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
@ -242,8 +229,8 @@ const queryParams = reactive({
status: undefined,
feedbackTime: undefined
})
const queryFormRef = ref()
const exportLoading = ref(false)
const queryFormRef = ref() // 搜索的表单
const exportLoading = ref(false) // 导出的加载中
/** 查询列表 */
const getList = async () => {
@ -257,75 +244,54 @@ const getList = async () => {
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
// 删除的二次确认
await message.delConfirm()
// 发起删除
await ProFeedbackApi.deleteFeedback(id)
message.success(t('common.delSuccess'))
// 刷新列表
await getList()
} catch {}
}
/** 提交报工单 */
const handleSubmit = async (id: number) => {
try {
await message.confirm('确认要提交该报工单吗?')
await ProFeedbackApi.submitFeedback(id)
message.success('报工单已提交')
// 刷新列表
await getList()
} catch {}
}
// ==================== 审批弹窗 ====================
const approveDialogVisible = ref(false)
const approveTargetId = ref<number>()
const openApproveDialog = (id: number) => {
approveTargetId.value = id
approveDialogVisible.value = true
}
const handleApprove = async () => {
try {
const id = approveTargetId.value!
approveDialogVisible.value = false
const finished = await ProFeedbackApi.approveFeedback(id)
if (finished) {
message.success('报工单已审批完成')
} else {
message.success('报工成功,请等待质量检验完成!')
}
await getList()
} catch {}
}
const handleReject = async () => {
try {
const id = approveTargetId.value!
approveDialogVisible.value = false
await ProFeedbackApi.rejectFeedback(id)
message.success('报工单已驳回')
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
// 导出的二次确认
await message.exportConfirm()
// 发起导出
exportLoading.value = true
const data = await ProFeedbackApi.exportFeedback(queryParams)
download.excel(data, '生产报工.xls')
@ -334,6 +300,7 @@ const handleExport = async () => {
}
}
/** 初始化 */
onMounted(async () => {
await getList()
})

View File

@ -164,13 +164,12 @@ export const MesQcStatusEnum = {
}
/** MES 生产报工状态枚举 */
// TODO @芋艿:【晚点弄】需要对其 MesOrderStatusConstants
export const MesProFeedbackStatusEnum = {
PREPARE: 0, // 草稿
APPROVING: 1, // 审批中
UNCHECK: 2, // 待检验
FINISHED: 3, // 已完成
CANCELED: 4 // 已取消
PREPARE: MesOrderStatusConstants.DRAFT, // 草稿
APPROVING: MesOrderStatusConstants.APPROVING, // 审批中
UNCHECK: MesOrderStatusConstants.APPROVED, // 待检验
FINISHED: MesOrderStatusConstants.FINISHED, // 已完成
CANCELED: MesOrderStatusConstants.CANCELLED // 已取消
}
/** MES 安灯处置状态枚举 */