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 })
},
getZjTaskList: async (params: { ticket: string }) => {
return await request.get({ url: `/mes/zj-task/list`, params })
},
createZjTask: async (data: ZjTaskVO) => {
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.tabStoredLabel')" name="5" />
</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">
<template #default="scope">
@ -139,7 +146,10 @@
</el-tabs> -->
<el-tabs v-if="scope.row.status == 6" model-value="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-tabs>
<el-tabs v-if="scope.row.status >= 2 && scope.row.status != 6" model-value="itemRequisitionDetail">
@ -236,8 +246,8 @@
<el-button
link
type="primary"
@click="openZjProductForm(scope.row.productId,'pre',6,scope.row.id,scope.row.isZj)"
v-if="scope.row.status === 6"
@click.stop="handleInspectExpand(scope.row)"
v-if="scope.row.status === 6 && inspectableMap[scope.row.id] !== false"
>
{{ t('ProductionPlan.Plan.actionInspectLabel') }}
</el-button>
@ -324,8 +334,6 @@
<!-- 详情弹窗 -->
<PlanDetail ref="detailRef" />
<!-- 产品质检弹出 -->
<ZjProductRecord ref="zjProductRecordFormRef" @success="getList" />
</template>
<script setup lang="ts">
@ -344,7 +352,7 @@ import Baogong from "./components/Baogong.vue";
import ItemRequisitionDetailList from "@/views/mes/itemrequisition/components/ItemRequisitionDetailList.vue";
import ZjProductPreList from "@/views/mes/zjproduct/components/ZjProductPreList.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 taskList = ref<TaskVO[]>([]) //
@ -358,6 +366,8 @@ const {query} = useRoute() // 查询参数
const loading = ref(true) //
const list = ref<PlanVO[]>([]) //
const total = ref(0) //
const tableRef = ref()
const inspectableMap = reactive<Record<number, boolean | undefined>>({})
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
@ -395,6 +405,7 @@ const getList = async () => {
const data = await PlanApi.getPlanPage(queryParams)
list.value = data.list
total.value = data.total
await refreshInspectableMap(list.value)
} finally {
loading.value = false
}
@ -485,10 +496,36 @@ const openBaogongForm = (planCode: string, planId: number) => {
baogongFormRef.value.open(planCode, planId)
}
/** 质检 */
const zjProductRecordFormRef = ref()
const openZjProductForm = (productId: number,type:string, status:number,id: number, isZj: number) => {
zjProductRecordFormRef.value.open(productId,type,status,id,isZj)
const handleInspectExpand = (row: PlanVO) => {
tableRef.value?.toggleRowExpansion?.(row, true)
}
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>
<Dialog v-model="dialogVisible" :title="dialogTitle" width="1500px">
<Dialog v-model="dialogVisible" :title="dialogTitle" width="1500px" append-to-body>
<el-table
v-loading="loading"
:data="list"

@ -2,78 +2,115 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="工序" align="center" prop="type">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.type" />
<el-table-column :label="t('QualityManagement.ZjTask.index')" type="index" width="80" />
<el-table-column :label="t('QualityManagement.ZjTask.code')" align="center" prop="code" min-width="160" />
<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>
</el-table-column>
<el-table-column label="名称" align="center" prop="name" />
<el-table-column label="单位" align="center" prop="unit" />
<el-table-column label="上限值" align="center" prop="upperVal" />
<el-table-column label="下限值" align="center" prop="lowerVal" />
<el-table-column label="备注" align="center" prop="remark" />
</el-table-column>
<el-table-column :label="t('QualityManagement.ZjTask.status')" align="center" prop="status" width="120">
<template #default="scope">
<DictTag :type="'job_status'" :value="scope.row.status" />
</template>
</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>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<ZjProductForm ref="formRef" @success="getList" />
<ZjTaskResultDialog ref="resultDialogRef" @success="getList" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import { ZjProductApi, ZjProductVO } from '@/api/mes/zjproduct'
import ZjProductForm from './ZjProductForm.vue'
import {DICT_TYPE} from '@/utils/dict'
import { ZjTaskApi, ZjTaskVO } from '@/api/mes/zjtask'
import { DictTag } from '@/components/DictTag'
import { DICT_TYPE } from '@/utils/dict'
import ZjTaskResultDialog from '@/views/mes/zjTask/components/ZjTaskResultDialog.vue'
/** 质量管理-质检参数 列表 */
defineOptions({ name: 'ZjProductPreList' })
type ZjTaskListRow = ZjTaskVO & { ticketCode?: string; executeTime?: string }
const props = defineProps<{
productId?: number // id
ticket?: number | string // id
}>()
const message = useMessage() //
const { t } = useI18n() //
const emit = defineEmits<{
inspectableChange: [hasPending: boolean]
}>()
const { t } = useI18n()
const loading = ref(false) //
const list = ref<ZjProductVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
type: undefined,
name: undefined,
unit: undefined,
upperVal: undefined,
lowerVal: undefined,
remark: undefined,
createTime: [],
productId: undefined
})
const list = ref<ZjTaskListRow[]>([]) //
const resultDialogRef = ref()
/** 查询列表 */
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
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 {
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>

Loading…
Cancel
Save