Merge remote-tracking branch 'origin/main'

pull/1/head
liutao 1 month ago
commit b9e6b355b2

@ -20,6 +20,12 @@ export interface ProductVO {
purchasePrice: number // 采购价格,单位:元 purchasePrice: number // 采购价格,单位:元
salePrice: number // 销售价格,单位:元 salePrice: number // 销售价格,单位:元
minPrice: number // 最低价格,单位:元 minPrice: number // 最低价格,单位:元
deviceIds?: string // 关联设备ID列表
moldIds?: string // 关联模具ID列表
devices?: { id: number; name: string }[] // 关联设备列表
molds?: { id: number; name: string }[] // 关联模具列表
deviceList?: any[]
moldList?: any[]
} }
// ERP 产品 API // ERP 产品 API

@ -6,6 +6,7 @@ export interface TaskVO {
code: string // 编码 code: string // 编码
orderDate: Date // 下达日期 orderDate: Date // 下达日期
deliveryDate: Date // 交货日期 deliveryDate: Date // 交货日期
isUrgent: string // 是否急单0-否 1-是
status: number // 状态 status: number // 状态
processInstanceId: string // 流程实例的编号 processInstanceId: string // 流程实例的编号
remark: string // 备注 remark: string // 备注

@ -0,0 +1,146 @@
<template>
<Dialog :title="title" v-model="dialogVisible" :appendToBody="true" width="1080">
<ContentWrap>
<el-table
ref="tableRef"
v-loading="loading"
:data="list"
:row-key="resolveRowKey"
:show-overflow-tooltip="true"
:stripe="true"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" reserve-selection />
<el-table-column
v-for="column in columns"
:key="column.prop"
:label="column.label"
:prop="column.prop"
:width="column.width"
:min-width="column.minWidth"
:align="column.align || 'center'"
/>
</el-table>
<Pagination
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
</ContentWrap>
<template #footer>
<el-button type="primary" @click="submitSelection"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import type { ElTable } from 'element-plus'
defineOptions({ name: 'TableSelectDialog' })
type TableColumn = {
label: string
prop: string
width?: string | number
minWidth?: string | number
align?: 'left' | 'center' | 'right'
}
const props = withDefaults(
defineProps<{
title: string
columns: TableColumn[]
fetchApi: (params: Record<string, any>) => Promise<{ list: any[]; total: number }>
rowKey?: string
pageSize?: number
initialRows?: any[]
}>(),
{
rowKey: 'id',
pageSize: 10,
initialRows: () => []
}
)
const emit = defineEmits<{
(e: 'confirm', value: { ids: (number | string)[]; rows: any[] }): void
}>()
const dialogVisible = ref(false)
const loading = ref(false)
const list = ref<any[]>([])
const total = ref(0)
const tableRef = ref<InstanceType<typeof ElTable>>()
const queryParams = reactive({
pageNo: 1,
pageSize: props.pageSize
})
const selectedMap = ref(new Map<number | string, any>())
const syncingSelection = ref(false)
const resolveRowKey = (row: Record<string, any>) => row[props.rowKey]
const refreshSelectionOnTable = async () => {
await nextTick()
const table = tableRef.value
if (!table) return
syncingSelection.value = true
try {
table.clearSelection()
const selectedIds = selectedMap.value
list.value.forEach((row) => {
const rowId = resolveRowKey(row)
if (selectedIds.has(rowId)) {
table.toggleRowSelection(row, true)
}
})
} finally {
syncingSelection.value = false
}
}
const getList = async () => {
loading.value = true
try {
const data = await props.fetchApi(queryParams)
list.value = data.list || []
total.value = data.total || 0
await refreshSelectionOnTable()
} finally {
loading.value = false
}
}
const handleSelectionChange = (rows: any[]) => {
if (syncingSelection.value) return
const pageIdSet = new Set(list.value.map((item) => resolveRowKey(item)))
pageIdSet.forEach((id) => {
selectedMap.value.delete(id)
})
rows.forEach((row) => {
selectedMap.value.set(resolveRowKey(row), row)
})
}
const open = async (rows?: any[]) => {
selectedMap.value.clear()
;(rows || props.initialRows).forEach((row) => {
selectedMap.value.set(resolveRowKey(row), row)
})
queryParams.pageNo = 1
queryParams.pageSize = props.pageSize
dialogVisible.value = true
await getList()
}
const submitSelection = () => {
const rows = Array.from(selectedMap.value.values())
const ids = rows.map((row) => resolveRowKey(row))
emit('confirm', { ids, rows })
dialogVisible.value = false
}
defineExpose({ open })
</script>

@ -3215,6 +3215,7 @@ export default {
tableOrderDateColumn: 'Order Date', tableOrderDateColumn: 'Order Date',
tableDeliveryDateColumn: 'Delivery Date', tableDeliveryDateColumn: 'Delivery Date',
tableTaskTypeColumn: 'Type', tableTaskTypeColumn: 'Type',
tableIsUrgentColumn: 'Urgent',
tableStatusColumn: 'Status', tableStatusColumn: 'Status',
tableRemarkColumn: 'Remark', tableRemarkColumn: 'Remark',
tableOperateColumn: 'Operate', tableOperateColumn: 'Operate',
@ -3234,6 +3235,9 @@ export default {
dialogDeliveryDatePlaceholder: 'Select delivery date', dialogDeliveryDatePlaceholder: 'Select delivery date',
dialogTaskTypeLabel: 'Task Type', dialogTaskTypeLabel: 'Task Type',
dialogTaskTypeTooltip: 'Source: Data Dictionary - Task Type', dialogTaskTypeTooltip: 'Source: Data Dictionary - Task Type',
dialogIsUrgentLabel: 'Urgent',
urgentNoLabel: 'No',
urgentYesLabel: 'Yes',
dialogRemarkLabel: 'Remark', dialogRemarkLabel: 'Remark',
dialogRemarkPlaceholder: 'Please enter remark', dialogRemarkPlaceholder: 'Please enter remark',
dialogSubmitButtonText: 'Confirm', dialogSubmitButtonText: 'Confirm',
@ -3241,6 +3245,7 @@ export default {
validatorDeliveryDateRequired: 'Delivery date cannot be empty', validatorDeliveryDateRequired: 'Delivery date cannot be empty',
validatorTaskTypeRequired: 'Task type cannot be empty', validatorTaskTypeRequired: 'Task type cannot be empty',
validatorIsUrgentRequired: 'Urgent flag cannot be empty',
saleDialogCodeLabel: 'Code', saleDialogCodeLabel: 'Code',
saleDialogCodePlaceholder: 'Please enter task code', saleDialogCodePlaceholder: 'Please enter task code',
@ -3385,6 +3390,7 @@ export default {
tableOrderDateColumn: 'Order Date', tableOrderDateColumn: 'Order Date',
tableDeliveryDateColumn: 'Delivery Date', tableDeliveryDateColumn: 'Delivery Date',
tableStatusColumn: 'Status', tableStatusColumn: 'Status',
tableScheduleCompletedColumn: 'Schedule Completed',
tableRemarkColumn: 'Remark', tableRemarkColumn: 'Remark',
tableOperateColumn: 'Operate', tableOperateColumn: 'Operate',

@ -3055,6 +3055,7 @@ export default {
tableOrderDateColumn: '下达日期', tableOrderDateColumn: '下达日期',
tableDeliveryDateColumn: '交货日期', tableDeliveryDateColumn: '交货日期',
tableTaskTypeColumn: '类型', tableTaskTypeColumn: '类型',
tableIsUrgentColumn: '是否急单',
tableStatusColumn: '状态', tableStatusColumn: '状态',
tableRemarkColumn: '备注', tableRemarkColumn: '备注',
tableOperateColumn: '操作', tableOperateColumn: '操作',
@ -3074,6 +3075,9 @@ export default {
dialogDeliveryDatePlaceholder: '选择交货日期', dialogDeliveryDatePlaceholder: '选择交货日期',
dialogTaskTypeLabel: '任务类型', dialogTaskTypeLabel: '任务类型',
dialogTaskTypeTooltip: '来源:数据字典-任务单类型', dialogTaskTypeTooltip: '来源:数据字典-任务单类型',
dialogIsUrgentLabel: '是否急单',
urgentNoLabel: '否',
urgentYesLabel: '是',
dialogRemarkLabel: '备注', dialogRemarkLabel: '备注',
dialogRemarkPlaceholder: '请输入备注', dialogRemarkPlaceholder: '请输入备注',
dialogSubmitButtonText: '确 定', dialogSubmitButtonText: '确 定',
@ -3081,6 +3085,7 @@ export default {
validatorDeliveryDateRequired: '交货日期不能为空', validatorDeliveryDateRequired: '交货日期不能为空',
validatorTaskTypeRequired: '任务类型不能为空', validatorTaskTypeRequired: '任务类型不能为空',
validatorIsUrgentRequired: '是否急单不能为空',
saleDialogCodeLabel: '编码', saleDialogCodeLabel: '编码',
saleDialogCodePlaceholder: '请输入任务单编码', saleDialogCodePlaceholder: '请输入任务单编码',
@ -3223,6 +3228,7 @@ export default {
tableOrderDateColumn: '下达日期', tableOrderDateColumn: '下达日期',
tableDeliveryDateColumn: '交货日期', tableDeliveryDateColumn: '交货日期',
tableStatusColumn: '状态', tableStatusColumn: '状态',
tableScheduleCompletedColumn: '是否完成排产',
tableRemarkColumn: '备注', tableRemarkColumn: '备注',
tableOperateColumn: '操作', tableOperateColumn: '操作',

@ -133,6 +133,26 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col v-if="isProductCategory" :span="12">
<el-form-item label="关联设备" prop="devices">
<el-input
:model-value="deviceDisplayText"
placeholder="点击选择设备"
readonly
@click="openDeviceSelectDialog"
/>
</el-form-item>
</el-col>
<el-col v-if="isProductCategory" :span="12">
<el-form-item label="关联模具" prop="molds">
<el-input
:model-value="moldDisplayText"
placeholder="点击选择模具"
readonly
@click="openMoldSelectDialog"
/>
</el-form-item>
</el-col>
<el-col v-if="formType === 'update'" :span="24"> <el-col v-if="formType === 'update'" :span="24">
<el-form-item :label="t('FactoryModeling.ProductInformation.qrcode')" prop="qrcodeUrl"> <el-form-item :label="t('FactoryModeling.ProductInformation.qrcode')" prop="qrcodeUrl">
<QrcodeActionCard <QrcodeActionCard
@ -159,12 +179,31 @@
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button> <el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template> </template>
</Dialog> </Dialog>
<TableSelectDialog
ref="deviceSelectDialogRef"
title="选择设备"
:columns="deviceColumns"
:fetch-api="DeviceLedgerApi.getDeviceLedgerPage"
row-key="id"
@confirm="handleDeviceSelectConfirm"
/>
<TableSelectDialog
ref="moldSelectDialogRef"
title="选择模具"
:columns="moldColumns"
:fetch-api="MoldBrandApi.getMoldPage"
row-key="id"
@confirm="handleMoldSelectConfirm"
/>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ProductApi, ProductVO } from '@/api/erp/product/product' import { ProductApi, ProductVO } from '@/api/erp/product/product'
import { ProductCategoryApi, ProductCategoryVO } from '@/api/erp/product/category' import { ProductCategoryApi, ProductCategoryVO } from '@/api/erp/product/category'
import { ProductUnitApi, ProductUnitVO } from '@/api/erp/product/unit' import { ProductUnitApi, ProductUnitVO } from '@/api/erp/product/unit'
import QrcodeActionCard from '@/components/QrcodeActionCard/index.vue' import QrcodeActionCard from '@/components/QrcodeActionCard/index.vue'
import TableSelectDialog from '@/components/TableSelectDialog/TableSelectDialog.vue'
import { DeviceLedgerApi } from '@/api/mes/deviceledger'
import { MoldBrandApi } from '@/api/erp/mold'
import { CommonStatusEnum } from '@/utils/constants' import { CommonStatusEnum } from '@/utils/constants'
import { defaultProps, handleTree } from '@/utils/tree' import { defaultProps, handleTree } from '@/utils/tree'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
@ -179,6 +218,8 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // const dialogTitle = ref('') //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update -
const deviceSelectDialogRef = ref()
const moldSelectDialogRef = ref()
const formData = ref({ const formData = ref({
id: undefined, id: undefined,
name: undefined, name: undefined,
@ -195,8 +236,156 @@ const formData = ref({
purchasePrice: undefined, purchasePrice: undefined,
salePrice: undefined, salePrice: undefined,
minPrice: undefined, minPrice: undefined,
safetyNumber: undefined safetyNumber: undefined,
devices: [] as { id: number; name: string }[],
molds: [] as { id: number; name: string }[]
})
const selectedDeviceRows = ref<any[]>([])
const selectedMoldRows = ref<any[]>([])
const findCategoryNameById = (id: number | undefined, tree: any[]): string => {
if (!id || !Array.isArray(tree) || !tree.length) return ''
const queue = [...tree]
while (queue.length) {
const node = queue.shift()
if (!node) continue
if (Number(node.id) === Number(id)) {
return String(node.name || node.label || '')
}
if (Array.isArray(node.children) && node.children.length) {
queue.push(...node.children)
}
}
return ''
}
const selectedCategoryName = computed(() => findCategoryNameById(formData.value.categoryId as any, categoryList.value))
const isProductCategory = computed(() => selectedCategoryName.value === '产品')
const getRelationName = (item: Record<string, any>, nameKeys: string[], fallbackPrefix: string, id: number) => {
for (const key of nameKeys) {
const value = item[key]
if (value !== undefined && value !== null && String(value).trim() !== '') {
return String(value)
}
}
return `${fallbackPrefix}ID:${id}`
}
const normalizeRelationList = (
value: unknown,
fallbackRows: any[] | undefined,
nameKeys: string[],
fallbackPrefix: string
): { id: number; name: string }[] => {
const fallbackMap = new Map<number, string>()
;(fallbackRows || []).forEach((row) => {
const id = Number(row?.id)
if (!Number.isFinite(id)) return
fallbackMap.set(id, getRelationName(row, nameKeys, fallbackPrefix, id))
})
const parseArray = (source: unknown): any[] => {
if (Array.isArray(source)) return source
if (typeof source === 'string') {
const content = source.trim()
if (!content) return []
try {
const parsed = JSON.parse(content.startsWith('[') ? content : `[${content}]`)
return Array.isArray(parsed) ? parsed : []
} catch {
return content.split(',').map((item) => item.trim()).filter(Boolean)
}
}
return []
}
return parseArray(value)
.map((item) => {
if (typeof item === 'object' && item !== null) {
const id = Number((item as any).id)
if (!Number.isFinite(id)) return undefined
return {
id,
name: getRelationName(item as any, nameKeys, fallbackPrefix, id)
}
}
const id = Number(item)
if (!Number.isFinite(id)) return undefined
return {
id,
name: fallbackMap.get(id) || `${fallbackPrefix}ID:${id}`
}
})
.filter((item): item is { id: number; name: string } => Boolean(item))
}
const toDeviceRows = (devices: { id: number; name: string }[]) => {
return devices.map((item) => ({
id: item.id,
deviceName: item.name,
name: item.name
}))
}
const toMoldRows = (molds: { id: number; name: string }[]) => {
return molds.map((item) => ({
id: item.id,
name: item.name
}))
}
const deviceDisplayText = computed(() => {
if (!formData.value.devices.length) return ''
if (!selectedDeviceRows.value.length) return formData.value.devices.map((item) => item.name).join('、')
return selectedDeviceRows.value.map((item) => item.deviceName || item.name || item.code || `ID:${item.id}`).join('、')
})
const moldDisplayText = computed(() => {
if (!formData.value.molds.length) return ''
if (!selectedMoldRows.value.length) return formData.value.molds.map((item) => item.name).join('、')
return selectedMoldRows.value.map((item) => item.name || item.code || `ID:${item.id}`).join('、')
}) })
const deviceColumns = [
{ label: '设备编号', prop: 'deviceCode', minWidth: 140 },
{ label: '设备名称', prop: 'deviceName', minWidth: 160 },
{ label: '设备型号', prop: 'deviceModel', minWidth: 140 },
{ label: '所属车间', prop: 'workshop', minWidth: 140 }
]
const moldColumns = [
{ label: '模具编码', prop: 'code', minWidth: 140 },
{ label: '模具名称', prop: 'name', minWidth: 160 },
{ label: '模具型号', prop: 'brandName', minWidth: 140 },
{ label: '状态', prop: 'status', minWidth: 100 }
]
const openDeviceSelectDialog = () => {
const rows = selectedDeviceRows.value.length
? selectedDeviceRows.value.map((item) => ({ ...item, id: Number(item.id) }))
: toDeviceRows(formData.value.devices)
deviceSelectDialogRef.value?.open(rows)
}
const openMoldSelectDialog = () => {
const rows = selectedMoldRows.value.length
? selectedMoldRows.value.map((item) => ({ ...item, id: Number(item.id) }))
: toMoldRows(formData.value.molds)
moldSelectDialogRef.value?.open(rows)
}
const handleDeviceSelectConfirm = (payload: { ids: (number | string)[]; rows: any[] }) => {
formData.value.devices = payload.rows
.map((item) => {
const id = Number(item.id)
if (!Number.isFinite(id)) return undefined
return {
id,
name: item.deviceName || item.name || item.code || `设备ID:${id}`
}
})
.filter((item): item is { id: number; name: string } => Boolean(item))
selectedDeviceRows.value = payload.rows
}
const handleMoldSelectConfirm = (payload: { ids: (number | string)[]; rows: any[] }) => {
formData.value.molds = payload.rows
.map((item) => {
const id = Number(item.id)
if (!Number.isFinite(id)) return undefined
return {
id,
name: item.name || item.code || `模具ID:${id}`
}
})
.filter((item): item is { id: number; name: string } => Boolean(item))
selectedMoldRows.value = payload.rows
}
const validateBarCode = (_rule, value, callback) => { const validateBarCode = (_rule, value, callback) => {
if (Boolean(formData.value.isCode)) { if (Boolean(formData.value.isCode)) {
callback() callback()
@ -225,20 +414,38 @@ const open = async (type: string, id?: number) => {
dialogTitle.value = t('action.' + type) dialogTitle.value = t('action.' + type)
formType.value = type formType.value = type
resetForm() resetForm()
const categoryData = await ProductCategoryApi.getProductCategorySimpleList()
categoryList.value = handleTree(categoryData, 'id', 'parentId')
unitList.value = await ProductUnitApi.getProductUnitSimpleList()
// //
if (id) { if (id) {
formLoading.value = true formLoading.value = true
try { try {
formData.value = await ProductApi.getProduct(id) const productData = await ProductApi.getProduct(id)
const devices = normalizeRelationList(
(productData as any).devices ?? (productData as any).deviceIds,
(productData as any).deviceList,
['name', 'deviceName', 'code'],
'设备'
)
const molds = normalizeRelationList(
(productData as any).molds ?? (productData as any).moldIds,
(productData as any).moldList,
['name', 'code'],
'模具'
)
formData.value = {
...formData.value,
...productData,
devices,
molds
}
selectedDeviceRows.value = toDeviceRows(devices)
selectedMoldRows.value = toMoldRows(molds)
} finally { } finally {
formLoading.value = false formLoading.value = false
} }
} }
//
const categoryData = await ProductCategoryApi.getProductCategorySimpleList()
categoryList.value = handleTree(categoryData, 'id', 'parentId')
//
unitList.value = await ProductUnitApi.getProductUnitSimpleList()
} }
defineExpose({ open }) // open defineExpose({ open }) // open
@ -265,6 +472,10 @@ const handleQrcodeRefreshSuccess = async (data: any) => {
formData.value.barCode = productData?.barCode ?? formData.value.barCode formData.value.barCode = productData?.barCode ?? formData.value.barCode
} }
const buildRelationIdListString = (list: { id: number; name: string }[]) => {
return list.map((item) => Number(item.id)).filter((id) => Number.isFinite(id))
}
/** 提交表单 */ /** 提交表单 */
const emit = defineEmits(['success']) // success const emit = defineEmits(['success']) // success
const submitForm = async () => { const submitForm = async () => {
@ -273,7 +484,15 @@ const submitForm = async () => {
// //
formLoading.value = true formLoading.value = true
try { try {
const data = formData.value as unknown as ProductVO const relationDevices = isProductCategory.value ? formData.value.devices : []
const relationMolds = isProductCategory.value ? formData.value.molds : []
const data = {
...formData.value,
deviceIds: buildRelationIdListString(relationDevices),
moldIds: buildRelationIdListString(relationMolds)
} as unknown as ProductVO
delete (data as any).devices
delete (data as any).molds
if (formType.value === 'create') { if (formType.value === 'create') {
await ProductApi.createProduct(data) await ProductApi.createProduct(data)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))
@ -306,9 +525,25 @@ const resetForm = () => {
weight: undefined, weight: undefined,
purchasePrice: undefined, purchasePrice: undefined,
salePrice: undefined, salePrice: undefined,
minPrice: undefined minPrice: undefined,
devices: [],
molds: []
} }
selectedDeviceRows.value = []
selectedMoldRows.value = []
formRef.value?.resetFields() formRef.value?.resetFields()
} }
watch(
() => [formData.value.categoryId, selectedCategoryName.value, categoryList.value.length],
() => {
if (!formData.value.categoryId || !categoryList.value.length) return
if (selectedCategoryName.value === '产品') return
formData.value.devices = []
formData.value.molds = []
selectedDeviceRows.value = []
selectedMoldRows.value = []
}
)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

@ -333,7 +333,10 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<div class="mb-10px text-right"> <div class="mb-10px flex justify-end gap-8px">
<el-button type="primary" plain @click="openCreateCountRuleForm">
新增产量
</el-button>
<el-button type="primary" @click="openCreateRuleForm"> <el-button type="primary" @click="openCreateRuleForm">
{{ t('DataCollection.DeviceModel.ruleCreateButton') }} {{ t('DataCollection.DeviceModel.ruleCreateButton') }}
</el-button> </el-button>
@ -364,7 +367,7 @@
{{ t('DataCollection.DeviceModel.ruleEditRuleButton') }} {{ t('DataCollection.DeviceModel.ruleEditRuleButton') }}
</el-button> </el-button>
<el-button <el-button
v-if="(scope.row.identifier || '').toString().toUpperCase() === 'ALARM'" v-if="scope.row.identifier === 'ALARM' || scope.row.identifier === 'COUNT'"
link link
type="danger" type="danger"
@click="handleRuleDelete(scope.row.id)" @click="handleRuleDelete(scope.row.id)"
@ -411,7 +414,10 @@
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div class="border border-gray-200 dark:border-gray-600 rounded-md py-12px"> <div class="border border-gray-200 dark:border-gray-600 rounded-md py-12px">
<el-form-item :label="t('DataCollection.DeviceModel.ruleDialogFieldRule')"> <el-form-item
v-if="!isCountIdentifier"
:label="t('DataCollection.DeviceModel.ruleDialogFieldRule')"
>
<el-select <el-select
v-model="ruleForm.fieldRule" v-model="ruleForm.fieldRule"
:placeholder="t('DataCollection.DeviceModel.ruleDialogFieldRulePlaceholder')" :placeholder="t('DataCollection.DeviceModel.ruleDialogFieldRulePlaceholder')"
@ -427,7 +433,7 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('DataCollection.DeviceModel.ruleDialogRule')"> <el-form-item :label="isCountIdentifier ? '四则运算规则' : t('DataCollection.DeviceModel.ruleDialogRule')">
<div class="flex items-center gap-8px"> <div class="flex items-center gap-8px">
<el-select <el-select
v-model="ruleForm.ruleAttributeId" v-model="ruleForm.ruleAttributeId"
@ -447,14 +453,14 @@
class="!w-160px" class="!w-160px"
> >
<el-option <el-option
v-for="item in ruleOperatorOptions" v-for="item in currentRuleOperatorOptions"
:key="item.value" :key="item.value"
:label="item.label" :label="item.label"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
<el-input <el-input
v-if="ruleForm.ruleOperator !== 'TRUE' && ruleForm.ruleOperator !== 'FALSE'" v-if="isCountIdentifier || (ruleForm.ruleOperator !== 'TRUE' && ruleForm.ruleOperator !== 'FALSE')"
v-model="ruleForm.ruleValue" v-model="ruleForm.ruleValue"
:placeholder="t('DataCollection.DeviceModel.ruleDialogRuleValuePlaceholder')" :placeholder="t('DataCollection.DeviceModel.ruleDialogRuleValuePlaceholder')"
class="!w-200px" class="!w-200px"
@ -463,64 +469,66 @@
</el-form-item> </el-form-item>
</div> </div>
<div <template v-if="isRunningIdentifier">
v-for="(item, index) in extraPointRules" <div
:key="index" v-for="(item, index) in extraPointRules"
class="border border-gray-200 dark:border-gray-600 rounded-md px-16px py-12px" :key="index"
> class="border border-gray-200 dark:border-gray-600 rounded-md px-16px py-12px"
<el-form-item :label="t('DataCollection.DeviceModel.ruleDialogFieldRule')"> >
<el-select <el-form-item :label="t('DataCollection.DeviceModel.ruleDialogFieldRule')">
v-model="item.rule"
:placeholder="t('DataCollection.DeviceModel.ruleDialogFieldRulePlaceholder')"
class="!w-240px"
>
<el-option
v-for="opt in currentRuleOptions"
:key="opt.value"
:label="opt.label"
:value="opt.value"
:disabled="isRuleDisabled(opt.value, item.rule)"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('DataCollection.DeviceModel.ruleDialogRule')">
<div class="flex items-center gap-8px">
<el-select <el-select
v-model="item.id" v-model="item.rule"
:placeholder="t('DataCollection.DeviceModel.ruleDialogRuleAttributePlaceholder')" :placeholder="t('DataCollection.DeviceModel.ruleDialogFieldRulePlaceholder')"
class="!w-240px" class="!w-240px"
> >
<el-option <el-option
v-for="attr in ruleAttributeOptions" v-for="opt in currentRuleOptions"
:key="attr.id"
:label="attr.attributeName || attr.attributeCode"
:value="attr.id"
/>
</el-select>
<el-select
v-model="item.operator"
:placeholder="t('DataCollection.DeviceModel.ruleDialogRuleOperatorPlaceholder')"
class="!w-160px"
>
<el-option
v-for="opt in ruleOperatorOptions"
:key="opt.value" :key="opt.value"
:label="opt.label" :label="opt.label"
:value="opt.value" :value="opt.value"
:disabled="isRuleDisabled(opt.value, item.rule)"
/> />
</el-select> </el-select>
<el-input </el-form-item>
v-if="item.operator !== 'TRUE' && item.operator !== 'FALSE'" <el-form-item :label="t('DataCollection.DeviceModel.ruleDialogRule')">
v-model="item.operatorRule" <div class="flex items-center gap-8px">
:placeholder="t('DataCollection.DeviceModel.ruleDialogRuleValuePlaceholder')" <el-select
class="!w-200px" v-model="item.id"
/> :placeholder="t('DataCollection.DeviceModel.ruleDialogRuleAttributePlaceholder')"
<el-button type="danger" link @click="handleRemovePointRule(index)"> class="!w-240px"
{{ t('DataCollection.DeviceModel.ruleDeleteRuleButton') }} >
</el-button> <el-option
</div> v-for="attr in ruleAttributeOptions"
</el-form-item> :key="attr.id"
</div> :label="attr.attributeName || attr.attributeCode"
:value="attr.id"
/>
</el-select>
<el-select
v-model="item.operator"
:placeholder="t('DataCollection.DeviceModel.ruleDialogRuleOperatorPlaceholder')"
class="!w-160px"
>
<el-option
v-for="opt in ruleOperatorOptions"
:key="opt.value"
:label="opt.label"
:value="opt.value"
/>
</el-select>
<el-input
v-if="isCountIdentifier || (item.operator !== 'TRUE' && item.operator !== 'FALSE')"
v-model="item.operatorRule"
:placeholder="t('DataCollection.DeviceModel.ruleDialogRuleValuePlaceholder')"
class="!w-200px"
/>
<el-button type="danger" link @click="handleRemovePointRule(index)">
{{ t('DataCollection.DeviceModel.ruleDeleteRuleButton') }}
</el-button>
</div>
</el-form-item>
</div>
</template>
<el-form-item v-if="isRunningIdentifier" label=" "> <el-form-item v-if="isRunningIdentifier" label=" ">
<el-button type="primary" link @click="handleAddPointRule"> <el-button type="primary" link @click="handleAddPointRule">
@ -537,7 +545,7 @@
</template> </template>
</el-dialog> </el-dialog>
<el-dialog v-model="createRuleDialogVisible" :title="t('DataCollection.DeviceModel.ruleCreateButton')" width="520px" draggable> <el-dialog v-model="createRuleDialogVisible" :title="createRuleDialogTitle" width="520px" draggable>
<el-form :model="createRuleForm" ref="createRuleFormRef" label-width="120px"> <el-form :model="createRuleForm" ref="createRuleFormRef" label-width="120px">
<el-form-item :label="t('DataCollection.DeviceModel.ruleDialogIdentifier')"> <el-form-item :label="t('DataCollection.DeviceModel.ruleDialogIdentifier')">
<el-input v-model="createRuleForm.identifier" disabled /> <el-input v-model="createRuleForm.identifier" disabled />
@ -551,7 +559,7 @@
<el-form-item :label="t('DataCollection.DeviceModel.ruleDialogDefaultValue')"> <el-form-item :label="t('DataCollection.DeviceModel.ruleDialogDefaultValue')">
<el-input v-model="createRuleForm.defaultValue" disabled /> <el-input v-model="createRuleForm.defaultValue" disabled />
</el-form-item> </el-form-item>
<el-form-item :label="t('DataCollection.DeviceModel.ruleDialogAlarmLevel')"> <el-form-item v-if="!isCreateCountRule" :label="t('DataCollection.DeviceModel.ruleDialogAlarmLevel')">
<el-select <el-select
v-model="createRuleForm.alarmLevel" v-model="createRuleForm.alarmLevel"
:placeholder="t('DataCollection.DeviceModel.ruleDialogAlarmLevelPlaceholder')" :placeholder="t('DataCollection.DeviceModel.ruleDialogAlarmLevelPlaceholder')"
@ -1089,6 +1097,12 @@ const runningRuleOptions = [
] ]
const alarmRuleOptions = [{ value: '5', label: '报警' }] const alarmRuleOptions = [{ value: '5', label: '报警' }]
const countOperatorOptions = [
{ value: '+', label: '加' },
{ value: '-', label: '减' },
{ value: '*', label: '乘' },
{ value: '/', label: '除' },
]
const currentRuleOptions = computed(() => { const currentRuleOptions = computed(() => {
const id = (ruleForm.identifier || '').toString().toUpperCase() const id = (ruleForm.identifier || '').toString().toUpperCase()
@ -1114,6 +1128,13 @@ const isRuleDisabled = (value: string, selfRule?: string | number) => {
} }
const ruleOperatorOptions = computed(() => getStrDictOptions('czsb_rules_conditions')) const ruleOperatorOptions = computed(() => getStrDictOptions('czsb_rules_conditions'))
const isCountIdentifier = computed(() => {
return (ruleForm.identifier || '').toString().toUpperCase() === 'COUNT'
})
const currentRuleOperatorOptions = computed(() => {
if (isCountIdentifier.value) return countOperatorOptions
return ruleOperatorOptions.value
})
const isRunningIdentifier = computed(() => { const isRunningIdentifier = computed(() => {
return (ruleForm.identifier || '').toString().toUpperCase() === 'RUNNING' return (ruleForm.identifier || '').toString().toUpperCase() === 'RUNNING'
@ -1224,8 +1245,10 @@ const handleRuleSubmit = async () => {
fieldRule: ruleForm.fieldRule, fieldRule: ruleForm.fieldRule,
defaultValue: ruleForm.defaultValue, defaultValue: ruleForm.defaultValue,
deviceId: ruleForm.deviceId ?? attributeDeviceId.value, deviceId: ruleForm.deviceId ?? attributeDeviceId.value,
alarmLevel: ruleForm.alarmLevel,
pointRulesVOList, pointRulesVOList,
} as any
if (!isCountIdentifier.value) {
payload.alarmLevel = ruleForm.alarmLevel
} }
await request.put({ url: '/iot/device-point-rules/update', data: payload }) await request.put({ url: '/iot/device-point-rules/update', data: payload })
@ -1282,6 +1305,13 @@ const createRuleForm = reactive({
defaultValue: '报警', defaultValue: '报警',
alarmLevel: '', alarmLevel: '',
}) })
const isCreateCountRule = computed(() => {
return createRuleForm.identifier.toString().toUpperCase() === 'COUNT'
})
const createRuleDialogTitle = computed(() => {
if (isCreateCountRule.value) return '新增产量'
return t('DataCollection.DeviceModel.ruleCreateButton')
})
const openCreateRuleForm = () => { const openCreateRuleForm = () => {
if (!attributeDeviceId.value) { if (!attributeDeviceId.value) {
@ -1294,6 +1324,17 @@ const openCreateRuleForm = () => {
createRuleForm.alarmLevel = '' createRuleForm.alarmLevel = ''
createRuleDialogVisible.value = true createRuleDialogVisible.value = true
} }
const openCreateCountRuleForm = () => {
if (!attributeDeviceId.value) {
message.error('请先选择设备')
return
}
createRuleForm.identifier = 'COUNT'
createRuleForm.fieldName = '产能'
createRuleForm.defaultValue = '产能'
createRuleForm.alarmLevel = ''
createRuleDialogVisible.value = true
}
const handleCreateRuleSubmit = async () => { const handleCreateRuleSubmit = async () => {
if (!attributeDeviceId.value) return if (!attributeDeviceId.value) return
@ -1307,8 +1348,10 @@ const handleCreateRuleSubmit = async () => {
identifier: createRuleForm.identifier, identifier: createRuleForm.identifier,
fieldName: createRuleForm.fieldName, fieldName: createRuleForm.fieldName,
defaultValue: createRuleForm.defaultValue, defaultValue: createRuleForm.defaultValue,
alarmLevel: createRuleForm.alarmLevel,
deviceId: attributeDeviceId.value, deviceId: attributeDeviceId.value,
} as any
if (!isCreateCountRule.value) {
payload.alarmLevel = createRuleForm.alarmLevel
} }
await request.post({ url: '/iot/device-point-rules/create', data: payload }) await request.post({ url: '/iot/device-point-rules/create', data: payload })
message.success('新增成功') message.success('新增成功')

@ -184,7 +184,7 @@ const resetForm = () => {
code: undefined, code: undefined,
version: '1.0', version: '1.0',
productId: undefined, productId: undefined,
unitId: 5, unitId: undefined,
yieldRate: 100, yieldRate: 100,
remark: undefined, remark: undefined,
isEnable: true isEnable: true

@ -62,6 +62,12 @@
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item :label="t('ProductionPlan.Task.dialogIsUrgentLabel')" prop="isUrgent">
<el-radio-group v-model="formData.isUrgent">
<el-radio label="0">{{ t('ProductionPlan.Task.urgentNoLabel') }}</el-radio>
<el-radio label="1">{{ t('ProductionPlan.Task.urgentYesLabel') }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="t('ProductionPlan.Task.dialogRemarkLabel')" prop="remark"> <el-form-item :label="t('ProductionPlan.Task.dialogRemarkLabel')" prop="remark">
<el-input v-model="formData.remark" :placeholder="t('ProductionPlan.Task.dialogRemarkPlaceholder')" type="textarea"/> <el-input v-model="formData.remark" :placeholder="t('ProductionPlan.Task.dialogRemarkPlaceholder')" type="textarea"/>
@ -95,6 +101,7 @@ const formData = ref({
deliveryDate: undefined, deliveryDate: undefined,
status: undefined, status: undefined,
taskType: undefined, taskType: undefined,
isUrgent: undefined,
processInstanceId: undefined, processInstanceId: undefined,
remark: undefined, remark: undefined,
isEnable: undefined, isEnable: undefined,
@ -103,6 +110,7 @@ const formData = ref({
const formRules = reactive({ const formRules = reactive({
deliveryDate: [{ required: true, message: t('ProductionPlan.Task.validatorDeliveryDateRequired'), trigger: 'blur' }], deliveryDate: [{ required: true, message: t('ProductionPlan.Task.validatorDeliveryDateRequired'), trigger: 'blur' }],
taskType: [{ required: true, message: t('ProductionPlan.Task.validatorTaskTypeRequired'), trigger: 'blur' }], taskType: [{ required: true, message: t('ProductionPlan.Task.validatorTaskTypeRequired'), trigger: 'blur' }],
isUrgent: [{ required: true, message: t('ProductionPlan.Task.validatorIsUrgentRequired'), trigger: 'change' }]
}) })
const formRef = ref() // Ref const formRef = ref() // Ref
@ -116,7 +124,11 @@ const open = async (type: string, id?: number) => {
if (id) { if (id) {
formLoading.value = true formLoading.value = true
try { try {
formData.value = await TaskApi.getTask(id) const taskData = await TaskApi.getTask(id)
formData.value = {
...taskData,
isUrgent: String(taskData?.isUrgent ?? '0')
}
} finally { } finally {
formLoading.value = false formLoading.value = false
} }
@ -155,6 +167,7 @@ const resetForm = () => {
code: undefined, code: undefined,
orderDate: undefined, orderDate: undefined,
taskType: '订单任务', taskType: '订单任务',
isUrgent: '0',
deliveryDate: undefined, deliveryDate: undefined,
status: undefined, status: undefined,
processInstanceId: undefined, processInstanceId: undefined,

@ -115,6 +115,13 @@
<dict-tag :type="DICT_TYPE.MES_TASK_TYPE" :value="scope.row.taskType" /> <dict-tag :type="DICT_TYPE.MES_TASK_TYPE" :value="scope.row.taskType" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="t('ProductionPlan.Task.tableIsUrgentColumn')" align="center" prop="isUrgent" sortable>
<template #default="scope">
<el-tag :type="String(scope.row.isUrgent) === '1' ? 'danger' : 'info'">
{{ String(scope.row.isUrgent) === '1' ? t('ProductionPlan.Task.urgentYesLabel') : t('ProductionPlan.Task.urgentNoLabel') }}
</el-tag>
</template>
</el-table-column>
<el-table-column :label="t('ProductionPlan.Task.tableStatusColumn')" align="center" prop="status" sortable> <el-table-column :label="t('ProductionPlan.Task.tableStatusColumn')" align="center" prop="status" sortable>
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.MES_TASK_STATUS" :value="scope.row.status" /> <dict-tag :type="DICT_TYPE.MES_TASK_STATUS" :value="scope.row.status" />

@ -49,7 +49,7 @@
</ContentWrap> </ContentWrap>
<!-- 表单弹窗添加/修改 --> <!-- 表单弹窗添加/修改 -->
<PlanForm ref="formRef" @success="getList" /> <PlanForm ref="formRef" @success="handlePlanSuccess" />
<!-- 物料列表 --> <!-- 物料列表 -->
<ItemNeedIndex ref="itemFormRef" @success="getList" /> <ItemNeedIndex ref="itemFormRef" @success="getList" />
</template> </template>
@ -64,6 +64,7 @@ const { push } = useRouter()
const props = defineProps<{ const props = defineProps<{
taskId?: number // task ID taskId?: number // task ID
}>() }>()
const emit = defineEmits(['success'])
const loading = ref(false) // const loading = ref(false) //
const list = ref([]) // const list = ref([]) //
const queryParams = reactive({ const queryParams = reactive({
@ -111,6 +112,10 @@ const addPlanForm = (taskId: number, productId: number, number?: number, taskDet
} }
formRef.value.open('create', undefined, taskId, productId, number,taskDetailIds) formRef.value.open('create', undefined, taskId, productId, number,taskDetailIds)
} }
const handlePlanSuccess = () => {
getList()
emit('success')
}
const route = useRoute() const route = useRoute()
/** 跳转生产计划页面**/ /** 跳转生产计划页面**/
const openPlan = (taskId: number, productId: number) => { const openPlan = (taskId: number, productId: number) => {

@ -1,79 +1,43 @@
<template> <template>
<ContentWrap> <ContentWrap>
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="auto"
class="-mb-15px" label-position="left">
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="auto"
label-position="left"
>
<el-form-item :label="t('ProductionPlan.TaskSummary.searchCodeLabel')" prop="code"> <el-form-item :label="t('ProductionPlan.TaskSummary.searchCodeLabel')" prop="code">
<el-input <el-input v-model="queryParams.code" :placeholder="t('ProductionPlan.TaskSummary.searchCodePlaceholder')"
v-model="queryParams.code" clearable @keyup.enter="handleQuery" class="!w-240px" />
:placeholder="t('ProductionPlan.TaskSummary.searchCodePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('ProductionPlan.TaskSummary.searchOrderLabel')" prop="orderDate"> <el-form-item :label="t('ProductionPlan.TaskSummary.searchOrderLabel')" prop="orderDate">
<el-date-picker <el-date-picker v-model="queryParams.orderDate" @change="handleQuery" value-format="YYYY-MM-DD HH:mm:ss"
v-model="queryParams.orderDate" type="daterange" :start-placeholder="t('ProductionPlan.TaskSummary.searchOrderStartPlaceholder')"
@change="handleQuery"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
:start-placeholder="t('ProductionPlan.TaskSummary.searchOrderStartPlaceholder')"
:end-placeholder="t('ProductionPlan.TaskSummary.searchOrderEndPlaceholder')" :end-placeholder="t('ProductionPlan.TaskSummary.searchOrderEndPlaceholder')"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-240px" />
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('ProductionPlan.TaskSummary.searchDeliveryLabel')" prop="deliveryDate"> <el-form-item :label="t('ProductionPlan.TaskSummary.searchDeliveryLabel')" prop="deliveryDate">
<el-date-picker <el-date-picker v-model="queryParams.deliveryDate" value-format="YYYY-MM-DD HH:mm:ss" @change="handleQuery"
v-model="queryParams.deliveryDate" type="daterange" :start-placeholder="t('ProductionPlan.TaskSummary.searchDeliveryStartPlaceholder')"
value-format="YYYY-MM-DD HH:mm:ss"
@change="handleQuery"
type="daterange"
:start-placeholder="t('ProductionPlan.TaskSummary.searchDeliveryStartPlaceholder')"
:end-placeholder="t('ProductionPlan.TaskSummary.searchDeliveryEndPlaceholder')" :end-placeholder="t('ProductionPlan.TaskSummary.searchDeliveryEndPlaceholder')"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-240px" />
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('ProductionPlan.TaskSummary.searchRemarkLabel')" prop="remark"> <el-form-item :label="t('ProductionPlan.TaskSummary.searchRemarkLabel')" prop="remark">
<el-input <el-input v-model="queryParams.remark" :placeholder="t('ProductionPlan.TaskSummary.searchRemarkPlaceholder')"
v-model="queryParams.remark" clearable @keyup.enter="handleQuery" class="!w-240px" />
:placeholder="t('ProductionPlan.TaskSummary.searchRemarkPlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item :label="t('ProductionPlan.TaskSummary.searchCreateTimeLabel')" prop="createTime"> <el-form-item :label="t('ProductionPlan.TaskSummary.searchCreateTimeLabel')" prop="createTime">
<el-date-picker <el-date-picker v-model="queryParams.createTime" @change="handleQuery" value-format="YYYY-MM-DD HH:mm:ss"
v-model="queryParams.createTime" type="daterange" :start-placeholder="t('ProductionPlan.TaskSummary.searchCreateTimeStartPlaceholder')"
@change="handleQuery"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
:start-placeholder="t('ProductionPlan.TaskSummary.searchCreateTimeStartPlaceholder')"
:end-placeholder="t('ProductionPlan.TaskSummary.searchCreateTimeEndPlaceholder')" :end-placeholder="t('ProductionPlan.TaskSummary.searchCreateTimeEndPlaceholder')"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-240px" />
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('ProductionPlan.TaskSummary.buttonSearchText') }}</el-button> <el-button @click="handleQuery">
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('ProductionPlan.TaskSummary.buttonResetText') }}</el-button> <Icon icon="ep:search" class="mr-5px" /> {{ t('ProductionPlan.TaskSummary.buttonSearchText') }}
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> {{ t('ProductionPlan.TaskSummary.buttonResetText') }}
</el-button>
<el-button <el-button type="success" plain @click="handleExport" :loading="exportLoading" v-hasPermi="['mes:task:export']">
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:task:export']"
>
<Icon icon="ep:download" class="mr-5px" /> {{ t('ProductionPlan.TaskSummary.buttonExportText') }} <Icon icon="ep:download" class="mr-5px" /> {{ t('ProductionPlan.TaskSummary.buttonExportText') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
@ -90,27 +54,30 @@
<el-tab-pane :label="t('ProductionPlan.TaskSummary.tabFinishedLabel')" name="5" /> <el-tab-pane :label="t('ProductionPlan.TaskSummary.tabFinishedLabel')" name="5" />
<el-tab-pane :label="t('ProductionPlan.TaskSummary.tabStoredLabel')" name="6" /> <el-tab-pane :label="t('ProductionPlan.TaskSummary.tabStoredLabel')" name="6" />
</el-tabs> </el-tabs>
<el-table <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" highlight-current-row
v-loading="loading" @current-change="handleCurrentChange">
:data="list" <el-table-column :label="t('ProductionPlan.TaskSummary.tableTaskCodeColumn')" align="center" prop="code"
:stripe="true" width="200px" sortable />
:show-overflow-tooltip="true" <el-table-column :label="t('ProductionPlan.TaskSummary.tableOrderDateColumn')" align="center" prop="orderDate"
highlight-current-row :formatter="dateFormatter2" sortable />
@current-change="handleCurrentChange" <el-table-column :label="t('ProductionPlan.TaskSummary.tableDeliveryDateColumn')" align="center"
> prop="deliveryDate" :formatter="dateFormatter2" sortable />
<el-table-column :label="t('ProductionPlan.TaskSummary.tableTaskCodeColumn')" align="center" prop="code" width="200px" sortable/>
<el-table-column :label="t('ProductionPlan.TaskSummary.tableOrderDateColumn')" align="center" prop="orderDate" :formatter="dateFormatter2" sortable/>
<el-table-column :label="t('ProductionPlan.TaskSummary.tableDeliveryDateColumn')" align="center" prop="deliveryDate" :formatter="dateFormatter2" sortable/>
<el-table-column :label="t('ProductionPlan.TaskSummary.tableStatusColumn')" align="center" prop="status" sortable> <el-table-column :label="t('ProductionPlan.TaskSummary.tableStatusColumn')" align="center" prop="status" sortable>
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.MES_TASK_STATUS" :value="scope.row.status" /> <dict-tag :type="DICT_TYPE.MES_TASK_STATUS" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="t('ProductionPlan.TaskSummary.tableScheduleCompletedColumn')" align="center">
<template #default="scope">
<el-tag :type="scope.row.isScheduled ? 'success' : 'info'">{{ scope.row.isScheduled ? '是' : '否' }}</el-tag>
</template>
</el-table-column>
<el-table-column :label="t('ProductionPlan.TaskSummary.tableRemarkColumn')" align="center" prop="remark" /> <el-table-column :label="t('ProductionPlan.TaskSummary.tableRemarkColumn')" align="center" prop="remark" />
<el-table-column :label="t('ProductionPlan.TaskSummary.tableOperateColumn')" align="center" min-width="200px"> <el-table-column :label="t('ProductionPlan.TaskSummary.tableOperateColumn')" align="center" min-width="200px">
<template #default="scope"> <template #default="scope">
<el-button link type="info" @click="openItemNeed(scope.row.code, scope.row.id)" v-hasPermi="['mes:task:query']"> <el-button link type="info" @click="openItemNeed(scope.row.code, scope.row.id)"
v-hasPermi="['mes:task:query']">
{{ t('ProductionPlan.TaskSummary.actionMaterialLabel') }} {{ t('ProductionPlan.TaskSummary.actionMaterialLabel') }}
</el-button> </el-button>
<el-button link type="primary" @click="openPlan(scope.row.id)" v-hasPermi="['mes:plan:query']"> <el-button link type="primary" @click="openPlan(scope.row.id)" v-hasPermi="['mes:plan:query']">
@ -123,19 +90,15 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 分页 --> <!-- 分页 -->
<Pagination <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
:total="total" @pagination="getList" />
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap> </ContentWrap>
<!-- 子表的列表 --> <!-- 子表的列表 -->
<ContentWrap> <ContentWrap>
<el-tabs model-value="taskDetail"> <el-tabs model-value="taskDetail">
<el-tab-pane :label="t('ProductionPlan.TaskSummary.detailTabSummaryLabel')" name="taskDetail"> <el-tab-pane :label="t('ProductionPlan.TaskSummary.detailTabSummaryLabel')" name="taskDetail">
<TaskDetailList :task-id="currentRow.id" /> <TaskDetailList :task-id="currentRow.id" @success="getList" />
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</ContentWrap> </ContentWrap>
@ -236,14 +199,14 @@ const openPlan = (taskId: number) => {
} }
/** 物料需求 */ /** 物料需求 */
const formRef = ref() const formRef = ref()
const openItemNeed = (taskCode:string, taskId: number) => { const openItemNeed = (taskCode: string, taskId: number) => {
formRef.value.open("task","任务单-"+taskCode, taskId) formRef.value.open("task", "任务单-" + taskCode, taskId)
} }
/** 添加/修改操作 */ /** 添加/修改操作 */
const taskPlanFormRef = ref() const taskPlanFormRef = ref()
const openTaskPlanForm = (taskId: number, taskCode:string) => { const openTaskPlanForm = (taskId: number, taskCode: string) => {
taskPlanFormRef.value.open(taskCode, taskId ) taskPlanFormRef.value.open(taskCode, taskId)
} }
/** tab 切换 */ /** tab 切换 */
let activeName = '' let activeName = ''

Loading…
Cancel
Save