From eaff2fbd473362115c8c45e22b86b2ecb73e5a97 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 10 九月 2026 15:17:12 +0800
Subject: [PATCH] 新疆——新聚lims 1.标准库层级需要修改层级,行业-标准,总共两级;实验室换成行业 2.每个标准下的检验项列表加一个搜索查询功能
---
src/views/standard/standardLibrary/index.vue | 503 ++++++++++-------------------------
vue.config.js | 4
src/views/business/productOrder/components/addOrder.vue | 133 +++-----
src/utils/standardTree.js | 77 +++++
src/views/standard/standardLibrary/components/BatchCopy.vue | 89 ++----
5 files changed, 304 insertions(+), 502 deletions(-)
diff --git a/src/utils/standardTree.js b/src/utils/standardTree.js
new file mode 100644
index 0000000..458f12d
--- /dev/null
+++ b/src/utils/standardTree.js
@@ -0,0 +1,77 @@
+/**
+ * 鏍囧噯搴撴爲閫氱敤宸ュ叿
+ *
+ * 灞傜骇涓嶅浐瀹氾細children 涓� null / undefined / 绌烘暟缁勭殑鑺傜偣鍗充负銆屾爣鍑嗐�嶅彾瀛愩��
+ * 鏍戣矾寰勭粺涓�鐢� " - " 杩炴帴锛屾牸寮忎笌鍘嗗彶瀹炵幇閫愬瓧鑺備繚鎸佷竴鑷达細
+ * 椤跺眰鐪熷疄鑺傜偣鐨� parent 鏄� Element UI 鐨勮櫄鎷熸牴锛屽洜姝ゆ牴鑺傜偣浼氳繘鍏ヨ矾寰勩��
+ */
+
+// 鏄惁鍙跺瓙锛堟爣鍑嗭級
+export function isLeaf(data) {
+ if (!data) return true;
+ const children = data.children;
+ return children === null || children === undefined || children.length === 0;
+}
+
+// 绁栧厛 label 鍒楄〃锛氬惈鏍癸紝椤哄簭涓� 鏍� -> 鍙�
+export function getAncestorLabels(node) {
+ const labels = [];
+ let cur = node;
+ while (cur && cur.parent) {
+ labels.push(cur.label);
+ cur = cur.parent;
+ }
+ labels.reverse();
+ return labels;
+}
+
+// 澶嶅埢鍘� getNodeParent 鐨勮矾寰勬牸寮�
+// leafMarker锛氭爣鍑嗗簱浼� 'null'锛屼笅鍗曚晶浼� ''
+// 鍙跺瓙鍒ゅ畾蹇呴』涓� isLeaf 涓�鑷达紝鍚﹀垯 children 涓� undefined / 绌烘暟缁勭殑鍙跺瓙浼氫涪澶辨爣璁版
+export function buildSelectTree(node, leafMarker = '') {
+ const tokens = [];
+ let cur = node;
+ while (cur && cur.parent) {
+ if (isLeaf(cur.data)) {
+ tokens.push(cur.label, leafMarker);
+ } else {
+ tokens.push(cur.label);
+ }
+ cur = cur.parent;
+ }
+ tokens.reverse();
+ return tokens.join(' - ');
+}
+
+// 璺緞鏈鏄惁涓哄彾瀛�(鏍囧噯)锛歜uildSelectTree 浼氬湪鍙跺瓙鍓嶆彃鍏ユ爣璁版
+// 鐢ㄥ畠鍒ゆ柇鏃犻渶渚濊禆 el-tree 鑺傜偣瀵硅薄锛屾ā鏉垮洖濉矾寰勫悗鍚屾牱閫傜敤
+export function isLeafPath(path) {
+ if (!path) return false;
+ const tokens = path.split(' - ');
+ if (tokens.length < 2) return false;
+ const marker = tokens[tokens.length - 2];
+ return marker === '' || marker === 'null';
+}
+
+// 鎸夌鍏堜綅缃槧灏勮鍗曞疄浣撳瓧娈�
+// 缂哄け鐨勯潪鍙跺瓙灞傜骇濉┖涓诧紝model 鍙栧彾瀛� label锛堝彾瀛愬嵆鏍囧噯锛�
+export function deriveTreeFields(node) {
+ const labels = getAncestorLabels(node);
+ const n = labels.length;
+ const at = (i) => (i < n - 1 ? labels[i] : '');
+ return {
+ labels,
+ factory: at(0),
+ laboratory: at(1),
+ sampleType: at(2),
+ sample: at(3),
+ model: n ? labels[n - 1] : '',
+ };
+}
+
+// 鍘绘帀璺緞鏈锛岀敤浜庛�屽綋鍓嶆槸鍙跺瓙浣嗘煡涓嶅埌鏍囧噯銆嶆椂鍥為��鍒扮埗绾ф煡璇�
+export function dropLastLabel(path) {
+ if (!path) return '';
+ const idx = path.lastIndexOf(' - ');
+ return idx === -1 ? '' : path.slice(0, idx);
+}
diff --git a/src/views/business/productOrder/components/addOrder.vue b/src/views/business/productOrder/components/addOrder.vue
index c880056..975f4ea 100644
--- a/src/views/business/productOrder/components/addOrder.vue
+++ b/src/views/business/productOrder/components/addOrder.vue
@@ -612,6 +612,12 @@
import {mapGetters} from "vuex";
import { bigEval } from "@/utils/bigEval";
import {addQuarter, updateQuarterOnOrder} from "@/api/business/finishedProductSampling";
+import {
+ isLeafPath,
+ buildSelectTree,
+ deriveTreeFields,
+ dropLastLabel,
+} from "@/utils/standardTree";
export default {
name: 'AddOrder',
@@ -744,6 +750,8 @@
list: [],
selectStandardTreeLoading: false,
selectTree: null,
+ // 褰撳墠閫変腑鐨勬爲鑺傜偣锛堢敤浜庢寜灞傜骇鎺ㄥ瀛楁锛�
+ selectTreeNode: null,
sampleViewEn: null,
expandedKeys: [],
sampleList: [],
@@ -1470,9 +1478,9 @@
},
nodeOpen(data, node, el) {
$($(el.$el).find('.node_i')[0]).attr('class', 'node_i el-icon-folder-opened')
- if (node.data.code === '[3]') {
+ if (data.sampleTypeEn !== undefined && data.sampleTypeEn !== null) {
this.sampleViewEn = data.sampleTypeEn
- } else if (node.data.code === '[4]') {
+ } else if (data.sampleEn !== undefined && data.sampleEn !== null) {
this.sampleViewEn = data.sampleEn
}
},
@@ -1480,47 +1488,13 @@
$($(el.$el).find('.node_i')[0]).attr('class', 'node_i el-icon-folder')
},
handleNodeClick(val, node, el) {
- this.selectTree = ''
- this.models = val.children
- this.getNodeParent(node)
- let flag = false
- if (node.level == 3) {
- if(node.data.children.length>0){
- node.data.children.forEach(a => {
- let key = Object.keys(a)
- if(!key.includes('level')) {
- flag = true
- }
- })
-
- }
- }
- if (node.data.code === '[3]') {
+ this.selectTreeNode = node
+ this.models = val.children || []
+ this.selectTree = buildSelectTree(node, '')
+ if (val.sampleTypeEn !== undefined && val.sampleTypeEn !== null) {
this.sampleViewEn = val.sampleTypeEn
- } else if (node.data.code === '[4]') {
- if (node.data.children!==null && node.data.children.length>0) {
- this.sampleViewEn = val.sampleEn
- }
- }
- this.selectTree = this.selectTree.replace(' - ', '')
- if(flag) {
- this.selectTree = ' - - ' + this.selectTree
- }
- let data = this.selectTree.split(' - ')
- let data2 = ''
- for (let index = data.length - 1; index >= 0; index--) {
- data2 += " - " + data[index]
- }
- this.selectTree = data2.replace(' - ', '')
- },
- getNodeParent(val) {
- if (val.parent != null) {
- if (val.data.children === null) {
- this.selectTree += ' - ' + val.label + ' - ' + ''
- } else {
- this.selectTree += ' - ' + val.label
- }
- this.getNodeParent(val.parent)
+ } else if (val.sampleEn !== undefined && val.sampleEn !== null) {
+ this.sampleViewEn = val.sampleEn
}
},
selectStandardTreeList() {
@@ -1538,22 +1512,18 @@
return data.label.indexOf(value) !== -1;
},
activeStandardTree() {
- let trees = this.selectTree.split(" - ")
- if (trees.length < 3) {
+ const fields = deriveTreeFields(this.selectTreeNode)
+ if (fields.labels.length < 2) {
this.$message.error('鏈�夋嫨瀵硅薄')
return
}
- this.addObj.factory = trees[0]
- this.addObj.laboratory = trees[1]
- this.addObj.sampleType = trees[2]
- if (trees[3] === undefined || trees[3] === '' || trees[3] === '- ') {
- this.addObj.sample = trees[2]
- } else {
- this.addObj.sample = trees[3]
- }
+ this.addObj.factory = fields.factory
+ this.addObj.laboratory = fields.laboratory
+ this.addObj.sampleType = fields.sampleType
+ this.addObj.sample = fields.sample || fields.sampleType
this.addObj.sampleView = this.addObj.sample
this.addObj.sampleViewEn = this.sampleViewEn
- this.addObj.model = (trees[4] == undefined ? null : trees[4])
+ this.addObj.model = fields.model
this.selectStandardTree = false
this.sampleList = []
for (var i = 0; i < this.addObj.sampleNum; i++) {
@@ -1575,26 +1545,35 @@
this.$refs.sampleTable.doLayout()
// this.selectsStandardMethodByFLSSM()
},
+ // 鐢ㄦ寚瀹氬瀷鍙锋浛鎹㈡爲璺緞鏈锛堟湯娈靛嵆鏍囧噯/鍨嬪彿锛�
+ buildFactoryPath(model) {
+ const tree = this.selectTree || ''
+ if (!tree || !model) return tree
+ const tokens = tree.split(' - ')
+ tokens[tokens.length - 1] = model
+ return tokens.join(' - ')
+ },
selectsStandardMethodByFLSSMList() {
this.methodLoad = true
selectsStandardMethodByFLSSM({
tree: this.selectTree
}).then(res => {
this.methodLoad = false
- try {
- if (res.data.standardMethodList.length == 0 && this.selectTree.split('-').length == 5) {
- let arr = this.selectTree.split('-')
- let arr0 = arr.slice(0, arr.length - 1)
- let selectTree = arr0.join('-').substring(0, arr0.join('-').length - 1)
+ const list = (res.data && res.data.standardMethodList) || []
+ // 褰撳墠鏄彾瀛�(鏍囧噯)鍗存煡涓嶅埌鏍囧噯鏃讹紝鍥為��鍒扮埗绾у啀鏌ヤ竴娆�
+ // 鐢ㄨ矾寰勫垽瀹氬彾瀛愶細妯℃澘鍥炲~鏃� selectTreeNode 涓虹┖锛岃妭鐐瑰璞″垽瀹氫細澶辨晥
+ if (list.length === 0 && isLeafPath(this.selectTree)) {
+ const parentTree = dropLastLabel(this.selectTree)
+ if (parentTree) {
selectsStandardMethodByFLSSM({
- tree: selectTree
+ tree: parentTree
}).then(ress => {
- this.methods = ress.data.standardMethodList
+ this.methods = (ress.data && ress.data.standardMethodList) || []
})
- } else {
- this.methods = res.data.standardMethodList
+ return
}
- } catch (e) {}
+ }
+ this.methods = list
})
},
addStandardTree() {
@@ -1833,13 +1812,11 @@
}
}
this.getProductLoad = true
- let selectTreeList = this.selectTree.split(" - ")
- this.addObj.model&&(selectTreeList[selectTreeList.length - 1] = this.addObj.model)
selectStandardProductList({
model: this.addObj.model?this.addObj.model:row.model,
modelNum: row.modelNum,
standardMethodListId: val,
- factory: selectTreeList.join(" - "),
+ factory: this.buildFactoryPath(this.addObj.model),
cores: row.cores,
conductorMaterial: row.conductorMaterial,
conductorType: row.conductorType,
@@ -1900,14 +1877,12 @@
this.isAskOnlyRead = false
}
this.getProductLoad = true
- let selectTreeList = this.selectTree.split(" - ")
- this.addObj.model&&(selectTreeList[selectTreeList.length - 1] = this.addObj.model)
selectStandardProductList({
model: this.addObj.model?this.addObj.model:row.model,
modelNum: row.modelNum,
standardMethodListId: val,
cores: row.cores,
- factory: selectTreeList.join(" - "),
+ factory: this.buildFactoryPath(this.addObj.model),
}).then(res => {
res.data.forEach(a => {
a.state = this.inspectionScope === 'all' ? 1 : 0
@@ -1949,13 +1924,13 @@
},
handleChangeModel(e) {
this.productList = []
- let num = this.selectTree.split('-').length;
- if (num != 5) {
- this.selectTree = this.selectTree + ' - ' + e
+ const tree = this.selectTree || ''
+ // 璺緞鏈宸叉槸鏍囧噯(鍙跺瓙)锛氭浛鎹㈡湯娈碉紱鍚﹀垯杩藉姞
+ // 鐢ㄨ矾寰勫垽瀹氾細妯℃澘鍥炲~(obj.selectTree)鏃舵病鏈夊彲鐢ㄧ殑鏍戣妭鐐瑰璞�
+ if (isLeafPath(tree)) {
+ this.selectTree = this.buildFactoryPath(e)
} else {
- let arr = this.selectTree.split('-')
- let arr0 = arr.slice(0, arr.length - 1)
- this.selectTree = arr0.join('-') + '- ' + e
+ this.selectTree = tree ? tree + ' - ' + e : e
}
},
// 瑕佹眰鍊煎彉鍖栨椂
@@ -2091,13 +2066,7 @@
const selectedProducts = sample.insProduct || []
if (!sample.standardMethodListId) return Promise.resolve(sample)
const product = selectedProducts[0] || {}
- const factory = [
- product.factory || this.addObj.factory,
- product.laboratory || this.addObj.laboratory,
- product.sampleType || this.addObj.sampleType,
- product.sample || sample.sample,
- product.model || sample.model
- ].join(' - ')
+ const factory = this.buildFactoryPath(product.model || sample.model)
return selectStandardProductList({
model: sample.model,
modelNum: sample.modelNum,
diff --git a/src/views/standard/standardLibrary/components/BatchCopy.vue b/src/views/standard/standardLibrary/components/BatchCopy.vue
index 7ea84b4..b369746 100644
--- a/src/views/standard/standardLibrary/components/BatchCopy.vue
+++ b/src/views/standard/standardLibrary/components/BatchCopy.vue
@@ -229,11 +229,11 @@
<span
><i
:class="`node_i ${
- data.children != undefined
- ? data.code === '[1]'
+ isLeaf(data)
+ ? 'el-icon-tickets'
+ : data.code === '[1]'
? 'el-icon-folder-opened'
: 'el-icon-folder'
- : 'el-icon-tickets'
}`"
></i>
{{ data.code }} {{ data.label }}</span
@@ -467,6 +467,12 @@
selectStandardTreeList2,
selectsStandardMethodByFLSSM,
} from "@/api/standard/standardLibrary";
+import {
+ isLeaf,
+ buildSelectTree,
+ deriveTreeFields,
+ dropLastLabel,
+} from "@/utils/standardTree";
export default {
name: "BatchCopy",
// import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
@@ -498,6 +504,8 @@
search: null,
expandedKeys: [],
selectTree: null,
+ // 褰撳墠閫変腑鐨勬爲鑺傜偣锛岀敤浜庢寜灞傜骇鎺ㄥ瀛楁
+ treeNode: null,
standardMethodListId: null,
methodLoad: false,
methods: [],
@@ -516,6 +524,8 @@
},
// 鏂规硶闆嗗悎
methods: {
+ // 渚涙ā鏉垮垽鏂彾瀛�(鏍囧噯)鑺傜偣
+ isLeaf,
// 鑾峰彇宸﹁竟琛ㄦ牸鏁版嵁
getList() {
this.batchCopyDia = true;
@@ -685,7 +695,8 @@
selectStandardTreeList() {
this.selectStandardTreeLoading = true;
selectStandardTreeList2().then((res) => {
- this.list = res.data;
+ this.list = res.data || [];
+ this.expandedKeys = [];
this.list.forEach((a) => {
this.expandedKeys.push(a.label);
});
@@ -694,39 +705,8 @@
},
// 閫夋嫨鏍峰搧鍚嶇О鐨勫洖璋�
handleNodeClick(val, node, el) {
- this.selectTree = "";
- this.getNodeParent(node);
- let flag = false;
- if (node.level == 3) {
- if (node.data.children.length > 0) {
- node.data.children.forEach((a) => {
- let key = Object.keys(a);
- if (!key.includes("level")) {
- flag = true;
- }
- });
- }
- }
- this.selectTree = this.selectTree.replace(" - ", "");
- if (flag) {
- this.selectTree = " - - " + this.selectTree;
- }
- let data = this.selectTree.split(" - ");
- let data2 = "";
- for (let index = data.length - 1; index >= 0; index--) {
- data2 += " - " + data[index];
- }
- this.selectTree = data2.replace(" - ", "");
- },
- getNodeParent(val) {
- if (val.parent != null) {
- if (val.data.children === null) {
- this.selectTree += " - " + val.label + " - " + "null";
- } else {
- this.selectTree += " - " + val.label;
- }
- this.getNodeParent(val.parent);
- }
+ this.treeNode = node;
+ this.selectTree = buildSelectTree(node, "null");
},
changeStandardMethodListId() {
// 鏍规嵁妫�楠屾爣鍑嗘煡鍙宠竟table鏁版嵁
@@ -753,38 +733,29 @@
tree: this.selectTree,
}).then((res) => {
this.methodLoad = false;
- try {
- if (
- res.data.standardMethodList.length == 0 &&
- this.selectTree.split("-").length == 5
- ) {
- let arr = this.selectTree.split("-");
- let arr0 = arr.slice(0, arr.length - 1);
- let selectTree = arr0
- .join("-")
- .substring(0, arr0.join("-").length - 1);
+ const list = (res.data && res.data.standardMethodList) || [];
+ // 褰撳墠鏄彾瀛�(鏍囧噯)鍗存煡涓嶅埌鏍囧噯鏃讹紝鍥為��鍒扮埗绾у啀鏌ヤ竴娆�
+ if (list.length === 0 && this.treeNode && isLeaf(this.treeNode.data)) {
+ const parentTree = dropLastLabel(this.selectTree);
+ if (parentTree) {
selectsStandardMethodByFLSSM({
- tree: selectTree,
+ tree: parentTree,
}).then((ress) => {
- this.methods = ress.data.standardMethodList;
+ this.methods = (ress.data && ress.data.standardMethodList) || [];
});
- } else {
- this.methods = res.data.standardMethodList;
+ return;
}
- } catch (e) {}
+ }
+ this.methods = list;
});
},
activeStandardTree() {
- let trees = this.selectTree.split(" - ");
- if (trees.length < 3) {
+ const { labels, sample, sampleType } = deriveTreeFields(this.treeNode);
+ if (labels.length < 2) {
this.$message.error("鏈�夋嫨瀵硅薄");
return;
}
- if (trees[3] === undefined || trees[3] === "" || trees[3] === "- ") {
- this.sample = trees[2];
- } else {
- this.sample = trees[3];
- }
+ this.sample = sample || sampleType;
this.selectStandardTree = false;
},
handleSelectionChange0(val) {
diff --git a/src/views/standard/standardLibrary/index.vue b/src/views/standard/standardLibrary/index.vue
index 448fd21..7f57755 100644
--- a/src/views/standard/standardLibrary/index.vue
+++ b/src/views/standard/standardLibrary/index.vue
@@ -8,44 +8,41 @@
<div class="head-container addButton">
<el-input v-model="search" clearable placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�" size="small" style="margin-bottom: 5px"
suffix-icon="el-icon-search" @keydown.enter.native="searchFilter" @blur="searchFilter" @clear="searchFilter"></el-input>
- <el-button circle icon="el-icon-plus" size="mini" type="primary" @click="addDia = true"></el-button>
+ <el-button circle icon="el-icon-plus" size="mini" type="primary" @click="openAddDia"></el-button>
</div>
<div class="head-container">
- <el-tree ref="tree" v-loading="treeLoad" :allow-drop="allowDrop" :data="list"
- :default-expanded-keys="expandedKeys" :draggable="true" :filter-node-method="filterNode"
+ <el-tree ref="tree" v-loading="treeLoad" :data="list"
+ :default-expanded-keys="expandedKeys" :filter-node-method="filterNode"
:props="{ children: 'children', label: 'label' }" highlight-current node-key="label"
style="
height: calc(100vh - 173px);
overflow-y: scroll;
scrollbar-width: none;"
- @node-click="handleNodeClick"
- @node-drop="handleDrop">
+ @node-click="handleNodeClick">
<div slot-scope="{ node, data }" class="custom-tree-node">
<el-row style="width: 100%">
- <el-col :class="{ sort: node.level > 3 }" :span="19" :title="data.label" style="text-align: left">
+ <el-col :span="19" :title="data.label" style="text-align: left">
<span>
- <i :class="`node_i ${data.children != undefined
- ? data.code === '[1]'
+ <i :class="`node_i ${isLeaf(data)
+ ? 'el-icon-tickets'
+ : node.level === 1
? 'el-icon-folder-opened'
: 'el-icon-folder'
- : 'el-icon-tickets'
}`"></i>
{{ data.label }}
</span>
</el-col>
<el-col v-if="
checkPermi(['standard:standardLibrary:delStandardTree']) &&
- (node.data.children === null ||
- node.data.children === undefined)
+ isLeaf(node.data)
" :span="2" style="text-align: right">
- <el-button size="mini" type="text" @click.stop="editTreeName(node.data)">
+ <el-button size="mini" type="text" @click.stop="editTreeName(node)">
<i class="el-icon-edit"></i>
</el-button>
</el-col>
<el-col v-if="
checkPermi(['standard:standardLibrary:delStandardTree']) &&
- (node.data.children === null ||
- node.data.children === undefined)
+ isLeaf(node.data)
" :span="2" style="text-align: right">
<el-button size="mini" type="text" @click.stop="remove(node, data)">
<i class="el-icon-delete"></i>
@@ -64,6 +61,9 @@
<p style="font-size: 14px; color: #999;margin-left: 10px">{{ selectTree }}</p>
</div>
<div class="options_button">
+ <el-input v-model="productKeyword" :disabled="!selected.isLeaf" clearable placeholder="鎼滅储妫�楠岄」/妫�楠岄」瀛愰」"
+ size="small" style="width: 240px" suffix-icon="el-icon-search"
+ @keyup.enter.native="searchProduct" @clear="searchProduct"></el-input>
<el-button v-if="isShowCopy" size="small" style="position: absolute; right: 20px; top: 1px" type="primary"
@click="openCopyDia">鎵归噺澶嶅埗</el-button>
</div>
@@ -198,12 +198,17 @@
<el-dialog :visible.sync="addDia" title="鍒嗙被娣诲姞" width="400px">
<div class="body">
+ <el-row style="line-height: 30px">
+ <el-col :span="24" style="color: #999; font-size: 13px">
+ 鏂板鍒帮細{{ selected.tree || '鏍圭洰褰�' }}
+ </el-col>
+ </el-row>
<el-row style="line-height: 50px">
<el-col :span="6" style="text-align: right">
- <span class="required-span">* </span>鍨嬪彿锛�
+ <span class="required-span">* </span>鍚嶇О锛�
</el-col>
<el-col :offset="1" :span="16">
- <el-input v-model="addOb.model" clearable placeholder="璇疯緭鍏ュ瀷鍙�" size="small"
+ <el-input v-model="addOb.name" clearable placeholder="璇疯緭鍏ュ悕绉�" size="small"
@keyup.enter.native="addStandardTree"></el-input>
</el-col>
</el-row>
@@ -217,10 +222,10 @@
<div class="body">
<el-row style="line-height: 50px">
<el-col :span="6" style="text-align: right">
- <span class="required-span">* </span>鍨嬪彿锛�
+ <span class="required-span">* </span>鍚嶇О锛�
</el-col>
<el-col :offset="1" :span="16">
- <el-input v-model="addOb.model" clearable placeholder="璇疯緭鍏ュ瀷鍙�" size="small"
+ <el-input v-model="addOb.name" clearable placeholder="璇疯緭鍏ュ悕绉�" size="small"
@keyup.enter.native="updateStandardTree"></el-input>
</el-col>
</el-row>
@@ -302,9 +307,7 @@
<script>
import Sortable from "sortablejs";
-import draggable from "vuedraggable";
import {
- updateTreeSort,
resetTreeDragBatch,
delStandardTree,
selectStandardTreeList,
@@ -317,13 +320,16 @@
upStandardProductList,
selectStandardProductListByMethodId,
updateSection,
- upStandardProducts,
getStandardTemplate,
- selectStandardProductByMethodId,
- selectStandardProductEnumByMethodId,
} from "@/api/standard/standardLibrary";
import bindSupplierDensityDialogAsk from "./components/bindSupplierDensityDialogAsk.vue";
import BatchCopy from "./components/BatchCopy.vue";
+import {
+ isLeaf,
+ buildSelectTree,
+ getAncestorLabels,
+ dropLastLabel,
+} from "@/utils/standardTree";
import { Splitpanes, Pane } from "splitpanes";
import "splitpanes/dist/splitpanes.css";
@@ -332,7 +338,6 @@
components: {
BatchCopy,
bindSupplierDensityDialogAsk,
- draggable,
Splitpanes,
Pane
},
@@ -346,13 +351,18 @@
factory: [],
addDia: false,
updateDia: false, // 淇敼鏍戝悕瀛楀脊妗�
- oldModel: "",
+ oldLabel: "",
+ editTree: "",
+ // 褰撳墠閫変腑鐨勮妭鐐癸細label / 瀹屾暣璺緞 / 鏄惁鍙跺瓙(鏍囧噯)
+ selected: {
+ label: "",
+ tree: "",
+ isLeaf: false,
+ },
+ // 妫�楠岄」鎼滅储鍏抽敭瀛楋紝璧板悗绔繃婊わ紙妫�楠岄」 + 妫�楠岄」瀛愰」锛�
+ productKeyword: "",
addOb: {
- factory: null,
- laboratory: null,
- sampleType: null,
- sample: null,
- model: null,
+ name: "",
},
laboratory: [],
addLoad: false,
@@ -384,29 +394,17 @@
total: 0,
currentPage: 1,
standardId: 0,
- total0: 0,
- currentPage0: 1,
- productList0: [],
methodList: [],
- productTableLoading0: false,
- filters0: [],
- filters1: [],
- pages: 1,
- inspectionItem: null,
- inspectionItemSubclass: null,
- sonLaboratory: null,
token: null,
fileList: [],
uploading: false,
isEquipment: true,
- isHaveChildren: {},
sortTable: null,
currentSupplierDensityRow: {}, // 閫夋嫨闆朵欢缁戝畾鏈潯鏁版嵁鐨勪俊鎭�
bindSupplierDensityDialog: false,
isShowCopy: false,
batchCopyDia: false,
VUE_APP_BASE_API: process.env.VUE_APP_BASE_API,
- moreSelects: [],
};
},
mounted() {
@@ -424,40 +422,18 @@
};
},
methods: {
- // 淇敼鏈�瀛愮骇鍚嶅瓧
- editTreeName(info) {
+ isLeaf,
+ // 鎵撳紑鏂板寮规锛氬湪褰撳墠閫変腑鑺傜偣涓嬫柊澧炲瓙绾э紙鏈�変腑鍒欐柊澧炴牴绾э級
+ openAddDia() {
+ this.addOb.name = "";
+ this.addDia = true;
+ },
+ // 淇敼鑺傜偣鍚嶅瓧
+ editTreeName(node) {
this.updateDia = true;
- this.oldModel = info.label;
- },
- // 鎷栨嫿鏃跺垽瀹氱洰鏍囪妭鐐硅兘鍚﹁鏀剧疆
- // 'prev'銆�'inner' 鍜� 'next'锛屽墠銆佹彃鍏ャ�佸悗
- allowDrop(draggingNode, dropNode, type) {
- if (draggingNode.level !== 3) return;
- if (draggingNode.data.level === dropNode.data.level) {
- if (draggingNode.data.parentId === dropNode.data.parentId) {
- return type === "prev" || type === "next";
- } else {
- return false;
- }
- } else {
- // 涓嶅悓绾ц繘琛屽鐞�
- return false;
- }
- },
- // tree鎷栨嫿鎴愬姛瀹屾垚鏃惰Е鍙戠殑浜嬩欢
- handleDrop(draggingNode, dropNode, dropType, ev) {
- try {
- this.treeLoad = true;
- updateTreeSort(this.list).then((res) => {
- if (res.code === 200) {
- this.$message.success("鎿嶄綔鎴愬姛");
- }
- this.treeLoad = false;
- });
- } catch (e) {
- this.treeLoad = false;
- console.log("e----", e);
- }
+ this.oldLabel = node.label;
+ this.editTree = buildSelectTree(node, "null");
+ this.addOb.name = node.label;
},
rowDrop(methodId) {
const that = this;
@@ -497,54 +473,12 @@
});
}
},
- hasChildWithId(nodes, name) {
- for (let node of nodes) {
- const comName = node.label + node.code;
- if (comName == name) {
- //鍒ゆ柇閫掑綊缁撴潫鏉′欢
- this.isHaveChildren = node;
- return node;
- } else if (node.children && node.children.length > 0) {
- //鍒ゆ柇children鏄惁鏈夋暟鎹�
- this.hasChildWithId(node.children, name); //閫掑綊璋冪敤
- }
- }
- },
// 璋冪敤tree杩囨护鏂规硶 涓枃鑻辫繃婊�
filterNode (value, data, node) {
if (!value) {銆�銆�銆�銆�//濡傛灉鏁版嵁涓虹┖锛屽垯杩斿洖true,鏄剧ず鎵�鏈夌殑鏁版嵁椤�
return true
}
return data.label.indexOf(value) !== -1;
- // 鏌ヨ鍒楄〃鏄惁鏈夊尮閰嶆暟鎹紝灏嗗�煎皬鍐欙紝鍖归厤鑻辨枃鏁版嵁
- // let val = value.toLowerCase()
- // return this.chooseNode(val, data, node) // 璋冪敤杩囨护浜屽眰鏂规硶
- },
- // 杩囨护鐖惰妭鐐� / 瀛愯妭鐐� (濡傛灉杈撳叆鐨勫弬鏁版槸鐖惰妭鐐逛笖鑳藉尮閰嶏紝鍒欒繑鍥炶鑺傜偣浠ュ強鍏朵笅鐨勬墍鏈夊瓙鑺傜偣锛涘鏋滃弬鏁版槸瀛愯妭鐐癸紝鍒欒繑鍥炶鑺傜偣鐨勭埗鑺傜偣銆俷ame鏄腑鏂囧瓧绗︼紝enName鏄嫳鏂囧瓧绗�.
- chooseNode (value, data, node) {
- if (data.label.indexOf(value) !== -1) {
- return true
- }
- const level = node.level
- // 濡傛灉浼犲叆鐨勮妭鐐规湰韬氨鏄竴绾ц妭鐐瑰氨涓嶇敤鏍¢獙浜�
- if (level === 1) {
- return false
- }
- // 鍏堝彇褰撳墠鑺傜偣鐨勭埗鑺傜偣
- let parentData = node.parent
- // 閬嶅巻褰撳墠鑺傜偣鐨勭埗鑺傜偣
- let index = 0
- while (index < level - 1) {
- // 濡傛灉鍖归厤鍒扮洿鎺ヨ繑鍥烇紝姝ゅname鍊兼槸涓枃瀛楃锛宔nName鏄嫳鏂囧瓧绗︺�傚垽鏂尮閰嶄腑鑻辨枃杩囨护
- if (parentData.data.label.indexOf(value) !== -1) {
- return true
- }
- // 鍚﹀垯鐨勮瘽鍐嶅線涓婁竴灞傚仛鍖归厤
- parentData = parentData.parent
- index++
- }
- // 娌″尮閰嶅埌杩斿洖false
- return false
},
searchFilter() {
@@ -554,40 +488,26 @@
this.upIndex++;
},
handleNodeClick(val, node, el) {
- //鏍戠殑鍊�
- if (node.childNodes.length === 0) {
- this.isShowCopy = true;
- } else {
- this.isShowCopy = false;
- }
+ const leaf = isLeaf(val);
+ // 鍙跺瓙鑺傜偣鍗虫爣鍑嗭紝鎵嶆樉绀烘壒閲忓鍒躲�佹墠鏌ヨ妫�楠岄」
+ this.isShowCopy = leaf;
this.total = 0;
this.currentPage = 1;
- this.selectTree = "";
- this.getNodeParent(node);
- this.selectTree = this.selectTree.replace(" - ", "");
- let data = this.selectTree.split(" - ");
- let data2 = "";
- for (let index = data.length - 1; index >= 0; index--) {
- data2 += " - " + data[index];
- }
- this.selectTree = data2.replace(" - ", "");
- if (node.childNodes.length === 0) {
+ this.selectTree = buildSelectTree(node, "null");
+ this.selected = {
+ label: val.label,
+ tree: this.selectTree,
+ isLeaf: leaf,
+ };
+ // 鍒囨崲鑺傜偣鏃舵竻绌烘悳绱笌鍒楄〃锛涢潪鏍囧噯鑺傜偣杩樿娓呯┖ standardId锛岄伩鍏嶆悳绱㈡煡鍒颁笂涓�涓爣鍑�
+ this.productKeyword = "";
+ this.standardList = [];
+ this.productList = [];
+ if (leaf) {
this.selectsStandardMethodByFLSSM();
- }
- let trees = this.selectTree.split(" - ");
- this.addOb.factory = trees[0];
- this.addOb.laboratory = trees[1];
- this.addOb.sampleType = trees[2];
- this.addOb.sample = trees[3];
- },
- getNodeParent(val) {
- if (val.parent != null) {
- if (val.data.children === null) {
- this.selectTree += " - " + val.label + " - " + "null";
- } else {
- this.selectTree += " - " + val.label;
- }
- this.getNodeParent(val.parent);
+ } else {
+ this.standardId = 0;
+ this.syncSortable();
}
},
remove(node, data) {
@@ -595,23 +515,20 @@
type: "error",
})
.then(() => {
- // this.treeLoad = true
- this.selectTree = "";
- this.getNodeParent(node);
- this.selectTree = this.selectTree.replace(" - ", "");
- let data = this.selectTree.split(" - ");
- let data2 = "";
- for (let index = data.length - 1; index >= 0; index--) {
- data2 += " - " + data[index];
- }
- this.selectTree = data2.replace(" - ", "");
- delStandardTree({ tree: this.selectTree }).then((res) => {
+ const tree = buildSelectTree(node, "null");
+ delStandardTree({ tree }).then((res) => {
this.$message.success("宸插垹闄�");
- let arr = this.selectTree.split(" - ");
- this.deleteStandard(this.list, arr[arr.length - 1]);
+ const labels = getAncestorLabels(node);
+ this.deleteStandard(this.list, labels[labels.length - 1]);
this.selectTree = "";
+ this.selected = { label: "", tree: "", isLeaf: false };
this.standardList = [];
this.productList = [];
+ this.standardId = 0;
+ this.isShowCopy = false;
+ this.productKeyword = "";
+ this.total = 0;
+ this.syncSortable();
});
})
.catch((e) => { });
@@ -651,6 +568,7 @@
this.treeLoad = true;
selectStandardTreeList().then((res) => {
this.list = res.data;
+ this.expandedKeys = [];
this.list.forEach((a) => {
this.expandedKeys.push(a.label);
});
@@ -693,31 +611,23 @@
this.standardEnum = data;
});
},
- // 鎻愪氦鍒嗙被娣诲姞
+ // 鎻愪氦鍒嗙被娣诲姞锛氬湪閫変腑鑺傜偣涓嬫柊澧炲瓙绾э紝鏈�変腑鍒欐柊澧炴牴绾�
addStandardTree() {
- if (this.addOb.sampleType == null || this.addOb.sampleType == "") {
- this.$message.error("瀵硅薄涓嶅瓨鍦�");
- return;
- }
- if (this.addOb.model == null || this.addOb.model == "") {
- this.$message.error("璇峰~鍐欏瀷鍙�");
+ const name = (this.addOb.name || "").trim();
+ if (!name) {
+ this.$message.error("璇峰~鍐欏悕绉�");
return;
}
this.addLoad = true;
- addStandardTree(this.addOb)
+ addStandardTree({
+ parentTree: this.selected.tree || "",
+ name,
+ })
.then((res) => {
this.$message.success("娣诲姞鎴愬姛");
this.addDia = false;
- this.list
- .find((a) => a.label == this.addOb.factory)
- .children.find((a) => a.label == this.addOb.laboratory)
- .children.find((a) => a.label == this.addOb.sampleType)
- .children.find((a) => a.label == this.addOb.sample)
- .children.push({
- code: "[5]",
- label: this.addOb.model,
- value: this.addOb.model,
- });
+ this.addOb.name = "";
+ this.selectStandardTreeList();
this.addLoad = false;
})
.catch((e) => {
@@ -725,24 +635,24 @@
this.addLoad = false;
});
},
- // 淇敼鍨嬪彿
+ // 淇敼鑺傜偣鍚嶅瓧
updateStandardTree() {
- if (this.addOb.sampleType == null || this.addOb.sampleType == "") {
- this.$message.error("瀵硅薄涓嶅瓨鍦�");
+ const name = (this.addOb.name || "").trim();
+ if (!name) {
+ this.$message.error("璇峰~鍐欏悕绉�");
return;
}
- if (this.addOb.model == null || this.addOb.model == "") {
- this.$message.error("璇峰~鍐欏瀷鍙�");
- return;
- }
- this.addOb.oldModel = this.oldModel;
this.updateLoad = true;
- updateStandardTree(this.addOb)
+ updateStandardTree({
+ parentTree: dropLastLabel(this.editTree),
+ oldLabel: this.oldLabel,
+ name,
+ })
.then((res) => {
- this.$message.success("娣诲姞鎴愬姛");
- this.$tab.refreshPage();
- // this.selectStandardTreeList();
+ this.$message.success("淇敼鎴愬姛");
this.updateDia = false;
+ this.addOb.name = "";
+ this.selectStandardTreeList();
this.updateLoad = false;
})
.catch((e) => {
@@ -756,12 +666,14 @@
tree: this.selectTree,
}).then((res) => {
this.tableLoad = false;
- this.standardList = res.data.standardMethodList;
- if (this.standardList && this.standardList.length > 0) {
+ const data = res.data || {};
+ this.standardList = data.standardMethodList || [];
+ if (this.standardList.length > 0) {
this.$refs.standard.setCurrentRow(this.standardList[0]);
this.rowClick(this.standardList[0]);
} else {
this.productList = [];
+ this.syncSortable();
}
});
},
@@ -853,6 +765,22 @@
this.rowClick(this.standardList[index]);
}
},
+ // 妫�楠岄」鎼滅储锛氳蛋鍚庣杩囨护锛堝尮閰嶆楠岄」 + 妫�楠岄」瀛愰」锛�
+ searchProduct() {
+ if (!this.selected.isLeaf || !this.standardId) return;
+ this.rowClick({ id: this.standardId });
+ },
+ // 鍙湁閫変腑鐨勬槸鏍囧噯(鍙跺瓙)銆佹湭鍦ㄦ悳绱㈣繃婊ょ姸鎬併�佷笖鍒楄〃闈炵┖鏃讹紝鎵嶅厑璁告嫋鎷芥帓搴�
+ syncSortable() {
+ if (this.sortTable) {
+ this.sortTable.destroy();
+ this.sortTable = null;
+ }
+ if (!this.selected.isLeaf || this.productKeyword || this.productList.length === 0) return;
+ this.$nextTick(() => {
+ this.rowDrop(this.standardId);
+ });
+ },
rowClick(row, column, event) {
this.currentPage = 1;
this.tableLoad2 = true;
@@ -861,40 +789,18 @@
id: row.id,
tree: this.selectTree,
page: this.currentPage,
+ keyword: this.productKeyword,
}).then((res) => {
- this.productList = res.data.productList;
- this.total = res.data.total;
+ const data = res.data || {};
+ this.productList = data.productList || [];
+ this.total = data.total || 0;
setTimeout(() => {
this.productList.forEach((a) => {
if (a.state == 1) this.toggleSelection(a);
});
}, 300);
this.tableLoad2 = false;
- const tree = this.selectTree.split(" - ");
- // 閫夋嫨鏈�鍚庝竴灞傛爲鎵嶅彲浠ユ嫋鎷芥帓搴�
- if (tree.length === 4) {
- const name = tree[3] + "[4]";
- this.hasChildWithId(this.list, name);
- if (
- this.isHaveChildren.children &&
- this.isHaveChildren.children.length > 0
- ) {
- if (this.sortTable) {
- this.sortTable.destroy();
- this.sortTable = null;
- }
- return;
- }
- } else if (tree.length < 4) {
- if (this.sortTable) {
- this.sortTable.destroy();
- this.sortTable = null;
- }
- return;
- }
- this.$nextTick(() => {
- this.rowDrop(row.id);
- });
+ this.syncSortable();
});
},
toggleSelection(row) {
@@ -916,28 +822,6 @@
}).then((res) => {
this.$message.success('宸蹭繚瀛�')
});
- },
- filterHandler(value) {
- for (let column in value) {
- if (value[column].length === 0) {
- if (column === "inspectionItem") {
- this.inspectionItem = null;
- } else if (column === "inspectionItemSubclass") {
- this.inspectionItemSubclass = null;
- } else if (column === "sonLaboratory") {
- this.sonLaboratory = null;
- }
- } else {
- if (column === "inspectionItem") {
- this.inspectionItem = value[column][0];
- } else if (column === "inspectionItemSubclass") {
- this.inspectionItemSubclass = value[column][0];
- } else if (column === "sonLaboratory") {
- this.sonLaboratory = value[column][0];
- }
- }
- this.getList();
- }
},
handleAll(e) {
if (e.length > 0) {
@@ -1049,48 +933,21 @@
this.sectionRow.conductorType = JSON.stringify(conductorTypeList);
}
this.sectionLoad = true;
- if (this.moreSelects.length === 0) {
- updateSection({
- str: JSON.stringify({
- id: this.sectionRow.id,
- section: this.sectionRow.section,
- ask: this.sectionRow.ask,
- tell: this.sectionRow.tell,
- // price: this.sectionRow.price,
- // manHour: this.sectionRow.manHour,
- cores: this.sectionRow.cores,
- conductorMaterial: this.sectionRow.conductorMaterial,
- conductorType: this.sectionRow.conductorType,
- }),
- }).then((res) => {
- this.sectionLoad = false;
- this.$message.success("宸蹭繚瀛�");
- this.sectionUpDia = false;
- });
- } else {
- upStandardProducts({
- ids: JSON.stringify(this.moreSelects.map((a) => a.id)),
- standardProductList: {
- section: this.sectionRow.section,
- ask: this.sectionRow.ask,
- tell: this.sectionRow.tell,
- // price: this.sectionRow.price,
- // manHour: this.sectionRow.manHour,
- cores: this.sectionRow.cores,
- conductorMaterial: this.sectionRow.conductorMaterial,
- conductorType: this.sectionRow.conductorType,
- },
- }).then((res) => {
- this.sectionLoad = false;
- this.$message.success("宸蹭繚瀛�");
- this.sectionUpDia = false;
- this.currentPage0 = 1;
- this.getList();
- this.rowClick({
- id: this.standardId,
- });
- });
- }
+ updateSection({
+ str: JSON.stringify({
+ id: this.sectionRow.id,
+ section: this.sectionRow.section,
+ ask: this.sectionRow.ask,
+ tell: this.sectionRow.tell,
+ cores: this.sectionRow.cores,
+ conductorMaterial: this.sectionRow.conductorMaterial,
+ conductorType: this.sectionRow.conductorType,
+ }),
+ }).then((res) => {
+ this.sectionLoad = false;
+ this.$message.success("宸蹭繚瀛�");
+ this.sectionUpDia = false;
+ });
},
bindSupplierDensitySecond(row) {
this.bindSupplierDensity(row);
@@ -1143,81 +1000,6 @@
this.methodList = data;
});
},
- handleSelectAll0(rows) {
- if (rows.length) {
- rows.forEach((a) => {
- if (!this.moreSelects.find((b) => a.id === b.id)) {
- this.moreSelects.push(a);
- }
- });
- } else {
- this.productList0.forEach((a) => {
- this.moreSelects = this.moreSelects.filter((b) => b.id != a.id);
- });
- }
- },
- handleSelectionChange0(val, row) {
- if (this.moreSelects.find((a) => a.id === row.id)) {
- this.moreSelects = this.moreSelects.filter((a) => a.id != row.id);
- } else {
- this.moreSelects.push(row);
- }
- },
- getList() {
- this.productTableLoading0 = true;
- this.getItemEnum();
- selectStandardProductByMethodId({
- id: this.standardId,
- tree: this.selectTree,
- page: this.currentPage0,
- laboratory: this.sonLaboratory,
- items: this.inspectionItemSubclass,
- item: this.inspectionItem,
- }).then((res) => {
- this.productList0 = res.data.records;
- this.total0 = res.data.total;
- this.productTableLoading0 = false;
- this.page = res.data.pages;
- this.$nextTick(() => {
- this.productList0.forEach((a, i) => {
- if (this.moreSelects.find((b) => a.id == b.id)) {
- this.$refs.productTable0.toggleRowSelection(
- this.productList0[i],
- true
- );
- }
- });
- });
- });
- },
- handleCurrentChange0(e) {
- this.currentPage0 = e;
- this.getList();
- },
- getItemEnum() {
- selectStandardProductEnumByMethodId({
- id: this.standardId,
- tree: this.selectTree,
- item: this.inspectionItem,
- }).then((res) => {
- this.filters0 = [];
- this.filters1 = [];
- res.data.item.forEach((a) => {
- this.filters0.push({
- text: a.inspectionItem,
- value: a.inspectionItem,
- });
- });
- res.data.items.forEach((a) => {
- if (a != null) {
- this.filters1.push({
- text: a.inspectionItemSubclass,
- value: a.inspectionItemSubclass,
- });
- }
- });
- });
- },
},
};
</script>
@@ -1229,6 +1011,9 @@
.options_button {
margin-top: 3px;
+ margin-right: 120px;
+ display: flex;
+ align-items: center;
}
}
diff --git a/vue.config.js b/vue.config.js
index 1ef63cb..8eef954 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -27,7 +27,7 @@
lintOnSave: process.env.NODE_ENV === "development",
// 濡傛灉浣犱笉闇�瑕佺敓浜х幆澧冪殑 source map锛屽彲浠ュ皢鍏惰缃负 false 浠ュ姞閫熺敓浜х幆澧冩瀯寤恒��
productionSourceMap: false,
- transpileDependencies: ["quill"],
+ transpileDependencies: ["quill", "fast-png", "iobuffer"],
// webpack-dev-server 鐩稿叧閰嶇疆
devServer: {
host: "0.0.0.0",
@@ -37,7 +37,7 @@
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
// target: `http://36.213.90.123:9015/lims`,
- target: `http://127.0.0.1:9509/lims`,
+ target: `http://192.168.0.24:8001/lims`,
changeOrigin: true,
pathRewrite: {
["^" + process.env.VUE_APP_BASE_API]: "",
--
Gitblit v1.9.3