style:生产计划-试产-检验明细列表接口修改,添加审核功能

main
黄伟杰 2 weeks ago
parent 6e21cb25a8
commit 71c7f5406c

@ -40,6 +40,10 @@ export const ZjTaskApi = {
return await request.get({ url: `/mes/zj-task/page`, params }) return await request.get({ url: `/mes/zj-task/page`, params })
}, },
getZjTaskList: async (params: { ticket: string }) => {
return await request.get({ url: `/mes/zj-task/list`, params })
},
createZjTask: async (data: ZjTaskVO) => { createZjTask: async (data: ZjTaskVO) => {
return await request.post({ url: `/mes/zj-task/create`, data }) return await request.post({ url: `/mes/zj-task/create`, data })
}, },

@ -120,7 +120,14 @@
<el-tab-pane :label="t('ProductionPlan.Plan.tabToStoreLabel')" name="4" /> <el-tab-pane :label="t('ProductionPlan.Plan.tabToStoreLabel')" name="4" />
<el-tab-pane :label="t('ProductionPlan.Plan.tabStoredLabel')" name="5" /> <el-tab-pane :label="t('ProductionPlan.Plan.tabStoredLabel')" name="5" />
</el-tabs> </el-tabs>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table
ref="tableRef"
v-loading="loading"
:data="list"
:stripe="true"
:show-overflow-tooltip="true"
row-key="id"
>
<!-- 投料进度子表的列表 --> <!-- 投料进度子表的列表 -->
<el-table-column type="expand"> <el-table-column type="expand">
<template #default="scope"> <template #default="scope">
@ -139,7 +146,10 @@
</el-tabs> --> </el-tabs> -->
<el-tabs v-if="scope.row.status == 6" model-value="zj"> <el-tabs v-if="scope.row.status == 6" model-value="zj">
<el-tab-pane :label="t('ProductionPlan.Plan.detailInspectTabLabel')" name="zj"> <el-tab-pane :label="t('ProductionPlan.Plan.detailInspectTabLabel')" name="zj">
<ZjProductPreList :product-id="scope.row.productId"/> <ZjProductPreList
:ticket="scope.row.id"
@inspectable-change="(hasPending) => setInspectable(scope.row.id, hasPending)"
/>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
<el-tabs v-if="scope.row.status >= 2 && scope.row.status != 6" model-value="itemRequisitionDetail"> <el-tabs v-if="scope.row.status >= 2 && scope.row.status != 6" model-value="itemRequisitionDetail">
@ -236,8 +246,8 @@
<el-button <el-button
link link
type="primary" type="primary"
@click="openZjProductForm(scope.row.productId,'pre',6,scope.row.id,scope.row.isZj)" @click.stop="handleInspectExpand(scope.row)"
v-if="scope.row.status === 6" v-if="scope.row.status === 6 && inspectableMap[scope.row.id] !== false"
> >
{{ t('ProductionPlan.Plan.actionInspectLabel') }} {{ t('ProductionPlan.Plan.actionInspectLabel') }}
</el-button> </el-button>
@ -324,8 +334,6 @@
<!-- 详情弹窗 --> <!-- 详情弹窗 -->
<PlanDetail ref="detailRef" /> <PlanDetail ref="detailRef" />
<!-- 产品质检弹出 -->
<ZjProductRecord ref="zjProductRecordFormRef" @success="getList" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -344,7 +352,7 @@ import Baogong from "./components/Baogong.vue";
import ItemRequisitionDetailList from "@/views/mes/itemrequisition/components/ItemRequisitionDetailList.vue"; import ItemRequisitionDetailList from "@/views/mes/itemrequisition/components/ItemRequisitionDetailList.vue";
import ZjProductPreList from "@/views/mes/zjproduct/components/ZjProductPreList.vue"; import ZjProductPreList from "@/views/mes/zjproduct/components/ZjProductPreList.vue";
import BaogongRecordList from "@/views/mes/baogongrecord/components/BaogongRecordList.vue"; import BaogongRecordList from "@/views/mes/baogongrecord/components/BaogongRecordList.vue";
import ZjProductRecord from "@/views/mes/zjproductrecord/components/ZjProductRecordForm.vue"; import { ZjTaskApi } from '@/api/mes/zjtask'
const productList = ref<ProductVO[]>([]) // const productList = ref<ProductVO[]>([]) //
const taskList = ref<TaskVO[]>([]) // const taskList = ref<TaskVO[]>([]) //
@ -358,6 +366,8 @@ const {query} = useRoute() // 查询参数
const loading = ref(true) // const loading = ref(true) //
const list = ref<PlanVO[]>([]) // const list = ref<PlanVO[]>([]) //
const total = ref(0) // const total = ref(0) //
const tableRef = ref()
const inspectableMap = reactive<Record<number, boolean | undefined>>({})
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
@ -395,6 +405,7 @@ const getList = async () => {
const data = await PlanApi.getPlanPage(queryParams) const data = await PlanApi.getPlanPage(queryParams)
list.value = data.list list.value = data.list
total.value = data.total total.value = data.total
await refreshInspectableMap(list.value)
} finally { } finally {
loading.value = false loading.value = false
} }
@ -485,10 +496,36 @@ const openBaogongForm = (planCode: string, planId: number) => {
baogongFormRef.value.open(planCode, planId) baogongFormRef.value.open(planCode, planId)
} }
/** 质检 */ const handleInspectExpand = (row: PlanVO) => {
const zjProductRecordFormRef = ref() tableRef.value?.toggleRowExpansion?.(row, true)
const openZjProductForm = (productId: number,type:string, status:number,id: number, isZj: number) => { }
zjProductRecordFormRef.value.open(productId,type,status,id,isZj)
const setInspectable = (id: number | undefined, hasPending: boolean) => {
if (!id) return
inspectableMap[id] = hasPending
}
const refreshInspectableMap = async (rows: PlanVO[]) => {
const ids = rows
.filter((row) => row?.id && String(row.status) === '6')
.map((row) => row.id as number)
const idSet = new Set(ids)
for (const key of Object.keys(inspectableMap)) {
const id = Number(key)
if (!idSet.has(id)) delete inspectableMap[id]
}
await Promise.all(
ids.map(async (id) => {
try {
const data = await ZjTaskApi.getZjTaskList({ ticket: String(id) })
const arr = Array.isArray(data) ? data : data?.list ?? data?.data ?? []
const hasPending = arr.some((item: any) => String(item?.status) === '0')
inspectableMap[id] = hasPending
} catch {
inspectableMap[id] = true
}
})
)
} }

@ -1,5 +1,5 @@
<template> <template>
<Dialog v-model="dialogVisible" :title="dialogTitle" width="1500px"> <Dialog v-model="dialogVisible" :title="dialogTitle" width="1500px" append-to-body>
<el-table <el-table
v-loading="loading" v-loading="loading"
:data="list" :data="list"

@ -2,78 +2,115 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="工序" align="center" prop="type"> <el-table-column :label="t('QualityManagement.ZjTask.index')" type="index" width="80" />
<template #default="scope"> <el-table-column :label="t('QualityManagement.ZjTask.code')" align="center" prop="code" min-width="160" />
<dict-tag :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.type" /> <el-table-column :label="t('QualityManagement.ZjTask.type')" align="center" width="120">
<template #default="scope">
<DictTag type="mes_zj_task_type" :value="scope.row.type" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="名称" align="center" prop="name" /> <el-table-column :label="t('QualityManagement.ZjTask.status')" align="center" prop="status" width="120">
<el-table-column label="单位" align="center" prop="unit" /> <template #default="scope">
<el-table-column label="上限值" align="center" prop="upperVal" /> <DictTag :type="'job_status'" :value="scope.row.status" />
<el-table-column label="下限值" align="center" prop="lowerVal" /> </template>
<el-table-column label="备注" align="center" prop="remark" /> </el-table-column>
<el-table-column :label="t('QualityManagement.ZjTask.ticketCode')" align="center" prop="ticketCode" min-width="160" />
<el-table-column :label="t('QualityManagement.ZjTask.orgType')" align="center" prop="orgType" min-width="120">
<template #default="scope">
<DictTag :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.orgType" />
</template>
</el-table-column>
<el-table-column :label="t('QualityManagement.ZjTask.schemaName')" align="center" prop="schemaName" min-width="160" />
<el-table-column :label="t('QualityManagement.ZjTask.managerName')" align="center" prop="managerName" min-width="120" />
<el-table-column :label="t('QualityManagement.ZjTask.executorName')" align="center" prop="executorName" min-width="120" />
<el-table-column :label="t('QualityManagement.ZjTask.executeTime')" align="center" prop="executeTime" min-width="180" :formatter="dateFormatter" />
<el-table-column :label="t('QualityManagement.ZjTask.remark')" align="center" prop="remark" min-width="160" />
<el-table-column :label="t('QualityManagement.ZjTask.result')" align="center" prop="result" width="120">
<template #default="scope">
<el-tag v-if="scope.row.result === '1' || scope.row.result === 1" type="success">
{{ t('QualityManagement.ZjTask.resultPass') }}
</el-tag>
<el-tag v-else-if="scope.row.result === '2' || scope.row.result === 2" type="danger">
{{ t('QualityManagement.ZjTask.resultFail') }}
</el-tag>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column :label="t('QualityManagement.ZjTask.operate')" align="center" width="160" fixed="right">
<template #default="scope">
<el-button
v-if="scope.row.status === 0"
link
type="warning"
@click.stop="handleRowClick(scope.row)"
>
{{ t('QualityManagement.ZjTask.inspect') }}
</el-button>
<span v-else>-</span>
</template>
</el-table-column>
</el-table> </el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap> </ContentWrap>
<!-- 表单弹窗添加/修改 --> <ZjTaskResultDialog ref="resultDialogRef" @success="getList" />
<ZjProductForm ref="formRef" @success="getList" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter } from '@/utils/formatTime'
import { ZjProductApi, ZjProductVO } from '@/api/mes/zjproduct' import { ZjTaskApi, ZjTaskVO } from '@/api/mes/zjtask'
import ZjProductForm from './ZjProductForm.vue' import { DictTag } from '@/components/DictTag'
import {DICT_TYPE} from '@/utils/dict' import { DICT_TYPE } from '@/utils/dict'
import ZjTaskResultDialog from '@/views/mes/zjTask/components/ZjTaskResultDialog.vue'
/** 质量管理-质检参数 列表 */ /** 质量管理-质检参数 列表 */
defineOptions({ name: 'ZjProductPreList' }) defineOptions({ name: 'ZjProductPreList' })
type ZjTaskListRow = ZjTaskVO & { ticketCode?: string; executeTime?: string }
const props = defineProps<{ const props = defineProps<{
productId?: number // id ticket?: number | string // id
}>() }>()
const message = useMessage() // const emit = defineEmits<{
const { t } = useI18n() // inspectableChange: [hasPending: boolean]
}>()
const { t } = useI18n()
const loading = ref(false) // const loading = ref(false) //
const list = ref<ZjProductVO[]>([]) // const list = ref<ZjTaskListRow[]>([]) //
const total = ref(0) // const resultDialogRef = ref()
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
type: undefined,
name: undefined,
unit: undefined,
upperVal: undefined,
lowerVal: undefined,
remark: undefined,
createTime: [],
productId: undefined
})
/** 查询列表 */ /** 查询列表 */
const getList = async () => { const getList = async () => {
const ticket = props.ticket === undefined || props.ticket === null ? '' : String(props.ticket)
if (!ticket) {
list.value = []
emit('inspectableChange', false)
return
}
loading.value = true loading.value = true
try { try {
list.value = await ZjProductApi.getZjProductByProductId(props.productId) const data = await ZjTaskApi.getZjTaskList({ ticket })
list.value = Array.isArray(data) ? data : data?.list ?? data?.data ?? []
const hasPending = list.value.some((item) => String(item?.status) === '0')
emit('inspectableChange', hasPending)
} finally { } finally {
loading.value = false loading.value = false
} }
} }
const handleRowClick = (row: ZjTaskListRow) => {
if (!row?.id) return
resultDialogRef.value?.open({ id: row.id, status: row.status, cancelReason: (row as any).cancelReason })
}
watch(
() => props.ticket,
() => {
getList()
},
{ immediate: true }
)
/** 初始化 **/
onMounted(() => {
getList()
})
</script> </script>

Loading…
Cancel
Save