Browse Source

1. 部分图纸管理代码
2. 资料归集,授权用户,选择问题

MaiXinRong 1 tháng trước cách đây
mục cha
commit
8e99038d3b

+ 0 - 25
app/controller/deal_bills_controller.js

@@ -136,31 +136,6 @@ module.exports = app => {
                     } else if (file === '签约清单转换格式.xls') {
                         fileName = this.app.baseDir + '/app/public/deal_bills/转换格式.xls';
                         ctx.body = await fs.readFileSync(fileName);
-                    } else if (file === '签约清单.xlsx') {
-                        const create_time = Date.parse(new Date()) / 1000;
-                        fileName = this.app.baseDir + '/app/public/deal_bills/downloads/' + ctx.tender.id + '-' + create_time + '.xlsx';
-                        await this.ctx.helper.recursiveMkdirSync(this.app.baseDir + '/app/public/deal_bills/downloads');
-                        // todo 导出签约清单Excel
-                        const setting = {
-                            header: ['清单编号', '名称', '单位', '数量', '单价', '金额'],
-                            width: [80, 150, 60, 80, 80, 80],
-                            hAlign: ['left', 'left', 'center', 'right', 'right', 'right'],
-                        };
-                        const dealBills = await ctx.service.dealBills.getAllDataByCondition({ where: { tender_id: ctx.tender.id } });
-                        const data = [];
-                        for (const db of dealBills) {
-                            data.push([db.code, db.name, db.unit, db.quantity, db.unit_price, db.total_price]);
-                        }
-                        const arraySheetData = this.ctx.helper.simpleXlsxSheetData(setting, data);
-                        xlsx.writeFile({
-                            SheetNames: ['Sheet1'],
-                            Sheets: {
-                                'Sheet1': arraySheetData,
-                            },
-                        }, fileName);
-                        ctx.body = await fs.readFileSync(fileName);
-                        // 输出文件后删除
-                        fs.unlinkSync(fileName);
                     }
                 } catch (err) {
                     this.log(err);

+ 78 - 0
app/controller/drawing_controller.js

@@ -0,0 +1,78 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+const sendToWormhole = require('stream-wormhole');
+const path = require('path');
+
+module.exports = app => {
+    class DrawingController extends app.BaseController {
+
+        /**
+         * 图纸管理
+         *
+         * @param ctx
+         * @returns {Promise<void>}
+         */
+        async tender(ctx) {
+            try {
+                if (!ctx.subProject.page_show.drawing) throw '该功能已关闭或无法查看';
+
+                const renderData = {
+                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.drawing.tender),
+                };
+                renderData.tenderList = await ctx.service.tender.getSpecList(ctx.service.drawingPermission, ctx.session.sessionUser.is_admin ? 'all' : '');
+                renderData.categoryData = await this.ctx.service.category.getAllCategory(ctx.subProject);
+                renderData.selfCategoryLevel = this.ctx.subProject.permission.self_category_level;
+                await this.layout('drawing/tender.ejs', renderData, 'drawing/tender_modal.ejs');
+            } catch (err) {
+                ctx.log(err);
+                ctx.postError(err, '查询图纸管理数据错误');
+                ctx.redirect(this.menu.menu.dashboard.url);
+            }
+        }
+
+        async design() {
+
+        }
+
+        async built() {
+
+        }
+
+        async manageUpdate(ctx) {
+            try {
+                this.checkLock(ctx);
+                const data = JSON.parse(ctx.request.body.data);
+                if (!data.updateType) throw '数据错误';
+                let result;
+                const updateData = JSON.parse(JSON.stringify(data));
+                delete updateData.updateType;
+                if (data.updateType === 'add') {
+                    result = await ctx.service.filing.add(updateData);
+                } else if (data.updateType === 'del') {
+                    result = await ctx.service.filing.del(updateData);
+                } else if (data.updateType === 'save') {
+                    result = await ctx.service.filing.save(updateData);
+                } else if (data.updateType === 'move') {
+                    if (!data.id || !(data.tree_order >= 0)) throw '数据错误';
+                    result = await ctx.service.filing.move(updateData);
+                } else if (data.updateType === 'multi' ) {
+                    result = await ctx.service.filing.multiUpdate(ctx.subProject.id, data.data);
+                }
+                ctx.body = { err: 0, msg: '', data: result };
+            } catch (err) {
+                ctx.log(err);
+                ctx.ajaxErrorBody(err, '修改失败');
+            }
+        }
+    }
+
+    return DrawingController;
+};
+

+ 8 - 5
app/lib/rm/tender_budget.js

@@ -64,11 +64,14 @@ class reportMemoryBudget {
     async _getTenderBudget(tid) {
         if (this.getBudget) return;
 
-        const budgets = await this.ctx.service.budget.getBudget(true);
-        this.budget = budgets.find(x => {
-            const relaTender = x.rela_tender.split(',');
-            return relaTender.indexOf(tid + '') >= 0;
-        });
+        if (this.ctx.subProject) this.budget = await this.ctx.service.budget.getDataById(this.ctx.subProject.id);
+        if (!this.budget) {
+            const budgets = await this.ctx.service.budget.getBudget(true);
+            this.budget = budgets.find(x => {
+                const relaTender = x.rela_tender.split(',');
+                return relaTender.indexOf(tid + '') >= 0;
+            });
+        }
         this.getBudget = true;
     }
 

+ 49 - 0
app/public/js/drawing_tender.js

@@ -0,0 +1,49 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+const tenderListSpec = (function(){
+    function getTenderNodeHtml(node, arr, pid) {
+        const html = [];
+        html.push('<tr pid="' + pid + '">');
+        // 名称
+        html.push('<td style="width: 45%" class="in-' + node.level + '">');
+        if (node.cid) {
+            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> ');
+            html.push((node.level === 1 ? '<b>' : ''), node.name, (node.level === 1 ? '</b>' : ''));
+        } else {
+            html.push('<span class="text-muted mr-2">');
+            html.push(arr.indexOf(node) === arr.length - 1 ? '└' : '├');
+            html.push('</span>');
+            html.push('<a href="javascript: void(0)" name="name" id="' + node.id + '">', node.name, '</a>');
+        }
+        html.push('</td>');
+        // 创建时间
+        html.push('<td style="width: 15%">', node.create_time ? moment(node.create_time).format('YYYY-MM-DD HH:mm:ss') : '', '</td>');
+        // 管理
+        html.push('<td style="width: 20%" tid="' + node.id + '">');
+        if (!node.cid) {
+            html.push('<a href="javascript: void(0)" name="edit" class="btn btn-outline-primary btn-sm">成员管理</a>');
+        }
+        html.push('</td>');
+        html.push('</tr>');
+        return html.join('');
+    }
+    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: sticky;left:'+ left +'px;top: 0;">', '<tr>');
+        html.push('<th class="text-center" style="width: 45%">', '标段名称', tenderListOrder.getOrderButton('name'), '</th>');
+        html.push('<th class="text-center" style="width: 15%">', '创建时间', tenderListOrder.getOrderButton('create_time'), '</th>');
+        html.push('<th class="text-center" style="width: 15%">', '操作', '</th>');
+        html.push('</tr>', '</thead>');
+        return html.join('');
+    }
+    return { getTenderNodeHtml, getTenderTreeHeaderHtml }
+})();

+ 7 - 2
app/public/js/file_detail.js

@@ -1283,8 +1283,13 @@ $(document).ready(function() {
                 SpreadJsObj.reLoadRowsData(info.sheet, row);
             });
             this.spread.bind(spreadNS.Events.SelectionChanged, function (e, info) {
-                const node = SpreadJsObj.getSelectObject(info.sheet);
-                self.setCurFiling(node.filing_type);
+                if (info.newSelections[0].col === 1) {
+                    info.sheet.setSelection(info.oldSelections[0].row, info.oldSelections[0].col, info.oldSelections[0].rowCount, info.oldSelections[0].colCount);
+                    SpreadJsObj.reloadRowsBackColor(info.sheet, [info.newSelections[0].row, info.oldSelections[0].row]);
+                } else {
+                    const node = SpreadJsObj.getSelectObject(info.sheet);
+                    self.setCurFiling(node.filing_type);
+                }
             });
 
             $(setting.modal).on('show.bs.modal', () => {

+ 5 - 0
app/router.js

@@ -441,6 +441,11 @@ module.exports = app => {
     app.get('/sp/:id/financial/summary', sessionAuth, subProjectCheck, financialCheck, 'financialController.summary');
     app.post('/sp/:id/financial/summary/load', sessionAuth, subProjectCheck, financialCheck, 'financialController.summaryLoad');
 
+    // 图纸管理
+    // app.get('/sp/:id/drawing/tender', sessionAuth, subProjectCheck, 'drawingController.tender');
+    // app.get('/sp/:id/drawing/design', sessionAuth, subProjectCheck, 'drawingController.design');
+    // app.get('/sp/:id/drawing/as-built', sessionAuth, subProjectCheck, 'drawingController.built');
+
     // ------------------------- 项目内部相关 -----------------------------
 
 

+ 19 - 0
app/service/tender.js

@@ -591,6 +591,25 @@ module.exports = app => {
             return await this.db.update(this.tableName, updateData, { where: { id: tid } });
         }
 
+        // 仅要求授权表用tid/uid授权(条件:存在数据行即授权查看,取消授权直接删除行)
+        // filter目前仅支持['self', 'all'],可随时增加过滤类型
+        async getSpecList(specPermissionService, filter = 'self') {
+            const filterSql = filter === 'all' ? '' : ` AND t.id IN (SELECT tid FROM ${specPermissionService.tableName} WHERE uid = ?) `;
+            const sql = 'SELECT t.`id`, t.`project_id`, t.`name`, t.`status`, t.`category`, t.`user_id`, t.`create_time`, t.`spid`,' +
+                '    pa.`name` As `user_name`, pa.`role` As `user_role`, pa.`company` As `user_company` ' +
+                `  FROM ${this.tableName} As t Left Join ${this.ctx.service.projectAccount.tableName} As pa ON t.user_id = pa.id` +
+                '  WHERE t.`spid` = ? ' + filterSql +
+                '  ORDER BY CONVERT(t.`name` USING GBK) ASC';
+            const sqlParam = [this.ctx.subProject.id];
+            if (filter !== 'all') sqlParam.push(this.ctx.session.sessionUser.accountId);
+            const list = await this.db.query(sql, sqlParam);
+            for (const l of list) {
+                l.category = l.category && l.category !== '' ? JSON.parse(l.category) : null;
+            }
+
+            return list;
+        }
+
         /**
          * 获取你所参与的施工标段的列表
          *

+ 0 - 0
app/view/drawing/as_built.ejs


+ 0 - 0
app/view/drawing/design.ejs


+ 55 - 0
app/view/drawing/tender.ejs

@@ -0,0 +1,55 @@
+<% include ../tender/list_sub_menu.ejs %>
+<div class="panel-content">
+    <div class="panel-title">
+        <div class="title-main d-flex">
+            <% include ../tender/list_sub_mini_menu.ejs %>
+        </div>
+    </div>
+    <div class="content-wrap">
+        <div class="sjs-height-0" style="background-color: #fff">
+            <div class="c-body">
+                <% if (!tenderList || tenderList.length === 0) { %>
+                <div class="jumbotron" id="no-project">
+                    <h3 class="display-6">还没有标段数据</h3>
+                </div>
+                <% } else { %>
+                <table class="table table-bordered">
+                    <tr class="text-center">
+                        <th style="min-width: 200px" class="align-middle">标段名称</th>
+                        <th width="10%" class="align-middle">创建时间</th>
+                        <% if (ctx.session.sessionUser.is_admin) { %>
+                        <th width="10%" class="align-middle">操作</th>
+                        <% } %>
+                    </tr>
+                    <tbody id="projectList">
+                    </tbody>
+                </table>
+                <% } %>
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    const tenders = JSON.parse(unescape('<%- escape(JSON.stringify(tenderList)) %>'));
+    const category = JSON.parse(unescape('<%- escape(JSON.stringify(categoryData)) %>'));
+    const selfCategoryLevel = '<%- (selfCategoryLevel || '') %>';
+
+    $.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', defaultMenu: '<%- ((!ctx.subProject.page_show.openTenderContract && !ctx.subProject.page_show.openConstruction) ? 'miniMenu' : '') %>',
+        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>

+ 0 - 0
app/view/drawing/tender_modal.ejs


+ 0 - 1
app/view/ledger/explode.ejs

@@ -169,7 +169,6 @@
                                 <a href="javascript: void(0);" class="btn btn-sm btn-primary disabled">上传签约清单</a>
                                 <% } %>
                                 <a href="#db-full-code" data-toggle="modal" data-target="#db-full-code" class="btn btn-sm btn-primary">转换长编号</a>
-                                <a href="/tender/<%- ctx.tender.id %>/deal/download/签约清单.xlsx" class="btn btn-sm btn-primary" style="display: none">下载签约清单</a>
                             </div>
                             <div class="ml-auto mr-1">
                                 <div class="dropdown">

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

@@ -14,6 +14,15 @@
     </ul>
 </div>
 <% } %>
+<% if (ctx.subProject.page_show.drawing) { %>
+<div class="nav-box">
+    <ul class="nav-list list-unstyled">
+        <li class="<% if (ctx.url === '/sp/' + ctx.subProject.id + '/drawing/tender') { %>active<% } %>">
+            <a href="/sp/<%- ctx.subProject.id %>/drawing/tender"><span class="ml-3">图纸管理</span></a>
+        </li>
+    </ul>
+</div>
+<% } %>
 <% if (ctx.subProject.page_show.openConstruction) { %>
 <div class="nav-box">
     <ul class="nav-list list-unstyled">

+ 24 - 0
config/web.js

@@ -1387,6 +1387,30 @@ const JsFiles = {
                 mergeFile: 'filing_manage',
             },
         },
+        drawing: {
+            tender: {
+                files: ['/public/js/moment/moment.min.js'],
+                mergeFiles: [
+                    '/public/js/sub_menu.js',
+                    '/public/js/PinYinOrder.bundle.js',
+                    '/public/js/shares/tender_list_order.js',
+                    '/public/js/tender_showhide.js',
+                    '/public/js/drawing_tender.js',
+                    '/public/js/tender_list_base.js',
+                ],
+                mergeFile: 'drawing_tender',
+            },
+            design: {
+                files: [],
+                mergeFiles: [],
+                mergeFile: 'drawing_design',
+            },
+            built: {
+                files: [],
+                mergeFiles: [],
+                mergeFile: 'drawing_built',
+            }
+        },
         budget: {
             list: {
                 files: [