ellisran 1 неделя назад
Родитель
Сommit
470f276270

+ 1 - 1
app/controller/project_screen_controller.js

@@ -28,7 +28,7 @@ module.exports = app => {
                 const finishedProjects = summaries.filter(project => project.status === '已建');
                 const plannedProjects = summaries.filter(project => project.status === '拟建');
                 const buildingProjects = summaries.filter(project => project.status === '在建');
-                const listOnly = projects => projects.map(project => ({ id: project.id, name: project.name, group: project.group }));
+                const listOnly = projects => projects.map(project => ({ id: project.id, name: project.name, folders: project.folders }));
                 const renderData = {
                     screens: screenList,
                     screen,

+ 11 - 4
app/public/css/main.css

@@ -2856,10 +2856,17 @@ animation:shake 1s .2s ease both;}
 .gy-detail-text{font-size:14px;line-height:2;background:#303b47;padding:16px;overflow:auto;overflow-wrap:anywhere}
 .gy-detail-text strong{display:block;color:#84c4ff;margin-bottom:12px}
 .gy-list-heading{background:#3a536a;padding:12px;text-align:center;font-size:13px}
-.gy-folder-row{display:flex;align-items:center;gap:6px;padding:12px;color:#c4d4e5;background:#394550;border-bottom:1px solid #48515a}
-.gy-folder-toggle{display:inline-flex;align-items:center;justify-content:center;background:none;border:0;color:inherit;padding:0;width:18px;height:20px;flex-shrink:0}
-.gy-project-row{display:flex;align-items:flex-start;gap:10px;width:100%;border:0;border-bottom:1px solid #48515a;border-left:3px solid transparent;text-align:left;background:transparent;color:#a1cfff;padding:15px 12px 15px 24px;line-height:1.7;font-size:14px!important}
-.gy-project-row:hover{background:#3a4856}.gy-project-row.active{background:#334e68;border-left-color:#3698ff;color:#fff}.gy-tree-branch{color:#7893aa}
+.gy-screen .gy-folder-row{display:flex;align-items:center;gap:6px;min-height:40px;padding:5px 12px 5px calc(12px + var(--gy-depth) * 16px);border-left:2px solid transparent;color:#9eafc0;line-height:1.4}
+.gy-screen .gy-folder-row:hover{background:#37424c}
+.gy-screen .gy-folder-toggle{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:18px;height:28px;padding:0;border:0;background:none;color:#9eafc0;font-size:13px}
+.gy-screen .gy-folder-icon{width:14px;text-align:center;color:#8297aa}
+.gy-screen .gy-project-row{display:flex;align-items:center;gap:6px;width:100%;min-height:40px;padding:6px 12px 6px calc(36px + var(--gy-depth) * 16px);border:0;border-left:2px solid transparent;text-align:left;background:transparent;color:#c5d6e7;line-height:1.4;font-size:14px!important}
+.gy-screen .gy-folder-row,.gy-screen .gy-project-row{border-bottom:1px solid #48515a}
+.gy-screen .gy-project-row:hover{background:#374552}
+.gy-screen .gy-project-row.active{background:#354d63;border-left-color:#3698ff;color:#fff}
+.gy-screen .gy-project-marker{flex:0 0 14px;width:14px;text-align:center;color:#7893aa}
+.gy-screen .gy-project-row span:last-child,.gy-screen .gy-folder-row span{min-width:0;overflow-wrap:anywhere}
+.gy-screen .gy-folder-toggle:focus-visible,.gy-screen .gy-project-row:focus-visible{outline:2px solid #80bfff;outline-offset:-2px}
 .gy-detail-button{background:transparent;border:1px solid #56718b;border-radius:4px;color:#8ac8ff;padding:5px 10px;font-size:12px!important}
 .gy-stage-table{table-layout:fixed}.gy-stage-table td,.gy-stage-table th{text-align:center!important}.gy-stage-table button{border:0;background:none;color:inherit;padding:4px 12px;text-decoration:underline;text-underline-offset:4px}.gy-status-0{color:#67d6a2}.gy-status-1{color:#ffc16b}.gy-status-2{color:#73baff}
 .gy-stage-dialog .modal-dialog{width:90vw;max-width:900px}.gy-stage-dialog .modal-content{background:#343a40;color:#edf3fa;border:1px solid #627589;border-radius:6px}.gy-stage-dialog .modal-header{border-bottom-color:#48515a}.gy-stage-dialog .modal-body{max-height:70vh;overflow:auto}.gy-stage-dialog .close{color:#edf3fa;text-shadow:none}.gy-stage-dialog p{color:#aab6c3}.gy-stage-dialog table{min-width:600px}.gy-empty{padding:24px;text-align:center;color:#aab6c3}

Разница между файлами не показана из-за своего большого размера
+ 39 - 0
app/public/js/project_screen_guangyuan.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 15
app/public/js/project_screen_guangyuan_building.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 15
app/public/js/project_screen_guangyuan_finished.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 16
app/public/js/project_screen_guangyuan_planned.js


+ 6 - 1
app/service/project_screen.js

@@ -1,6 +1,7 @@
 'use strict';
 
 const projectScreenConst = require('../const/project_screen');
+const Ledger = require('../lib/ledger');
 
 module.exports = app => {
     class ProjectScreen extends app.BaseService {
@@ -151,7 +152,10 @@ module.exports = app => {
                 return calc.div(value, 10000, 12);
             };
             const result = [];
-            const selectedNodes = nodes.filter(n => !n.is_folder && (!options.id || n.id === options.id) && infos.some(info => info.id === n.id)).sort((a, b) => a.tree_order - b.tree_order);
+            // Follow the project list's tree order before filtering by status.
+            const projectTree = new Ledger.baseTree(ctx, { id: 'id', pid: 'tree_pid', level: 'tree_level', order: 'tree_order', rootId: '-1' });
+            projectTree.loadDatas(nodes);
+            const selectedNodes = projectTree.nodes.filter(n => !n.is_folder && (!options.id || n.id === options.id) && infos.some(info => info.id === n.id));
             const allTenders = [];
             if (selectedNodes.length && (user.is_admin === 1 || (permission && permission.tender && permission.tender.indexOf('2') !== -1))) {
                 allTenders.push(...await ctx.service.tender.getAllDataByCondition({ where: { spid: selectedNodes.map(n => n.id) } }));
@@ -227,6 +231,7 @@ module.exports = app => {
                     dates: keys.map(key => row[key + '_date'] || ''), departments: keys.map(key => row[key + '_department'] || '')
                 }));
                 result.push({ id: node.id, name: node.name, status: info.proj_status, group: parent ? parent.name : '未分组',
+                    folders: projectTree.getAllParents(node).filter(folder => folder.is_folder).map(folder => ({ id: folder.id, name: folder.name })),
                     intro: info.proj_intro || '', date: info.jg_date || '', department: info.jg_department || '',
                     measured: hasMeasured ? toWan(measured, '元') : null,
                     tenders: tenderInvestments,