duy před 9 měsíci
rodič
revize
f186528974

+ 3 - 3
src/views/desk/wbs/archieveComponent/rightConfig.vue

@@ -160,7 +160,7 @@
                         show-checkbox
                         :check-strictly="true"
                         :default-checked-keys="checkedKeys"
-                        :default-expanded-keys="checkedKeys"
+                        :autoExpandKeys="checkedKeys"
                         tree-key="id"
                         ref="configtree"
                         @check="configCheckChange"
@@ -291,9 +291,9 @@ const secondTreeMenuClick = async ({ key, data, node }) => {
             } else if (res.archiveAutoType) {
                 configInfo.value = {
                     type: 2,
-                    data: [res.data],
+                    data: res.tree,
                 };
-                checkedKeys.value = data?.selectNodeIds.split(",");
+                checkedKeys.value = res?.selectNodeIds.split(",");
             } else {
                 configInfo.value = {};
             }

+ 476 - 178
src/views/project/tree/drawer-temp.vue

@@ -1,329 +1,627 @@
 <template>
-    <hc-drawer v-model="isShow" to-id="hc-main-box" is-close @close="drawerClose">
+    <hc-drawer
+        v-model="isShow"
+        to-id="hc-main-box"
+        is-close
+        @close="drawerClose"
+    >
         <hc-body split>
             <template #left>
                 <hc-card scrollbar>
                     <template #header>
-                        <hc-search-input v-model="searchTreeName" placeholder="请输入关键字" @search="searchTreeNameClick" />
+                        <hc-search-input
+                            v-model="searchTreeName"
+                            placeholder="请输入关键字"
+                            @search="searchTreeNameClick"
+                        />
                     </template>
                     <template v-if="isTreeMode === 1">
                         <hc-lazy-tree
-                            v-if="isShow" ref="treeRef1" is-load-menu :h-props="treeProps" tree-key="id"
-                            @load-menu="treeMenu" @load="treeLoadNode" @node-tap="treeNodeTap" @menu-tap="treeMenuClick"
+                            v-if="isShow"
+                            ref="treeRef1"
+                            is-load-menu
+                            :h-props="treeProps"
+                            tree-key="id"
+                            @load-menu="treeMenu"
+                            @load="treeLoadNode"
+                            @node-tap="treeNodeTap"
+                            @menu-tap="treeMenuClick"
                         >
                             <template #name="{ data }">
-                                <span class="text-16px font-400">{{ data.title }}</span>
+                                <span class="text-16px font-400">{{
+                                    data.title
+                                }}</span>
                             </template>
                         </hc-lazy-tree>
                     </template>
                     <template v-if="isTreeMode === 2">
                         <hc-data-tree
-                            ref="treeRef2" is-load-menu :h-props="treeProps" tree-key="id" :datas="treeData"
-                            @load-menu="treeMenu" @node-tap="treeNodeTap" @menu-tap="treeMenuClick"
+                            ref="treeRef2"
+                            is-load-menu
+                            :h-props="treeProps"
+                            tree-key="id"
+                            :datas="treeData"
+                            @load-menu="treeMenu"
+                            @node-tap="treeNodeTap"
+                            @menu-tap="treeMenuClick"
                         >
                             <template #name="{ data }">
-                                <span class="text-16px font-400">{{ data.title }}</span>
+                                <span class="text-16px font-400">{{
+                                    data.title
+                                }}</span>
                             </template>
                         </hc-data-tree>
                     </template>
                 </hc-card>
             </template>
-            <hc-tab-card :tabs="tabsData" :tab-key="tabsKey" @change="tabsChange">
+            <hc-tab-card
+                :tabs="tabsData"
+                :tab-key="tabsKey"
+                @change="tabsChange"
+            >
                 <template v-if="tabsKey === 'second'">
                     <div class="hc-flex mb-10px">
-                        <el-button type="primary" plain @click="setHighestClick">设置为最高并卷层级</el-button>
-                        <el-button type="primary" plain @click="setClassifyClick">设置为分类卷并卷</el-button>
-                        <el-button type="primary" plain @click="setIndependence">设置为独立组卷</el-button>
+                        <el-button type="primary" plain @click="setClick(1)"
+                            >设置为最高并卷层级</el-button
+                        >
+                        <el-button type="primary" plain @click="setClick(2)"
+                            >设置为分类卷并卷</el-button
+                        >
+                        <el-button type="primary" plain @click="setClick(3)"
+                            >设置为独立组卷</el-button
+                        >
                     </div>
                     <div class="hc-tab-scroll-class-second">
-                        <el-scrollbar>
+                        <el-scrollbar v-loading="secondTreeLoad">
                             <hc-data-tree
-                                ref="secondTree" is-load-menu :h-props="secondTreeProps" tree-key="id" :datas="secondTreeData"
-                                show-checkbox check-strictly @load-menu="secondTreeMenu" @menu-tap="secondTreeMenuClick"
+                                ref="secondTree"
+                                is-load-menu
+                                :h-props="secondTreeProps"
+                                tree-key="id"
+                                :datas="secondTreeData"
+                                show-checkbox
+                                check-strictly
+                                @load-menu="secondTreeMenu"
+                                @menu-tap="secondTreeMenuClick"
                             >
                                 <template #name="{ data }">
-                                    <div class="config_type">最</div>
-                                    <template v-if="Number(data.archiveAutoGroupSelect) === 1">
-                                        <div v-if="Number(data.archiveAutoType) === 1" class="config_type">最</div>
-                                        <div v-if="Number(data.archiveAutoType) === 2" class="config_type">分</div>
-                                        <div v-if="Number(data.archiveAutoType) === 3" class="config_type">独</div>
+                                    <!-- <div class="config_type">最</div> -->
+                                    <template
+                                        v-if="
+                                            Number(
+                                                data.archiveAutoGroupSelect
+                                            ) === 1
+                                        "
+                                    >
+                                        <div
+                                            v-if="
+                                                Number(data.archiveAutoType) ===
+                                                1
+                                            "
+                                            class="config_type"
+                                        >
+                                            最
+                                        </div>
+                                        <div
+                                            v-if="
+                                                Number(data.archiveAutoType) ===
+                                                2
+                                            "
+                                            class="config_type"
+                                        >
+                                            分
+                                        </div>
+                                        <div
+                                            v-if="
+                                                Number(data.archiveAutoType) ===
+                                                3
+                                            "
+                                            class="config_type"
+                                        >
+                                            独
+                                        </div>
                                     </template>
-                                    <span class="text-16px font-400">{{ data.title }}</span>
+                                    <span class="text-16px font-400">{{
+                                        data.title
+                                    }}</span>
                                 </template>
                             </hc-data-tree>
                         </el-scrollbar>
                     </div>
                 </template>
-                <template v-if="tabsKey === 'first'">
-                    内容区域
-                </template>
+                <template v-if="tabsKey === 'first'"> 内容区域 </template>
             </hc-tab-card>
         </hc-body>
         <!-- 树节点新增 -->
-        <HcTreeNodeForm v-model="isTreeFormShow" :info="dataInfo" :data="treeFormData" :node="treeFormNode" :type="treeFormType" @finish="pseudoRefresh" />
+        <HcTreeNodeForm
+            v-model="isTreeFormShow"
+            :info="dataInfo"
+            :data="treeFormData"
+            :node="treeFormNode"
+            :type="treeFormType"
+            @finish="pseudoRefresh"
+        />
         <!-- 树节点排序 -->
-        <HcTreeNodeSort v-model="isTreeSortShow" :data="treeSortData" @finish="pseudoRefresh" />
+        <HcTreeNodeSort
+            v-model="isTreeSortShow"
+            :data="treeSortData"
+            @finish="pseudoRefresh"
+        />
+        <!-- 查看配置 -->
+        <hc-dialog v-model="configVisible" title="查看配置">
+            <div v-if="configInfo && configInfo.type">
+                <div class="mb-2" style="font-size: 18px">
+                    <span>配置类别:</span>
+                    <span v-if="configInfo.type == 1">最高并卷层级</span>
+                    <span v-if="configInfo.type == 2">分类并卷</span>
+                    <span v-if="configInfo.type == 3">独立组卷</span>
+                </div>
+                <template v-if="configInfo.type !== 2">
+                    <div class="config-allname">
+                        {{ configInfo.data.allName }}
+                    </div>
+                </template>
+                <template v-else>
+                    <hc-data-tree
+                        :datas="configInfo.data"
+                        tree-key="id"
+                        :h-props="configTreeProps"
+                        show-checkbox
+                        :check-strictly="true"
+                        :default-checked-keys="checkedKeys"
+                        :autoExpandKeys="checkedKeys"
+                        ref="configtree"
+                        @check="configCheckChange"
+                    ></hc-data-tree>
+                </template>
+            </div>
+            <div style="text-align: center; font-size: 22px" v-else>
+                该节点尚未配置
+            </div>
+
+            <template #footer>
+                <el-button @click="configVisible = false">取消查看</el-button>
+                <el-button
+                    v-if="configInfo && configInfo.type == 2"
+                    type="primary"
+                    @click="changeConfig"
+                    >确认修改配置</el-button
+                >
+            </template>
+        </hc-dialog>
+        <!-- 设置最高层级 -->
+        <hc-dialog
+            :title="titleName"
+            v-model="highVisible"
+            @save="setRecordsHandle"
+            @close="highVisible = false"
+        >
+            <el-checkbox-group v-model="checkList" class="wraplabel">
+                <div v-for="node in nodesList" :key="node.id">
+                    <el-checkbox
+                        :label="node.pathName"
+                        :value="node.id"
+                        style="margin-bottom: 10px"
+                    ></el-checkbox>
+                </div>
+            </el-checkbox-group>
+        </hc-dialog>
     </hc-drawer>
 </template>
 
 <script setup>
-import { ref, watch } from 'vue'
-import { HcDelMsg, HcFirmMsg } from 'hc-vue3-ui'
-import { getArrValue, isNullES } from 'js-fast-way'
-import HcTreeNodeForm from './tree-form.vue'
-import HcTreeNodeSort from './tree-sort.vue'
-import mainApi from '~api/project/tree'
-
+import { ref, watch } from "vue";
+import { HcDelMsg, HcFirmMsg } from "hc-vue3-ui";
+import { getArrValue, isNullES } from "js-fast-way";
+import HcTreeNodeForm from "./tree-form.vue";
+import HcTreeNodeSort from "./tree-sort.vue";
+import mainApi from "~api/project/tree";
+import archiveApi from "~api/desk/archive-tree";
 const props = defineProps({
     data: {
         type: Object,
         default: () => ({}),
     },
-})
+});
 
 //事件
-const emit = defineEmits(['close'])
+const emit = defineEmits(["close"]);
 
 //双向绑定
-const isShow = defineModel('modelValue', {
+const isShow = defineModel("modelValue", {
     default: false,
-})
+});
 
 //监听数据
-const dataInfo = ref(props.data)
-watch(() => props.data, (data) => {
-    dataInfo.value = data
-}, { immediate: true, deep: true })
+const dataInfo = ref(props.data);
+watch(
+    () => props.data,
+    (data) => {
+        dataInfo.value = data;
+    },
+    { immediate: true, deep: true }
+);
 
 //监听显示
 watch(isShow, (val) => {
-    if (val) getDataApi()
-})
+    if (val) getDataApi();
+});
 
 //处理相关数据
 const getDataApi = () => {
-    getTreeAllData()
-    getSecondTreeData()
-}
+    getTreeAllData();
+    getSecondTreeData();
+};
 
 //树搜索
-const isTreeMode = ref(1) //1懒加载,2全加载
-const searchTreeName = ref('')
+const isTreeMode = ref(1); //1懒加载,2全加载
+const searchTreeName = ref("");
 const searchTreeNameClick = async () => {
     if (isNullES(searchTreeName.value)) {
-        isTreeMode.value = 1
+        isTreeMode.value = 1;
     } else {
-        isTreeMode.value = 2
-        await getTreeAllData()
-        treeRef2.value?.treeRef?.filter(searchTreeName.value)
+        isTreeMode.value = 2;
+        await getTreeAllData();
+        treeRef2.value?.treeRef?.filter(searchTreeName.value);
     }
-}
+};
 
 //树配置
-const treeRef1 = ref(null)
-const treeRef2 = ref(null)
+const treeRef1 = ref(null);
+const treeRef2 = ref(null);
 const treeProps = {
-    label: 'title',
-    children: 'children',
-    isLeaf: 'hasChildren',
-}
+    label: "title",
+    children: "children",
+    isLeaf: "hasChildren",
+};
 
 //懒加载树的菜单
 const treeMenu = ({ level }, resolve) => {
-    let newMenu = []
+    let newMenu = [];
     if (level !== 1) {
-        newMenu.push({ icon: 'add-circle', label: '新增', key: 'add' })
-        newMenu.push({ icon: 'draft', label: '编辑', key: 'edit' })
-        newMenu.push({ icon: 'arrow-up-down', label: '排序', key: 'rank' })
-        newMenu.push({ icon: 'delete-bin', label: '删除', key: 'del' })
+        newMenu.push({ icon: "add-circle", label: "新增", key: "add" });
+        newMenu.push({ icon: "draft", label: "编辑", key: "edit" });
+        newMenu.push({ icon: "arrow-up-down", label: "排序", key: "rank" });
+        newMenu.push({ icon: "delete-bin", label: "删除", key: "del" });
     }
-    newMenu.push({ icon: 'refresh', label: '同步', key: 'sync' })
-    resolve(newMenu)
-}
+    newMenu.push({ icon: "refresh", label: "同步", key: "sync" });
+    resolve(newMenu);
+};
 
 //菜单被点击
 const treeMenuClick = ({ key, data, node }) => {
-    if (key === 'add') {
+    if (key === "add") {
         if (Number(data.isStorageNode) !== 1) {
-            treeFormType.value = '新增'
-            treeFormData.value = data
-            treeFormNode.value = node
-            isTreeFormShow.value = true
+            treeFormType.value = "新增";
+            treeFormData.value = data;
+            treeFormNode.value = node;
+            isTreeFormShow.value = true;
         } else {
-            window.$message.warning('该节点下不允许新增节点')
+            window.$message.warning("该节点下不允许新增节点");
         }
-    } else if (key === 'edit') {
-        treeFormType.value = '编辑'
-        treeFormData.value = data
-        treeFormNode.value = node
-        isTreeFormShow.value = true
-    } else if (key === 'rank') {
-        treeSortData.value = data
-        isTreeSortShow.value = true
-    } else if (key === 'del') {
-        delTreeNode(data.id)
-    } else if (key === 'sync') {
-        syncTreeNode(data.id)
+    } else if (key === "edit") {
+        treeFormType.value = "编辑";
+        treeFormData.value = data;
+        treeFormNode.value = node;
+        isTreeFormShow.value = true;
+    } else if (key === "rank") {
+        treeSortData.value = data;
+        isTreeSortShow.value = true;
+    } else if (key === "del") {
+        delTreeNode(data.id);
+    } else if (key === "sync") {
+        syncTreeNode(data.id);
     }
-}
+};
 
 //树节点新增/编辑
-const isTreeFormShow = ref(false)
-const treeFormData = ref({})
-const treeFormNode = ref({})
-const treeFormType = ref('新增')
+const isTreeFormShow = ref(false);
+const treeFormData = ref({});
+const treeFormNode = ref({});
+const treeFormType = ref("新增");
 
 //树节点排序
-const isTreeSortShow = ref(false)
-const treeSortData = ref({})
+const isTreeSortShow = ref(false);
+const treeSortData = ref({});
 
 //删除树节点
 const delTreeNode = (id) => {
     HcDelMsg(async (resolve) => {
-        const { isRes } = await mainApi.removeTree(id)
-        if (!isRes) return
-        window.$message.success('删除成功')
-        resolve() //关闭弹窗的回调
-        pseudoRefresh()
-    })
-}
+        const { isRes } = await mainApi.removeTree(id);
+        if (!isRes) return;
+        window.$message.success("删除成功");
+        resolve(); //关闭弹窗的回调
+        pseudoRefresh();
+    });
+};
 
 //同步树节点
 const syncTreeNode = (id) => {
-    HcFirmMsg({ text: '是否同步该节点?' }, async (resolve) => {
-        const { isRes } = await mainApi.syncProjectTree({ id })
-        resolve() //关闭弹窗的回调
-        if (!isRes) return
-        window.$message.success('操作成功')
-        pseudoRefresh()
-    })
-}
+    HcFirmMsg({ text: "是否同步该节点?" }, async (resolve) => {
+        const { isRes } = await mainApi.syncProjectTree({ id });
+        resolve(); //关闭弹窗的回调
+        if (!isRes) return;
+        window.$message.success("操作成功");
+        pseudoRefresh();
+    });
+};
 
 //伪刷新
 const pseudoRefresh = () => {
-    const val = isTreeMode.value
-    isTreeMode.value = 4
-    treeFormData.value = {}
-    treeFormNode.value = {}
-    treeFormType.value = ''
-    treeSortData.value = {}
-    setTimeout(()=> {
-        isTreeMode.value = val
-    }, 300)
-}
+    const val = isTreeMode.value;
+    isTreeMode.value = 4;
+    treeFormData.value = {};
+    treeFormNode.value = {};
+    treeFormType.value = "";
+    treeSortData.value = {};
+    setTimeout(() => {
+        isTreeMode.value = val;
+    }, 300);
+};
 
 //全加载树
-const treeData = ref([])
+const treeData = ref([]);
 const getTreeAllData = async () => {
     const { data } = await mainApi.allTree({
         projectId: dataInfo.value.id,
-    })
-    treeData.value = getArrValue(data)
-}
+    });
+    treeData.value = getArrValue(data);
+};
 
 //立卷规则树
 const getSecondTreeData = async () => {
+    secondTreeLoad.value = true;
     const { data } = await mainApi.allTree({
         projectId: dataInfo.value.id,
-    })
-    secondTreeData.value = getArrValue(data)
-}
+    });
+    secondTreeLoad.value = false;
+    secondTreeData.value = getArrValue(data);
+};
 
 //懒加载树
 const treeLoadNode = async ({ item, level }, resolve) => {
-    const parentId = level === 0 ? 0 : item.id
+    const parentId = level === 0 ? 0 : item.id;
     if (level === 0) {
-        const arr = await lazyNodeTree(parentId)
+        const arr = await lazyNodeTree(parentId);
         if (arr.length) {
-            resolve(arr)
+            resolve(arr);
         } else {
-            resolve(await archiveTreeInit())
+            resolve(await archiveTreeInit());
         }
     } else {
-        resolve(await lazyNodeTree(parentId))
+        resolve(await lazyNodeTree(parentId));
     }
-}
+};
 
 //懒加载树接口
 const lazyNodeTree = async (id) => {
     const { data } = await mainApi.lazyTree({
         parentId: id,
         projectId: dataInfo.value.id,
-    })
-    const res = getArrValue(data)
+    });
+    const res = getArrValue(data);
     for (let i = 0; i < res.length; i++) {
-        res[i].hasChildren = !res[i].hasChildren
+        res[i].hasChildren = !res[i].hasChildren;
     }
-    return res
-}
+    return res;
+};
 
 //初始化根节点
 const archiveTreeInit = async () => {
     const { data } = await mainApi.treeInit({
         projectId: dataInfo.value.id,
-    })
-    const res = getArrValue(data)
+    });
+    const res = getArrValue(data);
     for (let i = 0; i < res.length; i++) {
-        res[i].hasChildren = !res[i].hasChildren
+        res[i].hasChildren = !res[i].hasChildren;
     }
-    return res
-}
+    return res;
+};
 
 //树节点被点击
-const nodeInfo = ref({})
+const nodeInfo = ref({});
 const treeNodeTap = ({ data }) => {
-    nodeInfo.value = data
-}
+    nodeInfo.value = data;
+};
 
 //右边选项卡
-const tabsKey = ref('second')
+const tabsKey = ref("second");
 const tabsData = ref([
-    { key: 'second', name: '立卷规则' },
-    { key: 'first', name: '工程文件入口配置' },
-])
+    { key: "second", name: "立卷规则" },
+    { key: "first", name: "工程文件入口配置" },
+]);
 const tabsChange = ({ key }) => {
-    tabsKey.value = key
-}
+    tabsKey.value = key;
+    getSecondTreeData();
+};
 
 //立卷规则树
-const secondTree = ref(null)
-const secondTreeData = ref([])
+const secondTreeLoad = ref(false);
+const secondTree = ref(null);
+const secondTreeData = ref([]);
 const secondTreeProps = {
-    label: 'title',
-}
+    label: "title",
+};
 
 //立卷规则树右键菜单
 const secondTreeMenu = (_, resolve) => {
     resolve([
-        { icon: 'eye', label: '查看配置', key: 'rank' },
-        { icon: 'delete-bin', label: '删除', key: 'del' },
-    ])
-}
-const secondTreeMenuClick = ({ key, data, node }) => {
-    console.log(key)
-}
-
+        { icon: "eye", label: "查看配置", key: "rank" },
+        { icon: "delete-bin", label: "删除", key: "del" },
+    ]);
+};
+
+const secondTreeMenuClick = async ({ key, data, node }) => {
+    if (key === "rank") {
+        configInfo.value = null;
+        const {
+            data: res,
+            code,
+            msg,
+        } = await archiveApi.getArchiveAutoRule({
+            nodeId: data.id, //归档树节点的id 或者 挂载wbs节点的ID(具体哪个ID待定)
+            iswbsNode: data.iswbsNode, //是否是wbs节点
+            projectId: dataInfo.value.id, //   系统级为0  项目级为项目id
+            wbsNode2ArchiveTreeNodeId: data.wbsNode2ArchiveTreeNodeId, // 这个树节点里面有(iswbsNode为true需传)
+        });
+        console.log(res, "res");
+
+        if (code == 200 && msg == "操作成功") {
+            if (res.type) {
+                configInfo.value = res;
+            } else if (res.archiveAutoType) {
+                configInfo.value = {
+                    type: 2,
+                    data: res.tree,
+                };
+
+                checkedKeys.value = res?.selectNodeIds.split(",");
+            } else {
+                configInfo.value = {};
+            }
+            console.log(configInfo.value, "configInfo.value ");
+
+            configVisible.value = true;
+        }
+    } else if (key === "del") {
+        HcDelMsg(async (resolve) => {
+            const { code } = await archiveApi.removeArchiveAutoRule({
+                nodeId: data.id,
+                iswbsNode: data.iswbsNode, //是否是wbs节点   flase 不是 true 是 (先false,具体怎么区分后面再看)
+                projectId: dataInfo.value.id, //   系统级为0  项目级为项目id
+            });
+            resolve(); //关闭弹窗的回调
+            if (code !== 200) return;
+            window.$message.success("删除成功");
+            getSecondTreeData();
+        }).then();
+    }
+};
 
 //设置为最高并卷层级
-const setHighestClick = () => {
-
-}
-
-//设置为分类卷并卷
-const setClassifyClick = () => {
-
-}
-
-//设置为独立组卷
-const setIndependence = () => {
-
-}
-
+//获取树节点名字路径
+const getTreeNodePath = (node, refName) => {
+    let nodeInfo = secondTree.value.treeRef.getNode(node.id);
+    let pathArr = [];
+    while (nodeInfo.parent) {
+        pathArr.push(nodeInfo.data.title);
+        nodeInfo = nodeInfo.parent;
+    }
+    return pathArr.reverse().join("/");
+};
+
+const setRecordsHandle = async () => {
+    const { code, msg } = await archiveApi.saveArchiveAutoRule({
+        archiveAutoType: archiveAutoType.value, //最高1  分类2  独立3
+        selectNodeIds: checkList.value.join(","), //鼠标选择的节点ID(只要鼠标选择的节点,选择节点的下级子节点那种不要),逗号拼接
+        iswbsNode: nodesList.value[0]?.iswbsNode, //是否是wbs节点
+        projectId: dataInfo.value.id, //   系统级为0  项目级为项目id
+    });
+
+    if (code == 200 && msg == "操作成功") {
+        window.$message({
+            type: "success",
+            message: "设置成功",
+        });
+
+        highVisible.value = false;
+        getSecondTreeData();
+    }
+};
+const setClick = (type) => {
+    const treeRef = secondTree.value?.getRef(); //树的原始ref
+    const nodes = treeRef.getCheckedNodes(); //获取选中的节点
+    console.log(nodes, "nodes");
+
+    if (nodes.length < 1) {
+        window.$message({
+            message: "请先勾选节点,再进行设置",
+            type: "warning",
+        });
+        return false;
+    }
+    let ids = [];
+    nodes.forEach((element) => {
+        element.pathName = getTreeNodePath(element, "secondTree");
+        ids.push(element.id);
+    });
+    console.log(nodes, "nodes");
+    checkList.value = ids;
+    nodesList.value = nodes;
+    setName(type);
+    highVisible.value = true;
+};
+const titleName = ref("");
+const archiveAutoType = ref(1);
+const highVisible = ref(false);
+const checkList = ref([]);
+const nodesList = ref([]);
+const setName = (type) => {
+    switch (type) {
+        case 1:
+            archiveAutoType.value = 1;
+            titleName.value = "设置最高并卷层级";
+            break;
+        case 2:
+            archiveAutoType.value = 2;
+            titleName.value = "设置分类并卷层级";
+            break;
+        case 3:
+            archiveAutoType.value = 3;
+            titleName.value = "设置单独并卷层级";
+            break;
+    }
+};
+//查看配置
+const configtree = ref(null);
+const configVisible = ref(false);
+const configInfo = ref({});
+const checkedKeys = ref([]);
+const configTreeProps = {
+    label: "nodeName",
+    children: "children",
+    isLeaf: "hasChildren",
+};
+const configCheckChange = (_, { checkedNodes }) => {
+    let array = checkedNodes;
+    for (let index = 1; index < array.length; index++) {
+        const element = array[index];
+        if (element.iswbsNode !== array[0].iswbsNode) {
+            //取消勾选
+            configtree.value.treeRef.setChecked(data.id, false, false);
+            window.$message({
+                message: "非wbs节点不能和wbs节点一起设置规则",
+                type: "warning",
+            });
+            return;
+        }
+    }
+};
+const changeConfig = async () => {
+    let keys = configtree.value.treeRef.getCheckedKeys();
+    let nodes = configtree.value.treeRef.getCheckedNodes();
+    console.log(nodes);
+    const { code, msg } = await archiveApi.updateArchiveAutoRules({
+        archiveAutoType: 2, //最高1  分类2  独立3
+        archiveAutoGroupId: configInfo.value.data.archiveAutoGroupId,
+        selectNodeIds: keys.join(","), //鼠标选择的节点ID(只要鼠标选择的节点,选择节点的下级子节点那种不要),逗号拼接
+        iswbsNode: nodes[0]?.iswbsNode, //是否是wbs节点
+        projectId: dataInfo.value.id, //   系统级为0  项目级为项目id
+    });
+
+    if (code == 200) {
+        window.$message({
+            type: "success",
+            message: msg,
+        });
+        configVisible.value = false;
+    }
+};
 //关闭抽屉
 const drawerClose = () => {
-    isShow.value = false
-    emit('close')
-}
+    isShow.value = false;
+    emit("close");
+};
 </script>
 
 <style scoped lang="scss">

+ 272 - 114
src/views/project/tree/tree-form.vue

@@ -1,30 +1,74 @@
 <template>
-    <hc-dialog v-model="isShow" ui="hc-project-tree-tree-form" :title="type" widths="500px" @close="dialogClose">
+    <hc-dialog
+        v-model="isShow"
+        ui="hc-project-tree-tree-form"
+        :title="type"
+        widths="500px"
+        @close="dialogClose"
+    >
         <el-scrollbar>
-            <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="top" label-width="auto">
+            <el-form
+                ref="formRef"
+                :model="formModel"
+                :rules="formRules"
+                label-position="top"
+                label-width="auto"
+            >
                 <el-form-item label="节点名称:" prop="nodeName">
-                    <el-input v-model="formModel.nodeName" placeholder="请输入节点名称" />
+                    <el-input
+                        v-model="formModel.nodeName"
+                        placeholder="请输入节点名称"
+                    />
                 </el-form-item>
                 <el-form-item label="岗位类型:" prop="postType">
-                    <el-select v-model="formModel.postType" filterable block placeholder="请选择岗位类型">
-                        <el-option v-for="item in JobTypeList" :key="item.id" :label="item.title" :value="item.id" />
+                    <el-select
+                        v-model="formModel.postType"
+                        filterable
+                        block
+                        placeholder="请选择岗位类型"
+                    >
+                        <el-option
+                            v-for="item in JobTypeList"
+                            :key="item.id"
+                            :label="item.title"
+                            :value="item.id"
+                        />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="节点类型:" prop="nodeType">
-                    <el-select v-model="formModel.nodeType" filterable block placeholder="请选择节点类型">
+                    <el-select
+                        v-model="formModel.nodeType"
+                        filterable
+                        block
+                        placeholder="请选择节点类型"
+                    >
                         <el-option label="关联电子原生文件" :value="1" />
                         <el-option label="数字化上传文件" :value="2" />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="工程类型:" prop="projectType">
-                    <el-select v-model="formModel.projectType" filterable block placeholder="请选择工程类型">
+                    <el-select
+                        v-model="formModel.projectType"
+                        filterable
+                        block
+                        placeholder="请选择工程类型"
+                    >
                         <el-option label="水利水电工程" :value="1" />
                         <el-option label="公路工程" :value="2" />
                         <el-option label="全部" :value="3" />
                     </el-select>
                 </el-form-item>
-                <el-form-item v-if="formModel.nodeType === 1" label="储存类型:" prop="storageType">
-                    <el-select v-model="formModel.storageType" filterable block placeholder="请选择储存类型">
+                <el-form-item
+                    v-if="formModel.nodeType === 1"
+                    label="储存类型:"
+                    prop="storageType"
+                >
+                    <el-select
+                        v-model="formModel.storageType"
+                        filterable
+                        block
+                        placeholder="请选择储存类型"
+                    >
                         <el-option label="普通" :value="1" />
                         <el-option label="竣工图" :value="2" />
                         <el-option label="计量" :value="3" />
@@ -38,14 +82,24 @@
                 </el-form-item>
                 <template v-if="formModel.nodeType === 2">
                     <el-form-item label="存储节点:" prop="isStorageNode">
-                        <el-select v-model="formModel.isStorageNode" filterable block placeholder="请选择是否存储节点">
+                        <el-select
+                            v-model="formModel.isStorageNode"
+                            filterable
+                            block
+                            placeholder="请选择是否存储节点"
+                        >
                             <el-option label="是" :value="1" />
                             <el-option label="否" :value="2" />
                         </el-select>
                     </el-form-item>
                     <template v-if="formModel.isStorageNode === 1">
                         <el-form-item label="储存类型:" prop="storageType">
-                            <el-select v-model="formModel.storageType" filterable block placeholder="请选择储存类型">
+                            <el-select
+                                v-model="formModel.storageType"
+                                filterable
+                                block
+                                placeholder="请选择储存类型"
+                            >
                                 <el-option label="普通" :value="1" />
                                 <el-option label="竣工图" :value="2" />
                                 <el-option label="计量" :value="3" />
@@ -58,13 +112,27 @@
                             </el-select>
                         </el-form-item>
                         <el-form-item label="接口节点:" prop="isInterfaceNode">
-                            <el-select v-model="formModel.isInterfaceNode" filterable block placeholder="请选择是否接口节点">
+                            <el-select
+                                v-model="formModel.isInterfaceNode"
+                                filterable
+                                block
+                                placeholder="请选择是否接口节点"
+                            >
                                 <el-option label="是" :value="1" />
                                 <el-option label="否" :value="2" />
                             </el-select>
                         </el-form-item>
-                        <el-form-item v-if="formModel.isInterfaceNode === 1" label="接口类型:" prop="interfaceType">
-                            <el-select v-model="formModel.interfaceType" filterable block placeholder="请选择接口类型">
+                        <el-form-item
+                            v-if="formModel.isInterfaceNode === 1"
+                            label="接口类型:"
+                            prop="interfaceType"
+                        >
+                            <el-select
+                                v-model="formModel.interfaceType"
+                                filterable
+                                block
+                                placeholder="请选择接口类型"
+                            >
                                 <el-option label="试验接口" :value="1" />
                                 <el-option label="计量接口" :value="2" />
                             </el-select>
@@ -73,7 +141,12 @@
                 </template>
                 <template v-if="formModel.nodeType === 1">
                     <el-form-item label="关联类型:" prop="associationType">
-                        <el-select v-model="formModel.associationType" filterable block placeholder="请选择关联类型">
+                        <el-select
+                            v-model="formModel.associationType"
+                            filterable
+                            block
+                            placeholder="请选择关联类型"
+                        >
                             <el-option label="质检资料" :value="1" />
                             <el-option label="试验资料" :value="2" />
                             <el-option label="影像资料" :value="3" />
@@ -83,20 +156,53 @@
                         </el-select>
                     </el-form-item>
                     <template v-if="formModel.associationType === 1">
-                        <el-form-item label="业内资料类型:" prop="majorDataType">
-                            <el-checkbox-group v-model="formModel.majorDataType">
-                                <el-checkbox v-for="item in majorDataTypeList" :key="item.value" :value="item.value" name="type">{{ item.label }}</el-checkbox>
+                        <el-form-item
+                            label="业内资料类型:"
+                            prop="majorDataType"
+                        >
+                            <el-checkbox-group
+                                v-model="formModel.majorDataType"
+                            >
+                                <el-checkbox
+                                    v-for="item in majorDataTypeList"
+                                    :key="item.value"
+                                    :value="item.value"
+                                    name="type"
+                                    >{{ item.label }}</el-checkbox
+                                >
                             </el-checkbox-group>
                         </el-form-item>
-                        <el-form-item label="显示层级:" prop="displayHierarchy">
-                            <el-select v-model="formModel.displayHierarchy" filterable block placeholder="请选择显示层级">
-                                <el-option v-for="item in displayHierarchyList" :key="item.value" :label="item.label" :value="item.value" />
+                        <el-form-item
+                            label="显示层级:"
+                            prop="displayHierarchy"
+                        >
+                            <el-select
+                                v-model="formModel.displayHierarchy"
+                                filterable
+                                block
+                                placeholder="请选择显示层级"
+                            >
+                                <el-option
+                                    v-for="item in displayHierarchyList"
+                                    :key="item.value"
+                                    :label="item.label"
+                                    :value="item.value"
+                                />
                             </el-select>
                         </el-form-item>
                     </template>
-                    <el-form-item v-if="formModel.associationType === 2" label="文件类型:" prop="expDataType">
+                    <el-form-item
+                        v-if="formModel.associationType === 2"
+                        label="文件类型:"
+                        prop="expDataType"
+                    >
                         <el-checkbox-group v-model="formModel.expDataType">
-                            <el-checkbox v-for="item in fileTypeList" :key="item.value" :value="item.value">{{ item.label }}</el-checkbox>
+                            <el-checkbox
+                                v-for="item in fileTypeList"
+                                :key="item.value"
+                                :value="item.value"
+                                >{{ item.label }}</el-checkbox
+                            >
                         </el-checkbox-group>
                     </el-form-item>
                 </template>
@@ -104,17 +210,23 @@
         </el-scrollbar>
         <template #footer>
             <el-button hc-btn @click="dialogClose">取消</el-button>
-            <el-button hc-btn type="primary" :loading="submitLoading" @click="dialogSubmit">提交</el-button>
+            <el-button
+                hc-btn
+                type="primary"
+                :loading="submitLoading"
+                @click="dialogSubmit"
+                >提交</el-button
+            >
         </template>
     </hc-dialog>
 </template>
 
 <script setup>
-import { ref, watch } from 'vue'
-import { formValidate, getArrValue, getObjValue, isNullES } from 'js-fast-way'
-import { getDictionaryData } from '~uti/tools'
-import mainApi from '~api/project/tree'
-import roleApi from '~api/system/role'
+import { ref, watch } from "vue";
+import { formValidate, getArrValue, getObjValue, isNullES } from "js-fast-way";
+import { getDictionaryData } from "~uti/tools";
+import mainApi from "~api/project/tree";
+import roleApi from "~api/system/role";
 
 const props = defineProps({
     info: {
@@ -131,147 +243,193 @@ const props = defineProps({
     },
     type: {
         type: String,
-        default: '新增',
+        default: "新增",
     },
-})
+});
 
 //事件
-const emit = defineEmits(['finish', 'close'])
+const emit = defineEmits(["finish", "close"]);
 
 //双向绑定
-const isShow = defineModel('modelValue', {
+const isShow = defineModel("modelValue", {
     default: false,
-})
+});
 
 //监听可否编辑
-const formInfo = ref(props.info)
-const dataInfo = ref(props.data)
-const nodeInfo = ref(props.node)
-watch(() => [props.info, props.data, props.node], ([info, data, node]) => {
-    formInfo.value = getObjValue(info)
-    dataInfo.value = getObjValue(data)
-    nodeInfo.value = getObjValue(node)
-}, { immediate: true, deep: true })
+const formInfo = ref(props.info);
+const dataInfo = ref(props.data);
+const nodeInfo = ref(props.node);
+watch(
+    () => [props.info, props.data, props.node],
+    ([info, data, node]) => {
+        formInfo.value = getObjValue(info);
+        dataInfo.value = getObjValue(data);
+        nodeInfo.value = getObjValue(node);
+    },
+    { immediate: true, deep: true }
+);
 
 //监听显示
 watch(isShow, (val) => {
-    if (val) getInfoData()
-})
+    if (val) getInfoData();
+});
 
 //获取数据详情
 const getInfoData = () => {
-    const data = getObjValue(dataInfo.value)
-    if (props.type === '新增') {
+    const data = getObjValue(dataInfo.value);
+    if (props.type === "新增") {
         formModel.value = {
             parentId: data.id,
             postType: data.postType,
             projectId: formInfo.value.id,
-        }
+        };
     } else {
-        getTreeDetail(data.id)
+        getTreeDetail(data.id);
     }
-    getRoleData()
-    getMajorData()
-    getDisplayList()
-}
+    getRoleData();
+    getMajorData();
+    getDisplayList();
+};
 
 //节点详情
 const getTreeDetail = async (id) => {
-    const { data } = await mainApi.treeDetail({ id })
-    const res = getObjValue(data)
+    const { data } = await mainApi.treeDetail({ id });
+    const res = getObjValue(data);
     formModel.value = {
         ...res,
         id: id,
         nodeName: res.fullName,
-        expDataType: isNullES(res.expDataType) ? [] : res.expDataType.split(','),
-        majorDataType: isNullES(res.majorDataType) ? [] : res.majorDataType.split(','),
-    }
-}
+        expDataType: isNullES(res.expDataType)
+            ? []
+            : res.expDataType.split(","),
+        majorDataType: isNullES(res.majorDataType)
+            ? []
+            : res.majorDataType.split(","),
+    };
+};
 
 //岗位类型
-const JobTypeList = ref([])
+const JobTypeList = ref([]);
 const getRoleData = async () => {
-    const { data } = await roleApi.roleTree()
-    JobTypeList.value = getArrValue(data)
-}
+    const { data } = await roleApi.roleTree();
+    JobTypeList.value = getArrValue(data);
+};
 
 //内页资料类型
-const majorDataTypeList = ref([])
+const majorDataTypeList = ref([]);
 const getMajorData = async () => {
-    majorDataTypeList.value = await getDictionaryData('major_data_type', true)
-}
+    majorDataTypeList.value = await getDictionaryData("major_data_type", true);
+};
 
 //显示层级
-const displayHierarchyList = ref([])
+const displayHierarchyList = ref([]);
 const getDisplayList = async () => {
-    displayHierarchyList.value = await getDictionaryData('display_hierarchy', true)
-}
+    displayHierarchyList.value = await getDictionaryData(
+        "display_hierarchy",
+        true
+    );
+};
 
 //文件类型
 const fileTypeList = [
-    { label: '配合比', value: 1 }, { label: '原材', value: 2 }, { label: '汇总', value: 3 },
-    { label: '设备', value: 4 }, { label: '外委(第三方)', value: 5 },
-]
+    { label: "配合比", value: 1 },
+    { label: "原材", value: 2 },
+    { label: "汇总", value: 3 },
+    { label: "设备", value: 4 },
+    { label: "外委(第三方)", value: 5 },
+];
 
 //基础表单
-const formRef = ref(null)
-const formModel = ref({})
+const formRef = ref(null);
+const formModel = ref({});
 const formRules = {
-    nodeName: { required: true, trigger: 'blur', message: '请输入节点名称' },
-    postType: { required: true, trigger: 'blur', message: '请选择岗位类型' },
-    nodeType: { required: true, trigger: 'blur', message: '请选择节点类型' },
-    isStorageNode: { required: true, trigger: 'blur', message: '请选择存储节点' },
-    isInterfaceNode: { required: true, trigger: 'blur', message: '请选择接口节点' },
-    interfaceType: { required: true, trigger: 'blur', message: '请选择接口类型' },
-    associationType: { required: true, trigger: 'blur', message: '请选择关联类型' },
-    majorDataType: { required: true, trigger: 'blur', message: '请选择业内资料类型' },
-    displayHierarchy: { required: true, trigger: 'blur', message: '请选择显示层级' },
-    projectType: { required: true, trigger: 'blur', message: '请选择工程类型' },
-    storageType: { required: true, trigger: 'blur', message: '请选择储存类型' },
-    expDataType: { required: true, trigger: 'blur', message: '请选择文件类型' },
-}
-
+    nodeName: { required: true, trigger: "blur", message: "请输入节点名称" },
+    postType: { required: true, trigger: "blur", message: "请选择岗位类型" },
+    nodeType: { required: true, trigger: "blur", message: "请选择节点类型" },
+    isStorageNode: {
+        required: true,
+        trigger: "blur",
+        message: "请选择存储节点",
+    },
+    isInterfaceNode: {
+        required: true,
+        trigger: "blur",
+        message: "请选择接口节点",
+    },
+    interfaceType: {
+        required: true,
+        trigger: "blur",
+        message: "请选择接口类型",
+    },
+    associationType: {
+        required: true,
+        trigger: "blur",
+        message: "请选择关联类型",
+    },
+    majorDataType: {
+        required: true,
+        trigger: "blur",
+        message: "请选择业内资料类型",
+    },
+    displayHierarchy: {
+        required: true,
+        trigger: "blur",
+        message: "请选择显示层级",
+    },
+    projectType: { required: true, trigger: "blur", message: "请选择工程类型" },
+    storageType: { required: true, trigger: "blur", message: "请选择储存类型" },
+    expDataType: { required: true, trigger: "blur", message: "请选择文件类型" },
+};
 
 //提交
-const submitLoading = ref(false)
+const submitLoading = ref(false);
 const dialogSubmit = async () => {
-    const isForm = await formValidate(formRef.value)
-    if (!isForm) return
-    const data = getObjValue(dataInfo.value)
-    const form = formModel.value
+    const isForm = await formValidate(formRef.value);
+    if (!isForm) return;
+    const data = getObjValue(dataInfo.value);
+    const form = formModel.value;
     if (data.postType !== form.postType) {
-        window.$message.warning('岗位类型必须和父级节点岗位类型一致')
-        return
+        window.$message.warning("岗位类型必须和父级节点岗位类型一致");
+        return;
     }
-    submitLoading.value = true
-    form.majorDataType = form.majorDataType.join(',')
-    form.expDataType = form.expDataType.join(',')
+    submitLoading.value = true;
+    if (formModel.value.majorDataType) {
+        form.majorDataType = form.majorDataType.join(",");
+        form.expDataType = form.expDataType.join(",");
+    }
+    if (formModel.value.expDataType) {
+        form.expDataType = form.expDataType.join(",");
+    }
+    // form.majorDataType = form.majorDataType.join(",");
+    // form.expDataType = form.expDataType.join(",");
     //发起请求
-    let res = {}
-    if (props.type === '新增') {
-        res = await mainApi.treeAdd(form)
+    let res = {};
+    if (props.type === "新增") {
+        res = await mainApi.treeAdd(form);
     } else {
-        res = await mainApi.treeUpdate(form)
+        res = await mainApi.treeUpdate(form);
     }
-    const { isRes } = getObjValue(res)
-    submitLoading.value = false
-    if (!isRes) return
-    window.$message.success('操作成功')
-    dialogClose()
-    emit('finish')
-}
+    const { isRes } = getObjValue(res);
+    submitLoading.value = false;
+    if (!isRes) return;
+    window.$message.success("操作成功");
+    dialogClose();
+    emit("finish");
+};
 
 //关闭弹窗
 const dialogClose = () => {
-    isShow.value = false
-    submitLoading.value = false
-    formModel.value = {}
-    emit('close')
-}
+    isShow.value = false;
+    submitLoading.value = false;
+    formModel.value = {};
+    emit("close");
+};
 </script>
 
 <style lang="scss">
-.el-overlay-dialog .el-dialog.hc-new-dialog.hc-project-tree-tree-form .el-dialog__body{
+.el-overlay-dialog
+    .el-dialog.hc-new-dialog.hc-project-tree-tree-form
+    .el-dialog__body {
     height: 680px;
     padding: 12px 0;
 }