Sfoglia il codice sorgente

1.标段合同列表入口改动2.设置文字改动

ellisran 5 mesi fa
parent
commit
91584b0cc7

+ 2 - 0
app/base/base_controller.js

@@ -44,6 +44,8 @@ class BaseController extends Controller {
                 if (!im.url) {
                     if (index === 'tender') {
                         im.url = `/sp/${ctx.subProject.id}${ctx.curListUrl}`;
+                    } else if (index === 'contract') {
+                        im.url = `/sp/${ctx.subProject.id}/${im.controller}/detail`;
                     } else {
                         im.url = `/sp/${ctx.subProject.id}/${im.controller}`;
                     }

+ 8 - 7
app/controller/contract_controller.js

@@ -112,14 +112,14 @@ module.exports = app => {
                 }
                 const categoryData = await ctx.service.category.getAllCategory(ctx.subProject);
                 const renderData = {
-                    // jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.contract.tender),
-                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.contract.index),
+                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.contract.tender),
+                    // jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.contract.index),
                     auditConst,
-                    // tenderList,
+                    tenderList,
                     projectList: projectList.concat(tenderList),
                     categoryData,
                     isTender: true,
-                    // selfCategoryLevel: accountInfo ? accountInfo.self_category_level : '',
+                    selfCategoryLevel: accountInfo ? accountInfo.self_category_level : '',
                     // selfCategoryLevel: '',
                     pid: ctx.session.sessionProject.id,
                     uid: ctx.session.sessionUser.accountId,
@@ -136,8 +136,8 @@ module.exports = app => {
                     renderData.accountList = accountList;
                     renderData.accountGroup = accountGroupList;
                 }
-                // await this.layout('contract/tender.ejs', renderData, 'contract/modal.ejs');
-                await this.layout('contract/index.ejs', renderData, 'contract/modal.ejs');
+                await this.layout('contract/tender.ejs', renderData, 'contract/modal.ejs');
+                // await this.layout('contract/index.ejs', renderData, 'contract/modal.ejs');
             } catch (err) {
                 ctx.log(err);
                 ctx.session.postError = err.toString();
@@ -216,11 +216,12 @@ module.exports = app => {
                 const renderData = {
                     contractTreeAudits,
                     audit_permission: ctx.contract_audit_permission,
-                    preUrl: ctx.contractOptions.tid ? '/contract/tender' : '/contract',
+                    preUrl: `/sp/${ctx.subProject.id}` + (ctx.contractOptions.tid ? '/contract/tender' : '/contract'),
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.contract.detail),
                     contract_type: ctx.contract_type,
                     contractConst,
                     whiteList,
+                    thisUrl: `/sp/${ctx.subProject.id}` + (ctx.contract_tender ? `/contract/${ctx.contract.id}/detail` : '/contract/detail'),
                 };
                 if (ctx.session.sessionUser.is_admin) {
                     const accountList = await ctx.service.projectAccount.getAllSubProjectAccount(ctx.subProject);

+ 5 - 16
app/middleware/contract_check.js

@@ -26,23 +26,11 @@ module.exports = options => {
             if (!this.session.sessionProject.page_show.openContract) {
                 throw '该功能已关闭或无法查看';
             }
-            const stid = this.params.stid;
+            const tid = this.params.tid || null;
             const type = this.params.type ? contractConst.type[this.params.type] : contractConst.type.expenses;
-            if (!stid) throw '参数错误';
-            let spid = null;
-            let tid = null;
-            // 判断stid字符串是不是只有数字
-            if (!/^\d+$/.test(stid)) {
-                spid = stid;
-            } else {
-                tid = stid;
-            }
-            if (!spid && !tid) {
-                throw '参数数据错误';
-            }
-            const info = spid ? yield this.service.subProject.getDataById(spid) : yield this.service.tender.getDataById(tid);
+            const info = tid ? yield this.service.tender.getDataById(tid) : this.subProject;
             if (!info) throw '项目或标段不存在';
-            const options = spid ? { spid } : { tid };
+            const options = tid ? { tid } : { spid: this.subProject.id };
             if (this.request.originalUrl && this.request.originalUrl.indexOf('detail') > -1) yield this.service.contractTree.insertTree(options, info);
             // 权限控制
             const cloneOptions = _.cloneDeep(options);
@@ -56,6 +44,7 @@ module.exports = options => {
             this.contractOptions = options;
             this.contract_audit_permission = result;
             this.contract_type = type;
+            this.contract_tender = !!tid;
             yield next;
         } catch (err) {
             // 输出错误到日志
@@ -85,7 +74,7 @@ module.exports = options => {
                     this.redirect('/wap/list');
                 } else {
                     this.postError(err, '未知错误');
-                    err === '该功能已关闭或无法查看' ? this.redirect('/dashboard') : this.request.headers.referer ? this.redirect(this.request.headers.referer) : this.redirect('/contract');
+                    err === '该功能已关闭或无法查看' ? this.redirect('/dashboard') : this.request.headers.referer ? this.redirect(this.request.headers.referer) : this.redirect(`/sp/${this.subProject.id}/dashboard`);
                 }
             }
         }

+ 5 - 5
app/public/js/contract_detail.js

@@ -351,7 +351,7 @@ $(document).ready(function() {
                                         <td>
                                             <div class="btn-group-table">
                                                 ${file.viewpath ? `<a href="${file.viewpath}" target="_blank" class="mr-1"><i class="fa fa-eye fa-fw"></i></a>` : ''}
-                                                <a href="/contract/${stid}/detail/${contractConst.typeMap[contract_type]}/${cid}${cpid ? '/pay/' + cpid : ''}/file/${file.id}/download" class="mr-1"><i class="fa fa-download fa-fw"></i></a>
+                                                <a href="${thisUrl}/${contractConst.typeMap[contract_type]}/${cid}${cpid ? '/pay/' + cpid : ''}/file/${file.id}/download" class="mr-1"><i class="fa fa-download fa-fw"></i></a>
                                                 ${file.showDel ? `<a href="javascript: void(0);" class="text-danger file-del mr-1" data-id="${file.id}"><i class="fa fa-trash-o fa-fw text-danger"></i></a>` : ''}
                                             </div>
                                         </td>
@@ -1269,7 +1269,7 @@ $(document).ready(function() {
                     formData.append('size', file.size)
                     formData.append('file', file)
                 })
-                postDataWithFile('/contract/' + stid + '/detail/' + contractConst.typeMap[contract_type] + '/' + node.id + '/file/upload', formData, function (result) {
+                postDataWithFile(`${thisUrl}/${contractConst.typeMap[contract_type]}/${node.id}/file/upload`, formData, function (result) {
                     contractTreeSpreadObj.setContractFiles(result, node.id);
                     $('#file-modal').val('');
                     $('#file-cancel').click()
@@ -1282,7 +1282,7 @@ $(document).ready(function() {
         const node = SpreadJsObj.getSelectObject(contractSheet);
         const fid = $(this).data('id');
         deleteAfterHint(function () {
-            postData('/contract/' + stid + '/detail/' + contractConst.typeMap[contract_type] + '/' + node.id + '/file/delete', { id: fid }, function (result) {
+            postData(`${thisUrl}/${contractConst.typeMap[contract_type]}/${node.id}/file/delete`, { id: fid }, function (result) {
                 contractTreeSpreadObj.setContractFiles(result, node.id);
             });
         }, '确认删除该文件?');
@@ -1393,7 +1393,7 @@ $(document).ready(function() {
                     formData.append('size', file.size)
                     formData.append('file', file)
                 })
-                postDataWithFile('/contract/' + stid + '/detail/' + contractConst.typeMap[contract_type] + '/' + node.id + '/pay/' + cpInfo.id + '/file/upload', formData, function (result) {
+                postDataWithFile(`${thisUrl}/${contractConst.typeMap[contract_type]}/${node.id}/pay/${cpInfo.id}/file/upload`, formData, function (result) {
                     cpInfo.files = result;
                     contractTreeSpreadObj.openContractPayFiles(cpInfo);
                     $('#htpay-table tbody').find('tr[data-cpid="' + cpInfo.id + '"]').find('.files-num').text(result.length || '');
@@ -1413,7 +1413,7 @@ $(document).ready(function() {
         }
         const fid = $(this).data('id');
         deleteAfterHint(function () {
-            postData('/contract/' + stid + '/detail/' + contractConst.typeMap[contract_type] + '/' + node.id + '/pay/' + cpInfo.id + '/file/delete', { id: fid }, function (result) {
+            postData(`${thisUrl}/${contractConst.typeMap[contract_type]}/${node.id}/pay/${cpInfo.id}/file/delete`, { id: fid }, function (result) {
                 cpInfo.files = result;
                 contractTreeSpreadObj.openContractPayFiles(cpInfo);
                 $('#htpay-table tbody').find('tr[data-cpid="' + cpInfo.id + '"]').find('.files-num').text(result.length || '');

+ 1 - 1
app/public/js/contract_index.js

@@ -34,7 +34,7 @@ $(document).ready(function() {
                     }
                 } else {
                     html.push(`<span class="text-muted mr-2">${tree.isLastSibling(node) ? '└' : '├'}</span>`);
-                    html.push('<a href="/contract/'+ node.id +'/detail" name="name" id="' + node.id + '">', node.name, '</a>');
+                    html.push('<a href="/sp/' + spid +'/contract/'+ node.id +'/detail" name="name" id="' + node.id + '">', node.name, '</a>');
                 }
                 html.push('</td>');
                 // 创建时间

+ 6 - 3
app/public/js/contract_tender.js

@@ -34,7 +34,7 @@ const tenderListSpec = (function(){
             html.push(arr.indexOf(node) === arr.length - 1 ? '└' : '├');
             html.push('</span>');
             //html.push('<a href="/tender/' + node.id + '">', node[c.field], '</a>');
-            html.push('<a href="/contract/'+ node.id +'/detail" name="name" style="min-width: 200px;word-break:break-all;" id="' + node.id + '">', node.name, '</a>');
+            html.push('<a href="/sp/' + spid + '/contract/'+ node.id +'/detail" name="name" style="min-width: 200px;word-break:break-all;" id="' + node.id + '">', node.name, '</a>');
         }
         html.push('</td>');
 
@@ -66,8 +66,11 @@ const tenderListSpec = (function(){
     }
     function getTenderTreeHeaderHtml() {
         const html = [];
-        html.push('<table class="table table-hover table-bordered">');
-        html.push('<thead style="position: fixed;left:56px;top: 34px;" class="text-center">', '<tr>');
+        const left = $('#sub-menu').css('display') === 'none' ? 56 : 176;
+        html.push('<table class="table table-hover table-bordered" id="progress-table">')
+        html.push('<thead style="position: sticky;left:'+ left +'px;top: 0px;" class="text-center">', '<tr>');
+        // html.push('<table class="table table-hover table-bordered">');
+        // html.push('<thead style="position: fixed;left:56px;top: 34px;" class="text-center">', '<tr>');
         html.push('<th style="min-width: 200px" rowspan="2">', '标段名称', '</th>');
         html.push('<th style="width: 8%" rowspan="2">', '创建时间', '</th>');
         html.push('<th colspan="3">支出合同</th>');

+ 2 - 1
app/public/js/tender_list.js

@@ -1,8 +1,9 @@
 const tenderListSpec = (function(){
     function getTenderTreeHeaderHtml() {
         const html = [];
+        const left = $('#sub-menu').css('display') === 'none' ? 56 : 176;
         html.push('<table class="table table-hover table-bordered">');
-        html.push('<thead style="position: fixed;left:56px;top: 34px;">', '<tr>');
+        html.push('<thead style="position: fixed;left:'+ left +'px;top: 34px;">', '<tr>');
         html.push('<th class="text-center" style="width: 40%">', '标段名称', tenderListOrder.getOrderButton('name'), '</th>');
         html.push('<th class="text-center" style="width: 9%">', '计量模式', '</th>');
         html.push('<th class="text-center" style="width: 9%">', '创建人', '</th>');

+ 2 - 1
app/public/js/tender_list_info.js

@@ -175,8 +175,9 @@ const tenderListSpec = (function(){
     function getTenderTreeHeaderHtml() {
         colSetCache = generateColSetCache();
         const html = [];
+        const left = $('#sub-menu').css('display') === 'none' ? 56 : 176;
         html.push('<table class="table table-hover table-bordered">');
-        html.push('<thead style="position: fixed;left:56px;top: 34px;">', '<tr>');
+        html.push('<thead style="position: fixed;left:'+ left +'px;top: 34px;">', '<tr>');
         if (colSetCache.name.show) html.push('<th class="text-center" style="min-width: 300px;">', colSetCache.name.alias, '</th>');
         if (colSetCache.measure_type.show) html.push('<th class="text-center" style="width: 85px">', colSetCache.measure_type.alias, '</th>');
         if (colSetCache.calc_flow.show) html.push('<th class="text-center" style="width: 125px">', colSetCache.calc_flow.alias, '</th>');

+ 2 - 1
app/public/js/tender_list_manage.js

@@ -61,8 +61,9 @@ const tenderListSpec = (function(){
     }
     function getTenderTreeHeaderHtml() {
         const html = [];
+        const left = $('#sub-menu').css('display') === 'none' ? 56 : 176;
         html.push('<table class="table table-hover table-bordered">');
-        html.push('<thead style="position: fixed;left:56px;top: 34px;">', '<tr>');
+        html.push('<thead style="position: fixed;left:'+ left +'px;top: 34px;">', '<tr>');
         html.push('<th class="text-center" style="width: 45%">', '标段名称', tenderListOrder.getOrderButton('name'), '</th>');
         html.push('<th class="text-center" style="width: 10%">', '创建人', '</th>');
         html.push('<th class="text-center" style="width: 15%">', '创建时间', tenderListOrder.getOrderButton('create_time'), '</th>');

+ 3 - 2
app/public/js/tender_list_progress.js

@@ -113,8 +113,9 @@ const tenderListSpec = (function(){
     }
     function getTenderTreeHeaderHtml() {
         const html = [];
-        html.push('<table class="table table-hover table-bordered" id="progress-table">');
-        html.push('<thead style="position: sticky;left:56px;top: 0px;">', '<tr>');
+        const left = $('#sub-menu').css('display') === 'none' ? 56 : 176;
+        html.push('<table class="table table-hover table-bordered" id="progress-table">')
+        html.push('<thead style="position: sticky;left:'+ left +'px;top: 0px;">', '<tr>');
         // html.push('<thead style="left:56px;top: 34px;">', '<tr>');
         html.push('<th style="width: 30%;min-width: 300px" class="text-center">', '标段名称', '</th>');
         html.push('<th class="text-center" style="width: 120px">', '计量进度', '</th>');

+ 31 - 17
app/router.js

@@ -277,23 +277,37 @@ module.exports = app => {
     app.post('/sp/:id/list/del', sessionAuth, subProjectCheck, 'tenderController.deleteTender');
     app.get('/sp/:id/list/refreshCache', sessionAuth, subProjectCheck, 'tenderController.refreshCache');
 
-    // **合同管理 todo 接入项目内部
-    app.get('/contract', sessionAuth, 'contractController.index');
-    app.get('/contract/tender', sessionAuth, 'contractController.tender');
-    app.post('/contract/:stid/audit/save', sessionAuth, contractCheck, 'contractController.auditSave');
-    app.get('/contract/:stid/detail', sessionAuth, contractCheck, 'contractController.detail');
-    app.get('/contract/:stid/detail/:type', sessionAuth, contractCheck, 'contractController.detail');
-    app.post('/contract/:stid/detail/load', sessionAuth, contractCheck, 'contractController.loadDetail');
-    app.post('/contract/:stid/detail/:type/load', sessionAuth, contractCheck, 'contractController.loadDetail');
-    app.post('/contract/:stid/detail/update', sessionAuth, contractCheck, 'contractController.updateBills');
-    app.post('/contract/:stid/detail/:type/update', sessionAuth, contractCheck, 'contractController.updateBills');
-    app.post('/contract/:stid/detail/:type/:cid/file/upload', sessionAuth, contractCheck, 'contractController.uploadFile');
-    app.post('/contract/:stid/detail/:type/:cid/file/delete', sessionAuth, contractCheck, 'contractController.deleteFile');
-    app.get('/contract/:stid/detail/:type/:cid/file/:fid/download', sessionAuth, contractCheck, 'contractController.downloadFile');
-    app.post('/contract/:stid/detail/:type/:cid/pay/:cpid/file/upload', sessionAuth, contractCheck, 'contractController.uploadFile');
-    app.post('/contract/:stid/detail/:type/:cid/pay/:cpid/file/delete', sessionAuth, contractCheck, 'contractController.deleteFile');
-    app.get('/contract/:stid/detail/:type/:cid/pay/:cpid/file/:fid/download', sessionAuth, contractCheck, 'contractController.downloadFile');
-
+    // **标段合同管理 todo 接入项目内部
+    // app.get('/sp/:id/contract', sessionAuth, subProjectCheck, 'contractController.index');
+    app.get('/sp/:id/contract/tender', sessionAuth, subProjectCheck, 'contractController.tender');
+    app.post('/sp/:id/contract/:tid/audit/save', sessionAuth, subProjectCheck, contractCheck, 'contractController.auditSave');
+    app.get('/sp/:id/contract/:tid/detail', sessionAuth, subProjectCheck, contractCheck, 'contractController.detail');
+    app.get('/sp/:id/contract/:tid/detail/:type', sessionAuth, subProjectCheck, contractCheck, 'contractController.detail');
+    app.post('/sp/:id/contract/:tid/detail/load', sessionAuth, subProjectCheck, contractCheck, 'contractController.loadDetail');
+    app.post('/sp/:id/contract/:tid/detail/:type/load', sessionAuth, subProjectCheck, contractCheck, 'contractController.loadDetail');
+    app.post('/sp/:id/contract/:tid/detail/update', sessionAuth, subProjectCheck, contractCheck, 'contractController.updateBills');
+    app.post('/sp/:id/contract/:tid/detail/:type/update', sessionAuth, subProjectCheck, contractCheck, 'contractController.updateBills');
+    app.post('/sp/:id/contract/:tid/detail/:type/:cid/file/upload', sessionAuth, subProjectCheck, contractCheck, 'contractController.uploadFile');
+    app.post('/sp/:id/contract/:tid/detail/:type/:cid/file/delete', sessionAuth, subProjectCheck, contractCheck, 'contractController.deleteFile');
+    app.get('/sp/:id/contract/:tid/detail/:type/:cid/file/:fid/download', sessionAuth, subProjectCheck, contractCheck, 'contractController.downloadFile');
+    app.post('/sp/:id/contract/:tid/detail/:type/:cid/pay/:cpid/file/upload', sessionAuth, subProjectCheck, contractCheck, 'contractController.uploadFile');
+    app.post('/sp/:id/contract/:tid/detail/:type/:cid/pay/:cpid/file/delete', sessionAuth, subProjectCheck, contractCheck, 'contractController.deleteFile');
+    app.get('/sp/:id/contract/:tid/detail/:type/:cid/pay/:cpid/file/:fid/download', sessionAuth, subProjectCheck, contractCheck, 'contractController.downloadFile');
+    // 项目合同管理
+    app.get('/sp/:id/contract', sessionAuth, subProjectCheck, contractCheck, 'contractController.detail');
+    app.get('/sp/:id/contract/detail', sessionAuth, subProjectCheck, contractCheck, 'contractController.detail');
+    app.get('/sp/:id/contract/detail/:type', sessionAuth, subProjectCheck, contractCheck, 'contractController.detail');
+    app.post('/sp/:id/contract/load', sessionAuth, subProjectCheck, contractCheck, 'contractController.loadDetail');
+    app.post('/sp/:id/contract/detail/load', sessionAuth, subProjectCheck, contractCheck, 'contractController.loadDetail');
+    app.post('/sp/:id/contract/detail/:type/load', sessionAuth, subProjectCheck, contractCheck, 'contractController.loadDetail');
+    app.post('/sp/:id/contract/detail/update', sessionAuth, subProjectCheck, contractCheck, 'contractController.updateBills');
+    app.post('/sp/:id/contract/detail/:type/update', sessionAuth, subProjectCheck, contractCheck, 'contractController.updateBills');
+    app.post('/sp/:id/contract/detail/:type/:cid/file/upload', sessionAuth, subProjectCheck, contractCheck, 'contractController.uploadFile');
+    app.post('/sp/:id/contract/detail/:type/:cid/file/delete', sessionAuth, subProjectCheck, contractCheck, 'contractController.deleteFile');
+    app.get('/sp/:id/contract/detail/:type/:cid/file/:fid/download', sessionAuth, subProjectCheck, contractCheck, 'contractController.downloadFile');
+    app.post('/sp/:id/contract/detail/:type/:cid/pay/:cpid/file/upload', sessionAuth, subProjectCheck, contractCheck, 'contractController.uploadFile');
+    app.post('/sp/:id/contract/detail/:type/:cid/pay/:cpid/file/delete', sessionAuth, subProjectCheck, contractCheck, 'contractController.deleteFile');
+    app.get('/sp/:id/contract/detail/:type/:cid/pay/:cpid/file/:fid/download', sessionAuth, subProjectCheck, contractCheck, 'contractController.downloadFile');
 
 
     // 资料归集-列表

+ 4 - 4
app/service/tender.js

@@ -635,8 +635,8 @@ module.exports = app => {
                     '  FROM ?? As t ' +
                     '  Left Join ?? As pa ' +
                     '  ON t.`user_id` = pa.`id` ' +
-                    '  WHERE t.`project_id` = ? AND t.`spid` != ? ORDER BY CONVERT(t.`name` USING GBK) ASC';
-                sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, session.sessionProject.id, ''];
+                    '  WHERE t.`project_id` = ? AND t.`spid` = ? ORDER BY CONVERT(t.`name` USING GBK) ASC';
+                sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, session.sessionProject.id, this.ctx.subProject.id];
             } else {
                 // 根据用户权限查阅标段
                 sql = 'SELECT t.`id`, t.`project_id`, t.`name`, t.`status`, t.`category`, t.`user_id`, t.`create_time`,' +
@@ -649,9 +649,9 @@ module.exports = app => {
                     '  WHERE t.`project_id` = ? AND ' +
                     // 参与施工 的标段
                     ' t.id IN ( SELECT ca.`tid` FROM ?? As ca WHERE ca.`uid` = ?)' +
-                    ' AND t.`spid` != ? ORDER BY CONVERT(t.`name` USING GBK) ASC';
+                    ' AND t.`spid` = ? ORDER BY CONVERT(t.`name` USING GBK) ASC';
                 sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, session.sessionProject.id,
-                    this.ctx.service.contractAudit.tableName, session.sessionUser.accountId, '',
+                    this.ctx.service.contractAudit.tableName, session.sessionUser.accountId, this.ctx.subProject.id,
                 ];
             }
             const list = await this.db.query(sql, sqlParam);

+ 1 - 1
app/view/contract/detail.ejs

@@ -194,10 +194,10 @@
     const is_admin = <%- ctx.session.sessionUser.is_admin %>;
     const permission_edit = <%- (ctx.session.sessionUser.is_admin || audit_permission.permission_edit) %>;
     const permission_add = <%- (ctx.session.sessionUser.is_admin || audit_permission.permission_add) %>;
-    const stid = '<%- ctx.contractOptions.spid || ctx.contractOptions.tid %>';
     const contract_type = <%- contract_type %>;
     const whiteList = JSON.parse(unescape('<%- escape(JSON.stringify(whiteList)) %>'));
     const contractConst = JSON.parse(unescape('<%- escape(JSON.stringify(contractConst)) %>'));
     let contractTreeAudits = JSON.parse(unescape('<%- escape(JSON.stringify(contractTreeAudits)) %>'));
+    const thisUrl = JSON.parse(unescape('<%- escape(JSON.stringify(thisUrl)) %>'));
     let contractPays = [];
 </script>

+ 0 - 6
app/view/contract/index.ejs

@@ -3,12 +3,6 @@
         <div class="title-main  d-flex">
             <div class="d-inline-block">
                 <div class="btn-group group-tab">
-                    <a href="<% if (!isTender) { %>javascript:void(0);<% } else { %>/contract<% } %>" class="btn btn-sm btn-light<% if (!isTender) { %> active<% } %>">
-                        项目合同
-                    </a>
-                    <a href="<% if (isTender) { %>javascript:void(0);<% } else { %>/contract/tender<% } %>" class="btn btn-sm btn-light<% if (isTender) { %> active<% } %>">
-                        标段合同
-                    </a>
                 </div>
             </div>
             <div class="d-inline-block mr-2" id="show-level"></div>

+ 5 - 5
app/view/contract/modal.ejs

@@ -176,7 +176,7 @@
             const id = parseInt($(this).data('id'));
             console.log(id);
             if (!isNaN(id) && id !== 0) {
-                postData('/contract/'+ $('#stid').val() + '/audit/save', {type: 'add-audit', id: id}, function (result) {
+                postData(`/sp/${spid}/contract/${$('#stid').val()}/audit/save`, {type: 'add-audit', id: id}, function (result) {
                     setList(result);
                 })
             }
@@ -193,7 +193,7 @@
             }
             const stid = $('#stid').val();
             if (stid) {
-                postData('/contract/'+ $('#stid').val() + '/audit/save', { type: 'list' }, function (result) {
+                postData(`/sp/${spid}/contract/${$('#stid').val()}/audit/save`, { type: 'list' }, function (result) {
                     setList(result);
                 });
             }
@@ -202,7 +202,7 @@
             const stid = $(this).data('stid');
             $('#stid').val(stid);
             $('#contract-audit-list').html('');
-            postData('/contract/'+ $('#stid').val() + '/audit/save', { type: 'check' }, function (result) {
+            postData(`/sp/${spid}/contract/${$('#stid').val()}/audit/save`, { type: 'check' }, function (result) {
                 $('#authority-list').modal('show');
             });
         });
@@ -241,7 +241,7 @@
 
         $('#del-audit-btn').click(function () {
             let uids = $('#del-audit-ids').val();
-            postData('/contract/'+ $('#stid').val() + '/audit/save', { type: 'del-audit', id: uids.split(',') }, function (result) {
+            postData(`/sp/${spid}/contract/${$('#stid').val()}/audit/save`, { type: 'del-audit', id: uids.split(',') }, function (result) {
                 // toastr.success(`成功添加 位用户`);
                 $('#del-contract-audit').modal('hide');
                 setList(result);
@@ -255,7 +255,7 @@
             const id = parseInt($(this).val());
             const updateInfo = { id };
             updateInfo[type] = value;
-            postData('/contract/'+ $('#stid').val() + '/audit/save', { type: 'save-permission', updateData: updateInfo }, function (result) {
+            postData(`/sp/${spid}/contract/${$('#stid').val()}/audit/save`, { type: 'save-permission', updateData: updateInfo }, function (result) {
             })
         });
     });

+ 5 - 5
app/view/contract/sub_menu_list.ejs

@@ -1,15 +1,15 @@
-<nav-menu title="返回" url="<%- preUrl %>" tclass="text-primary" ml="1" icon="fa-chevron-left"></nav-menu>
+<% if (ctx.contract_tender) { %><nav-menu title="返回" url="<%- preUrl %>" tclass="text-primary" ml="1" icon="fa-chevron-left"></nav-menu><% } %>
 <div class="nav-box">
     <ul class="nav-list list-unstyled">
-        <li class="<% if (ctx.url === '/contract/' + ctx.contract.id + '/detail') { %>active<% } %>">
-            <a href="/contract/<%- ctx.contract.id %>/detail"><span class="ml-3">支出合同</span></a>
+        <li class="<% if (ctx.url === thisUrl) { %>active<% } %>">
+            <a href="<%- thisUrl %>"><span class="ml-3">支出合同</span></a>
         </li>
     </ul>
 </div>
 <div class="nav-box">
     <ul class="nav-list list-unstyled">
-        <li class="<% if (ctx.url === '/contract/' + ctx.contract.id + '/detail/income') { %>active<% } %>">
-            <a href="/contract/<%- ctx.contract.id %>/detail/income"><span class="ml-3">收入合同</span></a>
+        <li class="<% if (ctx.url === thisUrl + '/income') { %>active<% } %>">
+            <a href="<%- thisUrl %>/income"><span class="ml-3">收入合同</span></a>
         </li>
     </ul>
 </div>

+ 30 - 6
app/view/contract/tender.ejs

@@ -1,14 +1,10 @@
+<% include ../tender/list_sub_menu.ejs %>
 <div class="panel-content">
     <div class="panel-title fluid">
         <div class="title-main  d-flex">
+            <% include ../tender/list_sub_mini_menu.ejs %>
             <div class="d-inline-block">
                 <div class="btn-group group-tab">
-                    <a href="/contract" class="btn btn-sm btn-light">
-                        项目合同
-                    </a>
-                    <a href="javascript:void(0);" class="btn btn-sm btn-light active">
-                        标段合同
-                    </a>
                 </div>
             </div>
             <div class="d-inline-block mr-2" id="show-level"></div>
@@ -16,6 +12,14 @@
     </div>
     <div class="content-wrap">
         <div class="sjs-height-0" style="background-color: #fff">
+            <style>
+                .c-body .table thead th {
+                    border: none;
+                    outline-width: 1px;
+                    outline-style: solid;
+                    outline-color: #dee2e6;
+                }
+            </style>
             <div class="c-body">
             </div>
         </div>
@@ -23,6 +27,7 @@
 </div>
 <script>
     const tenders = JSON.parse(unescape('<%- escape(JSON.stringify(tenderList)) %>'));
+    console.log(tenders);
     const category = JSON.parse(unescape('<%- escape(JSON.stringify(categoryData)) %>'));
     const selfCategoryLevel = JSON.parse(unescape('<%- escape(JSON.stringify(selfCategoryLevel)) %>'));
     const uid = '<%- uid %>';
@@ -30,4 +35,23 @@
     const is_admin = <%- ctx.session.sessionUser.is_admin %>;
 
     const uphlname = 'user_' + uid + '_pro_' + pid + '_category_hide_contract_list';
+
+    $.subMenu({
+        menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
+        toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
+        key: 'list.menu.1.0.0',
+        miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
+        callback: function (info) {
+            if (info.mini) {
+                $('.panel-title').addClass('fluid');
+                $('#sub-menu').removeClass('panel-sidebar');
+                $('.c-body table thead').css('left', '56px');
+            } else {
+                $('.panel-title').removeClass('fluid');
+                $('#sub-menu').addClass('panel-sidebar');
+                $('.c-body table thead').css('left', '176px');
+            }
+            autoFlashHeight();
+        }
+    });
 </script>

+ 1 - 1
app/view/setting/info.ejs

@@ -2,7 +2,7 @@
 <div class="panel-content">
     <div class="panel-title">
         <div class="title-main">
-            <h2>项目信息
+            <h2>平台信息
                 <% if (projectData.user_account === ctx.session.sessionUser.account) { %><a href="#" class="btn btn-primary btn-sm pull-right" onclick="updateinfo()">保存修改</a><% } %>
             </h2>
         </div>

+ 1 - 1
app/view/setting/sub_menu.ejs

@@ -1,6 +1,6 @@
 <div class="panel-sidebar">
     <div class="sidebar-title">
-        项目设置
+        平台设置
     </div>
     <div class="scrollbar-auto">
         <div class="nav-box">

+ 21 - 0
app/view/tender/index.ejs

@@ -1,3 +1,4 @@
+<% include ./list_sub_menu.ejs %>
 <div class="panel-content">
     <% if (is_finish) { %>
     <% include sub_memu_finish.ejs %>
@@ -22,4 +23,24 @@
     const pid = '<%- pid %>';
 
     const uphlname = 'user_' + uid + '_pro_' + pid + '_category_hide_list';
+
+    $.subMenu({
+        menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
+        toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
+        key: 'list.menu.1.0.0',
+        miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
+        callback: function (info) {
+            if (info.mini) {
+                $('.panel-title').addClass('fluid');
+                $('#sub-menu').removeClass('panel-sidebar');
+                $('.c-body table thead').css('left', '56px');
+            } else {
+                $('.panel-title').removeClass('fluid');
+                $('#sub-menu').addClass('panel-sidebar');
+                $('.c-body table thead').css('left', '176px');
+            }
+            autoFlashHeight();
+            setTopTr();
+        }
+    });
 </script>

+ 20 - 0
app/view/tender/info.ejs

@@ -1,3 +1,4 @@
+<% include ./list_sub_menu.ejs %>
 <div class="panel-content">
     <% if (is_finish) { %>
     <% include sub_memu_finish.ejs %>
@@ -21,4 +22,23 @@
     const uid = '<%- uid %>';
     const pid = '<%- pid %>';
     const uphlname = 'user_' + uid + '_pro_' + pid + '_category_hide_list';
+
+    $.subMenu({
+        menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
+        toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
+        key: 'list.menu.1.0.0',
+        miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
+        callback: function (info) {
+            if (info.mini) {
+                $('.panel-title').addClass('fluid');
+                $('#sub-menu').removeClass('panel-sidebar');
+                $('.c-body table thead').css('left', '56px');
+            } else {
+                $('.panel-title').removeClass('fluid');
+                $('#sub-menu').addClass('panel-sidebar');
+                $('.c-body table thead').css('left', '176px');
+            }
+            autoFlashHeight();
+        }
+    });
 </script>

+ 15 - 0
app/view/tender/list_sub_menu.ejs

@@ -0,0 +1,15 @@
+<div class="panel-sidebar" id="sub-menu">
+    <div class="sidebar-title text-center"><i class="fa fa-list-ul fa-fw"></i> 标段管理</div>
+    <div class="scrollbar-auto">
+        <% include ./list_sub_menu_list.ejs %>
+        <div class="side-show"></div>
+        <div class="side-fold" data-toggle="tooltip" data-placement="top" data-original-title="折叠侧栏" id="to-mini-menu">
+            <i class="fa fa-angle-left"></i>
+        </div>
+    </div>
+    <script>
+        new Vue({
+            el: '.scrollbar-auto',
+        });
+    </script>
+</div>

+ 14 - 0
app/view/tender/list_sub_menu_list.ejs

@@ -0,0 +1,14 @@
+<div class="nav-box">
+    <ul class="nav-list list-unstyled">
+        <li class="<% if (ctx.url.indexOf('/sp/' + ctx.subProject.id + '/list') !== -1) { %>active<% } %>">
+            <a href="<%- ctx.menuList.tender.url %>"><span class="ml-3">计量管理</span></a>
+        </li>
+    </ul>
+</div>
+<div class="nav-box">
+    <ul class="nav-list list-unstyled">
+        <li class="<% if (ctx.url === '/sp/' + ctx.subProject.id + '/contract/tender') { %>active<% } %>">
+            <a href="/sp/<%- ctx.subProject.id %>/contract/tender"><span class="ml-3">合同管理</span></a>
+        </li>
+    </ul>
+</div>

+ 16 - 0
app/view/tender/list_sub_mini_menu.ejs

@@ -0,0 +1,16 @@
+<!--折起的菜单-->
+<div class="min-side" id="sub-mini-menu" style="display: none;">
+    <div class="side-switch" data-toggle="tooltip" data-placement="left" data-original-title="点击这里打开收起的菜单栏">
+        <i class="fa fa-bars mt-2"></i>
+        <i class="fa fa-indent mt-2 text-primary" style="display: none;cursor: pointer;" id="to-menu"></i>
+    </div>
+    <div class="side-menu" id="mini-menu-list" style="display: none">
+        <% include ./list_sub_menu_list.ejs %>
+        <div class="side-fold"><a href="javascript: void(0);" data-toggle="tooltip" data-placement="top" data-original-title="展开侧栏" id="to-menu"><i class="fa fa-upload fa-rotate-90"></i></a></div>
+    </div>
+</div>
+<script>
+    new Vue({
+        el: '.side-menu',
+    });
+</script>

+ 20 - 0
app/view/tender/manage.ejs

@@ -1,3 +1,4 @@
+<% include ./list_sub_menu.ejs %>
 <div class="panel-content">
     <% if (is_finish) { %>
     <% include sub_memu_finish.ejs %>
@@ -21,4 +22,23 @@
     const pid = '<%- pid %>';
     const uphlname = 'user_' + uid + '_pro_' + pid + '_category_hide_manange_list';
     const cache = <%- ctx.session.sessionUser.is_admin %>;
+
+    $.subMenu({
+        menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
+        toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
+        key: 'list.menu.1.0.0',
+        miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
+        callback: function (info) {
+            if (info.mini) {
+                $('.panel-title').addClass('fluid');
+                $('#sub-menu').removeClass('panel-sidebar');
+                $('.c-body table thead').css('left', '56px');
+            } else {
+                $('.panel-title').removeClass('fluid');
+                $('#sub-menu').addClass('panel-sidebar');
+                $('.c-body table thead').css('left', '176px');
+            }
+            autoFlashHeight();
+        }
+    });
 </script>

+ 20 - 0
app/view/tender/progress.ejs

@@ -1,3 +1,4 @@
+<% include ./list_sub_menu.ejs %>
 <div class="panel-content">
     <% if (is_finish) { %>
     <% include sub_memu_finish.ejs %>
@@ -20,4 +21,23 @@
     const uid = '<%- uid %>';
     const pid = '<%- pid %>';
     const uphlname = 'user_' + uid + '_pro_' + pid + '_category_hide_list';
+
+    $.subMenu({
+        menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
+        toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
+        key: 'list.menu.1.0.0',
+        miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
+        callback: function (info) {
+            if (info.mini) {
+                $('.panel-title').addClass('fluid');
+                $('#sub-menu').removeClass('panel-sidebar');
+                $('.c-body table thead').css('left', '56px');
+            } else {
+                $('.panel-title').removeClass('fluid');
+                $('#sub-menu').addClass('panel-sidebar');
+                $('.c-body table thead').css('left', '176px');
+            }
+            autoFlashHeight();
+        }
+    });
 </script>

+ 2 - 1
app/view/tender/sub_memu_finish.ejs

@@ -1,5 +1,6 @@
 <div class="panel-title fluid">
-    <div class="title-main  d-flex justify-content-between">
+    <div class="title-main  d-flex">
+        <% include ./list_sub_mini_menu.ejs %>
         <div>
             <div class="d-inline-block" id="show-level"></div>
             <div class="d-inline-block">

+ 5 - 4
app/view/tender/sub_menu.ejs

@@ -1,5 +1,6 @@
-<div class="panel-title fluid">
-    <div class="title-main  d-flex justify-content-between">
+<div class="panel-title">
+    <div class="title-main d-flex">
+        <% include ./list_sub_mini_menu.ejs %>
         <div>
             <div class="d-inline-block mr-2">
                 <% if (ctx.session.sessionUser.is_admin) { %>
@@ -36,7 +37,7 @@
                 <!--</div>-->
             <!--</div>-->
         </div>
-        <div>
+        <div class="ml-auto">
             <% if (ctx.app.config.is_debug) { %>
             <a href="/compare/tz" class="btn btn-sm btn-primary" target="_blank">统计分析</a>
             <% } %>
@@ -44,7 +45,7 @@
             <a href="#col-set" class="btn btn-sm btn-primary ml-1" data-toggle="modal" data-target="#col-set">列设置</a>
             <% } %>
         </div>
-        <div>
+        <div class="ml-auto">
             <a href="/sp/<%= ctx.subProject.id %>/list/info/finish" class="btn btn-sm btn-primary pull-right ml-1" target="_blank">完工标段</a>
             <% if (userPermission !== null && userPermission.tender !== undefined && userPermission.tender.indexOf('1') !== -1) { %>
             <a href="#add-bd" name="add" data-toggle="modal" data-target="#add-bd" class="btn btn-sm btn-primary pull-right">新建标段</a>

+ 3 - 3
config/menu.js

@@ -111,7 +111,7 @@ const menu = {
         name: '合同管理',
         icon: 'fa-cny',
         display: true,
-        url: '/contract',
+        // url: '/contract/detail',
         children: null,
         caption: '合同管理',
         controller: 'contract',
@@ -371,10 +371,10 @@ const sumMenu = {
 
 const settingMenu = {
     info: {
-        name: '项目信息',
+        name: '平台信息',
         display: true,
         url: '/setting/info',
-        caption: '项目信息',
+        caption: '平台信息',
     },
     user: {
         name: '账号设置',

+ 7 - 0
config/web.js

@@ -58,6 +58,7 @@ const JsFiles = {
             list: {
                 files: ['/public/js/ztree/jquery.ztree.core.js', '/public/js/ztree/jquery.ztree.exedit.js', '/public/js/decimal.min.js', '/public/js/moment/moment.min.js'],
                 mergeFiles: [
+                    '/public/js/sub_menu.js',
                     '/public/js/zh_calc.js',
                     '/public/js/PinYinOrder.bundle.js',
                     '/public/js/shares/tender_list_order.js',
@@ -71,6 +72,7 @@ const JsFiles = {
             info: {
                 files: ['/public/js/ztree/jquery.ztree.core.js', '/public/js/ztree/jquery.ztree.exedit.js', '/public/js/decimal.min.js', '/public/js/moment/moment.min.js'],
                 mergeFiles: [
+                    '/public/js/sub_menu.js',
                     '/public/js/zh_calc.js',
                     '/public/js/PinYinOrder.bundle.js',
                     '/public/js/shares/tender_list_order.js',
@@ -84,6 +86,7 @@ const JsFiles = {
             progress: {
                 files: ['/public/js/ztree/jquery.ztree.core.js', '/public/js/ztree/jquery.ztree.exedit.js', '/public/js/decimal.min.js', '/public/js/moment/moment.min.js'],
                 mergeFiles: [
+                    '/public/js/sub_menu.js',
                     '/public/js/zh_calc.js',
                     '/public/js/PinYinOrder.bundle.js',
                     '/public/js/colResizable/colResizable-1.6.min.js',
@@ -98,6 +101,7 @@ const JsFiles = {
             manage: {
                 files: ['/public/js/ztree/jquery.ztree.core.js', '/public/js/ztree/jquery.ztree.exedit.js', '/public/js/moment/moment.min.js', '/public/js/decimal.min.js'],
                 mergeFiles: [
+                    '/public/js/sub_menu.js',
                     '/public/js/zh_calc.js',
                     '/public/js/PinYinOrder.bundle.js',
                     '/public/js/shares/tender_list_order.js',
@@ -111,6 +115,7 @@ const JsFiles = {
             tenderInfo: {
                 files: ['/public/js/echarts/echarts.min.js', '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js', '/public/js/bootstrap/bootstrap-colorpicker.min.js'],
                 mergeFiles: [
+                    '/public/js/sub_menu.js',
                     '/public/js/spreadjs_rela/spreadjs_zh.js',
                     '/public/js/zh_calc.js',
                     '/public/js/PinYinOrder.bundle.js',
@@ -1704,9 +1709,11 @@ const JsFiles = {
                     '/public/js/moment/moment.min.js',
                 ],
                 mergeFiles: [
+                    '/public/js/sub_menu.js',
                     '/public/js/zh_calc.js',
                     '/public/js/PinYinOrder.bundle.js',
                     '/public/js/shares/tender_list_order.js',
+                    '/public/js/colResizable/colResizable-1.6.min.js',
                     '/public/js/shares/show_level.js',
                     '/public/js/tender_showhide.js',
                     '/public/js/contract_tender.js',