Explorar el Código

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	public/version.json
#	src/api/system/user.js
#	src/views/formula/edit.vue
#	src/views/formula/formulaStringToArray.js
#	src/views/manager/projectinfo/tree.vue
#	src/views/manager/wbsinfo.vue
zhuwei hace 3 días
padre
commit
04c18b44f4

+ 1 - 1
public/version.json

@@ -1,3 +1,3 @@
 {
-  "value": "20251022164630"
+  "value": "20251020142404"
 }

+ 4 - 6
src/api/formula/formula.js

@@ -10,7 +10,7 @@ export const getTypeMap = (params) => {
   })
 }
 
-export const saveFormula = ({formula,remark,nodeId,elementId,scale,number,map,scope,projectId,dev,ver,formulas,method}) => {
+export const saveFormula = ({formula,remark,nodeId,elementId,scale,number,map,scope,projectId,dev,ver,formulas}) => {
   return request({
     url: '/api/blade-manager/formula/save',
     method: 'post',
@@ -26,13 +26,12 @@ export const saveFormula = ({formula,remark,nodeId,elementId,scale,number,map,sc
       projectId,
       dev,
       ver,
-      formulas,
-      method
+      formulas
     }
   })
 }
 
-export const updateFormula = ({id,formula,remark,nodeId,elementId,scale,number,map,scope,dev,formulas,method}) => {
+export const updateFormula = ({id,formula,remark,nodeId,elementId,scale,number,map,scope,dev,formulas}) => {
   return request({
     url: '/api/blade-manager/formula/update',
     method: 'post',
@@ -47,8 +46,7 @@ export const updateFormula = ({id,formula,remark,nodeId,elementId,scale,number,m
       map,
       scope,
       dev,
-      formulas,
-      method
+      formulas
     }
   })
 }

+ 3 - 0
src/api/system/user.js

@@ -1,5 +1,6 @@
 import request from '@/router/axios';
 
+
 export const getList = (current, size, params, deptId) => {
     return request({
         url: '/api/blade-user/page',
@@ -12,6 +13,7 @@ export const getList = (current, size, params, deptId) => {
         }
     })
 }
+
 export const remove = (ids) => {
     return request({
         url: '/api/blade-user/remove',
@@ -165,3 +167,4 @@ export const getListBySearch = (params) => {
         params
     })
 }
+

+ 0 - 35
src/styles/common.scss

@@ -165,38 +165,3 @@ a{
   margin-right: 4px;
 }
 
-// 表单搜索框高亮显示
-.hc-search-highlight {
-   position: relative;
-}
-.hc-search-highlight::before {
-    content: '';
-    position: absolute;
-    background-color: rgba(157, 206, 255, 0.4) !important;
-    border-radius: 5px;
-    top: -2px;
-    left: -2px;
-    right: -2px;
-    bottom: -2px;
-    z-index: 1;
-    pointer-events: none;
-}
-
-// 文案关键词高亮显示
-.hc-keyword-highlight {
-   position: relative;
-   display: inline;
-}
-.hc-keyword-highlight::before {
-    content: '';
-    position: absolute;
-    background-color: rgba(157, 206, 255, 0.4) !important;
-    // border-radius: 3px;
-    top: -1px;
-    left: 0;
-    right: 0;
-    bottom: -1px;
-    // z-index: 1;
-    pointer-events: none;
-}
-

+ 0 - 16
src/util/util.js

@@ -391,20 +391,4 @@ export const downloadXls = (fileArrayBuffer, filename) => {
 }
 export const isObjectEmpty=(obj)=> {
   return JSON.stringify(obj) === '{}';
-}
-
-/**
- * 关键词高亮
- * @param {String} text   原始文本
- * @param {String} key    关键词
- * @returns {String}      返回带标签的字符串
- */
-export function highlight(text = '', key = '') {
-  if (!key) return text
-  const reg = new RegExp(
-    // 把用户输入的特殊符号转义,防止正则报错
-    key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'),
-    'g', // g 全局  i 忽略大小写
-  )
-  return text.replace(reg, str => [...str].map( el => `<span class="hc-keyword-highlight">${el}</span>`).join(''))
 }

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 353 - 452
src/views/exctab/exceltab.vue


+ 2 - 20
src/views/formula/component/deviationRange/deviationRange.vue

@@ -21,12 +21,12 @@
       <span style="width:60px"></span>
       <template v-if="!(symbol == '<' || symbol== '≤')">
         <span class="textblod mg-r-10"></span>
-        <vue-tags-input v-model="tag1" :tags="tags1" @focus="curFocusIndex = 1" @blur="inputBlur(1)" placeholder="输入/参数" @before-adding-tag="beforeAddingTag"  @tag-clicked="handleTagClick($event,1)" ref="tagsInput1"/>
+        <vue-tags-input v-model="tag1" :tags="tags1" @focus="curFocusIndex = 1" @blur="inputBlur(1)" placeholder="输入/参数" @before-adding-tag="beforeAddingTag"/>
         <span style="width:20px"></span>
       </template>
       <template v-if="!(symbol == '>' || symbol== '≥')">
         <span class="textblod mg-r-10"></span>
-        <vue-tags-input v-model="tag2" :tags="tags2" @focus="curFocusIndex = 2" @blur="inputBlur(2)" placeholder="输入/参数" @before-adding-tag="beforeAddingTag"  @tag-clicked="handleTagClick($event,2)" ref="tagsInput2"/>
+        <vue-tags-input v-model="tag2" :tags="tags2" @focus="curFocusIndex = 2" @blur="inputBlur(2)" placeholder="输入/参数" @before-adding-tag="beforeAddingTag"/>
       </template>
     </div>
 
@@ -478,24 +478,6 @@ export default {
       })
       this.inputVisible = false;
     },
-    handleTagClick(info,index) {
-     
-       const {tag}=info;
-
-       
-      this.curFocusIndex = index
-     
-      
-      // 调用对应输入框的 focus() 方法
-        if (this.curFocusIndex === 1) {
-          this.$refs.tagsInput1.focus(); // 注意:确保组件已挂载,使用可选链避免报错
-        } else {
-          this.$refs.tagsInput2.focus();
-        }
-
-  
-       this.$emit('clickTag',tag)
-    },
 
   }
 }

+ 37 - 111
src/views/formula/component/formulaItem.vue

@@ -1,28 +1,9 @@
 <template>
-  <div class="inline-container">
-    <!-- 元素标签 -->
-    <el-tag 
-      v-if="item.type === 'Element'"
-      type="info"   
-      :effect="item.selected ? 'dark' : 'plain'"
-      @click="itemClick(item)"
-      class="ellipse-tag"
-      :class="{'selected-tag': item.selected}"
-    > 
-      {{ item.name }}
-    </el-tag>
-    <span 
-      :class="getItemClass(item)" 
-      @click="itemClick(item)" 
-      v-else
-      class="element-span"
-    >
-      {{ item.name }}
-    </span>
+  <span :class="getItemClass(item)" @click="itemClick(item)">
+    {{item.name}}
     
-    <!-- 光标指示器 - 选中时或强制显示时显示 -->
-    <span v-if="isShowCursor&&(item.selected || showCursor)" class="cursor-blink"></span>
-  </div>
+  </span>
+  
 </template>
 
 <script>
@@ -31,103 +12,48 @@ export default {
   props: {
     item: {
       type: Object,
-      default: () => ({})
-    },
-    // 新增属性:用于强制显示光标
-    showCursor: {
-      type: Boolean,
-      default: false
+      default: function () {
+        return {};
+      }
     },
-    isShowCursor: {
-      type: Boolean,
-      default: true
-    }//是否显示光标
+   
+  },
+  data(){
+    return{
+
+    }
   },
-  methods: {
-    itemClick(item) {
-      // 切换选中状态
+  methods:{
+    itemClick(item){
       item.selected = !item.selected;
-      this.$emit('click', {
-        selected: item.selected,
+      this.$emit('click',{
+        selected:item.selected,
         item
-      });
+      })
     },
-    getItemClass(item) {
-      return {
-        'element-class': true,
-        'selected': item.selected
-      };
+    getItemClass(item){
+      let obj = {};
+      // obj[item.type.toLocaleLowerCase()+'-class']=true;
+      obj['element-class']=true;
+      if(item.selected){
+        obj.selected = true;
+      }
+      return obj;
     }
   }
 }
 </script>
-
 <style scoped lang="scss">
-// 共用样式
-.element-class, .ellipse-tag {
-  display: inline-flex;
-  align-items: center; // 纵向居中对齐
-  justify-content: center;
-  vertical-align: middle; // 确保与其他元素对齐
-  box-sizing: border-box;
-}
-
-.element-class {
-  cursor: pointer;
-  padding: 0 3px;
-  height: 32px; // 与tag保持一致高度
-  
-  &.selected {
-    color: #f0720a;
+  .element-class{
+    cursor: pointer;
+    padding: 0 3px;
+    &.selected{
+      color: rgba(64,149,229,1);
+    }
   }
-}
-
-// 标签样式
-.ellipse-tag {
-  border-radius: 50px !important; // 椭圆样式
-  padding: 0 12px !important;
-  height: 32px; // 固定高度确保对齐
-  transition: all 0.2s ease; // 平滑过渡效果
-  background-color: #E7E7E7 !important; // 默认背景色
-  border-color: #E7E7E7 !important;    // 默认边框色
-  color: #333 !important;              // 默认文字色
-  
-  &.selected-tag {
-    background-color: #909399 !important; // 选中状态背景色
-    border-color: #909399 !important;    // 选中状态边框色
-    color: #fff !important;              // 选中状态文字色
-    transform: scale(1.05);
-    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
-    margin-left: 8px;
-    margin-right: 5px;
+  .text-blue{
+    font-size: 20px;
+    color: rgba(64,149,229,1);
+    font-weight:bold;
   }
-}
-
-// 确保span和tag在同一行时对齐
-.element-span {
-  display: inline-flex;
-  align-items: center;
-  height: 32px;
-}
-
-// 新增样式
-.inline-container {
-  display: inline-flex;
-  align-items: center;
-}
-
-// 光标样式 - 模拟输入框闪烁效果
-.cursor-blink {
-  width: 2px;
-  height: 1.2em;
-  background-color: #333;
-  margin: 0 1px;
-  animation: blink 1s step-end infinite;
-}
-
-@keyframes blink {
-  from, to { background-color: transparent }
-  50% { background-color: #333 }
-}
-
-</style>
+</style>

+ 7 - 446
src/views/formula/component/table-form-write.vue

@@ -1,458 +1,19 @@
 <template>
-  <div class="excelHtnl">
-    <div
-      class="excelBox hc-excel-table-form"
-      style="margin-top:40px;height: 100%;"
-      @click="parentClick($event)"
-    >
-      <div style="width:100%;height: 100%;overflow: scroll;" class='parent' :id="containerId"></div>
-    </div>
-  </div>
+  <div>66666</div>
 </template>
 
 <script>
-import Vue from 'vue'
-import { getExcelHtml } from '@/api/exctab/excelmodel'
-
 export default {
-  props: [
-    'pkeyId', 
-    'initTableName',
-    'selectedTableKey',
-    'containerId',
-    'multipleSelect'  // 是否允许多选,默认为false
-  ],
-  data() {
-    return {
-      selectedElements: [],
-      exHtml: '',
-      currentComponent: null
-    }
-  },
-  created() {
-    if (!this.containerId) {
-      this.containerId = `excel-container-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
-    }
-  },
-  watch: {
-    pkeyId: {
-      immediate: true,
-      deep: true,
-      handler(newVal) {
-        if (newVal) {
-          this.exHtml = ''
-          this.getExcelHtml(newVal)
-        } else {
-          this.exHtml = ''
-          this.clearForm()
-        }
-      }
-    },
-    selectedTableKey: {
-      handler(newKey) {
-        this.clearAllSelected();
-        if (newKey && newKey.startsWith('key_')) {
-          this.highlightElementsByKey(newKey);
-        }
-      },
-      immediate: true
-    },
-    containerId: {
-      handler(newVal) {
-        this.clearForm()
-        this.selectedElements = [];
-      },
-      immediate: true
-    },
-    multipleSelect: {
-      handler(newVal) {
-        // 当多选模式改变时,清空当前选择
-        if (!newVal && this.selectedElements.length > 1) {
-          // 如果关闭多选且当前有多个选中,只保留最后一个
-          const lastElement = this.selectedElements[this.selectedElements.length - 1];
-          this.clearAllSelected();
-          this.selectElements([lastElement]);
-        }
-      },
-      immediate: true
-    }
+  name: "table-form-write",
+  props: {
+  
   },
   methods: {
-    // 获取当前组件容器元素,封装为工具方法
-    getContainer() {
-      return document.getElementById(this.containerId);
-    },
-    
-    // 获取当前所有有橙色背景且去重的元素列表
-    getCurrentSelectedElements() {
-      const container = this.getContainer();
-      if (!container) return [];
-      
-      // 获取所有有橙色背景的元素
-      const orangeElements = container.querySelectorAll('[style*="background-color: rgb(255, 165, 0)"], [style*="background-color:#ffa500"]');
-      
-      // 根据 tableElementKey 去重
-      const uniqueElements = [];
-      const seenKeys = new Set();
-      
-      orangeElements.forEach(el => {
-        if (el.id) {
-          const tableElementKey = this.initTableName + ':' + this.extractKeyPrefix(el.id);
-          if (!seenKeys.has(tableElementKey)) {
-            seenKeys.add(tableElementKey);
-            const keyName = el.placeholder || '';
-            uniqueElements.push({
-              tableElementKey: tableElementKey,
-              eName: keyName,
-              id: el.id
-            });
-          }
-        }
-      });
-      
-      return uniqueElements;
-    },
-    
-    highlightElementsByKey(key) {
-      if (!key) return;
-      
-      const container = this.getContainer();
-      if (!container) return;
-      
-      const keyPrefix = key.split('__')[0];
-      // 只在当前容器内查找元素
-      const samePrefixElements = container.querySelectorAll(`[id^="${keyPrefix}__"]`);
-      
-      if (samePrefixElements.length === 0) {
-        const element = container.querySelector(`#${key}`);
-        if (element) {
-          this.selectElements([element]);
-          return;
-        }
-      }
-      
-      this.selectElements(samePrefixElements);
-    },
-    
-    async getExcelHtml(pkeyId) {
-      this.clearForm();
-      try {
-        const { data: res } = await getExcelHtml({ pkeyId })
-        if (res.code === 200) {
-          this.exHtml = res.data
-          this.cop();
-        }
-      } catch (error) {
-        console.error('获取HTML失败:', error)
-      }
-    },
-    
-    clearForm() {
-      const container = this.getContainer();
-      if (container) {
-        container.innerHTML = '';
-      }
-      this.clearAllSelected();
-    },
-    
-    async cop() {
-      const container = this.getContainer();
-      if (!container) {
-        console.error('父容器不存在:', this.containerId);
-        return;
-      }
-      
-      try {
-        const MyComponent = Vue.extend({
-          template: this.exHtml,
-          data() {
-            return {
-              formData: {},
-              getTokenHeader: {},
-              dap_site_data: {}
-            }
-          },
-          methods: {
-            contextmenuClick() {},
-            getInformation() {},
-            formUploadSuccess() {},
-            formUploadExceed() {},
-            formUploadLoading() {},
-            delTableFormFile() {},
-            formUploadError() {},
-            uploadprogress() {},
-            formRemoteMethod() {},
-            getRegularExpression() {},
-            checkboxGroupChange() {},
-            formRemoteChange() {},
-            dateKeydown() {},
-            keyupShiftUp() {},
-            keyupShiftDown() {},
-            keyupShiftLeft() {},
-            keyupShiftRight() {},
-            inputLeftClick() {},
-          }
-        });
-        
-        // 销毁旧组件
-        if (this.currentComponent) {
-          this.currentComponent.$destroy();
-        }
-        
-        // 创建新组件
-        this.currentComponent = new MyComponent().$mount();
-        
-        // 添加到当前容器
-        container.innerHTML = '';
-        container.appendChild(this.currentComponent.$el);
-        
-        this.$nextTick(() => {
-          if (this.selectedTableKey) {
-            this.highlightElementsByKey(this.selectedTableKey);
-          }
-        });
-      } catch (error) {
-        console.error('组件渲染失败:', error);
-      }
-    },
-    
-    async parentClick(e) {
-      e.stopPropagation(); // 阻止事件冒泡到其他组件
-      
-      const container = this.getContainer();
-      if (!container || !container.contains(e.target)) {
-        return; // 不是当前组件内的点击,不处理
-      }
-      
-      // 检测Control键是否按下 (e.ctrlKey 对Windows/Linux有效,e.metaKey对Mac的Command键有效)
-      const isCtrlPressed = e.ctrlKey || e.metaKey;
-      // 只有在multipleSelect为true时才允许通过Control键进行多选
-      const isMultiSelectMode = this.multipleSelect && isCtrlPressed;
-      
-      // 只在当前容器内查找目标元素
-      let target = e.target;
-      while (target && target !== container && !target.id) {
-        target = target.parentNode;
-      }
-      
-      if (!target || !target.id || !container.contains(target)) {
-        return;
-      }
-      
-      // 检查警告样式
-      let hasWarnStyle = false;
-      if (target.classList.contains('warnstyle') || 
-          (target.parentNode && target.parentNode.classList.contains('warnstyle'))) {
-        hasWarnStyle = true;
-      }
 
-      if (hasWarnStyle) {
-        this.$message({
-          type: "warning",
-          message: "当前位置未配置元素,请重新选择或配置元素后再试"
-        });
-        return;
-      }
-      
-      const id = target.id;
-      const elementId = this.initTableName + ':' + this.extractKeyPrefix(id);
-      
-      // 检查是否已经有相同 tableElementKey 的元素被选中
-      const isSameKeySelected = this.selectedElements.some(item => 
-        item.tableElementKey === elementId
-      );
-      
-      // 根据是否按下Control键决定是否清空已选元素
-      if (!isMultiSelectMode) {
-        this.clearAllSelected();
-      }
-      
-      if (!isSameKeySelected) {
-        if (id.startsWith('key_')) {
-          const keyPrefix = this.extractKeyPrefix(id);
-          // 只在当前容器内查找同前缀元素
-          const samePrefixElements = container.querySelectorAll(`[id^="${keyPrefix}__"]`);
-          this.selectElements(samePrefixElements);
-        } else {
-          this.handleNormalElement(target, id);
-        }
-      } else {
-        // 如果已经有相同 tableElementKey 的元素被选中,在多选模式下点击会取消选择所有相同key的元素
-        if (isMultiSelectMode) {
-          this.deselectElementsByKey(elementId);
-        }
-      }
-    },
-    
-    extractKeyPrefix(id) {
-      const parts = id.split('__');
-      return parts.length > 0 ? parts[0] : id;
-    },
-    
-    selectElements(elements) {
-      const container = this.getContainer();
-      if (!container) return;
-      
-      // 先取消选择所有相同 tableElementKey 的元素(避免重复)
-      if (elements.length > 0) {
-        const firstElementId = this.initTableName + ':' + this.extractKeyPrefix(elements[0].id);
-        this.deselectElementsByKey(firstElementId);
-      }
-      
-      elements.forEach(el => {
-        // 确保元素属于当前容器
-        if (!container.contains(el)) return;
-        
-        const index = this.selectedElements.findIndex(item => item.id === el.id);
-        
-        if (index === -1) {
-          el.style.backgroundColor = '#ffa500';
-          const elementId = this.initTableName + ':' + this.extractKeyPrefix(el.id);
-          const keyName = el.placeholder || '';
-          const newElement = { tableElementKey: elementId, eName: keyName, id: el.id };
-          this.selectedElements.push(newElement);
-          
-          // 传递当前所有有橙色背景且去重的元素
-          const currentSelected = this.getCurrentSelectedElements();
-          this.$emit('element-selected', newElement, true, currentSelected);
-        }
-      });
-    },
-    
-    // 取消选择所有具有相同 tableElementKey 的元素
-    deselectElementsByKey(tableElementKey) {
-      const container = this.getContainer();
-      if (!container) return;
-      
-      // 找出所有相同 tableElementKey 的元素
-      const elementsToDeselect = this.selectedElements.filter(item => 
-        item.tableElementKey === tableElementKey
-      );
-      
-      if (elementsToDeselect.length === 0) return;
-      
-      // 清除样式并从选中列表中移除
-      elementsToDeselect.forEach(item => {
-        const element = container.querySelector(`#${item.id}`);
-        if (element) {
-          element.style.backgroundColor = '';
-        }
-        // 传递当前所有有橙色背景且去重的元素
-        const currentSelected = this.getCurrentSelectedElements();
-        this.$emit('element-selected', item, false, currentSelected);
-      });
-      
-      // 从选中列表中移除这些元素
-      this.selectedElements = this.selectedElements.filter(item => 
-        item.tableElementKey !== tableElementKey
-      );
-    },
-    
-    handleNormalElement(target, id) {
-      const container = this.getContainer();
-      if (!container || !container.contains(target)) return;
-      
-      const elementId = this.initTableName + ':' + target.id.split('__')[0];
-      const keyName = target.placeholder || '';
-      
-      if(!keyName){
-        this.$message({
-          type: "warning",
-          message: "当前位置未配置元素,请重新选择或配置元素后再试"
-        });
-        return;
-      }
-      
-      // 先取消选择相同 tableElementKey 的元素
-      this.deselectElementsByKey(elementId);
-      
-      target.style.backgroundColor = '#ffa500';
-      const newElement = { tableElementKey: elementId, eName: keyName, id };
-      this.selectedElements.push(newElement);
-      
-      // 传递当前所有有橙色背景且去重的元素
-      const currentSelected = this.getCurrentSelectedElements();
-      this.$emit('element-selected', newElement, true, currentSelected);
-    },
-    
-    clearAllSelected() {
-      const container = this.getContainer();
-      if (!container) return;
-      
-      this.selectedElements.forEach(item => {
-        // 只清除当前容器内的元素样式
-        const element = container.querySelector(`#${item.id}`);
-        if (element) {
-          element.style.backgroundColor = '';
-          // 传递当前所有有橙色背景且去重的元素
-          const currentSelected = this.getCurrentSelectedElements();
-          this.$emit('element-selected', { 
-            tableElementKey: item.tableElementKey, 
-            eName: item.eName, 
-            id: item.id 
-          }, false, currentSelected);
-        }
-      });
-      this.selectedElements = [];
-    }
   }
 }
 </script>
 
-<style lang="scss" scoped>
-/* 样式保持不变 */
-.excelHtnl {
-  margin: 0 0 0 10px;
-  background-color: #fff;
-  box-sizing: border-box;
-  padding: 0 20px 100px 20px;
-  height: 100%;
-}
-
-.hc-upload-table-form {
-  position: relative;
-  height: 100%;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-}
-.hc-upload-table-form .el-upload {
-  position: relative;
-  flex: 1;
-  height: 100%;
-  color: #ccc;
-}
-.hc-upload-table-form .el-upload .hc-table-form-icon {
-  font-size: 24px;
-  font-weight: 100;
-}
-.hc-upload-table-form .el-upload .hc-table-form-img {
-  width: 100%;
-  height: 100%;
-}
-
-.excelBox {
-  ::v-deep .oldlace-bg {
-    background-color: oldlace;
-  }
-  ::v-deep .select-td {
-    border-width: 4px;
-    border-color: #E6A23C;
-    border-style: solid;
-  }
-}
-
-::v-deep .warnstyle .el-input__inner {
-  background-image: url('/img/login/warn.png') !important;
-  background-repeat: no-repeat;
-  background-size: cover;
-  background-position: center
-}
-
-::v-deep .warnstyle .el-textarea__inner {
-  background-image: url('/img/login/warn.png') !important;
-  background-repeat: no-repeat;
-  background-position-x: 45%;
-  background-position-y: 46%;
-}
-</style>
+<style scoped lang="scss">
+</style>
+    

+ 232 - 132
src/views/formula/edit.vue

@@ -66,15 +66,24 @@
       </div>
     </div>
     <div v-show="operationVisible" class="operation-box flex1 flex flex-d-c ov-hidden">
-      <div class="flex ">
-        <div>选择参数设置</div>
-        <div style="margin-left: 29%;font-weight: 700;">公式配置</div>
-      </div>
+      <div>选择参数设置</div>
       <div class="flex flex-d-c flex1 ov-hidden">
         <el-row :gutter="20" class="flex1 ov-hidden">
           <el-col :span="8" class="h-100p">
             <el-card shadow="never" v-loading="treeLoad" class="h-100p ov-auto">
               <el-scrollbar style="height: 100%">
+                <!-- <el-tree
+                  class="filter-tree"
+                  lazy
+                  :load="loadNode"
+                  @node-click="getNodeDetail"
+                  :props="defaultProps"
+                  :expand-on-click-node="false"
+                  highlight-current
+                  node-key="id"
+                  ref="tree"
+                >
+                </el-tree> -->
 
                 <el-tree
                   class="filter-tree"
@@ -92,77 +101,70 @@
             </el-card>
           </el-col>
           <el-col :span="16" class="h-100p flex flex-d-c ov-hidden">
-            <div class="operation-box">
-              <!-- 运算符选择区域 -->
-                  <div class="flex jc-sb operation-symbol-box">
-
-                    <div class="icon-box ">
-                        <span class="text-sm" >插入运算符:</span>
-
-                      <el-link type="primary" @click="addOperator('+')" icon="el-icon-circle-plus-outline"></el-link>
-                      <el-link  type="primary" @click="addOperator('-')" icon="el-icon-remove-outline"></el-link>
-                      <el-link type="primary" @click="addOperator('*')" icon="el-icon-circle-close"></el-link>
-                      <el-link  type="primary" @click="addOperator('%')">÷</el-link>
-                       <el-link type="primary" class="mg-r-10" @click="addBrackets('(',false)">(</el-link>
-                      <el-link  type="primary" class="mg-r-10" @click="addBrackets(')',true)">)</el-link>
-                        <el-link type="primary" @click="addText">固定值</el-link>
-                    </div>
-                    <div>
-                      操作
-                    <el-link  icon="el-icon-delete" type="danger" @click="removeSelect"></el-link>
-                    </div>
-                  </div>
-
-               <div
-                  class="border-grey sele-ele-box1"
-
-                  tabindex="0"
-                  @keydown.left="handleLeftArrow"
-                  @keydown.right="handleRightArrow"
-                  @keydown.delete="handleDelete"
-                  @keydown.shift.189="addOperator('-')"
-                  @keydown.shift.191="addOperator('/')"
-                  @keydown.shift.57="addBrackets('(')"
-                  @keydown.shift.48="addBrackets(')')"
-                  @keydown.shift.187="addOperator('+')"
-                  @keydown.shift.56="addOperator('*')"
-                  @focus="containerFocused = true"
-                  @blur="containerFocused = false"
-                >
-                  <draggable v-model="selectEleFormula">
-                    <formula-item
-                      v-for="(item,index) in selectEleFormula"
-                      :key="index"
-                      :item="item"
-                      @click="obj => eleFormulaClick(obj,index)"
-                    >
-                    </formula-item>
-                  </draggable>
-                </div>
-
-                  <div class="flex mg-t-10" style="justify-content: space-between;width:100%;">
-                    <el-select v-model="eleTableId" @change="getTableEle" placeholder="请选择元素表1" style="width:45%"  size="small">
-                      <el-option v-if="paramDataList.length" label="选择节点参数2" value="选择节点参数"></el-option>
-                      <el-option  v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="(item.pkeyId!==null&&item.pkeyId!==-1)?item.pkeyId:item.id"></el-option>
-                    </el-select>
+            <div class="flex" style="justify-content: space-between;width:100%">
+               <el-select v-model="eleTableId" @change="getTableEle" placeholder="请选择元素表1" style="width:45%">
+                <el-option v-if="paramDataList.length" label="选择节点参数2" value="选择节点参数"></el-option>
+                <el-option  v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="(item.pkeyId!==null&&item.pkeyId!==-1)?item.pkeyId:item.id"></el-option>
+              </el-select>
+              <!-- 搜索元素下拉框 -->
+              <el-select v-model="input3" filterable clearable placeholder="搜索元素字段"  @change="getInput" style="width:45%">
+              <el-option
+                v-for="item in eleList1"
+                :key="item.id"
+                :label="item.eName"
+                :value="item.eName">
+              </el-option>
+              </el-select>
+            </div>
 
-                     <div class="text-align-c">
-                      <el-button size="small" @click="canceloperationVisible ">取消</el-button>
-                      <el-button size="small" @click="operationHandle" type="primary">保存</el-button>
+            <div class="mg-t-10 no-mb-col flex1 ov-hidden">
+              <el-scrollbar style="height: 100%">
+                <el-row v-loading="eleListable"  v-if="eleList.length>0">
+                  <el-col :span="6" v-for="item in eleList" :key="item.id" >
+                    <div class="ele-box">
+                      <span v-if="item.k">{{item.name}}</span>
+                      <span v-else>{{item.eName}}</span>
+                      <el-checkbox v-model="item.checked" @change="value => eleChang(value,item)"></el-checkbox>
                     </div>
-                  </div>
-
-                <div class="mg-t-10 no-mb-col flex1" >
-                  <el-scrollbar style="height: 450px">
-
-                     <tableFormWrite :pkeyId="eleTableId" @element-selected="handleElementSelected" :initTableName="initTableName"  :selectedTableKey="selectedTableKey"  :key="1" :container-id="'excel-container-1'" ></tableFormWrite>
-                  </el-scrollbar>
-                </div>
 
+                  </el-col>
+                </el-row>
+                <el-row v-else style="text-align: center;line-height: 328px;border:1px solid #bbb">暂无数据</el-row>
+              </el-scrollbar>
+            </div>
+            <div class="flex jc-sb">
+              <!-- <div>定位数据位置:</div> -->
+              <div class="icon-box">
+                <el-link :underline="false" icon="el-icon-delete" type="danger" @click="removeSelect"></el-link>
+                <el-link :underline="false" type="primary" @click="addOperator('+')" icon="el-icon-circle-plus-outline"></el-link>
+                <el-link :underline="false" type="primary" @click="addOperator('-')" icon="el-icon-remove-outline"></el-link>
+                <el-link :underline="false" type="primary" @click="addOperator('*')" icon="el-icon-circle-close"></el-link>
+                <el-link :underline="false" type="primary" @click="addOperator('%')">÷</el-link>
+              </div>
+              <div>
+                <!-- <el-link :underline="false" type="primary" class="mg-r-20" @click="eleAddFormula">元素添加到公式</el-link> -->
+                <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets('(',false)">(</el-link>
+                <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets(')',true)">)</el-link>
+                <!-- <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets('[',false)">【</el-link>
+                <el-link :underline="false" type="primary" class="mg-r-10" @click="addBrackets(']',true)">】</el-link> -->
+                <el-link :underline="false" type="primary" @click="addText">输入值</el-link>
+              </div>
+            </div>
+            <div class="border-grey sele-ele-box" style="height:50px">
+              <draggable v-model="selectEleFormula">
+                <formula-item
+                  v-for="(item,index) in selectEleFormula" :key="index"
+                  :item="item" @click="obj => eleFormulaClick(obj,index)"
+                >
+                </formula-item>
+              </draggable>
             </div>
           </el-col>
         </el-row>
-
+        <div class="text-align-c">
+          <el-button size="small" @click="operationHandle" type="primary">保存</el-button>
+          <el-button size="small" @click="canceloperationVisible ">取消</el-button>
+        </div>
       </div>
     </div>
     <div v-show="!operationVisible && !showFunDetail && !deviationRange.show">
@@ -221,7 +223,6 @@
                 :remark="remark"
                 :method="method"
                 @clickTag="handleClickTagElse"
-                :method="method"
                 >
               </component>
                 <div class="flex1" v-show="item.showSelectEle" style="margin-top:10px;margin-bottom:30px">
@@ -244,13 +245,13 @@
               </div>
                 <div v-show="item.showSelectEle"  style="width:60%">
                   <div  class="flex" style="justify-content: space-between;width:100%">
-                        <el-select v-model="eleTableIdComp" @change="getTableEleComp" placeholder="请选择元素表" style="width:45%" size="small" clearable>
+                        <el-select v-model="eleTableIdComp" @change="getTableEleComp" placeholder="请选择元素表" style="width:45%">
                         <el-option v-if="paramDataList.length" label="选择节点参数" value="选择节点参数"></el-option>
                         <!-- <el-option  v-for="item in eleTableListComp" :key="item.id" :label="item.tableName" :value="(item.pkeyId!==null&&item.pkeyId!==-1)"></el-option> -->
                                                  <el-option  v-for="item in eleTableListComp" :key="item.id" :label="item.tableName" :value="item.pkeyId"></el-option>
                       </el-select>
                       <!-- 搜索元素下拉框 -->
-                      <el-select v-model="input3" filterable placeholder="搜索元素字段888"  @change="getInput1" style="width:45%" size="small">
+                      <el-select v-model="input3" filterable placeholder="搜索元素字段"  @change="getInput1" style="width:45%">
                       <el-option
                         v-for="item in eleListComp1"
                         :key="item.id"
@@ -261,6 +262,8 @@
                   </div>
 
                   <!-- <div class="mg-t-10 mg-b-10 no-mb-col" style="width:100%">
+
+                  <div class="mg-t-10 mg-b-10 no-mb-col" style="width:100%">
                     <el-scrollbar style="height:520px;">
                       <el-row>
                         <el-col :span="6" v-for="item in eleListComp" :key="item.id">
@@ -278,7 +281,7 @@
 
                       <tableFormWrite :pkeyId="eleTableIdComp"   @element-selected="(obj, val) => handleElementSelectedComp(obj, val, index)" :initTableName="initTableNameComp"    :key="2"   :container-id="'excel-container-2'" :selectedTableKey="selectedTableKeyComp"></tableFormWrite>
                     </el-scrollbar>
-                </div>
+                  </div>
                 </div>
             </div>
           </template>
@@ -290,7 +293,7 @@
     <div v-if="!operationVisible && !showFunDetail && deviationRange.show" class="flex1">
       <div class="flex">
         <div class=" flex-d-c"  style="width:40%">
-          <deviation-range ref="deviationrange" :formulainfo="deviationRange" :formulamap="formulaMap" @uncheck="unCheckEleComp" class="flex1" @clickTag="handleClickTag"></deviation-range>
+          <deviation-range ref="deviationrange" :formulainfo="deviationRange" :formulamap="formulaMap" @uncheck="unCheckEleComp" class="flex1"></deviation-range>
           <div class="flex1" v-show="deviationRange.showSelectEle" style="margin-top:10px;margin-bottom:30px">
             <el-scrollbar style="height: 400px">
               <el-tree
@@ -313,20 +316,23 @@
                 <el-select v-model="eleTableIdComp" @change="getTableEleComp" placeholder="请选择元素表" style="width:45%" clearable size="small">
 
                 <el-option  v-for="item in eleTableListComp" :key="item.id" :label="item.tableName":value="item.pkeyId"></el-option>
+                <el-select v-model="eleTableIdComp" @change="getTableEleComp" placeholder="请选择元素表" style="width:45%">
+                <el-option v-if="paramDataList.length" label="选择节点参数" value="选择节点参数"></el-option>
+                <el-option  v-for="item in eleTableListComp" :key="item.id" :label="item.tableName" :value="(item.pkeyId!==null&&item.pkeyId!==-1)"></el-option>
               </el-select>
            <!-- 搜索元素下拉框 -->
-              <!-- <el-select v-model="input3" filterable clearable placeholder="搜索元素字段999"  @change="getInput1" style="width:45%" size="small">
+              <el-select v-model="input3" filterable clearable placeholder="搜索元素字段"  @change="getInput1" style="width:45%">
                   <el-option
                     v-for="item in eleListComp1"
                     :key="item.id"
                     :label="item.eName"
                     :value="item.eName">
                   </el-option>
-              </el-select> -->
+              </el-select>
            </div>
 
           <div class="mg-t-10 mg-b-10 no-mb-col" style="width:100%">
-            <!-- <el-scrollbar style="height:520px;">
+            <el-scrollbar style="height:520px;">
               <el-row>
                 <el-col :span="6" v-for="item in eleListComp" :key="item.id">
                   <div class="ele-box">
@@ -336,6 +342,7 @@
                   </div>
                 </el-col>
               </el-row>
+            </el-scrollbar>
             </el-scrollbar> -->
              <el-scrollbar style="height: 520px">
 
@@ -360,7 +367,7 @@
       </div>
     </el-dialog>
 
-    <el-dialog title="选择元素222" :visible.sync="chooseEleVisible" width="80%" append-to-body :close-on-click-modal="false">
+    <el-dialog title="选择元素" :visible.sync="chooseEleVisible" width="70%" append-to-body :close-on-click-modal="false">
       <div>
         <el-row :gutter="20">
           <el-col :span="8">
@@ -383,15 +390,28 @@
           </el-col>
           <el-col :span="16">
              <div  class="flex" style="justify-content: space-between;width:100%">
-               <el-select v-model="eleTableId" @change="getTableEle" placeholder="请选择元素表" size="small">
+               <el-select v-model="eleTableId" @change="getTableEle" placeholder="请选择元素表">
                 <el-option v-if="paramDataList.length" label="选择节点参数3" value="选择节点参数"></el-option>
+                <!-- <template v-if="pid">
+                    <el-option  v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="(item.pkeyId!==null&&item.pkeyId!==-1)"></el-option>
+                </template> -->
 
                 <template>
+                    <!-- <el-option  v-for="item in eleTableList" :key="item.pkeyId" :label="item.tableName" :value="item.pkeyId"></el-option> -->
 
                          <el-option  v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="(item.pkeyId!==null&&item.pkeyId!==-1)?item.pkeyId:item.id"></el-option>
                 </template>
 
               </el-select>
+              <!-- 搜索元素下拉框 -->
+                <el-select v-model="input3" filterable clearable placeholder="搜索元素字段"  @change="getInput" style="width:45%">
+                <el-option
+                  v-for="item in eleList1"
+                  :key="item.id"
+                  :label="item.eName"
+                  :value="item.eName">
+                </el-option>
+                </el-select>
 
              </div>
 
@@ -400,6 +420,16 @@
               <el-scrollbar style="height: 460px">
 
                     <tableFormWrite :pkeyId="eleTableId"      :multiple-select="true"  @element-selected="(obj, val,list) => handleElementSelectedList(obj, val, list)" :initTableName="initTableNameList"    :key="tableKey"   :container-id="'excel-container-'+tableKey"  :selectedTableKey="selectedTableKeyList"></tableFormWrite>
+                <el-row v-loading="eleListable"  v-if="eleList.length>0">
+                  <el-col :span="6" v-for="item in eleList" :key="item.id">
+                    <div class="ele-box">
+                      <span v-if="item.k">{{item.name}}</span>
+                      <span v-else>{{item.eName}}</span>
+                      <el-checkbox v-model="item.checked" @change="value => eleCheckHandle(value,item)"></el-checkbox>
+                    </div>
+                  </el-col>
+                </el-row>
+                 <el-row v-else style="text-align: center;line-height: 328px;border:1px solid #bbb">暂无数据</el-row>
               </el-scrollbar>
 
             </div>
@@ -460,9 +490,6 @@ import {formulaStringToArray} from "./formulaStringToArray"
 import draggable from 'vuedraggable'
 import {formatArrayMore,restoreArrayMore,generateResult} from './component/funComponent/multiIfElseTools'
 import dataChange from "./component/funComponent/dataChange"
-import tableFormWrite from "./component/table-form-write.vue";
-import { log } from "@antv/g2plot/lib/utils";
-
 
 export default {
   components: {
@@ -482,8 +509,7 @@ export default {
     ifelse,
 
     deviationRange,
-    dataChange,
-    tableFormWrite
+    dataChange
   },
   props: {
     wbsid:{
@@ -513,17 +539,7 @@ export default {
     iswbstype:{//是否是公共wbs
       type:String,
       default:''
-    },
-    pkeyId:{
-      type:String,
-      default:''//表单pkeyId
     }
-  },
-    mounted() {
-    // 初始时让容器获得焦点
-    this.$nextTick(() => {
-      this.$el.querySelector('.sele-ele-box1').focus();
-    });
   },
   data() {
     return {
@@ -806,13 +822,6 @@ export default {
     operationEdit(){
       this.selectEleFormula= JSON.parse(JSON.stringify(this.processFormula));
       this.operationVisible = true;
-       this.checkDefaultSelection();
-           const keyParts = this.selectEleFormula[ this.curSeleEleIndex].tableElementKey.split(':');
-        this.selectedTableKey = keyParts.length > 1 ? keyParts[1] : null;
-        // 确保容器获得焦点
-        this.$nextTick(() => {
-          this.$el.querySelector('.sele-ele-box1').focus();
-        });
     },
 
     eleAddFormula(){
@@ -823,6 +832,54 @@ export default {
         }
       }
     },
+
+    // eleChang(value,item){
+    //   //console.log(value)
+    //   //console.log(item)
+    //   if(value){
+    //     //简单语法判断
+    //     if(this.selectEleFormula.length != 0 && this.deleEleIndex < 0){
+    //       let lastEle = this.selectEleFormula[this.selectEleFormula.length-1];
+    //       if(lastEle.type == 'Element'){
+    //         this.$message({
+    //           type: "warning",
+    //           message: "元素无法连续出现在元素后面"
+    //         });
+    //         item.checked = false;
+    //         return;
+    //       }
+    //       if(lastEle.type == 'Text'){
+    //         this.$message({
+    //           type: "warning",
+    //           message: "元素无法连续出现在输入值后面"
+    //         });
+    //         item.checked = false;
+    //         return;
+    //       }
+    //       if(lastEle.type == 'Brackets' && lastEle.name == ')'){
+    //         this.$message({
+    //           type: "warning",
+    //           message: "元素无法连续出现在右括号后面"
+    //         });
+    //         item.checked = false;
+    //         return;
+    //       }
+    //     }
+
+    //     this.eleAddFormulaHandle(item);
+    //   }else{
+    //     let index = -1;
+    //     for (let i = 0; i < this.selectEleFormula.length; i++) {
+    //       if(this.selectEleFormula[i].id == item.id){
+    //         index = i;
+    //         break;
+    //       }
+    //     }
+    //     if(index>-1){
+    //       this.selectEleFormula.splice(index,1);
+    //     }
+    //   }
+    // },
     eleChang(value,item){
       if(value){
         //简单语法判断
@@ -996,34 +1053,32 @@ export default {
       this.deleEleIndex = -1;
     }
 
-    // 选中新添加的元素并更新光标位置
-    this.setActiveElement(newElementIndex);
+      }else if(ele.template && ele.example){
 
-  }else if(ele.template && ele.example){
-    // 运算符号处理(保持原有逻辑)
-    if(this.selectEleFormula.length == 0){
-      this.$message({
-        type: "warning",
-        message: "公式开头不能是运算符号"
-      });
-      return;
-    }else{
-      let lastEle = this.selectEleFormula[this.selectEleFormula.length-1];
-      if(lastEle.type == 'Operator'){
-        this.$message({
-          type: "warning",
-          message: "运算符号无法连续出现在运算符号后面"
-        });
-        return;
-      }
-      if(lastEle.type == 'Brackets' && lastEle.name == '('){
-        this.$message({
-          type: "warning",
-          message: "运算符号无法连续出现在左括号后面"
-        });
-        return;
-      }
-    }
+        //简单语法判断
+        if(this.selectEleFormula.length == 0){
+          this.$message({
+            type: "warning",
+            message: "公式开头不能是运算符号"
+          });
+          return;
+        }else{
+          let lastEle = this.selectEleFormula[this.selectEleFormula.length-1];
+          if(lastEle.type == 'Operator'){
+            this.$message({
+              type: "warning",
+              message: "运算符号无法连续出现在运算符号后面"
+            });
+            return;
+          }
+          if(lastEle.type == 'Brackets' && lastEle.name == '('){
+            this.$message({
+              type: "warning",
+              message: "运算符号无法连续出现在左括号后面"
+            });
+            return;
+          }
+        }
 
     this.selectEleFormula.push({
       type:'Operator',
@@ -1168,6 +1223,18 @@ setActiveElement(index) {
     },
 
     //点选公式中的元素
+    eleFormulaClick({selected,item},index){
+      if(selected){
+        this.selectEleFormula.forEach((ele)=>{
+          ele.selected = false;
+        })
+        item.selected = true;
+        this.curSeleEleIndex = index;
+      }else{
+        this.curSeleEleIndex = -1;
+      }
+    },
+
     // eleFormulaClick({selected,item},index){
     //   if(selected){
     //     this.selectEleFormula.forEach((ele)=>{
@@ -1441,16 +1508,50 @@ handleDelete(e) {
       this.actiFunIndex = (this.equationSelectEle.children.length-1).toString();
     },
 
+    //选择元素
+    // chooseEleHandle(){
+    //   for (let i = 0; i < this.eleList.length; i++) {
+    //     if (this.eleList[i].checked) {
+    //       let ele = this.eleList[i];
+    //       let obj = {};
+    //       if(ele.k){
+    //         obj = {
+    //           type:'ParamData',
+    //           name:ele.name,
+    //           id:ele.id,
+    //           selected:false,
+    //           v:ele.v,
+    //           k:ele.k,
+    //           children:[],
+    //         }
+    //       }else{
+    //         obj = {
+    //           type:'Element',
+    //           name:ele.eName,
+    //           id:ele.id,
+    //           selected:false,
+    //           tableElementKey:ele.tableElementKey,
+    //           children:[],
+    //         }
+    //       }
+
+
+    //       this.$set(this.argumenObj.arguments,this.argumenObj.index,obj);
+    //       this.chooseEleVisible = false;
+    //       break;
+    //     }
+    //   }
+    // },
     //选择元素多选
     chooseEleHandle(){
-      this.seleList.forEach((element,index) => {
+      this.eleChecks.forEach((element,index) => {
         this.setEleToArgumen(element,index+this.argumenObj.index);
       });
 
       this.chooseEleVisible = false;
-       this.tableKey = Date.now();
 
 
+      this.clearEleListCheck();
     },
     //设置元素到指定位置参数
     setEleToArgumen(ele,index){
@@ -2415,8 +2516,6 @@ replaceSelectedElement(newItem) {
               const keyParts =  item.tableElementKey.split('key');
               this.selectedTableKeyComp = keyParts.length > 1 ? 'key'+keyParts[1] : null;
   },
-}
-
 };
 </script>
 
@@ -2506,3 +2605,4 @@ replaceSelectedElement(newItem) {
   margin-right: 10px;
 }
 </style>
+

+ 0 - 5
src/views/formula/edit1.vue

@@ -731,11 +731,6 @@ export default {
         // 开启 “加载中” 动画
         if(node.level == 0) this.loading = true
         if(!this.elementType) {
-          if (node.level != 0 && !node.data.hasChildren) {
-            this.loading = false
-            resolve(null)
-            return
-          }
          tabTypeLazyTreeAll({parentId,current:1,size:1000,hasPartFormula:this.fromcurNode.hasPartFormula}).then(res => {
             // 请求接口,返回数据
             let data = res.data.data.records;

+ 1 - 1
src/views/manager/projectinfo/detail.vue

@@ -809,7 +809,7 @@ export default {
     })
   },
   methods: {
- getCreateUserItems(){
+    getCreateUserItems(){
       getList(
         1,
         1000,

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 716 - 865
src/views/manager/projectinfo/tree.vue


+ 313 - 372
src/views/manager/wbsinfo.vue

@@ -1,122 +1,65 @@
 <template>
   <basic-container>
-    <div class="search-box">
-      <div class="flex">
-        <div
-          class="filter-item"
-          style="width: 200px"
-          :class="[query.wbsName ? 'hc-search-highlight' : '']"
-        >
-          <el-input
-            v-model="query.wbsName"
-            placeholder="请输入名称"
-            clearable
-            size="small"
-          />
-        </div>
-        <div
-          class="filter-item"
-          style="width: 200px"
-          :class="[query.projectId ? 'hc-search-highlight' : '']"
-        >
-          <el-select
-            v-model="query.projectId"
-            placeholder="项目名称"
-            clearable
-            size="small"
-          >
-            <el-option
-              v-for="item in projectList"
-              :key="item.id"
-              :label="item.projectAlias"
-              :value="item.id"
-            />
-          </el-select>
+        <div class="search-box">
+        <div class="search-box-left">
+            <el-input v-model="query.wbsName" placeholder="请输入名称" style="width: 200px;" class="filter-item"   size="small"/>
+            <el-select v-model="query.projectId" placeholder="项目名称" clearable style="width: 200px" class="filter-item"   size="small">
+              <el-option v-for="item in projectList" :key="item.id" :label="item.projectAlias" :value="item.id" />
+            </el-select>
+            <el-select v-model="query.wbsType" placeholder="划分类型" clearable style="width: 200px" class="filter-item"   size="small">
+              <el-option v-for="item in tabTypeList"  :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
+            </el-select>
+
+            <el-button type="primary" @click="searchClick" class="custom-primary-btn"   size="small">搜索</el-button>
+            <el-button type="info" @click="clearSearch"   size="small">清空</el-button>
         </div>
-        <div
-          class="filter-item"
-          style="width: 200px"
-          :class="[query.wbsType ? 'hc-search-highlight' : '']"
-        >
-          <el-select
-            v-model="query.wbsType"
-            placeholder="划分类型"
-            clearable
-            style="width: 200px"
-            class="filter-item"
+        <div class="header-box-right">
+           <el-button
+            type="primary"
             size="small"
-          >
-            <el-option
-              v-for="item in tabTypeList"
-              :key="item.dictKey"
-              :label="item.dictValue"
-              :value="item.dictKey"
-            />
-          </el-select>
-        </div>
+            icon="el-icon-plus"
 
-        <el-button
-          type="primary"
-          @click="searchClick"
-          class="custom-primary-btn"
-          size="small"
-          >搜索</el-button
-        >
-        <el-button type="info" @click="clearSearch" size="small"
-          >清空</el-button
-        >
-      </div>
-      <div class="header-box-right">
-        <el-button
-          type="primary"
-          size="small"
-          icon="el-icon-plus"
-          @click="handleAdd"
+
+            @click="handleAdd"
           >新增
-        </el-button>
-        <el-button
-          type="warning"
-          size="small"
-          icon="el-icon-sort"
-          @click="handleSort"
+          </el-button>
+                <el-button
+            type="warning"
+            size="small"
+            icon="el-icon-sort"
+
+
+            @click="handleSort"
           >排序
-        </el-button>
-        <el-button
-          type="danger"
-          size="small"
-          icon="el-icon-delete"
-          v-if="permission.wbsinfo_delete"
-          @click="handleDelete"
+          </el-button>
+              <el-button
+            type="danger"
+            size="small"
+            icon="el-icon-delete"
+
+            v-if="permission.wbsinfo_delete"
+            @click="handleDelete"
           >删 除
-        </el-button>
-        <!-- 新增元素按钮 -->
-        <el-button
-          size="small"
-          style="
-            background-color: #ffa042;
-            color: white;
-            font-weight: bold;
-            border-color: #ffa042;
-          "
-          plain
-          v-if="permission.wbsinfo_delete"
-          @click="handleElement"
+          </el-button>
+          <!-- 新增元素按钮 -->
+          <el-button
+            size="small"
+            style="background-color:#FFA042;color:white;font-weight:bold;border-color: #FFA042;"
+            plain
+            v-if="permission.wbsinfo_delete"
+            @click="handleElement"
           >元素库
-        </el-button>
-        <el-button
-          size="small"
-          style="
-            background-color: #2550a2;
-            color: white;
-            font-weight: bold;
-            border-color: #2550a2;
-          "
-          plain
-          v-if="permission.wbsinfo_delete"
-          @click="handleParameter"
+          </el-button>
+          <el-button
+            size="small"
+            style="background-color:#2550A2;color:white;font-weight:bold;border-color: #2550A2;"
+            plain
+            v-if="permission.wbsinfo_delete"
+            @click="handleParameter"
           >参数库
-        </el-button>
-      </div>
+          </el-button>
+        </div>
+
     </div>
     <avue-crud
       :option="option"
@@ -137,118 +80,108 @@
       @size-change="sizeChange"
       @refresh-change="refreshChange"
       @on-load="onLoad"
-      :search.sync="search"
+       :search.sync="search"
     >
-      <template slot-scope="{ row }" slot="wbsName">
-        <span v-html="highlight(row.wbsName || '', query.wbsName)"></span>
-      </template>
-      <template slot-scope="{ disabled, size }" slot="projectInfoListSearch">
-        <el-select
-          v-model="search.projectId"
-          placeholder="项目名称"
-          filterable
-          clearable
-        >
+
+<template slot-scope="{disabled,size}" slot="projectInfoListSearch">
+      <el-select v-model="search.projectId" placeholder="项目名称" filterable  clearable>
           <el-option
             v-for="item in projectList"
             :key="item.id"
             :label="item.projectAlias"
-            :value="item.id"
-          >
+            :value="item.id">
           </el-option>
         </el-select>
+  </template>
+      <template slot="menuRight">
+
       </template>
-      <template slot="menuRight"> </template>
-      <template slot-scope="{ row, index }" slot="menu">
+      <template
+        slot-scope="{row,index}"
+        slot="menu"
+      >
         <el-button
           type="text"
           icon="el-icon-edit"
           size="mini"
           v-if="permission.wbsinfo_tree_edit"
-          @click="toEdit(row, index)"
-          >编辑wbs库</el-button
-        >
+          @click="toEdit(row,index)"
+        >编辑wbs库</el-button>
       </template>
-      <template slot-scope="{ row }" slot="wbsType">
-        <!-- <el-tag>{{ row.wbsType }}</el-tag> -->
-        <el-tag
-          size="small"
-          v-for="item in generateTagItems(row.wbsType)"
-          :key="item.label"
-          :type="item.type"
-          effect="dark"
-          class="mr-3 custom-ellipse-tag"
-          :class="`custom-tag-type-${item.type}`"
-        >
-          {{ item.label }}
-        </el-tag>
-      </template>
-      <template slot-scope="{ row }" slot="projectInfoList">
-        <el-tooltip
-          v-for="item in row.projectInfoList"
-          :key="item.id"
-          :content="item.projectName"
-          placement="top"
-          :disabled="true"
-        >
-          <el-tag
-            size="small"
-            type="info"
-            class="custom-ellipse-tag1 ellipsis-tag"
+       <template
+            slot-scope="{row}"
+            slot="wbsType"
           >
-            {{ item.projectName }}
-          </el-tag>
-        </el-tooltip>
-      </template>
+            <!-- <el-tag>{{ row.wbsType }}</el-tag> -->
+                <el-tag
+                  size="small"
+                  v-for="item in generateTagItems(row.wbsType)"
+                  :key="item.label"
+                  :type="item.type"
+                  effect="dark"
+                  class="mr-3 custom-ellipse-tag"
+                  :class="`custom-tag-type-${item.type}`"
+                  >
+
+                  {{ item.label }}
+                </el-tag>
+
+          </template>
+          <template slot-scope="{row}" slot="projectInfoList">
+
+                    <el-tooltip
+                    v-for="item in row.projectInfoList"
+                    :key="item.id"
+                    :content="item.projectName"
+                    placement="top"
+                    :disabled="true"
+                  >
+                    <el-tag
+                      size="small"
+                      type="info"
+                      class="custom-ellipse-tag1 ellipsis-tag"
+
+                    >
+                      {{item.projectName}}
+                    </el-tag>
+                  </el-tooltip>
+          </template>
     </avue-crud>
-    <!-- wbs排序弹窗 -->
-    <ContractSort
-      ref="contractSortRef"
-      title="wbs排序弹窗"
-      :sortProLoad="sortProLoad"
-      @confirm="handleSortConfirm"
-    />
+           <!-- wbs排序弹窗 -->
+        <ContractSort
+         ref="contractSortRef"
+         title="wbs排序弹窗"
+         :sortProLoad="sortProLoad"
+        @confirm="handleSortConfirm"
+      />
   </basic-container>
 </template>
 
 <script>
-import {
-  getList,
-  getDetail,
-  add,
-  update,
-  remove,
-  sortWbs,
-} from "@/api/manager/wbsinfo";
+import { getList, getDetail, add, update, remove,sortWbs } from "@/api/manager/wbsinfo";
 import { mapGetters } from "vuex";
-import { getDictionary } from "@/api/system/dict";
-import ContractSort from "./ContractSort.vue";
+  import { getDictionary } from "@/api/system/dict";
+  import ContractSort from './ContractSort.vue'
 import { getProjectListPage } from "@/api/manager/projectinfo";
-import { highlight } from "@/util/util";
 
 export default {
   components: {
-    ContractSort,
+    ContractSort
   },
-  data() {
+  data () {
     return {
-      highlight,
       form: {},
-      query: {
-        wbsName: "",
-        wbsType: "",
-        projectId: "",
-      },
+      query: {},
       loading: true,
       page: {
         pageSize: 20,
         currentPage: 1,
-        total: 0,
+        total: 0
       },
       selectionList: [],
       option: {
         menuWidth: 300,
-        height: "auto",
+        height: 'auto',
         calcHeight: 30,
         tip: false,
         searchMenuSpan: 6,
@@ -256,217 +189,220 @@ export default {
         border: true,
         index: true,
         viewBtn: true,
-        addBtn: false,
+          addBtn: false,
         selection: true,
-        refreshBtn: false,
+         refreshBtn:false,
         searchShowBtn: false,
         columnBtn: false,
         dialogClickModal: false,
-        searchShow: false,
+          searchShow: false,
         column: [
           {
             label: "创建时间",
             prop: "createTime",
             editDetail: true,
             addDisabled: true,
-            hide: true,
+               hide: true,
+
           },
           {
             label: "wbs名称",
             prop: "wbsName",
-            slot: true,
             search: true,
             width: 180,
-            rules: [
-              {
-                required: true,
-                message: "请输入wbs名称",
-                trigger: "blur",
-              },
-            ],
+
+
+
+            rules: [{
+              required: true,
+              message: "请输入wbs名称",
+              trigger: "blur"
+            }]
           },
           {
             label: "划分类型",
             slot: true,
-            search: true,
-            width: 120,
+              search: true,
+              width: 120,
+
+
+
+
 
             type: "select",
             dicUrl: "/api/blade-system/dict/dictionary?code=wbs_type",
             props: {
               label: "dictValue",
-              value: "dictKey",
+              value: "dictKey"
             },
             dataType: "number",
             prop: "wbsType",
-            rules: [
-              {
-                required: true,
-                message: "请选择划分类型",
-                trigger: "blur",
-              },
-            ],
+            rules: [{
+              required: true,
+              message: "请选择划分类型",
+              trigger: "blur"
+            }],
+
           },
           {
             label: "是否启用",
             prop: "status",
             hide: true,
 
-            rules: [
-              {
-                required: true,
-                message: "是否启用",
-                trigger: "blur",
-              },
-            ],
+            rules: [{
+              required: true,
+              message: "是否启用",
+              trigger: "blur"
+            }],
             type: "radio",
             dicData: [
               {
                 label: "否",
-                value: 0,
+                value: 0
               },
               {
                 label: "是",
-                value: 1,
-              },
+                value: 1
+              }
             ],
           },
-          {
+           {
             label: "引用项目",
             prop: "projectInfoList",
             display: false,
             search: true,
-            slot: true,
+            slot:true,
+
           },
-        ],
+
+        ]
       },
       data: [],
-      search: {
-        wbsName: "",
-        wbsType: "",
-        projectId: "",
+      search:{
+        wbsName: '',
+        wbsType: '',
+        projectId:''
       },
-      wbsTypeList: [],
+       wbsTypeList:[],
+
+       sortProLoad:false,
+       wbsList:[],
+       sortWbsList:[],
+       projectList:[],
+       tabTypeList:[],
 
-      sortProLoad: false,
-      wbsList: [],
-      sortWbsList: [],
-      projectList: [],
-      tabTypeList: [],
     };
   },
-  created() {
-    this.getTabTypeList();
-    this.getWbsList();
-    this.getProjectList();
+  created () {
+    this.getTabTypeList()
+    this.getWbsList()
+    this.getProjectList()
   },
   computed: {
     ...mapGetters(["permission"]),
-    permissionList() {
+    permissionList () {
       return {
         addBtn: this.vaildData(this.permission.wbsinfo_add, false),
         viewBtn: this.vaildData(this.permission.wbsinfo_view, false),
         delBtn: this.vaildData(this.permission.wbsinfo_delete, false),
-        editBtn: this.vaildData(this.permission.wbsinfo_edit, false),
+        editBtn: this.vaildData(this.permission.wbsinfo_edit, false)
       };
     },
-    ids() {
+    ids () {
       let ids = [];
-      this.selectionList.forEach((ele) => {
+      this.selectionList.forEach(ele => {
         ids.push(ele.id);
       });
       return ids.join(",");
-    },
+    }
   },
   methods: {
-    getProjectList() {
+  getProjectList () {
       getProjectListPage({
-        current: 1,
-        size: 999,
-        isCollect: 0,
+        current:1,
+        size:999,
+        isCollect:0,
+
+
       }).then((res) => {
         this.projectList = res.data.data.records;
-      });
+      })
     },
-    generateTagItems(wbsTypes) {
-      const typeToLabelMap = {
-        1: "质检",
-        2: "试验",
-        3: "日志",
-        4: "计量",
-        5: "征拆",
-        6: "底层节点",
-      };
+  generateTagItems(wbsTypes){
+       const typeToLabelMap = {
+        1: '质检',
+        2: '试验',
+        3: '日志',
+        4: '计量',
+        5: '征拆',
+        6: '底层节点',
+
+    };
       let tagItems = [];
-      // 如果 wbsTypes 不是数组,则将其转换为数组
-      if (!Array.isArray(wbsTypes)) {
+         // 如果 wbsTypes 不是数组,则将其转换为数组
+    if (!Array.isArray(wbsTypes)) {
         wbsTypes = [wbsTypes];
-      }
-      wbsTypes.forEach((type) => {
+    }
+      wbsTypes.forEach(type => {
         // 检查type是否在映射关系中存在
         if (typeToLabelMap.hasOwnProperty(type)) {
-          // 如果存在,则创建一个新的对象并添加到tagItems数组中
-          tagItems.push({
-            type: type,
-            label: typeToLabelMap[type],
-          });
+            // 如果存在,则创建一个新的对象并添加到tagItems数组中
+            tagItems.push({
+                type: type,
+                label: typeToLabelMap[type]
+            });
         }
-      });
-      return tagItems;
-    },
-    getTabTypeList() {
-      let code = "wbs_type";
-      getDictionary({
-        code,
-      }).then((res) => {
-        this.tabTypeList = res.data.data;
-      });
+    });
+     return tagItems;
+  },
+     getTabTypeList(){
+           let code = "wbs_type";
+            getDictionary({
+                code,
+            }).then((res) => {
+                    this.tabTypeList = res.data.data;
+            });
+
     },
-    //点击元素库
-    handleElement() {
-      console.log("元素库");
+      //点击元素库
+    handleElement(){
+      console.log('元素库');
       this.$router.push({
-        path: "/wbs/element",
-      });
+        path: '/wbs/element',
+      })
     },
-    rowSave(row, done, loading) {
-      row.projectInfoList = null;
-      add(row).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: "success",
-            message: "操作成功!",
-          });
-          done();
-        },
-        (error) => {
-          loading();
-          window.console.log(error);
-        }
-      );
+    rowSave (row, done, loading) {
+      row.projectInfoList=null
+      add(row).then(() => {
+        this.onLoad(this.page);
+        this.$message({
+          type: "success",
+          message: "操作成功!"
+        });
+        done();
+      }, error => {
+        loading();
+        window.console.log(error);
+      });
     },
-    rowUpdate(row, index, done, loading) {
-      update(row).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: "success",
-            message: "操作成功!",
-          });
-          done();
-        },
-        (error) => {
-          loading();
-          console.log(error);
-        }
-      );
+    rowUpdate (row, index, done, loading) {
+      update(row).then(() => {
+        this.onLoad(this.page);
+        this.$message({
+          type: "success",
+          message: "操作成功!"
+        });
+        done();
+      }, error => {
+        loading();
+        console.log(error);
+      });
     },
-    rowDel(row) {
+    rowDel (row) {
       this.$confirm("确定将选择数据删除?", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning",
+        type: "warning"
       })
         .then(() => {
           return remove(row.id);
@@ -475,14 +411,15 @@ export default {
           this.onLoad(this.page);
           this.$message({
             type: "success",
-            message: "操作成功!",
+            message: "操作成功!"
           });
         });
     },
     handleAdd(row) {
-      this.$refs.crud.rowAdd();
-    },
-    handleDelete() {
+
+        this.$refs.crud.rowAdd();
+      },
+    handleDelete () {
       if (this.selectionList.length === 0) {
         this.$message.warning("请选择至少一条数据");
         return;
@@ -490,7 +427,7 @@ export default {
       this.$confirm("确定将选择数据删除?", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning",
+        type: "warning"
       })
         .then(() => {
           return remove(this.ids);
@@ -499,52 +436,48 @@ export default {
           this.onLoad(this.page);
           this.$message({
             type: "success",
-            message: "操作成功!",
+            message: "操作成功!"
           });
           this.$refs.crud.toggleSelection();
         });
     },
-    beforeOpen(done, type) {
+    beforeOpen (done, type) {
       if (["edit", "view"].includes(type)) {
-        getDetail(this.form.id).then((res) => {
+        getDetail(this.form.id).then(res => {
           this.form = res.data.data;
         });
       }
       done();
     },
-    searchReset() {
+    searchReset () {
       this.query = {};
       this.onLoad(this.page);
     },
-    searchChange(params, done) {
+    searchChange (params, done) {
       this.query = params;
       this.page.currentPage = 1;
       this.onLoad(this.page, params);
       done();
     },
-    selectionChange(list) {
+    selectionChange (list) {
       this.selectionList = list;
     },
-    selectionClear() {
+    selectionClear () {
       this.selectionList = [];
       this.$refs.crud.toggleSelection();
     },
-    currentChange(currentPage) {
+    currentChange (currentPage) {
       this.page.currentPage = currentPage;
     },
-    sizeChange(pageSize) {
+    sizeChange (pageSize) {
       this.page.pageSize = pageSize;
     },
-    refreshChange() {
+    refreshChange () {
       this.onLoad(this.page, this.query);
     },
-    onLoad(page, params = {}) {
+    onLoad (page, params = {}) {
       this.loading = true;
-      getList(
-        page.currentPage,
-        page.pageSize,
-        Object.assign(params, this.query)
-      ).then((res) => {
+      getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
         const data = res.data.data;
         this.page.total = data.total;
         this.data = data.records;
@@ -553,77 +486,85 @@ export default {
       });
     },
 
-    toEdit(row) {
+    toEdit (row) {
       console.log(row);
       this.$router.push({
-        path: "/wbs/edit",
+        path: '/wbs/edit',
         query: {
           id: row.id,
-          type: row.wbsType,
-        },
-      });
+          type: row.wbsType
+        }
+      })
       //this.$router.push('/wbs/edit/' + row.id);
     },
     //点击参数库
-    handleParameter() {
-      this.$router.push("/wbs/parameter");
+    handleParameter(){
+       this.$router.push('/wbs/parameter');
     },
-    getWbsList() {
-      getList(1, 1000).then((res) => {
+    getWbsList(){
+      getList(1, 1000).then(res => {
         const data = res.data.data;
 
-        this.wbsList = data["records"];
+        this.wbsList=data['records']
       });
     },
     //排序
-    handleSort() {
-      this.sortWbsList = JSON.parse(JSON.stringify(this.wbsList));
-      this.sortTitle = "合同段排序";
+    handleSort(){
+         this.sortWbsList = JSON.parse(JSON.stringify(this.wbsList));
+        this.sortTitle = '合同段排序';
 
-      this.$nextTick(() => {
-        this.$refs.contractSortRef.show(this.sortWbsList);
-      });
+          this.$nextTick(() => {
+            this.$refs.contractSortRef.show(this.sortWbsList);
+          });
     },
-    handleSortConfirm(sortedList) {
+     handleSortConfirm(sortedList) {
       // 这里处理排序后的数据
-      console.log("排序后的列表:", sortedList);
+      console.log('排序后的列表:', sortedList);
       // TODO: 调用接口保存排序结果
       this.wbsList = [...sortedList];
-      const ids = this.wbsList.map((item) => item.id);
-      this.saveSort(ids);
+        const ids = this.wbsList.map(item => item.id);
+     this. saveSort(ids);
+
     },
-    saveSort(ids) {
-      sortWbs(ids).then((res) => {
-        this.sortProLoad = false;
-        if (res.data.code == 200) {
-          this.$message.success(res.data.msg);
+    saveSort(ids){
+        sortWbs(ids).then((res) => {
+                    this.sortProLoad= false;
+                    if(res.data.code==200){
+                        this.$message.success(res.data.msg)
+
+                                 this.onLoad(this.page);
+                    }else{
+                        this.$message.error(res.data.msg)
+                    }
+                })
+
+
 
-          this.onLoad(this.page);
-        } else {
-          this.$message.error(res.data.msg);
-        }
-      });
     },
-    searchClick() {
-      this.page.currentPage = 1;
-      this.onLoad(this.page, this.query);
+    searchClick(){
+       this.page.currentPage = 1;
+      this.onLoad(this.page,this.query);
     },
-    clearSearch() {
-      this.page.currentPage = 1;
+    clearSearch(){
+       this.page.currentPage = 1;
       this.query = {};
-      this.onLoad(this.page, this.query);
-    },
-  },
+      this.onLoad(this.page,this.query);
+    }
+  }
 };
 </script>
 
 <style scoped lang="scss">
-.search-box {
+.search-box{
   display: flex;
   justify-content: space-between;
-}
+  .search-item{
+    margin-right: 10px;
+    margin-left: 10px;
+  }
 
-.filter-item {
+}
+.filter-item{
   margin-right: 10px;
 }
 </style>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 297 - 179
yarn.lock


Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio