8
0
duy 9 ماه پیش
والد
کامیت
430d39a69c
4فایلهای تغییر یافته به همراه460 افزوده شده و 429 حذف شده
  1. 8 2
      src/views/desk/wbs/node-param-dialog.vue
  2. 159 158
      src/views/desk/wbs/tree-node-edit.vue
  3. 271 258
      src/views/project/info/template.vue
  4. 22 11
      src/views/project/list/wbs-tree.vue

+ 8 - 2
src/views/desk/wbs/node-param-dialog.vue

@@ -241,6 +241,9 @@ const dialogClose = () => {
 }
 const submitLoading = ref(false)
 const saveElementHandle = async () => {
+    let pid = nodeInfo.value.primaryKeyId
+        ? nodeInfo.value.primaryKeyId
+        : nodeInfo.value.pKeyId
     let tag = true
     tableData.value.forEach((val) => {
         if (!val.k | !val.v) {
@@ -258,7 +261,7 @@ const saveElementHandle = async () => {
         const { error, code, data } = await mainApi.saveOrUpdateBatch({
             scopeType: scopeType.value,
             projectId: projectId.value,
-            nodeId: nodeId.value,
+            nodeId: projectId.value ? pid : nodeId.value,
             wps: tableData.value,
             type: 1,
             delIds: delIds.value,
@@ -302,11 +305,14 @@ const getNameList = async () => {
     nameList.value = getArrValue(data)
 }
 const addRowClick = () => {
+    let pid = nodeInfo.value.primaryKeyId
+        ? nodeInfo.value.primaryKeyId
+        : nodeInfo.value.pKeyId
     tableData.value.unshift({
         k: '',
         v: '',
         remark: '',
-        nodeId: nodeId.value,
+        nodeId: projectId.value ? pid : nodeId.value,
         type: 1,
     })
 }

+ 159 - 158
src/views/desk/wbs/tree-node-edit.vue

@@ -20,9 +20,9 @@
                     class="is-right-btn"
                 >
                     <template #append>
-                        <el-button hc-btn type="primary" @click="aliasShowClick"
-                            >添加别名</el-button
-                        >
+                        <el-button hc-btn type="primary" @click="aliasShowClick">
+                            添加别名
+                        </el-button>
                     </template>
                 </el-input>
             </el-form-item>
@@ -120,7 +120,7 @@
                         :key="item.value"
                         :label="item.label"
                         :value="item.value"
-                    ></el-option>
+                    />
                 </el-select>
             </el-form-item>
             <el-form-item label="单元名称">
@@ -130,7 +130,7 @@
                         :key="item.id"
                         :label="item.dictValue"
                         :value="item.dictKey"
-                    ></el-option>
+                    />
                 </el-select>
             </el-form-item>
         </el-form>
@@ -141,8 +141,9 @@
                 type="primary"
                 :loading="submitLoading"
                 @click="dialogSubmit"
-                >提交</el-button
             >
+                提交
+            </el-button>
         </template>
     </hc-dialog>
 
@@ -169,9 +170,9 @@
                     class="is-right-btn"
                 >
                     <template #append>
-                        <el-button hc-btn type="primary" @click="addAliasName"
-                            >添加</el-button
-                        >
+                        <el-button hc-btn type="primary" @click="addAliasName">
+                            添加
+                        </el-button>
                     </template>
                 </el-input>
             </el-form-item>
@@ -185,8 +186,9 @@
                     closable
                     type="primary"
                     @close="aliasNameClose(index)"
-                    >{{ item }}</el-tag
                 >
+                    {{ item }}
+                </el-tag>
             </template>
         </div>
         <template #footer>
@@ -196,28 +198,27 @@
                 type="primary"
                 :loading="submitAliasLoading"
                 @click="aliasSubmit"
-                >提交</el-button
             >
+                提交
+            </el-button>
         </template>
     </hc-dialog>
 </template>
 
 <script setup>
-import { ref, watch } from "vue";
-import { getDictionary } from "~api/other";
-import { getDictionaryData, getDictionaryName } from "~src/utils/tools";
+import { ref, watch } from 'vue'
+import { getDictionary } from '~api/other'
+import { getDictionaryData, getDictionaryName } from '~src/utils/tools'
 import {
     deepClone,
     formValidate,
     getArrValue,
-    isNullES,
     getObjValue,
-} from "js-fast-way";
-import { useAppStore } from "~src/store";
-import mainApi from "~api/wbs/tree";
-import { getChildList } from "~api/other";
-const store = useAppStore();
-const userInfo = ref(store.getUserInfo);
+    isNullES,
+} from 'js-fast-way'
+import { useAppStore } from '~src/store'
+import mainApi from '~api/wbs/tree'
+import { getChildList } from '~api/other'
 const props = defineProps({
     node: {
         type: Object,
@@ -229,7 +230,7 @@ const props = defineProps({
     },
     wid: {
         type: [String, Number],
-        default: "",
+        default: '',
     },
 
     treeProps: {
@@ -246,29 +247,29 @@ const props = defineProps({
     },
     title: {
         type: [String],
-        default: "新增节点",
+        default: '新增节点',
     },
-});
-
+})
 //事件
-const emit = defineEmits(["change", "close"]);
-
+const emit = defineEmits(['change', 'close'])
+const store = useAppStore()
+const userInfo = ref(store.getUserInfo)
 //双向绑定
 // eslint-disable-next-line no-undef
-const isShow = defineModel("modelValue", {
+const isShow = defineModel('modelValue', {
     default: false,
-});
+})
 
 //数据变量
-const formModel = ref(props.node);
-const wbsType = ref(props.type);
-const wbsId = ref(props.wid);
-const nodeDetail = ref(props.node);
-const nodeTypelist = ref(props.nodeType);
-const majorDataType = ref(props.majorType);
-const testProps = ref(props.treeProps);
-const modalTitle = ref(props.title);
-const orString = ref("");
+const formModel = ref(props.node)
+const wbsType = ref(props.type)
+const wbsId = ref(props.wid)
+const nodeDetail = ref(props.node)
+const nodeTypelist = ref(props.nodeType)
+const majorDataType = ref(props.majorType)
+const testProps = ref(props.treeProps)
+const modalTitle = ref(props.title)
+const orString = ref('')
 
 //监听数据
 watch(
@@ -283,232 +284,232 @@ watch(
         props.title,
     ],
     ([node, type, wid, nodeType, majorType, treeProps, title]) => {
-        formModel.value = node;
-        orString.value = node.className;
-        nodeDetail.value = node;
-        wbsType.value = type;
-        wbsId.value = wid;
+        formModel.value = node
+        orString.value = node.className
+        nodeDetail.value = node
+        wbsType.value = type
+        wbsId.value = wid
 
-        nodeTypelist.value = nodeType;
-        majorDataType.value = majorType;
-        testProps.value = treeProps;
-        modalTitle.value = title;
+        nodeTypelist.value = nodeType
+        majorDataType.value = majorType
+        testProps.value = treeProps
+        modalTitle.value = title
     },
-    { deep: true }
-);
+    { deep: true },
+)
 
 //监听显示
 watch(isShow, async (val) => {
     if (val) {
-        getDataInfo();
-        await geStandardTypeOptions();
-        changeStandType(formModel.value.className);
+        getDataInfo()
+        await geStandardTypeOptions()
+        changeStandType(formModel.value.className)
     } else {
-        emit("close");
+        emit('close')
     }
-});
+})
 
 //获取数据
 const getDataInfo = () => {
-    const { nodeType } = formModel.value;
+    const { nodeType } = formModel.value
     if (nodeType === 53) {
-        getTestTreeData();
+        getTestTreeData()
     }
-};
+}
 
 //节点别名
-const isAliasShow = ref(false);
+const isAliasShow = ref(false)
 
 //节点别名
-const formAliasRef = ref(null);
-const formAliasModel = ref({});
+const formAliasRef = ref(null)
+const formAliasModel = ref({})
 const formAliasRules = {
     aliasName: {
         required: true,
-        trigger: "blur",
-        message: "请输入节点别名",
+        trigger: 'blur',
+        message: '请输入节点别名',
     },
-};
+}
 
 //显示节点别名弹窗
-const aliasArr = ref([]);
+const aliasArr = ref([])
 const aliasShowClick = async () => {
-    isAliasShow.value = true;
-    aliasArr.value = [];
+    isAliasShow.value = true
+    aliasArr.value = []
 
-    const { fullName } = deepClone(nodeDetail.value);
-    if (isNullES(fullName)) return;
-    aliasArr.value = fullName.split(",");
-};
+    const { fullName } = deepClone(nodeDetail.value)
+    if (isNullES(fullName)) return
+    aliasArr.value = fullName.split(',')
+}
 
 //添加别名
 const addAliasName = async () => {
-    const formRes = await formValidate(formAliasRef.value);
+    const formRes = await formValidate(formAliasRef.value)
 
-    if (!formRes) return false;
+    if (!formRes) return false
 
-    const { aliasName } = deepClone(formAliasModel.value);
+    const { aliasName } = deepClone(formAliasModel.value)
     if (aliasArr.value.indexOf(aliasName) !== -1) {
-        window.$message.warning("请不要重复别名");
-        return;
+        window.$message.warning('请不要重复别名')
+        return
     }
-    aliasArr.value.push(aliasName);
-    formAliasModel.value.aliasName = "";
-};
+    aliasArr.value.push(aliasName)
+    formAliasModel.value.aliasName = ''
+}
 
 //移除别名
 const aliasNameClose = (index) => {
-    aliasArr.value.splice(index, 1);
-};
+    aliasArr.value.splice(index, 1)
+}
 
 //提交别名
-const submitAliasLoading = ref(false);
+const submitAliasLoading = ref(false)
 const aliasSubmit = async () => {
     if (!nodeDetail.value.id) {
-        const fullName = aliasArr.value.join(",");
-        formModel.value.fullName = fullName;
-        aliasDialogClose();
+        const fullName = aliasArr.value.join(',')
+        formModel.value.fullName = fullName
+        aliasDialogClose()
     } else {
-        submitAliasLoading.value = true;
+        submitAliasLoading.value = true
 
-        const { id } = nodeDetail.value;
+        const { id } = nodeDetail.value
 
-        const fullName = aliasArr.value.join(",");
-        formModel.value.fullName = fullName;
+        const fullName = aliasArr.value.join(',')
+        formModel.value.fullName = fullName
         const { isRes } = await mainApi.submitFullName({
             id: id,
             fullNames: fullName,
-        });
-        submitAliasLoading.value = false;
-        if (!isRes) return;
-        aliasDialogClose();
-        window?.$message?.success("操作成功");
+        })
+        submitAliasLoading.value = false
+        if (!isRes) return
+        aliasDialogClose()
+        window?.$message?.success('操作成功')
     }
-};
+}
 
 //关闭节点别名弹窗
 const aliasDialogClose = () => {
-    isAliasShow.value = false;
-    formAliasModel.value = {};
-};
+    isAliasShow.value = false
+    formAliasModel.value = {}
+}
 
 //获取实验树的数据
-const testData = ref([]);
-const mixRatioTestIds = ref([]);
+const testData = ref([])
+const mixRatioTestIds = ref([])
 const getTestTreeData = async () => {
-    const { tenant_id } = getObjValue(userInfo.value);
-    testData.value = [];
-    const { primaryKeyId, pKeyId, mixRatioTestIds: testIds } = formModel.value;
-    let pid = primaryKeyId ?? pKeyId;
+    const { tenant_id } = getObjValue(userInfo.value)
+    testData.value = []
+    const { primaryKeyId, pKeyId, mixRatioTestIds: testIds } = formModel.value
+    let pid = primaryKeyId ?? pKeyId
     const { data } = await mainApi.getAlltree({
         tenantId: tenant_id,
         type: 1,
         wbsId: formModel.value.wbsId,
-    });
-    testData.value = getArrValue(data);
+    })
+    testData.value = getArrValue(data)
     if (!isNullES(testIds)) {
-        mixRatioTestIds.value = testIds?.split(",") ?? [];
+        mixRatioTestIds.value = testIds?.split(',') ?? []
     } else {
-        mixRatioTestIds.value = [];
+        mixRatioTestIds.value = []
     }
-};
+}
 //监听实验树的勾选, halfCheckedKeys
 const testTreeCheckChange = (_, { checkedKeys }) => {
-    formModel.value.mixRatioTestIds = checkedKeys.join(",");
-};
+    formModel.value.mixRatioTestIds = checkedKeys.join(',')
+}
 
 //表单
-const formRef = ref(null);
+const formRef = ref(null)
 const formRules = {
     nodeName: {
         required: true,
-        trigger: "blur",
-        message: "请输入节点名称",
+        trigger: 'blur',
+        message: '请输入节点名称',
     },
     nodeType: {
         required: true,
-        trigger: "blur",
-        message: "请选择节点类型",
+        trigger: 'blur',
+        message: '请选择节点类型',
     },
     majorDataType: {
         required: true,
-        trigger: "blur",
-        message: "请选择内业资料类型",
+        trigger: 'blur',
+        message: '请选择内业资料类型',
     },
     mixRatioTestIds: {
         required: true,
-        trigger: "blur",
-        message: "请勾选相关联试验",
+        trigger: 'blur',
+        message: '请勾选相关联试验',
     },
-};
+}
 
 //提交表单
-const submitLoading = ref(false);
+const submitLoading = ref(false)
 const dialogSubmit = async () => {
-    const formRes = await formValidate(formRef.value);
-    if (!formRes) return false;
-    submitLoading.value = true;
+    const formRes = await formValidate(formRef.value)
+    if (!formRes) return false
+    submitLoading.value = true
     //发起请求
-    const { isRes } = await mainApi.submit(formModel.value);
-    submitLoading.value = false;
-    if (!isRes) return;
-    dialogClose();
-    window?.$message?.success("操作成功");
-    emit("change");
-};
+    const { isRes } = await mainApi.submit(formModel.value)
+    submitLoading.value = false
+    if (!isRes) return
+    dialogClose()
+    window?.$message?.success('操作成功')
+    emit('change')
+}
 
 //关闭弹窗
 const dialogClose = () => {
-    isShow.value = false;
-    emit("close");
-};
+    isShow.value = false
+    emit('close')
+}
 //标砖分类类型
-const standardTypeOptions = ref([]);
+const standardTypeOptions = ref([])
 const geStandardTypeOptions = async () => {
     const { data } = await getDictionary({
-        code: "classification",
-    });
+        code: 'classification',
+    })
     standardTypeOptions.value = await getDictionaryData(
-        "classification",
-        false
-    );
+        'classification',
+        false,
+    )
 
     standardTypeOptions.value.forEach((element) => {
         // element.parentId=
         data.forEach((ele) => {
             if (ele.dictKey == element.value) {
-                element.id = ele.id;
+                element.id = ele.id
             }
-        });
-    });
+        })
+    })
     // 定义要过滤的 dictKey 值
-    const targetKeys = [1, 2, 3, 4, 5];
+    const targetKeys = [1, 2, 3, 4, 5]
     // 过滤数组
     standardTypeOptions.value = standardTypeOptions.value.filter((item) =>
-        targetKeys.includes(item.value)
-    );
-};
+        targetKeys.includes(item.value),
+    )
+}
 //单元名称
-const unitOptions = ref([]);
+const unitOptions = ref([])
 
 const changeStandType = async (val) => {
     if (val !== orString.value) {
-        formModel.value.unitName = "";
+        formModel.value.unitName = ''
     }
 
-    let parentId = "";
+    let parentId = ''
     standardTypeOptions.value.forEach((item) => {
         if (item.value == val) {
-            parentId = item.id;
+            parentId = item.id
         }
-    });
-    const { data } = await getChildList({ current: 1, size: 10000, parentId });
-    unitOptions.value = data;
-    unitOptions.value = unitOptions.value.filter((item) => item.dictKey != -1);
+    })
+    const { data } = await getChildList({ current: 1, size: 10000, parentId })
+    unitOptions.value = data
+    unitOptions.value = unitOptions.value.filter((item) => item.dictKey != -1)
     unitOptions.value.forEach((ele) => {
-        ele.dictKey = Number(ele.dictKey);
-    });
-};
+        ele.dictKey = Number(ele.dictKey)
+    })
+}
 </script>
 
 <style lang="scss">

+ 271 - 258
src/views/project/info/template.vue

@@ -100,483 +100,496 @@
 </template>
 
 <script setup>
-import { nextTick, onMounted, ref, watch } from "vue";
-import { useAppStore } from "~src/store";
-import { deepClone, getArrValue, getObjValue, isNullES } from "js-fast-way";
-import mainApi from "~api/project/project";
-import treeApi from "~api/wbs/tree";
+import { nextTick, onMounted, ref, watch } from 'vue'
+import { useAppStore } from '~src/store'
+import { deepClone, getArrValue, getObjValue, isNullES } from 'js-fast-way'
+import mainApi from '~api/project/project'
+import treeApi from '~api/wbs/tree'
 
 //缓存
-const store = useAppStore();
+const store = useAppStore()
 
 //双向绑定
-const modelData = defineModel("modelValue", {
+const modelData = defineModel('modelValue', {
     default: {},
-});
+})
 
 //监听数据
-const formModel = ref({});
+const formModel = ref({})
 watch(
     () => modelData.value,
     (data) => {
-        formModel.value = data;
+        formModel.value = data
     },
-    { immediate: true, deep: true }
-);
+    { immediate: true, deep: true },
+)
 
 //监听
-const userInfo = ref(store.getUserInfo);
+const userInfo = ref(store.getUserInfo)
 watch(
     () => store.getUserInfo,
     (info) => {
-        userInfo.value = info;
+        userInfo.value = info
     },
-    { immediate: true, deep: true }
-);
+    { immediate: true, deep: true },
+)
 
 //渲染完成
 onMounted(() => {
-    getWbsTreeList();
-});
+    getWbsTreeList()
+})
 
 //顶部类型
-const templateType = ref(1);
+const templateType = ref(1)
 const templateTypeData = [
-    { value: 1, label: "质检" },
-    { value: 2, label: "试验" },
-    { value: 3, label: "计量" },
-    { value: 5, label: "征拆" },
-];
+    { value: 1, label: '质检' },
+    { value: 2, label: '试验' },
+    { value: 3, label: '计量' },
+    { value: 5, label: '征拆' },
+]
 
 //树配置
-const leftTreeRef = ref(null);
-const rightTreeRef = ref(null);
+const leftTreeRef = ref(null)
+const rightTreeRef = ref(null)
 const treeProps = {
-    children: "children",
-    label: "title",
-};
+    children: 'children',
+    label: 'title',
+}
 
 //获取WBS树列表
-const wbsId = ref("");
-const wbsTreeList = ref([]);
-const isLoading = ref(false);
+const wbsId = ref('')
+const wbsTreeList = ref([])
+const isLoading = ref(false)
+const selectData = ref({
+          referenceWbsTemplateId:'', //质检
+          referenceWbsTemplateIdLar:'', //征拆
+          referenceWbsTemplateIdMeter:'', //计量
+          referenceWbsTemplateIdTrial:'', //试验
+},
+    
+)
 const getWbsTreeList = async () => {
-    isLoading.value = true;
-    const type = templateType.value;
-    const { data } = await mainApi.findWbsTreeList(type);
+    isLoading.value = true
+    const type = templateType.value
+    const { data } = await mainApi.findWbsTreeList(type)
     // 格式化数据
-    const res = getObjValue(data);
+    const res = getObjValue(data)
     let arr = [
-        { label: "公有库", data: [] },
-        { label: "私有库", data: [] },
-    ];
+        { label: '公有库', data: [] },
+        { label: '私有库', data: [] },
+    ]
     const wbsInfos = getArrValue(res.wbsInfos),
-        wbsPrivates = getArrValue(res.wbsTreePrivates);
+        wbsPrivates = getArrValue(res.wbsTreePrivates)
     // 公有库
     wbsInfos.forEach((item) => {
-        item.value = item.id;
-        item.label = item.wbsName;
-    });
-    arr[0].data = wbsInfos;
+        item.value = item.id
+        item.label = item.wbsName
+    })
+    arr[0].data = wbsInfos
     // 私有库
     wbsPrivates.forEach((item) => {
-        item.label = item.projectName;
-        item.value = item.wbsId + "," + item.projectId;
-    });
-    arr[1].data = wbsPrivates;
-    wbsTreeList.value = arr;
-    console.log(wbsTreeList.value, " wbsTreeList.value");
+        item.label = item.projectName
+        item.value = item.wbsId + ',' + item.projectId
+    })
+    arr[1].data = wbsPrivates
+    wbsTreeList.value = arr
+    console.log(wbsTreeList.value, ' wbsTreeList.value')
 
     //处理选中
-    const form = getObjValue(formModel.value);
-    wbsId.value =
-        type === 1
+    const form = getObjValue(formModel.value)
+    wbsId.value
+        = type === 1
             ? form.referenceWbsTemplateId
-            : form.referenceWbsTemplateIdTrial;
-    if (type === 3) wbsId.value = form.referenceWbsTemplateIdMeter;
-    if (type === 5) wbsId.value = form.referenceWbsTemplateIdLar;
-    if (type === -1) wbsId.value = "";
+            : form.referenceWbsTemplateIdTrial
+    if (type === 3) wbsId.value = form.referenceWbsTemplateIdMeter
+    if (type === 5) wbsId.value = form.referenceWbsTemplateIdLar
+    if (type === -1) wbsId.value = ''
 
     // referenceWbsType.value = form.referenceWbsTemplateType;
-    referenceWbsType.value =
-        type === 1
+    referenceWbsType.value
+        = type === 1
             ? form.referenceWbsTemplateType
-            : form.referenceWbsTemplateTypeTrial;
-    if (type === 3) referenceWbsType.value = form.referenceWbsTemplateTypeMeter;
-    if (type === 5) referenceWbsType.value = form.referenceWbsTemplateTypeLar;
-    if (type === -1) referenceWbsType.value = "";
-    isLoading.value = false;
-    handleWbsID(wbsId.value);
-    await wbsChange(wbsId.value);
-};
+            : form.referenceWbsTemplateTypeTrial
+    if (type === 3) referenceWbsType.value = form.referenceWbsTemplateTypeMeter
+    if (type === 5) referenceWbsType.value = form.referenceWbsTemplateTypeLar
+    if (type === -1) referenceWbsType.value = ''
+    isLoading.value = false
+    handleWbsID(wbsId.value)
+    await wbsChange(wbsId.value)
+}
 
 const handleWbsID = (refId) => {
     if (refId && refId > 0) {
-        let priv = {};
-        if (referenceWbsType.value == "private") {
+        let priv = {}
+        if (referenceWbsType.value == 'private') {
             //私有
-            let list = wbsTreeList.value[1].data;
+            let list = wbsTreeList.value[1].data
             for (let i = 0; i < list.length; i++) {
                 if (list[i].pkeyId == refId) {
-                    wbsId.value = list[i].wbsId + "," + list[i].projectId;
-                    priv.wbsId = list[i].wbsId;
-                    priv.projectId = list[i].projectId;
-                    priv.value = list[i].value;
-                    priv.pkeyId = list[i].pkeyId;
-                    break;
+                    wbsId.value = list[i].wbsId + ',' + list[i].projectId
+                    priv.wbsId = list[i].wbsId
+                    priv.projectId = list[i].projectId
+                    priv.value = list[i].value
+                    priv.pkeyId = list[i].pkeyId
+                    break
                 }
             }
         } else {
             //公有
-            wbsId.value = refId;
+            wbsId.value = refId
         }
     }
-    console.log(wbsId.value, " wbsId.value");
-};
+    console.log(wbsId.value, ' wbsId.value')
+}
 //左边树
-const leftLoading = ref(false);
-const leftTreeData = ref([]);
+const leftLoading = ref(false)
+const leftTreeData = ref([])
 
 //切换wbs树
-const isDisabled = ref(false);
-const referenceWbsId = ref("");
-const referenceWbsType = ref("");
+const isDisabled = ref(false)
+const referenceWbsId = ref('')
+const referenceWbsType = ref('')
 const wbsChange = async (val) => {
-    isDisabled.value = false;
-    leftLoading.value = true;
-    referenceWbsId.value = val;
+    isDisabled.value = false
+    leftLoading.value = true
+    referenceWbsId.value = val
     //无值
     if (isNullES(val)) {
-        await getRightTreeApi();
-        leftLoading.value = false;
-        return;
+        // await getRightTreeApi()
+        leftTreeData.value = []
+        rightTreeData.value = []
+        leftLoading.value = false
+        return
     }
+
+
     //私有库
-    if (val.toString().indexOf(",") >= 0) {
-        referenceWbsType.value = "private";
-        let ids = val.toString().split(",");
+    if (val.toString().indexOf(',') >= 0) {
+        referenceWbsType.value = 'private'
+        let ids = val.toString().split(',')
         const { data } = await mainApi.findProjectTree({
             projectId: ids[1],
             wbsId: ids[0],
-        });
-        leftTreeData.value = getArrValue(data);
-        leftLoading.value = false;
-        await getRightTreeApi();
-        return;
+        })
+        leftTreeData.value = getArrValue(data)
+        leftLoading.value = false
+        await getRightTreeApi()
+        return
     }
     //公有库
     if (val.length > 0) {
-        referenceWbsType.value = "public";
-        const { tenant_id } = getObjValue(userInfo.value);
+        referenceWbsType.value = 'public'
+        const { tenant_id } = getObjValue(userInfo.value)
         const { data } = await treeApi.getAlltree({
             tenantId: tenant_id,
-            type: "1",
+            type: '1',
             wbsId: val,
-        });
-        leftTreeData.value = getArrValue(data);
-        leftLoading.value = false;
-        await getRightTreeApi();
+        })
+        leftTreeData.value = getArrValue(data)
+        leftLoading.value = false
+        await getRightTreeApi()
+        return
     }
-};
+}
 
 //获取右边数据
-const rightLoading = ref(false);
-const rightTreeData = ref([]);
+const rightLoading = ref(false)
+const rightTreeData = ref([])
 const getRightTreeApi = async () => {
-    rightLoading.value = true;
-    isDisabled.value = true;
-    let refId = referenceWbsId.value;
+    rightLoading.value = true
+    isDisabled.value = true
+    let refId = referenceWbsId.value
     if (isNullES(refId)) {
-        isDisabled.value = false;
-        rightLoading.value = false;
-        return;
+        isDisabled.value = false
+        rightLoading.value = false
+        return
     }
     //私有
-    if (refId.toString().length > 0 && referenceWbsType.value === "private") {
-        let ids = refId.toString().split(",");
+    if (refId.toString().length > 0 && referenceWbsType.value === 'private') {
+        let ids = refId.toString().split(',')
         if (ids.length > 1) {
-            refId = ids[0];
-            let list = wbsTreeList.value[1].data;
+            refId = ids[0]
+            let list = wbsTreeList.value[1].data
             refId = list.filter(({ projectId }) => projectId === ids[1])[0]
-                .pkeyId;
+                .pkeyId
         }
     }
     //引用被删会出现 wbsType -1
     if (refId && refId > 0) {
-        let priv = {};
+        let priv = {}
         //私有
-        if (referenceWbsType.value === "private") {
-            let list = wbsTreeList.value[1].data;
+        if (referenceWbsType.value === 'private') {
+            let list = wbsTreeList.value[1].data
             for (let i = 0; i < list.length; i++) {
                 if (list[i].pkeyId === refId) {
-                    refId = list[i].wbsId + "," + list[i].projectId;
-                    priv.wbsId = list[i].wbsId;
-                    priv.projectId = list[i].projectId;
-                    priv.value = list[i].value;
-                    priv.pkeyId = list[i].pkeyId;
-                    break;
+                    refId = list[i].wbsId + ',' + list[i].projectId
+                    priv.wbsId = list[i].wbsId
+                    priv.projectId = list[i].projectId
+                    priv.value = list[i].value
+                    priv.pkeyId = list[i].pkeyId
+                    break
                 }
             }
         } else {
             //公有
-            refId = referenceWbsId.value;
+            refId = referenceWbsId.value
         }
     }
-    console.log(refId, "refId");
+    console.log(refId, 'refId')
 
-    const form = getObjValue(formModel.value);
-    let recordId = formatWbsId(refId);
+    const form = getObjValue(formModel.value)
+    let recordId = formatWbsId(refId)
     const { data } = await mainApi.findProjectTree({
         projectId: form.id,
         // wbsId: refId,
         wbsId: recordId,
-    });
-    const projectTree = getArrValue(data);
-    isDisabled.value = projectTree.length > 0;
-    rightTreeData.value = projectTree;
-    setRightTree();
-    rightLoading.value = false;
-};
+    })
+    const projectTree = getArrValue(data)
+    isDisabled.value = projectTree.length > 0
+    rightTreeData.value = projectTree
+    setRightTree()
+    rightLoading.value = false
+}
 
 //默认全部引用
-const allChecked = ref(false);
+const allChecked = ref(false)
 const checkChang = () => {
-    setCheckTreeChange();
-};
+    setCheckTreeChange()
+}
 
 //左边树被展开
-const rightExpands = ref([]);
+const rightExpands = ref([])
 const nodeLeftTreeExpand = (data) => {
-    rightExpands.value = rightExpands.value.concat([data.id]);
-};
+    rightExpands.value = rightExpands.value.concat([data.id])
+}
 
 //左边树复选框被点击
-const leftNum = ref(0);
+const leftNum = ref(0)
 const checkLeftTreeChange = () => {
-    const e = leftTreeRef.value;
-    let checkNum = e.getCheckedKeys().length;
-    let halfNum = e.getHalfCheckedKeys().length;
-    leftNum.value = checkNum + halfNum;
-};
+    const e = leftTreeRef.value
+    let checkNum = e.getCheckedKeys().length
+    let halfNum = e.getHalfCheckedKeys().length
+    leftNum.value = checkNum + halfNum
+}
 
 //右边树复选框被点击
-const rightNum = ref(0);
+const rightNum = ref(0)
 const checkRightTreeChange = () => {
-    const e = rightTreeRef.value;
-    let checkNum = e.getCheckedKeys().length;
-    let halfNum = e.getHalfCheckedKeys().length;
-    rightNum.value = checkNum + halfNum;
-};
+    const e = rightTreeRef.value
+    let checkNum = e.getCheckedKeys().length
+    let halfNum = e.getHalfCheckedKeys().length
+    rightNum.value = checkNum + halfNum
+}
 
 //左边树新增到右边
 const addTreeClick = () => {
     const left = leftTreeRef.value,
-        right = rightTreeRef.value;
+        right = rightTreeRef.value
     if (rightTreeData.value.length < 1) {
         //直接把左边勾选的树复制到右侧
-        let allTree = JSON.parse(JSON.stringify(leftTreeData.value));
-        const halfKeys = left.getHalfCheckedKeys();
-        const keys = left.getCheckedKeys().concat(halfKeys);
-        getRightTree(allTree, keys);
-        rightTreeData.value = allTree;
-        setCheckTreeChange(rightTreeData.value);
+        let allTree = JSON.parse(JSON.stringify(leftTreeData.value))
+        const halfKeys = left.getHalfCheckedKeys()
+        const keys = left.getCheckedKeys().concat(halfKeys)
+        getRightTree(allTree, keys)
+        rightTreeData.value = allTree
+        setCheckTreeChange(rightTreeData.value)
     } else {
         //只增加右侧树没有的节点,不会覆盖右侧树多余的节点
-        let checkNodes = left.getCheckedNodes(false, true);
+        let checkNodes = left.getCheckedNodes(false, true)
 
-        let rIdMap = new Map();
+        let rIdMap = new Map()
         checkNodes.forEach((data) => {
-            rIdMap.set(data.id, data);
-        });
+            rIdMap.set(data.id, data)
+        })
 
-        let lIdSet = new Set();
-        getRightTreeData(lIdSet, rightTreeData.value);
+        let lIdSet = new Set()
+        getRightTreeData(lIdSet, rightTreeData.value)
 
         //在右侧id减去左侧有的id,剩下的就是新增的id
         lIdSet.forEach((id) => {
-            rIdMap.delete(id);
-        });
+            rIdMap.delete(id)
+        })
 
-        let addMap = new Map();
+        let addMap = new Map()
         rIdMap.forEach((data) => {
-            if (data.parentId !== "0" && data.parentId !== 0) {
+            if (data.parentId !== '0' && data.parentId !== 0) {
                 //在左侧树能找到父节点的,新增
-                let lNode = right.getNode(data.parentId);
-                if (lNode) addMap.set(data, lNode.data.id);
+                let lNode = right.getNode(data.parentId)
+                if (lNode) addMap.set(data, lNode.data.id)
             }
-        });
+        })
 
         //把半选和选中的数组key合并
-        const halfKeys = left.getHalfCheckedKeys();
-        const keys = left.getCheckedKeys().concat(halfKeys);
-        const myArray = Array.from(addMap.keys());
-        let myright = deepClone(myArray);
-        getRightTree(myright, keys);
+        const halfKeys = left.getHalfCheckedKeys()
+        const keys = left.getCheckedKeys().concat(halfKeys)
+        const myArray = Array.from(addMap.keys())
+        let myright = deepClone(myArray)
+        getRightTree(myright, keys)
         myright.forEach((data) => {
-            right.append(data, data.parentId);
-        });
+            right.append(data, data.parentId)
+        })
     }
-};
+}
 
 //获取右边树
 const getRightTree = (arr, keys) => {
     //对比所有的node和选中的key
     for (let i = arr.length - 1; i >= 0; i--) {
-        let isIn = false;
+        let isIn = false
         for (let j = keys.length - 1; j >= 0; j--) {
             if (keys[j] === arr[i].id) {
-                isIn = true;
+                isIn = true
                 //已经匹配到的key移除,节省性能
-                keys.splice(j, 1);
-                break;
+                keys.splice(j, 1)
+                break
             }
         }
         if (isIn) {
             //包含在选中的节点,如果有childer继续递归判断
             if (arr[i].children && arr[i].children.length) {
-                getRightTree(arr[i].children, keys);
+                getRightTree(arr[i].children, keys)
             }
         } else {
             //不包含在选中key的node删除
-            arr.splice(i, 1);
+            arr.splice(i, 1)
         }
     }
-};
+}
 
 const getRightTreeData = (set, arr) => {
     arr.forEach((data) => {
-        set.add(data.id);
+        set.add(data.id)
         if (data.children && data.children.length) {
-            getRightTreeData(set, data.children);
+            getRightTreeData(set, data.children)
         }
-    });
-};
+    })
+}
 
 //右边树移除
 const delTreeClick = () => {
     const left = leftTreeRef.value,
-        right = rightTreeRef.value;
-    let delNodes = right.getCheckedNodes();
+        right = rightTreeRef.value
+    let delNodes = right.getCheckedNodes()
     //只把选中的节点移除
     delNodes.forEach((node) => {
-        right.remove(node);
-        left.setChecked(node.id, false);
-    });
-    checkLeftTreeChange();
-    checkRightTreeChange();
-    setCheckTreeChange(delNodes);
-};
+        right.remove(node)
+        left.setChecked(node.id, false)
+    })
+    checkLeftTreeChange()
+    checkRightTreeChange()
+    setCheckTreeChange(delNodes)
+}
 
 const setRightTree = () => {
-    let ids = [];
-    const data = rightTreeData.value;
+    let ids = []
+    const data = rightTreeData.value
     for (let i = 0; i < data.length; i++) {
-        getLeafIds(ids, data[i]);
+        getLeafIds(ids, data[i])
     }
     //在左边把右边的节点勾选上
-    const e = leftTreeRef.value;
+    const e = leftTreeRef.value
     nextTick(() => {
-        e.setCheckedKeys(ids, true);
-    });
-};
+        e.setCheckedKeys(ids, true)
+    })
+}
 
 const getLeafIds = (ids, data) => {
     if (data.children && data.children.length) {
         for (let i = 0; i < data.children.length; i++) {
-            getLeafIds(ids, data.children[i]);
+            getLeafIds(ids, data.children[i])
         }
     } else {
-        ids.push(data.id);
+        ids.push(data.id)
     }
-};
+}
 
 const getTreeAllId = async (name) => {
-    let tree;
-    if (name === "left") {
-        tree = leftTreeRef.value;
-    } else if (name === "right") {
-        tree = rightTreeRef.value;
+    let tree
+    if (name === 'left') {
+        tree = leftTreeRef.value
+    } else if (name === 'right') {
+        tree = rightTreeRef.value
     }
     if (allChecked.value) {
-        tree = leftTreeRef.value;
+        tree = leftTreeRef.value
     }
-    let ids = [];
+    let ids = []
     for (let i = 0; i < tree.data.length; i++) {
-        await getIds(ids, tree.data[i]);
+        await getIds(ids, tree.data[i])
     }
-    return ids.join(",");
-};
+    return ids.join(',')
+}
 
 const getIds = async (ids, data) => {
-    ids.push(data.id);
+    ids.push(data.id)
     if (data.children && data.children.length) {
         for (let i = 0; i < data.children.length; i++) {
-            await getIds(ids, data.children[i]);
+            await getIds(ids, data.children[i])
         }
     }
-};
+}
 
 //格式化wbsid
 const formatWbsId = (rid) => {
-    let refId = rid;
+    let refId = rid
     if (isNullES(refId)) {
-        return refId;
+        return refId
     }
-    if (referenceWbsType.value === "private" && refId.toString().length > 0) {
+    if (referenceWbsType.value === 'private' && refId.toString().length > 0) {
         // 私有库右边树形数据是通过 pkeyId 查询的
-        let ids = refId.toString().split(",");
+        let ids = refId.toString().split(',')
         if (ids.length > 1) {
-            refId = ids[0];
-            let list = wbsTreeList.value[1].data;
+            refId = ids[0]
+            let list = wbsTreeList.value[1].data
             refId = list.filter(({ projectId }) => projectId === ids[1])[0]
-                .pkeyId;
-            return refId;
+                .pkeyId
+            return refId
         } else {
-            return "";
+            return ''
         }
     } else {
-        return refId;
+        return refId
     }
-};
+}
 
-const rightObj = ref({});
+const rightObj = ref({})
 const setCheckTreeChange = () => {
-    let recordId = formatWbsId(wbsId.value);
+    let recordId = formatWbsId(wbsId.value)
     rightObj.value = {
         wbsId: recordId,
         data: rightTreeData.value,
-    };
-};
+    }
+}
 
 const getTreeObj = async () => {
-    const form = getObjValue(formModel.value);
-    const ids = await getTreeAllId("right");
-    const wbs_id = wbsId.value;
+    const form = getObjValue(formModel.value)
+    const ids = await getTreeAllId('right')
+    const wbs_id = wbsId.value
 
     let obj = {
         wbsId: wbs_id,
         projectId: form.id,
         wbsType: templateType.value,
         wbsTreeIds: ids,
-    };
-    if (wbs_id.toString().indexOf(",") >= 0) {
+    }
+    if (wbs_id.toString().indexOf(',') >= 0) {
         //私有库
-        obj.referenceType = "private";
-        let ids = wbs_id.toString().split(",");
-        obj.wbsId = ids[0];
-        obj.referencePrivateWbsProjectId = ids[1];
-        obj.primaryKeyId = leftTreeData.value[0].primaryKeyId;
+        obj.referenceType = 'private'
+        let ids = wbs_id.toString().split(',')
+        obj.wbsId = ids[0]
+        obj.referencePrivateWbsProjectId = ids[1]
+        obj.primaryKeyId = leftTreeData.value[0].primaryKeyId
     } else {
         //公有库
-        obj.referenceType = "public";
-        obj.wbsId = wbs_id;
+        obj.referenceType = 'public'
+        obj.wbsId = wbs_id
     }
-    return obj;
-};
+    return obj
+}
 
 defineExpose({
     getTreeObj,
-});
+})
 </script>
 
 <style lang="scss">

+ 22 - 11
src/views/project/list/wbs-tree.vue

@@ -38,14 +38,16 @@
                                     </template>
                                 </hc-search-input>
                             </template>
-                            <hc-data-tree
-                                v-if="isSearchTree" :auto-expand-keys="treeExpandKeys" :datas="treeLoadData" :h-props="treeProps"
-                                :menus="treeMenus" tree-key="id" @menu-tap="treeMenuClick" @node-tap="treeNodeClick"
-                            />
-                            <hc-lazy-tree
-                                v-else :auto-expand-keys="treeExpandKeys" :h-props="treeProps" :menus="treeMenus"
-                                tree-key="id" @load="treeLoadNode" @menu-tap="treeMenuClick" @node-tap="treeNodeClick"
-                            />
+                            <div v-if="isShowTree">
+                                <hc-data-tree
+                                    v-if="isSearchTree" :auto-expand-keys="treeExpandKeys" :datas="treeLoadData" :h-props="treeProps"
+                                    :menus="treeMenus" tree-key="id" @menu-tap="treeMenuClick" @node-tap="treeNodeClick"
+                                />
+                                <hc-lazy-tree
+                                    v-else :auto-expand-keys="treeExpandKeys" :h-props="treeProps" :menus="treeMenus"
+                                    tree-key="id" @load="treeLoadNode" @menu-tap="treeMenuClick" @node-tap="treeNodeClick"
+                                />
+                            </div>
                         </hc-card>
                     </template>
                     <template v-if="isFormSet">
@@ -344,7 +346,13 @@ const getDictionaryName = (arr, id, name) => {
     const item = arr.find((item) => item.value === Number(id))
     return name ? item?.label : getObjValue(item)
 }
-
+const isShowTree = ref(true)
+const refreshTree = () => {
+    isShowTree.value = false
+    setTimeout(() => {
+        isShowTree.value = true
+    }, 1000)
+}
 //树节点搜索
 const isSearchTree = ref(false)
 const isTreeLoading = ref(false)
@@ -575,7 +583,8 @@ const nodeSortModalSave = async () => {
     if (!isRes) return
     window.$message.success('排序完成')
     nodeSortModalShow.value = false
-    reloadPage()
+    // reloadPage()
+    refreshTree()
 }
 
 //编辑节点
@@ -590,6 +599,7 @@ const treeNodeEditChange = () => {
     isTreeNodeEditShow.value = false
     treeMenuItem.value = {}
     console.log('编辑节点被修改')
+    refreshTree()
 }
 
 //懒加载树
@@ -935,12 +945,13 @@ const nodeParamShow = ref(false)
 const nodeParamClose = () => {
     nodeParamShow.value = false
 }
-const nodeParamClick = () => {
+const nodeParamClick = async () => {
     const { id } = treeItem.value
     if (!id) {
         window?.$message.warning('请先选择节点')
         return
     }
+    await nextTick()
     nodeParamShow.value = true
 }
 //独立表单库