Merge remote-tracking branch 'origin/master'

master
夜笙歌 3 weeks ago
commit f82e8082d2

@ -68,6 +68,12 @@ export interface DmsBillsLubeInstanceVO {
* *
*/ */
planLubeCode: string; planLubeCode: string;
/**
* ID
*/
wfDefinitionId: string | number;
} }
export interface DmsBillsLubeInstanceForm extends BaseEntity { export interface DmsBillsLubeInstanceForm extends BaseEntity {
@ -150,6 +156,10 @@ export interface DmsBillsLubeInstanceForm extends BaseEntity {
createTime?: string; createTime?: string;
/**
* ID
*/
wfDefinitionId?: string | number;
} }
@ -228,6 +238,12 @@ export interface DmsBillsLubeInstanceQuery extends PageQuery {
createBy?: string; createBy?: string;
createTime?: string; createTime?: string;
/**
* ID
*/
wfDefinitionId?: string | number;
} }

@ -1,14 +1,11 @@
import { BaseProcessResourceVO } from "../baseProcessResource/types";
export interface BaseProcessInfoVO { export interface BaseProcessInfoVO {
/** /**
* *
*/ */
processId: string | number; processId: string | number;
/**
*
*/
tenantId: string | number;
/** /**
* *
*/ */
@ -25,7 +22,7 @@ export interface BaseProcessInfoVO {
processType: string; processType: string;
/** /**
* *
*/ */
processQueue: number; processQueue: number;
@ -34,6 +31,71 @@ export interface BaseProcessInfoVO {
*/ */
productionTime: number; productionTime: number;
/**
* ID
*/
workshopId: string | number;
/**
* 1 2
*/
outsourcingFlag: string;
/**
* 1 2 3
*/
processProductionType: string;
/**
* %/
*/
defaultYieldRate: number;
/**
* %/
*/
lossRate: number;
/**
* %/
*/
reworkRate: number;
/**
* 1 2 3
*/
materialMethod: string;
/**
*
*/
leadTime: number;
/**
*
*/
setupTime: number;
/**
*
*/
processingTime: number;
/**
*
*/
disassemblyTime: number;
/**
* /
*/
theoreticalCycleTime: number;
/**
* 1 2 3
*/
inspectionMethod: string;
/** /**
* (1 0) * (1 0)
*/ */
@ -98,7 +160,7 @@ export interface BaseProcessInfoForm extends BaseEntity {
processType?: string; processType?: string;
/** /**
* *
*/ */
processQueue?: number; processQueue?: number;
@ -107,6 +169,71 @@ export interface BaseProcessInfoForm extends BaseEntity {
*/ */
productionTime?: number; productionTime?: number;
/**
* ID
*/
workshopId?: string | number;
/**
* 1 2
*/
outsourcingFlag?: string;
/**
* 1 2 3
*/
processProductionType?: string;
/**
* %/
*/
defaultYieldRate?: number;
/**
* %/
*/
lossRate?: number;
/**
* %/
*/
reworkRate?: number;
/**
* 1 2 3
*/
materialMethod?: string;
/**
*
*/
leadTime?: number;
/**
*
*/
setupTime?: number;
/**
*
*/
processingTime?: number;
/**
*
*/
disassemblyTime?: number;
/**
* /
*/
theoreticalCycleTime?: number;
/**
* 1 2 3
*/
inspectionMethod?: string;
/** /**
* (1 0) * (1 0)
*/ */
@ -126,6 +253,7 @@ export interface BaseProcessInfoForm extends BaseEntity {
prodBaseProcessUserVoList?: ProdBaseProcessUser[]; prodBaseProcessUserVoList?: ProdBaseProcessUser[];
prodBaseProcessProdlineBoList?: ProdBaseProcessProdLine[]; prodBaseProcessProdlineBoList?: ProdBaseProcessProdLine[];
prodBaseProcessUserBoList?: ProdBaseProcessUser[]; prodBaseProcessUserBoList?: ProdBaseProcessUser[];
prodBaseProcessResourceList?: BaseProcessResourceVO[];
} }
export interface BaseProcessInfoQuery extends PageQuery { export interface BaseProcessInfoQuery extends PageQuery {
@ -151,7 +279,7 @@ export interface BaseProcessInfoQuery extends PageQuery {
processType?: string; processType?: string;
/** /**
* *
*/ */
processQueue?: number; processQueue?: number;
@ -160,6 +288,71 @@ export interface BaseProcessInfoQuery extends PageQuery {
*/ */
productionTime?: number; productionTime?: number;
/**
* ID
*/
workshopId?: string | number;
/**
* 1 2
*/
outsourcingFlag?: string;
/**
* 1 2 3
*/
processProductionType?: string;
/**
* %/
*/
defaultYieldRate?: number;
/**
* %/
*/
lossRate?: number;
/**
* %/
*/
reworkRate?: number;
/**
* 1 2 3
*/
materialMethod?: string;
/**
*
*/
leadTime?: number;
/**
*
*/
setupTime?: number;
/**
*
*/
processingTime?: number;
/**
*
*/
disassemblyTime?: number;
/**
* /
*/
theoreticalCycleTime?: number;
/**
* 1 2 3
*/
inspectionMethod?: string;
/** /**
* (1 0) * (1 0)
*/ */
@ -205,8 +398,6 @@ export interface ProdBaseProcessProdLine {
} }
export interface ProdBaseProcessUser { export interface ProdBaseProcessUser {
/** /**
* ID * ID

@ -0,0 +1,134 @@
export interface BaseProcessResourceVO {
/**
*
*/
processResourceId: string | number;
/**
* ID
*/
processId: string | number;
/**
* 1 2 3 4
*/
assignmentType: string;
/**
*
*/
toolingTypeCode: string;
/**
* 0 1
*/
requiredFlag: string;
/**
* 0 1
*/
selectionMode: string;
/**
* 0 1
*/
requiresValidation: string | number;
/**
* 0 1
*/
requiresPreparation: string;
/**
*
*/
remark: string;
}
export interface BaseProcessResourceForm extends BaseEntity {
/**
*
*/
processResourceId?: string | number;
/**
* 1 2 3 4
*/
assignmentType?: string;
/**
*
*/
toolingTypeCode?: string;
/**
* 0 1
*/
requiredFlag?: string;
/**
* 0 1
*/
selectionMode?: string;
/**
* 0 1
*/
requiresValidation?: string | number;
/**
* 0 1
*/
requiresPreparation?: string;
/**
*
*/
remark?: string;
}
export interface BaseProcessResourceQuery extends PageQuery {
/**
*
*/
processResourceId?: string | number;
/**
* 1 2 3 4
*/
assignmentType?: string;
/**
*
*/
toolingTypeCode?: string;
/**
* 0 1
*/
requiredFlag?: string;
/**
* 0 1
*/
selectionMode?: string;
/**
* 0 1
*/
requiresValidation?: string | number;
/**
* 0 1
*/
requiresPreparation?: string;
/**
*
*/
params?: any;
}

@ -18,6 +18,28 @@ export interface ProdBaseRouteProcess {
index?: number; index?: number;
} }
// 定义工艺路线关联物料的接口
export interface ProdBaseRouteMaterial {
/** 物料ID */
materialId: string | number;
/** 物料名称 */
materialName?: string;
/** 激活标识0否 1是 */
activeFlag: string;
/** 备注 */
remark?: string;
/** 创建人 */
createBy?: number;
/** 创建时间 */
createTime?: string;
/** 更新人 */
updateBy?: number;
/** 更新时间 */
updateTime?: string;
/** 序号(前端使用) */
index?: number;
}
export interface BaseRouteVO { export interface BaseRouteVO {
/** /**
* 线ID * 线ID
@ -40,7 +62,7 @@ export interface BaseRouteVO {
routeDesc: string; routeDesc: string;
/** /**
* (1 0) * 1 2 3 4 5
*/ */
activeFlag: string; activeFlag: string;
@ -81,6 +103,55 @@ export interface BaseRouteVO {
routeProcessVoList?: ProdBaseRouteProcess[]; routeProcessVoList?: ProdBaseRouteProcess[];
/**
* 线
*/
prodBaseRouteMaterialList?: ProdBaseRouteMaterial[];
/**
* 线
*/
routeVersion: string;
/**
* 1 2 3
*/
productionType: string;
/**
* 线1 2
*/
routeType: string;
/**
*
*/
auditReason: string;
/**
*
*/
approveBy: number;
/**
*
*/
approveTime: string;
/**
* 0 1
*/
needFirstInspect: string;
/**
* 0 1 2
*/
printFlowCard: string;
/**
* 0=
*/
batchSize: number;
} }
export interface BaseRouteForm extends BaseEntity { export interface BaseRouteForm extends BaseEntity {
@ -100,7 +171,7 @@ export interface BaseRouteForm extends BaseEntity {
routeDesc?: string; routeDesc?: string;
/** /**
* (1 0) * 1 2 3 4 5
*/ */
activeFlag?: string; activeFlag?: string;
@ -115,10 +186,59 @@ export interface BaseRouteForm extends BaseEntity {
routeProcessBoList?: ProdBaseRouteProcess[]; routeProcessBoList?: ProdBaseRouteProcess[];
routeProcessVoList?: ProdBaseRouteProcess[]; routeProcessVoList?: ProdBaseRouteProcess[];
/**
* 线
*/
prodBaseRouteMaterialList?: ProdBaseRouteMaterial[];
/**
* 线
*/
routeVersion?: string;
/**
* 1 2 3
*/
productionType?: string;
/**
* 线1 2
*/
routeType?: string;
/**
*
*/
auditReason?: string;
/**
*
*/
approveBy?: number;
/**
*
*/
approveTime?: string;
/**
* 0 1
*/
needFirstInspect?: string;
/**
* 0 1 2
*/
printFlowCard?: string;
/**
* 0=
*/
batchSize?: number;
} }
export interface BaseRouteQuery extends PageQuery { export interface BaseRouteQuery extends PageQuery {
/** /**
* 线ID * 线ID
*/ */
@ -135,10 +255,55 @@ export interface BaseRouteQuery extends PageQuery {
routeDesc?: string; routeDesc?: string;
/** /**
* (1 0) * 1 2 3 4 5
*/ */
activeFlag?: string; activeFlag?: string;
/**
* 线
*/
routeVersion?: string;
/**
* 1 2 3
*/
productionType?: string;
/**
* 线1 2
*/
routeType?: string;
/**
*
*/
auditReason?: string;
/**
*
*/
approveBy?: number;
/**
*
*/
approveTime?: string;
/**
* 0 1
*/
needFirstInspect?: string;
/**
* 0 1 2
*/
printFlowCard?: string;
/**
* 0=
*/
batchSize?: number;
/** /**
* *
*/ */

@ -0,0 +1,86 @@
export interface BaseRouteMaterialVO {
/**
* ID
*/
routeMaterialId: string | number;
/**
* 线ID
*/
routeId: string | number;
/**
* ID
*/
materialId: string | number;
/**
* (1 0)
*/
activeFlag: string;
/**
*
*/
remark: string;
}
export interface BaseRouteMaterialForm extends BaseEntity {
/**
* ID
*/
routeMaterialId?: string | number;
/**
* 线ID
*/
routeId?: string | number;
/**
* ID
*/
materialId?: string | number;
/**
* (1 0)
*/
activeFlag?: string;
/**
*
*/
remark?: string;
}
export interface BaseRouteMaterialQuery extends PageQuery {
/**
* ID
*/
routeMaterialId?: string | number;
/**
* 线ID
*/
routeId?: string | number;
/**
* ID
*/
materialId?: string | number;
/**
* (1 0)
*/
activeFlag?: string;
/**
*
*/
params?: any;
}

@ -346,7 +346,7 @@ export const dynamicRoutes: RouteRecordRaw[] = [
permissions: ['dms:dmsBillsLubeInstance:add'], permissions: ['dms:dmsBillsLubeInstance:add'],
children: [ children: [
{ {
path: 'index/:lubeInstanceId', path: 'index',
component: () => import('@/views/dms/dmsBillsLubeInstanceActivity/index.vue'), component: () => import('@/views/dms/dmsBillsLubeInstanceActivity/index.vue'),
name: 'dmsBillsLubeInstanceActivity', name: 'dmsBillsLubeInstanceActivity',
meta: { title: '润滑工单明细', activeMenu: '/dms/dmsBillsLubeInstance', icon: '' } meta: { title: '润滑工单明细', activeMenu: '/dms/dmsBillsLubeInstance', icon: '' }
@ -424,7 +424,38 @@ export const dynamicRoutes: RouteRecordRaw[] = [
meta: { title: '保养工单申请', activeMenu: '/dms/maint/maintEdit', noCache: true } meta: { title: '保养工单申请', activeMenu: '/dms/maint/maintEdit', noCache: true }
} }
] ]
} },
// {
// path: '/dms/dmsMaintInstanceActivity',
// component: Layout,
// hidden: true,
// permissions: ['dms:dmsBillsMaintInstance:add'],
// children: [
// {
// path: 'index/:maintInstanceId',
// component: () => import('@/views/dms/dmsMaintInstanceActivity/index.vue'),
// name: 'dmsMaintInstanceActivity',
// meta: { title: '保养工单明细', activeMenu: '/dms/dmsMaintInstanceActivity', icon: '' }
// }
// ]
// },
//
// {
// path: '/dms/dmsBillsInspectInstanceActivity',
// component: Layout,
// hidden: true,
// permissions: ['dms:dmsBillsInspectInstanceActivity:add'],
// children: [
// {
// path: 'index/:inspctInstanceId',
// component: () => import('@/views/dms/dmsBillsInspectInstanceActivity/index.vue'),
// name: 'dmsBillsInspectInstanceActivity',
// meta: { title: '点巡检工单明细', activeMenu: '/dms/dmsBillsInspectInstanceActivity', icon: '' }
// }
// ]
// },
]; ];

@ -139,21 +139,36 @@
<el-table-column label="备注" align="center" prop="remark" v-if="columns[12].visible"/> <el-table-column label="备注" align="center" prop="remark" v-if="columns[12].visible"/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<!-- 启动工单按钮 -->
<el-tooltip content="启动工单" placement="top"v-if="!scope.row.wfDefinitionId" >
<el-button link type="success" icon="View" @click="handleStartWorkflow(scope.row)">
</el-button>
</el-tooltip>
<!-- <el-tooltip content="修改" placement="top"> <!-- <el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dms:dmsBillsLubeInstance:edit']"></el-button> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dms:dmsBillsLubeInstance:edit']"></el-button>
</el-tooltip> </el-tooltip>
<el-tooltip content="删除" placement="top"> <el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dms:dmsBillsLubeInstance:remove']"></el-button> <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dms:dmsBillsLubeInstance:remove']"></el-button>
</el-tooltip>--> </el-tooltip>-->
<el-tooltip content="详情" placement="top"> <!-- <el-tooltip content="详情" placement="top">
<el-button link type="primary" icon="View" @click="handleShowDetail(scope.row)" v-hasPermi="['dms:dmsBillsLubeInstance:edit']"></el-button> <el-button link type="primary" icon="View" @click="handleShowDetail(scope.row)" v-hasPermi="['dms:dmsBillsLubeInstance:edit']"></el-button>
</el-tooltip> </el-tooltip> -->
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card> </el-card>
<!-- 工作流处理组件 -->
<submitVerify
ref="submitVerifyRef"
:task-variables="taskVariables"
@submit-callback="submitCallback" />
<!-- 添加或修改润滑工单对话框 --> <!-- 添加或修改润滑工单对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="dmsBillsLubeInstanceFormRef" :model="form" :rules="rules" label-width="160px"> <el-form ref="dmsBillsLubeInstanceFormRef" :model="form" :rules="rules" label-width="160px">
@ -251,6 +266,8 @@
import { listDmsBillsLubeInstance, getDmsBillsLubeInstance, delDmsBillsLubeInstance, addDmsBillsLubeInstance, updateDmsBillsLubeInstance } from '@/api/dms/dmsBillsLubeInstance'; import { listDmsBillsLubeInstance, getDmsBillsLubeInstance, delDmsBillsLubeInstance, addDmsBillsLubeInstance, updateDmsBillsLubeInstance } from '@/api/dms/dmsBillsLubeInstance';
import { DmsBillsLubeInstanceVO, DmsBillsLubeInstanceQuery, DmsBillsLubeInstanceForm } from '@/api/dms/dmsBillsLubeInstance/types'; import { DmsBillsLubeInstanceVO, DmsBillsLubeInstanceQuery, DmsBillsLubeInstanceForm } from '@/api/dms/dmsBillsLubeInstance/types';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { startWorkFlow } from '@/api/workflow/task'
import SubmitVerify from '@/components/Process/submitVerify.vue'
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { active_flag, lube_level, lube_status } = toRefs<any>(proxy?.useDict('active_flag', 'lube_level', 'lube_status')); const { active_flag, lube_level, lube_status } = toRefs<any>(proxy?.useDict('active_flag', 'lube_level', 'lube_status'));
@ -430,11 +447,92 @@ const handleExport = () => {
}, `dmsBillsLubeInstance_${new Date().getTime()}.xlsx`) }, `dmsBillsLubeInstance_${new Date().getTime()}.xlsx`)
} }
/** 详情按钮 */
const router = useRouter(); const router = useRouter();
const handleShowDetail = (row: DmsBillsLubeInstanceVO) => { const handleShowDetail = (row: DmsBillsLubeInstanceVO) => {
router.push('/dms/dmsBillsLubeInstanceActivity/index/' + row.lubeInstanceId) router.push('/dms/dmsBillsLubeInstanceActivity/index/' + row.lubeInstanceId)
} }
//
const handleStartWorkflow = async (row: DmsBillsLubeInstanceVO) => {
try {
const confirmResult = await proxy?.$modal.confirm(
`确认启动润滑工单"${row.billsLubeCode}"的工作流?`
);
if (confirmResult) {
buttonLoading.value = true;
//
const workflowData = {
businessId: row.lubeInstanceId,
flowCode: 'Lube01',
variables: {
lubeInstanceId: row.lubeInstanceId,
billsLubeCode: row.billsLubeCode,
lubeLevel: row.lubeLevel
}
};
const workflowRes = await startWorkFlow(workflowData);
// ID
await updateDmsBillsLubeInstance({
...row,
wfDefinitionId: workflowRes.data.taskId,
status: 'waiting'
});
//
taskVariables.value = {
entity: {
lubeInstanceId: row.lubeInstanceId,
lubeLevel: row.lubeLevel,
lubeGroup: row.lubeGroup,
lubeSupervisor: row.lubeSupervisor,
processStepOrder: 1
}
};
proxy?.$modal.msgSuccess('工单工作流启动成功');
//
if (submitVerifyRef.value && workflowRes.data.taskId) {
submitVerifyRef.value.openDialog(workflowRes.data.taskId);
}
}
} catch (error) {
console.error('启动工作流失败:', error);
proxy?.$modal.msgError('启动工作流失败');
} finally {
buttonLoading.value = false;
}
};
//
const handleWorkflowProgress = (row: DmsBillsLubeInstanceVO) => {
//
router.push({
path: '/workflow/process/record',
query: { businessId: row.lubeInstanceId }
});
};
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
const taskVariables = ref<any>({});
// -
const submitCallback = async () => {
try {
//
await getList();
proxy?.$modal.msgSuccess('工单创建节点处理完成,工作流已流转到下一步');
} catch (error) {
console.error('刷新列表失败:', error);
proxy?.$modal.msgError('刷新列表失败');
}
};
onMounted(() => { onMounted(() => {
getList(); getList();
}); });

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -8,6 +8,16 @@
<el-form-item label='工艺路线名称' prop='routeName'> <el-form-item label='工艺路线名称' prop='routeName'>
<el-input v-model='queryParams.routeName' placeholder='请输入工艺路线名称' clearable @keyup.enter='handleQuery' /> <el-input v-model='queryParams.routeName' placeholder='请输入工艺路线名称' clearable @keyup.enter='handleQuery' />
</el-form-item> </el-form-item>
<el-form-item label='状态' prop='activeFlag'>
<el-select v-model='queryParams.activeFlag' placeholder='请选择状态' clearable>
<el-option v-for='dict in mes_route_active_flag' :key='dict.value' :label='dict.label' :value='dict.value'/>
</el-select>
</el-form-item>
<!-- <el-form-item label='首件检验' prop='needFirstInspect'>-->
<!-- <el-select v-model='queryParams.needFirstInspect' placeholder='请选择首件检验' clearable>-->
<!-- <el-option v-for='dict in mes_need_first_inspect' :key='dict.value' :label='dict.label' :value='dict.value'/>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item> <el-form-item>
<el-button type='primary' icon='Search' @click='handleQuery'>搜索</el-button> <el-button type='primary' icon='Search' @click='handleQuery'>搜索</el-button>
<el-button icon='Refresh' @click='resetQuery'>重置</el-button> <el-button icon='Refresh' @click='resetQuery'>重置</el-button>
@ -48,11 +58,40 @@
<el-table-column type='selection' width='55' align='center' /> <el-table-column type='selection' width='55' align='center' />
<el-table-column label='工艺路线ID' align='center' prop='routeId' v-if='columns[0].visible' /> <el-table-column label='工艺路线ID' align='center' prop='routeId' v-if='columns[0].visible' />
<el-table-column label='租户编号' align='center' prop='tenantId' v-if='columns[1].visible' /> <el-table-column label='租户编号' align='center' prop='tenantId' v-if='columns[1].visible' />
<el-table-column label='工艺路线名称' align='center' prop='routeName' v-if='columns[2].visible' /> <el-table-column label='工艺路线名称' align='center' prop='routeName' v-if='columns[2].visible' width='110'/>
<el-table-column label='工艺路线说明' align='center' prop='routeDesc' v-if='columns[3].visible' /> <el-table-column label='工艺路线说明' align='center' prop='routeDesc' v-if='columns[3].visible' width='110'/>
<el-table-column label='激活标识' align='center' prop='activeFlag' v-if='columns[4].visible'> <el-table-column label='工艺路线版本' align='center' prop='routeVersion' v-if='columns[11].visible' width='110'/>
<el-table-column label='生产类型' align='center' prop='productionType' v-if='columns[12].visible'>
<template #default='scope'> <template #default='scope'>
<dict-tag :options='active_flag' :value='scope.row.activeFlag' /> <dict-tag :options='mes_process_production_type' :value='scope.row.productionType'/>
</template>
</el-table-column>
<el-table-column label='路线类型' align='center' prop='routeType' v-if='columns[13].visible'>
<template #default='scope'>
<dict-tag :options='mes_route_type' :value='scope.row.routeType'/>
</template>
</el-table-column>
<el-table-column label='审核原因' align='center' prop='auditReason' v-if='columns[14].visible'/>
<el-table-column label='审核人' align='center' prop='approveBy' v-if='columns[15].visible'/>
<el-table-column label='审核时间' align='center' prop='approveTime' width='180' v-if='columns[16].visible'>
<template #default='scope'>
<span>{{ parseTime(scope.row.approveTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label='首件检验' align='center' prop='needFirstInspect' v-if='columns[17].visible'>
<template #default='scope'>
<dict-tag :options='mes_need_first_inspect' :value='scope.row.needFirstInspect'/>
</template>
</el-table-column>
<el-table-column label='打印流转卡' align='center' prop='printFlowCard' v-if='columns[18].visible' width='100'>
<template #default='scope'>
<dict-tag :options='mes_print_flow_card' :value='scope.row.printFlowCard'/>
</template>
</el-table-column>
<el-table-column label='批次量' align='center' prop='batchSize' v-if='columns[19].visible'/>
<el-table-column label='状态' align='center' prop='activeFlag' v-if='columns[4].visible'>
<template #default='scope'>
<dict-tag :options='mes_route_active_flag' :value='scope.row.activeFlag' />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label='备注' align='center' prop='remark' v-if='columns[5].visible' /> <el-table-column label='备注' align='center' prop='remark' v-if='columns[5].visible' />
@ -89,6 +128,14 @@
>工艺步骤 >工艺步骤
</el-button> </el-button>
<el-button
size="small"
type="text"
icon="el-icon-edit"
@click="routeMaterialUpdate(scope.row)"
v-hasPermi="['mes:baseRoute:edit']"
>关联物料
</el-button>
</template> </template>
</el-table-column> </el-table-column>
@ -106,16 +153,74 @@
<el-form-item label='工艺路线说明' prop='routeDesc'> <el-form-item label='工艺路线说明' prop='routeDesc'>
<el-input v-model='form.routeDesc' placeholder='请输入工艺路线说明' /> <el-input v-model='form.routeDesc' placeholder='请输入工艺路线说明' />
</el-form-item> </el-form-item>
<el-form-item label='激活标识' prop='activeFlag'> <el-form-item label='工艺路线版本' prop='routeVersion'>
<el-radio-group v-model='form.activeFlag'> <el-input v-model='form.routeVersion' placeholder='请输入工艺路线版本' />
</el-form-item>
<el-form-item label='生产类型' prop='productionType'>
<el-select v-model='form.productionType' placeholder='请选择生产类型'>
<el-option
v-for='dict in mes_process_production_type'
:key='dict.value'
:label='dict.label'
:value='dict.value'
></el-option>
</el-select>
</el-form-item>
<el-form-item label='路线类型' prop='routeType'>
<el-select v-model='form.routeType' placeholder='请选择路线类型'>
<el-option
v-for='dict in mes_route_type'
:key='dict.value'
:label='dict.label'
:value='dict.value'
></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label='审核原因' prop='auditReason'>-->
<!-- <el-input v-model='form.auditReason' placeholder='请输入审核原因' />-->
<!-- </el-form-item>-->
<!-- <el-form-item label='审核人' prop='approveBy'>-->
<!-- <el-input v-model='form.approveBy' placeholder='请输入审核人' />-->
<!-- </el-form-item>-->
<!-- <el-form-item label='审核时间' prop='approveTime'>-->
<!-- <el-date-picker clearable-->
<!-- v-model='form.approveTime'-->
<!-- type='datetime'-->
<!-- value-format='YYYY-MM-DD HH:mm:ss'-->
<!-- placeholder='请选择审核时间'>-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<el-form-item label='首件检验' prop='needFirstInspect'>
<el-radio-group v-model='form.needFirstInspect'>
<el-radio <el-radio
v-for='dict in active_flag' v-for='dict in mes_need_first_inspect'
:key='dict.value' :key='dict.value'
:value='dict.value' :value='dict.value'
>{{ dict.label }} >{{dict.label}}</el-radio>
</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label='打印流转卡' prop='printFlowCard'>
<el-radio-group v-model='form.printFlowCard'>
<el-radio
v-for='dict in mes_print_flow_card'
:key='dict.value'
:value='dict.value'
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label='批次量' prop='batchSize'>
<el-input-number v-model='form.batchSize' placeholder='请输入批次量' />
</el-form-item>
<!-- <el-form-item label='状态' prop='activeFlag'>-->
<!-- <el-radio-group v-model='form.activeFlag'>-->
<!-- <el-radio-->
<!-- v-for='dict in mes_route_active_flag'-->
<!-- :key='dict.value'-->
<!-- :value='dict.value'-->
<!-- >{{ dict.label }}-->
<!-- </el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<el-form-item label='备注' prop='remark'> <el-form-item label='备注' prop='remark'>
<el-input v-model='form.remark' placeholder='请输入备注' /> <el-input v-model='form.remark' placeholder='请输入备注' />
</el-form-item> </el-form-item>
@ -185,18 +290,83 @@
</template> </template>
</el-dialog> </el-dialog>
<!--维护工艺路线关联物料对话框-->
<el-dialog :title='dialog.title' v-model='materialOpen' width='700px' append-to-body>
<el-form ref='baseRouteFormRef' :model='form' :rules='rules' label-width='110px'>
<el-form-item label='工艺路线名称' prop='routeName'>
<el-input v-model='form.routeName' placeholder='请输入工艺路线名称' disabled />
</el-form-item>
<el-divider content-position='center'>工艺路线关联物料信息</el-divider>
<el-row :gutter='10' class='mb8'>
<el-col :span='1.5'>
<el-button type='primary' icon='Plus' size='small' @click='handleAddRouteMaterial'>添加物料</el-button>
</el-col>
<el-col :span='1.5'>
<el-button type='danger' icon='Delete' size='small' @click='handleDeleteRouteMaterial'>删除</el-button>
</el-col>
</el-row>
<el-table
:data="prodBaseRouteMaterialList"
:row-class-name="rowRouteMaterialIndex"
@selection-change="handleRouteMaterialSelectionChange"
ref="mesBaseRouteMaterial"
>
<el-table-column type='selection' width='50' align='center' />
<el-table-column label='序号' align='center' prop='index' v-if='false' />
<el-table-column label='关联物料' prop='materialId' align='center'>
<template #default='scope'>
<el-input
v-model='scope.row.materialName'
placeholder='请选择物料'
readonly
@click='openMaterialDialog(scope.$index)'
/>
</template>
</el-table-column>
<el-table-column label='激活标识' prop='activeFlag' align='center' width='150'>
<template #default='scope'>
<el-radio-group v-model='scope.row.activeFlag'>
<el-radio
v-for='dict in active_flag'
:key='dict.value'
:value='dict.value'
>{{dict.label}}</el-radio>
</el-radio-group>
</template>
</el-table-column>
</el-table>
</el-form>
<template #footer>
<div class='dialog-footer'>
<el-button type='primary' @click='submitForm' v-show='submitShow'> </el-button>
<el-button @click='cancel'> </el-button>
</div>
</template>
</el-dialog>
<!-- 物料选择弹窗 -->
<el-dialog title='选择物料信息' v-model='materialDialogOpen' width='1200px' append-to-body>
<MaterialSelect ref='materialSelectRef' v-if='materialDialogOpen'></MaterialSelect>
<template #footer>
<el-button type='primary' @click='handleMaterialSelection'> </el-button>
<el-button @click='materialDialogOpen = false'> </el-button>
</template>
</el-dialog>
</div> </div>
</template> </template>
<script setup name='BaseRoute' lang='ts'> <script setup name='BaseRoute' lang='ts'>
import { listBaseRoute, getBaseRoute, delBaseRoute, addBaseRoute, updateBaseRoute } from '@/api/mes/baseRoute'; import { listBaseRoute, getBaseRoute, delBaseRoute, addBaseRoute, updateBaseRoute } from '@/api/mes/baseRoute';
import { BaseRouteVO, BaseRouteQuery, BaseRouteForm, ProdBaseRouteProcess } from '@/api/mes/baseRoute/types'; import { BaseRouteVO, BaseRouteQuery, BaseRouteForm, ProdBaseRouteProcess, ProdBaseRouteMaterial } from '@/api/mes/baseRoute/types';
import {getProcessInfoList} from "@/api/mes/baseProcessInfo"; import {getProcessInfoList} from "@/api/mes/baseProcessInfo";
import { getMaterialList } from '@/api/wms/linkage';
import MaterialSelect from '@/views/mes/baseMaterialInfo/addMaterial.vue';
/*import type { ProdBaseRouteProcess } from '@/api/mes/baseRoute/types';*/ /*import type { ProdBaseRouteProcess } from '@/api/mes/baseRoute/types';*/
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { active_flag } = toRefs<any>(proxy?.useDict('active_flag')); const { mes_route_active_flag, mes_process_production_type, mes_need_first_inspect, mes_route_type, mes_print_flow_card, active_flag } = toRefs<any>(proxy?.useDict('mes_route_active_flag', 'mes_process_production_type', 'mes_need_first_inspect', 'mes_route_type', 'mes_print_flow_card', 'active_flag'));
const baseRouteList = ref<BaseRouteVO[]>([]); const baseRouteList = ref<BaseRouteVO[]>([]);
const buttonLoading = ref(false); const buttonLoading = ref(false);
@ -220,6 +390,12 @@ const routeProcessBoList = ref<any[]>([]);
const checkedProdBaseRouteProcess = ref<any[]>([]); const checkedProdBaseRouteProcess = ref<any[]>([]);
const processList = ref<any[]>([]); const processList = ref<any[]>([]);
//
const materialOpen = ref(false);
const prodBaseRouteMaterialList = ref<ProdBaseRouteMaterial[]>([]);
const checkedRouteMaterial = ref<ProdBaseRouteMaterial[]>([]);
const materialList = ref<any[]>([]);
//线false //线false
const ifOpen = ref(false); // 使 ref const ifOpen = ref(false); // 使 ref
@ -234,13 +410,22 @@ const columns = ref<FieldOption[]>([
{ key: 1, label: `租户编号`, visible: false }, { key: 1, label: `租户编号`, visible: false },
{ key: 2, label: `工艺路线名称`, visible: true }, { key: 2, label: `工艺路线名称`, visible: true },
{ key: 3, label: `工艺路线说明`, visible: true }, { key: 3, label: `工艺路线说明`, visible: true },
{ key: 4, label: `激活标识`, visible: true }, { key: 4, label: `状态`, visible: true },
{ key: 5, label: `备注`, visible: true }, { key: 5, label: `备注`, visible: true },
{ key: 6, label: `创建部门`, visible: false }, { key: 6, label: `创建部门`, visible: false },
{ key: 7, label: `创建人`, visible: false }, { key: 7, label: `创建人`, visible: false },
{ key: 8, label: `创建时间`, visible: true }, { key: 8, label: `创建时间`, visible: false },
{ key: 9, label: `更新人`, visible: false }, { key: 9, label: `更新人`, visible: false },
{ key: 10, label: `更新时间`, visible: false } { key: 10, label: `更新时间`, visible: false },
{ key: 11, label: `工艺路线版本`, visible: true },
{ key: 12, label: `生产类型`, visible: true },
{ key: 13, label: `路线类型`, visible: true },
{ key: 14, label: `审核原因`, visible: false },
{ key: 15, label: `审核人`, visible: false },
{ key: 16, label: `审核时间`, visible: false },
{ key: 17, label: `首件检验`, visible: true },
{ key: 18, label: `打印流转卡`, visible: true },
{ key: 19, label: `批次量`, visible: true }
]); ]);
const initFormData: BaseRouteForm = { const initFormData: BaseRouteForm = {
@ -249,7 +434,19 @@ const initFormData: BaseRouteForm = {
routeDesc: undefined, routeDesc: undefined,
activeFlag: '1', activeFlag: '1',
remark: undefined, remark: undefined,
routeProcessBoList: []// routeVersion: undefined,
productionType: '1',
routeType: '1',
auditReason: undefined,
approveBy: undefined,
approveTime: undefined,
needFirstInspect: '0',
printFlowCard: '0',
batchSize: 0,
routeProcessBoList: [],//
// prodBaseRouteMaterialList BaseRouteFormTS
// @ts-ignore
prodBaseRouteMaterialList: []
}; };
const data = reactive<PageData<BaseRouteForm, BaseRouteQuery>>({ const data = reactive<PageData<BaseRouteForm, BaseRouteQuery>>({
form: { ...initFormData }, form: { ...initFormData },
@ -260,14 +457,20 @@ const data = reactive<PageData<BaseRouteForm, BaseRouteQuery>>({
routeName: undefined, routeName: undefined,
routeDesc: undefined, routeDesc: undefined,
activeFlag: undefined, activeFlag: undefined,
routeVersion: undefined,
productionType: undefined,
routeType: undefined,
auditReason: undefined,
approveBy: undefined,
approveTime: undefined,
needFirstInspect: undefined,
printFlowCard: undefined,
batchSize: undefined,
params: {} params: {}
}, },
rules: { rules: {
routeName: [ routeName: [
{ required: true, message: '工艺路线名称不能为空', trigger: 'blur' } { required: true, message: '工艺路线名称不能为空', trigger: 'blur' }
],
activeFlag: [
{ required: true, message: '激活标识不能为空', trigger: 'change' }
] ]
} }
}); });
@ -287,7 +490,7 @@ const getList = async () => {
const cancel = () => { const cancel = () => {
reset(); reset();
dialog.visible = false; dialog.visible = false;
materialOpen.value = false;
ifOpen.value = false; ifOpen.value = false;
}; };
@ -338,11 +541,16 @@ const handleUpdate = async (row?: BaseRouteVO) => {
const submitForm = () => { const submitForm = () => {
baseRouteFormRef.value?.validate(async (valid: boolean) => { baseRouteFormRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
//
const hasEmptyMaterial = prodBaseRouteMaterialList.value.some(item => !item.materialId || item.materialId === '');
if (hasEmptyMaterial) {
proxy?.$modal.msgError('请选择所有关联物料');
return;
}
buttonLoading.value = true; buttonLoading.value = true;
// form routeProcessBoList
form.value.routeProcessBoList = routeProcessBoList.value; form.value.routeProcessBoList = routeProcessBoList.value;
form.value.prodBaseRouteMaterialList = prodBaseRouteMaterialList.value;
if (form.value.routeId) { if (form.value.routeId) {
await updateBaseRoute(form.value).finally(() => buttonLoading.value = false); await updateBaseRoute(form.value).finally(() => buttonLoading.value = false);
} else { } else {
@ -350,13 +558,13 @@ const submitForm = () => {
} }
proxy?.$modal.msgSuccess('操作成功'); proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false; dialog.visible = false;
// 线,
ifOpen.value = false; ifOpen.value = false;
materialOpen.value = false;
routeProcessBoList.value = []; routeProcessBoList.value = [];
prodBaseRouteMaterialList.value = [];
form.value.routeProcessBoList = []; form.value.routeProcessBoList = [];
form.value.prodBaseRouteMaterialList = [];
form.value.routeProcessVoList = []; form.value.routeProcessVoList = [];
await getList(); await getList();
} }
}); });
@ -477,6 +685,72 @@ const getProcessList = async () => {
processList.value = processRes.data; processList.value = processRes.data;
}; };
/** 维护工艺路线关联物料 */
const routeMaterialUpdate = async (row: BaseRouteVO) => {
reset();
const _routeId = row?.routeId || ids.value[0];
const routeRes = await getBaseRoute(_routeId);
form.value = routeRes.data;
prodBaseRouteMaterialList.value = routeRes.data.prodBaseRouteMaterialList || [];
submitShow.value = true;
materialOpen.value = true;
dialog.title = '维护工艺路线关联物料';
};
/** 修改rowRouteMaterialIndex方法返回类名字符串 */
const rowRouteMaterialIndex = ({ row, rowIndex }: { row: any; rowIndex: number }): string => {
row.index = rowIndex + 1;
return '';
};
/** 工艺路线关联物料添加按钮操作 */
const handleAddRouteMaterial = () => {
prodBaseRouteMaterialList.value.push({
materialId: '',
activeFlag: '1',
remark: '',
});
};
/** 工艺路线关联物料删除按钮操作 */
const handleDeleteRouteMaterial = () => {
if (checkedRouteMaterial.value.length === 0) {
proxy?.$modal.msgError('请先选择要删除的工艺路线关联物料数据');
} else {
prodBaseRouteMaterialList.value = prodBaseRouteMaterialList.value.filter(
item => !checkedRouteMaterial.value.some(checked => checked.materialId === item.materialId)
);
checkedRouteMaterial.value = [];
}
};
/** 复选框选中数据 */
const handleRouteMaterialSelectionChange = (selection: ProdBaseRouteMaterial[]) => {
checkedRouteMaterial.value = selection;
};
const getMaterialListOptions = async () => {
const res = await getMaterialList({});
materialList.value = res.data || [];
};
const materialSelectRef = ref();
const materialDialogOpen = ref(false);
const currentMaterialRowIndex = ref(-1);
const openMaterialDialog = (rowIndex) => {
currentMaterialRowIndex.value = rowIndex;
materialDialogOpen.value = true;
};
const handleMaterialSelection = () => {
const selectedRow = materialSelectRef.value.tableRef.store.states.currentRow.value;
if (selectedRow && currentMaterialRowIndex.value !== -1) {
console.log(selectedRow);
prodBaseRouteMaterialList.value[currentMaterialRowIndex.value].materialId = selectedRow.materialId;
prodBaseRouteMaterialList.value[currentMaterialRowIndex.value].materialName = selectedRow.materialName;
}
materialDialogOpen.value = false;
};
onMounted(() => { onMounted(() => {
getProcessList(); getProcessList();

@ -353,7 +353,7 @@ const data = reactive<PageData<MenuForm, MenuQuery>>({
const copyForm = reactive({ const copyForm = reactive({
menuName: '', menuName: '',
sourceMenuId: undefined as string | number | undefined, sourceMenuId: undefined as string | number | undefined,
parentId: 0, parentId: 0 as string | number | undefined,
orderNum: 0 orderNum: 0
}); });

Loading…
Cancel
Save