Browse Source

Merge branch 'dev' of http://192.168.1.41:3000/maixinrong/Calculation into dev

TonyKang 4 years ago
parent
commit
ff8ba571b6

+ 32 - 0
app/controller/schedule_controller.js

@@ -73,6 +73,38 @@ module.exports = app => {
             await this.layout('schedule/plan.ejs', renderData, 'schedule/plan_modal.ejs');
         }
 
+        async stageTp(ctx) {
+            const tender = ctx.tender;
+            const schedule = await ctx.service.schedule.getDataByCondition({ tid: tender.id });
+            const scheduleMonth = await ctx.service.scheduleMonth.getAllDataByCondition({ where: { tid: tender.id }, orders: [['yearmonth', 'asc']] });
+            const renderData = {
+                tender: tender.data,
+                tenderInfo: tender.info,
+                schedule,
+                scheduleMonth,
+                measureType,
+                scheduleLedgerList: await this._getSelectedLedgerList(ctx),
+                jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.schedule.stageTp),
+            };
+            await this.layout('schedule/stage_tp.ejs', renderData, 'schedule/stage_tp_modal.ejs');
+        }
+
+        async stageGcl(ctx) {
+            const tender = ctx.tender;
+            const schedule = await ctx.service.schedule.getDataByCondition({ tid: tender.id });
+            const scheduleMonth = await ctx.service.scheduleMonth.getAllDataByCondition({ where: { tid: tender.id }, orders: [['yearmonth', 'asc']] });
+            const renderData = {
+                tender: tender.data,
+                tenderInfo: tender.info,
+                schedule,
+                scheduleMonth,
+                measureType,
+                scheduleLedgerList: await this._getSelectedLedgerList(ctx),
+                jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.schedule.stageGcl),
+            };
+            await this.layout('schedule/stage_gcl.ejs', renderData, 'schedule/stage_gcl_modal.ejs');
+        }
+
         /**
          * 获取部位明细数据(Ajax)
          *

+ 11 - 8
app/public/js/schedule_plan.js

@@ -98,6 +98,15 @@ $(function () {
         // treeData = setLeafData(treeData);
         // console.log(treeData);
         // let treeData = data;
+        const calcList = ['total_price'];
+        const showList = ['ledger_id', 'ledger_pid', 'order', 'level', 'tender_id', 'full_path',
+            'code', 'name', 'unit', 'dgn_qty1', 'dgn_qty2', 'dgn_price', 'quantity', 'total_price'];
+        for (const m of monthList) {
+            showList.push(m + '_tp');
+            showList.push(m + '_gcl');
+            // calcList.push(m + '_tp');
+            // calcList.push(m + '_gcl');
+        }
         const baseLedgerTree = createNewPathTree('base', {
             id: 'ledger_id',
             pid: 'ledger_pid',
@@ -105,21 +114,15 @@ $(function () {
             level: 'level',
             rootId: -1,
             fullPath: 'full_path',
-            calcFields: ['total_price'],
+            calcFields: calcList,
             calcFun: function (node) {
                 node.dgn_price = ZhCalc.round(ZhCalc.div(node.total_price, node.dgn_qty1), 2);
             }
         });
         const newLedgerList = setMonthToLedger(data.bills, data.slm);
-        console.log(newLedgerList);
         baseLedgerTree.loadDatas(newLedgerList);
         treeCalc.calculateAll(baseLedgerTree);
-        const showList = ['ledger_id', 'ledger_pid', 'order', 'level', 'tender_id', 'full_path',
-            'code', 'name', 'unit', 'dgn_qty1', 'dgn_qty2', 'dgn_price', 'quantity', 'total_price'];
-        for (const m of monthList) {
-            showList.push(m + '_tp');
-            showList.push(m + '_gcl');
-        }
+        console.log(baseLedgerTree);
         for (const d of baseLedgerTree.nodes) {
             if (!d.b_code) {
                 const one = _.find(selectedLedgerList, function (item) {

+ 2 - 0
app/router.js

@@ -441,6 +441,8 @@ module.exports = app => {
     app.post('/tender/:id/schedule/ledger/save', sessionAuth, tenderCheck, uncheckTenderCheck, 'scheduleController.saveLedger');
     app.get('/tender/:id/schedule/plan', sessionAuth, tenderCheck, uncheckTenderCheck, 'scheduleController.plan');
     app.post('/tender/:id/schedule/plan/save', sessionAuth, tenderCheck, uncheckTenderCheck, 'scheduleController.savePlan');
+    app.get('/tender/:id/schedule/stage', sessionAuth, tenderCheck, uncheckTenderCheck, 'scheduleController.stageTp');
+    app.get('/tender/:id/schedule/stage/gcl', sessionAuth, tenderCheck, uncheckTenderCheck, 'scheduleController.stageGcl');
 
     // 书签
     app.post('/tender/:id/ledger/tag', sessionAuth, tenderCheck, uncheckTenderCheck, 'tenderController.billsTag');

+ 20 - 0
app/service/schedule_ledger_month.js

@@ -33,6 +33,9 @@ module.exports = app => {
                     };
                     await transaction.insert(this.tableName, insertData);
                 }
+                // 重新计算本月、总 计划金额和计划工程量
+                await this.calcMonthPlan(transaction, this.ctx.tender.id, data.yearmonth);
+                await this.ctx.service.scheduleMonth.calcPlan(transaction, this.ctx.tender.id);
                 await transaction.commit();
                 return true;
             } catch (err) {
@@ -40,6 +43,23 @@ module.exports = app => {
                 throw err;
             }
         }
+
+        async calcMonthPlan(transaction, tid, yearmonth) {
+            const sql = 'SELECT SUM(`plan_gcl`) as total_plan_gcl, SUM(`plan_tp`) as total_plan_tp FROM ?? WHERE tid = ? and yearmonth = ?';
+            const sqlParam = [this.tableName, tid, yearmonth];
+            const result = await transaction.queryOne(sql, sqlParam);
+            const updateData = {
+                plan_gcl: result.total_plan_gcl,
+                plan_tp: result.total_plan_tp,
+            };
+            const option = {
+                where: {
+                    tid,
+                    yearmonth,
+                },
+            };
+            return await transaction.update(this.ctx.service.scheduleMonth.tableName, updateData, option);
+        }
     }
     return ScheduleLedgerMonth;
 };

+ 18 - 0
app/service/schedule_month.js

@@ -37,6 +37,8 @@ module.exports = app => {
                     await transaction.delete(this.tableName, delData);
                     await transaction.delete(this.ctx.service.scheduleLedgerMonth.tableName, delData);
                 }
+                // 重新计算总 计划金额和计划工程量
+                await this.calcPlan(transaction, this.ctx.tender.id);
                 await transaction.commit();
                 return true;
             } catch (err) {
@@ -44,6 +46,22 @@ module.exports = app => {
                 throw err;
             }
         }
+
+        async calcPlan(transaction, tid) {
+            const sql = 'SELECT SUM(`plan_gcl`) as total_plan_gcl, SUM(`plan_tp`) as total_plan_tp FROM ?? WHERE tid = ?';
+            const sqlParam = [this.tableName, tid];
+            const result = await transaction.queryOne(sql, sqlParam);
+            const updateData = {
+                plan_gcl: result.total_plan_gcl,
+                plan_tp: result.total_plan_tp,
+            };
+            const option = {
+                where: {
+                    tid,
+                },
+            };
+            return await transaction.update(this.ctx.service.schedule.tableName, updateData, option);
+        }
     }
     return ScheduleMonth;
 };

+ 39 - 0
app/view/schedule/stage_gcl.ejs

@@ -0,0 +1,39 @@
+<% include ../tender/tender_sub_menu.ejs %>
+<div class="panel-content">
+    <div class="panel-title">
+        <div class="title-main d-flex">
+            <% include ../tender/tender_sub_mini_menu.ejs %>
+            <div>
+                <div class="d-inline-block">
+                    <div class="btn-group group-tab">
+                        <a class="btn btn-sm btn-light " href="/tender/<%- tender.id %>/schedule/stage">
+                            金额模式
+                        </a>
+                        <a class="btn btn-sm btn-light active" href="javascript:void(0);">
+                            工程量模式
+                        </a>
+                    </div>
+                </div>
+            </div>
+            <div class="ml-auto">
+                <a href="#edit-计量" data-toggle="modal" data-target="#edit-plan" class="btn btn-sm btn-outline-primary">管理计量</a>
+                <a href="" class="btn btn-sm btn-primary" data-toggle="modal" data-target="#add">创建实际计量</a>
+            </div>
+        </div>
+    </div>
+    <div class="content-wrap">
+        <div class="c-body">
+            <div class="sjs-height-0" style="overflow: auto;" id="ledger-spread">
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    const tender = JSON.parse('<%- JSON.stringify(tender) %>');
+    const tenderInfo = JSON.parse(unescape('<%- escape(JSON.stringify(tenderInfo)) %>'));
+    const thousandth = <%- ctx.tender.info.display.thousandth %>;
+    const measureType = JSON.parse('<%- JSON.stringify(measureType) %>');
+    const schedule = JSON.parse('<%- JSON.stringify(schedule) %>');
+    const scheduleMonth = JSON.parse('<%- JSON.stringify(scheduleMonth) %>');
+    const monthList = _.map(scheduleMonth, 'yearmonth');
+</script>

+ 48 - 0
app/view/schedule/stage_gcl_modal.ejs

@@ -0,0 +1,48 @@
+<!--创建新计量进度数据-->
+<div class="modal fade" id="add" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">创建实际计量</h5>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <label>计划进度月</label>
+                    <select class="form-control">
+                        <option>2020年1月</option>
+                        <option>2020年2月</option>
+                        <option>2020年3月</option>
+                    </select>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
+                <button type="button" class="btn btn-sm btn-primary" >确认创建</button>
+            </div>
+        </div>
+    </div>
+</div>
+<!--管理计量-->
+<div class="modal fade" id="edit-plan" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">管理计量</h5>
+            </div>
+            <div class="modal-body">
+                <table class="table table-bordered table-hover">
+                    <tr><th>计量月</th><th width="100">删除</th></tr>
+                    <tr><td>2020-1</td><td></td></tr>
+                    <tr><td>2020-2</td><td><label><input type="checkbox"></label></td></tr>
+                    <tr><td>2020-3</td><td><label><input type="checkbox"></label></td></tr>
+                </table>
+                <div class="alert alert-danger">确认删除「2020-2」「2020-3」计量进度?删除后,数据无法恢复,请谨慎操作。</div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
+                <button type="button" class="btn btn-sm btn-danger" >确认删除</button>
+            </div>
+        </div>
+    </div>
+</div>
+<% include ./modal.ejs %>

+ 52 - 0
app/view/schedule/stage_tp.ejs

@@ -0,0 +1,52 @@
+<% include ../tender/tender_sub_menu.ejs %>
+<div class="panel-content">
+    <div class="panel-title">
+        <div class="title-main d-flex">
+            <% include ../tender/tender_sub_mini_menu.ejs %>
+            <div>
+                <div class="d-inline-block">
+                    <div class="btn-group group-tab">
+                        <a class="btn btn-sm btn-light active" href="javascript:void(0);">
+                            金额模式
+                        </a>
+                        <a class="btn btn-sm btn-light" href="/tender/<%- tender.id %>/schedule/stage/gcl">
+                            工程量模式
+                        </a>
+                    </div>
+                </div>
+                <div class="d-inline-block">
+                    <div class="dropdown">
+                        <button class="btn btn-sm btn-light dropdown-toggle text-primary" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                            2020年3月(第3期)
+                        </button>
+                        <div class="dropdown-menu" aria-labelledby="dropdownMenuButton" x-placement="bottom-start" style="position: absolute; transform: translate3d(0px, 26px, 0px); top: 0px; left: 0px; will-change: transform;">
+                            <a class="dropdown-item" href="#">2020年2月(第2期)</a>
+                        </div>
+                    </div>
+                </div>
+                <div class="d-inline-flex">
+                    <a href="#delete" data-toggle="modal" data-target="#delete" class="btn btn-sm btn-outline-danger">删除本期进度</a>
+                </div>
+            </div>
+            <div class="ml-auto">
+                <a href="" class="btn btn-sm btn-primary" data-toggle="modal" data-target="#add">创建新计量进度</a>
+                <a href="" class="btn btn-sm btn-warning" data-toggle="modal" data-target="#re-build">重新生成本月进度</a>
+            </div>
+        </div>
+    </div>
+    <div class="content-wrap">
+        <div class="c-body">
+            <div class="sjs-height-0" style="overflow: auto;" id="ledger-spread">
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    const tender = JSON.parse('<%- JSON.stringify(tender) %>');
+    const tenderInfo = JSON.parse(unescape('<%- escape(JSON.stringify(tenderInfo)) %>'));
+    const thousandth = <%- ctx.tender.info.display.thousandth %>;
+    const measureType = JSON.parse('<%- JSON.stringify(measureType) %>');
+    const schedule = JSON.parse('<%- JSON.stringify(schedule) %>');
+    const scheduleMonth = JSON.parse('<%- JSON.stringify(scheduleMonth) %>');
+    const monthList = _.map(scheduleMonth, 'yearmonth');
+</script>

+ 74 - 0
app/view/schedule/stage_tp_modal.ejs

@@ -0,0 +1,74 @@
+<!--创建新计量进度数据-->
+<div class="modal fade" id="add" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">创建实际计量</h5>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <label>计划进度月</label>
+                    <select class="form-control">
+                        <option>2020年1月</option>
+                        <option>2020年2月</option>
+                        <option>2020年3月</option>
+                    </select>
+                </div>
+                <div class="form-group">
+                    <label>计量期</label>
+                    <select class="form-control">
+                        <option>第3期</option>
+                    </select>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
+                <button type="button" class="btn btn-sm btn-primary" >确认创建</button>
+            </div>
+        </div>
+    </div>
+</div>
+<!--重新生成本月计量进度-->
+<div class="modal fade" id="re-build" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">重新生成计量进度</h5>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <label>计划进度月:2020年3月</label>
+                </div>
+                <div class="form-group">
+                    <label>计量期</label>
+                    <select class="form-control">
+                        <option>第3期</option>
+                    </select>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
+                <button type="button" class="btn btn-sm btn-primary" >确认生成</button>
+            </div>
+        </div>
+    </div>
+</div>
+<!--删除期-->
+<div class="modal fade" id="delete" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">删除本期计量进度</h5>
+            </div>
+            <div class="modal-body">
+                <h6>确认删除「2020年3月(第3期)」计量进度?</h6>
+                <h6>删除后,数据无法恢复,请谨慎操作。</h6>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
+                <button type="button" class="btn btn-sm btn-danger">确定删除</button>
+            </div>
+        </div>
+    </div>
+</div>
+<% include ./modal.ejs %>

+ 8 - 8
app/view/tender/tender_sub_menu.ejs

@@ -43,14 +43,14 @@
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/material') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/measure/material"><i class="fa fa-line-chart"></i> <span>材料调差</span></a></li>
             </ul>
         </div>
-        <div class="nav-box">
-            <h3><i class="fa fa-bar-chart "></i> 形象进度</h3>
-            <ul class="nav-list list-unstyled sub-list">
-                <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule' || ctx.url === '/tender/' + ctx.tender.id + '/schedule/ledger') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule"><span>进度概况</span></a></li>
-                <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule/plan') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule/plan"><span>计划进度</span></a></li>
-                <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule/stage') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule/stage"><span>计量进度</span></a></li>
-            </ul>
-        </div>
+        <!--<div class="nav-box">-->
+            <!--<h3><i class="fa fa-bar-chart "></i> 形象进度</h3>-->
+            <!--<ul class="nav-list list-unstyled sub-list">-->
+                <!--<li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule' || ctx.url === '/tender/' + ctx.tender.id + '/schedule/ledger') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule"><span>进度概况</span></a></li>-->
+                <!--<li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule/plan') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule/plan"><span>计划进度</span></a></li>-->
+                <!--<li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule/stage' || ctx.url === '/tender/' + ctx.tender.id + '/schedule/stage/gcl') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule/stage"><span>计量进度</span></a></li>-->
+            <!--</ul>-->
+        <!--</div>-->
         <div class="nav-box">
             <ul class="nav-list list-unstyled">
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/report') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/report"><i class="fa fa-file-text-o"></i> <span>报表</span></a></li>

+ 8 - 8
app/view/tender/tender_sub_mini_menu.ejs

@@ -41,14 +41,14 @@
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/material') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/measure/material"><i class="fa fa-line-chart"></i> <span>材料调差</span></a></li>
             </ul>
         </div>
-        <div class="nav-box">
-            <h3><i class="fa fa-bar-chart "></i> 形象进度</h3>
-            <ul class="nav-list list-unstyled sub-list">
-                <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule' || ctx.url === '/tender/' + ctx.tender.id + '/schedule/ledger') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule"><span>进度概况</span></a></li>
-                <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule/plan') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule/plan"><span>计划进度</span></a></li>
-                <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule/stage') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule/stage"><span>计量进度</span></a></li>
-            </ul>
-        </div>
+        <!--<div class="nav-box">-->
+            <!--<h3><i class="fa fa-bar-chart "></i> 形象进度</h3>-->
+            <!--<ul class="nav-list list-unstyled sub-list">-->
+                <!--<li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule' || ctx.url === '/tender/' + ctx.tender.id + '/schedule/ledger') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule"><span>进度概况</span></a></li>-->
+                <!--<li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule/plan') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule/plan"><span>计划进度</span></a></li>-->
+                <!--<li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule/stage' || ctx.url === '/tender/' + ctx.tender.id + '/schedule/stage/gcl') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule/stage"><span>计量进度</span></a></li>-->
+            <!--</ul>-->
+        <!--</div>-->
         <div class="nav-box">
             <ul class="nav-list list-unstyled">
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/report') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/report"><i class="fa fa-file-text-o"></i> <span>报表</span></a></li>

+ 34 - 2
config/web.js

@@ -694,7 +694,7 @@ const JsFiles = {
                     '/public/js/path_tree.js',
                     '/public/js/schedule_ledger.js',
                 ],
-                mergeFile: 'ledger',
+                mergeFile: 'schedule_ledger',
             },
             plan: {
                 files: [
@@ -712,7 +712,39 @@ const JsFiles = {
                     '/public/js/datepicker/datepicker.min.js',
                     '/public/js/datepicker/datepicker.zh.js',
                 ],
-                mergeFile: 'ledger_plan',
+                mergeFile: 'schedule_plan',
+            },
+            stageTp: {
+                files: [
+                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
+                    '/public/js/decimal.min.js',
+                ],
+                mergeFiles: [
+                    '/public/js/sub_menu.js',
+                    '/public/js/div_resizer.js',
+                    '/public/js/spreadjs_rela/spreadjs_zh.js',
+                    '/public/js/shares/sjs_setting.js',
+                    '/public/js/zh_calc.js',
+                    '/public/js/path_tree.js',
+                    // '/public/js/schedule_stage_tp.js',
+                ],
+                mergeFile: 'schedule_stage_tp',
+            },
+            stageGcl: {
+                files: [
+                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
+                    '/public/js/decimal.min.js',
+                ],
+                mergeFiles: [
+                    '/public/js/sub_menu.js',
+                    '/public/js/div_resizer.js',
+                    '/public/js/spreadjs_rela/spreadjs_zh.js',
+                    '/public/js/shares/sjs_setting.js',
+                    '/public/js/zh_calc.js',
+                    '/public/js/path_tree.js',
+                    // '/public/js/schedule_stage_gcl.js',
+                ],
+                mergeFile: 'schedule_stage_gcl',
             },
         },
         change: {