| | |
| | | @row-click="handleMapingClick" @row-dblclick="handleMapingRowClick" |
| | | @selection-change="selectionChange" |
| | | @select-all="handleSelectAll"> |
| | | <template slot="radio" |
| | | slot-scope="{row}"> |
| | | |
| | | <el-radio v-model="selectRow" :label="row.$index">-</el-radio> |
| | | </template> |
| | | <template slot="menuLeft"> |
| | | <!-- <el-button :disabled="disabledPush" icon="el-icon-plus" size="small" type="primary"--> |
| | | <!-- @click="dialogPush = true">新 增--> |
| | | <!-- </el-button>--> |
| | | <el-button icon="el-icon-check" size="small" type="primary" @click="handleSave">保 存 |
| | | <!-- <el-button :disabled="disabledPush" icon="el-icon-plus" size="small" type="primary"--> |
| | | <!-- @click="dialogPush = true">新 增--> |
| | | <!-- </el-button>--> |
| | | <el-button v-if="permissionList.saveBtn" icon="el-icon-check" size="small" type="primary" |
| | | @click="handleSave">保 存 |
| | | </el-button> |
| | | <el-button icon="el-icon-connection" size="small" type="primary" |
| | | @click="handleSync('all')">同步主模型 |
| | | <el-button v-if="permissionList.allSyncBtn" icon="el-icon-connection" size="small" |
| | | type="primary" @click="handleSync('all')">同步主模型 |
| | | </el-button> |
| | | <el-button icon="el-icon-connection" size="small" type="primary" |
| | | @click="handleSync('one')">同步详细模型 |
| | | <el-button v-if="permissionList.oneSyncBtn" icon="el-icon-connection" size="small" |
| | | type="primary" @click="handleSync('one')">同步详细模型 |
| | | </el-button> |
| | | <el-button v-if="permissionList.autoBtn" icon="el-icon-coordinate" size="small" |
| | | type="primary" @click="handlerAuto">自动填充 |
| | | </el-button> |
| | | </template> |
| | | </avue-crud> |
| | |
| | | <avue-crud ref="crudRange" :data="rangeData" :option="optinoRange" :style="{ marginTop: '-20px'}" |
| | | @row-update="handleUpdate" |
| | | @row-dblclick="handleRowClick"> |
| | | <template slot="menuLeft"> |
| | | <el-button v-if="permissionList.bottomAutoBtn" icon="el-icon-coordinate" size="small" |
| | | type="primary" @click="handlerBottomAuto">自动填充 |
| | | </el-button> |
| | | </template> |
| | | </avue-crud> |
| | | </el-card> |
| | | </el-card> |
| | |
| | | <script> |
| | | import integrationTransfer from './integrationTransfer.vue' |
| | | import pinyin from 'js-pinyin' |
| | | import {mapGetters} from "vuex"; |
| | | import { |
| | | referCodeClassifyTree, |
| | | referTree, |
| | |
| | | listCodeAttributeByClassId, |
| | | syncClassifyModel |
| | | } from '@/api/integration/integration.js' |
| | | import {getPage} from "@/api/omd/OmdAttribute"; |
| | | import {getByGroupAttrMapping, getEnumAttrByClsOidAndAttrId} from "@/api/vciAttrbute"; |
| | | |
| | | export default { |
| | | components: { |
| | |
| | | highlightCurrentRow: true, |
| | | } |
| | | return { |
| | | selectRow: "", |
| | | targetNameList: [], // 元数据返回名称 |
| | | defaultCheckedKeys: [], |
| | | isNodeDisabled: true, |
| | |
| | | optinoRange: { |
| | | title: '属性映射取值范围', |
| | | maxHeight: '280px', |
| | | header: false, |
| | | rowKey: 'oid', |
| | | refreshBtn: false, |
| | | column: [ |
| | | {label: '属性集团枚举值', prop: 'numTextValue', minWidth: 80}, |
| | | {label: '集团属性枚举显示名称', prop: 'numText', minWidth: 80}, |
| | |
| | | refreshBtn: false, |
| | | delBtn: false, |
| | | addBtn: false, |
| | | index: true, |
| | | columnBtn: false, |
| | | searchShow: true, |
| | | emptyBtn: false, |
| | |
| | | border: true, |
| | | searchMenuSpan: 8, |
| | | highlightCurrentRow: true, |
| | | $cellEdit:true, |
| | | $cellEdit: true, |
| | | column: [ |
| | | {label: '', prop: 'radio', width: 60, hide: false}, |
| | | {label: '集团分类', prop: 'sourceClassifyName', minWidth: 80}, |
| | | {label: '所属视图', prop: 'viewName', minWidth: 80}, |
| | | {label: '集团属性', prop: 'sourceAttrName', minWidth: 80}, |
| | |
| | | prop: 'targetAttrName', |
| | | type: 'select', |
| | | cell: true, |
| | | allowCreate: true, |
| | | filterable: true, |
| | | minWidth: 80, |
| | | props:{ |
| | | label:'targetAttrName', |
| | | value:'targetAttrName' |
| | | props: { |
| | | label: 'targetAttrName', |
| | | value: 'targetAttrName' |
| | | }, |
| | | dicData: this.targetNameList, |
| | | dicData: [], |
| | | }, |
| | | // { |
| | | // label: '默认值', |
| | |
| | | mappingForm: {}, |
| | | // 定时器 |
| | | times: null, |
| | | TreeSelectOid: "" |
| | | TreeOid: "", |
| | | tableSelectId: '' |
| | | |
| | | } |
| | | }, |
| | |
| | | }, |
| | | targetColumn() { |
| | | return this.optionMapping.column.find(column => column.prop === 'targetAttrName'); |
| | | } |
| | | }, |
| | | ...mapGetters(["permission"]), |
| | | permissionList() { |
| | | return { |
| | | allSyncBtn: this.vaildData(this.permission.integration.integration_allSync, false), |
| | | autoBtn: this.vaildData(this.permission.integration.integration_auto, false), |
| | | bottomAutoBtn: this.vaildData(this.permission.integration.integration_bottomAuto, false), |
| | | oneSyncBtn: this.vaildData(this.permission.integration.integration_oneSync, false), |
| | | saveBtn: this.vaildData(this.permission.integration.integration_save, false), |
| | | } |
| | | }, |
| | | }, |
| | | methods: { |
| | | handlerAuto() { |
| | | if (!this.TreeOid || this.TreeOid === "") { |
| | | return; |
| | | } |
| | | // 过滤出集团属性的key值 |
| | | const groupArray = this.mappingData ? this.mappingData.map(obj => obj.sourceAttrKey) : []; |
| | | // 获取到需要自动填充的值 |
| | | getByGroupAttrMapping({classifyId: this.TreeOid, groupAttrKeyList: groupArray}) |
| | | .then(res => { |
| | | // 单独把返回值的groupAttrKey放一个数组,然后过滤出返回值的groupAttrKey是否等于表格数据中的sourceAttrKey |
| | | // const groupReturnData = res.data && res.data.data ? res.data.data.map(item => item.groupAttrKey) : []; |
| | | const groupReturnData = res.data.data; |
| | | // 过滤匹配 |
| | | this.mappingData.forEach(mappingItem => { |
| | | groupReturnData.forEach(groupItem => { |
| | | if (mappingItem.sourceAttrKey === groupItem.groupAttrKey) { |
| | | const result = this.transferData.find(obj => obj.id.toLowerCase() === groupItem.codeMetaAttrKey.toLowerCase()); |
| | | if (result) { |
| | | mappingItem.targetAttrId = groupItem.codeMetaAttrOid.toLowerCase(); |
| | | mappingItem.targetAttrName = groupItem.codeMetaAttrName.toLowerCase(); |
| | | mappingItem.targetAttrKey = groupItem.codeMetaAttrKey.toLowerCase(); |
| | | } else { |
| | | mappingItem.targetAttrId = ''; |
| | | mappingItem.targetAttrName = ''; |
| | | mappingItem.targetAttrKey = ''; |
| | | } |
| | | } |
| | | }) |
| | | }) |
| | | this.$message.success('自动填充成功,请确认属性后点击保存!'); |
| | | }) |
| | | .catch(error => { |
| | | this.$message.error('填充失败,请稍后再试!'); |
| | | }); |
| | | }, |
| | | handlerBottomAuto() { |
| | | if (this.rangeData.length <= 0) { |
| | | this.$message.warning('请选择一条枚举类型属性!') |
| | | return |
| | | } |
| | | getEnumAttrByClsOidAndAttrId({classifyId: this.TreeOid, codeMetaAttrKey: this.tableSelectId}).then(res => { |
| | | const data = res.data.data; |
| | | this.rangeData.forEach(rangeItem => { |
| | | data.forEach(dataItem => { |
| | | const similarity = this.calculateSimilarity(rangeItem.numText, dataItem.itemName); |
| | | if (similarity > 70) { |
| | | rangeItem.targetNumTextValue = rangeItem.numTextValue; |
| | | rangeItem.targetNumText = dataItem.itemName; |
| | | } |
| | | }) |
| | | }) |
| | | this.$message.success('自动填充成功,请确认属性后点击保存!') |
| | | }) |
| | | }, |
| | | calculateSimilarity(str1, str2) { |
| | | // 计算编辑距离 |
| | | function editDistance(s1, s2) { |
| | | s1 = s1.toLowerCase(); |
| | | s2 = s2.toLowerCase(); |
| | | |
| | | const costs = []; |
| | | for (let i = 0; i <= s1.length; i++) { |
| | | let lastValue = i; |
| | | for (let j = 0; j <= s2.length; j++) { |
| | | if (i === 0) |
| | | costs[j] = j; |
| | | else { |
| | | if (j > 0) { |
| | | let newValue = costs[j - 1]; |
| | | if (s1.charAt(i - 1) !== s2.charAt(j - 1)) |
| | | newValue = Math.min(Math.min(newValue, lastValue), |
| | | costs[j]) + 1; |
| | | costs[j - 1] = lastValue; |
| | | lastValue = newValue; |
| | | } |
| | | } |
| | | } |
| | | if (i > 0) |
| | | costs[s2.length] = lastValue; |
| | | } |
| | | return costs[s2.length]; |
| | | } |
| | | |
| | | // 计算相似度百分比 |
| | | function similarityPercent(s1, s2) { |
| | | let maxLength = Math.max(s1.length, s2.length); |
| | | let distance = editDistance(s1, s2); |
| | | return ((maxLength - distance) / maxLength) * 100; |
| | | } |
| | | |
| | | // 调用相似度计算函数并返回百分比形式的相似度 |
| | | const similarity = similarityPercent(str1, str2); |
| | | return similarity; |
| | | }, |
| | | getTargetName(data) { |
| | | this.targetColumn.dicData = data.filter(item => item.name && item.name.trim() !== "") // 过滤掉name为空的属性 |
| | | .map(item => { |
| | |
| | | targetAttrId: item.oid, |
| | | targetAttrKey: item.id, |
| | | targetAttrName: item.name, |
| | | disabled:false |
| | | // disabled: false |
| | | } |
| | | }); |
| | | }, |
| | |
| | | this.loading = false |
| | | this.mappingData = response.data.data |
| | | |
| | | for (const item of this.mappingData){ |
| | | if(item.targetAttrName && item.targetAttrId && item.targetAttrKey){ |
| | | const targetObject = this.targetColumn.dicData.find(obj => obj.targetAttrName === item.targetAttrName); |
| | | targetObject.disabled = true; |
| | | } |
| | | } |
| | | // for (const item of this.mappingData) { |
| | | // if (item.targetAttrName && item.targetAttrId && item.targetAttrKey) { |
| | | // const targetObject = this.targetColumn.dicData.find(obj => obj.targetAttrName === item.targetAttrName); |
| | | // targetObject.disabled = true; |
| | | // } |
| | | // } |
| | | } |
| | | }, |
| | | // 接口获取属性映射取值范围 |
| | |
| | | this.rangeData = [] |
| | | const response = await gridAttrRanges({meatId: oid}) |
| | | if (response.status === 200) { |
| | | // console.log(response.data) |
| | | this.rangeData = response.data.data |
| | | } |
| | | }, |
| | |
| | | }, |
| | | // 保存按钮 |
| | | async handleSave() { |
| | | const getTargetCorresponding = (row) =>{ |
| | | const getTargetCorresponding = (row) => { |
| | | return this.targetColumn.dicData.find(column => column.targetAttrName === row.targetAttrName); |
| | | } |
| | | for (const item of this.mappingData) { |
| | | item.$cellEdit = false; |
| | | if(item.targetAttrName){ |
| | | const { targetAttrId, targetAttrKey, targetAttrName } = await getTargetCorresponding(item); |
| | | Object.assign(item, { targetAttrId, targetAttrKey, targetAttrName }); |
| | | if (item.targetAttrName && !item.targetAttrId && !item.targetAttrKey) { |
| | | const {targetAttrId, targetAttrKey, targetAttrName} = await getTargetCorresponding(item); |
| | | Object.assign(item, {targetAttrId, targetAttrKey, targetAttrName}); |
| | | } |
| | | } |
| | | this.mappingData[this.selectRow].dockingPreAttrRangeVoList = (this.rangeData) |
| | | const response = await batchAddSave({dockingPreAttrMappingVOList: this.mappingData}) |
| | | if (response.status === 200) { |
| | | this.$message({ |
| | |
| | | } |
| | | }, |
| | | handelTransferSave(event) { |
| | | // console.log(event) |
| | | let that = this |
| | | const transferValue = event.value |
| | | if (Object.keys(that.mappingForm).length == 0) { |
| | |
| | | }, |
| | | // 左侧树点击 |
| | | handelTreeCell(event) { |
| | | this.TreeOid = event.oid; |
| | | this.treeParam.codeClassifyId = event.oid |
| | | this.form.groupValue = '' |
| | | this.groupVal = '' |
| | |
| | | }, |
| | | // 集团映射属性行选择(单击) |
| | | handleMapingClick(row) { |
| | | // console.log(row) |
| | | this.tableSelectId = row.targetAttrKey || ""; |
| | | this.selectRow = row.$index; |
| | | clearTimeout(this.times) |
| | | this.mappingForm = row |
| | | this.times = setTimeout(() => { |
| | |
| | | } |
| | | |
| | | // 获取目标属性信息 |
| | | const { targetAttrId, targetAttrKey, targetAttrName } = await getTargetCorresponding(row); |
| | | const {targetAttrId, targetAttrKey, targetAttrName} = await getTargetCorresponding(row); |
| | | |
| | | |
| | | // 更新行数据 |
| | | Object.assign(row, { targetAttrId, targetAttrKey, targetAttrName }); |
| | | Object.assign(row, { |
| | | targetAttrId: targetAttrId.toLowerCase(), |
| | | targetAttrKey: targetAttrKey.toLowerCase(), |
| | | targetAttrName: targetAttrName.toLowerCase() |
| | | }); |
| | | |
| | | const response = await batchAddSave({ dockingPreAttrMappingVOList: this.mappingData }); |
| | | const response = await batchAddSave({dockingPreAttrMappingVOList: [row]}); |
| | | |
| | | if (response.status === 200) { |
| | | this.$message({ |
| | |
| | | }); |
| | | } |
| | | } catch (error) { |
| | | console.error('处理映射更新时出错:', error); |
| | | this.$message.error(error) |
| | | } finally { |
| | | done(); |
| | | } |
| | |
| | | } |
| | | }, |
| | | setCurrentRow(selection, row) { |
| | | |
| | | this.mappingForm = row |
| | | this.disabledPush = false |
| | | }, |
| | | handleSelectAll(selection) { |
| | | this.$refs.crudMapping.toggleSelection() |
| | | } |
| | | }, |
| | | |
| | | } |
| | | } |
| | | </script> |
| | |
| | | .el-transfer-panel { |
| | | width: 270px; |
| | | } |
| | | .el-scrollbar__view { |
| | | height: 100px ; |
| | | |
| | | .el-scrollbar__view { |
| | | height: 100px; |
| | | } |
| | | } |
| | | |