|
|
@@ -1,6 +1,7 @@
|
|
|
'use strict';
|
|
|
|
|
|
const projectScreenConst = require('../const/project_screen');
|
|
|
+const projectScreenLib = require('../lib/project_screen');
|
|
|
const Ledger = require('../lib/ledger');
|
|
|
|
|
|
module.exports = app => {
|
|
|
@@ -225,13 +226,15 @@ module.exports = app => {
|
|
|
}
|
|
|
const parent = nodes.find(n => n.id === node.tree_pid);
|
|
|
const progressRows = allProgress.filter(row => row.spid === node.id);
|
|
|
+ const progressPaths = projectScreenLib.getProgressPaths(progressRows);
|
|
|
const latest = progressRows[0];
|
|
|
const keys = ['edit', 'submit', 'reply'];
|
|
|
const latestEvent = latest && keys.map((key, index) => ({ date: latest[key + '_date'], department: latest[key + '_department'], step: ['编制', '报审', '批复'][index] }))
|
|
|
.filter(event => event.date).sort((a, b) => String(b.date).localeCompare(String(a.date)))[0];
|
|
|
- const stages = progressRows.filter(row => row.tree_level > 1 && row.tree_is_leaf === 1).map(row => ({
|
|
|
- id: row.id, name: row.name,
|
|
|
- path: String(row.tree_full_path).split('-').map(id => progressRows.find(p => String(p.tree_id) === id)).filter(Boolean).map(p => p.name).join(' / ') || row.name,
|
|
|
+ const stages = projectScreenLib.sortProgressRows(progressRows, progressPaths).filter(row => row.tree_level > 1 && row.tree_is_leaf === 1).map(row => ({
|
|
|
+ id: row.id, name: row.name, code: row.code || '',
|
|
|
+ path: projectScreenLib.formatProgressPath(progressPaths.get(row.id)),
|
|
|
+ shortPath: projectScreenLib.formatProgressPath(progressPaths.get(row.id), true),
|
|
|
states: keys.map(key => row[key + '_progress'] === '已完成' ? 0 : row[key + '_progress'] === '进行中' ? 1 : 2),
|
|
|
dates: keys.map(key => row[key + '_date'] || ''), departments: keys.map(key => row[key + '_department'] || '')
|
|
|
}));
|
|
|
@@ -261,21 +264,23 @@ module.exports = app => {
|
|
|
}) : [];
|
|
|
const dateText = value => value instanceof Date ? [value.getFullYear(), String(value.getMonth() + 1).padStart(2, '0'), String(value.getDate()).padStart(2, '0')].join('-') : String(value || '').slice(0, 10);
|
|
|
const trees = new Map(projects.map(p => [p.id, rows.filter(row => row.spid === p.id)]));
|
|
|
- const leafColumns = tree => tree.filter(row => Number(row.tree_level) > 1 && Number(row.tree_is_leaf) === 1)
|
|
|
- .sort((a, b) => a.tree_order - b.tree_order).map(row => {
|
|
|
- const path = String(row.tree_full_path).split('-').map(id => tree.find(n => String(n.tree_id) === id)).filter(Boolean);
|
|
|
- if (!path.length || path[path.length - 1].id !== row.id) path.push(row);
|
|
|
- return { key: JSON.stringify([path[0].name, row.name]), root: path[0].name,
|
|
|
- rootOrder: Number(path[0].tree_order) || 0,
|
|
|
- orderPath: path.slice(1).map(n => Number(n.tree_order) || 0),
|
|
|
- name: row.name, date: dateText(row.reply_date) };
|
|
|
- }).sort((a, b) => {
|
|
|
- if (a.root !== b.root) return a.rootOrder - b.rootOrder || a.root.localeCompare(b.root, 'zh-CN');
|
|
|
- for (let i = 0; i < Math.min(a.orderPath.length, b.orderPath.length); i++) {
|
|
|
- if (a.orderPath[i] !== b.orderPath[i]) return a.orderPath[i] - b.orderPath[i];
|
|
|
- }
|
|
|
- return a.orderPath.length - b.orderPath.length;
|
|
|
- });
|
|
|
+ const leafColumns = tree => {
|
|
|
+ const paths = projectScreenLib.getProgressPaths(tree);
|
|
|
+ return tree.filter(row => Number(row.tree_level) > 1 && Number(row.tree_is_leaf) === 1)
|
|
|
+ .sort((a, b) => a.tree_order - b.tree_order).map(row => {
|
|
|
+ const path = paths.get(row.id);
|
|
|
+ return { key: JSON.stringify([path[0].name, row.name]), root: path[0].name,
|
|
|
+ rootOrder: Number(path[0].tree_order) || 0,
|
|
|
+ orderPath: path.slice(1).map(n => Number(n.tree_order) || 0),
|
|
|
+ name: row.name, date: dateText(row.reply_date) };
|
|
|
+ }).sort((a, b) => {
|
|
|
+ if (a.root !== b.root) return a.rootOrder - b.rootOrder || a.root.localeCompare(b.root, 'zh-CN');
|
|
|
+ for (let i = 0; i < Math.min(a.orderPath.length, b.orderPath.length); i++) {
|
|
|
+ if (a.orderPath[i] !== b.orderPath[i]) return a.orderPath[i] - b.orderPath[i];
|
|
|
+ }
|
|
|
+ return a.orderPath.length - b.orderPath.length;
|
|
|
+ });
|
|
|
+ };
|
|
|
const columnsByProject = new Map(projects.map(p => [p.id, leafColumns(trees.get(p.id))]));
|
|
|
const approvedKeys = new Set([].concat(...Array.from(columnsByProject.values())).filter(column => column.date).map(column => column.key));
|
|
|
// Merge same leaf names under the same root, regardless of intermediate paths.
|