|  | @@ -3546,6 +3546,10 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  const tenderChildren = _.filter(tenders, { parentID: node.pid });
 | 
	
		
			
				|  |  |                  const checkChildren = _.orderBy([...children, ...tenderChildren], ['seq', 'asc']);
 | 
	
		
			
				|  |  |                  for (const c of checkChildren) {
 | 
	
		
			
				|  |  | +                    // if (c.type === 1 && _.filter(files, { parentID: c.ID }).length === 0 && _.filter(tenders, { parentID: c.ID }).length === 0) {
 | 
	
		
			
				|  |  | +                    //     // 判断文件夹下有无东西,没有就不插入
 | 
	
		
			
				|  |  | +                    //     continue;
 | 
	
		
			
				|  |  | +                    // }
 | 
	
		
			
				|  |  |                      const child = {
 | 
	
		
			
				|  |  |                          pid: c.ID,
 | 
	
		
			
				|  |  |                          parentID: c.parentID,
 | 
	
	
		
			
				|  | @@ -3560,11 +3564,10 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              function convert (projects) {
 | 
	
		
			
				|  |  |                  tenderTree.clearDatas();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                // 区分文件夹及项目
 | 
	
		
			
				|  |  | -                const topLevel = _.orderBy(_.filter(projects, { parentID: '-1' }), ['seq', 'asc']);
 | 
	
		
			
				|  |  | -                const files = _.filter(projects, { type: 1 });
 | 
	
		
			
				|  |  | -                const tenders = _.filter(projects, { type: 2 });
 | 
	
		
			
				|  |  | +                const result = filterFolders(projects);
 | 
	
		
			
				|  |  | +                const topLevel = _.orderBy(_.filter(result, { parentID: '-1' }), ['seq', 'asc']);
 | 
	
		
			
				|  |  | +                const files = _.filter(result, { type: 1 });
 | 
	
		
			
				|  |  | +                const tenders = _.filter(result, { type: 2 });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  for (const t of topLevel) {
 | 
	
		
			
				|  |  |                      const node = {
 | 
	
	
		
			
				|  | @@ -3583,6 +3586,52 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |              return { tenderTree, convert }
 | 
	
		
			
				|  |  |          })();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        function filterFolders(data) {
 | 
	
		
			
				|  |  | +            // 构建ID到节点的映射
 | 
	
		
			
				|  |  | +            const idMap = data.reduce((map, node) => {
 | 
	
		
			
				|  |  | +                map[node.ID] = node;
 | 
	
		
			
				|  |  | +                return map;
 | 
	
		
			
				|  |  | +            }, {});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 建立父子关系映射
 | 
	
		
			
				|  |  | +            const parentMap = data.reduce((map, node) => {
 | 
	
		
			
				|  |  | +                if (node.parentID !== '-1') {
 | 
	
		
			
				|  |  | +                    if (!map[node.parentID]) {
 | 
	
		
			
				|  |  | +                        map[node.parentID] = [];
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    map[node.parentID].push(node.ID);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                return map;
 | 
	
		
			
				|  |  | +            }, {});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 检查节点及其子节点是否包含清单(type=1)
 | 
	
		
			
				|  |  | +            const hasChecklist = (id) => {
 | 
	
		
			
				|  |  | +                const node = idMap[id];
 | 
	
		
			
				|  |  | +                if (node.type === 2) {
 | 
	
		
			
				|  |  | +                    return true;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (!parentMap[id]) {
 | 
	
		
			
				|  |  | +                    return false;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                return parentMap[id].some(childID => hasChecklist(childID));
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 过滤节点
 | 
	
		
			
				|  |  | +            const filteredIDs = new Set();
 | 
	
		
			
				|  |  | +            data.forEach(node => {
 | 
	
		
			
				|  |  | +                if (node.type === 2 || hasChecklist(node.ID)) {
 | 
	
		
			
				|  |  | +                    let currentID = node.ID;
 | 
	
		
			
				|  |  | +                    while (currentID !== '-1') {
 | 
	
		
			
				|  |  | +                        filteredIDs.add(currentID);
 | 
	
		
			
				|  |  | +                        currentID = idMap[currentID].parentID;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 返回过滤后的数据
 | 
	
		
			
				|  |  | +            return data.filter(node => filteredIDs.has(node.ID));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          $('#set-dsk-project').click(function () {
 | 
	
		
			
				|  |  |              postData('/profile/dsk/api', { type: 'save_projects', tid: window.location.pathname.split('/')[2], project_list: gsObj.grArray }, function (result) {
 | 
	
		
			
				|  |  |                  // dskAccountData.select_project = result;
 |