You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1890 lines
64 KiB
1890 lines
64 KiB
<template> |
|
<div class="box-card"> |
|
<div class="process-left"> |
|
<div class="process-select"> |
|
<!-- 工艺级别:--> |
|
<el-form :model="form" label-width="auto"> |
|
<el-form-item label="工艺级别:"> |
|
<el-select |
|
v-model="rank" |
|
placeholder="请选择" |
|
style="width: 220px" |
|
@change="leavelChange" |
|
clearable |
|
filterable |
|
> |
|
<el-option label="一级工艺" value="1" /> |
|
<el-option label="二级工艺" value="2" /> |
|
<el-option label="三级工艺" value="3" /> |
|
</el-select> |
|
</el-form-item> |
|
</el-form> |
|
</div> |
|
<el-tree |
|
ref="tree" |
|
:data="data" |
|
:props="defaultProps" |
|
node-key="id" |
|
@node-click="handleNodeClick" |
|
@node-contextmenu="handleNodeRightClick" |
|
default-expand-all |
|
:expand-on-click-node="false" |
|
/> |
|
<div |
|
v-show="contextMenuVisible" |
|
class="custom-context-menu" |
|
:style="{ top: contextMenuTop + 'px', left: contextMenuLeft + 'px' }" |
|
> |
|
<div class="context-menu"> |
|
<el-button |
|
link |
|
type="danger" |
|
@click="handleDeleteNode" |
|
v-if="contextTreeNode && contextTreeNode.level === 2" |
|
> |
|
删除 |
|
</el-button> |
|
</div> |
|
</div> |
|
</div> |
|
<div class="process-right" v-loading="treeLoading"> |
|
<el-form :model="treeNodes.rawData" label-width="auto" :rules="rules"> |
|
<el-row :gutter="24" v-if="activeName == '1'"> |
|
<el-col :span="8"> |
|
<el-form-item label="重要度:" prop="prority"> |
|
<el-select |
|
v-model="treeNodes.rawData.prority" |
|
:placeholder="'请选择'" |
|
clearable |
|
filterable |
|
> |
|
<el-option |
|
v-for="item in priorityList" |
|
:key="item.value" |
|
:label="item.label" |
|
:value="item.value" |
|
/> |
|
</el-select> |
|
</el-form-item> |
|
</el-col> |
|
|
|
<el-col :span="8"> |
|
<!-- 不必填 如果为空 默认值是 临时工艺 --> |
|
<el-form-item label="流转编号:" prop="roamNo"> |
|
<el-input v-model="treeNodes.rawData.roamNo" placeholder="请输入" /> |
|
</el-form-item> |
|
</el-col> |
|
<el-col :span="8"> |
|
<el-form-item label="备注:" prop="remarks"> |
|
<el-input v-model="treeNodes.rawData.remarks" placeholder="请输入" /> |
|
</el-form-item> |
|
</el-col> |
|
</el-row> |
|
</el-form> |
|
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick"> |
|
<el-tab-pane |
|
label="工艺维护" |
|
name="1" |
|
v-if="treeLeave == 1 || treeLeave == 2" |
|
></el-tab-pane> |
|
<el-tab-pane label="项目" name="2" v-if="treeLeave == 3"></el-tab-pane> |
|
<el-tab-pane label="尺寸、量具" name="3" v-if="treeLeave == 3"></el-tab-pane> |
|
<el-tab-pane label="工装、模具表" name="4" v-if="treeLeave == 3"></el-tab-pane> |
|
</el-tabs> |
|
<div class="table-btn"> |
|
<div class="table-btn-left"> |
|
<el-button type="primary" plain @click="addTable()">插入一行</el-button> |
|
<el-button type="danger" plain @click="delTable()">删除选择行</el-button> |
|
<el-button type="primary" @click="saveInfo()" :loading="craftLoading">保存</el-button> |
|
</div> |
|
<div class="table-btn-right" v-if="activeName == '1'"> |
|
<el-select |
|
v-model="modelLevel" |
|
placeholder="选择工艺模板" |
|
style="width: 220px; margin-right: 12px" |
|
clearable |
|
filterable |
|
:filter-method="handleFilter" |
|
> |
|
<el-option |
|
v-for="(item, index) in filteredList" |
|
:key="index" |
|
:label="item.name" |
|
:value="item.id" |
|
/> |
|
</el-select> |
|
<el-button type="primary" @click="modelLevelChange()" :loading="modelLevelLoading" |
|
>导入模板</el-button |
|
> |
|
</div> |
|
</div> |
|
<!-- 工序 --> |
|
<el-form |
|
ref="tableForm1" |
|
:model="form1" |
|
:rules="formRules1" |
|
label-width="0px" |
|
v-if="activeName == '1'" |
|
> |
|
<el-table |
|
:data="form1.tableData1" |
|
style="width: 100%" |
|
@selection-change="handleSelectionChange1" |
|
:height="tableHeight" |
|
> |
|
<el-table-column type="selection" width="55"></el-table-column> |
|
<el-table-column prop="processNo" label="工序号"> |
|
<template #header> |
|
<span><i style="color: red">*</i>工序号</span> |
|
</template> |
|
<template #default="scope"> |
|
<el-form-item |
|
:prop="`tableData1[${scope.$index}].processNo`" |
|
:rules="formRules1.processNo" |
|
> |
|
<el-input |
|
v-model="scope.row.processNo" |
|
placeholder="请输入" |
|
style="width: 100%" |
|
></el-input> |
|
</el-form-item> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="ppsId" label="工序"> |
|
<template #header> |
|
<span><i style="color: red">*</i>工序</span> |
|
</template> |
|
<template #default="scope"> |
|
<el-form-item :prop="`tableData1[${scope.$index}].ppsId`" :rules="formRules1.ppsId"> |
|
<el-select |
|
v-model="scope.row.ppsId" |
|
placeholder="请选择" |
|
clearable |
|
filterable |
|
@change="processChange(scope.row, scope.$index)" |
|
> |
|
|
|
<el-option |
|
v-for="(item, index) in processSetOption" |
|
:key="index" |
|
:label="`${item.code}-${item.name}`" |
|
:value="item.id" |
|
></el-option> |
|
</el-select> |
|
</el-form-item> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="caId" label="工艺能力"> |
|
<template #header> |
|
<span><i style="color: red">*</i>工艺能力</span> |
|
</template> |
|
<template #default="scope"> |
|
<el-form-item :prop="`tableData1[${scope.$index}].caId`" :rules="formRules1.caId"> |
|
<el-select |
|
v-model="scope.row.caId" |
|
placeholder="请选择" |
|
clearable |
|
filterable |
|
@change="craftChange(scope.row, scope.$index)" |
|
> |
|
<el-option |
|
v-for="(item, index) in craftAbilityOption" |
|
:key="index" |
|
:label="`${item.caCode}-${item.caName}`" |
|
:value="item.id" |
|
></el-option> |
|
</el-select> |
|
</el-form-item> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="proDes" label="工序描述"> |
|
<!-- <template #header> |
|
<span><i style="color: red">*</i>工序描述</span> |
|
</template> --> |
|
<template #default="scope"> |
|
<el-form-item :prop="`tableData1[${scope.$index}].proDes`" :rules="formRules1.proDes"> |
|
<el-input v-model="scope.row.proDes" placeholder="请输入"></el-input> |
|
</el-form-item> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="isMain" label="是否主工序"> |
|
<template #header> |
|
<span><i style="color: red">*</i>是否主工序</span> |
|
</template> |
|
<template #default="scope"> |
|
<el-form-item :prop="`tableData1[${scope.$index}].isMain`" :rules="formRules1.isMain"> |
|
<el-select v-model="scope.row.isMain" placeholder="请选择" clearable filterable> |
|
<el-option label="是" value="1"></el-option> |
|
<el-option label="否" value="0"></el-option> |
|
</el-select> |
|
</el-form-item> |
|
</template> |
|
</el-table-column> |
|
</el-table> |
|
</el-form> |
|
<!-- 项目 --> |
|
<el-form |
|
ref="tableForm2" |
|
:model="form2" |
|
:rules="formRules2" |
|
label-width="0px" |
|
v-if="activeName == '2'" |
|
> |
|
<el-table |
|
:data="form2.tableData2" |
|
style="width: 100%" |
|
@selection-change="handleSelectionChange2" |
|
:height="tableHeight" |
|
> |
|
<el-table-column type="selection" width="55"></el-table-column> |
|
<el-table-column prop="trialNo" label="项目编号"> |
|
<template #default="scope"> |
|
<el-input |
|
v-model="scope.row.trialNo" |
|
placeholder="请输入" |
|
style="width: 100%" |
|
></el-input> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="projectCode" label="检验项目"> |
|
<template #header> |
|
<span><i style="color: red">*</i>检验项目</span> |
|
</template> |
|
<template #default="scope"> |
|
<el-form-item |
|
:prop="`tableData2[${scope.$index}].projectCode`" |
|
:rules="formRules2.projectCode" |
|
> |
|
<el-select |
|
v-model="scope.row.projectCode" |
|
placeholder="请选择" |
|
clearable |
|
filterable |
|
@change="projectChange(scope.row, scope.$index)" |
|
> |
|
<el-option |
|
v-for="(item, index) in projectOptions" |
|
:key="index" |
|
:label="`${item.code}-${item.name}`" |
|
:value="item.id" |
|
></el-option> |
|
</el-select> |
|
</el-form-item> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="projectStandard" label="检验标准"> |
|
<template #header> |
|
<span><i style="color: red">*</i>检验标准</span> |
|
</template> |
|
<template #default="scope"> |
|
<el-form-item |
|
:prop="`tableData2[${scope.$index}].projectStandard`" |
|
:rules="formRules2.projectStandard" |
|
> |
|
<el-select |
|
v-model="scope.row.projectStandard" |
|
placeholder="请选择" |
|
clearable |
|
filterable |
|
@change="standardChange(scope.row, scope.$index)" |
|
> |
|
<el-option |
|
v-for="(item, index) in standardList" |
|
:key="index" |
|
:label="item.name" |
|
:value="item.id" |
|
></el-option> |
|
</el-select> |
|
</el-form-item> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="proHours" label="定额工时(分钟)"> |
|
<template #header> |
|
<span><i style="color: red">*</i>定额工时(分钟)</span> |
|
</template> |
|
<template #default="scope"> |
|
<el-form-item |
|
:prop="`tableData2[${scope.$index}].proHours`" |
|
:rules="formRules2.proHours" |
|
> |
|
<el-input |
|
v-model="scope.row.proHours" |
|
placeholder="请输入" |
|
style="width: 100%" |
|
></el-input> |
|
</el-form-item> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="prepareHours" label="准备工时(分钟)"> |
|
<template #default="scope"> |
|
<el-input |
|
v-model="scope.row.prepareHours" |
|
placeholder="请输入" |
|
style="width: 100%" |
|
></el-input> |
|
</template> |
|
</el-table-column> |
|
</el-table> |
|
</el-form> |
|
<!-- 量具 --> |
|
<el-form |
|
ref="tableForm3" |
|
:model="form3" |
|
:rules="formRules3" |
|
label-width="0px" |
|
v-if="activeName == '3'" |
|
> |
|
<el-table |
|
:data="form3.tableData3" |
|
:height="tableHeight" |
|
style="width: 100%" |
|
@selection-change="handleSelectionChange3" |
|
> |
|
<el-table-column type="selection" width="55"></el-table-column> |
|
<el-table-column prop="trialNo" label="项目编号"> |
|
<template #default="scope"> |
|
<el-input |
|
v-model="scope.row.trialNo" |
|
placeholder="请输入" |
|
style="width: 100%" |
|
></el-input> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="testType" label="镀前镀后"> |
|
<template #header> |
|
<span><i style="color: red">*</i>镀前镀后</span> |
|
</template> |
|
<template #default="scope"> |
|
<el-form-item |
|
:prop="`tableData3[${scope.$index}].testType`" |
|
:rules="formRules3.testType" |
|
> |
|
<el-select v-model="scope.row.testType" placeholder="请选择" clearable filterable> |
|
<el-option label="是" value="1"></el-option> |
|
<el-option label="否" value="2"></el-option> |
|
</el-select> |
|
</el-form-item> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="tool" label="量具"> |
|
<template #header> |
|
<span><i style="color: red">*</i>量具</span> |
|
</template> |
|
<template #default="scope"> |
|
<el-form-item :prop="`tableData3[${scope.$index}].tool`" :rules="formRules3.tool"> |
|
<el-input |
|
v-model="scope.row.tool" |
|
placeholder="请输入" |
|
style="width: 100%" |
|
></el-input> |
|
</el-form-item> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="toolSize" label="量具尺寸"> |
|
<template #default="scope"> |
|
<el-input |
|
v-model="scope.row.toolSize" |
|
placeholder="请输入" |
|
style="width: 100%" |
|
></el-input> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="toolSize" label="图纸尺寸"> |
|
<template #default="scope"> |
|
<el-input |
|
v-model="scope.row.toolSize" |
|
placeholder="请输入" |
|
style="width: 100%" |
|
></el-input> |
|
</template> |
|
</el-table-column> |
|
</el-table> |
|
</el-form> |
|
<!-- 工装 --> |
|
<el-form |
|
ref="tableForm4" |
|
:model="form4" |
|
:rules="formRules4" |
|
label-width="0px" |
|
v-if="activeName == '4'" |
|
> |
|
<el-table |
|
:data="form4.tableData4" |
|
style="width: 100%" |
|
@selection-change="handleSelectionChange4" |
|
:height="tableHeight" |
|
> |
|
<el-table-column type="selection" width="55"></el-table-column> |
|
<!-- <el-table-column prop="trialNo" label="工序号"> |
|
<template #default="scope"> |
|
<el-input |
|
v-model="scope.row.trialNo" |
|
placeholder="请输入" |
|
style="width: 100%" |
|
></el-input> |
|
</template> |
|
</el-table-column> --> |
|
<el-table-column prop="moldCode" label="对应工装"> |
|
<template #header> |
|
<span><i style="color: red">*</i>对应工装</span> |
|
</template> |
|
<template #default="scope"> |
|
<el-form-item |
|
:prop="`tableData4[${scope.$index}].moldCode`" |
|
:rules="formRules4.moldCode" |
|
> |
|
<el-input |
|
v-model="scope.row.moldCode" |
|
placeholder="请输入" |
|
style="width: 100%" |
|
></el-input> |
|
</el-form-item> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="moldName" label="工装名称"> |
|
<template #default="scope"> |
|
<el-input |
|
v-model="scope.row.moldName" |
|
placeholder="请输入" |
|
style="width: 100%" |
|
></el-input> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="isPrint" label="是否印字"> |
|
<template #default="scope"> |
|
<el-input |
|
v-model="scope.row.isPrint" |
|
placeholder="请输入" |
|
style="width: 100%" |
|
></el-input> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="printNo" label="印字版编号"> |
|
<template #default="scope"> |
|
<el-input |
|
v-model="scope.row.printNo" |
|
placeholder="请输入" |
|
style="width: 100%" |
|
></el-input> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="testFixtureNo" label="测试夹具号"> |
|
<template #default="scope"> |
|
<el-input |
|
v-model="scope.row.testFixtureNo" |
|
placeholder="请输入" |
|
style="width: 100%" |
|
></el-input> |
|
</template> |
|
</el-table-column> |
|
</el-table> |
|
</el-form> |
|
</div> |
|
</div> |
|
</template> |
|
<script> |
|
import { |
|
getProcessAuthorized, |
|
getModelList, |
|
getModelDetailList, |
|
authorizedAccomplish2, |
|
saveProcessProjectSave, |
|
saveProcessMeasuringTool, |
|
saveProcessMoldTool, |
|
getProcessSetList, |
|
getCraftAbilityList, |
|
getProject, |
|
getStandardList, |
|
craftBatchRemoval, |
|
} from '@/api/processManagement/taskProcessing'; |
|
import { getPqList } from '@/api/qualityManagement/remindRedeem/remindRedeem'; |
|
import { getDictionary } from '@/api/system/dict'; |
|
export default { |
|
name: 'CraftIndex', |
|
components: {}, |
|
props: { |
|
partId: { |
|
type: [Number, String], |
|
default: null, |
|
}, |
|
updateRow: { |
|
type: Object, |
|
default: {}, |
|
}, |
|
}, |
|
data() { |
|
return { |
|
tableHeight: 0, |
|
form: {}, |
|
treeLoading: false, |
|
modelLevelLoading: false, |
|
craftLoading: false, |
|
rank: '2', |
|
lastConfirmedRank: '2', |
|
data: [], |
|
rules: { |
|
prority: [{ required: true, message: '请选择', trigger: 'blur' }], |
|
qualityGradeCode: [{ required: true, message: '请选择', trigger: 'blur' }], |
|
}, |
|
priorityList: [ |
|
{ |
|
label: '本次使用', |
|
value: 1, |
|
}, |
|
{ |
|
label: '正式工艺', |
|
value: 2, |
|
}, |
|
{ |
|
label: '临时工艺', |
|
value: 3, |
|
}, |
|
], |
|
rankList: [], |
|
activeName: '1', |
|
treeLeave: 1, //组织树选中层级 |
|
processSetOption: [], //工序列表 |
|
craftAbilityOption: [], //工艺能力列表 |
|
modelOption: [], //模板列表 |
|
modelLevel: null, //模板选择 |
|
form1: { |
|
tableData1: [], //工序 |
|
deleteIds: [], |
|
selectIds: [], //选中ID |
|
}, |
|
form2: { |
|
tableData2: [], //项目 |
|
deleteIds: [], |
|
selectIds: [], //选中ID |
|
}, |
|
form3: { |
|
tableData3: [], //量具 |
|
deleteIds: [], |
|
selectIds: [], //选中ID |
|
}, |
|
form4: { |
|
tableData4: [], //工装 |
|
deleteIds: [], |
|
selectIds: [], //选中ID |
|
}, |
|
formRules1: { |
|
ppsId: [{ required: true, message: '请选择', trigger: ['change', 'submit'] }], |
|
caId: [{ required: true, message: '请选择', trigger: ['change', 'submit'] }], |
|
// proDes: [{ required: true, message: '请选择', trigger: ['change', 'submit'] }], |
|
isMain: [{ required: true, message: '请选择', trigger: ['change', 'submit'] }], |
|
processNo: [{ required: true, message: '请输入', trigger: ['change', 'submit'] }], |
|
}, |
|
formRules2: { |
|
projectCode: [{ required: true, message: '请选择', trigger: ['change', 'submit'] }], |
|
projectStandard: [{ required: true, message: '请输入', trigger: ['change', 'submit'] }], |
|
proHours: [{ required: true, message: '请输入', trigger: ['change', 'submit'] }], |
|
}, |
|
formRules3: { |
|
testType: [{ required: true, message: '请选择', trigger: ['change', 'submit'] }], |
|
tool: [{ required: true, message: '请选择', trigger: ['change', 'submit'] }], |
|
}, |
|
formRules4: { |
|
moldCode: [{ required: true, message: '请输入', trigger: ['change', 'submit'] }], |
|
}, |
|
treeNodes: { |
|
rawData: {}, |
|
}, //选中组织树节点信息 |
|
parentData: {}, //选中父节点的数据 |
|
partInfoData: {}, //零件信息 |
|
tempId: 0, |
|
projectOptions: [], //检验项目列表 |
|
standardList: [], //检验标准列表 |
|
filteredList: [], |
|
dictionaryData: [], |
|
// 右键菜单相关 |
|
contextMenuVisible: false, |
|
contextMenuTop: 0, |
|
contextMenuLeft: 0, |
|
contextNodeData: null, |
|
contextTreeNode: null, |
|
defaultProps: { |
|
// 使用 label 属性(已在 transformCraftTree 中设置好) |
|
label: 'label', |
|
// 子节点字段 |
|
children: 'children', |
|
// 节点是否禁用 |
|
disabled: 'disabled', |
|
}, |
|
}; |
|
}, |
|
|
|
mounted() { |
|
this.getModelList(); |
|
this.getDetails(); |
|
|
|
this.getProcessSetList(); |
|
this.getCraftAbilityList(); |
|
this.getPqList(); |
|
this.getProject(); |
|
this.getStandardList(); |
|
this.getDictionary(); |
|
document.addEventListener('click', this.closeContextMenu); |
|
document.addEventListener('contextmenu', this.closeContextMenu); // 右键其他地方也关闭 |
|
}, |
|
beforeUnmount() { |
|
document.removeEventListener('click', this.closeContextMenu); |
|
document.removeEventListener('contextmenu', this.closeContextMenu); |
|
}, |
|
methods: { |
|
// 表格高度计算 |
|
calculateTableHeight() { |
|
this.$nextTick(() => { |
|
const rightContainer = this.$el.querySelector('.process-right'); |
|
if (!rightContainer) return; |
|
|
|
const formElement = this.$el.querySelector('.process-right > .el-form'); |
|
const tabsElement = this.$el.querySelector('.process-right > .el-tabs'); |
|
const btnElement = this.$el.querySelector('.process-right > .table-btn'); |
|
|
|
const formHeight = formElement ? formElement.offsetHeight : 0; |
|
const tabsHeight = tabsElement ? tabsElement.offsetHeight : 0; |
|
const btnHeight = btnElement ? btnElement.offsetHeight : 0; |
|
|
|
const containerHeight = rightContainer.offsetHeight; |
|
|
|
const padding = 24; |
|
const marginBottom = 12; |
|
this.tableHeight = |
|
containerHeight - formHeight - tabsHeight - btnHeight - padding - marginBottom * 2; |
|
// 确保最小高度 |
|
if (this.tableHeight < 200) { |
|
this.tableHeight = 200; |
|
} |
|
}); |
|
}, |
|
// 获取涂色标、涂色带、涂箭头的系数 |
|
getDictionary() { |
|
getDictionary({ code: 'part_info' }).then(res => { |
|
this.dictionaryData = res.data.data; |
|
}); |
|
}, |
|
// 获取检验项目名字 |
|
projectChange(row, index) { |
|
let selectName = this.projectOptions.find(item => item.id == row.projectCode); |
|
this.form2.tableData2[index].projectName = selectName.name; |
|
this.form2.tableData2[index].proHours = |
|
selectName.standardWorkMinute != -1 ? selectName.standardWorkMinute : 0; |
|
}, |
|
// 获取检验标准名字 |
|
standardChange(row, index) { |
|
let selectName = this.standardList.find(item => item.id == row.projectStandard); |
|
this.form2.tableData2[index].projectStandardName = selectName.name; |
|
}, |
|
getStandardList() { |
|
getStandardList().then(res => { |
|
this.standardList = res.data.data; |
|
}); |
|
}, |
|
getProject() { |
|
getProject({ size: 999999, current: 1 }).then(res => { |
|
this.projectOptions = res.data.data.records; |
|
}); |
|
}, |
|
// 获取工序名字 |
|
processChange(row, index) { |
|
let selectName = this.processSetOption.find(item => item.id == row.ppsId); |
|
this.form1.tableData1[index].processName = selectName.name; |
|
this.form1.tableData1[index].processCode = selectName.code; |
|
if (this.form1.tableData1[index].processName.indexOf('涂色标') > -1) { |
|
// tsbNum 涂色标个数 tsdNum 涂色带个数 涂箭头个数 |
|
let sum_ = 0; |
|
if (this.partInfoData.tsbNum) { |
|
let tsb = this.dictionaryData.find(item => item.dictValue == '涂色标'); |
|
sum_ += parseInt(this.partInfoData.tsbNum) * tsb.dictKey; |
|
} |
|
if (this.partInfoData.tsdNum) { |
|
let tsd = this.dictionaryData.find(item => item.dictValue == '涂色带'); |
|
sum_ += parseInt(this.partInfoData.tsdNum) * tsd.dictKey; |
|
} |
|
if (this.partInfoData.tsjNum) { |
|
let tsj = this.dictionaryData.find(item => item.dictValue == '涂箭头'); |
|
sum_ += parseInt(this.partInfoData.tsjNum) * tsj.dictKey; |
|
} |
|
this.form1.tableData1[index].proHours = parseFloat(sum_.toFixed(2)); |
|
} |
|
}, |
|
// 获取工艺能力名字 |
|
craftChange(row, index) { |
|
let selectName = this.craftAbilityOption.find(item => item.id == row.caId); |
|
this.form1.tableData1[index].craftName = selectName.caName; |
|
this.form1.tableData1[index].craftCode = selectName.code; |
|
}, |
|
// 获取生产标识列表 |
|
getPqList() { |
|
getPqList().then(res => { |
|
this.rankList = res.data.data; |
|
}); |
|
}, |
|
handleFilter(keyword) { |
|
// 1. 无关键词时,显示全部数据 |
|
if (!keyword) { |
|
this.filteredList = [...this.modelOption]; |
|
return; |
|
} |
|
|
|
// 2. 统一转为小写,实现不区分大小写过滤 |
|
const lowerKeyword = keyword; |
|
|
|
// 3. 同时匹配两个字段:name 或 pinyin 包含关键词即保留 |
|
this.filteredList = this.modelOption.filter(item => { |
|
// 字段1:姓名(转小写) |
|
const matchName = item.name.includes(lowerKeyword); |
|
// 字段2:拼音(转小写) |
|
const matchPinyin = item.modelNameStr.includes(lowerKeyword); |
|
// 只要有一个字段匹配,就保留该选项 |
|
return matchName || matchPinyin; |
|
}); |
|
}, |
|
// 工艺模板列表 |
|
async getModelList() { |
|
await getModelList().then(res => { |
|
this.modelOption = res.data.data; |
|
this.filteredList = [...this.modelOption]; |
|
}); |
|
}, |
|
// 工序列表查询 |
|
getProcessSetList() { |
|
getProcessSetList().then(res => { |
|
this.processSetOption = res.data.data; |
|
}); |
|
}, |
|
// 工艺能力列表查询 |
|
getCraftAbilityList() { |
|
getCraftAbilityList().then(res => { |
|
this.craftAbilityOption = res.data.data; |
|
}); |
|
}, |
|
// 导入模板 |
|
modelLevelChange() { |
|
if (!this.treeNodes.rawData) { |
|
return this.$message.warning('请先选择工艺树节点'); |
|
} |
|
this.modelLevelLoading = true; |
|
getModelDetailList({ Id: this.modelLevel }).then(res => { |
|
const templateData = res.data.data.proDetailVOList; |
|
const existing = [...this.form1.tableData1]; |
|
const baseIndex = existing.length; |
|
|
|
// 将模板中的工序数据映射为表格所需格式 |
|
const mappedData = templateData.map((item, index) => { |
|
// ✅ 映射检验项目列表 |
|
const projectList = (item.modelProjectList || []).map(project => ({ |
|
id: null, |
|
trialNo: this.getProcessNo([], index), |
|
projectCode: project.projectCode, |
|
projectName: project.projectName, |
|
projectStandard: project.projectStandard, |
|
projectStandardName: project.projectStandardName, |
|
proHours: project.proHours || 0, |
|
prepareHours: project.prepareHours || 0, |
|
})); |
|
|
|
// ✅ 映射量具列表 |
|
const measuringToolList = (item.measuringToolList || []).map(tool => ({ |
|
id: null, |
|
trialNo: this.getProcessNo([], index), |
|
testType: tool.testType, |
|
tool: tool.tool, |
|
toolSize: tool.toolSize, |
|
toolInfo: tool.toolInfo, |
|
})); |
|
|
|
// ✅ 映射工装列表 |
|
const moldToolList = (item.moldToolList || []).map(mold => ({ |
|
id: null, |
|
trialNo: this.getProcessNo([], index), |
|
moldCode: mold.moldCode, |
|
moldName: mold.moldName, |
|
isPrint: mold.isPrint, |
|
printNo: mold.printNo, |
|
testFixtureNo: mold.testFixtureNo, |
|
})); |
|
|
|
return { |
|
id: null, |
|
_tempId: `temp_${Date.now()}_${index}`, // 临时唯一标识 |
|
processNo: this.getProcessNo(existing, index), |
|
ppsId: item.ppsId + '', |
|
processName: item.processName, |
|
caId: item.caId + '', |
|
craftName: item.craftName, |
|
proDes: item.proDes, |
|
proHours: item.proHours || '', |
|
setoutHours: item.setoutHours || '', |
|
isMain: item.isMain || '0', |
|
// ✅ 将子数据关联到工序 |
|
processProjectList: projectList, |
|
measuringToolList: measuringToolList, |
|
moldToolList: moldToolList, |
|
}; |
|
}); |
|
|
|
// 追加模式 |
|
this.form1.tableData1 = [...existing, ...mappedData]; |
|
this.modelLevelLoading = false; |
|
|
|
// ✅ 更新左侧树形结构(不调用接口) |
|
this.updateTreeStructure(mappedData); |
|
|
|
this.$message.success('模板导入成功,请检查后手动保存'); |
|
}); |
|
}, |
|
// ✅ 新增:更新树形结构方法 |
|
updateTreeStructure(mappedData) { |
|
// 1. 更新当前选中节点的 processList |
|
if (this.treeLeave === 2) { |
|
this.treeNodes.processList = this.form1.tableData1; |
|
} |
|
|
|
// 2. 更新 data 树形结构中对应的工艺节点 |
|
const updateTreeNode = nodes => { |
|
for (let node of nodes) { |
|
if (node.level === 2 && node.id === this.treeNodes.id) { |
|
// 更新工艺节点的 processList |
|
node.processList = this.form1.tableData1; |
|
|
|
// 更新子节点(工序) |
|
node.children = this.form1.tableData1.map(process => ({ |
|
id: process.id || process._tempId || `process_${Date.now()}_${Math.random()}`, |
|
label: process.processName || '未知工序', |
|
level: 3, |
|
rawData: { |
|
processInfo: process, |
|
projectList: process.processProjectList || [], |
|
measuringToolList: process.measuringToolList || [], |
|
moldToolList: process.moldToolList || [], |
|
}, |
|
children: (process.processProjectList || []).map(project => ({ |
|
id: project.id || `project_${Date.now()}_${Math.random()}`, |
|
label: project.projectName || '未知项目', |
|
level: 4, |
|
disabled: true, |
|
rawData: project, |
|
})), |
|
})); |
|
break; |
|
} |
|
if (node.children && node.children.length > 0) { |
|
updateTreeNode(node.children); |
|
} |
|
} |
|
}; |
|
updateTreeNode(this.data); |
|
}, |
|
// 获取零件信息详情数据 |
|
async getDetails() { |
|
this.treeLoading = true; |
|
let query_ = {}; |
|
if (!this.updateRow.partVersion) { |
|
query_ = { |
|
partId: this.partId, |
|
taskId: this.updateRow.id, |
|
rank: this.lastConfirmedRank, |
|
version: this.updateRow.version, |
|
}; |
|
} else { |
|
query_ = { |
|
version: this.updateRow.partVersion, |
|
partCode: this.updateRow.partCode, |
|
rank: this.lastConfirmedRank, |
|
}; |
|
} |
|
await getProcessAuthorized(query_) |
|
.then(res => { |
|
this.treeLoading = false; |
|
this.data = this.transformCraftTree(res.data.data); |
|
this.partInfoData = res.data.data.partInfo; |
|
this.$nextTick(() => { |
|
this.autoSelectFirstProcess(); |
|
this.calculateTableHeight(); |
|
}); |
|
if (this.partInfoData.partName == '石墨模') { |
|
let graphite = this.modelOption.find(item => item.name == '石墨模'); |
|
this.modelLevel = graphite.id; |
|
this.modelLevelChange(); |
|
} |
|
}) |
|
.catch(err => { |
|
this.treeLoading = false; |
|
}); |
|
}, |
|
autoSelectFirstProcess() { |
|
if (!this.data || this.data.length === 0) return; |
|
const rootNode = this.data[0]; |
|
this.handleNodeClick(rootNode, { |
|
level: 1, |
|
parent: { |
|
data: null, |
|
isRoot: true, |
|
}, |
|
}); |
|
this.$nextTick(() => { |
|
if (this.$refs.tree) { |
|
this.$refs.tree.setCurrentKey(rootNode.id); |
|
} |
|
}); |
|
}, |
|
// 组织树转换 |
|
transformCraftTree(responseData) { |
|
const { partInfo, craftList } = responseData; |
|
const partCode = partInfo.partCode; |
|
|
|
const generateId = (prefix, id, fallback) => { |
|
return ( |
|
id || `${prefix}_${fallback}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}` |
|
); |
|
}; |
|
|
|
const formatCraftLabel = craftInfo => { |
|
return `${craftInfo.roamNo || '临时工艺'}-${craftInfo.craftNo || 'C000000'}`; |
|
}; |
|
|
|
const tree = [ |
|
{ |
|
id: generateId('part', partInfo.id, partCode), |
|
label: partCode, |
|
disabled: false, |
|
level: 1, |
|
rawData: { |
|
partCode: partInfo.partCode, |
|
partId: partInfo.id, |
|
rank: this.rank, |
|
version: partInfo.version, |
|
craftNo: 'C000000', |
|
}, |
|
|
|
children: (craftList || []).map(craft => { |
|
const { craftInfo, processList } = craft; |
|
|
|
return { |
|
...craftInfo, |
|
id: generateId('craft', craftInfo.id, craftInfo.craftNo), |
|
label: formatCraftLabel(craftInfo), |
|
level: 2, |
|
rawData: craftInfo, |
|
// ✅ 工序列表 |
|
processList: (processList || []).map(process => ({ |
|
...process.processInfo, |
|
projectList: process.projectList || [], |
|
measuringToolList: process.measuringToolList || [], |
|
moldToolList: process.moldToolList || [], |
|
})), |
|
// ✅ 子节点(工序) |
|
children: (processList || []).map(process => { |
|
const { processInfo, projectList, measuringToolList, moldToolList } = process; |
|
|
|
return { |
|
...processInfo, |
|
id: generateId('process', processInfo.id, processInfo.processNo), |
|
label: processInfo.processNo+'-'+processInfo.processName, |
|
level: 3, |
|
rawData: { |
|
processInfo, |
|
projectList: projectList || [], |
|
measuringToolList: measuringToolList || [], |
|
moldToolList: moldToolList || [], |
|
}, |
|
// ✅ 子节点(项目) |
|
children: (projectList || []).map(project => ({ |
|
id: generateId('project', project.id, project.projectCode), |
|
label: project.trialNo+'-'+project.projectName || '未知项目', |
|
level: 4, |
|
disabled: true, |
|
rawData: project, |
|
})), |
|
}; |
|
}), |
|
}; |
|
}), |
|
}, |
|
]; |
|
|
|
return tree; |
|
}, |
|
// 组织树点击 |
|
handleNodeClick(nodes, node, self) { |
|
if (nodes.disabled && node.level !== 1) { |
|
return false; |
|
} |
|
// console.log(node.level, nodes, 'node.level'); |
|
this.calculateTableHeight(); |
|
this.treeLoading = true; |
|
|
|
this.treeNodes = nodes; |
|
const parentNode = node.parent; |
|
|
|
if (parentNode && parentNode.data && !parentNode.isRoot) { |
|
this.parentData = parentNode.data; |
|
} |
|
|
|
this.treeLeave = node.level; |
|
|
|
// 清空现有表格数据 |
|
this.clearTableData(); |
|
|
|
// 根据节点层级加载对应数据 |
|
if (this.treeLeave === 1) { |
|
// 🟢 零件节点:加载该零件下所有工艺的工序数据(只读) |
|
this.activeName = '1'; |
|
const allProcesses = []; |
|
this.form1.tableData1 = allProcesses; |
|
} |
|
|
|
if (this.treeLeave === 2) { |
|
// 🟢 工艺节点:加载工序列表 |
|
this.activeName = '1'; |
|
this.form1.tableData1 = nodes.processList || []; |
|
} |
|
|
|
if (this.treeLeave === 3) { |
|
// 🟢 工序节点:加载项目、量具、工装 |
|
this.activeName = '2'; |
|
const { projectList, measuringToolList, moldToolList } = nodes.rawData; |
|
this.form2.tableData2 = projectList || []; |
|
this.form3.tableData3 = measuringToolList || []; |
|
this.form4.tableData4 = moldToolList || []; |
|
} |
|
setTimeout(() => { |
|
this.treeLoading = false; |
|
}, 1000); |
|
}, |
|
// 清空表格数据 |
|
clearTableData() { |
|
this.form1.tableData1 = []; |
|
this.form2.tableData2 = []; |
|
this.form3.tableData3 = []; |
|
this.form4.tableData4 = []; |
|
this.form1.deleteIds = []; |
|
this.form2.deleteIds = []; |
|
this.form3.deleteIds = []; |
|
this.form4.deleteIds = []; |
|
}, |
|
// 右键点击树节点 |
|
handleNodeRightClick(event, nodeData, node, component) { |
|
event.preventDefault(); |
|
|
|
if (node.level !== 2) { |
|
this.$message.warning('仅工艺节点支持右键操作'); |
|
this.contextMenuVisible = false; |
|
return; |
|
} |
|
|
|
// 记录节点信息 |
|
this.contextNodeData = nodeData; |
|
this.contextTreeNode = node; |
|
|
|
// 设置菜单位置(防止超出视口) |
|
const x = event.clientX; |
|
const y = event.clientY; |
|
|
|
// 可选:简单防越界(可根据需要增强) |
|
this.contextMenuLeft = Math.min(x, window.innerWidth - 130); // 130 是菜单宽度 |
|
this.contextMenuTop = Math.min(y, window.innerHeight - 60); // 60 是菜单高度 |
|
|
|
this.contextMenuVisible = true; |
|
}, |
|
closeContextMenu() { |
|
this.contextMenuVisible = false; |
|
this.contextNodeData = null; |
|
this.contextTreeNode = null; |
|
}, |
|
async handleDeleteNode() { |
|
if (!this.contextTreeNode) { |
|
this.closeContextMenu(); |
|
return; |
|
} |
|
|
|
const node = this.contextTreeNode; |
|
const nodeId = node.data.id; |
|
try { |
|
// 弹出确认框 |
|
await this.$confirm('此操作将删除该工艺及所有子工序,是否继续?', '警告', { |
|
confirmButtonText: '确定', |
|
cancelButtonText: '取消', |
|
type: 'warning', |
|
}); |
|
// 调用删除API(替换为你的实际API) |
|
await craftBatchRemoval({ id: node.data.id }).then(res => { |
|
this.$message.success('删除成功'); |
|
this.getDetails(); |
|
}); |
|
} catch (error) { |
|
if (error !== 'cancel') { |
|
this.$message.error('删除失败,请重试'); |
|
} |
|
} finally { |
|
this.closeContextMenu(); |
|
} |
|
}, |
|
|
|
// 右侧tab切换 |
|
handleClick(value) { |
|
this.form1.deleteIds = []; |
|
this.form2.deleteIds = []; |
|
this.form3.deleteIds = []; |
|
this.form4.deleteIds = []; |
|
}, |
|
// 切换等级 |
|
async leavelChange(newVal) { |
|
// 弹出确认框 |
|
try { |
|
await this.$confirm('确定要切换工艺级别吗?切换后当前编辑内容将丢失。', '提示', { |
|
confirmButtonText: '确定', |
|
cancelButtonText: '取消', |
|
type: 'warning', |
|
}); |
|
|
|
// 用户确认:更新已确认的值,并加载数据 |
|
this.lastConfirmedRank = newVal; |
|
// 清空表格选择状态(可选) |
|
this.form1.deleteIds = []; |
|
this.form2.deleteIds = []; |
|
this.form3.deleteIds = []; |
|
this.form4.deleteIds = []; |
|
// 清空表格选择状态(可选) |
|
this.form1.tableData1 = []; |
|
this.form2.tableData2 = []; |
|
this.form3.tableData3 = []; |
|
this.form4.tableData4 = []; |
|
this.getDetails(); |
|
} catch (error) { |
|
// 用户取消:恢复为上一次确认的值 |
|
this.rank = this.lastConfirmedRank; |
|
} |
|
}, |
|
// 获取工序号 |
|
getProcessNo(table, index = 0) { |
|
const len = table.length; |
|
let processNo = (len + index + 1) * 5; |
|
|
|
if (processNo.toString().length === 1) { |
|
processNo = '000' + processNo; |
|
} else if (processNo.toString().length === 2) { |
|
processNo = '00' + processNo; |
|
} else if (processNo.toString().length === 3) { |
|
processNo = '0' + processNo; |
|
} else if (processNo.toString().length === 4) { |
|
processNo = '' + processNo; |
|
} |
|
return processNo; |
|
}, |
|
// 插入一行 |
|
addTable() { |
|
this.tempId++; |
|
if (this.activeName == '1') { |
|
this.form1.tableData1.push({ |
|
_tempId: this.tempId, // 临时唯一标识 |
|
id: null, |
|
processNo: this.getProcessNo(this.form1.tableData1), |
|
isMain:'0' |
|
}); |
|
} |
|
if (this.activeName == '2') { |
|
this.form2.tableData2.push({ |
|
_tempId: this.tempId, // 临时唯一标识 |
|
id: null, |
|
trialNo: this.treeNodes.processNo + '-' + this.getProcessNo(this.form2.tableData2), |
|
}); |
|
} |
|
if (this.activeName == '3') { |
|
let trialNo_ = ''; |
|
if (this.treeNodes.children.length <= 0) { |
|
trialNo_ = this.treeNodes.processNo; |
|
}else{ |
|
let projectInfo = this.treeNodes.children.filter(item => item.rawData.projectName.indexOf('尺寸检测')>-1); |
|
if(projectInfo.length>0){ |
|
trialNo_ = projectInfo[0].rawData.trialNo; |
|
}else{ |
|
trialNo_ = this.treeNodes.processNo; |
|
} |
|
} |
|
|
|
this.form3.tableData3.push({ |
|
_tempId: this.tempId, // 临时唯一标识 |
|
id: null, |
|
trialNo: trialNo_, |
|
}); |
|
} |
|
if (this.activeName == '4') { |
|
this.form4.tableData4.push({ |
|
_tempId: this.tempId, // 临时唯一标识 |
|
id: null, |
|
trialNo: this.getProcessNo(this.form4.tableData4), |
|
}); |
|
} |
|
}, |
|
handleSelectionChange1(val) { |
|
this.form1.selectIds = val.map(row => row.id || row._tempId); |
|
}, |
|
handleSelectionChange2(val) { |
|
this.form2.selectIds = val.map(row => row.id || row._tempId); |
|
}, |
|
handleSelectionChange3(val) { |
|
this.form3.selectIds = val.map(row => row.id || row._tempId); |
|
}, |
|
handleSelectionChange4(val) { |
|
this.form4.selectIds = val.map(row => row.id || row._tempId); |
|
}, |
|
// 删除选择行 |
|
delTable() { |
|
const active = this.activeName; |
|
let message = '请至少选择一条数据进行删除'; |
|
|
|
if (active === '1') { |
|
if (this.form1.selectIds.length === 0) { |
|
this.$message.warning(message); |
|
return; |
|
} |
|
this.form1.deleteIds = this.form1.tableData1 |
|
.filter(row => this.form1.selectIds.includes(row.id || row._tempId)) |
|
.filter(row => row.id != null && row.id !== '') // 只保留有真实 id 的行 |
|
.map(row => row.id); |
|
this.form1.tableData1 = this.form1.tableData1.filter(row => { |
|
const key = row.id || row._tempId; |
|
return !this.form1.selectIds.includes(key); |
|
}); |
|
|
|
this.form1.selectIds = []; // 清空选中 |
|
} else if (active === '2') { |
|
if (this.form2.selectIds.length === 0) { |
|
this.$message.warning(message); |
|
return; |
|
} |
|
this.form2.deleteIds = this.form2.tableData2 |
|
.filter(row => this.form2.selectIds.includes(row.id || row._tempId)) |
|
.filter(row => row.id != null && row.id !== '') |
|
.map(row => row.id); |
|
|
|
this.form2.tableData2 = this.form2.tableData2.filter(row => { |
|
const key = row.id || row._tempId; |
|
return !this.form2.selectIds.includes(key); |
|
}); |
|
this.form2.selectIds = []; |
|
} else if (active === '3') { |
|
if (this.form3.selectIds.length === 0) { |
|
this.$message.warning(message); |
|
return; |
|
} |
|
this.form3.deleteIds = this.form3.tableData3 |
|
.filter(row => this.form3.selectIds.includes(row.id || row._tempId)) |
|
.filter(row => row.id != null && row.id !== '') |
|
.map(row => row.id); |
|
this.form3.tableData3 = this.form3.tableData3.filter(row => { |
|
const key = row.id || row._tempId; |
|
return !this.form3.selectIds.includes(key); |
|
}); |
|
this.form3.selectIds = []; |
|
} else if (active === '4') { |
|
if (this.form4.selectIds.length === 0) { |
|
this.$message.warning(message); |
|
return; |
|
} |
|
this.form4.deleteIds = this.form4.tableData4 |
|
.filter(row => this.form4.selectIds.includes(row.id || row._tempId)) |
|
.filter(row => row.id != null && row.id !== '') |
|
.map(row => row.id); |
|
|
|
this.form4.tableData4 = this.form4.tableData4.filter(row => { |
|
const key = row.id || row._tempId; |
|
return !this.form4.selectIds.includes(key); |
|
}); |
|
this.form4.selectIds = []; |
|
} |
|
|
|
this.$message.success('删除成功'); |
|
}, |
|
checkingProNo(table) { |
|
// 验证工序号是否重复 |
|
const tableData = table; |
|
const proNoList = []; |
|
tableData.forEach(item => { |
|
proNoList.push(item.processNo); |
|
}); |
|
const list = Array.from(new Set(proNoList)); |
|
if (tableData.length !== list.length) { |
|
// return this.$message.warning('工序号重复,请修改!'); |
|
return true; |
|
} else { |
|
return false; |
|
} |
|
}, |
|
saveInfo() { |
|
if (this.activeName == '1') { |
|
// 调用单个 Form 的校验方法 |
|
this.$refs.tableForm1.validate(async (isValid, invalidFields) => { |
|
if (isValid) { |
|
if (Object.keys(this.treeNodes).length == 0) { |
|
return this.$message.warning('请先选择左侧组织树数据'); |
|
} |
|
if (this.checkingProNo(this.form1.tableData1)) { |
|
return this.$message.warning('工序号重复,请修改!'); |
|
} |
|
// 验证涂色标的工时是否大于0 |
|
let isReturn = 0; |
|
this.form1.tableData1.forEach(item => { |
|
if (item.processName === '涂色标' && item.hourQuota <= 0) { |
|
isReturn = 1; |
|
} |
|
}); |
|
// 验证主工序 是否设置 |
|
let noMainPro = false; |
|
const arr = []; |
|
const pidList = []; |
|
const tableData = this.form1.tableData1; |
|
tableData.forEach(item => { |
|
if (item.isMain) { |
|
noMainPro = true; |
|
} |
|
arr.push(item.processName); |
|
if (item.processName == '镀后检验') { |
|
pidList.push(item.pid); |
|
} |
|
}); |
|
|
|
if (!noMainPro) { |
|
return this.$message.error('此套工艺未含主工序,请设置主工序!!!'); |
|
} |
|
if (isReturn == 1) { |
|
return this.$message.warning('涂色标的工时定额必须大于0,请修改!'); |
|
} |
|
// const res = await getPartDetail(this.partId); |
|
let dsCraftMold = this.partInfoData; |
|
|
|
if (dsCraftMold.markingsTest == '1') { |
|
if (!arr.includes('涂色标')) { |
|
return this.$message.warning('该工艺包含的工序必须包含涂色标'); |
|
} |
|
} |
|
|
|
// 验证热处理工序是否存在 |
|
if (dsCraftMold.hardness == '1') { |
|
if (!arr.includes('热处理检验')) { |
|
this.$message({ |
|
dangerouslyUseHTMLString: true, |
|
message: |
|
'<strong style="font-size:22px" >' + |
|
'该零件硬度为 ' + |
|
dsCraftMold.hardness + |
|
', 没有热处理检验工序。' + |
|
'</strong>', |
|
showClose: true, |
|
duration: 7000, |
|
type: 'warning', |
|
}); |
|
} else { |
|
this.$message({ |
|
dangerouslyUseHTMLString: true, |
|
message: |
|
'<strong style="font-size:22px" >' + |
|
'该零件硬度为 ' + |
|
dsCraftMold.hardness + |
|
', 存在热处理检验工序。' + |
|
'</strong>', |
|
showClose: true, |
|
duration: 7000, |
|
type: 'success', |
|
}); |
|
} |
|
} |
|
|
|
// 验证镀种存在 SB 判断工序是否存在喷砂 |
|
if (dsCraftMold.plate != null && dsCraftMold.plate.indexOf('SB') != -1) { |
|
if (!arr.includes('喷砂')) { |
|
this.$message({ |
|
dangerouslyUseHTMLString: true, |
|
message: |
|
'<strong style="font-size:22px" >' + |
|
'该镀种存在 SB ' + |
|
dsCraftMold.plate + |
|
', 没有喷砂工序。' + |
|
'</strong>', |
|
showClose: true, |
|
duration: 7000, |
|
type: 'warning', |
|
}); |
|
} |
|
} |
|
|
|
// 判断镀种中是否包含 不钝化 |
|
if (dsCraftMold.plate != null && dsCraftMold.plate.indexOf('不钝化') != -1) { |
|
// 如果存在镀后检验工序 |
|
if (pidList.length > 0) { |
|
// 拿出所有镀后检验工序对应的实验项目 |
|
let isExist = 0; |
|
const res1 = await this.$ajax.post('dsMatingInfo/loadMatingInfoByPidList', { |
|
pidList: pidList, |
|
miType: 1, |
|
}); |
|
res1.data.forEach(item => { |
|
if (item.trialItem.indexOf('可焊性') != -1) { |
|
// 如果其中存在可焊性实验项目 |
|
isExist = 1; |
|
} |
|
}); |
|
if (isExist != 1) { |
|
this.$message({ |
|
dangerouslyUseHTMLString: true, |
|
message: |
|
'<strong style="font-size:22px" >' + |
|
'该零件镀种包含不钝化 ' + |
|
dsCraftMold.plate + |
|
', 镀后检验中未设置可焊性检测试验项目。' + |
|
'</strong>', |
|
showClose: true, |
|
duration: 7000, |
|
type: 'warning', |
|
}); |
|
} |
|
} |
|
} |
|
// // yingGuangJian 荧光检验证 |
|
if (dsCraftMold.fluorescenceCheck == '1') { |
|
let flag = false; |
|
arr.forEach(item => { |
|
if (item.indexOf('荧光检') !== -1) { |
|
flag = true; |
|
} |
|
}); |
|
if (!flag) { |
|
return this.$message({ |
|
dangerouslyUseHTMLString: true, |
|
message: |
|
'<strong style="font-size:22px" >' + |
|
'该工艺包含的工序必须包含荧光检工序' + |
|
'</strong>', |
|
showClose: true, |
|
duration: 7000, |
|
type: 'warning', |
|
}); |
|
} |
|
} |
|
// // heatTreatmentTest 热处理检验验证 |
|
if (dsCraftMold.hotDispose == '1') { |
|
if (!arr.includes('热处理检验')) { |
|
return this.$message({ |
|
dangerouslyUseHTMLString: true, |
|
message: |
|
'<strong style="font-size:22px" >' + |
|
'该工艺包含的工序必须包含热处理检验工序' + |
|
'</strong>', |
|
showClose: true, |
|
duration: 7000, |
|
type: 'warning', |
|
}); |
|
} |
|
} |
|
|
|
// // penmark 喷码验证 |
|
if (dsCraftMold.inkjetPrinting == '1') { |
|
let flag = false; |
|
arr.forEach(item => { |
|
if (item.indexOf('喷码') !== -1) { |
|
flag = true; |
|
} |
|
}); |
|
if (!flag) { |
|
return this.$message({ |
|
dangerouslyUseHTMLString: true, |
|
message: |
|
'<strong style="font-size:22px" >' + |
|
'该工艺包含的工序必须包含喷码工序' + |
|
'</strong>', |
|
showClose: true, |
|
duration: 7000, |
|
type: 'warning', |
|
}); |
|
} |
|
} |
|
this.craftLoading = true; |
|
|
|
// 处理传参 |
|
if (this.treeNodes.rawData.qualityGradeCode) { |
|
let qualityInfo = this.rankList.find( |
|
item => item.code == this.treeNodes.rawData.qualityGradeCode |
|
); |
|
// this.treeNodes.rawData.qualityGradeName = qualityInfo.name; |
|
} |
|
let query_ = { |
|
dsPart: this.partInfoData, //零件信息 |
|
craft: this.treeNodes.rawData, //工艺信息 |
|
processList: this.form1.tableData1, //工序集合 |
|
processDeleteIds: this.form1.deleteIds, //删除ids |
|
}; |
|
|
|
authorizedAccomplish2(query_) |
|
.then(res => { |
|
this.$message.success('保存成功'); |
|
this.craftLoading = false; |
|
if (this.treeLeave == 1) { |
|
this.getDetails(); |
|
} |
|
|
|
this.updateTreeAfterSave(res.data.data); |
|
}) |
|
.catch(err => { |
|
this.craftLoading = false; |
|
}); |
|
} |
|
}); |
|
} |
|
if (this.activeName == '2') { |
|
this.$refs.tableForm2.validate((isValid, invalidFields) => { |
|
if (isValid) { |
|
// 🔍 新增:校验是否包含“耐蚀性检测” |
|
const hasCorrosionTest = this.form2.tableData2.some( |
|
item => |
|
item.projectName?.includes('耐蚀性检测') || |
|
(item.projectCode && |
|
this.projectOptions |
|
.find(p => p.id === item.projectCode) |
|
?.name?.includes('耐蚀性检测')) |
|
); |
|
|
|
// 如果父节点备注包含 'HTBY' 且未设置耐蚀性检测,则报错 |
|
if (this.parentData.rawData?.remarks?.includes('HTBY') && !hasCorrosionTest) { |
|
this.$message.error('备注包含 HTBY 时,检测项目必须包含耐蚀性检测!'); |
|
return; |
|
} |
|
this.craftLoading = true; |
|
let query_ = { |
|
processEntity: this.treeNodes.rawData.processInfo, //工序 |
|
processProjectEntityList: this.form2.tableData2, //项目 |
|
deleteIds: this.form2.deleteIds, //删除ids |
|
}; |
|
|
|
saveProcessProjectSave(query_).then(res => { |
|
this.$message.success('保存成功'); |
|
this.craftLoading = false; |
|
// ✅ 更新工序节点下的项目数据 |
|
if (this.treeLeave === 3) { |
|
this.treeNodes.rawData.projectList = this.form2.tableData2; |
|
this.updateTreeNodeProject(); |
|
this.refreshTableData(); // ✅ 刷新右侧表格 |
|
} |
|
}); |
|
} |
|
}); |
|
} |
|
if (this.activeName == '3') { |
|
this.$refs.tableForm3.validate((isValid, invalidFields) => { |
|
if (isValid) { |
|
this.craftLoading = true; |
|
let query_ = { |
|
processEntity: this.treeNodes.rawData.processInfo, //工序 |
|
processMeasuringToolEntities: this.form3.tableData3, //尺寸量具 |
|
deleteIds: this.form3.deleteIds, //删除ids |
|
}; |
|
saveProcessMeasuringTool(query_).then(res => { |
|
this.$message.success('保存成功'); |
|
this.craftLoading = false; |
|
// ✅ 更新工序节点下的量具数据 |
|
if (this.treeLeave === 3) { |
|
this.treeNodes.rawData.measuringToolList = this.form3.tableData3; |
|
this.updateTreeNodeProject(); |
|
this.refreshTableData(); // ✅ 刷新右侧表格 |
|
} |
|
}); |
|
} |
|
}); |
|
} |
|
if (this.activeName == '4') { |
|
this.$refs.tableForm4.validate((isValid, invalidFields) => { |
|
if (isValid) { |
|
this.craftLoading = true; |
|
let query_ = { |
|
processEntity: this.treeNodes.rawData.processInfo, //工序 |
|
processMoldToolEntities: this.form4.tableData4, //尺寸量具 |
|
deleteIds: this.form4.deleteIds, //删除ids |
|
}; |
|
saveProcessMoldTool(query_).then(res => { |
|
this.$message.success('保存成功'); |
|
this.craftLoading = false; |
|
// ✅ 更新工序节点下的工装数据 |
|
if (this.treeLeave === 3) { |
|
this.treeNodes.rawData.moldToolList = this.form4.tableData4; |
|
this.updateTreeNodeProject(); |
|
this.refreshTableData(); // ✅ 刷新右侧表格 |
|
} |
|
}); |
|
} |
|
}); |
|
} |
|
}, |
|
// ✅ 保存后更新树结构(不调用接口) |
|
updateTreeAfterSave(saveData) { |
|
// 1. 更新当前选中节点的 rawData |
|
if (this.treeLeave === 1 && saveData) { |
|
console.log('updateTreeAfterSave', this.treeNodes); |
|
// this.treeNodes.rawData = { ...this.treeNodes.rawData, ...saveData }; |
|
} |
|
if (this.treeLeave === 2 && saveData) { |
|
this.treeNodes.rawData = { ...this.treeNodes.rawData, ...saveData }; |
|
this.treeNodes.processList = this.form1.tableData1; |
|
} |
|
|
|
// 2. 更新 data 树形结构中对应的工艺节点 |
|
const updateTreeNode = nodes => { |
|
for (let node of nodes) { |
|
if (node.level === 2 && node.id === this.treeNodes.id) { |
|
// 更新工艺节点信息 |
|
if (saveData) { |
|
node.rawData = { ...node.rawData, ...saveData }; |
|
node.label = `${saveData.roamNo || '临时工艺'}-${saveData.craftNo || '工艺文件'}`; |
|
} |
|
|
|
// 更新工序子节点 |
|
node.processList = this.form1.tableData1; |
|
node.children = this.form1.tableData1.map(process => ({ |
|
id: process.id || `process_${Date.now()}_${Math.random()}`, |
|
label: process.processName || '未知工序', |
|
level: 3, |
|
rawData: { |
|
processInfo: process, |
|
projectList: process.processProjectList || [], |
|
measuringToolList: process.measuringToolList || [], |
|
moldToolList: process.moldToolList || [], |
|
}, |
|
children: (process.processProjectList || []).map(project => ({ |
|
id: project.id || `project_${Date.now()}_${Math.random()}`, |
|
label: project.projectName || '未知项目', |
|
level: 4, |
|
disabled: true, |
|
rawData: project, |
|
})), |
|
})); |
|
break; |
|
} |
|
if (node.children && node.children.length > 0) { |
|
updateTreeNode(node.children); |
|
} |
|
} |
|
}; |
|
|
|
updateTreeNode(this.data); |
|
|
|
// ✅ 3. 刷新右侧表格数据(从树结构同步) |
|
this.refreshTableData(); |
|
}, |
|
refreshTableData() { |
|
this.$nextTick(() => { |
|
if (this.treeLeave === 2) { |
|
// 工艺节点:刷新工序表格 |
|
this.form1.tableData1 = [...(this.treeNodes.processList || [])]; |
|
} else if (this.treeLeave === 3) { |
|
// 工序节点:刷新项目、量具、工装表格 |
|
const { projectList, measuringToolList, moldToolList } = this.treeNodes.rawData; |
|
this.form2.tableData2 = [...(projectList || [])]; |
|
this.form3.tableData3 = [...(measuringToolList || [])]; |
|
this.form4.tableData4 = [...(moldToolList || [])]; |
|
} |
|
}); |
|
}, |
|
// ✅ 更新工序节点下的项目数据 |
|
updateTreeNodeProject() { |
|
const updateTreeNode = nodes => { |
|
for (let node of nodes) { |
|
if (node.level === 3 && node.id === this.treeNodes.id) { |
|
node.rawData = { |
|
...node.rawData, |
|
projectList: this.form2.tableData2, |
|
measuringToolList: this.form3.tableData3, |
|
moldToolList: this.form4.tableData4, |
|
}; |
|
// 更新项目子节点 |
|
node.children = (this.form2.tableData2 || []).map(project => ({ |
|
id: project.id || `project_${Date.now()}_${Math.random()}`, |
|
label: project.projectName || '未知项目', |
|
level: 4, |
|
disabled: true, |
|
rawData: project, |
|
})); |
|
break; |
|
} |
|
if (node.children && node.children.length > 0) { |
|
updateTreeNode(node.children); |
|
} |
|
} |
|
}; |
|
|
|
updateTreeNode(this.data); |
|
|
|
// ✅ 刷新右侧表格 |
|
this.refreshTableData(); |
|
}, |
|
}, |
|
}; |
|
</script> |
|
<style lang="scss" scoped> |
|
.box-card { |
|
display: flex; |
|
flex-direction: row; |
|
height: calc(100vh - 200px); |
|
overflow: hidden; |
|
border: 1px solid #ccc; |
|
|
|
.process-left { |
|
width: 240px; |
|
min-width: 240px; |
|
height: 100%; |
|
overflow-y: auto; |
|
overflow-x: hidden; |
|
// border: 1px solid #ccc; |
|
background: #fff; |
|
border-right: 1px solid #ccc; |
|
|
|
.process-select { |
|
padding: 12px; |
|
background: #e4e7ed; |
|
position: sticky; |
|
top: 0; |
|
z-index: 10; |
|
border-bottom: 1px solid #dcdfe6; |
|
} |
|
|
|
&::-webkit-scrollbar { |
|
width: 6px; |
|
} |
|
|
|
&::-webkit-scrollbar-thumb { |
|
background-color: #c1c1c1; |
|
border-radius: 3px; |
|
|
|
&:hover { |
|
background-color: #a8a8a8; |
|
} |
|
} |
|
|
|
&::-webkit-scrollbar-track { |
|
background-color: #f1f1f1; |
|
} |
|
} |
|
|
|
:deep(.el-form-item) { |
|
margin-bottom: 0px !important; |
|
} |
|
|
|
.process-right { |
|
flex: 1; |
|
// height: 100%; |
|
overflow-y: auto; |
|
padding: 12px; |
|
// border: 1px solid #ccc; |
|
border-left: 0; |
|
background: #fff; |
|
|
|
.table-btn { |
|
width: 100%; |
|
height: 40px; |
|
display: flex; |
|
justify-content: space-between; |
|
align-items: center; |
|
|
|
.table-btn-left { |
|
display: flex; |
|
gap: 8px; |
|
} |
|
|
|
.table-btn-right { |
|
display: flex; |
|
gap: 8px; |
|
} |
|
} |
|
|
|
&::-webkit-scrollbar { |
|
width: 6px; |
|
} |
|
|
|
&::-webkit-scrollbar-thumb { |
|
background-color: #c1c1c1; |
|
border-radius: 3px; |
|
} |
|
|
|
&::-webkit-scrollbar-track { |
|
background-color: #f1f1f1; |
|
} |
|
} |
|
} |
|
|
|
:deep(.el-tree) { |
|
height: auto; |
|
padding: 0px 0; |
|
|
|
.el-tree-node__content { |
|
height: 26px; |
|
|
|
&:hover { |
|
// background-color: #f5f7fa; |
|
} |
|
} |
|
.el-tree-node__label { |
|
font-size: 14px; |
|
} |
|
} |
|
:deep(.el-tree-node.is-current > .el-tree-node__content) { |
|
background-color: rgba(40, 76, 135, 0.9) !important; |
|
|
|
.el-tree-node__label { |
|
color: #fff; |
|
} |
|
} |
|
:deep(.el-table__header th.el-table__cell) { |
|
height: 40px !important; |
|
min-height: 40px !important; |
|
line-height: 40px !important; |
|
padding: 0 10px !important; |
|
background-color: #f5f7fa; |
|
font-weight: 600; |
|
} |
|
|
|
:deep(.el-table__body td.el-table__cell) { |
|
height: 50px !important; |
|
min-height: 50px !important; |
|
line-height: 50px !important; |
|
padding: 0 10px !important; |
|
} |
|
|
|
:deep(.el-table .cell) { |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
} |
|
|
|
:deep(.el-table .el-form-item) { |
|
margin-bottom: 0 !important; |
|
height: 100%; |
|
display: flex; |
|
align-items: center; |
|
|
|
.el-input, |
|
.el-select { |
|
width: 100%; |
|
} |
|
} |
|
|
|
.custom-context-menu { |
|
position: fixed; |
|
z-index: 2000; |
|
background: #fff; |
|
border: 1px solid #ebeef5; |
|
border-radius: 4px; |
|
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
|
padding: 4px 0; |
|
} |
|
|
|
.context-menu .el-button { |
|
display: block; |
|
width: 100%; |
|
text-align: left; |
|
padding: 6px 12px; |
|
margin: 0; |
|
} |
|
:deep(.el-table thead) { |
|
height: 36px !important; /* 设置你想要的高度 */ |
|
line-height: 36px !important; |
|
} |
|
</style>
|
|
|