Bläddra i källkod

wap页面增加项目列表和调整标段列表

ellisran 2 månader sedan
förälder
incheckning
0bbe90d501

+ 24 - 13
app/controller/wap_controller.js

@@ -169,8 +169,6 @@ module.exports = app => {
                     if (pageShow.openChangeProject) {
                         auditChangeProjects.push(cp);
                     }
-                } else {
-                    auditChangeProjects.push(cp);
                 }
             }
             // 获取待审批的变更申请
@@ -191,8 +189,6 @@ module.exports = app => {
                     if (pageShow.openChangeApply) {
                         auditChangeApplys.push(ca);
                     }
-                } else {
-                    auditChangeApplys.push(ca);
                 }
             }
             // 获取待审批的变更方案
@@ -240,6 +236,21 @@ module.exports = app => {
             await ctx.render('wap/dashboard.ejs', renderData);
         }
 
+        async subproj(ctx) {
+            try {
+                const renderData = {
+                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.subProject.wap),
+                };
+                renderData.projectList = await ctx.service.subProject.getSubProject(ctx.session.sessionProject.id, ctx.session.sessionUser.accountId, ctx.session.sessionUser.is_admin);
+                renderData.tenderList = await ctx.service.tender.getManageTenderList(ctx.session.sessionProject.id);
+                await ctx.render('wap/sub_proj.ejs', renderData);
+            } catch (err) {
+                ctx.log(err);
+                ctx.session.postError = err.toString();
+                ctx.redirect('/wap/dashboard');
+            }
+        }
+
         /**
          * 标段列表页
          *
@@ -383,7 +394,7 @@ module.exports = app => {
                 await ctx.render('wap/tender.ejs', renderData);
             } catch (err) {
                 this.log(err);
-                ctx.redirect('/wap/list');
+                ctx.redirect('/wap/sp/' + ctx.subProject.id + '/list');
             }
         }
 
@@ -425,7 +436,7 @@ module.exports = app => {
                 await ctx.render('wap/shenpi_stage.ejs', renderData);
             } catch (err) {
                 this.log(err);
-                ctx.redirect('/wap/list');
+                ctx.redirect('/wap/sp/' + ctx.subProject.id + '/list');
             }
         }
 
@@ -525,7 +536,7 @@ module.exports = app => {
                 await ctx.render('wap/shenpi_change_index.ejs', renderData);
             } catch (err) {
                 this.log(err);
-                ctx.redirect('/wap/list');
+                ctx.redirect('/wap/sp/' + ctx.subProject.id + '/list');
             }
         }
 
@@ -557,7 +568,7 @@ module.exports = app => {
                 await ctx.render('wap/shenpi_change.ejs', renderData);
             } catch (err) {
                 this.log(err);
-                ctx.redirect('/wap/list');
+                ctx.redirect('/wap/sp/' + ctx.subProject.id + '/list');
             }
         }
 
@@ -584,7 +595,7 @@ module.exports = app => {
                 await ctx.render('wap/shenpi_change_project.ejs', renderData);
             } catch (err) {
                 this.log(err);
-                ctx.redirect('/wap/list');
+                ctx.redirect('/wap/sp/' + ctx.subProject.id + '/list');
             }
         }
 
@@ -611,7 +622,7 @@ module.exports = app => {
                 await ctx.render('wap/shenpi_change_apply.ejs', renderData);
             } catch (err) {
                 this.log(err);
-                ctx.redirect('/wap/list');
+                ctx.redirect('/wap/sp/' + ctx.subProject.id + '/list');
             }
         }
 
@@ -638,7 +649,7 @@ module.exports = app => {
                 await ctx.render('wap/shenpi_change_plan.ejs', renderData);
             } catch (err) {
                 this.log(err);
-                ctx.redirect('/wap/list');
+                ctx.redirect('/wap/sp/' + ctx.subProject.id + '/list');
             }
         }
 
@@ -666,7 +677,7 @@ module.exports = app => {
                 await ctx.render('wap/shenpi_revise.ejs', renderData);
             } catch (err) {
                 this.log(err);
-                ctx.redirect('/wap/list');
+                ctx.redirect('/wap/sp/' + ctx.subProject.id + '/list');
             }
         }
 
@@ -699,7 +710,7 @@ module.exports = app => {
                 await ctx.render('wap/shenpi_advance.ejs', renderData);
             } catch (err) {
                 this.log(err);
-                ctx.redirect('/wap/list');
+                ctx.redirect('/wap/sp/' + ctx.subProject.id + '/list');
             }
         }
 

+ 1 - 1
app/middleware/construction_check.js

@@ -63,7 +63,7 @@ module.exports = options => {
                 }
             } else {
                 if (this.helper.isWap(this.request)) {
-                    this.redirect('/wap/list');
+                    this.redirect('/wap/subproj');
                 } else {
                     this.postError(err, '未知错误');
                     err === '该功能已关闭或无法查看' ? this.redirect('/dashboard') : (err === '您无权查看该内容' ? this.redirect(this.request.headers.referer) : this.redirect(`/sp/${this.subProject.id}/construction`));

+ 1 - 1
app/middleware/contract_check.js

@@ -79,7 +79,7 @@ module.exports = options => {
                 }
             } else {
                 if (this.helper.isWap(this.request)) {
-                    this.redirect('/wap/list');
+                    this.redirect('/wap/subproj');
                 } else {
                     this.postError(err, '未知错误');
                     err === '该功能已关闭或无法查看' ? this.redirect('/dashboard') : this.request.headers.referer ? this.redirect(this.request.headers.referer) : this.redirect(`/sp/${this.subProject.id}/dashboard`);

+ 1 - 1
app/middleware/financial_check.js

@@ -65,7 +65,7 @@ module.exports = options => {
                 }
             } else {
                 if (this.helper.isWap(this.request)) {
-                    this.redirect('/wap/list');
+                    this.redirect('/wap/subproj');
                 } else {
                     this.postError(err, '未知错误');
                     err === '该功能已关闭或无法查看' ? this.redirect('/dashboard') : this.request.headers.referer ? this.redirect(this.request.headers.referer) : this.redirect(`/sp/${this.subProject.id}/financial`);

+ 1 - 1
app/middleware/financial_pay_check.js

@@ -81,7 +81,7 @@ module.exports = options => {
                 }
             } else {
                 if (this.helper.isWap(this.request)) {
-                    this.redirect('/wap/list');
+                    this.redirect('/wap/subproj');
                 } else {
                     this.postError(err, '未知错误');
                     err === '该功能已关闭或无法查看' ? this.redirect('/dashboard') : this.request.headers.referer ? this.redirect(this.request.headers.referer) : this.redirect(`/sp/${this.subProject.id}/financial`);

+ 1 - 1
app/middleware/payment_detail_check.js

@@ -136,7 +136,7 @@ module.exports = options => {
                 }
             } else {
                 if (this.helper.isWap(this.request)) {
-                    this.redirect('/wap/list');
+                    this.redirect('/wap/subproj');
                 } else {
                     err === '您无权查看该内容' ? this.redirect(this.request.headers.referer) : this.redirect('/sp/' + this.subProject.id + '/payment');
                 }

+ 1 - 1
app/middleware/payment_tender_check.js

@@ -75,7 +75,7 @@ module.exports = options => {
                 }
             } else {
                 if (this.helper.isWap(this.request)) {
-                    this.redirect('/wap/list');
+                    this.redirect('/wap/subproj');
                 } else {
                     this.postError(err, '未知错误');
                     err === '该功能已关闭或无法查看' ? this.redirect('/dashboard') : (err === '您无权查看该内容' ? this.redirect(this.request.headers.referer) : this.redirect('/sp/' + this.subProject.id + '/payment'));

+ 2 - 2
app/middleware/revise_check.js

@@ -62,11 +62,11 @@ module.exports = options => {
                 }
             } else {
                 if (this.helper.isWap(this.request)) {
-                    this.redirect('/wap/list');
+                    this.redirect('/wap/subproj');
                 } else {
                     err === '您无权查看该内容' ? this.redirect(this.request.headers.referer) : this.redirect(`/sp/${ctx.subProject.id}/list`);
                 }
             }
         }
     };
-};
+};

+ 1 - 1
app/middleware/schedule_check.js

@@ -34,7 +34,7 @@ module.exports = options => {
                 }));
             }
             if (this.helper.isWap(this.request)) {
-                this.redirect('/wap/list');
+                this.redirect('/wap/subproj');
             } else {
                 err === '您无权查看该内容' ? this.redirect(this.request.headers.referer) : this.redirect(`/sp/${ctx.subProject.id}/list`);
             }

+ 1 - 1
app/middleware/tender_build_check.js

@@ -32,7 +32,7 @@ module.exports = options => {
                 }
             } else {
                 if (this.helper.isWap(this.request)) {
-                    this.redirect('/wap/list');
+                    this.redirect('/wap/subproj');
                 } else {
                     this.postError(err, '操作失败');
                     this.redirect(this.request.headers.referer);

+ 1 - 1
app/middleware/tender_check.js

@@ -153,7 +153,7 @@ module.exports = options => {
                 }
             } else {
                 if (this.helper.isWap(this.request)) {
-                    this.redirect('/wap/list');
+                    this.redirect('/wap/subproj');
                 } else {
                     err === '您无权查看该内容'
                         ? this.redirect(this.request.headers.referer)

+ 1 - 1
app/middleware/uncheck_tender_check.js

@@ -55,7 +55,7 @@ module.exports = options => {
                 }
             } else {
                 if (this.helper.isWap(this.request)) {
-                    this.redirect('/wap/list');
+                    this.redirect('/wap/subproj');
                 } else {
                     err === '您无权查看该内容' ? this.redirect(this.request.headers.referer) : this.redirect(`/sp/${ctx.subProject.id}/list`);
                 }

+ 42 - 24
app/public/js/wap/list.js

@@ -11,6 +11,7 @@
 const EmptyTenderHtml = [
     '',
 ];
+let selfLevelSort;
 const tenderTree = [];
 let parentId = 0;
 
@@ -35,9 +36,23 @@ function getPId(level) {
     }
 }
 // 分类数据排序
+function loadSelfCategoryLevel(selfLevel){
+    selfLevelSort = selfLevel ? selfLevel.split(',') : [];
+    selfLevelSort = selfLevelSort.filter(x => {
+        return category.find(c => { return c.id + '' === x; });
+    });
+    category.forEach(cate => {
+        cate.is_self = selfLevelSort.length > 0;
+        cate.self_level = selfLevelSort.indexOf(cate.id + '') + 1;
+    });
+}
+// 分类数据排序
 function sortCategory() {
+    category.forEach(cate => {
+        cate.show_level = cate.is_self ? cate.self_level : cate.level;
+    });
     category.sort(function (a, b) {
-        return a.level ? (b.level ? a.level - b.level : -1) : a.id - b.id;
+        return a.show_level ? (b.show_level ? a.show_level - b.show_level : -1) : a.id - b.id;
     });
 }
 function calculateParent(node) {
@@ -62,7 +77,7 @@ function calculateParent(node) {
 // 初始化TenderTree数据
 function initTenderTree () {
     const levelCategory = category.filter(function (c) {
-        return c.level && c.level > 0;
+        return c.show_level && c.show_level > 0;
     });
     function findCategoryNode(cid, value, array) {
         for (const a of array) {
@@ -82,7 +97,7 @@ function initTenderTree () {
                 vid: value,
                 name: cateValue.value,
                 children: [],
-                level: i ? i : category.level,
+                level: i ? i : category.show_level,
                 sort_id: ++parentId,
                 sort: cateValue.sort,
             };
@@ -100,7 +115,9 @@ function initTenderTree () {
                 if (index === 0 && tender.category) {
                     for (const [i,c] of tender.category.entries()) {
                         const cate = findNode('id', c.cid, category);
-                        tenderCategory = getCategoryNode(cate, c.value, tenderCategory, i+1);
+                        if (cate) {
+                            tenderCategory = getCategoryNode(cate, c.value, tenderCategory, i+1);
+                        }
                     }
                 }
                 return tenderCategory;
@@ -163,7 +180,8 @@ function recursiveGetTenderNodeHtml (node, arr, pid) {
     if (node.cid) {
         html.push('<td class="in-' + node.level + '">');
         html.push('<span onselectstart="return false" style="{-moz-user-select:none}" class="fold-switch mr-1" title="收起" cid="'+ node.sort_id +'"><i class="fa fa-minus-square-o"></i></span> <i class="fa fa-folder-o"></i> ', node.name);
-        html.push('</td><td></td><td></td>');
+        // html.push('</td><td></td><td></td>');
+        html.push('</td>');
     } else {
         html.push('<td colspan="3" class="in-' + node.level + '">');
         html.push('<div class="row">');
@@ -174,22 +192,22 @@ function recursiveGetTenderNodeHtml (node, arr, pid) {
         html.push('<a href="javascript: void(0)" id="' + node.id + '">', node.name, '</a></span>');
         html.push('<span class="col-auto ml-auto"></span>');
         html.push('</div>');
-        html.push('<div class="d-flex justify-content-between"><span>');
-        // 计量期数
-        if (!node.cid) {
-            html.push(node.lastStage ? '第' + node.lastStage.order + '期' : '台账');
-        }
-        html.push('</span><span>');
-        // 累计合同计量
-        const sum = node.lastStage ? ZhCalc.add(node.total_price, node.lastStage.end_qc_tp) : node.total_price;
-        html.push(node.sum_tp ? node.sum_tp : '');
-        html.push('</span></div>');
-        // 截止本期累计完成/本期完成/未完成
-        if (node.lastStage) {
-            html.push(getProgressHtml(node.sum_tp, node.pre_gather_tp, node.gather_tp));
-        } else {
-            html.push('');
-        }
+        // html.push('<div class="d-flex justify-content-between"><span>');
+        // // 计量期数
+        // if (!node.cid) {
+        //     html.push(node.lastStage ? '第' + node.lastStage.order + '期' : '台账');
+        // }
+        // html.push('</span><span>');
+        // // 累计合同计量
+        // const sum = node.lastStage ? ZhCalc.add(node.total_price, node.lastStage.end_qc_tp) : node.total_price;
+        // html.push(node.sum_tp ? node.sum_tp : '');
+        // html.push('</span></div>');
+        // // 截止本期累计完成/本期完成/未完成
+        // if (node.lastStage) {
+        //     html.push(getProgressHtml(node.sum_tp, node.pre_gather_tp, node.gather_tp));
+        // } else {
+        //     html.push('');
+        // }
         html.push('</td>');
     }
     html.push('</tr>');
@@ -205,9 +223,9 @@ function getTenderTreeHtml () {
     const html = [];
     html.push('<table class="table">');
     html.push('<thead>', '<tr>');
-    html.push('<th>名称</th>');
-    html.push('<th width="120">计量期数</th>');
-    html.push('<th>总价</th>');
+    html.push('<th class="text-center">', subProject.name, '</th>');
+    // html.push('<th width="120">计量期数</th>');
+    // html.push('<th>总价</th>');
     html.push('</tr>', '</thead>');
     if (tenderTree.length > 0) {
         parentId = 0;

+ 121 - 0
app/public/js/wap/sub_project.js

@@ -0,0 +1,121 @@
+
+const NameChange = function (obj) {
+    if (obj.value.length > 100) {
+        obj.classList.add('is-invalid');
+    } else {
+        obj.classList.remove('is-invalid');
+    }
+};
+
+$(document).ready(function() {
+    const projectTreeObj = (function(setting){
+        const ProjectTree = createDragTree(setting.treeSetting);
+        ProjectTree.loadDatas(setting.source);
+        const TableObj = $(setting.table);
+
+        const Utils = {
+            getRowTdHtml: function (node, tree) {
+                const html = [];
+                // 名称
+                html.push('<td width="100%" class="in-' + node.tree_level + '">');
+                if (node.is_folder) {
+                    if (node.children.length > 0) {
+                        html.push('<span onselectstart="return false" style="{-moz-user-select:none}" class="fold-switch mr-1" title="收起" id="'+ node.id +'"><i class="fa fa-minus-square-o"></i></span> <i class="fa fa-folder-o"></i> ', node.name);
+                    } else {
+                        html.push('<i class="fa fa-folder-o"></i> ', node.name);
+                    }
+                } else {
+                    html.push(`<span class="text-muted mr-2">${tree.isLastSibling(node) ? '└' : '├'}</span>`);
+                    html.push(`<a href="/wap/sp/${node.id}/list" name="name" id="${node.id}">`, node.name, '</a>');
+                }
+                html.push('</td>');
+                return html.join('');
+            },
+            getNodeTrHtml: function (node, tree) {
+                const html = [];
+                html.push(`<tr tree_id="${node.id}" draggable="true">`);
+                html.push(Utils.getRowTdHtml(node, tree));
+                html.push(`</tr>`);
+                return html.join('');
+            },
+            reloadTable: function () {
+                const html = [];
+                for (const node of ProjectTree.nodes) {
+                    html.push(Utils.getNodeTrHtml(node, ProjectTree));
+                }
+                TableObj.html(html.join(''));
+            },
+            getSelectNode: function() {
+                const selectId = $('tr.table-active').attr('tree_id');
+                return selectId ? ProjectTree.getItems(selectId) : null;
+            },
+            getSelectNodeId: function() {
+                const selectId = $('tr.table-active').attr('tree_id');
+                return selectId || setting.treeSetting.rootId;
+            },
+            refreshTreeTable: function(result) {
+                ProjectTree.loadDatas(result);
+                if (ProjectTree.nodes.length > 0 && $('#no-project').length > 0) window.location.reload();
+                Utils.reloadTable();
+            },
+            refreshRow: function(result) {
+                const refreshData = ProjectTree.loadPostData(result);
+                if (!refreshData.update) return;
+                for (const u of refreshData.update) {
+                    $(`tr[tree_id=${u.id}]`).html(Utils.getRowTdHtml(u, ProjectTree));
+                }
+            },
+            expandByLevel: function(level){
+                ProjectTree.expandByLevel(level);
+                for (const node of ProjectTree.nodes) {
+                    const tr = $(`tr[tree_id=${node.id}]`);
+                    if (node.expanded) {
+                        $('.fold-switch', tr).html(`<i class="fa fa-minus-square-o"></i>`);
+                    } else {
+                        $('.fold-switch', tr).html(`<i class="fa fa-plus-square-o"></i>`);
+                    }
+                    if (node.visible) {
+                        tr.show();
+                    } else {
+                        tr.hide();
+                    }
+                }
+            }
+        };
+
+        Utils.reloadTable();
+        $('body').on('click', '.fold-switch', function() {
+            const id = this.getAttribute('id');
+            const node = ProjectTree.getItems(id);
+            ProjectTree.setExpanded(node, !node.expanded);
+            const posterity = ProjectTree.getPosterity(node);
+            if (node.expanded) {
+                $(this).html(`<i class="fa fa-minus-square-o"></i>`);
+            } else {
+                $(this).html(`<i class="fa fa-plus-square-o"></i>`);
+            }
+            for (const p of posterity) {
+                if (p.visible) {
+                    $(`tr[tree_id=${p.id}]`).show();
+                } else {
+                    $(`tr[tree_id=${p.id}]`).hide();
+                }
+            }
+        });
+
+        const getChildrenLevel = function (node) {
+            let iLevel = node.tree_level || 1;
+            if (node.children && node.children.length > 0) {
+                for (const c of node.children) {
+                    iLevel = Math.max(iLevel, getChildrenLevel(c));
+                }
+            }
+            return iLevel;
+        };
+        return { ProjectTree, TableObj, ...Utils };
+    })({
+        treeSetting: { id: 'id', pid: 'tree_pid', level: 'tree_level', order: 'tree_order', rootId: '-1' },
+        source: projectList,
+        table: '#projectList',
+    });
+});

+ 2 - 1
app/router.js

@@ -984,7 +984,8 @@ module.exports = app => {
     app.get('/wap/logout', 'wapController.logout');
     app.get('/wap/dashboard', sessionAuth, 'wapController.dashboard');
     app.get('/wap/dashboard/msg/:id', sessionAuth, 'wapController.msg');
-    app.get('/wap/list', sessionAuth, 'wapController.list');
+    app.get('/wap/subproj', sessionAuth, 'wapController.subproj');
+    app.get('/wap/sp/:id/list', sessionAuth, subProjectCheck, 'wapController.list');
     app.get('/wap/tender/:id', sessionAuth, tenderCheck, subProjectCheck, uncheckTenderCheck, 'wapController.tender');
     app.get('/wap/tender/:id/stage/:order', sessionAuth, tenderCheck, subProjectCheck, uncheckTenderCheck, stageCheck, 'wapController.stage');
     app.get('/wap/tender/:id/change/:cid/info', sessionAuth, tenderCheck, subProjectCheck, uncheckTenderCheck, changeCheck, changeAuditCheck, 'wapController.change');

+ 1 - 1
app/service/revise_audit.js

@@ -821,7 +821,7 @@ module.exports = app => {
             const sql =
                 'SELECT ra.`audit_id`, ra.`times`, ra.`audit_order`, ra.`begin_time`, ra.`end_time`,' +
                 '    r.id, r.corder, r.uid, r.status, r.content, r.in_time, ' +
-                '    t.id As t_id, t.`name` As t_name, t.`project_id` As t_pid, t.`type` As t_type, t.`user_id` As t_uid, t.`status` As t_status, ' +
+                '    t.id As t_id, t.`name` As t_name, t.`project_id` As t_pid, t.`type` As t_type, t.`user_id` As t_uid, t.`status` As t_status, t.`spid`, ' +
                 '    ti.`deal_info`, ' +
                 '    p.name As audit_name, p.role As audit_role, p.company As audit_company' +
                 '  FROM ' + this.tableName + ' AS ra' +

+ 1 - 1
app/view/wap/dashboard.ejs

@@ -215,7 +215,7 @@
                 <a class="nav-link active show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
               </li>
               <li class="nav-item">
-                <a class="nav-link text-muted show-loading" href="/wap/list"><i class="fa fa-list-ul"></i> 项目</a>
+                <a class="nav-link text-muted show-loading" href="/wap/subproj"><i class="fa fa-list-ul"></i> 项目</a>
               </li>
             </ul>
         </nav>

+ 9 - 7
app/view/wap/list.ejs

@@ -23,7 +23,7 @@
     <!--顶部-->
     <nav class="fixed-top bg-dark">
         <div class="my-2 d-flex justify-content-between">
-            <span class="text-white ml-3">项目</span>
+            <span class="text-white ml-3"><a href="/wap/subproj" class="mr-2 text-white show-loading"><i class="fa fa-chevron-left"></i>项目列表</a></span>
             <div class="mr-3">
                 <div class="dropdown">
                     <button class="btn btn-sm btn-light dropdown-toggle" type="button" data-toggle="dropdown">
@@ -38,11 +38,11 @@
     </nav>
     <!--标段列表-->
     <div class="py-6">
-        <ul class="d-flex justify-content-start list-unstyled">
-            <li class="mr-3"><i class="fa fa-stop text-success"></i>截止上期完成</li>
-            <li class="mr-3"><i class="fa fa-stop text-info"></i>本期完成</li>
-            <li class="mr-3"><i class="fa fa-stop text-muted"></i>未完成</li>
-        </ul>
+<!--        <ul class="d-flex justify-content-start list-unstyled">-->
+<!--            <li class="mr-3"><i class="fa fa-stop text-success"></i>截止上期完成</li>-->
+<!--            <li class="mr-3"><i class="fa fa-stop text-info"></i>本期完成</li>-->
+<!--            <li class="mr-3"><i class="fa fa-stop text-muted"></i>未完成</li>-->
+<!--        </ul>-->
         <div class="c-body"></div>
     </div>
     <!--底栏菜单-->
@@ -52,13 +52,14 @@
                 <a class="nav-link text-muted show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
             </li>
             <li class="nav-item">
-                <a class="nav-link active show-loading" href="/wap/list"><i class="fa fa-list-ul"></i> 项目</a>
+                <a class="nav-link active show-loading" href="/wap/subproj"><i class="fa fa-list-ul"></i> 项目</a>
             </li>
         </ul>
     </nav>
 </div>
 <script>
     const tenders = JSON.parse(unescape('<%- escape(JSON.stringify(tenderList)) %>'));
+    const subProject = JSON.parse(unescape('<%- escape(JSON.stringify(ctx.subProject)) %>'));
     const category = JSON.parse(unescape('<%- escape(JSON.stringify(categoryData)) %>'));
     const uid = '<%- uid %>';
     const pid = '<%- pid %>';
@@ -77,6 +78,7 @@
 <script src="/public/js/zh_calc.js"></script>
 <script src="/public/js/PinYinOrder.bundle.js"></script>
 <script src="/public/js/shares/tender_list_order.js"></script>
+<script src="/public/js/shares/show_level.js"></script>
 <script src="/public/js/tender_showhide.js"></script>
 <script src="/public/js/wap/list.js"></script>
 </body>

+ 1 - 1
app/view/wap/msg.ejs

@@ -65,7 +65,7 @@
                 <a class="nav-link active show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
             </li>
             <li class="nav-item">
-                <a class="nav-link text-muted show-loading" href="/wap/list"><i class="fa fa-list-ul"></i> 项目</a>
+                <a class="nav-link text-muted show-loading" href="/wap/subproj"><i class="fa fa-list-ul"></i> 项目</a>
             </li>
         </ul>
     </nav>

+ 1 - 1
app/view/wap/shenpi_advance.ejs

@@ -118,7 +118,7 @@
                 <a class="nav-link text-muted show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
             </li>
             <li class="nav-item">
-                <a class="nav-link active show-loading" href="/wap/list"><i class="fa fa-list-ul"></i> 项目</a>
+                <a class="nav-link active show-loading" href="/wap/subproj"><i class="fa fa-list-ul"></i> 项目</a>
             </li>
         </ul>
     </nav>

+ 1 - 1
app/view/wap/shenpi_advance_detail.ejs

@@ -146,7 +146,7 @@
                 <a class="nav-link text-muted show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
             </li>
             <li class="nav-item">
-                <a class="nav-link active show-loading" href="/wap/list"><i class="fa fa-list-ul"></i> 项目</a>
+                <a class="nav-link active show-loading" href="/wap/subproj"><i class="fa fa-list-ul"></i> 项目</a>
             </li>
         </ul>
     </nav>

+ 1 - 1
app/view/wap/shenpi_change.ejs

@@ -211,7 +211,7 @@
                 <a class="nav-link text-muted show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
             </li>
             <li class="nav-item">
-                <a class="nav-link active show-loading" href="/wap/list"><i class="fa fa-list-ul"></i> 项目</a>
+                <a class="nav-link active show-loading" href="/wap/subproj"><i class="fa fa-list-ul"></i> 项目</a>
             </li>
         </ul>
     </nav>

+ 1 - 1
app/view/wap/shenpi_change_apply.ejs

@@ -180,7 +180,7 @@
                 <a class="nav-link text-muted show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
             </li>
             <li class="nav-item">
-                <a class="nav-link active show-loading" href="/wap/list"><i class="fa fa-list-ul"></i> 项目</a>
+                <a class="nav-link active show-loading" href="/wap/subproj"><i class="fa fa-list-ul"></i> 项目</a>
             </li>
         </ul>
     </nav>

+ 1 - 1
app/view/wap/shenpi_change_index.ejs

@@ -262,7 +262,7 @@
                 <a class="nav-link text-muted show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
             </li>
             <li class="nav-item">
-                <a class="nav-link active show-loading" href="/wap/list"><i class="fa fa-list-ul"></i> 项目</a>
+                <a class="nav-link active show-loading" href="/wap/subproj"><i class="fa fa-list-ul"></i> 项目</a>
             </li>
         </ul>
     </nav>

+ 1 - 1
app/view/wap/shenpi_change_plan.ejs

@@ -163,7 +163,7 @@
                 <a class="nav-link text-muted show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
             </li>
             <li class="nav-item">
-                <a class="nav-link active show-loading" href="/wap/list"><i class="fa fa-list-ul"></i> 项目</a>
+                <a class="nav-link active show-loading" href="/wap/subproj"><i class="fa fa-list-ul"></i> 项目</a>
             </li>
         </ul>
     </nav>

+ 1 - 1
app/view/wap/shenpi_change_project.ejs

@@ -159,7 +159,7 @@
                 <a class="nav-link text-muted show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
             </li>
             <li class="nav-item">
-                <a class="nav-link active show-loading" href="/wap/list"><i class="fa fa-list-ul"></i> 项目</a>
+                <a class="nav-link active show-loading" href="/wap/subproj"><i class="fa fa-list-ul"></i> 项目</a>
             </li>
         </ul>
     </nav>

+ 1 - 1
app/view/wap/shenpi_revise.ejs

@@ -119,7 +119,7 @@
                 <a class="nav-link text-muted show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
             </li>
             <li class="nav-item">
-                <a class="nav-link active show-loading" href="/wap/list"><i class="fa fa-list-ul"></i> 项目</a>
+                <a class="nav-link active show-loading" href="/wap/subproj"><i class="fa fa-list-ul"></i> 项目</a>
             </li>
         </ul>
     </nav>

+ 1 - 1
app/view/wap/shenpi_stage.ejs

@@ -152,7 +152,7 @@
                 <a class="nav-link text-muted show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
             </li>
             <li class="nav-item">
-                <a class="nav-link active show-loading" href="/wap/list"><i class="fa fa-list-ul"></i> 项目</a>
+                <a class="nav-link active show-loading" href="/wap/subproj"><i class="fa fa-list-ul"></i> 项目</a>
             </li>
         </ul>
     </nav>

+ 74 - 0
app/view/wap/sub_proj.ejs

@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
+    <meta http-equiv="x-ua-compatible" content="ie=edge">
+    <title>项目-计量支付</title>
+    <link rel="stylesheet" href="/public/css/bootstrap/bootstrap.min.css">
+    <link rel="stylesheet" href="/public/css/wap/main.css">
+    <link rel="stylesheet" href="/public/css/toast.css">
+    <link rel="stylesheet" href="/public/css/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/public/css/toastr.css">
+    <link rel="shortcut icon" href="/public/images/favicon.ico">
+    <style>
+        html{height:100%;}
+        body {
+            padding: 0;
+        }
+    </style>
+    <!-- JS. -->
+    <% for (const file of jsFiles) { %>
+        <script type="text/javascript" src="<%- file %>"></script>
+    <% } %>
+</head>
+<body>
+<div class="container">
+    <!--顶部-->
+    <nav class="fixed-top bg-dark">
+        <div class="my-2 d-flex justify-content-between">
+            <span class="text-white ml-3">项目</span>
+            <div class="mr-3">
+                <div class="dropdown">
+                    <button class="btn btn-sm btn-light dropdown-toggle" type="button" data-toggle="dropdown">
+                        <%- ctx.session.sessionUser.name.substr(ctx.session.sessionUser.name.length > 2 ? ctx.session.sessionUser.name.length - 2 : 0) %>
+                    </button>
+                    <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
+                        <a class="dropdown-item" href="/wap/logout">退出登录</a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </nav>
+    <div class="py-6">
+        <div class="c-body">
+            <% if (!projectList || projectList.length === 0) { %>
+            <div class="jumbotron" id="no-project">
+                <h3 class="display-6">还没有项目数据</h3>
+            </div>
+            <% } else { %>
+            <table class="table">
+                <thead>
+                <tr class="text-center"><th>项目名称</th></tr>
+                </thead>
+                <tbody id="projectList">
+                </tbody>
+            </table>
+            <% } %>
+        </div>
+    </div>
+    <!--底栏菜单-->
+    <nav class="fixed-bottom navbar-dark bg-light border-top">
+        <ul class="nav nav-fill my-2">
+            <li class="nav-item">
+                <a class="nav-link text-muted show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link active show-loading" href="/wap/subproj"><i class="fa fa-list-ul"></i> 项目</a>
+            </li>
+        </ul>
+    </nav>
+</div>
+<script>
+    const projectList = JSON.parse(unescape('<%- escape(JSON.stringify(projectList)) %>'));
+</script>

+ 2 - 2
app/view/wap/tender.ejs

@@ -32,7 +32,7 @@
     <!--顶部-->
     <nav class="fixed-top bg-dark">
         <div class="my-2 d-flex justify-content-between">
-            <span class="text-white ml-3"><a href="/wap/list" class="mr-2 text-white show-loading"><i class="fa fa-chevron-left"></i>标段概况</a></span>
+            <span class="text-white ml-3"><a href="/wap/sp/<%- ctx.subProject.id %>/list" class="mr-2 text-white show-loading"><i class="fa fa-chevron-left"></i>标段概况</a></span>
             <a tabindex="0" href="javascript:void(0)" class="text-white text-truncate text-center"
                style="width:150px" data-toggle="popover" data-placement="top"
                data-content="<%- tender.name %>" data-trigger="focus"><%- tender.name %></a>
@@ -244,7 +244,7 @@
                 <a class="nav-link text-muted show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
             </li>
             <li class="nav-item">
-                <a class="nav-link active show-loading" href="/wap/list"><i class="fa fa-list-ul"></i> 项目</a>
+                <a class="nav-link active show-loading" href="/wap/subproj"><i class="fa fa-list-ul"></i> 项目</a>
             </li>
         </ul>
     </nav>

+ 15 - 0
config/web.js

@@ -1231,6 +1231,21 @@ const JsFiles = {
                 ],
                 mergeFile: 'sub_project',
             },
+            wap: {
+                files: [
+                    '/public/js/moment/moment.min.js',
+                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
+                ],
+                mergeFiles: [
+                    '/public/js/shares/drag_tree.js',
+                    '/public/js/path_tree.js',
+                    '/public/js/shares/tenders2tree.js',
+                    '/public/js/shares/show_level.js',
+                    '/public/js/spreadjs_rela/spreadjs_zh.js',
+                    '/public/js/wap/sub_project.js',
+                ],
+                mergeFile: 'sp_wap',
+            },
             info: {
                 files: [
                     '/public/js/component/menu.js',