Merge remote-tracking branch 'origin/main'

pull/1/head
liutao 1 month ago
commit 4d4c2652d5

@ -3418,6 +3418,7 @@ export default {
detailTableTaskCodeColumn: 'Task Order',
detailTableProductCodeColumn: 'Product Code',
detailTableProductNameColumn: 'Product Name',
detailTableDeviceNameColumn: 'Device Name',
detailTableTotalNumberColumn: 'Total Quantity',
detailTablePlanNumberColumn: 'Planned',
detailTableUnplanNumberColumn: 'Unplanned',
@ -3489,6 +3490,7 @@ export default {
buttonExportText: 'Export',
tabPlannedLabel: 'Scheduled',
tabStartLabel: 'Started',
tabTrialLabel: 'Trial',
tabMassLabel: 'Mass Production',
tabPausedLabel: 'Paused',
@ -3520,6 +3522,7 @@ export default {
actionTrialLabel: 'Trial',
actionInspectLabel: 'Inspect',
actionMassLabel: 'Mass Production',
actionStartLabel: 'Start',
actionBaogongLabel: 'Report',
actionPauseLabel: 'Pause',
actionFinishLabel: 'Finish',

@ -3264,6 +3264,7 @@ export default {
detailTableTaskCodeColumn: '任务单',
detailTableProductCodeColumn: '产品编码',
detailTableProductNameColumn: '产品名称',
detailTableDeviceNameColumn: '设备名称',
detailTableTotalNumberColumn: '任务总数',
detailTablePlanNumberColumn: '已计划',
detailTableUnplanNumberColumn: '未计划',
@ -3334,6 +3335,7 @@ export default {
buttonExportText: '导出',
tabPlannedLabel: '已排产',
tabStartLabel: '已开工',
tabTrialLabel: '试产',
tabMassLabel: '量产',
tabPausedLabel: '暂停',
@ -3365,6 +3367,7 @@ export default {
actionTrialLabel: '试产',
actionInspectLabel: '检验',
actionMassLabel: '量产',
actionStartLabel: '开工',
actionBaogongLabel: '报工',
actionPauseLabel: '暂停',
actionFinishLabel: '完工',

@ -1,92 +1,46 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="auto"
>
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="auto">
<el-form-item :label="t('ProductionPlan.Plan.searchTaskLabel')" prop="taskId">
<el-select
v-model="queryParams.taskId"
@change="handleQuery"
clearable
filterable
:placeholder="t('ProductionPlan.Plan.searchTaskPlaceholder')"
class="!w-180px"
>
<el-option
v-for="item in taskList"
:key="item.id"
:label="item.code"
:value="String(item.id)"
/>
<el-select v-model="queryParams.taskId" @change="handleQuery" clearable filterable
:placeholder="t('ProductionPlan.Plan.searchTaskPlaceholder')" class="!w-180px">
<el-option v-for="item in taskList" :key="item.id" :label="item.code" :value="String(item.id)" />
</el-select>
</el-form-item>
<el-form-item :label="t('ProductionPlan.Plan.searchCodeLabel')" prop="code">
<el-input
v-model="queryParams.code"
:placeholder="t('ProductionPlan.Plan.searchCodePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-180px"
/>
<el-input v-model="queryParams.code" :placeholder="t('ProductionPlan.Plan.searchCodePlaceholder')" clearable
@keyup.enter="handleQuery" class="!w-180px" />
</el-form-item>
<el-form-item :label="t('ProductionPlan.Plan.searchProductLabel')" prop="productId">
<el-select
v-model="queryParams.productId"
@change="handleQuery"
clearable
filterable
:placeholder="t('ProductionPlan.Plan.searchProductPlaceholder')"
class="!w-180px"
>
<el-option
v-for="item in productList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
<el-select v-model="queryParams.productId" @change="handleQuery" clearable filterable
:placeholder="t('ProductionPlan.Plan.searchProductPlaceholder')" class="!w-180px">
<el-option v-for="item in productList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item :label="t('ProductionPlan.Plan.searchRemarkLabel')" prop="remark">
<el-input
v-model="queryParams.remark"
:placeholder="t('ProductionPlan.Plan.searchRemarkPlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-180px"
/>
<el-input v-model="queryParams.remark" :placeholder="t('ProductionPlan.Plan.searchRemarkPlaceholder')" clearable
@keyup.enter="handleQuery" class="!w-180px" />
</el-form-item>
<el-form-item :label="t('ProductionPlan.Plan.searchPlanStartLabel')" prop="planStartTime">
<el-date-picker
v-model="queryParams.planStartTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
@change="handleQuery"
:start-placeholder="t('ProductionPlan.Plan.searchPlanStartStartPlaceholder')"
<el-date-picker v-model="queryParams.planStartTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
@change="handleQuery" :start-placeholder="t('ProductionPlan.Plan.searchPlanStartStartPlaceholder')"
:end-placeholder="t('ProductionPlan.Plan.searchPlanStartEndPlaceholder')"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-240px" />
</el-form-item>
<el-form-item :label="t('ProductionPlan.Plan.searchPlanEndLabel')" prop="planEndTime">
<el-date-picker
v-model="queryParams.planEndTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
@change="handleQuery"
:start-placeholder="t('ProductionPlan.Plan.searchPlanEndStartPlaceholder')"
<el-date-picker v-model="queryParams.planEndTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
@change="handleQuery" :start-placeholder="t('ProductionPlan.Plan.searchPlanEndStartPlaceholder')"
:end-placeholder="t('ProductionPlan.Plan.searchPlanEndEndPlaceholder')"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-240px" />
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('ProductionPlan.Plan.buttonSearchText') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('ProductionPlan.Plan.buttonResetText') }}</el-button>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> {{ t('ProductionPlan.Plan.buttonSearchText') }}
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> {{ t('ProductionPlan.Plan.buttonResetText') }}
</el-button>
<!-- <el-button
type="primary"
plain
@ -95,13 +49,7 @@
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> -->
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:plan:export']"
>
<el-button type="success" plain @click="handleExport" :loading="exportLoading" v-hasPermi="['mes:plan:export']">
<Icon icon="ep:download" class="mr-5px" /> {{ t('ProductionPlan.Plan.buttonExportText') }}
</el-button>
</el-form-item>
@ -114,20 +62,14 @@
<!-- <el-tab-pane label="所有" name="" /> -->
<!-- <el-tab-pane label="派工" name="0" /> -->
<el-tab-pane :label="t('ProductionPlan.Plan.tabPlannedLabel')" name="1" />
<el-tab-pane :label="t('ProductionPlan.Plan.tabTrialLabel')" name="6" />
<el-tab-pane :label="t('ProductionPlan.Plan.tabMassLabel')" name="2" />
<el-tab-pane :label="t('ProductionPlan.Plan.tabStartLabel')" name="8" />
<!-- <el-tab-pane :label="t('ProductionPlan.Plan.tabTrialLabel')" name="6" /> -->
<!-- <el-tab-pane :label="t('ProductionPlan.Plan.tabMassLabel')" name="2" /> -->
<el-tab-pane :label="t('ProductionPlan.Plan.tabPausedLabel')" name="3" />
<el-tab-pane :label="t('ProductionPlan.Plan.tabToStoreLabel')" name="4" />
<el-tab-pane :label="t('ProductionPlan.Plan.tabStoredLabel')" name="5" />
</el-tabs>
<el-table
ref="tableRef"
v-loading="loading"
:data="list"
:stripe="true"
:show-overflow-tooltip="true"
row-key="id"
>
<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">
@ -146,10 +88,8 @@
</el-tabs> -->
<el-tabs v-if="scope.row.status == 6" model-value="zj">
<el-tab-pane :label="t('ProductionPlan.Plan.detailInspectTabLabel')" name="zj">
<ZjProductPreList
:ticket="scope.row.id"
@inspectable-change="(hasPending) => setInspectable(scope.row.id, hasPending)"
/>
<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">
@ -159,15 +99,24 @@
<el-tab-pane :label="t('ProductionPlan.Plan.detailBaogongRecordTabLabel')" name="baogongRecord">
<BaogongRecordList :plan-id="scope.row.id" />
</el-tab-pane>
<el-tab-pane :label="t('ProductionPlan.Plan.detailInspectTabLabel')" name="zj" v-if="scope.row.status == 8">
<ZjProductPreList :ticket="scope.row.id"
@inspectable-change="(hasPending) => setInspectable(scope.row.id, hasPending)" />
</el-tab-pane>
</el-tabs>
</template>
</el-table-column>
<el-table-column :label="t('ProductionPlan.Plan.tableCodeColumn')" align="center" prop="code" min-width="180px" sortable/>
<el-table-column :label="t('ProductionPlan.Plan.tableProductColumn')" align="center" prop="productName" min-width="200px" sortable/>
<el-table-column :label="t('ProductionPlan.Plan.tableCodeColumn')" align="center" prop="code" min-width="180px"
sortable />
<el-table-column :label="t('ProductionPlan.Plan.tableProductColumn')" align="center" prop="productName"
min-width="200px" sortable />
<!-- <el-table-column label="任务单" align="center" prop="taskCode" min-width="150px" sortable />-->
<el-table-column :label="t('ProductionPlan.Plan.tableDeviceNameColumn')" align="center" prop="deviceName" sortable />
<el-table-column :label="t('ProductionPlan.Plan.tablePlanNumberColumn')" align="center" prop="planNumber" sortable/>
<el-table-column :label="t('ProductionPlan.Plan.tableFinishNumberColumn')" align="center" prop="wangongNumber" sortable/>
<el-table-column :label="t('ProductionPlan.Plan.tableDeviceNameColumn')" align="center" prop="deviceName"
sortable />
<el-table-column :label="t('ProductionPlan.Plan.tablePlanNumberColumn')" align="center" prop="planNumber"
sortable />
<el-table-column :label="t('ProductionPlan.Plan.tableFinishNumberColumn')" align="center" prop="wangongNumber"
sortable />
<el-table-column :label="t('ProductionPlan.Plan.tablePassRateColumn')" align="center" prop="passRate" sortable />
<!-- <el-table-column label="热压数量" align="center" prop="reyaNumber" /> -->
<el-table-column :label="t('ProductionPlan.Plan.tableStatusColumn')" align="center" prop="status" sortable>
@ -181,9 +130,12 @@
</template>
</el-table-column> -->
<!-- <el-table-column label="领料人" align="center" prop="productionManagerName" sortable /> -->
<el-table-column :label="t('ProductionPlan.Plan.tablePlanStartTimeColumn')" align="center" prop="planStartTime" :formatter="dateFormatter2" width="150px" sortable/>
<el-table-column :label="t('ProductionPlan.Plan.tablePlanEndTimeColumn')" align="center" prop="planEndTime" :formatter="dateFormatter2" width="150px" sortable/>
<el-table-column :label="t('ProductionPlan.Plan.tableIsZjColumn')" align="center" prop="isZj" v-if="activeName === '6'">
<el-table-column :label="t('ProductionPlan.Plan.tablePlanStartTimeColumn')" align="center" prop="planStartTime"
:formatter="dateFormatter2" width="150px" sortable />
<el-table-column :label="t('ProductionPlan.Plan.tablePlanEndTimeColumn')" align="center" prop="planEndTime"
:formatter="dateFormatter2" width="150px" sortable />
<el-table-column :label="t('ProductionPlan.Plan.tableIsZjColumn')" align="center" prop="isZj"
v-if="activeName === '6'">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_ZJ_PRODUCT" :value="scope.row.isZj" />
</template>
@ -191,67 +143,35 @@
<!-- <el-table-column :label="t('ProductionPlan.Plan.tableRemarkColumn')" align="center" prop="remark" /> -->
<el-table-column :label="t('ProductionPlan.Plan.tableOperateColumn')" align="center" fixed="right" width="350">
<template #default="scope">
<el-button
link
type="info"
@click="openDetail(scope.row.id)"
v-hasPermi="['mes:plan:query']"
>
<el-button link type="info" @click="openDetail(scope.row.id)" v-hasPermi="['mes:plan:query']">
{{ t('ProductionPlan.Plan.actionDetailLabel') }}
</el-button>
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:plan:update']"
v-if="scope.row.status === 0"
>
<el-button link type="primary" @click="openForm('update', scope.row.id)" v-hasPermi="['mes:plan:update']"
v-if="scope.row.status === 0">
{{ t('ProductionPlan.Plan.actionEditLabel') }}
</el-button>
<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.Plan.actionMaterialLabel') }}
</el-button>
<el-button
link
type="primary"
@click="openPaiForm(scope.row.code, scope.row.id)"
v-hasPermi="['mes:plan:update']"
v-if="scope.row.status === 0"
>
<el-button link type="primary" @click="openPaiForm(scope.row.code, scope.row.id)"
v-hasPermi="['mes:plan:update']" v-if="scope.row.status === 0">
{{ t('ProductionPlan.Plan.actionDispatchFeedingLabel') }}
</el-button>
<el-button
link
type="primary"
@click="openTypePaiForm(scope.row.code, scope.row.id)"
v-hasPermi="['mes:plan:update']"
v-if="scope.row.status === 0"
>
<el-button link type="primary" @click="openTypePaiForm(scope.row.code, scope.row.id)"
v-hasPermi="['mes:plan:update']" v-if="scope.row.status === 0">
{{ t('ProductionPlan.Plan.actionDispatchProcessLabel') }}
</el-button>
<el-button
link
type="primary"
<el-button link type="primary"
@click="handleStatus(scope.row.code, scope.row.id, 'pre', 6, t('ProductionPlan.Plan.actionTrialLabel'), scope.row.isZj)"
v-hasPermi="['mes:plan:update']"
v-if="scope.row.status === 1 && scope.row.isPreProduction === 1"
>
v-hasPermi="['mes:plan:update']" v-if="scope.row.status === 1 && scope.row.isPreProduction === 1">
{{ t('ProductionPlan.Plan.actionTrialLabel') }}
</el-button>
<el-button
link
type="primary"
@click.stop="handleInspectExpand(scope.row)"
v-if="scope.row.status === 6 && inspectableMap[scope.row.id] !== false"
>
<el-button link type="primary" @click.stop="handleInspectExpand(scope.row)"
v-if="scope.row.status === 6 && inspectableMap[scope.row.id] !== false">
{{ t('ProductionPlan.Plan.actionInspectLabel') }}
</el-button>
<el-button
<!-- <el-button
link
type="primary"
@click="handleStatus(scope.row.code, scope.row.id, 'start',2, t('ProductionPlan.Plan.actionMassLabel'), scope.row.isZj)"
@ -259,62 +179,42 @@
v-if="(scope.row.status === 1 && scope.row.isPreProduction === 0) || scope.row.status === 6"
>
{{ t('ProductionPlan.Plan.actionMassLabel') }}
</el-button>
<el-button
link
type="primary"
</el-button> -->
<el-button link type="primary"
@click="handleStatus(scope.row.code, scope.row.id, 'commence', 8, t('ProductionPlan.Plan.actionStartLabel'), scope.row.isZj)"
v-hasPermi="['mes:plan:update']"
@click="openBaogongForm(scope.row.code, scope.row.id)"
v-if="scope.row.status === 2"
>
v-if="(scope.row.status === 1 && scope.row.isPreProduction === 0) || scope.row.status === 6">
{{ t('ProductionPlan.Plan.actionStartLabel') }}
</el-button>
<el-button link type="primary" v-hasPermi="['mes:plan:update']"
@click="openBaogongForm(scope.row.code, scope.row.id)" v-if="scope.row.status === 2">
{{ t('ProductionPlan.Plan.actionBaogongLabel') }}
</el-button>
<el-button
link
type="primary"
<el-button link type="primary"
@click="handleStatus(scope.row.code, scope.row.id, 'pause', 3, t('ProductionPlan.Plan.actionPauseLabel'), scope.row.isZj)"
v-hasPermi="['mes:plan:update']"
v-if="scope.row.status === 2"
>
v-hasPermi="['mes:plan:update']" v-if="scope.row.status === 2">
{{ t('ProductionPlan.Plan.actionPauseLabel') }}
</el-button>
<el-button
link
type="primary"
<el-button link type="primary"
@click="handleStatus(scope.row.code, scope.row.id, 'end', 4, t('ProductionPlan.Plan.actionFinishLabel'), scope.row.isZj)"
v-hasPermi="['mes:plan:update']"
v-if="scope.row.status === 2 || scope.row.status === 3"
>
v-hasPermi="['mes:plan:update']" v-if="scope.row.status === 2 || scope.row.status === 3">
{{ t('ProductionPlan.Plan.actionFinishLabel') }}
</el-button>
<el-button
link
type="primary"
<el-button link type="primary"
@click="handleStatus(scope.row.code, scope.row.id, 'store', 5, t('ProductionPlan.Plan.actionStoreLabel'), scope.row.isZj)"
v-hasPermi="['mes:plan:update']"
v-if="scope.row.status === 4"
>
v-hasPermi="['mes:plan:update']" v-if="scope.row.status === 4">
{{ t('ProductionPlan.Plan.actionStoreLabel') }}
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:plan:delete']"
v-if="scope.row.status === 0"
>
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['mes:plan:delete']"
v-if="scope.row.status === 0">
{{ t('ProductionPlan.Plan.actionDeleteLabel') }}
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
<!-- 表单弹窗添加/修改 -->

@ -15,6 +15,24 @@
<el-option v-for="item in capacityTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
<div class="flex items-center gap-8px">
<span class="text-red-500">*</span>
<span>生产时间安排</span>
<el-time-picker
v-model="searchForm.workTimeRange"
is-range
value-format="HH:mm"
format="HH:mm"
range-separator="To"
start-placeholder="Start time"
end-placeholder="End time"
class="!w-240px"
/>
</div>
<div class="flex items-center gap-8px">
<span>是否跳过节假日</span>
<el-switch v-model="searchForm.skipHoliday" />
</div>
</div>
<div class="border border-solid border-gray-200 rounded p-16px mt-16px">
@ -47,8 +65,10 @@
<el-form-item label="备注">
<el-input v-model="searchForm.remark" placeholder="请输入" clearable class="!w-220px" />
</el-form-item>
<el-form-item label="任务类型">
<el-checkbox v-model="searchForm.inventoryTaskSchedule"></el-checkbox>
<el-form-item label="库存任务">
<div class="flex items-center gap-8px">
<el-switch v-model="searchForm.inventoryTaskSchedule" />
</div>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSearch">
@ -131,23 +151,27 @@
@select-all="handleDetailSelectAll"
>
<el-table-column type="selection" width="55" :reserve-selection="true" align="center" />
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableTaskCodeColumn')" align="center" prop="taskCode" sortable />
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableTaskCodeColumn')" align="center" prop="taskCode" sortable width="200px"/>
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableProductCodeColumn')" align="center" prop="barCode" sortable />
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableProductNameColumn')" align="center" prop="productName" sortable />
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableTotalNumberColumn')" align="center" prop="number" />
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTablePlanNumberColumn')" align="center" prop="planNumber" />
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableUnplanNumberColumn')" align="center">
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableDeviceNameColumn')" align="center" prop="deviceDisplayName" />
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableTotalNumberColumn')" align="center" prop="number" width="120px"/>
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTablePlanNumberColumn')" align="center" prop="planNumber" width="120px"/>
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableUnplanNumberColumn')" align="center" width="120px">
<template #default="scope">
<span class="el-alert--warning" style="color: #e66126">
{{ scope.row.number - scope.row.planNumber > 0 ? scope.row.number - scope.row.planNumber : 0 }}
</span>
</template>
</el-table-column>
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableOperateColumn')" align="center" width="100px">
<el-table-column :label="t('ProductionPlan.TaskSummary.detailTableOperateColumn')" align="center" width="180px">
<template #default="scope">
<el-button link type="info" @click="openProductItemNeed(scope.row)">
{{ t('ProductionPlan.TaskSummary.detailActionMaterialLabel') }}
</el-button>
<el-button link type="primary" @click="openDeviceRelationDialog(scope.row)">
关联设备
</el-button>
</template>
</el-table-column>
</el-table>
@ -165,12 +189,41 @@
@saved="handlePreviewSaved"
/>
<Dialog v-model="deviceRelationDialogVisible" title="关联设备" width="520px">
<el-form :model="deviceRelationForm" label-width="90px" v-loading="deviceRelationLoading">
<el-form-item label="关联设备">
<el-input
:model-value="deviceRelationDisplayText"
placeholder="点击选择设备"
readonly
@click="openDeviceSelectDialog"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" :loading="deviceRelationSaving" @click="submitDeviceRelation"></el-button>
<el-button @click="deviceRelationDialogVisible = false">取消</el-button>
</template>
</Dialog>
<TableSelectDialog
ref="deviceSelectDialogRef"
title="选择设备"
:columns="deviceColumns"
:fetch-api="fetchDeviceLedgerPage"
row-key="id"
@confirm="handleDeviceSelectConfirm"
/>
<ItemNeedIndex ref="itemNeedRef" />
</template>
<script setup lang="ts">
import { DICT_TYPE } from '@/utils/dict'
import { TaskApi } from '@/api/mes/task'
import { ProductApi } from '@/api/erp/product/product'
import { DeviceLedgerApi } from '@/api/mes/deviceledger'
import TableSelectDialog from '@/components/TableSelectDialog/TableSelectDialog.vue'
import ItemNeedIndex from '@/views/mes/bom/ItemNeedIndex.vue'
import { dateFormatter2 } from '@/utils/formatTime'
import TaskSchedulePreviewDialog from './TaskSchedulePreviewDialog.vue'
@ -191,6 +244,29 @@ const itemNeedRef = ref()
const taskTableRef = ref()
const detailTableRef = ref()
const previewScheduleList = ref<any[]>([])
const deviceSelectDialogRef = ref()
const deviceRelationDialogVisible = ref(false)
const deviceRelationLoading = ref(false)
const deviceRelationSaving = ref(false)
const currentDeviceRelationRow = ref<any>()
const currentProductData = ref<any>()
const selectedDeviceRows = ref<any[]>([])
const deviceRelationForm = reactive({
productId: undefined as number | undefined,
devices: [] as { id: number; name: string }[]
})
const deviceColumns = [
{ label: '设备编号', prop: 'deviceCode', minWidth: 140 },
{ label: '设备名称', prop: 'deviceName', minWidth: 160 },
{ label: '设备型号', prop: 'deviceModel', minWidth: 140 },
{ label: '所属车间', prop: 'workshop', minWidth: 140 }
]
const deviceRelationDisplayText = computed(() => {
if (!deviceRelationForm.devices.length) return ''
if (!selectedDeviceRows.value.length) return deviceRelationForm.devices.map((item) => item.name).join('、')
return selectedDeviceRows.value.map((item) => item.deviceName || item.name || item.code || `ID:${item.id}`).join('、')
})
const scheduleRuleOptions = [
{ label: '订单优先级', value: 2 },
@ -205,8 +281,10 @@ const capacityTypeOptions = [
const searchForm = reactive({
inventoryTaskSchedule: false,
skipHoliday: false,
sortRule: 2 as number | undefined,
capacityType: 1 as number | undefined,
workTimeRange: ['08:00', '18:00'] as string[],
code: '',
orderDate: [] as string[],
deliveryDate: [] as string[],
@ -227,6 +305,77 @@ const taskDetailRequestMap = new Map<number, Promise<any[]>>()
const currentDetailRequestId = ref(0)
const taskTableBusy = computed(() => taskLoading.value || taskSelectionLoading.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 buildRelationIdList = (list: { id: number; name: string }[]) => {
return list.map((item) => Number(item.id)).filter((id) => Number.isFinite(id))
}
const fetchDeviceLedgerPage = (params: Record<string, any>) => {
return DeviceLedgerApi.getDeviceLedgerPage({
...params,
isScheduled: 1
})
}
const loadTaskList = async () => {
taskLoading.value = true
try {
@ -276,7 +425,8 @@ const getTaskDetailList = async (taskRow?: any) => {
const list = (data?.list ?? []).map((item: any) => ({
...item,
_parentTaskOrderPriority: taskRow?.isUrgent,
_parentTaskDeliveryDate: taskRow?.deliveryDate
_parentTaskDeliveryDate: taskRow?.deliveryDate,
deviceDisplayName: item.deviceDisplayName || item.deviceName || item.feedingPipelineName || ''
}))
allDetailsMap.value[taskId] = list
return list
@ -425,8 +575,10 @@ const handleSearch = async () => {
const handleReset = async () => {
searchForm.inventoryTaskSchedule = false
searchForm.skipHoliday = false
searchForm.sortRule = undefined
searchForm.capacityType = 1
searchForm.workTimeRange = ['08:00', '18:00']
searchForm.code = ''
searchForm.orderDate = []
searchForm.deliveryDate = []
@ -445,6 +597,84 @@ const openProductItemNeed = (row: any) => {
const number = row.number - row.planNumber > 0 ? row.number - row.planNumber : 0
itemNeedRef.value.open('product', row.productName, row.productId, number)
}
const openDeviceRelationDialog = async (row: any) => {
if (!row?.productId) {
message.warning('当前明细没有关联产品,无法设置设备')
return
}
currentDeviceRelationRow.value = row
deviceRelationDialogVisible.value = true
deviceRelationLoading.value = true
selectedDeviceRows.value = []
try {
const productData = await ProductApi.getProduct(Number(row.productId))
currentProductData.value = productData
const devices = normalizeRelationList(
(productData as any).devices ?? (productData as any).deviceIds,
(productData as any).deviceList,
['name', 'deviceName', 'code'],
'设备'
)
deviceRelationForm.productId = Number(row.productId)
deviceRelationForm.devices = devices
selectedDeviceRows.value = toDeviceRows(devices)
} finally {
deviceRelationLoading.value = false
}
}
const openDeviceSelectDialog = () => {
const rows = selectedDeviceRows.value.length
? selectedDeviceRows.value.map((item) => ({ ...item, id: Number(item.id) }))
: toDeviceRows(deviceRelationForm.devices)
deviceSelectDialogRef.value?.open(rows)
}
const handleDeviceSelectConfirm = (payload: { ids: (number | string)[]; rows: any[] }) => {
deviceRelationForm.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 refreshDetailListAfterDeviceSaved = async () => {
const taskId = Number(currentDeviceRelationRow.value?.taskId)
if (!Number.isFinite(taskId)) return
delete allDetailsMap.value[taskId]
if (Number(currentTask.value?.id) === taskId && currentTask.value) {
await handleCurrentTaskChange(currentTask.value)
}
}
const submitDeviceRelation = async () => {
if (!currentProductData.value || !deviceRelationForm.productId) return
deviceRelationSaving.value = true
try {
const currentData = currentProductData.value as any
const moldIds = normalizeRelationList(
currentData.molds ?? currentData.moldIds,
currentData.moldList,
['name', 'code'],
'模具'
)
const payload: any = {
...currentData,
deviceIds: buildRelationIdList(deviceRelationForm.devices),
moldIds: buildRelationIdList(moldIds)
}
delete payload.devices
delete payload.molds
await ProductApi.updateProduct(payload)
await refreshDetailListAfterDeviceSaved()
message.success('关联设备已保存')
deviceRelationDialogVisible.value = false
} finally {
deviceRelationSaving.value = false
}
}
const handlePreviewSaved = async () => {
dialogVisible.value = false
@ -463,6 +693,11 @@ const handleSubmit = async () => {
message.warning('请选择产能来源')
return
}
const [workStartTime, workEndTime] = Array.isArray(searchForm.workTimeRange) ? searchForm.workTimeRange : []
if (!workStartTime || !workEndTime) {
message.warning('请选择生产时间安排')
return
}
const selectedRows = detailTableRef.value?.getSelectionRows() || []
if (selectedRows.length === 0) {
@ -499,7 +734,10 @@ const handleSubmit = async () => {
const scheduleResult = await TaskApi.oneClickSchedule({
createReqVO,
sortRule: searchForm.sortRule,
capacityType: searchForm.capacityType
capacityType: searchForm.capacityType,
workStartTime,
workEndTime,
skipHoliday: searchForm.skipHoliday
})
const scheduleData = Array.isArray(scheduleResult)
? scheduleResult

@ -16,8 +16,12 @@
<div
v-for="(plan, index) in activePreviewDevice?.plans ?? []"
:key="`${activePreviewDevice?.deviceId}-${plan.taskDetailId}-${index}`"
class="schedule-plan-item"
:class="['schedule-plan-item', { 'schedule-plan-item-active': plan.sourceType === 'CURRENT' }]"
>
<div class="schedule-plan-item-head">
<span class="schedule-plan-item-title">{{ plan.productCode ?? '-' }} / {{ plan.productName ?? '-' }}</span>
<!-- <el-tag v-if="plan.sourceType === 'CURRENT'" type="success" size="small"></el-tag> -->
</div>
<div>任务明细ID{{ plan.taskDetailId ?? '-' }}</div>
<div>计划数量{{ plan.planNumber ?? '-' }}</div>
<div>交货日期{{ plan.deliveryDateStr ?? '-' }}</div>
@ -227,18 +231,128 @@ const formatGridDateText = (value: unknown) => {
if (!date.isValid()) return '-'
return date.format('YYYY-MM-DD HH:mm:ss')
}
const formatTooltipDateTime = (value: unknown) => {
const date = dayjs(value)
if (!date.isValid()) return '-'
return date.format('YYYY-MM-DD HH:mm:ss')
}
const getDeviceTaskSummary = (task: any) => {
if (!task) {
return {
planCount: 0,
totalPlanNumber: 0,
earliestStart: '-',
latestEnd: '-'
}
}
const childTaskIds = gantt.getChildren(task.id)
const childTasks = (Array.isArray(childTaskIds) ? childTaskIds : [])
.map((childId: string | number) => gantt.getTask(childId))
.filter((child: any) => child?._planData)
if (!childTasks.length) {
return {
planCount: 0,
totalPlanNumber: 0,
earliestStart: '-',
latestEnd: '-'
}
}
const starts = childTasks.map((child: any) => dayjs(child.start_date).valueOf()).filter((val: number) => Number.isFinite(val))
const ends = childTasks.map((child: any) => dayjs(child.end_date).valueOf()).filter((val: number) => Number.isFinite(val))
const totalPlanNumber = childTasks.reduce((sum: number, child: any) => sum + Number(child?._planData?.planNumber ?? 0), 0)
return {
planCount: childTasks.length,
totalPlanNumber,
earliestStart: starts.length ? formatTooltipDateTime(Math.min(...starts)) : '-',
latestEnd: ends.length ? formatTooltipDateTime(Math.max(...ends)) : '-'
}
}
const buildTaskTooltipHtml = (task: any, start?: Date, end?: Date) => {
const plan = task?._planData
if (plan) {
return `
<div><b>任务明细</b></div>
<div>任务单${plan.taskCode ?? '-'}</div>
<div>产品${plan.productCode ?? '-'} / ${plan.productName ?? '-'}</div>
<div>明细ID${plan.taskDetailId ?? '-'}</div>
<div>计划数量${plan.planNumber ?? '-'}</div>
<div>开始${formatTooltipDateTime(start ?? task?.start_date)}</div>
<div>结束${formatTooltipDateTime(end ?? task?.end_date)}</div>
<div>最晚开工${formatTooltipDateTime(plan.latestStartTimeStr)}</div>
`
}
const device = task?._deviceData
const summary = getDeviceTaskSummary(task)
return `
<div><b>汇总</b></div>
<div>设备${device?.deviceName ?? '-'}</div>
<div>任务明细条数${summary.planCount}</div>
<div>计划总数${summary.totalPlanNumber}</div>
<div>最早计划开始${summary.earliestStart}</div>
<div>最晚计划结束${summary.latestEnd}</div>
`
}
const getTaskByTooltipNode = (node: HTMLElement) => {
const holder =
node.closest('[task_id]') ||
node.closest('[data-task-id]') ||
node.closest('.gantt_task_line') ||
node
const taskId = holder?.getAttribute('task_id') || holder?.getAttribute('data-task-id')
if (!taskId) return undefined
try {
return gantt.getTask(taskId)
} catch {
return undefined
}
}
const initTaskTooltips = () => {
const tooltipsExt = (gantt.ext as any)?.tooltips
const tooltip = tooltipsExt?.tooltip
if (!tooltipsExt || !tooltip || !ganttContainerRef.value) return
const showTooltip = (event: MouseEvent, html: string) => {
tooltip.setContent(html)
tooltip.show(event)
const node = tooltip.getNode?.()
if (node) {
node.style.display = 'block'
node.style.visibility = 'visible'
node.style.opacity = '1'
node.style.zIndex = '10000'
node.style.pointerEvents = 'none'
}
}
tooltipsExt.detach('.gantt_task_line')
tooltipsExt.detach('.gantt_task_content')
tooltipsExt.attach({
selector: '.gantt_task_line,.gantt_task_content',
onmouseenter: (event: MouseEvent, node: HTMLElement) => {
const task = getTaskByTooltipNode(node)
if (!task) return
showTooltip(event, buildTaskTooltipHtml(task))
},
onmousemove: (event: MouseEvent, node: HTMLElement) => {
const task = getTaskByTooltipNode(node)
if (!task) return
showTooltip(event, buildTaskTooltipHtml(task))
},
onmouseleave: () => {
tooltip.hide()
}
})
}
const syncPlanTimeFromTask = (task: any) => {
if (!task?._planData) return
if (String(task?._planData?.sourceType ?? '').toUpperCase() !== 'CURRENT') return
const start = dayjs(task.start_date)
if (!start.isValid()) return
const duration = Number(task.duration) > 0 ? Number(task.duration) : 1
const nextEnd = start.startOf('day').add(duration - 1, 'day').endOf('day')
task.end_date = nextEnd.toDate()
const end = dayjs(task.end_date)
if (!start.isValid() || !end.isValid()) return
const duration = Math.max(Number(task.duration) || end.diff(start, 'day') + 1, 1)
task.duration = duration
task._planData.planStartTimeStr = start.format('YYYY-MM-DD HH:mm:ss')
task._planData.planEndTimeStr = nextEnd.format('YYYY-MM-DD HH:mm:ss')
task._planData.planEndTimeStr = end.format('YYYY-MM-DD HH:mm:ss')
task._planData.scheduleDays = duration
activePreviewDevice.value = task._deviceData
}
@ -302,19 +416,9 @@ const normalizeDeviceChildren = (deviceTaskId: string | number, priorityTaskId?:
if (priorityTaskId !== undefined && String(b.id) === String(priorityTaskId)) return 1
return 0
})
let previousEnd: dayjs.Dayjs | null = null
childTasks.forEach((item: any) => {
const start = dayjs(item.start_date).startOf('day')
const end = dayjs(item.end_date).endOf('day')
const duration = Math.max(end.diff(start, 'day') + 1, 1)
const nextStart = previousEnd && !start.isAfter(previousEnd, 'day') ? previousEnd.add(1, 'day').startOf('day') : start
const nextEnd = nextStart.add(duration - 1, 'day').endOf('day')
item.start_date = nextStart.toDate()
item.end_date = nextEnd.toDate()
item.duration = duration
syncPlanTimeFromTask(item)
gantt.updateTask(item.id)
previousEnd = nextEnd
})
const fakePlanTask = { _planData: true, parent: deviceTaskId }
syncDeviceTaskRangeFromChildren(fakePlanTask)
@ -420,8 +524,8 @@ const refreshTimelineRangeByTasks = () => {
})
if (!Number.isFinite(minStart) || !Number.isFinite(maxEnd)) return
const nextStartDate = dayjs(minStart).startOf('day').subtract(1, 'day').toDate()
const nextEndDate = dayjs(maxEnd).endOf('day').add(1, 'day').toDate()
const nextStartDate = dayjs(minStart).startOf('day').toDate()
const nextEndDate = dayjs(maxEnd).endOf('day').toDate()
const currentStart = dayjs(gantt.config.start_date).valueOf()
const currentEnd = dayjs(gantt.config.end_date).valueOf()
const nextStart = dayjs(nextStartDate).valueOf()
@ -496,23 +600,7 @@ const initGanttPreview = () => {
{ unit: 'day', step: 1, format: (date) => dayjs(date).format('MM-DD') }
]
gantt.templates.tooltip_text = (start, end, task: any) => {
const plan = task._planData
if (plan) {
return `
<div>产品名称${plan.productName ?? '-'}</div>
<div>计划数量${plan.planNumber ?? '-'}</div>
<div>开始${dayjs(start).format('YYYY-MM-DD HH:mm:ss')}</div>
<div>结束${dayjs(end).format('YYYY-MM-DD HH:mm:ss')}</div>
`
}
const device = task._deviceData
const plans = device?.plans ?? []
return `
<div>设备${device?.deviceName ?? '-'}</div>
<div>计划条数${plans.length}</div>
`
}
gantt.templates.tooltip_text = (start, end, task: any) => buildTaskTooltipHtml(task, start, end)
gantt.templates.task_class = (_start, _end, task: any) => {
if (!task?._planData) return ''
@ -526,6 +614,7 @@ const initGanttPreview = () => {
const ganttData = buildPreviewGanttData(previewScheduleList.value)
gantt.parse(ganttData)
initTaskTooltips()
if (ganttData.data.length) {
activePreviewDevice.value = ganttData.data[0]._deviceData
@ -753,6 +842,7 @@ onBeforeUnmount(() => {
.schedule-plan-list {
overflow: auto;
max-height: 55vh;
border: 1px solid var(--el-border-color);
border-radius: 4px;
padding: 8px;
@ -763,6 +853,24 @@ onBeforeUnmount(() => {
border-radius: 4px;
background: var(--el-fill-color-light);
}
.schedule-plan-item-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
margin-bottom: 4px;
}
.schedule-plan-item-title {
font-weight: 600;
color: var(--el-text-color-primary);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.schedule-plan-item-active {
border: 1px solid var(--el-color-success-light-5);
background: var(--el-color-success-light-9);
}
.schedule-plan-item + .schedule-plan-item {
margin-top: 8px;
@ -800,4 +908,10 @@ onBeforeUnmount(() => {
.schedule-gantt-container :deep(.gantt_task_line.schedule-plan-task-history .gantt_task_content) {
color: #ffffff;
}
:deep(.gantt_tooltip) {
z-index: 5000 !important;
}
.schedule-custom-tooltip {
display: none;
}
</style>

@ -1,38 +1,21 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="120px"
v-loading="formLoading"
>
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px" v-loading="formLoading">
<el-form-item :label="t('QualityManagement.ZjTask.formCode')" prop="code">
<el-input
v-model="formData.code"
:placeholder="t('QualityManagement.ZjTask.placeholderFormCode')"
/>
<el-input v-model="formData.code" :placeholder="t('QualityManagement.ZjTask.placeholderFormCode')" />
</el-form-item>
<el-form-item :label="t('QualityManagement.ZjTask.formType')" prop="type">
<el-select
v-model="formData.type"
clearable
filterable
:placeholder="t('QualityManagement.ZjTask.placeholderFormType')"
>
<el-option
v-for="dict in getStrDictOptions('mes_zj_task_type')" :key="dict.value" :label="dict.label"
<el-select v-model="formData.type" clearable filterable
:placeholder="t('QualityManagement.ZjTask.placeholderFormType')">
<el-option v-for="dict in getStrDictOptions('mes_zj_task_type')" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item :label="t('QualityManagement.ZjTask.formSchema')" prop="schemaId">
<el-row :gutter="8" class="w-full">
<el-col :span="22">
<el-input
v-model="formData.schemaName"
:placeholder="t('QualityManagement.ZjTask.placeholderFormSchema')"
readonly
/>
<el-input v-model="formData.schemaName" :placeholder="t('QualityManagement.ZjTask.placeholderFormSchema')"
readonly />
</el-col>
<el-col :span="2" class="text-right">
<el-button type="primary" @click="openSchemaDialog">
@ -48,50 +31,25 @@ v-for="dict in getStrDictOptions('mes_zj_task_type')" :key="dict.value" :label="
</el-radio-group>
</el-form-item>
<el-form-item :label="t('QualityManagement.ZjTask.formTicket')" prop="ticket">
<el-select
v-model="formData.ticket"
clearable
filterable
:placeholder="t('QualityManagement.ZjTask.placeholderFormTicket')"
>
<el-option
v-for="item in planList"
:key="item.id"
:label="item.code"
:value="item.id"
/>
<el-select v-model="formData.ticket" clearable filterable
:placeholder="t('QualityManagement.ZjTask.placeholderFormTicket')">
<el-option v-for="item in planList" :key="item.id" :label="item.code" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item :label="t('QualityManagement.ZjTask.formOrgType')" prop="orgType" v-if="formData.ticketType === 1">
<el-select
v-model="formData.orgType"
clearable
:placeholder="t('QualityManagement.ZjTask.placeholderFormOrgType')"
>
<el-select v-model="formData.orgType" clearable
:placeholder="t('QualityManagement.ZjTask.placeholderFormOrgType')">
<el-option v-for="item in orgTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item :label="t('QualityManagement.ZjTask.formManager')" prop="managerId">
<el-select
v-model="formData.managerId"
clearable
filterable
:placeholder="t('QualityManagement.ZjTask.placeholderFormManager')"
@change="handleManagerChange"
>
<el-option
v-for="item in userList"
:key="item.id"
:label="item.nickname"
:value="item.id"
/>
<el-select v-model="formData.managerId" clearable filterable
:placeholder="t('QualityManagement.ZjTask.placeholderFormManager')" @change="handleManagerChange">
<el-option v-for="item in userList" :key="item.id" :label="item.nickname" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item :label="t('QualityManagement.ZjTask.formRemark')" prop="remark">
<el-input
v-model="formData.remark"
:placeholder="t('QualityManagement.ZjTask.placeholderFormRemark')"
/>
<el-input v-model="formData.remark" :placeholder="t('QualityManagement.ZjTask.placeholderFormRemark')" />
</el-form-item>
</el-form>
<template #footer>
@ -103,12 +61,7 @@ v-for="dict in getStrDictOptions('mes_zj_task_type')" :key="dict.value" :label="
</el-button>
</template>
</Dialog>
<el-dialog
v-model="schemaDialogVisible"
:title="t('QualityManagement.ZjTask.formSchema')"
width="1200px"
draggable
>
<el-dialog v-model="schemaDialogVisible" :title="t('QualityManagement.ZjTask.formSchema')" width="1200px" draggable>
<el-table :data="schemaList" v-loading="schemaLoading" height="400px" @row-click="handleSchemaRowClick">
<el-table-column width="60">
<template #default="scope">
@ -283,6 +236,7 @@ const open = async (type: string, record?: ZjTaskVO) => {
schemaName: record.schemaName,
ticket: record.ticket,
orgType: record.orgType,
ticketType: record.ticketType,
remark: record.remark,
managerId: record.managerId,
managerName: record.managerName,
@ -325,7 +279,8 @@ const submitForm = async () => {
const ticketTypeChange = async () => {
if (formData.value.ticketType != undefined) {
const data = await PlanApi.getPlanByTicketType(formData.value.ticketType)
const type = formData.value.ticketType === 1 ? 8 : formData.value.ticketType
const data = await PlanApi.getPlanByTicketType(type)
planList.value = data || []
}
}

Loading…
Cancel
Save