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.
 
 
 
 
 

6229 lines
216 KiB

<template>
<div class="white-body-view">
<el-form :inline="true" label-position="top" :model="searchData">
<el-form-item label="BU">
<el-input v-model="searchData.buNo" readonly style="width: 80px"></el-input>
</el-form-item>
<el-form-item label="产品编码">
<el-input v-model="searchData.partNo" readonly style="width: 120px"></el-input>
</el-form-item>
<el-form-item label="产品描述">
<el-input v-model="searchData.partDesc" readonly style="width: 300px"></el-input>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" @click="queryPartListInfo">选择物料</el-button>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" @click="updatePartModal">维护</el-button>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" @click="handleBatchUpdatePart">物料属性批量维护</el-button>
</el-form-item>
</el-form>
<el-table
:height="60"
:data="dataList"
border
v-loading="this.dataListLoading"
style="width: 100%;">
<el-table-column
v-for="(item,index) in columnList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed === ''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<div v-if="!item.columnHidden" @dblclick="startEditCell(scope.$index, item.columnProp, scope.row[item.columnProp])" style="min-height: 23px; cursor: pointer;" :title="editingCell.rowIndex === scope.$index && editingCell.columnProp === item.columnProp ? '' : '双击编辑,回车保存'">
<el-input
v-if="editingCell.rowIndex === scope.$index && editingCell.columnProp === item.columnProp"
v-model="editingCell.value"
size="small"
ref="editInput"
:disabled="editingCell.isSaving"
@keyup.enter.native="saveEditCell(scope.$index, item.columnProp, item.columnLabel)"
@keyup.esc.native="cancelEditCell"
style="width: 100%;">
</el-input>
<span v-else>{{ scope.row[item.columnProp] || '-' }}</span>
</div>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
</el-table>
<el-row :gutter="5">
<!-- 树形结构 -->
<el-col :span="7" :style="{height: this.height + 'px'}" style="display: block;overflow-y: scroll">
<el-card style="width: 99%">
<div slot="header" style="height: 20px;margin-top: -10px;text-align: center">
<el-button size="mini" type="primary" round style="margin-left: -5px" @click="addTree">新增节点</el-button>
<el-button size="mini" type="info" round @click="getNodeTree">刷新</el-button>
<el-button size="mini" type="primary" round :loading="buildAllLoading" @click="batchBuild" style="margin-left: 10px">批量Build</el-button>
<!-- <el-button size="mini" type="primary" round :loading="resetAllLoading" @click="resetNodePart">重置物料</el-button>-->
</div>
<div class="scroll-bar item">
<el-tree
id="my-tree"
class="tree-view structure-tree scroll-bar"
highlight-current
check-strictly
:data="treeData"
:default-expand-all=true
:props="defaultProps"
:expand-on-click-node=false
@node-click="handleNodeClick"
:auto-expand-parent=false>
<span slot-scope="{ node, data }" class="custom-tree-node">
<span class="tooltip">
<span class="add-f-s-14">{{ data.nodeName }}</span>
</span>
<div class="operation-view" style="display: inline-block; padding: 0px 5px; margin-left: 5px; color: #777777;">
<!-- <i style="color:#1c92e0" class="small-operation-btn el-icon-plus" @click="addTreeItem(data)"/>-->
<!-- <i style="color:#1c92e0" class="small-operation-btn el-icon-edit" @click="editTreeItem(data)"/>-->
<!-- <i style="color:#1c92e0" class="small-operation-btn el-icon-delete" @click="deleteTreeItem(data)"/>-->
<el-popover
placement="right"
width="80"
trigger="click">
<a style="cursor: pointer" @click="queryPartList2(data)">已有料号</a>
<el-divider></el-divider>
<a style="cursor: pointer" @click="addPartModal(data)">新增料号</a>
<el-divider></el-divider>
<a style="cursor: pointer" @click="editTreeItem(data)">修改节点</a>
<el-divider></el-divider>
<a style="cursor: pointer" @click="deleteTreeItem(data)">删除节点</a>
<i style="color:#1c92e0" slot="reference" class="small-operation-btn el-icon-more"/>
</el-popover>
</div>
</span>
</el-tree>
</div>
</el-card>
</el-col>
<!-- 数据 -->
<el-col :span="17" :style="{height: this.height + 'px'}" style="display: block;overflow-y: scroll">
<!-- 页签 -->
<el-tabs v-model="activeTable" :style="{height: this.height + 'px'}" style="width: 100%" type="border-card" @tab-click="refreshCurrentTabTable" class="customer-tab">
<!-- BOM页签 -->
<el-tab-pane label="产品BOM管理" name="bom_info">
<bom-create v-loading="bomLoading" ref="BomCreate" :batchUpdateFlag="batchUpdateFlag" @handleBatchUpdatePart="handleBatchUpdatePart" @refreshNode="refreshNode" @refreshBomLoading="refreshBomLoading" v-drag></bom-create>
</el-tab-pane>
<!-- Routing页签 -->
<el-tab-pane label="工艺路线管理" name="routing_info">
<routing-create v-loading="routingLoading" ref="RoutingCreate" :batchUpdateFlag="batchUpdateFlag" @refreshRoutingLoading="refreshRoutingLoading" v-drag></routing-create>
</el-tab-pane>
</el-tabs>
</el-col>
</el-row>
<!-- 节点新增模态框 -->
<el-dialog title="节点" :close-on-click-modal="false" v-drag :visible.sync="nodeModalFlag" width="360px">
<el-form :inline="true" label-position="top" :model="nodeData" :rules="nodeRules" style="margin-left: 7px;margin-top: -5px;">
<!-- <el-form-item label="节点编码" prop="nodeId" :rules="nodeRules.nodeId">-->
<!-- <el-input v-model="nodeData.nodeId" :disabled="nodeModalDisableFlag" style="width: 140px"></el-input>-->
<!-- </el-form-item>-->
<el-form-item label="节点名称" prop="nodeName" :rules="nodeRules.nodeName">
<el-input v-model="nodeData.nodeName" style="width: 320px"></el-input>
</el-form-item>
<el-form-item v-if="this.nodeData.flag === '1'" label="父节点" prop="pId" :rules="nodeRules.parentNodeName">
<el-popover
ref="nodeListPopover"
placement="bottom-start"
v-model="treeVisible"
onclick="treeVisible=true"
trigger="click">
<el-tree
id="my-tree"
node-key="nodeId"
class="tree-view structure-tree scroll-bar"
highlight-current
check-strictly
@current-change="nodeListTreeCurrentChangeHandle"
:data="treeData1"
:default-expand-all=true
:props="defaultProps"
:expand-on-click-node=false
:auto-expand-parent=false>
</el-tree>
</el-popover>
<el-input style="width: 140px;" v-model="nodeData.parentNodeName" v-popover:nodeListPopover :readonly="true" class="node-list__input"></el-input>
</el-form-item>
<el-form-item label="子节点" v-if="this.nodeData.flag === '1'" :rules="nodeRules.id">
<el-select v-model="nodeData.id" style="width: 100%;">
<el-option :label="item.nodeName" :value="item.id" v-for="item in childrenNodeList" :key="item.id"></el-option>
<el-option label="无" value="-1"></el-option>
</el-select>
</el-form-item>
</el-form>
<el-footer style="height:40px;margin-top: 10px;text-align:center">
<el-button type="primary" @click="saveNodeData()">保存</el-button>
<el-button type="primary" @click="nodeModalFlag = false">关闭</el-button>
</el-footer>
</el-dialog>
<!-- 物料模态框 -->
<el-dialog title="物料清单" :close-on-click-modal="false" v-drag :visible.sync="partModelFlag" width="900px">
<div class="rq">
<el-form :inline="true" label-position="top" :model="partData">
<el-form-item :label="'物料编码'">
<el-input v-model="partData.partNo" clearable style="width: 120px"></el-input>
</el-form-item>
<el-form-item :label="'物料名称'">
<el-input v-model="partData.partDesc" clearable style="width: 120px"></el-input>
</el-form-item>
<el-form-item :label="' '">
<el-button type="primary" @click="queryPartList">查询</el-button>
</el-form-item>
</el-form>
<el-table
:height="300"
:data="partList"
@row-dblclick="getRowData"
border
style="width: 100%;">
<el-table-column
v-for="(item,index) in partColumnList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
</el-table>
<!-- 分页插件 -->
<el-pagination
@size-change="sizeChangeHandle2"
@current-change="currentChangeHandle2"
:current-page="pageIndex2"
:page-sizes="[20, 50, 100, 200, 500]"
:page-size="pageSize2"
:total="totalPage2"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
</div>
<el-footer style="height:40px;margin-top: 20px;text-align:center">
<el-button type="primary" @click="partModelFlag=false">关闭</el-button>
</el-footer>
</el-dialog>
<!-- 物料属性批量维护模态框-->
<el-dialog title="物料属性批量维护" :close-on-click-modal="false" v-drag
:visible.sync="batchUpdateFlag"
width="90vw"
:before-close="handleBatchUpdateDialogClose">
<div class="rq" slot-scope="scope">
<div style="display: flex; align-items: center; justify-content: space-between;">
<div style="display: flex; gap: 10px;">
<el-button style="height: 20px" type="primary" @click="handleCopy">copy</el-button>
<el-button style="height: 20px" type="primary" @click="handleEditInfo">{{ attributeFlag ? '编辑' : '保存' }}</el-button>
</div>
<el-form label-position="top" inline style="margin-right: -10px;margin-top: -20px">
<el-form-item label="属性模板">
<el-select v-model="searchData.codeNo" placeholder="请选择" @change="handleCodeNoChange" style="width: 235px">
<el-option
v-for="option in codeList"
:key="option.fieldname1"
:label="option.caption1"
:value="option.fieldname1">
</el-option>
</el-select>
</el-form-item>
</el-form>
</div>
<el-table
v-show="attributeFlag"
@row-click="partClickRow"
:row-style="rowStyle"
:height="300"
:header-cell-style="{padding: '2px 2px'}"
:data="partList1"
border
style="width: 100%;">
<el-table-column
header-align="center"
align="center"
width="150"
fixed="left"
label="操作">
<template slot-scope="scope">
<div class="operation-view" style="display: inline-block; padding: 0px 5px; margin-left: 5px; color: #777777;">
<el-popover
placement="right"
width="80"
trigger="click">
<a style="cursor: pointer" @click="queryPartList2(scope.row)">已有料号</a>
<!-- <el-divider></el-divider>
<a style="cursor: pointer" @click="addPartModal(scope.row)">新增料号</a>-->
<i style="color:#1c92e0" slot="reference" class="small-operation-btn el-icon-more"/>
</el-popover>
</div>
</template>
</el-table-column>
<el-table-column
v-for="(item,index) in partColumnList1" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden">
<span v-if="item.columnProp==='partType2'">
<span v-if="scope.row.partType2==='Manufactured'">
成品
</span>
<span v-if="scope.row.partType2==='Manufactured Recipe'">
半成品
</span>
<span v-if="scope.row.partType2==='Purchased (raw)'">
原材料
</span>
</span>
<span v-if="item.columnProp!=='partType2'">
{{scope.row[item.columnProp]}}
</span>
</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
</el-table>
<el-table
v-show="!attributeFlag"
:height="300"
@row-click="partClickRow"
:row-style="rowStyle"
:header-cell-style="{padding: '2px 2px'}"
:data="partList1"
border
style="width: 100%;">
<el-table-column
header-align="center"
align="center"
width="150"
fixed="left"
label="操作">
<template slot-scope="scope">
<div class="operation-view" style="display: inline-block; padding: 0px 5px; margin-left: 5px; color: #777777;">
<el-popover
placement="right"
width="80"
trigger="click">
<a style="cursor: pointer" @click="queryPartList2(scope.row)">已有料号</a>
<i style="color:#1c92e0" slot="reference" class="small-operation-btn el-icon-more"/>
</el-popover>
</div>
</template>
</el-table-column>
<el-table-column
v-for="(item,index) in partColumnList2" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-show="!item.columnHidden">
<span v-if="item.columnProp==='partNo'||item.columnProp==='nodeName'">{{scope.row[item.columnProp]}}</span>
<span v-if="item.columnProp==='buNo'">
<el-select v-model="scope.row.buNo" v-show="!scope.row.partNo||scope.row.partNo===''" clearable @change="changeBuOfNode(scope.row)" placeholder="请选择">
<el-option
v-for = "i in userBuList"
:key = "i.buNo.split('_')[1]"
:label = "i.buNo.split('_')[1]"
:value = "i.buNo.split('_')[1]">
</el-option>
</el-select>
<span v-if="scope.row.partNo&&scope.row.partNo!==''">{{scope.row[item.columnProp]}}</span>
</span>
<span v-if="item.columnProp==='partDesc'">
<el-input v-model="scope.row.partDesc" clearable></el-input>
</span>
<span v-if="item.columnProp==='tempNo'">
<el-select :loading="buNoQueryLoading" v-model="scope.row.tempNo" clearable @change="chooseTemplate(scope.row)">
<el-option
v-for="option in scope.row.tempList"
:key="option.templateNo"
:label="option.templateName"
:value="option.templateNo">
</el-option>
</el-select>
</span>
<span v-if="item.columnProp==='engChgLevel'">
<el-select :loading="buNoQueryLoading" v-model="scope.row.engChgLevel" clearable>
<el-option
v-for="option in scope.row.engChgLevelList"
:key="option"
:label="option"
:value="option">
</el-option>
</el-select>
</span>
<span v-if="item.columnProp==='routingRevision'">
<el-select :loading="buNoQueryLoading" v-model="scope.row.routingRevision" clearable>
<el-option
v-for="option in scope.row.routingRevisionList"
:key="option"
:label="option"
:value="option">
</el-option>
</el-select>
</span>
<span v-if="item.columnProp==='codeDesc'">
<el-select v-model="scope.row.codeNo" placeholder="请选择" clearable style="width: 200px">
<el-option :loading="buNoQueryLoading"
v-for="option in scope.row.codeList"
:key="option.fieldname1"
:label="option.caption1"
:value="option.fieldname1">
</el-option>
</el-select>
</span>
<span v-if="item.columnProp==='partType2'">
<el-select v-model="scope.row.partType2" clearable>
<el-option label="成品" value="Manufactured"></el-option>
<el-option label="半成品" value="Manufactured Recipe"></el-option>
<el-option label="原材料" value="Purchased (raw)"></el-option>
</el-select>
</span>
<span v-if="item.columnProp==='umName'">
<el-select
v-model="scope.row.umId2" clearable>
<el-option
v-for="option in scope.row.umList"
:key="option.fieldname1"
:label="option.caption1"
:value="option.fieldname1">
</el-option>
</el-select>
</span>
<span v-if="item.columnProp==='familyName'">
<el-select :loading="buNoQueryLoading"
v-model="scope.row.familyID" clearable>
<el-option
v-for="option in scope.row.partFamilyList"
:key="option.fieldname1"
:label="option.caption1"
:value="option.fieldname1">
</el-option>
</el-select>
</span>
<span v-if="item.columnProp==='productGroupName1'">
<el-select :loading="buNoQueryLoading"
v-model="scope.row.productGroupId1" clearable>
<el-option
v-for="option in scope.row.partProductGroupList1"
:key="option.fieldname1"
:label="option.caption1"
:value="option.fieldname1">
</el-option>
</el-select>
</span>
<span v-if="item.columnProp==='productGroupName2'">
<el-select :loading="buNoQueryLoading"
v-model="scope.row.productGroupId2" clearable>
<el-option
v-for="option in scope.row.partProductGroupList2"
:key="option.fieldname1"
:label="option.caption1"
:value="option.fieldname1">
</el-option>
</el-select>
</span>
<span v-if="item.columnProp==='productGroupName3'">
<el-select :loading="buNoQueryLoading"
v-model="scope.row.productGroupId3" clearable>
<el-option
v-for="option in scope.row.partProductGroupList3"
:key="option.fieldname1"
:label="option.caption1"
:value="option.fieldname1">
</el-option>
</el-select>
</span>
<span v-if="item.columnProp==='templateName'">
<el-select :loading="buNoQueryLoading"
v-model="scope.row.templateNo" clearable>
<el-option
v-for="option in scope.row.templateList"
:key="option.fieldname1"
:label="option.caption1"
:value="option.fieldname1">
</el-option>
</el-select>
</span>
<span v-if="item.columnProp==='remark'">
<el-input
type="textarea"
:autosize="{ minRows: 1}"
v-model="scope.row.remark">
</el-input>
</span>
</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
</el-table>
<el-tabs v-model="inventoryPartTable" style="width: 100%;height: 400px;" :before-leave="tabLeave" @tab-click="tabClick" type="border-card">
<el-tab-pane label="新增物料属性" style="margin-top: -10px" name="part_item">
<el-form label-position="top" style="margin-left: 2px;">
<el-button type="primary" @click="addOrDelItem1">新增</el-button>
<el-button type="primary" :loading="loading" @click="clickSave1">{{ attributeFlag1?'编辑':'保存' }}</el-button>
<el-button type="primary" @click="openPtmDialog">ProcessTimeMatrix</el-button>
</el-form>
<div class="rq " v-show="attributeFlag1">
<el-table
:data="partItemList1"
height="340px"
border
:header-cell-style="{padding: '2px 2px'}"
style="width: 100%;">
<el-table-column
v-for="(item,index) in columnItemList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<div v-if="item.columnProp !== 'textValue' && item.columnProp !== 'numValue'">
<span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</div>
<div v-else>
<template v-if="item.columnProp==='textValue' && scope.row.valueTypeDb==='T'">
{{ scope.row['textValue'] }}
</template>
<template v-else-if="item.columnProp==='textValue' && scope.row.valueTypeDb==='N'">
{{ scope.row['numValue'] }}
</template>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="rq " v-show="!attributeFlag1">
<el-table
:data="partItemList1"
height="340px"
border
:header-cell-style="{padding: '2px 2px'}"
style="width: 100%">
<el-table-column
v-for="(item,index) in columnItemList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed===''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<div v-if="item.columnProp !== 'textValue' && item.columnProp !== 'numValue'">
<span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</div>
<div v-else>
<div v-if="scope.row.valueChooseFlag !== 'Y'">
<el-input-number v-model="scope.row.numValue" style="padding: 0;width: 100%" v-if="scope.row.valueTypeDb === 'N'" :controls="false"></el-input-number>
<el-input v-model="scope.row.textValue" v-else></el-input>
</div>
<div v-else>
<el-select style="width: 100%;" clearable v-if="scope.row.valueTypeDb === 'T'" v-model="scope.row.textValue">
<el-option :value="i.availableValue" :label="i.availableValue" v-for="(i,key) in scope.row.availableValueList" :key="key"></el-option>
</el-select>
<el-select style="width: 100%;" clearable v-else v-model="scope.row.numValue">
<el-option :value="i.availableValue" :label="i.availableValue" v-for="(i,key) in scope.row.availableValueList" :key="key"></el-option>
</el-select>
</div>
</div>
</template>
</el-table-column>
</el-table>
</div>
</el-tab-pane>
<el-tab-pane label="已有物料属性" style="margin-top: -10px" name="part_item1">
<el-form label-position="top" style="margin-left: 2px;">
<el-button type="primary" @click="addOrDelItem">新增</el-button>
<el-button type="primary" :loading="loading" @click="clickSave">{{ attributeFlag1?'编辑':'保存' }}</el-button>
</el-form>
<div class="rq " v-show="attributeFlag1">
<el-table
:data="partItemList"
height="340px"
border
:header-cell-style="{padding: '2px 2px'}"
style="width: 100%;">
<el-table-column
v-for="(item,index) in columnItemList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<div v-if="item.columnProp !== 'textValue' && item.columnProp !== 'numValue'">
<span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</div>
<div v-else>
<template v-if="item.columnProp==='textValue' && scope.row.valueTypeDb==='T'">
{{ scope.row['textValue'] }}
</template>
<template v-else-if="item.columnProp==='textValue' && scope.row.valueTypeDb==='N'">
{{ scope.row['numValue'] }}
</template>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="rq " v-show="!attributeFlag1">
<el-table
:data="partItemList"
height="340px"
border
:header-cell-style="{padding: '2px 2px'}"
style="width: 100%">
<el-table-column
v-for="(item,index) in columnItemList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed===''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<div v-if="item.columnProp !== 'textValue' && item.columnProp !== 'numValue'">
<span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</div>
<div v-else>
<div v-if="scope.row.valueChooseFlag !== 'Y'">
<el-input-number v-model="scope.row.numValue" style="padding: 0;width: 100%" v-if="scope.row.valueTypeDb === 'N'" :controls="false"></el-input-number>
<el-input v-model="scope.row.textValue" v-else></el-input>
</div>
<div v-else>
<el-select style="width: 100%;" v-if="scope.row.valueTypeDb === 'T'" v-model="scope.row.textValue">
<el-option :value="i.availableValue" :label="i.availableValue" v-for="(i,key) in scope.row.availableValueList" :key="key"></el-option>
</el-select>
<el-select style="width: 100%;" v-else v-model="scope.row.numValue">
<el-option :value="i.availableValue" :label="i.availableValue" v-for="(i,key) in scope.row.availableValueList" :key="key"></el-option>
</el-select>
</div>
</div>
</template>
</el-table-column>
</el-table>
</div>
</el-tab-pane>
<el-tab-pane label="版本信息" style="margin-top: -10px" name="revision_info">
<el-row>
<el-col :style="{width: 25 + 'vw',height: 340 + 'px'}" class="down-tree">
<el-tabs v-model="activeTab1" style="width: 100%;height: 170px; margin-top: -5px" @tab-click="bomInfoTabClick">
<el-tab-pane label="产品结构版本" name="default">
<el-table
:height="120"
:data="bomComponentList"
border
:header-cell-style="{padding: '2px 2px'}"
:row-style="bomRowStyle"
@row-click="bomInfoRowClick"
@row-dblclick="bomInfoRowDblClick"
style="width: 100%">
<el-table-column
header-align="center"
align="center"
width="80"
fixed="left"
label="操作">
<template slot-scope="scope">
<div class="operation-view" style="display: inline-block; padding: 0px 5px; margin-left: 5px; color: #777777;">
<a href="javascript:void(0)" @click="updateRevision(scope.row, 'bom')">
选择版本
</a>
</div>
</template>
</el-table-column>
<el-table-column
v-for="(item,index) in bomComponentListColumns" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
<el-tabs v-model="activeTab2" style="width: 100%;height: 165px;" @tab-click="routingInfoTabClick">
<el-tab-pane label="工艺路线版本" name="default">
<el-table
:height="120"
:data="routingComponentList"
border
:header-cell-style="{padding: '2px 2px'}"
:row-style="routingRowStyle"
@row-click="routingInfoRowClick"
@row-dblclick="routingInfoRowDblClick"
style="width: 100%">
<el-table-column
header-align="center"
align="center"
width="80"
fixed="left"
label="操作">
<template slot-scope="scope">
<div class="operation-view" style="display: inline-block; padding: 0px 5px; margin-left: 5px; color: #777777;">
<a href="javascript:void(0)" @click="updateRevision(scope.row, 'bom')">
选择版本
</a>
</div>
</template>
</el-table-column>
<el-table-column
v-for="(item,index) in routingComponentListColumns" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
</el-col>
<el-col :style="{width: 60 + 'vw',height: 340 + 'px'}">
<el-table
v-if="bomFlag"
:height="340"
:data="bomComponentPartList"
border
:header-cell-style="{padding: '2px 2px'}"
style="width: 100%">
<el-table-column
v-for="(item,index) in bomComponentListColumnList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden"> {{ scope.row[item.columnProp] }}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
</el-table>
<el-table
v-if="!bomFlag"
:height="340"
:data="routingComponentPartList"
border
:header-cell-style="{padding: '2px 2px'}"
style="width: 100%">
<el-table-column
v-for="(item,index) in routingComponentListColumnList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden"> {{ scope.row[item.columnProp] }}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
</el-tab-pane>
</el-tabs>
<el-footer style="height:40px;margin-top: 20px;text-align:center">
<el-button type="primary" @click="handleBatchUpdateDialogClose">关闭</el-button>
</el-footer>
</div>
</el-dialog>
<el-dialog title="新增" :close-on-click-modal="false" v-drag :visible.sync="fastAddFlag" width="1000px">
<div style="font-size: 12px">
<el-form :inline="true" label-position="top" :model="itemData">
<el-form-item :label="'属性编码'">
<el-input v-model="itemData.propertiesItemNo" clearable style="width: 120px"></el-input>
</el-form-item>
<el-form-item :label="'属性名称'">
<el-input v-model="itemData.itemDesc" clearable style="width: 150px"></el-input>
</el-form-item>
<el-form-item :label="' '">
<el-button type="primary" @click="queryPartItem()">查询</el-button>
</el-form-item>
</el-form>
</div>
<el-container style="margin-top: 0px;">
<el-main style="width: 350px;padding: 1px">
<span style="font-size: 12px" >可选属性</span>
<el-table
height="400px"
:data="itemList1"
border
ref="itemTable1"
@row-click="itemClickRow1"
@selection-change="selectionItem1"
highlight-current-row
style="width: 100%">
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<el-table-column
prop="itNo"
header-align="center"
align="center"
min-width="80"
label="属性编码">
</el-table-column>
<el-table-column
prop="itemDesc"
header-align="center"
align="center"
min-width="200"
label="属性名称">
</el-table-column>
</el-table>
</el-main>
<el-main style="width: 10px;padding: 1px">
<div style="margin-top: 200px;margin-left: 18px">
<el-button type="primary" :loading="addItemLoading" @click="addItem()">添加>></el-button>
</div>
<div style="margin-top: 15px;margin-left: 18px">
<el-button type="primary" :loading="deleteItemLoading" @click="deleteItem()">删除<<</el-button>
</div>
</el-main>
<el-main style="width: 350px;padding: 1px">
<span style="font-size: 12px" >已有属性</span>
<el-table
height="400px"
:data="itemList2"
border
ref="itemTable2"
@row-click="itemClickRow2"
@selection-change="selectionItem2"
highlight-current-row
style="width: 100%">
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<el-table-column
prop="itNo"
header-align="center"
align="center"
min-width="80"
label="属性编码">
</el-table-column>
<el-table-column
prop="itemDesc"
header-align="center"
align="center"
min-width="200"
label="属性名称">
</el-table-column>
</el-table>
</el-main>
</el-container>
<el-footer style="height:40px;margin-top: 20px;text-align:center">
<el-button type="primary" @click="fastAddFlag = false">关闭</el-button>
</el-footer>
</el-dialog>
<el-dialog title="新增" :close-on-click-modal="false" v-drag :visible.sync="fastAddFlag1" width="1000px">
<div style="font-size: 12px">
<el-form :inline="true" label-position="top" :model="itemData">
<el-form-item :label="'属性编码'">
<el-input v-model="itemData.propertiesItemNo" clearable style="width: 120px"></el-input>
</el-form-item>
<el-form-item :label="'属性名称'">
<el-input v-model="itemData.itemDesc" clearable style="width: 150px"></el-input>
</el-form-item>
<el-form-item :label="' '">
<el-button type="primary" @click="queryPartItem()">查询</el-button>
</el-form-item>
</el-form>
</div>
<el-container style="margin-top: 0px;">
<el-main style="width: 350px;padding: 1px">
<span style="font-size: 12px" >可选属性</span>
<el-table
height="400px"
:data="itemList1"
border
ref="itemTable1"
@row-click="itemClickRow1"
@selection-change="selectionItem1"
highlight-current-row
style="width: 100%">
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<el-table-column
prop="itNo"
header-align="center"
align="center"
min-width="80"
label="属性编码">
</el-table-column>
<el-table-column
prop="itemDesc"
header-align="center"
align="center"
min-width="200"
label="属性名称">
</el-table-column>
</el-table>
</el-main>
<el-main style="width: 10px;padding: 1px">
<div style="margin-top: 200px;margin-left: 18px">
<el-button type="primary" :loading="addItemLoading" @click="addItem1()">添加>></el-button>
</div>
<div style="margin-top: 15px;margin-left: 18px">
<el-button type="primary" :loading="deleteItemLoading" @click="deleteItem1()">删除<<</el-button>
</div>
</el-main>
<el-main style="width: 350px;padding: 1px">
<span style="font-size: 12px" >已有属性</span>
<el-table
height="400px"
:data="itemList2"
border
ref="itemTable2"
@row-click="itemClickRow2"
@selection-change="selectionItem2"
highlight-current-row
style="width: 100%">
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<el-table-column
prop="itNo"
header-align="center"
align="center"
min-width="80"
label="属性编码">
</el-table-column>
<el-table-column
prop="itemDesc"
header-align="center"
align="center"
min-width="200"
label="属性名称">
</el-table-column>
</el-table>
</el-main>
</el-container>
<el-footer style="height:40px;margin-top: 20px;text-align:center">
<el-button type="primary" @click="fastAddFlag1 = false">关闭</el-button>
</el-footer>
</el-dialog>
<el-dialog :close-on-click-modal="false" v-drag :visible.sync="copyVisible" width="90vw">
<div class="rq">
<div style="display: flex; justify-content: space-between;">
<fieldset style="width: 31vw">
<legend v-if="partCurrentRow.partNo&&partCurrentRow.partNo!==''">目标物料</legend>
<legend v-else>新物料</legend>
<el-form :inline="true" label-position="top" :model="copyData" :rules="rules" ref="copyForm">
<el-form-item :label="'BU'" prop="buNo">
<el-select v-model="copyData.buNo" placeholder="请选择" @change="userBuList = userBuList.filter(item => item.buNo!=='')" style="width: 7.5vw">
<el-option
v-for = "i in userBuList"
:key = "i.buNo.split('_')[1]"
:label = "i.buNo.split('_')[1]"
:value = "i.buNo.split('_')[1]">
</el-option>
</el-select>
</el-form-item>
<el-form-item :label="'物料编码'">
<el-input v-model="copyData.partNo" disabled style="width: 8vw"></el-input>
</el-form-item>
<el-form-item :label="'物料描述'" prop="partDesc">
<el-input v-model="copyData.partDesc" clearable style="width: 10vw"></el-input>
</el-form-item>
<el-form-item label="制造类型" v-if="copyData.bomFlag==='Y'" prop="bomType">
<el-select v-model="copyData.bomType" style="width: 5vw">
<el-option label="Manufacturing" value="Manufacturing"></el-option>
<el-option label="Repair" value="Repair"></el-option>
<el-option label="Purchase" value="Purchase"></el-option>
<el-option label="Prototype" value="Prototype"></el-option>
</el-select>
</el-form-item>
<el-form-item label="工艺类型" v-if="copyData.routingFlag==='Y'" prop="routingType">
<el-select v-model="copyData.routingType" style="width: 5vw">
<el-option label="Manufacturing" value="Manufacturing"></el-option>
<el-option label="Repair" value="Repair"></el-option>
<el-option label="Prototype" value="Prototype"></el-option>
</el-select>
</el-form-item>
<el-form-item label="生效日期" v-if="copyData.routingFlag==='Y'||copyData.bomFlag==='Y'" prop="effPhaseInDate">
<el-date-picker style="width: 7vw" v-model="copyData.effPhaseInDate" clearable type="date" value-format="yyyy-MM-dd" placeholder="选择日期"></el-date-picker>
</el-form-item>
<el-form-item label="失效日期" v-if="copyData.routingFlag==='Y'||copyData.bomFlag==='Y'">
<el-date-picker style="width: 7vw" v-model="copyData.effPhaseOutDate" clearable type="date" value-format="yyyy-MM-dd" placeholder="选择日期"></el-date-picker>
</el-form-item>
</el-form>
</fieldset>
<fieldset style="width: 57vw">
<legend>被复制的物料</legend>
<el-form :inline="true" label-position="top" :model="copyData">
<el-form-item>
<span slot="label" @click="queryCopyPartModal"><a herf="#">物料编码</a></span>
<el-input v-model="copyData.previousVersion.partNo" disabled style="width: 10vw"></el-input>
</el-form-item>
<el-form-item label="物料描述">
<el-input v-model="copyData.previousVersion.partDesc" disabled style="width: 14vw"></el-input>
</el-form-item>
<el-form-item label="零件类型">
<el-input v-model="copyData.previousVersion.partType2Desc" disabled style="width: 5vw"></el-input>
</el-form-item>
<el-form-item label="计量单位">
<el-input v-model="copyData.previousVersion.umName" disabled style="width: 5vw"></el-input>
</el-form-item>
<el-form-item label="商品组1">
<el-input v-model="copyData.previousVersion.productGroupName1" disabled style="width: 12vw"></el-input>
</el-form-item>
<el-form-item label="商品组2">
<el-input v-model="copyData.previousVersion.productGroupName2" disabled style="width: 12vw"></el-input>
</el-form-item>
<el-form-item label="BOM版本号">
<el-input v-model="copyData.previousVersion.engChgLevel" disabled style="width: 5vw"></el-input>
</el-form-item>
<el-form-item label="Routing版本号">
<el-input v-model="copyData.previousVersion.routingRevision" disabled style="width: 5vw"></el-input>
</el-form-item>
<el-form-item :label="' '">
<el-checkbox v-model="copyData.bomFlag" true-label="Y" false-label="N" style="margin-left: 8vw">复制BOM</el-checkbox>
<el-checkbox v-model="copyData.routingFlag" true-label="Y" false-label="N">复制Routing</el-checkbox>
</el-form-item>
</el-form>
</fieldset>
</div>
<fieldset>
<legend>版本信息</legend>
<el-row>
<el-col :style="{width: 25 + 'vw',height: 340 + 'px'}" class="down-tree">
<el-tabs v-model="activeTab1" style="width: 100%;height: 170px; margin-top: -5px" @tab-click="bomInfoTabClick1">
<el-tab-pane label="产品结构版本" name="default">
<el-table
:height="120"
:data="bomComponentList1"
border
:header-cell-style="{padding: '2px 2px'}"
:row-style="bomRowStyle1"
@row-click="bomInfoRowClick1"
@row-dblclick="bomInfoRowDblClick1"
style="width: 100%">
<el-table-column
header-align="center"
align="center"
width="80"
fixed="left"
label="操作">
<template slot-scope="scope">
<div class="operation-view" style="display: inline-block; padding: 0px 5px; margin-left: 5px; color: #777777;">
<a href="javascript:void(0)" @click="bomInfoRowDblClick1(scope.row)">
选择版本
</a>
</div>
</template>
</el-table-column>
<el-table-column
v-for="(item,index) in bomComponentListColumns" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
<el-tabs v-model="activeTab2" style="width: 100%;height: 165px;" @tab-click="routingInfoTabClick1">
<el-tab-pane label="工艺路线版本" name="default">
<el-table
:height="120"
:data="routingComponentList1"
border
:header-cell-style="{padding: '2px 2px'}"
:row-style="routingRowStyle1"
@row-click="routingInfoRowClick1"
@row-dblclick="routingInfoRowDblClick1"
style="width: 100%">
<el-table-column
header-align="center"
align="center"
width="80"
fixed="left"
label="操作">
<template slot-scope="scope">
<div class="operation-view" style="display: inline-block; padding: 0px 5px; margin-left: 5px; color: #777777;">
<a href="javascript:void(0)" @click="routingInfoRowDblClick1(scope.row)">
选择版本
</a>
</div>
</template>
</el-table-column>
<el-table-column
v-for="(item,index) in routingComponentListColumns" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
</el-col>
<el-col :style="{width: 56 + 'vw',height: 340 + 'px'}">
<el-table
v-if="bomFlag1"
:height="340"
:data="bomComponentPartList1"
border
:header-cell-style="{padding: '2px 2px'}"
style="width: 100%">
<el-table-column
v-for="(item,index) in bomComponentListColumnList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden"> {{ scope.row[item.columnProp] }}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
</el-table>
<el-table
v-if="!bomFlag1"
:height="340"
:data="routingComponentPartList1"
border
:header-cell-style="{padding: '2px 2px'}"
style="width: 100%">
<el-table-column
v-for="(item,index) in routingComponentListColumnList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden"> {{ scope.row[item.columnProp] }}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
</fieldset>
</div>
<el-footer style="height:40px;margin-top: 20px;text-align:center">
<el-button type="primary" @click="copySave">保存</el-button>
<el-button type="primary" @click="copyVisible=false">关闭</el-button>
</el-footer>
</el-dialog>
<!-- copy物料模态框 -->
<el-dialog title="物料清单" top="17vh" :close-on-click-modal="false" v-drag :visible.sync="copyPartModelFlag" width="700px">
<el-form :inline="true" label-position="top" :model="copyData.previousVersion">
<el-form-item :label="'物料编码'">
<el-input v-model="copyModalData.partNo" clearable style="width: 120px"></el-input>
</el-form-item>
<el-form-item :label="'物料名称'">
<el-input v-model="copyModalData.partDesc" clearable style="width: 120px"></el-input>
</el-form-item>
<el-form-item :label="' '">
<el-button type="primary" @click="queryCopyPartModal">查询</el-button>
</el-form-item>
</el-form>
<el-table
:height="250"
:data="copyPartList"
@row-dblclick="getCopyRowData"
border
style="width: 100%;">
<el-table-column
v-for="(item,index) in componentPartColumnList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
</el-table>
<!-- 分页插件 -->
<el-pagination
@size-change="sizeChangeHandle4"
@current-change="currentChangeHandle4"
:current-page="pageIndex4"
:page-sizes="[20, 50, 100, 200, 500]"
:page-size="pageSize4"
:total="totalPage4"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<el-footer style="height:35px;margin-top:10px;text-align:center">
<el-button type="primary" @click="copyPartModelFlag = false">关闭</el-button>
</el-footer>
</el-dialog>
<el-dialog :title="'修改属性'" :close-on-click-modal="false" v-drag :visible.sync="itemUpdateFlag" width="1100px">
<el-table
:data="partItemList1"
border
:header-cell-style="{padding: '2px 2px'}"
style="width: 100%">
<el-table-column
v-for="(item,index) in columnItemList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed===''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<div v-if="item.columnProp !== 'textValue' && item.columnProp !== 'numValue'">
<span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</div>
<div v-else>
<div v-if="scope.row.valueChooseFlag !== 'Y'">
<el-input-number v-model="scope.row.numValue" style="padding: 0;width: 100%" v-if="scope.row.valueTypeDb === 'N'" :controls="false"></el-input-number>
<el-input v-model="scope.row.textValue" v-else></el-input>
</div>
<div v-else>
<el-select style="width: 100%;" clearable v-if="scope.row.valueTypeDb === 'T'" v-model="scope.row.textValue">
<el-option :value="i.availableValue" :label="i.availableValue" v-for="(i,key) in scope.row.availableValueList" :key="key"></el-option>
</el-select>
<el-select style="width: 100%;" clearable v-else v-model="scope.row.numValue">
<el-option :value="i.availableValue" :label="i.availableValue" v-for="(i,key) in scope.row.availableValueList" :key="key"></el-option>
</el-select>
</div>
</div>
</template>
</el-table-column>
</el-table>
<el-footer style="height:40px;margin-top: 10px;text-align:center">
<el-button type="primary" @click="itemUpdateSave">保存</el-button>
<el-button type="primary" @click="itemUpdateFlag = false">关闭</el-button>
</el-footer>
</el-dialog>
<!-- PTM参数选择对话框 -->
<el-dialog
title="选择ProcessTimeMatrix参数"
:close-on-click-modal="false"
v-drag
:visible.sync="ptmDialogVisible"
width="95%"
top="3vh">
<div class="rq">
<el-form :inline="true" label-position="top" style="margin-bottom: 10px">
<el-form-item label="商品组1">
<el-select
v-model="ptmSelectedProductGroupId"
placeholder="请选择商品组1"
clearable
filterable
style="width: 300px"
@change="handleProductGroupChange">
<el-option
v-for="item in ptmProductGroupList"
:key="item.productGroupId"
:label="item.productGroupName"
:value="item.productGroupId">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="Code筛选">
<el-input v-model="ptmSearchCode" placeholder="请输入条件描述" clearable style="width: 260px" @keyup.enter.native="filterPtmList"></el-input>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" @click="filterPtmList">筛选</el-button>
<el-button @click="resetPtmFilter">重置</el-button>
</el-form-item>
<el-form-item label=" " style="float: right">
<span style="color: #67C23A; font-size: 13px;">
💡 提示:双击某一行直接添加该ProcessTimeMatrix的参数
</span>
</el-form-item>
</el-form>
<el-table
ref="ptmTable"
:data="filteredPtmDataList"
:height="520"
border
@row-dblclick="handlePtmRowDoubleClick"
highlight-current-row
:header-cell-style="{padding: '2px 2px', fontSize: '12px'}"
:cell-style="{padding: '2px 2px', fontSize: '11px', cursor: 'pointer'}"
style="width: 100%;">
<el-table-column
type="index"
label="序号"
width="60"
align="center"
fixed="left">
</el-table-column>
<el-table-column
prop="conditionDesc"
label="Code"
width="300"
header-align="center"
align="left"
fixed="left">
</el-table-column>
<el-table-column
v-for="(col, index) in ptmColumnList"
:key="index"
:prop="col.prop"
:label="col.label"
:min-width="col.width || 100"
header-align="center"
:align="col.align || 'center'"
show-overflow-tooltip>
<template slot-scope="scope">
<span>{{ scope.row[col.prop] || '-' }}</span>
</template>
</el-table-column>
</el-table>
</div>
<el-footer style="height:40px;margin-top: 20px;text-align:center">
<el-button type="primary" @click="ptmDialogVisible=false">关闭</el-button>
</el-footer>
</el-dialog>
<!-- 新增物料 -->
<part-create :init-data="searchData" ref="PartCreate" @update-part-item="getPartItem" @refreshPageTables="getBomInfo" @refreshPageTables2="getInfoByBomTemplate" v-drag></part-create>
<!-- chooseList模态框 -->
<ChooseList ref="baseList" @getBaseData="getBaseData"></ChooseList>
</div>
</template>
<script>
import {
getNodeTree,
nodeSave,
nodeDelete,
nodeEdit,
batchBuildInfo,
resetNodePartInfo
} from "@/api/part/quicklyCreateBom.js"
import {
queryPartListBom, // 查出可创建BOM的物料
} from "@/api/part/bomManagement.js"
import {userFavoriteList, saveUserFavorite, removeUserFavorite} from '@/api/userFavorite.js'
import ChooseList from '@/views/modules/common/Chooselist_eam'
import {Decimal} from "decimal.js";
import BomCreate from "./bom_create.vue";
import RoutingCreate from "./routing_create.vue";
import PartCreate from "./part_create.vue";
import {updateInquiryDetailStatusAndPart} from "../../../api/inquiry/inquiryDetail";
import {EventBus} from "../../../main";
import {searchProductGroupPtmCondition, batchSearchProductGroupPtmConditionsWithItems, productGroupInformationSearch} from "../../../api/part/partProductGroupInformation";
import {
addPartItem,
batchUpdateItem,
commitItemValue, deletePartItem,
getPartItem,
partInfoByMainPart,
queryPartItem,
getItemLists, batchSavePartInfo, addPartsItem, batchUpdateCodeNo, deletePartsItem, commitItemsValue, getCopyRowData, recalculateBomAndRouting
} from "../../../api/part/partInformation";
import {getChooselist1} from "../../../api/chooselist/chooselist";
import {
chooseEngChgLevel,
chooseTemplate, getBomAndRoutingRevision,
getBomInformationListByPartNo,
getRoutingInformationListByPartNo,
getTemplateList,
savePartInfo, setRevision,
updatePartNoOfNode
} from "../../../api/part/quicklyCreateBom";
import {getSiteAndBuByUserName} from "../../../api/qc/qc";
import Data from "lodash";
import {copyBom, queryBomDetail, queryPartList} from "../../../api/part/bomManagement";
import {copyRouting, queryRoutingDetail} from "../../../api/part/routingManagement";
export default {
components: {
PartCreate,
BomCreate,
RoutingCreate,
ChooseList
},
watch: {
nodeData: {
deep: true,
handler: function (newV, oldV) {
this.nodeData.nodeId = this.nodeData.nodeId.toUpperCase()
}
},
itemUpdateFlag: {
deep: true,
handler: function (newV, oldV) {
if (!newV) {
this.partItemList1 = []
}
}
},
'partCurrentRow': {
deep: true,
handler: function (newV, oldV) {
if (this.inventoryPartTable==='part_item1'&&this.attributeFlag1){
this.getPartItem1()
} else if (this.inventoryPartTable==='revision_info'){
this.getRevisionInfo()
}
}
},
'bomCurrentRow': {
deep: true,
handler: function (newV, oldV) {
if (newV) {
this.routingCurrentRow = null
}
}
},
'routingCurrentRow': {
deep: true,
handler: function (newV, oldV) {
if (newV) {
this.bomCurrentRow = null
}
}
},
'bomCurrentRow1': {
deep: true,
handler: function (newV, oldV) {
if (newV) {
this.routingCurrentRow1 = null
}
}
},
'routingCurrentRow1': {
deep: true,
handler: function (newV, oldV) {
if (newV) {
this.bomCurrentRow1 = null
}
}
},
batchUpdateFlag: {
handler: function (newV, oldV) {
if (newV===false) {
this.attributeFlag = true
this.attributeFlag1 = true
this.inventoryPartTable = 'part_item'
this.getNodeTree()
this.getPartItem()
} else {
this.previousCodeNo = this.searchData.codeNo
}
}
},
'nodeData.pId': {
deep: true,
handler: function (newV, oldV) {
this.childrenNodeList = [];
if (!newV || newV.trim().length === 0) {
return;
}
const findNodeById = (nodes, targetId) => {
for (let i = 0; i < nodes.length; i++) {
const node = nodes[i];
if (node.id === targetId) {
return node;
}
if (node.nodeList && node.nodeList.length > 0) {
const result = findNodeById(node.nodeList, targetId);
if (result) return result;
}
}
return null;
};
const foundNode = findNodeById(this.treeData1, newV);
if (foundNode && foundNode.nodeList) {
this.childrenNodeList = foundNode.nodeList.filter(node => node.nodeName!==null&&node.nodeName.trim()!=="");
} else {
this.childrenNodeList = [];
}
}
},
'routingComponentPartList': {
deep: true,
handler: function (newV, oldV) {
newV.forEach(item => {
item.formula = this.getFormula(item.operationName)
})
}
},
'routingComponentPartList1': {
deep: true,
handler: function (newV, oldV) {
newV.forEach(item => {
item.formula = this.getFormula(item.operationName)
})
}
},
'copyVisible': {
deep: true,
handler: function (newV, oldV) {
if (!newV) {
this.copyData= {
flag: '',
site: this.$store.state.user.site,
partNo: '',
partDesc: '',
umId2: null,
productGroupId1: null,
productGroupId2: null,
productGroupId3: null,
codeNo: null,
familyID: null,
partType2: null,
routingType: 'Manufacturing',
bomType: 'Manufacturing',
effPhaseInDate: null,
effPhaseOutDate: null,
phaseOutDate: null,
phaseInDate: null,
previousVersion: {},
nodeFlag: false,
mainPart: '',
nodeId: '',
engChgLevel: null,
routingRevision: null,
active: '',
createBy: '',
routingFlag: 'Y',
bomFlag: 'Y',
page: 1,
limit: 10
}
this.bomComponentList1 = []
this.routingComponentList1 = []
this.bomComponentPartList1 = []
this.routingComponentPartList1 = []
this.handleBatchUpdatePart()
this.getRevisionInfo()
}
}
},
'$route.query.data': {
handler(newData, oldData) {
if (newData) {
this.searchData = newData;
this.searchData.partDesc = newData.testPartDesc;
this.searchData.codeNo = newData.partCodeNo;
this.searchData.rfqDetailId = newData.id;
this.dataList = [{}]
this.getNodeTree();
this.getPartItem();
}
},
immediate: true
}
},
data () {
return {
activeTable: 'bom_info',
activeTab1: 'default',
activeTab2: 'default',
inventoryPartTable: 'part_item',
partItemList: [],
partItemList1: [],
copyAttributeList: [],
treeData: [],
treeData1: [],
childrenNodeList: [],
userBuList: [],
partFamilyList: [],
partProductGroupList1: [],
partProductGroupList2: [],
partProductGroupList3: [],
templateList: [],
tempList: [],
defaultProps: {
children: "nodeList",
label: "nodeName",
},
menuId: this.$route.meta.menuId,
// 是否收藏
favorite: false,
exportData: [],
exportName: "节点" + this.dayjs().format('YYYYMMDDHHmmss'),
exportHeader: ["节点"],
exportFooter: [],
height: 200,
rightWidth: '',
pageIndex: 1,
pageSize: 20,
totalPage: 0,
pageIndex2: 1,
pageSize2: 20,
totalPage2: 0,
pageIndex3: 1,
pageSize3: 20,
totalPage3: 0,
pageIndex4: 1,
pageSize4: 20,
totalPage4: 0,
partList: [],
partList1: [],
codeList: [],
itemSelections1: [],
itemSelections2: [],
itemList1: [],
itemList2: [],
bomComponentPartList: [],
bomComponentPartList1: [],
routingComponentPartList: [],
routingComponentPartList1: [],
bomComponentList: [],
bomComponentList1: [],
routingComponentList: [],
routingComponentList1: [],
copyPartList: [],
previousCodeNo: '',
rules: {
buNo:[
{
required: true,
message: ' ',
trigger: ['blur', 'change']
}
],
partDesc: [
{
required: true,
message: ' ',
trigger: ['blur', 'change']
}
],
bomType: [
{
required: true,
message: ' ',
trigger: ['blur', 'change']
}
],
routingType: [
{
required: true,
message: ' ',
trigger: ['blur', 'change']
}
],
effPhaseInDate: [
{
required: true,
message: ' ',
trigger: ['blur', 'change']
}
],
},
searchData: {
site: this.$store.state.user.site,
buNo: '',
partNo: '',
partDesc: '',
codeNo: '',
rfqDetailId: null
},
partNoGenerated: false, // 标记产品编码是否已通过"维护"生成
savedPartData: null, // 保存已生成的产品数据,防止被路由参数覆盖
itemData: {
site: this.$store.state.user.site,
partNo: '',
propertiesItemNo: '',
codeNo: '',
itemDesc: '',
textValue: '',
numValue: '',
recordType: ''
},
nodeData: {
flag: '',
site: this.$store.state.user.site,
nodeId: '',
nodeName: '',
id: '',
pId: '',
parentNodeName: '',
createBy: this.$store.state.user.name,
updateBy: this.$store.state.user.name,
mainPart: '',
rfqDetailId: null
},
partData: {
flag: '',
site: '',
partNo: '',
partDesc: '',
nodeFlag: false,
mainPart: '',
nodeId: '',
engChgLevel: null,
page: 1,
limit: 10
},
copyData: {
flag: '',
site: this.$store.state.user.site,
partNo: '',
partDesc: '',
umId2: null,
productGroupId1: null,
productGroupId2: null,
productGroupId3: null,
codeNo: null,
familyID: null,
partType2: null,
routingType: 'Manufacturing',
bomType: 'Manufacturing',
effPhaseInDate: null,
effPhaseOutDate: null,
phaseOutDate: null,
phaseInDate: null,
previousVersion: {},
nodeFlag: false,
mainPart: '',
nodeId: '',
engChgLevel: null,
routingRevision: null,
active: '',
createBy: '',
routingFlag: 'Y',
bomFlag: 'Y',
page: 1,
limit: 10
},
copyModalData: {
site: '',
partNo: '',
partDesc: '',
page: 1,
limit: 10
},
nodeRules:{
nodeId:[
{
required: true,
message: ' ',
trigger: ['blur','change']
}
],
nodeName:[
{
required: true,
message: ' ',
trigger: ['blur','change']
}
],
parentNodeName:[
{
required: true,
message: ' ',
trigger: ['blur','change']
}
],
id:[
{
required: true,
message: ' ',
trigger: ['blur','change']
}
]
},
dataList: [{}],
editingCell: {
rowIndex: -1,
columnProp: null,
value: '',
isSaving: false
},
currentNode: {},
partCurrentRow: {},
bomCurrentRow: {},
bomCurrentRow1: {},
routingCurrentRow: {},
routingCurrentRow1: {},
partCurrentRowIndex: -1,
columnList: [
{
userId: this.$store.state.user.name,
columnProp: 'family1',
headerAlign: 'left',
align: 'left',
columnLabel: 'Family1',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 50
},
{
userId: this.$store.state.user.name,
columnProp: 'family2',
headerAlign: 'left',
align: 'left',
columnLabel: 'Family2',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 50
},
{
userId: this.$store.state.user.name,
columnProp: 'bondingPitch',
headerAlign: 'left',
align: 'left',
columnLabel: 'Bonding Pitch',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 80
},
{
userId: this.$store.state.user.name,
columnProp: 'bondingLanes',
headerAlign: 'left',
align: 'left',
columnLabel: '绑定列数',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 50
},
{
userId: this.$store.state.user.name,
columnProp: 'printingLanes',
headerAlign: 'left',
align: 'left',
columnLabel: 'Printing lanes',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 80
},
{
userId: this.$store.state.user.name,
columnProp: 'uph-tal',
headerAlign: 'left',
align: 'left',
columnLabel: 'UPH-TAL',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 80
},
{
userId: this.$store.state.user.name,
columnProp: 'uph-paris',
headerAlign: 'left',
align: 'left',
columnLabel: 'UPH-Paris',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 80
},
{
userId: this.$store.state.user.name,
columnProp: 'cl60k-up',
headerAlign: 'left',
align: 'left',
columnLabel: 'CL60k-UP',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 80
},
{
userId: this.$store.state.user.name,
columnProp: 'cl60k-pitch',
headerAlign: 'left',
align: 'left',
columnLabel: 'CL60k-Pitch',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 80
},
{
userId: this.$store.state.user.name,
columnProp: 'cl60k-cd',
headerAlign: 'left',
align: 'left',
columnLabel: 'CL60k-CD',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 80
},
{
userId: this.$store.state.user.name,
columnProp: 'compositeLanes',
headerAlign: 'left',
align: 'left',
columnLabel: '复合列数',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 50
},
{
userId: this.$store.state.user.name,
columnProp: 'labelingLanes',
headerAlign: 'left',
align: 'left',
columnLabel: '贴标列数',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 50
},
{
userId: this.$store.state.user.name,
columnProp: 'inspectionLanes',
headerAlign: 'left',
align: 'left',
columnLabel: '检测列数',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 50
},
{
userId: this.$store.state.user.name,
columnProp: 'finalInspection-uph',
headerAlign: 'left',
align: 'left',
columnLabel: '后道检品-UPH',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 80
},
{
userId: this.$store.state.user.name,
columnProp: 'coding-uph',
headerAlign: 'left',
align: 'left',
columnLabel: '编码-UPH',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 80
},
{
userId: this.$store.state.user.name,
columnProp: 'codingPrinting-uph',
headerAlign: 'left',
align: 'left',
columnLabel: '编码打印-UPH',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 80
},
],
partColumnList1: [
{
columnProp: 'buNo',
headerAlign: "center",
align: "center",
columnLabel: 'BU',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'partNo',
headerAlign: "center",
align: "center",
columnLabel: '料号',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 120
},
{
columnProp: 'partDesc',
headerAlign: "center",
align: "left",
columnLabel: '物料描述',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 320
},
{
columnProp: 'codeDesc',
headerAlign: "center",
align: "center",
columnLabel: '属性模板',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 220
},
{
columnProp: 'nodeName',
headerAlign: "center",
align: "center",
columnLabel: '节点',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'partType2',
headerAlign: "center",
align: "center",
columnLabel: '零件类型',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 130
},
{
columnProp: 'umName',
headerAlign: "center",
align: "center",
columnLabel: '计量单位',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'familyName',
headerAlign: "center",
align: "center",
columnLabel: '物料分类',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'productGroupName1',
headerAlign: "center",
align: "center",
columnLabel: '商品组1',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 250
},
{
columnProp: 'productGroupName2',
headerAlign: "center",
align: "center",
columnLabel: '商品组2',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 250
},
{
columnProp: 'productGroupName3',
headerAlign: "center",
align: "center",
columnLabel: '商品组3',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 250
},
// {
// columnProp: 'nodeName',
// headerAlign: "center",
// align: "center",
// columnLabel: '属性模板',
// columnHidden: false,
// columnImage: false,
// status: true,
// fixed: '',
// columnWidth: 100
// },
{
columnProp: 'templateName',
headerAlign: "center",
align: "center",
columnLabel: 'BOM模板',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'engChgLevel',
headerAlign: "center",
align: "center",
columnLabel: 'BOM版本号',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'routingRevision',
headerAlign: "center",
align: "center",
columnLabel: 'Routing版本号',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'remark',
headerAlign: "center",
align: "center",
columnLabel: '备注',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 200
},
],
partColumnList2: [
{
columnProp: 'buNo',
headerAlign: "center",
align: "center",
columnLabel: 'BU',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'partNo',
headerAlign: "center",
align: "center",
columnLabel: '料号',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 120
},
{
columnProp: 'partDesc',
headerAlign: "center",
align: "left",
columnLabel: '物料描述',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 320
},
{
columnProp: 'codeDesc',
headerAlign: "center",
align: "center",
columnLabel: '属性模板',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 220
},
{
columnProp: 'nodeName',
headerAlign: "center",
align: "center",
columnLabel: '节点',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'tempNo',
headerAlign: "center",
align: "center",
columnLabel: '模板',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'partType2',
headerAlign: "center",
align: "center",
columnLabel: '零件类型',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'umName',
headerAlign: "center",
align: "center",
columnLabel: '计量单位',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'familyName',
headerAlign: "center",
align: "center",
columnLabel: '物料分类',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'productGroupName1',
headerAlign: "center",
align: "center",
columnLabel: '商品组1',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 250
},
{
columnProp: 'productGroupName2',
headerAlign: "center",
align: "center",
columnLabel: '商品组2',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 250
},
{
columnProp: 'productGroupName3',
headerAlign: "center",
align: "center",
columnLabel: '商品组3',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 250
},
// {
// columnProp: 'nodeName',
// headerAlign: "center",
// align: "center",
// columnLabel: '属性模板',
// columnHidden: false,
// columnImage: false,
// status: true,
// fixed: '',
// columnWidth: 100
// },
{
columnProp: 'templateName',
headerAlign: "center",
align: "center",
columnLabel: 'BOM模板',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'engChgLevel',
headerAlign: "center",
align: "center",
columnLabel: 'BOM版本号',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'routingRevision',
headerAlign: "center",
align: "center",
columnLabel: 'Routing版本号',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'remark',
headerAlign: "center",
align: "center",
columnLabel: '备注',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 200
},
],
partColumnList: [
{
columnProp: 'buNo',
headerAlign: "center",
align: "center",
columnLabel: 'BU',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'partNo',
headerAlign: "center",
align: "center",
columnLabel: '物料编码',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 120
},
{
columnProp: 'partDesc',
headerAlign: "center",
align: "center",
columnLabel: '物料名称',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 300
},
{
columnProp: 'spec',
headerAlign: "center",
align: "center",
columnLabel: '规格型号',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 300
},
{
columnProp: 'printUnitName',
headerAlign: "center",
align: "center",
columnLabel: '计量单位',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'partType2',
headerAlign: "center",
align: "center",
columnLabel: '零件类型',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'yieldRate',
headerAlign: "center",
align: "right",
columnLabel: '良品率',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
],
columnItemList:[
{
userId: this.$store.state.user.name,
functionId: 601001,
serialNumber: '601001Table2PropertiesItemID',
tableId: "601001Table2",
tableName: "物料属性表",
columnProp: 'propertiesItemNo',
headerAlign: "center",
align: "center",
columnLabel: '属性编码',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 200,
},
{
userId: this.$store.state.user.name,
functionId: 601001,
serialNumber: '601001Table2PropertiesItemDesc',
tableId: "601001Table2",
tableName: "物料属性表",
columnProp: 'itemDesc',
headerAlign: "center",
align: "center",
columnLabel: '属性名称',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 200,
},
{
userId: this.$store.state.user.name,
functionId: 601001,
serialNumber: '601001Table2ValueType',
tableId: "601001Table2",
tableName: "物料属性表",
columnProp: 'valueType',
headerAlign: "center",
align: "center",
columnLabel: '属性类型',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 240,
},
{
userId: this.$store.state.user.name,
functionId: 601001,
serialNumber: '601001Table2ValueChooseFlag',
tableId: "601001Table2",
tableName: "物料属性表",
columnProp: 'textValue',
headerAlign: "center",
align: "center",
columnLabel: '属性值',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 200,
},
],
bomComponentListColumnList: [
{
userId: this.$store.state.user.name,
functionId: 601002,
serialNumber: '601002Table2LineSequence',
tableId: '601002Table2',
tableName: 'BOM子物料表',
columnProp: 'lineSequence',
headerAlign: 'center',
align: 'center',
columnLabel: '序号',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 50
},
{
userId: this.$store.state.user.name,
functionId: 601002,
serialNumber: '601002Table2ComponentPart',
tableId: '601002Table2',
tableName: 'BOM子物料表',
columnProp: 'componentPart',
headerAlign: 'center',
align: 'left',
columnLabel: '物料编码',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 120
},
{
userId: this.$store.state.user.name,
functionId: 601002,
serialNumber: '601002Table2ComponentPartDesc',
tableId: '601002Table2',
tableName: 'BOM子物料表',
columnProp: 'componentPartDesc',
headerAlign: 'center',
align: 'left',
columnLabel: '物料名称',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 300
},
{
userId: this.$store.state.user.name,
functionId: 601002,
serialNumber: '601002Table2ComponentPartDesc',
tableId: '601002Table2',
tableName: 'BOM子物料表',
columnProp: 'formula',
headerAlign: 'center',
align: 'left',
columnLabel: '计算公式',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 300
},
{
userId: this.$store.state.user.name,
functionId: 601002,
serialNumber: '601002Table2PrintUnit',
tableId: '601002Table2',
tableName: 'BOM子物料表',
columnProp: 'printUnitName',
headerAlign: 'center',
align: 'center',
columnLabel: '物料单位',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 601002,
serialNumber: '601002Table2PrintUnit',
tableId: '601002Table2',
tableName: 'BOM子物料表',
columnProp: 'qtyPerAssembly',
headerAlign: 'center',
align: 'center',
columnLabel: '单位用量',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 601002,
serialNumber: '601002Table2PrintUnit',
tableId: '601002Table2',
tableName: 'BOM子物料表',
columnProp: 'shrinkageFactor',
headerAlign: 'center',
align: 'center',
columnLabel: '损耗率',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 60
},
{
userId: this.$store.state.user.name,
functionId: 601002,
serialNumber: '601002Table2OperationNo',
tableId: '601002Table2',
tableName: 'BOM子物料表',
columnProp: 'operationNo',
headerAlign: 'center',
align: 'center',
columnLabel: '工序编码',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 80
},
{
userId: this.$store.state.user.name,
functionId: 601002,
serialNumber: '601002Table2OperationName',
tableId: '601002Table2',
tableName: 'BOM子物料表',
columnProp: 'operationName',
headerAlign: 'center',
align: 'left',
columnLabel: '工序名称',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 120
},
{
userId: this.$store.state.user.name,
functionId: 601002,
serialNumber: '601002Table2NoteText',
tableId: '601002Table2',
tableName: 'BOM子物料表',
columnProp: 'noteText',
headerAlign: 'center',
align: 'center',
columnLabel: '备注',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 150
},
],
bomComponentListColumns: [
{
userId: this.$store.state.user.name,
columnProp: 'engChgLevel',
headerAlign: 'center',
align: 'center',
columnLabel: 'BOM版本号',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 80
},
{
userId: this.$store.state.user.name,
columnProp: 'noteText',
headerAlign: 'center',
align: 'left',
columnLabel: '备注',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 200
},
],
routingComponentListColumns: [
{
userId: this.$store.state.user.name,
columnProp: 'routingRevision',
headerAlign: 'center',
align: 'center',
columnLabel: 'Routing版本号',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
columnProp: 'noteText',
headerAlign: 'center',
align: 'left',
columnLabel: '备注',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 200
},
],
routingComponentListColumnList: [
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2OperationNo',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'operationNo',
headerAlign: 'center',
align: 'center',
columnLabel: '工序编码',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 80
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2OperationName',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'operationName',
headerAlign: 'center',
align: 'center',
columnLabel: '工序名称',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 120
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2MachCycleTime',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'machCycleTime',
headerAlign: 'center',
align: 'right',
columnLabel: '机器处理时间',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2OperationName',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'formula',
headerAlign: 'center',
align: 'left',
columnLabel: '计算公式',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 260
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2OperationName',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'crewSize',
headerAlign: 'center',
align: 'center',
columnLabel: '人数',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2OperationName',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'refSpeed',
headerAlign: 'center',
align: 'center',
columnLabel: '速度',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2OperationName',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'refTime',
headerAlign: 'center',
align: 'center',
columnLabel: '时间',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2OperationName',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'refEfficiency',
headerAlign: 'center',
align: 'center',
columnLabel: '效率',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2SetupCrewSize',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'setupCrewSize',
headerAlign: 'center',
align: 'right',
columnLabel: '调机过程人数',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2MachRunFactor',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'machRunFactor',
headerAlign: 'center',
align: 'right',
columnLabel: '机器单位产出',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2CrewSize',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'crewSize',
headerAlign: 'center',
align: 'right',
columnLabel: '生产过程人数',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2LaborClassNo',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'laborClassDesc',
headerAlign: 'center',
align: 'center',
columnLabel: '人员等级',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 120
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2LaborCycleTime',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'laborCycleTime',
headerAlign: 'center',
align: 'right',
columnLabel: '人工处理时间',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2LaborRunFactor',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'laborRunFactor',
headerAlign: 'center',
align: 'right',
columnLabel: '人工单位产出',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2EfficiencyFactor',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'efficiencyFactor',
headerAlign: 'center',
align: 'right',
columnLabel: '效率%',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 80
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2WorkCenterNo',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'workCenterNo',
headerAlign: 'center',
align: 'center',
columnLabel: '加工中心编码',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 601003,
serialNumber: '104003Table2NoteText',
tableId: '104003Table2',
tableName: 'Routing工序表',
columnProp: 'noteText',
headerAlign: 'center',
align: 'center',
columnLabel: '备注',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 120
},
],
componentPartColumnList: [
{
columnProp: 'partNo',
headerAlign: "center",
align: "center",
columnLabel: '物料编码',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 120
},
{
columnProp: 'partDesc',
headerAlign: "center",
align: "center",
columnLabel: '物料名称',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 300
},
{
columnProp: 'spec',
headerAlign: "center",
align: "center",
columnLabel: '规格型号',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 300
},
{
columnProp: 'printUnitName',
headerAlign: "center",
align: "center",
columnLabel: '计量单位',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
},
{
columnProp: 'partType2',
headerAlign: "center",
align: "center",
columnLabel: '零件类型',
columnHidden: false,
columnImage: false,
status: true,
fixed: '',
columnWidth: 100
}
],
// 控制
nodeModalFlag: false,
nodeModalDisableFlag: false,
partModelFlag: false,
buildAllLoading: false,
resetAllLoading: false,
bomLoading: false,
routingLoading: false,
treeVisible: false,
addNodeFlag: true,
batchUpdateFlag: false,
attributeFlag: true,
attributeFlag1: true,
attributeFlag2: true,
fastAddFlag: false,
fastAddFlag1: false,
loading: false,
dataListLoading: false,
addItemLoading: false,
deleteItemLoading: false,
buNoQueryLoading: false,
alternativeLoading: false,
processTimeMatrixLoading: false,
bomFlag: true,
bomFlag1: true,
copyVisible: false,
copyPartModelFlag: false,
itemUpdateFlag: false,
ptmDialogVisible: false, // PTM参数选择对话框显示控制
ptmDataList: [], // PTM完整数据列表(53行,每行包含Code和12个参数列)
filteredPtmDataList: [], // PTM筛选后的数据列表
ptmColumnList: [], // PTM参数动态列配置(12个参数列)
ptmSearchCode: '', // PTM Code筛选条件
ptmItemList: [], // PTM参数列表(去重后的item列表)
selectedPtmItems: [], // 用户勾选的PTM参数
ptmProductGroupList: [], // 当前BU下所有商品组1列表
ptmSelectedProductGroupId: '', // 当前选中的商品组1ID
ptmCurrentBuNo: '' // 当前BU编号
}
},
created () {
// 按钮控制
this.getButtonAuthData()
// 校验用户是否收藏
this.favoriteIsOk()
// 获取树形结构
// this.searchData = {
// site: '2',
// buNo: '03-RFID',
// partNo: '*',
// partDesc: '***'
// }
},
mounted () {
this.$nextTick(() => {
this.height = window.innerHeight - 151
})
},
activated() {
if (this.$route.query.data) {
console.log('activated 触发 - partNoGenerated 标记:', this.partNoGenerated)
console.log('activated 触发 - 当前 partNo:', this.searchData.partNo)
console.log('activated 触发 - 路由参数 partNo:', this.$route.query.data.partNo)
console.log('activated 触发 - savedPartData:', this.savedPartData)
// 如果产品编码已通过"维护"生成,从保存的副本恢复数据
if (this.partNoGenerated && this.savedPartData) {
console.log('产品编码已生成,从 savedPartData 恢复数据:', this.savedPartData.partNo)
// 从保存的副本恢复数据
this.searchData.site = this.savedPartData.site
this.searchData.buNo = this.savedPartData.buNo
this.searchData.partNo = this.savedPartData.partNo
this.searchData.partDesc = this.savedPartData.partDesc
this.searchData.testPartId = this.savedPartData.testPartId
this.searchData.codeNo = this.savedPartData.codeNo || this.$route.query.data.partCodeNo
this.searchData.rfqDetailId = this.savedPartData.rfqDetailId || this.$route.query.data.id
console.log('恢复后的 searchData.partNo:', this.searchData.partNo)
// 刷新相关数据
this.getNodeTree();
this.getPartItem();
return
}
// 产品编码未生成时,正常从路由参数加载数据
console.log('从路由参数加载初始数据')
this.searchData = this.$route.query.data
this.searchData.partDesc = this.$route.query.data.testPartDesc
this.searchData.codeNo = this.$route.query.data.partCodeNo
this.searchData.rfqDetailId = this.$route.query.data.id
this.getNodeTree();
this.getPartItem();
}
},
methods: {
// 每页数
sizeChangeHandle2 (val) {
this.pageSize2 = val
this.pageIndex2 = 1
this.queryPartList()
},
// 当前页
currentChangeHandle2 (val) {
this.pageIndex2 = val
this.queryPartList()
},
// 查询下拉树结构
getNodeTree () {
let tempData = {
site: this.searchData.site,
mainPart: this.searchData.partNo,
rfqDetailId: this.searchData.rfqDetailId,
pId: '0'
}
getNodeTree(tempData).then(({data}) => {
if (data && data.code === 0) {
this.$set(this, 'treeData', data.rows)
}
if (this.batchUpdateFlag){
this.handleBatchUpdatePart()
}
})
},
// 新增节点
addTree () {
this.nodeData = {
flag: '1',
site: this.$store.state.user.site,
nodeId: 'NODE' + Data.now(),
nodeName: '',
pId: '0',
createBy: this.$store.state.user.name,
updateBy: this.$store.state.user.name,
mainPart: this.searchData.partNo,
rfqDetailId: this.searchData.rfqDetailId,
}
this.treeData1 = [
{
id: '0',
nodeName: '首节点',
nodeList: []
}
]
if (Array.isArray(this.treeData) && this.treeData.length > 0) {
this.treeData1[0].nodeList = [...this.treeData]
}
this.nodeModalDisableFlag = false
this.nodeModalFlag = true
},
// 修改节点
editTreeItem (data) {
this.nodeData = {
flag: '2',
site: data.site,
nodeId: data.nodeId,
nodeName: data.nodeName,
mainPart: this.searchData.partNo,
createBy: this.$store.state.user.name,
updateBy: this.$store.state.user.name,
}
this.nodeModalDisableFlag = true
this.nodeModalFlag = true
},
// 删除节点
deleteTreeItem (data) {
this.$confirm('将删除该节点及其子节点数据!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
nodeDelete(data).then(({data}) => {
if (data && data.code === 0) {
this.getNodeTree()
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
})
},
// 分类新增/编辑方法
saveNodeData () {
if (this.nodeData.nodeId === '' || this.nodeData.nodeId == null) {
this.$message.warning('请输入节点编码!')
return
}
if (this.nodeData.nodeName === '' || this.nodeData.nodeName == null) {
this.$message.warning('请输入节点名称!')
return
}
if(this.nodeData.flag === '1') {
nodeSave(this.nodeData).then(({data}) => {
if (data && data.code === 0) {
this.getNodeTree()
this.nodeModalFlag = false
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
} else {
nodeEdit(this.nodeData).then(({data}) => {
if (data && data.code === 0) {
this.getNodeTree()
this.nodeModalFlag = false
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
}
},
// 批量build
batchBuild () {
let tempData = {
site: this.searchData.site,
mainPart: this.searchData.partNo
}
this.$confirm('将所有节点的BOM和Routing状态改为Build!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.buildAllLoading = true
batchBuildInfo(tempData).then(({data}) => {
if (data && data.code === 0) {
this.refreshCurrentTabTable()
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
this.buildAllLoading = false
})
})
},
// 重置节点物料
resetNodePart() {
let tempData = {
site: this.$store.state.user.site
}
this.$confirm('将重置所有节点的关联物料!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.resetAllLoading = true
resetNodePartInfo(tempData).then(({data}) => {
if (data && data.code === 0) {
this.currentNode = {}
this.getNodeTree()
this.refreshCurrentTabTable()
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
this.resetAllLoading = false
})
})
},
/**
* 刷新页签的table数据
*/
refreshCurrentTabTable () {
if (this.activeTable === 'bom_info') {
if (this.currentNode.partNo != null && this.currentNode.partNo.length > 0) {
this.getBomInfo2(this.currentNode)
} else {
this.$nextTick(() => {
this.$refs.BomCreate.init2()
})
}
} else if (this.activeTable === 'routing_info') {
if (this.currentNode.partNo != null && this.currentNode.partNo.length > 0) {
this.getRoutingInfo(this.currentNode)
} else {
this.$nextTick(() => {
this.$refs.RoutingCreate.init2()
})
}
}
},
queryPartList2(data) {
this.partData = {
flag: '2',
site: '',
partNo: '',
partDesc: '',
nodeFlag: true,
page: 1,
limit: 10,
mainPart: this.searchData.partNo,
nodeId: this.treeData[0].nodeId,
engChgLevel: this.treeData[0].engChgLevel
}
this.currentNode = data
this.queryPartList()
},
queryPartListInfo () {
this.partData = {
flag: '1',
site: '',
partNo: '',
partDesc: '',
page: 1,
limit: 10
}
this.queryPartList3()
},
queryPartList3 () {
this.partData.limit = this.pageSize2
this.partData.page = this.pageIndex2
queryPartListBom(this.partData).then(({data}) => {
if (data && data.code === 0) {
this.partList = data.page.list
this.pageIndex2 = data.page.currPage
this.pageSize2 = data.page.pageSize
this.totalPage2 = data.page.totalCount
this.partModelFlag = true
} else {
this.partList = []
}
})
},
// 查询物料
queryPartList () {
this.partData.limit = this.pageSize2
this.partData.page = this.pageIndex2
this.partData.site = this.nodeData.site
queryPartListBom(this.partData).then(({data}) => {
if (data && data.code === 0) {
this.partList = data.page.list
this.pageIndex2 = data.page.currPage
this.pageSize2 = data.page.pageSize
this.totalPage2 = data.page.totalCount
this.partModelFlag = true
} else {
this.partList = []
}
})
},
// 双击选中物料
getRowData (row) {
if (this.partData.flag === '1') {
this.getInfoByBomTemplate(row)
} else {
this.toPartModule(row)
}
},
// 获取物料的Bom模板详情
async getInfoByBomTemplate (row) {
console.log('getInfoByBomTemplate 接收到的 row:', row)
this.searchData.site = row.site
this.searchData.buNo = row.buNo
this.searchData.partNo = row.partNo
this.searchData.partDesc = row.partDesc
this.searchData.testPartId = row.id
// 标记产品编码已生成(从 * 变成实际编码)并保存数据副本
if (row.partNo && row.partNo !== '*') {
this.partNoGenerated = true
// 保存完整的产品数据副本,用于页签切换时恢复
this.savedPartData = {
site: row.site,
buNo: row.buNo,
partNo: row.partNo,
partDesc: row.partDesc,
testPartId: row.id,
rfqDetailId: this.searchData.rfqDetailId
}
console.log('设置 partNoGenerated = true,保存的数据:', this.savedPartData)
}
console.log('更新后的 searchData.partNo:', this.searchData.partNo)
await this.getNodeTree()
let tempData = {
site: this.$store.state.user.site,
buNo: this.searchData.buNo,
partNo: this.searchData.partNo,
codeNo: this.searchData.codeNo
}
await partInfoByMainPart(tempData).then(({data}) => {
if (data && data.code === 0){
this.$set(this, 'partList1', data.rows)
this.searchData.codeNo = this.partList1[0].codeNo
// 同步更新保存的数据
if (this.savedPartData) {
this.savedPartData.codeNo = this.partList1[0].codeNo
}
}
})
this.getPartItem();
this.partModelFlag = false
},
// 到物料编辑组件
toPartModule (row) {
let tempData = {
site: row.site,
buNo: row.buNo,
mainPart: this.searchData.partNo,
partNo: row.partNo,
bomType: 'Manufacturing',
partDesc: row.partDesc,
printUnit: row.printUnit,
printUnitName: row.printUnitName,
shrinkageFactor: new Decimal(100).sub(new Decimal(row.yieldRate)).toNumber(),
nodeId: this.currentNode.nodeId,
offFlag: '1'
}
//打开组件 去做新增业务
this.$nextTick(() => {
this.$refs.BomCreate.init(tempData)
})
this.partModelFlag = false
},
// 新增物料
addPartModal (data) {
this.currentNode = data
//打开组件 去做新增业务
this.$nextTick(() => {
this.$refs.PartCreate.init()
})
},
// 维护
updatePartModal () {
if (this.searchData.partNo === '' || this.searchData.partNo == null) {
this.$message.warning('请选择产品!')
return
}
let templateData = {
site: this.searchData.site,
buNo: this.searchData.buNo,
partNo: this.searchData.partNo,
partDesc: this.searchData.partDesc
}
//打开组件 去做编辑业务
this.$nextTick(() => {
this.$refs.PartCreate.updateModal(templateData)
})
},
// 根据物料获取BOM信息
getBomInfo (row) {
let tempData = {
site: row.site,
buNo: row.buNo,
mainPart: this.searchData.partNo,
partNo: row.partNo,
partDesc: row.partDesc,
printUnit: row.umId2,
printUnitName: row.umName,
bomType: 'Manufacturing',
nodeId: this.currentNode.nodeId,
offFlag: '1'
}
//打开组件 去做新增业务
this.$nextTick(() => {
this.$refs.BomCreate.init(tempData)
})
},
// 根据物料获取Routing信息
getRoutingInfo (row) {
this.routingLoading = true
let tempData = {
site: row.site,
buNo: row.buNo,
partNo: row.partNo,
partDesc: row.partDesc,
printUnit: row.printUnit,
printUnitName: row.printUnitName,
routingType: 'Manufacturing',
}
//打开组件 去做新增业务
this.$nextTick(() => {
this.$refs.RoutingCreate.init(tempData)
})
},
// 树节点单机事件
handleNodeClick (e, node) {
this.currentNode = e
if (e.partNo != null && e.partNo.length > 0) {
if (this.activeTable === 'routing_info') {
this.getRoutingInfo(e)
} else {
this.getBomInfo2(e)
}
} else {
if (this.activeTable === 'routing_info') {
this.$nextTick(() => {
this.$refs.RoutingCreate.init2()
})
} else {
this.$nextTick(() => {
this.$refs.BomCreate.init2()
})
}
}
},
// 根据物料获取BOM信息
getBomInfo2 (row) {
this.bomLoading = true
let tempData = {
site: row.site,
buNo: row.buNo,
mainPart: this.searchData.partNo,
partNo: row.partNo,
partDesc: row.partDesc,
printUnit: row.printUnit,
printUnitName: row.printUnitName,
processUnit: row.processUnit,
bomType: 'Manufacturing',
nodeId: this.currentNode.nodeId,
offFlag: '2'
}
//打开组件 去做新增业务
this.$nextTick(() => {
this.$refs.BomCreate.init(tempData)
})
},
// 刷新BOM的loading
refreshBomLoading () {
this.bomLoading = false
},
// 刷新Routing的loading
refreshRoutingLoading () {
this.routingLoading = false
},
// 刷新节点列表
refreshNode (partNo) {
this.getNodeTree()
this.currentNode.partNo = partNo
},
// 获取基础数据列表S
getBaseList (val, type) {
this.tagNo = val
this.$nextTick(() => {
let strVal = ''
if (val === 215) {
strVal = this.componentData.issueToLoc
}
this.$refs.baseList.init(val, strVal)
})
},
// 列表方法的回调
getBaseData (val) {
if (this.tagNo === 215) {
this.componentData.issueToLoc = val.location_id
this.componentData.issueToLocName = val.location_name
}
},
// 回车事件
focusNextInput (index, type) {
let aaa = ''
if (this.subDetailList.length - 1 === index) {
aaa = `${type}0`
} else {
aaa = `${type}${index + 1}`
}
this.$nextTick(() => {
this.$refs[aaa].focus()
})
},
// 校验用户是否收藏
favoriteIsOk () {
let userFavorite = {
userId: this.$store.state.user.id,
languageCode: this.$i18n.locale
}
userFavoriteList(userFavorite).then(({data}) => {
for (let i = 0; i < data.list.length; i++) {
if (this.$route.meta.menuId === data.list[i].menuId) {
this.favorite = true
}
}
})
},
updateInquiryDetailStatus () {
let inData = {
id: this.searchData.id,
testPartId: this.searchData.testPartId,
testPartDesc: this.searchData.partDesc,
partBomStatus: this.searchData.partBomStatus,
updateBy: this.$store.state.user.name,
}
this.$confirm('是否确认完成?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
updateInquiryDetailStatusAndPart(inData).then(({data}) => {
if (data && data.code === 0) {
this.$message({
message: '操作成功',
type: 'success'
})
EventBus.$emit('refreshInquiryOneDetail1')
EventBus.$emit('refreshInquiryOneDetail2')
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
})
},
// 收藏 OR 取消收藏
favoriteFunction() {
let userFavorite = {
userId: this.$store.state.user.id,
functionId: this.$route.meta.menuId,
}
if (this.favorite) {
removeUserFavorite(userFavorite).then(({data}) => {
this.$message.success(data.msg)
this.favorite = false
})
} else {
// 收藏
saveUserFavorite(userFavorite).then(({data}) => {
this.$message.success(data.msg)
this.favorite = true
})
}
},
//获取按钮的权限数据
getButtonAuthData () {
let searchFlag = this.isAuth(this.menuId+":search")
let saveFlag = this.isAuth(this.menuId+":save")
let updateFlag = this.isAuth(this.menuId+":update")
let deleteFlag = this.isAuth(this.menuId+":delete")
//处理页面的权限数据
this.authSearch = !searchFlag
this.authSave = !saveFlag
this.authUpdate = !updateFlag
this.authDelete = !deleteFlag
},
nodeListTreeCurrentChangeHandle (data, node) {
this.nodeData.pId = data.id
this.nodeData.parentNodeName = data.nodeName
this.treeVisible = false
},
getPartItem() {
let tempData = {
site: this.$store.state.user.site,
buNo: this.searchData.buNo,
partNo: this.searchData.partNo,
codeNo: this.searchData.codeNo,
recordType: 'IP'
}
this.dataListLoading = true
getPartItem(tempData).then(({data}) => {
this.dataList = [{}]
if (data && data.code === 0 && data.rows.length > 0) {
for (let i = 0; i < data.rows.length; i++) {
const itemDesc = data.rows[i].itemDesc;
const value = data.rows[i].numValue ? data.rows[i].numValue : data.rows[i].textValue;
switch (itemDesc) {
case 'Family1':
this.$set(this.dataList[0], 'family1', value);
break;
case 'Family2':
this.$set(this.dataList[0], 'family2', value);
break;
case 'Bonding Pitch':
this.$set(this.dataList[0], 'bondingPitch', value);
break;
case '绑定列数':
this.$set(this.dataList[0], 'bondingLanes', value);
break;
case 'Printing lanes':
this.$set(this.dataList[0], 'printingLanes', value);
break;
case 'UPH-TAL':
this.$set(this.dataList[0], 'uph-tal', value);
break;
case 'UPH-Paris':
this.$set(this.dataList[0], 'uph-paris', value);
break;
case 'CL60k-UP':
this.$set(this.dataList[0], 'cl60k-up', value);
break;
case 'CL60k-Pitch':
this.$set(this.dataList[0], 'cl60k-pitch', value);
break;
case 'CL60k-CD':
this.$set(this.dataList[0], 'cl60k-cd', value);
break;
case '复合列数':
this.$set(this.dataList[0], 'compositeLanes', value);
break;
case '贴标列数':
this.$set(this.dataList[0], 'labelingLanes', value);
break;
case '检测列数':
this.$set(this.dataList[0], 'inspectionLanes', value);
break;
case '后道检品-UPH':
this.$set(this.dataList[0], 'finalInspection-uph', value);
break;
case '编码-UPH':
this.$set(this.dataList[0], 'coding-uph', value);
break;
case '编码打印-UPH':
this.$set(this.dataList[0], 'codingPrinting-uph', value);
break;
}
}
this.$forceUpdate()
} else {
this.dataList = [{}]
}
this.dataListLoading = false
})
},
getPartItem1 () {
let tempData = {
site: this.partCurrentRow.site,
buNo: this.partCurrentRow.buNo,
partNo: this.partCurrentRow.partNo,
codeNo: this.partCurrentRow.codeNo,
recordType: 'IP'
}
getPartItem(tempData).then(({data}) => {
if (data && data.code === 0) {
this.partItemList = data.rows
} else {
this.partItemList = []
}
})
},
getPartItem2 () {
let tempData = {
site: this.partList1[0].site,
buNo: this.partList1[0].buNo,
partNo: this.partList1[0].partNo,
codeNo: this.partList1[0].codeNo,
recordType: 'IP'
}
getPartItem(tempData).then(({data}) => {
if (data && data.code === 0) {
this.partItemList1 = data.rows
} else {
this.partItemList1 = []
}
})
},
getRevisionInfo(){
if (this.partCurrentRow.partNo!==null&&this.partCurrentRow.partNo.length>0){
let tempData = {
site: this.partCurrentRow.site,
buNo: this.partCurrentRow.buNo,
mainPart: this.searchData.partNo,
partNo: this.partCurrentRow.partNo,
partDesc: this.partCurrentRow.partDesc,
printUnit: this.partCurrentRow.umId2,
printUnitName: this.partCurrentRow.umName,
bomType: 'Manufacturing',
routingType: 'Manufacturing',
nodeId: this.partCurrentRow.nodeId,
offFlag: '2'
}
this.$nextTick(() => {
getBomInformationListByPartNo(tempData).then(({data}) => {
if (data && data.code === 0) {
this.bomComponentList = []
this.bomComponentPartList = []
if (data.rows.length > 0) {
data.rows = data.rows.filter(item => item.partNo!==null&&item.partNo.length>0)
if (data.rows.length > 0) {
for (let i = 0; i < data.rows.length; i++) {
this.$set(data.rows[i], 'index', i)
this.$set(this.bomComponentList, i, data.rows[i])
this.queryBomDetail(data.rows[i])
}
}
}
} else {
this.$alert(data.msg, '提示', {
confirmButtonText: '确定'
})
}
})
getRoutingInformationListByPartNo(tempData).then(({data}) => {
if (data && data.code === 0) {
this.routingComponentList = []
this.routingComponentPartList = []
if (data.rows.length > 0) {
data.rows = data.rows.filter(item => item.partNo!==null&&item.partNo.length>0)
if (data.rows.length > 0) {
for (let i = 0; i < data.rows.length; i++) {
this.$set(data.rows[i], 'index', i)
this.$set(this.routingComponentList, i, data.rows[i])
this.queryRoutingDetail(data.rows[i])
}
}
}
} else {
this.$alert(data.msg, '提示', {
confirmButtonText: '确定'
})
}
})
})
}
},
getRevisionInfo1(row){
let tempData = {
site: row.site,
buNo: row.buNo,
mainPart: this.searchData.partNo,
partNo: row.partNo,
partDesc: row.partDesc,
printUnit: row.umId2,
printUnitName: row.umName,
bomType: 'Manufacturing',
routingType: 'Manufacturing',
offFlag: '2'
}
this.$nextTick(() => {
getBomInformationListByPartNo(tempData).then(({data}) => {
if (data && data.code === 0) {
this.bomComponentList1 = []
this.bomComponentPartList1 = []
if (data.rows.length > 0) {
data.rows = data.rows.filter(item => item.partNo!==null&&item.partNo.length>0)
if (data.rows.length > 0) {
for (let i = 0; i < data.rows.length; i++) {
this.$set(data.rows[i], 'index', i)
this.$set(this.bomComponentList1, i, data.rows[i])
this.queryBomDetail1(data.rows[i])
}
}
}
} else {
this.$alert(data.msg, '提示', {
confirmButtonText: '确定'
})
}
})
getRoutingInformationListByPartNo(tempData).then(({data}) => {
if (data && data.code === 0) {
this.routingComponentList1 = []
this.routingComponentPartList1 = []
if (data.rows.length > 0) {
data.rows = data.rows.filter(item => item.partNo!==null&&item.partNo.length>0)
if (data.rows.length > 0) {
for (let i = 0; i < data.rows.length; i++) {
this.$set(data.rows[i], 'index', i)
this.$set(this.routingComponentList1, i, data.rows[i])
this.queryRoutingDetail1(data.rows[i])
}
}
}
} else {
this.$alert(data.msg, '提示', {
confirmButtonText: '确定'
})
}
})
})
},
handleBatchUpdatePart(){
if(this.treeData.length===0){
this.$message.warning('请先维护主物料的BOM模板!')
return
}
let tempData = {
site: this.$store.state.user.site,
buNo: this.searchData.buNo,
partNo: this.searchData.partNo,
codeNo: this.searchData.codeNo
}
partInfoByMainPart(tempData).then(({data}) => {
if (data && data.code === 0){
this.$set(this, 'partList1', data.rows)
this.searchData.codeNo = this.partList1[0].codeNo
this.partCurrentRow = JSON.parse(JSON.stringify(this.partList1[0]))
let tempList = []
tempList.push(
["Select code_no as fieldname1, code_desc as caption1 from plm_properties_model_header where function_type = 'IP' and active = 'Y' and (code_no like '%%' OR code_desc like '%%' ) and site in (select site from eam_access_site where username = '"+this.$store.state.user.name+"') and (site + '-' + bu_no) in (select (a.site + '-' + a.bu_no) from AccessBu as a left join eam_access_site as b on a.site = b.site and a.username = b.username where a.username = '"+this.$store.state.user.name+"') and site = '"+this.$store.state.user.site+"' and bu_no = '"+this.searchData.buNo+"'"]
)
getChooselist1(tempList).then(({data}) => {
this.$set(this, 'codeList', data.list[0][0])
})
let tempData1 = {
username: this.$store.state.user.name,
}
getSiteAndBuByUserName(tempData1).then(({data}) => {
if (data&&data.code === 0) {
this.userBuList = data.rows.sort((a, b) => {
return a.buNo.split('_')[1].localeCompare(b.buNo.split('_')[1]);
});
}
})
this.getTemplateList()
this.getPartItem2()
this.getBomAndRoutingRevision()
this.batchUpdateFlag = true
}else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
},
addOrDelItem () {
if (!this.attributeFlag1) {
this.$message.warning('请保存更改!')
return
}
this.itemSelections1 = null
this.itemSelections2 = null
this.itemData.propertiesItemNo = ''
this.itemData.itemDesc = ''
let tempData = {
site: this.partCurrentRow.site,
buNo: this.partCurrentRow.buNo,
partNo: this.partCurrentRow.partNo,
codeNo: this.partCurrentRow.codeNo||this.searchData.codeNo,
recordType: 'IP'
}
getItemLists(tempData).then(({data}) => {
this.itemList1 = data.row1
this.itemList2 = data.row2
})
this.fastAddFlag = true
},
addOrDelItem1 () {
if (!this.attributeFlag1) {
this.$message.warning('请保存更改!')
return
}
this.itemSelections1 = null
this.itemSelections2 = null
this.itemData.propertiesItemNo = ''
this.itemData.itemDesc = ''
let tempData = {
site: this.partList1[0].site,
buNo: this.partList1[0].buNo,
partNo: this.partList1[0].partNo,
codeNo: this.partList1[0].codeNo,
recordType: 'IP'
}
getItemLists(tempData).then(({data}) => {
this.itemList1 = data.row1
this.itemList2 = data.row2
})
this.fastAddFlag1 = true
},
clickSave1 () {
if (!this.attributeFlag1) { // 保存
this.updateItemValue1()
this.attributeFlag1 = true
} else { // 编辑
this.copyAttributeList = JSON.parse(JSON.stringify(this.partItemList1))
this.attributeFlag1 = false
}
},
clickSave () {
if (!this.attributeFlag1) { // 保存
this.updateItemValue()
this.attributeFlag1 = true
} else { // 编辑
this.copyAttributeList = JSON.parse(JSON.stringify(this.partItemList))
this.attributeFlag1 = false
}
},
// 列表表格选择替换
tabClick (tab, event) {
this.refreshCurrentTabTable1()
},
tabLeave (activeName, oldActiveName) {
if (!this.attributeFlag1) {
this.$message.warning('请先保存当前编辑的内容!')
return false
}
return true
},
// 刷新页签的table数据
refreshCurrentTabTable1 () {
if (this.inventoryPartTable === 'part_item') {
this.getPartItem2()
} else if (this.inventoryPartTable === 'part_item1') {
this.getPartItem1()
} else if (this.inventoryPartTable === 'revision_info') {
this.getRevisionInfo()
}
},
// 查询物料属性
queryPartItem () {
this.itemData.codeNo = this.modalData.codeNo
this.itemData.partNo = this.modalData.partNo
queryPartItem(this.itemData).then(({data}) => {
if (data && data.code === 0) {
this.itemList1 = data.rows
} else {
this.itemList1 = []
}
})
},
// 可选属性
itemClickRow1 (row) {
this.$refs.itemTable1.toggleRowSelection(row)
},
// 复选属性
selectionItem1 (val) {
this.itemSelections1 = val
},
// 已有属性
itemClickRow2 (row) {
this.$refs.itemTable2.toggleRowSelection(row)
},
// 复选属性
selectionItem2 (val) {
this.itemSelections2 = val
},
updateItemValue1 () {
this.loading = true
let list = []
for (let i = 0; i <this.partList1.length; i++) {
if (this.partList1[i].partNo&&this.partList1.partNo!==''&&this.partList1[i].buNo && this.partList1[i].buNo === this.searchData.buNo){
let items = JSON.parse(JSON.stringify(this.partItemList1))
for (let j = 0; j < this.partItemList1.length; j++) {
items[j].site = this.partList1[i].site
items[j].buNo = this.partList1[i].buNo
items[j].partNo = this.partList1[i].partNo
items[j].codeNo = this.partList1[i].codeNo
items[j].recordType = 'IP'
}
list.push({
site: this.partList1[i].site,
buNo: this.partList1[i].buNo,
partNo: this.partList1[i].partNo,
codeNo: this.partList1[i].codeNo,
recordType: 'IP',
itemList: items
})
}
}
commitItemsValue(list).then(({data}) => {
if (data && data.code === 0) {
this.getPartItem2()
this.loading = false
this.attributeFlag1 = true
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
this.attributeFlag1 = true
this.loading = false
}
}).catch((error) => {
this.attributeFlag1 = true
this.$set(this, 'loading', false)
this.$message.error(error)
})
},
updateItemValue () {
this.loading = true
let tempData = {
itemList: JSON.parse(JSON.stringify(this.partItemList))
}
commitItemValue(tempData).then(({data}) => {
if (data && data.code === 0) {
this.getPartItem1()
this.loading = false
this.attributeFlag1 = true
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
}).catch((error) => {
this.$set(this, 'loading', false)
this.$message.error(error)
})
},
// 物料项目新增
addItem () {
if (this.itemSelections1 == null || this.itemSelections1.length === 0) {
this.$message.warning('请选择可选属性!')
return
}
let inData = {
site: this.partCurrentRow.site,
buNo: this.partCurrentRow.buNo,
partNo: this.partCurrentRow.partNo,
codeNo: this.partCurrentRow.codeNo,
codeDesc: this.partCurrentRow.codeDesc,
recordType: 'IP',
itemList: this.itemSelections1
}
addPartItem(inData).then(({data}) => {
if (data && data.code === 0) {
getItemLists(inData).then(({data}) => {
this.itemList1 = data.row1
this.itemList2 = data.row2
})
this.getPartItem1()
this.itemSelections1 = []
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
},
addItem1 () {
if (this.itemSelections1 == null || this.itemSelections1.length === 0) {
this.$message.warning('请选择可选属性!')
return
}
let partList = this.partList1.filter(item => item.partNo&&item.partNo!==''&&item.buNo && item.buNo === this.searchData.buNo)
this.addItemLoading = true
let inDataList = []
for (let i = 0; i < partList.length; i++){
if (!partList[i].codeNo||partList[i].codeNo===''){
continue
}
inDataList.push({
site: partList[i].site,
buNo: partList[i].buNo,
partNo: partList[i].partNo,
codeNo: partList[i].codeNo,
codeDesc: partList[i].codeDesc,
recordType: 'IP',
itemList: this.itemSelections1
})
}
addPartsItem(inDataList).then(({data}) => {
if (data && data.code === 0) {
getItemLists(inDataList[0]).then(({data}) => {
this.itemList1 = data.row1
this.itemList2 = data.row2
this.addItemLoading = false
this.getPartItem2()
})
this.itemSelections1 = []
} else {
this.addItemLoading = false
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
}).catch((error) => {
this.addItemLoading = false
this.$message.error(error)
})
},
// 物料项目删除
deleteItem () {
if (this.itemSelections2 == null || this.itemSelections2.length === 0) {
this.$alert("请选择已有属性!", '提示', {
confirmButtonText: '确定'
})
return false
}
let inData = {
site: this.partCurrentRow.site,
buNo: this.partCurrentRow.buNo,
partNo: this.partCurrentRow.partNo,
codeNo: this.partCurrentRow.codeNo,
codeDesc: this.partCurrentRow.codeDesc,
recordType: 'IP',
itemList: this.itemSelections2
}
deletePartItem(inData).then(({data}) => {
if (data && data.code === 0) {
getItemLists(inData).then(({data}) => {
this.itemList1 = data.row1
this.itemList2 = data.row2
})
this.getPartItem1()
this.itemSelections2 = []
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
},
// 物料项目删除
deleteItem1 () {
if (this.itemSelections2 == null || this.itemSelections2.length === 0) {
this.$alert("请选择已有属性!", '提示', {
confirmButtonText: '确定'
})
return false
}
let partList = this.partList1.filter(item => item.partNo&&item.partNo!==''&&item.buNo && item.buNo === this.searchData.buNo)
let inDataList = []
for (let i = 0; i < partList.length; i++){
let items = JSON.parse(JSON.stringify(this.itemSelections2))
for (let j = 0; j < this.itemSelections2.length; j++) {
items[j].site = partList[i].site
items[j].buNo = partList[i].buNo
items[j].partNo = partList[i].partNo
items[j].codeNo = partList[i].codeNo
items[j].recordType = 'IP'
}
inDataList.push({
itemList: items
})
}
deletePartsItem(inDataList).then(({data}) => {
if (data && data.code === 0) {
this.$set(this.partList1[0], 'recordType', 'IP')
getItemLists(this.partList1[0]).then(({data}) => {
this.itemList1 = data.row1
this.itemList2 = data.row2
})
this.getPartItem2()
this.itemSelections2 = []
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
},
rowStyle({row}){
if(this.partCurrentRow&&row.nodeName===this.partCurrentRow.nodeName)
return { 'background-color': '#E8F7F6', cursor: 'pointer' };
},
bomRowStyle({row}){
if(this.bomCurrentRow&&row.engChgLevel===this.bomCurrentRow.engChgLevel)
return { 'background-color': '#E8F7F6', cursor: 'pointer' };
},
bomRowStyle1({row}){
if(this.bomCurrentRow1&&row.engChgLevel===this.bomCurrentRow1.engChgLevel)
return { 'background-color': '#E8F7F6', cursor: 'pointer' };
},
routingRowStyle({row}){
if(this.routingCurrentRow&&row.routingRevision===this.routingCurrentRow.routingRevision)
return { 'background-color': '#E8F7F6', cursor: 'pointer' };
},
routingRowStyle1({row}){
if(this.routingCurrentRow1&&row.routingRevision===this.routingCurrentRow1.routingRevision)
return { 'background-color': '#E8F7F6', cursor: 'pointer' };
},
partClickRow(row) {
this.partCurrentRow = JSON.parse(JSON.stringify(row))
this.partCurrentRowIndex = this.partList1.indexOf(row)
},
async handleEditInfo(){
if (this.attributeFlag===true){
this.getPropertiesList()
this.attributeFlag = false
} else {
for (let i = 0; i < this.partList1.length; i++) {
if (!this.partList1[i].partNo||this.partList1[i].partNo===''){
console.log('处理行数据',i+1)
// 没有物料编号就新增料号
// 没有填写物料描述就认为用户暂时不在这个节点新建料号
if (this.partList1[i].partDesc === '' || this.partList1[i].partDesc == null) {
console.log('没有物料描述的行数据',i+1)
continue
}
if (this.partList1[i].buNo === '' || this.partList1[i].buNo == null) {
console.log('没有BU的行数据',i+1)
this.$message.warning('请选择'+ this.partList1[i].nodeName +'节点的BU!')
return
}
if (this.partList1[i].partType2 === '' || this.partList1[i].partType2 == null) {
console.log('没有零件类型的行数据',i+1)
this.$message.warning('请选择'+ this.partList1[i].nodeName +'节点的零件类型!')
return
}
if (this.partList1[i].umId2 === '' || this.partList1[i].umId2 == null) {
console.log('没有计量单位的行数据',i+1)
this.$message.warning('请选择'+ this.partList1[i].nodeName +'节点的计量单位!')
return
}
if (this.partList1[i].partType2 === 'Purchased (raw)' && (this.partList1[i].familyID === '' || this.partList1[i].familyID == null)) {
console.log('没有物料分类的行数据',i+1)
this.$message.warning('请选择'+ this.partList1[i].nodeName +'节点的物料分类!')
return
}
if (this.partList1[i].partType2 !== 'Purchased (raw)' && (this.partList1[i].productGroupId1 === '' || this.partList1[i].productGroupId1 == null)) {
console.log('没有商品组1的行数据',i+1)
this.$message.warning('请选择'+ this.partList1[i].nodeName +'节点的商品组1!')
return
}
if (this.partList1[i].partType2 !== 'Purchased (raw)' && (this.partList1[i].productGroupId2 === '' || this.partList1[i].productGroupId2 == null)) {
console.log('没有商品组2的行数据',i+1)
this.$message.warning('请选择'+ this.partList1[i].nodeName +'节点的商品组2!')
return
}
if (this.partList1[i].codeNo === '' || this.partList1[i].codeNo == null) {
console.log('没有属性模板的行数据',i+1)
this.$message.warning('请选择'+ this.partList1[i].nodeName +'节点的属性模板!')
return
}
let flag = true
this.partList1[i].partNo = '*'
this.partList1[i].active = 'Y'
this.partList1[i].createBy = this.$store.state.user.name
this.partList1[i].mainPart = this.searchData.partNo
console.log('其他数据赋值完成',i+1)
// 创建物料
await savePartInfo(this.partList1[i]).then((data) => {
if (data.data && data.data.code === 0) {
console.log('创建物料成功',i+1)
this.partList1[i].partNo = data.data.rows.partNo
updatePartNoOfNode(this.partList1[i]).then((data) => {
if (data.data && data.data.code === 0) {
}else {
this.$message.error(data.msg)
}
})
} else {
this.$message.error(data.msg)
flag = false
}
})
if (!flag) {
return
}
}
}
this.partList1.forEach(item => this.$set(item, 'mainPart', this.searchData.partNo))
// 修改物料的属性
batchSavePartInfo(this.partList1.filter(item => item.partNo&&item.partNo!=='')).then(({data}) => {
if (data && data.code === 0){
this.handleBatchUpdatePart()
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
this.attributeFlag = true
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
}
},
handleBatchUpdateDialogClose(){
if (!this.attributeFlag||!this.attributeFlag1){
this.$confirm(`编辑尚未保存,是否关闭?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.batchUpdateFlag = false
})
} else {
this.batchUpdateFlag = false
}
},
getPropertiesList(){
const propLists = []
for (let i = 0; i <= this.partList1.length; i++) {
if (i === this.partList1.length){
propLists[i] = [
"Select UMID fieldname1, UMName caption1 from UM where site in (select site from eam_access_site where username = '"+this.$store.state.user.name+"') and site = '"+this.$store.state.user.site+"'",
"Select template_no fieldname1, template_name caption1 from plm_bom_template where site in (select site from eam_access_site where username = '"+this.$store.state.user.name+"') and site = '"+this.$store.state.user.site+"'",
]
} else {
propLists[i] = [
"select family_id fieldname1, family_name caption1 from part_family where active = 'Y' and site in (select site from eam_access_site where username = '"+this.$store.state.user.name+"') and (site + '-' + bu_no) in (select (a.site + '-' + a.bu_no) from AccessBu as a left join eam_access_site as b on a.site = b.site and a.username = b.username where a.username = '"+this.$store.state.user.name+"') and site = '"+this.$store.state.user.site+"' and bu_no = '"+this.partList1[i].buNo+"'",
"select product_group_id fieldname1,product_group_name caption1 from part_product_group where active = 'Y' and type = '1' and site in (select site from eam_access_site where username = '"+this.$store.state.user.name+"') and (site + '-' + bu_no) in (select (a.site + '-' + a.bu_no) from AccessBu as a left join eam_access_site as b on a.site = b.site and a.username = b.username where a.username = '"+this.$store.state.user.name+"') and site = '"+this.$store.state.user.site+"' and bu_no = '"+this.partList1[i].buNo+"'",
"select product_group_id fieldname1,product_group_name caption1 from part_product_group where active = 'Y' and type = '2' and site in (select site from eam_access_site where username = '"+this.$store.state.user.name+"') and (site + '-' + bu_no) in (select (a.site + '-' + a.bu_no) from AccessBu as a left join eam_access_site as b on a.site = b.site and a.username = b.username where a.username = '"+this.$store.state.user.name+"') and site = '"+this.$store.state.user.site+"' and bu_no = '"+this.partList1[i].buNo+"'",
"select product_group_id fieldname1,product_group_name caption1 from part_product_group where active = 'Y' and type = '3' and site in (select site from eam_access_site where username = '"+this.$store.state.user.name+"') and (site + '-' + bu_no) in (select (a.site + '-' + a.bu_no) from AccessBu as a left join eam_access_site as b on a.site = b.site and a.username = b.username where a.username = '"+this.$store.state.user.name+"') and site = '"+this.$store.state.user.site+"' and bu_no = '"+this.partList1[i].buNo+"'",
"Select code_no as fieldname1, code_desc as caption1 from plm_properties_model_header where function_type = 'IP' and active = 'Y' and (code_no like '%%' OR code_desc like '%%' ) and site in (select site from eam_access_site where username = '"+this.$store.state.user.name+"') and (site + '-' + bu_no) in (select (a.site + '-' + a.bu_no) from AccessBu as a left join eam_access_site as b on a.site = b.site and a.username = b.username where a.username = '"+this.$store.state.user.name+"') and site = '"+this.$store.state.user.site+"' and bu_no = '"+this.partList1[i].buNo+"'"
]
}
}
getChooselist1(propLists).then((data) => {
if (data.data && data.data.code === 0){
// 对 umList 进行排序,将"米"和"千张"放在最前面
let umList = data.data.list[this.partList1.length][0] || []
if (Array.isArray(umList) && umList.length > 0) {
try {
const priorityList = []
const otherList = []
umList.forEach(item => {
if (!item) return
const umid = String(item.fieldname1 || item.UMID || '')
const umName = String(item.caption1 || item.UMName || '')
const isQianZhang = umid === '1002' || umName.includes('千张')
const isMi = umName === '米' || (umName.includes('米') && umName.length <= 2 && !umName.includes('千'))
if (isMi || isQianZhang) {
priorityList.push({ item, isMi, isQianZhang })
} else {
otherList.push(item)
}
})
// 米优先,然后千张
priorityList.sort((a, b) => {
if (a.isMi && !b.isMi) return -1
if (!a.isMi && b.isMi) return 1
return 0
})
if (priorityList.length > 0) {
umList = [...priorityList.map(p => p.item), ...otherList]
}
} catch (error) {
console.warn('计量单位排序失败,使用原始顺序:', error)
}
}
for (let i = 0; i < this.partList1.length; i++) {
this.$set(this.partList1[i], 'umList', umList);
this.$set(this.partList1[i], 'partFamilyList', data.data.list[i][0]);
this.$set(this.partList1[i], 'partProductGroupList1', data.data.list[i][1]);
this.$set(this.partList1[i], 'partProductGroupList2', data.data.list[i][2]);
this.$set(this.partList1[i], 'partProductGroupList3', data.data.list[i][3]);
this.$set(this.partList1[i], 'codeList', data.data.list[i][4]);
this.$set(this.partList1[i], 'templateList', data.data.list[this.partList1.length][1]);
}
}
})
},
handleCodeNoChange(value) {
const previousValue = this.previousCodeNo;
let partList = []
for (let i = 0; i < this.partList1.length; i++) {
if (this.partList1[i].partNo&&this.partList1[i].partNo!==''&&this.partList1[i].buNo&&this.partList1[i].buNo === this.searchData.buNo){
let temp = {
site: this.$store.state.user.site,
partNo: this.partList1[i].partNo,
codeNo: value
}
partList.push(temp)
}
}
batchUpdateCodeNo(partList).then(({data}) => {
if (data&&data.code === 0){
this.handleBatchUpdatePart()
this.handleEditInfo()
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
} else {
this.$set(this.searchData, 'codeNo', previousValue)
this.$message({
message: data.msg,
type: 'error',
duration: 1500,
onClose: () => {}
})
}
})
},
async changeBuOfNode(row) {
this.buNoQueryLoading = true
row.familyId = ''
row.productGroupId1 = ''
row.productGroupId2 = ''
row.productGroupId3 = ''
row.codeNo = ''
row.bu = this.$store.state.user.site + '_' + row.buNo
const propLists = [
[
"select family_id fieldname1, family_name caption1 from part_family where active = 'Y' and site in (select site from eam_access_site where username = '"+this.$store.state.user.name+"') and (site + '-' + bu_no) in (select (a.site + '-' + a.bu_no) from AccessBu as a left join eam_access_site as b on a.site = b.site and a.username = b.username where a.username = '"+this.$store.state.user.name+"') and site = '"+this.$store.state.user.site+"' and bu_no = '"+row.buNo+"'",
"select product_group_id fieldname1,product_group_name caption1 from part_product_group where active = 'Y' and type = '1' and site in (select site from eam_access_site where username = '"+this.$store.state.user.name+"') and (site + '-' + bu_no) in (select (a.site + '-' + a.bu_no) from AccessBu as a left join eam_access_site as b on a.site = b.site and a.username = b.username where a.username = '"+this.$store.state.user.name+"') and site = '"+this.$store.state.user.site+"' and bu_no = '"+row.buNo+"'",
"select product_group_id fieldname1,product_group_name caption1 from part_product_group where active = 'Y' and type = '2' and site in (select site from eam_access_site where username = '"+this.$store.state.user.name+"') and (site + '-' + bu_no) in (select (a.site + '-' + a.bu_no) from AccessBu as a left join eam_access_site as b on a.site = b.site and a.username = b.username where a.username = '"+this.$store.state.user.name+"') and site = '"+this.$store.state.user.site+"' and bu_no = '"+row.buNo+"'",
"select product_group_id fieldname1,product_group_name caption1 from part_product_group where active = 'Y' and type = '3' and site in (select site from eam_access_site where username = '"+this.$store.state.user.name+"') and (site + '-' + bu_no) in (select (a.site + '-' + a.bu_no) from AccessBu as a left join eam_access_site as b on a.site = b.site and a.username = b.username where a.username = '"+this.$store.state.user.name+"') and site = '"+this.$store.state.user.site+"' and bu_no = '"+row.buNo+"'",
"Select code_no as fieldname1, code_desc as caption1 from plm_properties_model_header where function_type = 'IP' and active = 'Y' and (code_no like '%%' OR code_desc like '%%' ) and site in (select site from eam_access_site where username = '"+this.$store.state.user.name+"') and (site + '-' + bu_no) in (select (a.site + '-' + a.bu_no) from AccessBu as a left join eam_access_site as b on a.site = b.site and a.username = b.username where a.username = '"+this.$store.state.user.name+"') and site = '"+this.$store.state.user.site+"' and bu_no = '"+row.buNo+"'"
]
]
await getChooselist1(propLists).then((data) => {
if (data.data && data.data.code === 0){
this.$set(row, 'partFamilyList', data.data.list[0][0])
this.$set(row, 'partProductGroupList1', data.data.list[0][1])
this.$set(row, 'partProductGroupList2', data.data.list[0][2])
this.$set(row, 'partProductGroupList3', data.data.list[0][3])
this.$set(row, 'codeList', data.data.list[0][4])
}
})
await getTemplateList(row).then(({data}) => {
if (data && data.code === 0) {
this.$set(row, 'tempList', data.rows)
}
})
this.buNoQueryLoading = false
},
chooseTemplate(row){
chooseTemplate(row).then(({data}) => {
if (data&&data.code===0) {
Object.keys(data.data).forEach(key => {
if (key !== 'templateNo') {
row[key] = data.data[key];
}
});
row.umId2 = data.data.umId
row.familyID = data.data.familyId
if (row.partType2&&row.partType2==='Manufactured'){
row.templateNo = data.data.bomTemplateNo
row.templateName = data.data.bomTemplateName
}
}
})
},
getTemplateList() {
for (let i = 0; i < this.partList1.length; i++) {
getTemplateList(this.partList1[i]).then(({data}) => {
if (data && data.code === 0) {
this.partList1[i].tempList = data.rows
}
})
}
},
queryBomDetail(row) {
let tempData = {
flag: '2',
site: row.site,
buNo: row.buNo,
partNo: row.partNo,
partDesc: row.partDesc,
engChgLevel: row.engChgLevel,
bomType: row.bomType,
noteText: row.noteText,
effPhaseInDate: row.effPhaseInDate,
effPhaseOutDate: row.effPhaseOutDate,
engRevision: row.engRevision,
typeFlag: row.typeFlag,
netWeight: row.netWeight,
updateBy: this.$store.state.user.name,
printUnit: row.printUnit,
printUnitName: row.printUnitName,
alternativeNo: row.alternativeNo,
yieldRate: row.yieldRate,
shrinkageFactor: new Decimal(100).sub(new Decimal(row.yieldRate)).toNumber(),
processUnit: row.processUnit,
processUnitName: row.processUnitName
}
queryBomDetail(tempData).then(({data}) => {
if (data && data.code === 0) {
this.bomComponentPartList = data.rows.componentList
this.bomComponentList[row.index] = { ...this.bomComponentList[row.index], ...data.rows.detailData}
this.bomCurrentRow = JSON.parse(JSON.stringify(this.bomComponentList[0]))
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
},
queryBomDetail1(row) {
let tempData = {
flag: '2',
site: row.site,
buNo: row.buNo,
partNo: row.partNo,
partDesc: row.partDesc,
engChgLevel: row.engChgLevel,
bomType: row.bomType,
noteText: row.noteText,
effPhaseInDate: row.effPhaseInDate,
effPhaseOutDate: row.effPhaseOutDate,
engRevision: row.engRevision,
typeFlag: row.typeFlag,
netWeight: row.netWeight,
updateBy: this.$store.state.user.name,
printUnit: row.printUnit,
printUnitName: row.printUnitName,
alternativeNo: row.alternativeNo,
yieldRate: row.yieldRate,
shrinkageFactor: new Decimal(100).sub(new Decimal(row.yieldRate)).toNumber(),
processUnit: row.processUnit,
processUnitName: row.processUnitName
}
queryBomDetail(tempData).then(({data}) => {
if (data && data.code === 0) {
this.bomComponentPartList1 = data.rows.componentList
this.bomComponentList1[row.index] = { ...this.bomComponentList1[row.index], ...data.rows.detailData}
this.bomCurrentRow1 = JSON.parse(JSON.stringify(this.bomComponentList1[0]))
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
},
queryRoutingDetail (row) {
let tempData = {
flag: '2',
site: row.site,
buNo: row.buNo,
partNo: row.partNo,
partDesc: row.partDesc,
routingRevision: row.routingRevision,
routingType: row.routingType,
noteText: row.noteText,
phaseInDate: row.phaseInDate,
phaseOutDate: row.phaseOutDate,
engRevision: row.engRevision,
typeFlag: row.typeFlag,
netWeight: row.netWeight,
updateBy: this.$store.state.user.name,
printUnit: row.printUnit,
printUnitName: row.printUnitName,
alternativeNo: row.alternativeNo,
}
// 查routing明细
queryRoutingDetail(tempData).then(({data}) => {
if (data && data.code === 0) {
this.routingComponentPartList = data.rows.componentList
this.routingComponentList[row.index] = { ...this.routingComponentList[row.index], ...data.rows.detailData}
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
},
queryRoutingDetail1 (row) {
let tempData = {
flag: '2',
site: row.site,
buNo: row.buNo,
partNo: row.partNo,
partDesc: row.partDesc,
routingRevision: row.routingRevision,
routingType: row.routingType,
noteText: row.noteText,
phaseInDate: row.phaseInDate,
phaseOutDate: row.phaseOutDate,
engRevision: row.engRevision,
typeFlag: row.typeFlag,
netWeight: row.netWeight,
updateBy: this.$store.state.user.name,
printUnit: row.printUnit,
printUnitName: row.printUnitName,
alternativeNo: row.alternativeNo,
}
// 查routing明细
queryRoutingDetail(tempData).then(({data}) => {
if (data && data.code === 0) {
this.routingComponentPartList1 = data.rows.componentList
this.routingComponentList1[row.index] = { ...this.routingComponentList1[row.index], ...data.rows.detailData}
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
},
bomRowClick() {
let tempData = {
flag: '2',
site: this.bomCurrentRow.site,
buNo: this.bomCurrentRow.buNo,
partNo: this.bomCurrentRow.partNo,
partDesc: this.bomCurrentRow.partDesc,
engChgLevel: this.bomCurrentRow.engChgLevel,
bomType: this.bomCurrentRow.bomType,
noteText: this.bomCurrentRow.noteText,
effPhaseInDate: this.bomCurrentRow.effPhaseInDate,
effPhaseOutDate: this.bomCurrentRow.effPhaseOutDate,
engRevision: this.bomCurrentRow.engRevision,
typeFlag: this.bomCurrentRow.typeFlag,
netWeight: this.bomCurrentRow.netWeight,
updateBy: this.$store.state.user.name,
printUnit: this.bomCurrentRow.printUnit,
printUnitName: this.bomCurrentRow.printUnitName,
alternativeNo: this.bomCurrentRow.alternativeNo,
yieldRate: this.bomCurrentRow.yieldRate,
shrinkageFactor: new Decimal(100).sub(new Decimal(this.bomCurrentRow.yieldRate)).toNumber(),
processUnit: this.bomCurrentRow.processUnit,
processUnitName: this.bomCurrentRow.processUnitName
}
queryBomDetail(tempData).then(({data}) => {
if (data && data.code === 0) {
this.bomComponentPartList = data.rows.componentList
this.bomFlag = true
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
},
bomRowClick1() {
let tempData = {
flag: '2',
site: this.bomCurrentRow1.site,
buNo: this.bomCurrentRow1.buNo,
partNo: this.bomCurrentRow1.partNo,
partDesc: this.bomCurrentRow1.partDesc,
engChgLevel: this.bomCurrentRow1.engChgLevel,
bomType: this.bomCurrentRow1.bomType,
noteText: this.bomCurrentRow1.noteText,
effPhaseInDate: this.bomCurrentRow1.effPhaseInDate,
effPhaseOutDate: this.bomCurrentRow1.effPhaseOutDate,
engRevision: this.bomCurrentRow1.engRevision,
typeFlag: this.bomCurrentRow1.typeFlag,
netWeight: this.bomCurrentRow1.netWeight,
updateBy: this.$store.state.user.name,
printUnit: this.bomCurrentRow1.printUnit,
printUnitName: this.bomCurrentRow1.printUnitName,
alternativeNo: this.bomCurrentRow1.alternativeNo,
yieldRate: this.bomCurrentRow1.yieldRate,
shrinkageFactor: new Decimal(100).sub(new Decimal(this.bomCurrentRow1.yieldRate)).toNumber(),
processUnit: this.bomCurrentRow1.processUnit,
processUnitName: this.bomCurrentRow1.processUnitName
}
queryBomDetail(tempData).then(({data}) => {
if (data && data.code === 0) {
this.bomComponentPartList1 = data.rows.componentList
this.bomFlag1 = true
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
},
bomInfoRowClick(row) {
this.bomCurrentRow = JSON.parse(JSON.stringify(row))
this.bomRowClick()
},
bomInfoRowClick1(row) {
this.bomCurrentRow1 = JSON.parse(JSON.stringify(row))
this.bomRowClick1()
},
bomInfoTabClick() {
if (this.bomComponentList.length>0){
if (!this.bomCurrentRow) {
this.bomCurrentRow = this.bomComponentList[0]
}
this.bomRowClick()
}
},
bomInfoTabClick1() {
if (this.bomComponentList1.length>0){
if (!this.bomCurrentRow1) {
this.bomCurrentRow1 = this.bomComponentList1[0]
}
this.bomRowClick1()
}
},
bomInfoRowDblClick(row){
let tempData = {
site: this.$store.state.user.site,
partNo: row.partNo,
mainPart: this.searchData.partNo,
engChgLevel: row.engChgLevel,
routingRevision: this.partCurrentRow.routingRevision
}
setRevision(tempData).then(({data}) => {
if (data && data.code === 0) {
this.handleBatchUpdatePart()
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
}
})
},
bomInfoRowDblClick1(row){
this.$set(this.copyData.previousVersion, 'engChgLevel', row.engChgLevel)
this.$set(this.copyData.previousVersion, 'bomType', row.bomType)
},
routingInfoRowDblClick(row){
let tempData = {
site: this.$store.state.user.site,
partNo: row.partNo,
mainPart: this.searchData.partNo,
engChgLevel: this.partCurrentRow.engChgLevel,
routingRevision: row.routingRevision
}
setRevision(tempData).then(({data}) => {
if (data && data.code === 0) {
this.handleBatchUpdatePart()
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
}
})
},
routingInfoRowDblClick1(row){
this.copyData.previousVersion.routingRevision = row.routingRevision
this.copyData.previousVersion.routingType = row.routingType
},
routingInfoRowClick(row) {
this.routingCurrentRow = JSON.parse(JSON.stringify(row))
this.routingRowClick()
},
routingInfoRowClick1(row) {
this.routingCurrentRow1 = JSON.parse(JSON.stringify(row))
this.routingRowClick1()
},
routingInfoTabClick() {
if (this.routingComponentList.length>0) {
if (!this.routingCurrentRow) {
this.routingCurrentRow = this.routingComponentList[0]
}
this.routingRowClick()
}
},
routingInfoTabClick1() {
if (this.routingComponentList1.length>0) {
if (!this.routingCurrentRow1) {
this.routingCurrentRow1 = this.routingComponentList1[0]
}
this.routingRowClick1()
}
},
routingRowClick() {
let tempData = {
flag: '2',
site: this.routingCurrentRow.site,
buNo: this.routingCurrentRow.buNo,
partNo: this.routingCurrentRow.partNo,
partDesc: this.routingCurrentRow.partDesc,
routingRevision: this.routingCurrentRow.routingRevision,
routingType: this.routingCurrentRow.routingType,
noteText: this.routingCurrentRow.noteText,
phaseInDate: this.routingCurrentRow.phaseInDate,
phaseOutDate: this.routingCurrentRow.phaseOutDate,
engRevision: this.routingCurrentRow.engRevision,
typeFlag: this.routingCurrentRow.typeFlag,
netWeight: this.routingCurrentRow.netWeight,
updateBy: this.$store.state.user.name,
printUnit: this.routingCurrentRow.printUnit,
printUnitName: this.routingCurrentRow.printUnitName,
alternativeNo: this.routingCurrentRow.alternativeNo,
}
// 查routing明细
queryRoutingDetail(tempData).then(({data}) => {
if (data && data.code === 0) {
this.routingComponentPartList = data.rows.componentList
this.bomFlag = false
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
},
routingRowClick1() {
let tempData = {
flag: '2',
site: this.routingCurrentRow1.site,
buNo: this.routingCurrentRow1.buNo,
partNo: this.routingCurrentRow1.partNo,
partDesc: this.routingCurrentRow1.partDesc,
routingRevision: this.routingCurrentRow1.routingRevision,
routingType: this.routingCurrentRow1.routingType,
noteText: this.routingCurrentRow1.noteText,
phaseInDate: this.routingCurrentRow1.phaseInDate,
phaseOutDate: this.routingCurrentRow1.phaseOutDate,
engRevision: this.routingCurrentRow1.engRevision,
typeFlag: this.routingCurrentRow1.typeFlag,
netWeight: this.routingCurrentRow1.netWeight,
updateBy: this.$store.state.user.name,
printUnit: this.routingCurrentRow1.printUnit,
printUnitName: this.routingCurrentRow1.printUnitName,
alternativeNo: this.routingCurrentRow1.alternativeNo,
}
// 查routing明细
queryRoutingDetail(tempData).then(({data}) => {
if (data && data.code === 0) {
this.routingComponentPartList1 = data.rows.componentList
this.bomFlag1 = false
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
},
getFormula(value) {
switch (value) {
case '一复': case '熟化': case 'RFID前道检品':
return '人数/(速度x时间x效率)'
case '印刷': case 'RFID-蚀刻': case 'RFID-分切':
return '人数/(速度x时间x效率)/Printing lanes'
case '绑定': case 'RFID编码': case 'RFID编码打印':
return '人数/(UPH(每小时产量)*效率)*1KCT'
case 'RFID多条检测':
return '人数/(速度x时间xCDx效率)*1KCT'
case 'RFID复合模切检测':
return '人数/(速度x时间x效率x(CDx复合列数))*1KCT'
case 'RFID后道检品':
return '人数/UPH(每小时产量)*100%*1KCT'
case 'RFID自动贴标':
return '人数/(速度x时间x效率x(CDx贴标列数))*1KCT'
case 'Voyantic在线检测':
return '人数/(速度x时间x效率x(CDx检测列数))*1KCT'
case 'RFID包装':
return '人数/(日产量/8小时/17人均摊)*1KCT'
default:
return ''
}
},
getBomAndRoutingRevision(){
let list = []
for (let i = 0; i < this.partList1.length; i++) {
list.push({
site: this.partList1[i].site,
buNo: this.partList1[i].buNo,
partNo: this.partList1[i].partNo,
partDesc: this.partList1[i].partDesc,
printUnit: this.partList1[i].umId2,
printUnitName: this.partList1[i].umName,
bomType: 'Manufacturing',
routingType: 'Manufacturing',
nodeId: this.partList1[i].nodeId,
offFlag: '2'
})
}
getBomAndRoutingRevision(list).then(({data}) => {
if (data && data.code === 0) {
for (let i = 0; i <this.partList1.length; i++) {
this.$set(this.partList1[i], 'engChgLevelList', data.rows.engChgLevelList[this.partList1[i].nodeId])
this.$set(this.partList1[i], 'routingRevisionList', data.rows.routingRevisionList[this.partList1[i].nodeId])
}
}
})
},
updateRevision(row, type) {
if(type === 'bom') {
let tempData = {
site: this.$store.state.user.site,
partNo: row.partNo,
mainPart: this.searchData.partNo,
engChgLevel: row.engChgLevel,
routingRevision: this.partCurrentRow.routingRevision
}
setRevision(tempData).then(({data}) => {
if (data && data.code === 0) {
this.handleBatchUpdatePart()
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
}
})
} else if(type === 'routing') {
let tempData = {
site: this.$store.state.user.site,
partNo: row.partNo,
mainPart: this.searchData.partNo,
engChgLevel: this.partCurrentRow.engChgLevel,
routingRevision: row.routingRevision
}
setRevision(tempData).then(({data}) => {
if (data && data.code === 0) {
this.handleBatchUpdatePart()
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
}
})
}
},
handleCopy() {
this.copyData.partNo = this.partCurrentRow.partNo
this.copyData.partDesc = this.partCurrentRow.partDesc
this.copyData.buNo = this.partCurrentRow.buNo
this.copyData.bomType = 'Manufacturing'
this.copyData.routingType = 'Manufacturing'
this.copyData.effPhaseInDate = new Date()
this.copyVisible = true
},
queryCopyPartModal () {
this.copyModalData.limit = this.pageSize4
this.copyModalData.page = this.pageIndex4
this.copyModalData.site = this.searchData.site
this.copyModalData.buNo = this.searchData.buNo
// 查询所有物料
queryPartList(this.copyModalData).then(({data}) => {
if (data && data.code === 0) {
this.copyPartList = data.page.list
this.pageIndex4 = data.page.currPage
this.pageSize4 = data.page.pageSize
this.totalPage4 = data.page.totalCount
this.copyPartModelFlag = true
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
},
// 每页数
sizeChangeHandle4 (val) {
this.pageSize4 = val
this.pageIndex4 = 1
this.queryCopyPartModal()
},
// 当前页
currentChangeHandle4 (val) {
this.pageIndex4 = val
this.queryCopyPartModal()
},
getCopyRowData(row) {
getCopyRowData(row).then(({data}) => {
if (data && data.code === 0) {
this.copyData.previousVersion = data.rows
this.getRevisionInfo1(data.rows)
this.copyPartModelFlag = false
}
})
},
async copySave() {
if (!this.copyData.previousVersion.partNo) {
this.$message.warning('请先选择要复制的料号!')
return
}
if (this.copyData.bomFlag&&this.copyData.bomFlag==='Y'&&!this.copyData.previousVersion.engChgLevel) {
this.$message.warning('请选择要复制的BOM版本!')
return
}
if (this.copyData.routingFlag&&this.copyData.routingFlag==='Y'&&!this.copyData.previousVersion.routingRevision) {
this.$message.warning('请选择要复制的routing版本!')
return
}
let flag = true
if (!this.copyData.partNo||this.copyData.partNo==='') {
// 没有料号就先新建
if (this.copyData.previousVersion.buNo !== this.copyData.buNo) {
this.$message.warning('所选的被复制的物料的BU和新物料的不一致!')
return
}
this.copyData.partNo = '*'
this.copyData.active = 'Y'
this.copyData.createBy = this.$store.state.user.name
this.copyData.mainPart = this.searchData.partNo
this.copyData.bu = this.$store.state.user.site + '_' + this.copyData.buNo
this.copyData.partType2 = this.copyData.previousVersion.partType2
this.copyData.umId2 = this.copyData.previousVersion.umId2
this.copyData.productGroupId1 = this.copyData.previousVersion.productGroupId1
this.copyData.productGroupId2 = this.copyData.previousVersion.productGroupId2
this.copyData.productGroupId3 = this.copyData.previousVersion.productGroupId3
this.copyData.familyID = this.copyData.previousVersion.familyID
this.copyData.codeNo = this.copyData.previousVersion.codeNo
await savePartInfo(this.copyData).then(async ({data}) => {
if (data && data.code === 0) {
this.$set(this.partList1[this.partCurrentRowIndex], 'partNo', data.rows.partNo)
this.partList1[this.partCurrentRowIndex].mainPart = this.searchData.partNo
// 等待 updatePartNoOfNode 完成
const {data: updateNodeData} = await updatePartNoOfNode(this.partList1[this.partCurrentRowIndex]);
if (updateNodeData && updateNodeData.code === 0) {
this.copyData.partNo = this.partList1[this.partCurrentRowIndex].partNo;
} else {
this.$message.error(data.msg);
flag = false;
}
} else {
this.$message.error(data.msg)
flag = false
}
})
}
if (this.copyData.bomFlag&&this.copyData.bomFlag==='Y') {
await copyBom(this.copyData).then(({data}) => {
if (data && data.code === 0) {
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
flag = false
}
}).catch(()=>{
flag = false
})
}
if (this.copyData.routingFlag&&this.copyData.routingFlag==='Y') {
this.copyData.phaseInDate = this.copyData.effPhaseInDate
this.copyData.phaseOutDate = this.copyData.effPhaseOutDate
await copyRouting(this.copyData).then(({data}) => {
if (data && data.code === 0) {
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
flag = false
}
}).catch(()=>{
flag = false
})
}
if (flag) {
this.copyVisible = false
}
},
// 双击单元格开始编辑
startEditCell(rowIndex, columnProp, value) {
this.editingCell.rowIndex = rowIndex
this.editingCell.columnProp = columnProp
this.editingCell.value = value || ''
// 下一帧聚焦输入框
this.$nextTick(() => {
if (this.$refs.editInput && this.$refs.editInput[0]) {
this.$refs.editInput[0].focus()
}
})
},
// 保存单元格编辑
async saveEditCell(rowIndex, columnProp, columnLabel) {
// 防止重复保存
if (this.editingCell.isSaving) {
return
}
const newValue = this.editingCell.value
const oldValue = this.dataList[rowIndex][columnProp]
// 值未改变,直接取消编辑
if (newValue === oldValue) {
this.cancelEditCell()
return
}
this.editingCell.isSaving = true
// 显示loading
const loading = this.$loading({
lock: true,
text: '保存中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.5)'
})
try {
// 更新本地显示
this.$set(this.dataList[rowIndex], columnProp, newValue)
// 先获取当前属性的完整信息
let itemTemplate = null
await getPartItem({
site: this.$store.state.user.site,
buNo: this.searchData.buNo,
partNo: this.searchData.partNo,
codeNo: this.searchData.codeNo,
recordType: 'IP'
}).then(({data}) => {
if (data && data.code === 0 && data.rows) {
itemTemplate = data.rows.find(item => item.itemDesc === columnLabel)
}
})
if (!itemTemplate) {
loading.close()
this.$message.error('未找到属性配置')
this.$set(this.dataList[rowIndex], columnProp, oldValue)
this.editingCell.isSaving = false
this.cancelEditCell()
return
}
// 根据属性类型更新对应的值
if (itemTemplate.valueTypeDb === 'N') {
// 数值类型
const parsedValue = parseFloat(newValue)
if (newValue !== '' && isNaN(parsedValue)) {
loading.close()
this.$message.error('请输入有效的数值')
this.$set(this.dataList[rowIndex], columnProp, oldValue)
this.editingCell.isSaving = false
this.cancelEditCell()
return
}
itemTemplate.numValue = newValue === '' ? null : parsedValue
itemTemplate.textValue = ''
} else {
// 文本类型
itemTemplate.textValue = newValue || ''
itemTemplate.numValue = null
}
// 准备保存到后端
let tempData = {
site: this.$store.state.user.site,
buNo: this.searchData.buNo,
partNo: this.searchData.partNo,
codeNo: this.searchData.codeNo
}
// 获取所有物料
await partInfoByMainPart(tempData).then(({data}) => {
if (data && data.code === 0) {
this.$set(this, 'partList1', data.rows)
}
})
// 构建保存数据
let list = []
let partList = this.partList1.filter(item => item.buNo === this.searchData.buNo)
for (let i = 0; i < partList.length; i++) {
if (partList[i].partNo && partList[i].partNo !== '' && partList[i].buNo) {
// 克隆item对象并更新部分字段
let itemCopy = JSON.parse(JSON.stringify(itemTemplate))
itemCopy.site = partList[i].site
itemCopy.buNo = partList[i].buNo
itemCopy.partNo = partList[i].partNo
itemCopy.codeNo = partList[i].codeNo
itemCopy.recordType = 'IP'
list.push({
site: partList[i].site,
buNo: partList[i].buNo,
partNo: partList[i].partNo,
codeNo: partList[i].codeNo,
recordType: 'IP',
itemList: [itemCopy]
})
}
}
// 调用保存接口
commitItemsValue(list).then(({data}) => {
if (data && data.code === 0) {
this.$message.success('保存成功')
this.editingCell.isSaving = false
this.cancelEditCell()
// 关闭"保存中"的loading,创建"重新计算中"的loading
loading.close()
const recalcLoading = this.$loading({
lock: true,
text: '重新计算中,请稍后...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.5)'
})
// 重新计算BOM单位用量和Routing机器处理时间
const recalcData = {
site: this.searchData.site,
buNo: this.searchData.buNo,
partNo: this.searchData.partNo,
codeNo: this.searchData.codeNo
}
recalculateBomAndRouting(recalcData).then(({data}) => {
recalcLoading.close()
if (data && data.code === 0) {
this.$message.success('重新计算完成')
// 刷新当前节点的BOM和Routing数据
if (this.currentNode && this.currentNode.partNo) {
if (this.activeTable === 'routing_info') {
// 如果当前显示Routing,刷新Routing数据
this.getRoutingInfo(this.currentNode)
} else {
// 如果当前显示BOM,刷新BOM数据
this.getBomInfo2(this.currentNode)
}
}
} else {
this.$message.warning('重新计算失败,但属性已保存')
}
}).catch(error => {
recalcLoading.close()
this.$message.warning('重新计算失败,但属性已保存')
})
} else {
loading.close()
this.$message.error(data.msg || '保存失败')
this.$set(this.dataList[rowIndex], columnProp, oldValue)
this.editingCell.isSaving = false
this.cancelEditCell()
}
}).catch(error => {
loading.close()
this.$message.error('保存异常')
this.$set(this.dataList[rowIndex], columnProp, oldValue)
this.editingCell.isSaving = false
this.cancelEditCell()
})
} catch (error) {
loading.close()
this.$message.error('操作失败')
this.$set(this.dataList[rowIndex], columnProp, oldValue)
this.editingCell.isSaving = false
this.cancelEditCell()
}
},
// 取消单元格编辑
cancelEditCell() {
this.editingCell.rowIndex = -1
this.editingCell.columnProp = null
this.editingCell.value = ''
this.editingCell.isSaving = false
},
async itemUpdateSave() {
let tempData = {
site: this.$store.state.user.site,
buNo: this.searchData.buNo,
partNo: this.searchData.partNo,
codeNo: this.searchData.codeNo
}
await partInfoByMainPart(tempData).then(({data}) => {
if (data && data.code === 0){
this.$set(this, 'partList1', data.rows)
}else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
})
let list = []
let partList = this.partList1.filter(item => item.buNo === this.searchData.buNo)
for (let i = 0; i <this.partList1.length; i++) {
if (this.partList1[i].partNo&&this.partList1[i].partNo!==''&&this.partList1[i].buNo){
let items = JSON.parse(JSON.stringify(this.partItemList1))
items[0].site = this.searchData.site
items[0].buNo = partList[i].buNo
items[0].partNo = partList[i].partNo
items[0].codeNo = partList[i].codeNo
items[0].recordType = 'IP'
list.push({
site: this.partList1[i].site,
buNo: this.partList1[i].buNo,
partNo: this.partList1[i].partNo,
codeNo: this.partList1[i].codeNo,
recordType: 'IP',
itemList: items
})
}
}
commitItemsValue(list).then(({data}) => {
if (data && data.code === 0) {
this.getPartItem()
// this.autoCompute()
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {}
})
this.itemUpdateFlag = false
} else {
this.$alert(data.msg, '错误', {
confirmButtonText: '确定'
})
}
}).catch((error) => {
this.$message.error(error)
})
},
/**
* 打开ProcessTimeMatrix选择对话框
* 默认查询且只查询商品组编码为 G1701、G1702、G1703、G1704 的数据
*/
openPtmDialog() {
if (!this.attributeFlag1) {
this.$message.warning('请先保存当前编辑的内容!')
return
}
// 检查是否有选中的物料
if (!this.partList1 || this.partList1.length === 0) {
this.$message.warning('请先选择物料!')
return
}
// 获取第一个物料的信息
const firstPart = this.partList1[0]
// 保存当前BU编号
this.ptmCurrentBuNo = firstPart.buNo
// 显示加载提示
const loadingInstance = this.$loading({
lock: true,
text: '正在加载商品组数据...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.3)'
})
// 查询该BU下所有商品组1
const productGroupQuery = {
userName: this.$store.state.user.name,
type:'1',
limit :100,
page :1
}
productGroupInformationSearch(productGroupQuery).then(({data}) => {
if (data && data.code === 0) {
const allProductGroups = data.page.list || []
// 筛选出商品组编码为 G1701、G1702、G1703、G1704 的商品组
const targetProductGroupIds = ['G1701', 'G1702', 'G1703', 'G1704']
this.ptmProductGroupList = allProductGroups.filter(item =>
targetProductGroupIds.includes(item.productGroupId)
)
if (this.ptmProductGroupList.length === 0) {
loadingInstance.close()
this.$message.warning('未找到商品组编码为 G1701、G1702、G1703、G1704 的商品组!')
return
}
// 默认选中第一个筛选出的商品组
this.ptmSelectedProductGroupId = this.ptmProductGroupList[0].productGroupId
// 加载默认选中商品组的PTM数据
this.loadPtmDataByProductGroup(this.ptmSelectedProductGroupId, loadingInstance)
} else {
loadingInstance.close()
this.$alert(data.msg || '查询商品组失败', '错误', {
confirmButtonText: '确定'
})
}
}).catch(error => {
loadingInstance.close()
this.$message.error('查询商品组异常')
console.error(error)
})
},
/**
* 根据商品组ID加载PTM数据
* @param productGroupId 商品组ID
* @param loadingInstance loading实例(可选)
*/
loadPtmDataByProductGroup(productGroupId, loadingInstance) {
if (!productGroupId) {
if (loadingInstance) loadingInstance.close()
this.$message.warning('请选择商品组1!')
return
}
// 如果没有传入loading实例,创建一个新的
if (!loadingInstance) {
loadingInstance = this.$loading({
lock: true,
text: '正在加载ProcessTimeMatrix数据...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.3)'
})
} else {
// 更新loading文本
loadingInstance.text = '正在加载ProcessTimeMatrix数据...'
}
// 查询该商品组下所有PTM条件及其参数(一次查询)
const queryData = {
site: this.$store.state.user.site,
buNo: this.ptmCurrentBuNo,
productGroupId: productGroupId
}
batchSearchProductGroupPtmConditionsWithItems(queryData).then(({data}) => {
loadingInstance.close()
if (data && data.code === 0) {
const ptmConditions = data.conditions || []
const allItems = data.items || []
if (ptmConditions.length === 0) {
this.$message.info('该商品组下未配置PTM参数')
// 清空数据
this.ptmDataList = []
this.filteredPtmDataList = []
this.ptmColumnList = []
// 打开对话框(显示空表格)
this.ptmDialogVisible = true
return
}
if (allItems.length === 0) {
this.$message.info('该商品组的PTM配置中没有参数')
// 清空数据
this.ptmDataList = []
this.filteredPtmDataList = []
this.ptmColumnList = []
// 打开对话框(显示空表格)
this.ptmDialogVisible = true
return
}
// 处理数据:将items按conditionId分组
this.processPtmData(ptmConditions, allItems)
} else {
this.$alert(data.msg || '查询PTM条件失败', '错误', {
confirmButtonText: '确定'
})
}
}).catch(error => {
loadingInstance.close()
this.$message.error('查询PTM条件异常')
console.error(error)
})
},
/**
* 处理商品组切换事件
* @param productGroupId 新选中的商品组ID
*/
handleProductGroupChange(productGroupId) {
if (!productGroupId) {
// 清空数据
this.ptmDataList = []
this.filteredPtmDataList = []
this.ptmColumnList = []
return
}
// 重新加载PTM数据
this.loadPtmDataByProductGroup(productGroupId)
},
/**
* 处理PTM数据(横向展示)
* 将后端返回的数据处理成表格展示格式
* @param ptmConditions PTM条件列表
* @param allItems 所有参数列表
*/
processPtmData(ptmConditions, allItems) {
const flatDataList = []
const columnSet = new Set()
const columnMap = new Map()
// 将items按conditionId分组
const itemsByCondition = {}
allItems.forEach(item => {
if (!itemsByCondition[item.conditionId]) {
itemsByCondition[item.conditionId] = []
}
itemsByCondition[item.conditionId].push(item)
// 收集唯一的列信息
if (!columnSet.has(item.itemNo)) {
columnSet.add(item.itemNo)
columnMap.set(item.itemNo, {
itemNo: item.itemNo,
itemDesc: item.itemDesc,
valueType: item.valueTypeDb,
valueChooseFlag: item.valueChooseFlag
})
}
})
// 构建表格数据
ptmConditions.forEach(condition => {
const items = itemsByCondition[condition.conditionId] || []
if (items.length === 0) {
return
}
// 构建一行数据:包含conditionDesc和所有参数的值
const rowData = {
conditionId: condition.conditionId,
conditionDesc: condition.conditionDesc,
seqNo: condition.seqNo,
site: condition.site,
buNo: condition.buNo,
productGroupId: condition.productGroupId,
items: items // 保存原始items数据,用于后续添加操作
}
// 将每个参数转换为列数据
items.forEach(item => {
const propName = `param_${item.itemNo}`
const displayValue = item.valueTypeDb === 'T' ? item.textValue : item.numValue
rowData[propName] = displayValue || '-'
})
flatDataList.push(rowData)
})
// 构建动态列配置
const columns = []
columnMap.forEach((colInfo, itemNo) => {
columns.push({
prop: `param_${itemNo}`,
label: colInfo.itemDesc || itemNo,
itemNo: itemNo,
valueType: colInfo.valueType,
width: 110,
align: colInfo.valueType === 'N' ? 'right' : 'left'
})
})
// 按itemNo排序列
columns.sort((a, b) => a.itemNo.localeCompare(b.itemNo))
// 设置数据并打开对话框
this.ptmDataList = flatDataList
this.filteredPtmDataList = flatDataList
this.ptmColumnList = columns
this.ptmSearchCode = ''
this.ptmDialogVisible = true
this.$message.success(`已加载 ${flatDataList.length} 个 ProcessTimeMatrix(共 ${columns.length} 个参数列)`)
},
/**
* 处理双击PTM行事件
* @param row 双击的行数据
*/
handlePtmRowDoubleClick(row) {
if (!row || !row.items || row.items.length === 0) {
this.$message.warning('该ProcessTimeMatrix没有参数!')
return
}
// 显示loading
const loadingInstance = this.$loading({
lock: true,
text: '正在添加参数...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.3)'
})
// 直接添加该行的参数
this.addPtmItemsFromRow(row, loadingInstance)
},
/**
* 筛选PTM列表(按Code条件描述)
*/
filterPtmList() {
if (!this.ptmSearchCode || this.ptmSearchCode.trim() === '') {
this.filteredPtmDataList = this.ptmDataList
return
}
const searchText = this.ptmSearchCode.trim().toLowerCase()
this.filteredPtmDataList = this.ptmDataList.filter(row => {
return row.conditionDesc && row.conditionDesc.toLowerCase().includes(searchText)
})
if (this.filteredPtmDataList.length === 0) {
this.$message.info('没有找到匹配的ProcessTimeMatrix')
} else {
this.$message.success(`找到 ${this.filteredPtmDataList.length} 条匹配的ProcessTimeMatrix`)
}
},
/**
* 重置PTM筛选
*/
resetPtmFilter() {
this.ptmSearchCode = ''
this.filteredPtmDataList = this.ptmDataList
this.$message.info('已重置筛选条件')
},
/**
* 添加选中的PTM行的参数到物料属性列表
* @param row 双击的行数据
* @param loadingInstance loading实例
*/
addPtmItemsFromRow(row, loadingInstance) {
// 从行中提取参数,并转换为后端期望的格式
const allItems = []
if (row.items && row.items.length > 0) {
row.items.forEach(item => {
// 转换为后端期望的格式
const itemData = {
itNo: item.itemNo, // 属性编码(后端接口字段名为itNo)
valueTypeDb: item.valueTypeDb,
itemDesc: item.itemDesc
}
// 根据类型设置值
if (item.valueTypeDb === 'T') {
itemData.textValue = item.textValue || null
itemData.numValue = null
} else if (item.valueTypeDb === 'N') {
itemData.textValue = null
// 确保numValue是数值类型
itemData.numValue = item.numValue !== null && item.numValue !== undefined && item.numValue !== ''
? (typeof item.numValue === 'number' ? item.numValue : parseFloat(item.numValue))
: null
}
allItems.push(itemData)
})
}
if (allItems.length === 0) {
loadingInstance.close()
this.$message.warning('选中的ProcessTimeMatrix中没有参数!')
return
}
// 使用与addItem1相同的逻辑
const partList = this.partList1.filter(item =>
item.partNo && item.partNo !== '' && item.buNo && item.buNo === this.searchData.buNo
)
if (partList.length === 0) {
loadingInstance.close()
this.$message.warning('没有符合条件的物料!')
return
}
const inDataList = []
for (let i = 0; i < partList.length; i++) {
if (!partList[i].codeNo || partList[i].codeNo === '') {
continue
}
inDataList.push({
site: partList[i].site,
buNo: partList[i].buNo,
partNo: partList[i].partNo,
codeNo: partList[i].codeNo,
codeDesc: partList[i].codeDesc,
recordType: 'IP',
itemList: allItems
})
}
if (inDataList.length === 0) {
loadingInstance.close()
this.$message.warning('请确保物料已配置属性模板(codeNo)!')
return
}
// 调用批量添加接口(与addItem1相同的逻辑)
addPartsItem(inDataList).then(({data}) => {
if (data && data.code === 0) {
// 更新可选属性列表和已有属性列表
getItemLists(inDataList[0]).then(({data}) => {
this.itemList1 = data.row1
this.itemList2 = data.row2
loadingInstance.close()
// 刷新物料属性列表
this.getPartItem2()
this.$message.success(`成功添加 ${allItems.length} 个参数(ProcessTimeMatrix: ${row.conditionDesc}`)
// 关闭对话框
this.ptmDialogVisible = false
// 清空数据
this.ptmDataList = []
this.filteredPtmDataList = []
this.ptmColumnList = []
}).catch(error => {
loadingInstance.close()
this.getPartItem2()
this.$message.success(`成功添加 ${allItems.length} 个参数(ProcessTimeMatrix: ${row.conditionDesc}`)
this.ptmDialogVisible = false
this.ptmDataList = []
this.filteredPtmDataList = []
this.ptmColumnList = []
})
} else {
loadingInstance.close()
this.$alert(data.msg || '添加属性失败', '错误', {
confirmButtonText: '确定'
})
}
}).catch(error => {
loadingInstance.close()
this.$message.error('添加属性异常: ' + error.message)
console.error(error)
})
},
},
}
</script>
<style lang="scss" scoped>
.ndoe-list__input {
> .el-input__inner {
cursor: pointer;
}
}
.white-body-view {
width: 100%;
min-width: 320px;
}
// 单元格编辑样式
::v-deep .el-table__body-wrapper {
.el-table__row {
.cell {
div[style*="cursor: pointer"] {
&:hover {
background-color: #f5f7fa;
border-radius: 2px;
transition: background-color 0.2s;
}
}
}
}
}
.structure-tree {
.el-scrollbar .el-scrollbar__wrap {
overflow-x: hidden;
}
#my-tree .el-tree > .el-tree-node {
min-width: 100%;
display: inline-block;
}
.el-tree-node__content {
margin-bottom: 10px;
}
.tooltip {
margin-right: 5px;
font-size: 13px;
border-radius: 4px;
box-sizing: border-box;
white-space: nowrap;
padding: 4px;
}
.operation-view {
display: inline-block;
padding: 0px 5px;
margin-left: 5px;
color: #777777;
}
.small-operation-btn {
margin: 0px 3px;
}
}
.el-icon-plus:hover {
color: #1c92e0;
}
.el-icon-edit:hover {
color: #1c92e0;
}
.el-icon-delete:hover {
color: #1c92e0;
}
::v-deep .el-tree {
color: #333333;
}
.el-table /deep/ .cell{
height: auto;
line-height: 1.5;
}
/deep/ .customer-tab .el-tabs__item {
height: 35px;
line-height: 38px;
font-size: 13px;
}
.down-tree{
//height: 470px;
display: block;
overflow-y: scroll;
}
</style>