瀏覽代碼

指标库 no.4 up

laiguoran 7 年之前
父節點
當前提交
e07515064d

+ 90 - 0
app/controller/lib_controller.js

@@ -50,6 +50,7 @@ module.exports = app => {
                 const filename = stream.filename.toLowerCase();
                 if(filename === ''){
                     throw '请上传文件';
+                    ctx.redirect('/lib');
                 }
                 const fileInfo = path.parse(filename);
                 let create_time = Date.parse( new Date())/1000;
@@ -85,6 +86,95 @@ module.exports = app => {
                 throw '请上传文件';
             }
         }
+
+        /**
+         * 指标源详细页面
+         *
+         * @param {object} ctx - egg全局context
+         * @return {void}
+         */
+        async detail (ctx) {
+            let lid = ctx.params.id;
+            lid = parseInt(lid);
+
+            try{
+                if(isNaN(lid) || lid < 0){
+                    throw '参数有误';
+                }
+                //获取指标源数据
+                const libInfo = await ctx.service.quotaLib.getLibDataById(lid);
+                // if(libInfo.status === libConst.status.enter){
+                //     throw '指标源已入库';
+                // }
+                const renderData = {
+                    libInfo,
+                    libConst
+                };
+                await this.layout('lib/detail.ejs', renderData, 'lib/detail-modal.ejs');
+            } catch (error) {
+                console.log(error);
+                ctx.redirect('/lib');
+            }
+        }
+
+        /**
+         * 删除指标源
+         *
+         * @param {Object} ctx -egg全局变量
+         * @return {void}
+         */
+        async delete(ctx) {
+            let id = ctx.request.body.del_lib_id;
+            let text = ctx.request.body.del_lib_text;
+            id = parseInt(id);
+
+            try {
+                if (isNaN(id) || id <= 0) {
+                    throw '参数错误';
+                }
+                if(text === undefined || text !== '确认删除'){
+                    throw '参数错误';
+                }
+                const result = ctx.service.quotaLib.deleteLibById(id);
+
+                if (!result) {
+                    throw '删除标段失败';
+                }
+
+                ctx.redirect('/lib');
+            } catch (error) {
+                console.log(error);
+                ctx.redirect(ctx.request.headers.referer);
+            }
+        }
+
+        /**
+         * 指标源入库
+         *
+         * @param {Object} ctx -egg全局变量
+         * @return {void}
+         */
+        async enter(ctx) {
+            let id = ctx.request.body.enter_lib_id;
+            id = parseInt(id);
+
+            try {
+                if (isNaN(id) || id <= 0) {
+                    throw '参数错误';
+                }
+                const result = ctx.service.quotaLib.enterLibById(id);
+
+                if (!result) {
+                    throw '指标入库失败';
+                }
+
+                ctx.redirect('/lib');
+            } catch (error) {
+                console.log(error);
+                ctx.redirect(ctx.request.headers.referer);
+            }
+
+        }
     }
 
     return LibController;

+ 3 - 0
app/router.js

@@ -17,6 +17,9 @@ module.exports = app => {
     // 指标库
     app.get('/lib', sessionAuth, 'libController.index');
     app.post('/lib/upload', sessionAuth, 'libController.upload');
+    app.get('/lib/detail/:id', sessionAuth, 'libController.detail');
+    app.post('/lib/delete', sessionAuth, 'libController.delete');
+    app.post('/lib/enter', sessionAuth, 'libController.enter');
 
     // 指标模板
     app.get('/template', sessionAuth, 'templateController.index');

+ 39 - 0
app/service/quotaLib.js

@@ -78,6 +78,45 @@ module.exports = app => {
             return operate;
         }
 
+        /**
+         * 获取指标源详细页参数
+         *
+         * @return {Array} - 返回单条数据
+         */
+        async getLibDataById(id) {
+            return await this.getDataById(id);
+        }
+
+        /**
+         * 删除指标源
+         *
+         * @param {Object} id - 删除的id
+         * @return {Boolean} - 删除结果
+         */
+        async deleteLibById(id) {
+            return await this.deleteById(id);
+        }
+
+        /**
+         * 指标源入库
+         *
+         * @param {Object} id - 更新的id
+         * @return {Boolean} - 更新结果
+         */
+        async enterLibById(id) {
+
+            const updateData = {
+                status: libConst.status.enter,
+                enter_time: Date.parse( new Date())/1000,
+                id,
+            };
+
+            const result = this.db.update(this.tableName, updateData);
+
+            return result.affectedRows > 0;
+        }
+
+
     }
 
     return QuotaLib;

+ 5 - 5
app/view/layout/layout.ejs

@@ -6,11 +6,11 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=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/main.css">
-    <link rel="stylesheet" href="public/css/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/public/css/bootstrap/bootstrap.min.css">
+    <link rel="stylesheet" href="/public/css/main.css">
+    <link rel="stylesheet" href="/public/css/font-awesome/font-awesome.min.css">
     <!--zTree-->
-    <link rel="stylesheet" href="public/css/ztree/zTreeStyle.css" type="text/css">
+    <link rel="stylesheet" href="/public/css/ztree/zTreeStyle.css" type="text/css">
 
     <script src="/public/js/jquery/jquery-3.2.1.min.js"></script>
     <script src="/public/js/popper/popper.min.js"></script>
@@ -30,7 +30,7 @@
         <div class="header-user pull-right">
             <div class="avatar btn-group">
                 <a class="dropdown-toggle" data-toggle="dropdown">
-                    <span class="pic"><img src="public/images/avatar.png"></span>
+                    <span class="pic"><img src="/public/images/avatar.png"></span>
                     <span><%= ctx.session.userSession.username %></span>
                     <span class="caret"></span>
                 </a>

+ 52 - 0
app/view/lib/detail-modal.ejs

@@ -0,0 +1,52 @@
+<!-- 删除已上报标段 -->
+<div id="del" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">删除确认</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+            </div>
+            <form method="post" action="/lib/delete?_csrf=<%= ctx.csrf %>">
+                <input type="hidden" name="del_lib_id" value="<%= libInfo.id %>">
+                <div class="modal-body">
+                    <div class="form">
+                        <div class="alert alert-danger">
+                            删除	<%= libInfo.filename %> 后数据无法恢复,请谨慎操作;
+                            <br>需要删除,请在以下输入框输入"&nbsp;&nbsp;&nbsp;<b>确认删除</b>&nbsp;&nbsp;&nbsp;",再点击“确认删除”按钮。
+                        </div>
+                        <div class="form-group">
+                            <input class="form-control" type="text" name="del_lib_text"  placeholder="输入 “确认删除”">
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button class="btn btn-danger" type="submit">确认删除</button>
+                    <button class="btn btn-secondary" type="button" data-dismiss="modal" aria-hidden="true">关闭</button>
+                </div>
+            </form>
+        </div>
+    </div>
+</div>
+<!-- 入库 -->
+<div id="storage" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">入库确认</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+            </div>
+            <div class="modal-body">
+                <div class="form">
+                    <h5>入库后,才可以进行指标对比。确认入库后,仍然可以对参数进行重新设置,重新进行指标计算。</h5>
+                </div>
+            </div>
+            <form method="post" action="/lib/enter?_csrf=<%= ctx.csrf %>">
+                <input type="hidden" name="enter_lib_id" value="<%= libInfo.id %>">
+            <div class="modal-footer">
+                <button class="btn btn-primary" type="submit">确认入库</button>
+                <button class="btn btn-secondary" type="button" data-dismiss="modal" aria-hidden="true">关闭</button>
+            </div>
+            </form>
+        </div>
+    </div>
+</div>

+ 215 - 0
app/view/lib/detail.ejs

@@ -0,0 +1,215 @@
+<div class="panel-content">
+    <div class="panel-title fluid">
+        <div class="title-main">
+            <h2>
+                <%= libInfo.filename %>
+                <% if(libInfo.status === libConst.status.pend) { %><a href="#storage" data-toggle="modal" data-target="#storage" class="btn btn-primary btn-sm pull-right">入库</a><% } %>
+                <a href="#del" data-toggle="modal" data-target="#del" class="btn btn-outline-danger btn-sm pull-right">从库中删除</a>
+            </h2>
+        </div>
+    </div>
+    <div class="content-wrap">
+        <div class="c-header p-0 col-12"></div>
+        <div class="c-body">
+            <div class="row">
+                <div class="col-5">
+                    <div class="sjs-height-1">
+                        <table class="table table-bordered table-sm">
+                            <tr>
+                                <th></th>
+                                <th>项目节编号</th>
+                                <th>名称</th>
+                                <th>单位</th>
+                                <th>数量</th>
+                                <th>合价</th>
+                            </tr>
+                            <tr>
+                                <td>1</td>
+                                <td>1</td>
+                                <td>第一部分 建筑安装工程费</td>
+                                <td>公路公里</td>
+                                <td></td>
+                                <td>1045756</td>
+                            </tr>
+                            <tr>
+                                <td>2</td>
+                                <td>1-1</td>
+                                <td>临时工程</td>
+                                <td>公路公里</td>
+                                <td></td>
+                                <td>50000</td>
+                            </tr>
+                            <tr class="table-primary">
+                                <td>3</td>
+                                <td>1-1-1</td>
+                                <td>临时道路</td>
+                                <td>km</td>
+                                <td></td>
+                                <td></td>
+                            </tr>
+                            <tr>
+                                <td>4</td>
+                                <td>1-1-2</td>
+                                <td>临时便桥</td>
+                                <td>m/座</td>
+                                <td></td>
+                                <td></td>
+                            </tr>
+                            <tr>
+                                <td>5</td>
+                                <td>1-1-3</td>
+                                <td>临时轨道铺设</td>
+                                <td>km</td>
+                                <td></td>
+                                <td></td>
+                            </tr>
+                            <tr>
+                                <td>6</td>
+                                <td>1-1-4</td>
+                                <td>临时电力线路</td>
+                                <td>km</td>
+                                <td></td>
+                                <td></td>
+                            </tr>
+                            <tr>
+                                <td>7</td>
+                                <td>1-1-5</td>
+                                <td>临时电力线路</td>
+                                <td>km</td>
+                                <td></td>
+                                <td></td>
+                            </tr>
+                            <tr>
+                                <td>8</td>
+                                <td>1-1-6</td>
+                                <td>临时码头</td>
+                                <td>km</td>
+                                <td></td>
+                                <td></td>
+                            </tr>
+                            <tr>
+                                <td>9</td>
+                                <td>1-1-7</td>
+                                <td>临时道路修建、养护与拆除(包括原道路的养护费)</td>
+                                <td>km</td>
+                                <td></td>
+                                <td></td>
+                            </tr>
+                        </table>
+                    </div>
+                </div>
+                <div class="col-7">
+                    <div class="sjs-height-3">
+                        <table class="table table-bordered table-sm">
+                            <tr>
+                                <th>指标编号</th>
+                                <th>项目或费用名称</th>
+                                <th colspan="2">指标单位</th>
+                                <th>合价(元)</th>
+                                <th>计算规则</th>
+                                <th>指标计算</th>
+                                <th>经济指标</th>
+                            </tr>
+                            <tr>
+                                <td>z1-a</td>
+                                <td>临时道路</td>
+                                <td></td>
+                                <td>km</td>
+                                <td></td>
+                                <td>指新建便道与利用原有道路的总长</td>
+                                <td></td>
+                                <td></td>
+                            </tr>
+                            <tr>
+                                <td>z1-a-1</td>
+                                <td>临时道路公路公里造价</td>
+                                <td>元</td>
+                                <td>公路公里</td>
+                                <td></td>
+                                <td>合价/路线总长度</td>
+                                <td></td>
+                                <td></td>
+                            </tr>
+                            <tr>
+                                <td>z1-a-2</td>
+                                <td>临时道路公里造价</td>
+                                <td>元</td>
+                                <td>km</td>
+                                <td></td>
+                                <td>km指临时道路长度,合价/临时道路长</td>
+                                <td></td>
+                                <td></td>
+                            </tr>
+                            <tr>
+                                <td>z1-a-3</td>
+                                <td>临时道路建筑面积造价</td>
+                                <td>元</td>
+                                <td>m2</td>
+                                <td></td>
+                                <td>合价/(临时道路长度×路基均宽)</td>
+                                <td></td>
+                                <td></td>
+                            </tr>
+                            <tr>
+                                <td>z1-a-4</td>
+                                <td>临时道路造价占比</td>
+                                <td></td>
+                                <td>%</td>
+                                <td></td>
+                                <td>合价/临时工程费用</td>
+                                <td></td>
+                                <td></td>
+                            </tr>
+                            <tr>
+                                <td>z1-a-5</td>
+                                <td>临时道路面积长度比</td>
+                                <td></td>
+                                <td>%</td>
+                                <td></td>
+                                <td>临时道路建筑面积/临时道路长度</td>
+                                <td></td>
+                                <td></td>
+                            </tr>
+                            <tr>
+                                <td>z1-a-6</td>
+                                <td>临时道路路线长度比</td>
+                                <td>km</td>
+                                <td>公路公里</td>
+                                <td></td>
+                                <td>临时道路长度/路线总长度</td>
+                                <td></td>
+                                <td></td>
+                            </tr>
+                        </table>
+                    </div>
+                    <div class="sjs-bottom-2">
+                        <legend class="mt-3">填写参数</legend>
+                        <table class="table table-bordered table-sm">
+                            <tr><th colspan="4" class="text-center">全局参数</th></tr>
+                            <tr><th colspan="4" class="text-center"><b class="text-danger">*全局参数影响所有指标,谨慎修改</b></th></tr>
+                            <tr>
+                                <th>总造价</th><td><input class="form-control form-control-sm"></td>
+                                <th>路线总长度</th><td><input class="form-control form-control-sm"></td>
+                            </tr>
+                            <tr>
+                                <th>路基工程费用</th><td><input class="form-control form-control-sm"></td>
+                                <th>边沟圬工体积</th><td><input class="form-control form-control-sm"></td>
+                            </tr>
+                        </table>
+                        <table class="table table-bordered table-sm">
+                            <tr><th colspan="4" class="text-center">1-1 项目节 参数</th></tr>
+                            <tr>
+                                <th>总造价</th><td><input class="form-control form-control-sm"></td>
+                                <th>路线总长度</th><td><input class="form-control form-control-sm"></td>
+                            </tr>
+                            <tr>
+                                <th>路基工程费用</th><td><input class="form-control form-control-sm"></td>
+                                <th>边沟圬工体积</th><td><input class="form-control form-control-sm"></td>
+                            </tr>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 1 - 1
app/view/lib/modal.ejs

@@ -10,7 +10,7 @@
                 <div class="modal-body">
                     <div class="form-group">
                         <label for="exampleFormControlFile1">上传指标源文件</label>
-                        <div class="form-control"><input class="form-control-file" id="exampleFormControlFile1" name="file" type="file"></div>
+                        <div class="form-control"><input class="form-control-file" id="exampleFormControlFile1" accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" name="file" type="file"></div>
                     </div>
                 </div>
                 <div class="modal-footer">

+ 2 - 2
package.json

@@ -33,9 +33,9 @@
     "stop": "egg-scripts stop --title=egg-server-index_sys",
     "dev": "egg-bin dev --port 7003",
     "dev-qa": "set EGG_SERVER_ENV=qa&&egg-bin dev --port 7003",
-    "dev-local": "set EGG_SERVER_ENV=local && egg-bin dev --port 7003",
+    "dev-local": "set EGG_SERVER_ENV=local&&egg-bin dev --port 7003",
     "debug": "egg-bin debug",
-    "test": "npm run lint -- --fix && npm run test-local",
+    "test": "npm run lint -- --fix&&npm run test-local",
     "test-local": "egg-bin test",
     "test-qa": "set EGG_SERVER_ENV=qa&&egg-bin test",
     "cov": "egg-bin cov",