Compare commits

...

9 Commits

@ -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 })
}, },

@ -19,7 +19,7 @@ alt="banner" :src="bannerImg" fit="contain" class="home-welcome-image"
<div> <div>
<el-date-picker <el-date-picker
v-model="productionOverviewRange" type="daterange" unlink-panels value-format="YYYY-MM-DD" v-model="productionOverviewRange" type="daterange" unlink-panels value-format="YYYY-MM-DD"
start-placeholder="开始日期" end-placeholder="结束日期" size="small" /> start-placeholder="开始日期" end-placeholder="结束日期" size="small" @change="handleProductionOverviewRangeChange" />
</div> </div>
</div> </div>
<el-row class="production-overview-row" :gutter="0"> <el-row class="production-overview-row" :gutter="0">
@ -534,6 +534,38 @@ const moldTypeBarOptionsData = ref<EChartsOption>({
} }
) )
const pieOptionsData = reactive<EChartsOption>(pieOptions) as EChartsOption const pieOptionsData = reactive<EChartsOption>(pieOptions) as EChartsOption
let productionOverviewRequestId = 0
const buildProductionOverviewParams = () => {
const startTime = productionOverviewRange.value
if (Array.isArray(startTime) && startTime.length === 2 && startTime[0] && startTime[1]) {
const normalizeStart = (value: string) => {
const v = String(value || '').trim()
if (!v) return ''
if (v.includes(' ') || v.includes('T')) return v
return `${v} 00:00:00`
}
const normalizeEnd = (value: string) => {
const v = String(value || '').trim()
if (!v) return ''
if (v.includes(' ') || v.includes('T')) return v
return `${v} 23:59:59`
}
return { startTime: [normalizeStart(startTime[0]), normalizeEnd(startTime[1])] }
}
return {}
}
const loadProductionOverview = async () => {
const currentId = ++productionOverviewRequestId
const data = await DashboardApi.getProduction(buildProductionOverviewParams())
if (currentId !== productionOverviewRequestId) return
production.value = data
productionOverviewLeft.value = production.value.taskItems
productionOverviewCenter.value = production.value.planItems
}
const handleProductionOverviewRangeChange = async () => {
await loadProductionOverview()
}
/** 初始化 **/ /** 初始化 **/
onMounted(async () => { onMounted(async () => {
// //
@ -544,7 +576,7 @@ onMounted(async () => {
// todayWeather.value = weatherList.value[0] // todayWeather.value = weatherList.value[0]
// weatherCity = data.city // weatherCity = data.city
// } // }
production.value = await DashboardApi.getProduction(productionOverviewRange.value) await loadProductionOverview()
plan.value = await DashboardApi.getPlan() plan.value = await DashboardApi.getPlan()
deviceStatusCards.value = await DashboardApi.getDevice() deviceStatusCards.value = await DashboardApi.getDevice()
moldStatusCards.value = await DashboardApi.getMold() moldStatusCards.value = await DashboardApi.getMold()
@ -559,8 +591,6 @@ onMounted(async () => {
console.log(moldTypeOptions) console.log(moldTypeOptions)
moldTypeBarOptionsData.value.xAxis!.data = moldTypeOptions.xaxis moldTypeBarOptionsData.value.xAxis!.data = moldTypeOptions.xaxis
moldTypeBarOptionsData.value.series![0].data = moldTypeOptions.series moldTypeBarOptionsData.value.series![0].data = moldTypeOptions.series
productionOverviewLeft.value = production.value.taskItems
productionOverviewCenter.value = production.value.planItems
}) })

@ -302,7 +302,6 @@ const queryParams = reactive({
productId: undefined, productId: undefined,
supplierId: undefined, supplierId: undefined,
inTime: [], inTime: [],
status: 10,
remark: undefined, remark: undefined,
inType: undefined, inType: undefined,
creator: undefined creator: undefined

@ -307,7 +307,6 @@ const queryParams = reactive({
outType: undefined, outType: undefined,
warehouseId: undefined, warehouseId: undefined,
outTime: [], outTime: [],
status: 10,
remark: undefined, remark: undefined,
creator: undefined creator: undefined
}) })

@ -104,12 +104,7 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-tabs v-model="activeName" @tab-click="handleTabClick"> <el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane :label="t('ErpStock.Record.categoryProduct')" name="2" /> <el-tab-pane v-for="item in categoryTabs" :key="item.id" :label="item.name" :name="String(item.id)" />
<el-tab-pane :label="t('ErpStock.Record.categoryMaterial')" name="1" />
<el-tab-pane :label="t('ErpStock.Record.categorySpare')" name="5" />
<el-tab-pane :label="t('ErpStock.Record.categoryTool')" name="3" />
<el-tab-pane :label="t('ErpStock.Record.categoryConsumable')" name="4" />
<el-tab-pane :label="t('ErpStock.Record.categoryOther')" name="0" />
</el-tabs> </el-tabs>
<el-table <el-table
@ -181,6 +176,7 @@ import download from '@/utils/download'
import { StockRecordApi, StockRecordVO } from '@/api/erp/stock/record' import { StockRecordApi, StockRecordVO } from '@/api/erp/stock/record'
import { ProductApi, ProductVO } from '@/api/erp/product/product' import { ProductApi, ProductVO } from '@/api/erp/product/product'
import { WarehouseApi, WarehouseVO } from '@/api/erp/stock/warehouse' import { WarehouseApi, WarehouseVO } from '@/api/erp/stock/warehouse'
import { ProductCategoryApi, ProductCategoryVO } from '@/api/erp/product/category'
import { erpCountTableColumnFormatter } from '@/utils' import { erpCountTableColumnFormatter } from '@/utils'
/** ERP 产品库存明细列表 */ /** ERP 产品库存明细列表 */
@ -206,6 +202,7 @@ const queryFormRef = ref() // 搜索的表单
const exportLoading = ref(false) // const exportLoading = ref(false) //
const productList = ref<ProductVO[]>([]) // const productList = ref<ProductVO[]>([]) //
const warehouseList = ref<WarehouseVO[]>([]) // const warehouseList = ref<WarehouseVO[]>([]) //
const categoryTabs = ref<ProductCategoryVO[]>([])
/** 查询列表 */ /** 查询列表 */
const getList = async () => { const getList = async () => {
@ -282,7 +279,7 @@ onActivated(() => {
}) })
onMounted(async () => { onMounted(async () => {
queryParams.categoryId = 2 await loadCategoryTabs()
await getList() await getList()
// //
productList.value = await ProductApi.getProductSimpleList() productList.value = await ProductApi.getProductSimpleList()
@ -290,9 +287,24 @@ onMounted(async () => {
}) })
/** tab 切换 */ /** tab 切换 */
let activeName = '2' const activeName = ref('')
const handleTabClick = (tab: TabsPaneContext) => { const handleTabClick = (tab: TabsPaneContext) => {
queryParams.categoryId = tab.paneName queryParams.categoryId = tab.paneName ? Number(tab.paneName) : undefined
handleQuery() handleQuery()
} }
const loadCategoryTabs = async () => {
try {
const data = await ProductCategoryApi.getProductCategoryList({})
const roots = (data || []).filter((item: any) => item && (item.parentId === 0 || item.parentId === null || item.parentId === undefined))
categoryTabs.value = roots.sort((a: any, b: any) => Number(a?.sort ?? 0) - Number(b?.sort ?? 0))
const defaultId = categoryTabs.value.find((v) => String(v.id) === '2')?.id ?? categoryTabs.value[0]?.id
queryParams.categoryId = defaultId
activeName.value = defaultId !== undefined && defaultId !== null ? String(defaultId) : ''
} catch {
categoryTabs.value = []
queryParams.categoryId = undefined
activeName.value = ''
}
}
</script> </script>

@ -150,13 +150,24 @@ const queryParams = reactive({
}) })
const queryFormRef = ref() const queryFormRef = ref()
const getList = async () => { const buildQueryParams = (): DeviceOperationRecordPageParams => {
const range = (queryParams.timeRange || []) as string[] const range = (queryParams.timeRange || []) as string[]
queryParams.startTime = range[0] const startTime = range[0]
queryParams.endTime = range[1] const endTime = range[1]
return {
pageNo: queryParams.pageNo,
pageSize: queryParams.pageSize,
deviceCode: queryParams.deviceCode,
deviceName: queryParams.deviceName,
startTime,
endTime,
ids: queryParams.ids
}
}
const getList = async () => {
loading.value = true loading.value = true
try { try {
const params = queryParams as unknown as DeviceOperationRecordPageParams const params = buildQueryParams()
const data = await DeviceOperationRecordApi.getDeviceOperationRecordPage(params) const data = await DeviceOperationRecordApi.getDeviceOperationRecordPage(params)
list.value = data.list list.value = data.list
total.value = data.total total.value = data.total
@ -179,10 +190,7 @@ const handleExport = async () => {
try { try {
await useMessage().exportConfirm() await useMessage().exportConfirm()
exportLoading.value = true exportLoading.value = true
const range = (queryParams.timeRange || []) as string[] const params = buildQueryParams()
queryParams.startTime = range[0]
queryParams.endTime = range[1]
const params = queryParams as unknown as DeviceOperationRecordPageParams
const data = await DeviceOperationRecordApi.exportDeviceOperationReport(params) const data = await DeviceOperationRecordApi.exportDeviceOperationReport(params)
download.excel(data, t('DataCollection.RunReport.exportFilename')) download.excel(data, t('DataCollection.RunReport.exportFilename'))
} catch { } catch {

@ -465,4 +465,7 @@ const resetForm = () => {
.device-ledger-manager :deep(.el-input) { .device-ledger-manager :deep(.el-input) {
flex: 1; flex: 1;
} }
:deep(.ellipsis-text){
max-width: 300px;
}
</style> </style>

@ -340,7 +340,43 @@ watch(
} }
) )
const formRules = reactive({ const formRules = reactive({
repairCode: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorRepairCodeRequired'), trigger: 'blur' }], repairCode: [
{
validator: (_: any, value: any, callback: any) => {
if (formType.value === 'update') {
callback()
return
}
if (formData.value.isCode === true) {
callback()
return
}
if (value === undefined || value === null || String(value).trim() === '') {
callback(new Error(t('EquipmentManagement.DvRepair.validatorRepairCodeRequired')))
return
}
callback()
},
trigger: 'blur',
},
],
deviceId: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorMachineryIdRequired'), trigger: 'change' }],
componentId: [
{
validator: (_: any, value: any, callback: any) => {
if (formData.value.machineryTypeId !== 2) {
callback()
return
}
if (value === undefined || value === null || value === '') {
callback(new Error(t('EquipmentManagement.DvRepair.validatorComponentRequired')))
return
}
callback()
},
trigger: 'change',
},
],
machineryId: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorMachineryIdRequired'), trigger: 'blur' }], machineryId: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorMachineryIdRequired'), trigger: 'blur' }],
machineryCode: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorMachineryCodeRequired'), trigger: 'blur' }], machineryCode: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorMachineryCodeRequired'), trigger: 'blur' }],
machineryName: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorMachineryNameRequired'), trigger: 'blur' }], machineryName: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorMachineryNameRequired'), trigger: 'blur' }],
@ -396,6 +432,16 @@ const formRules = reactive({
}) })
const formRef = ref() // Ref const formRef = ref() // Ref
watch(
() => formData.value.isCode,
(val) => {
if (val === true) {
formData.value.repairCode = undefined
}
formRef.value?.clearValidate?.(['repairCode'])
}
)
/** 子表的表单 */ /** 子表的表单 */
const subTabsName = ref('dvRepairLine') const subTabsName = ref('dvRepairLine')
const dvRepairLineFormRef = ref() const dvRepairLineFormRef = ref()

@ -146,7 +146,7 @@ const formRules = reactive({
repairId: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorLineRepairIdRequired'), trigger: 'blur' }], repairId: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorLineRepairIdRequired'), trigger: 'blur' }],
subjectId: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorLineSubjectIdRequired'), trigger: 'blur' }], subjectId: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorLineSubjectIdRequired'), trigger: 'blur' }],
subjectCode: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorLineSubjectCodeRequired'), trigger: 'blur' }], subjectCode: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorLineSubjectCodeRequired'), trigger: 'blur' }],
subjectContent: [{ required: true, message: t('EquipmentManagement.DvRepair.validatorLineSubjectContentRequired'), trigger: 'blur' }], subjectContent: [],
remark: [ remark: [
{ {
validator: (_: any, value: any, callback: any) => { validator: (_: any, value: any, callback: any) => {

@ -20,6 +20,7 @@ v-model="queryParams.timeRange" type="datetimerange" value-format="YYYY-MM-DD HH
:start-placeholder="t('EnergyManagement.EnergyDeviceCheck.searchTimeRangeStartPlaceholder')" :start-placeholder="t('EnergyManagement.EnergyDeviceCheck.searchTimeRangeStartPlaceholder')"
:end-placeholder="t('EnergyManagement.EnergyDeviceCheck.searchTimeRangeEndPlaceholder')" :end-placeholder="t('EnergyManagement.EnergyDeviceCheck.searchTimeRangeEndPlaceholder')"
:default-time="[new Date('2000-01-01 00:00:00'), new Date('2000-01-01 23:00:00')]" :default-time="[new Date('2000-01-01 00:00:00'), new Date('2000-01-01 23:00:00')]"
:shortcuts="timeRangeShortcuts"
:disabled-time="getDisabledTime" class="!w-360px " popper-class="energydevicecheckPicker" /> :disabled-time="getDisabledTime" class="!w-360px " popper-class="energydevicecheckPicker" />
</el-form-item> </el-form-item>
@ -118,9 +119,8 @@ const getDisabledTime = () => {
const buildDefaultTimeRange = () => { const buildDefaultTimeRange = () => {
const pad = (n: number) => (n < 10 ? `0${n}` : String(n)) const pad = (n: number) => (n < 10 ? `0${n}` : String(n))
const end = new Date() const end = new Date()
end.setMinutes(59, 59, 0) end.setMilliseconds(0)
const start = new Date(end.getTime() - 7 * 24 * 60 * 60 * 1000) const start = new Date(end.getTime() - 24 * 60 * 60 * 1000)
start.setMinutes(0, 0, 0)
const format = (d: Date) => { const format = (d: Date) => {
const y = d.getFullYear() const y = d.getFullYear()
const m = pad(d.getMonth() + 1) const m = pad(d.getMonth() + 1)
@ -133,6 +133,39 @@ const buildDefaultTimeRange = () => {
return [format(start), format(end)] as string[] return [format(start), format(end)] as string[]
} }
const timeRangeShortcuts = [
{
text: '今天',
value: () => {
const start = new Date()
start.setHours(0, 0, 0, 0)
const end = new Date()
end.setHours(23, 59, 59, 999)
return [start, end]
}
},
{
text: '昨天',
value: () => {
const start = new Date()
start.setDate(start.getDate() - 1)
start.setHours(0, 0, 0, 0)
const end = new Date(start)
end.setHours(23, 59, 59, 999)
return [start, end]
}
},
{
text: '7天',
value: () => {
const end = new Date()
end.setMilliseconds(0)
const start = new Date(end.getTime() - 7 * 24 * 60 * 60 * 1000)
return [start, end]
}
}
]
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,

@ -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" />
<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"> <template #default="scope">
<dict-tag :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.type" /> <DictTag type="mes_zj_task_type" :value="scope.row.type" />
</template>
</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> </template>
</el-table-column> </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> </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,
onMounted(() => { () => {
getList() getList()
}) },
{ immediate: true }
)
</script> </script>

@ -33,10 +33,10 @@
<span class="ml-8px">%</span> <span class="ml-8px">%</span>
</template> </template>
<template v-else-if="isGapMethod"> <template v-else-if="isGapMethod">
<span>{{ t('QualityManagement.ZjSchema.val') }}</span> <span>每间隔</span>
<el-input-number v-model="gapInterval" :min="1" class="!w-120px mx-8px" :controls="false" /> <el-input-number v-model="gapInterval" :min="1" class="!w-120px mx-8px" :controls="false" />
<span>{{ t('QualityManagement.ZjSchema.val') }}</span> <span>抽取</span>
<el-input-number v-model="gapCount" :min="1" class="!w-120px ml-8px" :controls="false" /> <el-input-number v-model="gapCount" :min="1" class="!w-120px mx-8px" :controls="false" />
</template> </template>
<template v-else> <template v-else>
<el-input <el-input

@ -273,8 +273,27 @@ watch(
} }
) )
const formRules = reactive({ const formRules = reactive({
repairCode: [{ required: true, message: t('MoldManagement.MoldRepair.validatorRepairCodeRequired'), trigger: 'blur' }], repairCode: [
repairName: [{ required: true, message: t('MoldManagement.MoldRepair.validatorRepairNameRequired'), trigger: 'blur' }], {
validator: (_: any, value: any, callback: any) => {
if (formType.value === 'update') {
callback()
return
}
if (formData.value.isCode === true) {
callback()
return
}
if (value === undefined || value === null || String(value).trim() === '') {
callback(new Error(t('MoldManagement.MoldRepair.validatorRepairCodeRequired')))
return
}
callback()
},
trigger: 'blur',
},
],
repairName: [],
moldId: [{ required: true, message: t('MoldManagement.MoldRepair.validatorMoldRequired'), trigger: 'change' }], moldId: [{ required: true, message: t('MoldManagement.MoldRepair.validatorMoldRequired'), trigger: 'change' }],
requireDate: [ requireDate: [
{ {
@ -330,6 +349,16 @@ const formRef = ref()
const subTabsName = ref('moldRepairLine') const subTabsName = ref('moldRepairLine')
const moldRepairLineFormRef = ref() const moldRepairLineFormRef = ref()
watch(
() => formData.value.isCode,
(val) => {
if (val === true) {
formData.value.repairCode = undefined
}
formRef.value?.clearValidate?.(['repairCode'])
}
)
const setLineRows = (rows: any[]) => { const setLineRows = (rows: any[]) => {
moldRepairLineFormRef.value?.setData(rows) moldRepairLineFormRef.value?.setData(rows)
} }

@ -88,9 +88,9 @@ const formLoading = ref(false)
const formData = ref([]) const formData = ref([])
const formRules = reactive({ const formRules = reactive({
repairId: [{ required: true, message: t('MoldManagement.MoldRepairLine.validatorRepairIdRequired'), trigger: 'blur' }], repairId: [{ required: true, message: t('MoldManagement.MoldRepairLine.validatorRepairIdRequired'), trigger: 'blur' }],
subjectId: [{ required: true, message: t('MoldManagement.MoldRepairLine.validatorSubjectIdRequired'), trigger: 'blur' }], subjectId: [],
subjectCode: [{ required: true, message: t('MoldManagement.MoldRepairLine.validatorSubjectCodeRequired'), trigger: 'blur' }], subjectCode: [],
subjectContent: [{ required: true, message: t('MoldManagement.MoldRepairLine.validatorSubjectContentRequired'), trigger: 'blur' }], subjectContent: [],
remark: [ remark: [
{ {
validator: (_: any, value: any, callback: any) => { validator: (_: any, value: any, callback: any) => {

Loading…
Cancel
Save