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
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>
|
|
|
|
|