testclassify.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <template>
  2. <basic-container ref="container" style="height:100%;">
  3. <el-row :gutter="20" class="h-h">
  4. <el-col :span="12">
  5. <div class="title blue">外委检测模板目录</div>
  6. <div class="tree-box blue">
  7. <el-scrollbar class="h-100p">
  8. <el-tree :props="props" :data="leftTreeData" node-key="id" ref="trees2" :default-expand-all="true" :filter-node-method="filterNode">
  9. <span class="flexStar" slot-scope="{ node, data }" @mouseover="mouseOver(data)" @mouseleave="mouseLeave(data)" style="box-sizing: border-box;width:100%;">
  10. <span>{{ data.nodeName }}</span>
  11. <span class="marleft10" v-show="data.moreShow">
  12. <i @click.stop='addtree(data)' class="el-icon-circle-plus-outline" style="fontSize:18px;" v-if="data.isStorageNode!=1"></i>
  13. <i @click.stop='edittree(data)' class="el-icon-edit-outline marleft5" style="fontSize:18px;" v-if="node.level!=1"></i>
  14. <i @click.stop='deletetree(data)' class="el-icon-delete marleft5" style="fontSize:18px;" v-if="node.level!=1"></i>
  15. </span>
  16. </span>
  17. </el-tree>
  18. </el-scrollbar>
  19. </div>
  20. </el-col>
  21. <el-col :span="12">
  22. <div class="title green">第三方检测模板目录</div>
  23. <div class="tree-box green">
  24. <el-scrollbar class="h-100p">
  25. <el-tree :props="props" :data="rightTreeData" node-key="id" ref="trees2" :default-expand-all="true" :filter-node-method="filterNode">
  26. <span class="flexStar" slot-scope="{ node, data }" @mouseover="mouseOver(data)" @mouseleave="mouseLeave(data)" style="box-sizing: border-box;width:100%;">
  27. <span>{{ data.nodeName }}</span>
  28. <span class="marleft10" v-show="data.moreShow">
  29. <i @click.stop='addtree(data,node)' class="el-icon-circle-plus-outline" style="fontSize:18px;" v-if="data.isStorageNode!=1"></i>
  30. <i @click.stop='edittree(data,node)' class="el-icon-edit-outline marleft5" style="fontSize:18px;" v-if="node.level!=1"></i>
  31. <i @click.stop='deletetree(data)' class="el-icon-delete marleft5" style="fontSize:18px;" v-if="node.level!=1"></i>
  32. </span>
  33. </span>
  34. </el-tree>
  35. </el-scrollbar>
  36. </div>
  37. </el-col>
  38. </el-row>
  39. <!-- 新增编辑 -->
  40. <el-dialog :title="form.id?'编辑':'新增'" :visible.sync="treeTap" width="650px" :modal-append-to-body="false" @close="treeClose">
  41. <el-form ref="form" :model="form" label-width="120px" :rules="rules">
  42. <el-form-item label="节点名称" prop="nodeName">
  43. <el-input v-model="form.nodeName" style="width:400px;"/>
  44. </el-form-item>
  45. </el-form>
  46. <span slot="footer" class="dialog-footer">
  47. <el-button @click="treeTap = false">取 消</el-button>
  48. <el-button type="primary" @click="saveTree">保 存</el-button>
  49. </span>
  50. </el-dialog>
  51. </basic-container>
  52. </template>
  53. <script>
  54. import ManualSorting from '@/components/WbsTree/ManualSorting'
  55. import trialApi from "@/api/tentative/testclassify";
  56. export default {
  57. components: {
  58. ManualSorting,
  59. },
  60. data () {
  61. return {
  62. props: {
  63. label: 'nodeName',
  64. children: 'children',
  65. isLeaf: 'hasChildren'
  66. },
  67. leftTreeData: [],
  68. rightTreeData: [],
  69. treeTap: false,
  70. form: {
  71. id: '', //新增还是编辑
  72. nodeName: "", //节点名称
  73. },
  74. rules: {
  75. nodeName: [{ required: true, message: '请输入节点名称', trigger: 'blur' }],
  76. },
  77. }
  78. },
  79. methods: {
  80. async getTreeAll() {
  81. const { data } = await trialApi.getTreeAll()
  82. if (data.code === 200) {
  83. let {leftTree, rightTree} = data.data
  84. //左边树
  85. if (leftTree.length > 0) {
  86. leftTree.forEach(val => {
  87. val.hasChildren = !val.hasChildren
  88. });
  89. }
  90. this.leftTreeData = leftTree
  91. //右边树
  92. if (rightTree.length > 0) {
  93. rightTree.forEach(val => {
  94. val.hasChildren = !val.hasChildren
  95. });
  96. }
  97. this.rightTreeData = rightTree
  98. } else {
  99. this.leftTreeData = []
  100. this.rightTreeData = []
  101. }
  102. },
  103. filterNode (value,data,node) {//筛选条件
  104. // 如果什么都没填就直接返回
  105. if(!value){
  106. return true;
  107. }
  108. let _array = [];//这里使用数组存储 只是为了存储值。
  109. this.getReturnNode(node,_array,value);
  110. let result = false;
  111. _array.forEach((item)=>{
  112. result = result || item;
  113. });
  114. return result;
  115. },
  116. //判断节点是否匹配
  117. getReturnNode(node,_array,value){
  118. let isPass = node.data && node.data.nodeName && node.data.nodeName.indexOf(value) !== -1;
  119. isPass?_array.push(isPass):'';
  120. //判断节点是否是父节点
  121. if(!isPass && node.level !== 1 && node.parent){
  122. this.getReturnNode(node.parent,_array,value);
  123. }
  124. },
  125. mouseLeave (data) {
  126. if (data.moreShow) {
  127. this.$set(data, 'moreShow', false)
  128. }
  129. },
  130. mouseOver (data) {
  131. if (!data.moreShow) {
  132. this.$set(data, 'moreShow', true)
  133. }
  134. },
  135. //添加树
  136. addtree (data) {
  137. this.form = {
  138. id: '',
  139. nodeName: '',
  140. parentId: data.id,
  141. nodeType: data.nodeType
  142. }
  143. this.treeTap = true
  144. },
  145. //编辑树
  146. async edittree (data) {
  147. this.form = {
  148. id: data.id,
  149. parentId: data.parentId,
  150. nodeName: data.nodeName,
  151. nodeType: data.nodeType
  152. }
  153. this.treeTap = true
  154. },
  155. //保存按钮
  156. saveTree () {
  157. this.$refs['form'].validate((valid) => {
  158. if (valid) {
  159. this.setTreeSubmit()
  160. } else {
  161. return false
  162. }
  163. })
  164. },
  165. treeClose () {
  166. this.treeTap = false
  167. },
  168. //提交保存
  169. async setTreeSubmit() {
  170. const { data } = await trialApi.setTreeSubmit(this.form)
  171. if (data.code === 200) {
  172. this.$message({
  173. type: "success",
  174. message: "操作成功!"
  175. });
  176. this.getTreeAll()
  177. }
  178. },
  179. //删除树
  180. deletetree (data) {
  181. let _that = this
  182. this.$confirm('是否删除此数据', '提示', {
  183. distinguishCancelAndClose: true,
  184. confirmButtonText: '确认',
  185. cancelButtonText: '取消'
  186. }).then(() => {
  187. _that.setTreeRemove(data.id)
  188. });
  189. },
  190. //删除接口
  191. async setTreeRemove (id) {
  192. const { data } = await trialApi.setTreeRemove({ id })
  193. if (data.code === 200) {
  194. this.$message({
  195. type: 'success',
  196. message: '删除成功'
  197. })
  198. this.getTreeAll()
  199. }
  200. },
  201. },
  202. created () {
  203. this.getTreeAll()
  204. },
  205. mounted () {
  206. }
  207. }
  208. </script>
  209. <style lang="scss" scoped>
  210. .title {
  211. padding: 12px;
  212. font-size: 18px;
  213. font-weight: bold;
  214. text-align: center;
  215. &.blue {
  216. background: #4095E5;
  217. color: white;
  218. }
  219. &.green {
  220. background: #17A854;
  221. color: white;
  222. }
  223. }
  224. .tree-box {
  225. position: relative;
  226. height: calc(100% - 50px);
  227. overflow: hidden;
  228. &.blue {
  229. border: 1px solid #4095e5;
  230. border-top: 0;
  231. }
  232. &.green {
  233. border: 1px solid #17A854;
  234. border-top: 0;
  235. }
  236. }
  237. </style>
  238. <style lang="scss">
  239. .h-h.el-row,
  240. .h-h.el-row .el-col {
  241. height: 100%;
  242. }
  243. </style>