ソースを参照

Merge branch 'master' of http://192.168.1.41:3000/maixinrong/Calculation

TonyKang 5 年 前
コミット
2c0419f711

+ 4 - 1
app/controller/dashboard_controller.js

@@ -36,6 +36,8 @@ module.exports = app => {
             // 获取销售人员数据
             // 获取销售人员数据
             const salesmanData = await ctx.service.manager.getDataById(projectData.manager_id);
             const salesmanData = await ctx.service.manager.getDataById(projectData.manager_id);
             const officeName = officeList[salesmanData.office];
             const officeName = officeList[salesmanData.office];
+            // 获取版本信息
+            const versionList = await ctx.service.version.getAllDataByCondition({ orders: [['id', 'desc']], limit: 5, offset: 0 });
             const renderData = {
             const renderData = {
                 auditTenders,
                 auditTenders,
                 auditStages,
                 auditStages,
@@ -54,8 +56,9 @@ module.exports = app => {
                 projectData,
                 projectData,
                 salesmanData,
                 salesmanData,
                 officeName,
                 officeName,
+                versionList: JSON.parse(JSON.stringify(versionList).replace(/\\r\\n/g, '<br>'))
             };
             };
-            await this.layout('dashboard/index.ejs', renderData);
+            await this.layout('dashboard/index.ejs', renderData, 'dashboard/modal.ejs');
             await ctx.service.projectAccount.defaultUpdate({
             await ctx.service.projectAccount.defaultUpdate({
                 id: this.ctx.session.sessionUser.accountId,
                 id: this.ctx.session.sessionUser.accountId,
                 last_notice: new Date(),
                 last_notice: new Date(),

+ 1 - 1
app/lib/pay_calc.js

@@ -17,7 +17,7 @@ class PayCalculate {
     constructor (ctx, stage, tenderInfo) {
     constructor (ctx, stage, tenderInfo) {
         this.ctx = ctx;
         this.ctx = ctx;
         this.stage = stage;
         this.stage = stage;
-        this.percentReg = /[0-9]+%/g;
+        this.percentReg = /((\d?)|((\d+)(\.\d+)))%/g;
         this.tenderInfo = tenderInfo;
         this.tenderInfo = tenderInfo;
         this.decimal = tenderInfo.decimal.pay ? tenderInfo.decimal.payTp : tenderInfo.decimal.tp;
         this.decimal = tenderInfo.decimal.pay ? tenderInfo.decimal.payTp : tenderInfo.decimal.tp;
         /* 以下变量在调用calculate方法后获得
         /* 以下变量在调用calculate方法后获得

+ 10 - 3
app/public/js/ledger_gather.js

@@ -32,7 +32,12 @@ $(document).ready(() => {
         font: '12px 微软雅黑',
         font: '12px 微软雅黑',
         readOnly: true,
         readOnly: true,
         getColor: function (sheet, data, col, defaultColor) {
         getColor: function (sheet, data, col, defaultColor) {
-            return data && data.differ ? '#FFE699' : defaultColor;
+            return data 
+                ? $('#compare-tag')[0].checked && data.compare_differ 
+                    ? '#f8d7da' 
+                    : (data.differ ? '#FFE699' : defaultColor)
+                : defaultColor;
+            //return data && data.differ ? '#FFE699' : defaultColor;
         }
         }
     });
     });
     const gclSheet = gclSpread.getActiveSheet();
     const gclSheet = gclSpread.getActiveSheet();
@@ -125,7 +130,7 @@ $(document).ready(() => {
         for (const gcl of gclGatherData) {
         for (const gcl of gclGatherData) {
             gcl.compare_qty = ZhCalc.sub(gcl.deal_bills_qty, gcl.quantity);
             gcl.compare_qty = ZhCalc.sub(gcl.deal_bills_qty, gcl.quantity);
             gcl.compare_tp = ZhCalc.sub(gcl.deal_bills_tp, gcl.total_price);
             gcl.compare_tp = ZhCalc.sub(gcl.deal_bills_tp, gcl.total_price);
-            gcl.compare_differ = checkZero(gcl.compare_qty) && checkZero(gcl.compare_tp);
+            gcl.compare_differ = !checkZero(gcl.compare_qty) || !checkZero(gcl.compare_tp);
         }
         }
         SpreadJsObj.loadSheetData(gclSheet, SpreadJsObj.DataType.Data, gclGatherData);
         SpreadJsObj.loadSheetData(gclSheet, SpreadJsObj.DataType.Data, gclGatherData);
         checkCompareData();
         checkCompareData();
@@ -138,7 +143,9 @@ $(document).ready(() => {
         generateChapterHtml(chapterData);
         generateChapterHtml(chapterData);
     }, null, true);
     }, null, true);
 
 
-    $('#compare-tag').click(checkCompareData);
+    $('#compare-tag').click(() => {
+        SpreadJsObj.reLoadSheetData(gclSheet);
+    });
 
 
     // 展开收起附件
     // 展开收起附件
     $('a', '.right-nav').bind('click', function () {
     $('a', '.right-nav').bind('click', function () {

+ 11 - 13
app/public/js/stage_gather.js

@@ -53,7 +53,9 @@ $(document).ready(function () {
     // 初始化工程量清单
     // 初始化工程量清单
     const gclSpread = SpreadJsObj.createNewSpread($('#gcl-spread')[0]);
     const gclSpread = SpreadJsObj.createNewSpread($('#gcl-spread')[0]);
     gclSpreadSetting.getColor = function (sheet, data, col, defaultColor) {
     gclSpreadSetting.getColor = function (sheet, data, col, defaultColor) {
-        return data && data.differ ? '#FFE699' : defaultColor;
+        return data 
+            ? (data.overRange ? '#f8d7da' : data.differ ? '#FFE699' : defaultColor)
+            : defaultColor;
     }
     }
     SpreadJsObj.initSheet(gclSpread.getActiveSheet(), gclSpreadSetting);
     SpreadJsObj.initSheet(gclSpread.getActiveSheet(), gclSpreadSetting);
     // 初始化所属项目节
     // 初始化所属项目节
@@ -95,13 +97,10 @@ $(document).ready(function () {
         }
         }
     }
     }
     // 超计显示
     // 超计显示
-    function checkOverRange() {
-        const sheet = gclSpread.getActiveSheet();
+    function checkOverRange(data) {
         const bQty = $('#customRadio1')[0].checked, bDealQty = $('#customRadio2')[0].checked;
         const bQty = $('#customRadio1')[0].checked, bDealQty = $('#customRadio2')[0].checked;
         const nPercent = Math.min(Math.max(ZhCalc.div(parseFloat($('#over-percent').val()), 100), 0.5), 1);
         const nPercent = Math.min(Math.max(ZhCalc.div(parseFloat($('#over-percent').val()), 100), 0.5), 1);
-        SpreadJsObj.beginMassOperation(sheet);
-        for (let iRow = 0, iLength = sheet.getRowCount(); iRow < iLength; iRow++) {
-            const node = sheet.zh_data[iRow];
+        for (const node of data) {
             if (node) {
             if (node) {
                 const bOverRangeTz = node.end_gather_qty
                 const bOverRangeTz = node.end_gather_qty
                     ? (node.quantity ? node.end_gather_qty > ZhCalc.mul(node.quantity, nPercent) : node.end_gather_qty)
                     ? (node.quantity ? node.end_gather_qty > ZhCalc.mul(node.quantity, nPercent) : node.end_gather_qty)
@@ -109,17 +108,14 @@ $(document).ready(function () {
                 const bOverRangeDeal = node.end_gather_qty
                 const bOverRangeDeal = node.end_gather_qty
                     ? (node.deal_bills_qty ? node.end_gather_qty > ZhCalc.mul(node.deal_bills_qty, nPercent) : node.end_gather_qty)
                     ? (node.deal_bills_qty ? node.end_gather_qty > ZhCalc.mul(node.deal_bills_qty, nPercent) : node.end_gather_qty)
                     : (node.deal_bills_tp ? node.end_gather_tp > ZhCalc.mul(node.deal_bills_tp, nPercent) : node.end_gather_tp);
                     : (node.deal_bills_tp ? node.end_gather_tp > ZhCalc.mul(node.deal_bills_tp, nPercent) : node.end_gather_tp);
-                const bOverRange = bQty ? bOverRangeTz : (bDealQty ? bOverRangeDeal : bOverRangeTz || bOverRangeDeal);
-                const color = bOverRange ? '#f8d7da' : '';
-                sheet.getRange(iRow, -1, 1, -1).backColor(color);
+                node.overRange = bQty ? bOverRangeTz : (bDealQty ? bOverRangeDeal : bOverRangeTz || bOverRangeDeal);
             }
             }
         }
         }
-        SpreadJsObj.endMassOperation(sheet);
     }
     }
     // 加载清单数据
     // 加载清单数据
+    checkOverRange(gclGatherData);
     SpreadJsObj.loadSheetData(gclSpread.getActiveSheet(), SpreadJsObj.DataType.Data, gclGatherData);
     SpreadJsObj.loadSheetData(gclSpread.getActiveSheet(), SpreadJsObj.DataType.Data, gclGatherData);
     loadLeafXmjData(0);
     loadLeafXmjData(0);
-    checkOverRange();
     // 切换清单行,读取所属项目节数据
     // 切换清单行,读取所属项目节数据
     gclSpread.getActiveSheet().bind(spreadNS.Events.SelectionChanged, function (e, info) {
     gclSpread.getActiveSheet().bind(spreadNS.Events.SelectionChanged, function (e, info) {
         const iOldRow = info.oldSelections[0].row, iNewRow = info.newSelections[0].row;
         const iOldRow = info.oldSelections[0].row, iNewRow = info.newSelections[0].row;
@@ -129,14 +125,16 @@ $(document).ready(function () {
     });
     });
     $('.custom-radio').click(() => {
     $('.custom-radio').click(() => {
         setLocalCache('StageGatherOverType', $('input[name=customRadio]:checked').attr('id'));
         setLocalCache('StageGatherOverType', $('input[name=customRadio]:checked').attr('id'));
-        checkOverRange();
+        checkOverRange(gclGatherData);
+        SpreadJsObj.reLoadSheetData(gclSpread.getActiveSheet());
         // 收起菜单
         // 收起菜单
         $('.dropdown-menu').click();
         $('.dropdown-menu').click();
     });
     });
     $('#over-percent').change(function () {
     $('#over-percent').change(function () {
         this.value = this.value >= 50 ? (this.value <= 100 ? ZhCalc.round(this.value, 2) : 100) : 50;
         this.value = this.value >= 50 ? (this.value <= 100 ? ZhCalc.round(this.value, 2) : 100) : 50;
         setLocalCache('StageGatherOverPercent', this.value);
         setLocalCache('StageGatherOverPercent', this.value);
-        checkOverRange();
+        checkOverRange(gclGatherData);
+        SpreadJsObj.reLoadSheetData(gclSpread.getActiveSheet());
     });
     });
     const chapterData = gclGatherModel.gatherChapterData(chapter, ['total_price', 'contract_tp', 'qc_tp', 'pre_contract_tp', 'pre_qc_tp']);
     const chapterData = gclGatherModel.gatherChapterData(chapter, ['total_price', 'contract_tp', 'qc_tp', 'pre_contract_tp', 'pre_qc_tp']);
     for (const c of chapterData) {
     for (const c of chapterData) {

+ 73 - 0
app/service/version.js

@@ -0,0 +1,73 @@
+'use strict';
+
+/**
+ * 版本数据模型
+ *
+ * @author CaiAoLin
+ * @date 2017/10/25
+ * @version
+ */
+
+module.exports = app => {
+
+    class Version extends app.BaseService {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'version';
+        }
+
+        /**
+         * 校验规则
+         *
+         * @return {Object} - 返回校验规则
+         */
+        rule() {
+            return {
+                name: { type: 'string', required: true, allowEmpty: false },
+                content: { type: 'string', required: false, allowEmpty: true },
+            };
+        }
+
+        /**
+         * 查找数据
+         *
+         * @param {Object} data - 筛选表单中的get数据
+         * @return {void}
+         */
+        searchFilter(data) {
+            this.initSqlBuilder();
+        }
+
+        /**
+         * 保存数据
+         *
+         * @param {Object} data - post过来的数据
+         * @param {Number} id - 用于判断修改还是新增的id
+         * @return {boolean} - 操作结果
+         */
+        async save(data, id = 0) {
+            id = parseInt(id);
+            id = isNaN(id) ? 0 : id;
+            delete data._csrf;
+
+            if (id > 0) {
+                delete data.create_time;
+                data.id = id;
+            }
+
+            const operate = id === 0 ? await this.db.insert(this.tableName, data) :
+                await this.db.update(this.tableName, data);
+
+            return operate.affectedRows > 0;
+        }
+    }
+
+    return Version;
+};

+ 7 - 0
app/view/dashboard/index.ejs

@@ -197,6 +197,13 @@
                             <% } %>
                             <% } %>
                         </ul>
                         </ul>
                     </div>
                     </div>
+                    <% if (versionList.length > 0) { %>
+                    <div class="card mt-2">
+                        <div class="card-body">
+                            <a href="#version" data-toggle="modal" data-target="#version">当前版本:<%= versionList[0].name %></a>
+                        </div>
+                    </div>
+                    <% } %>
                 </div>
                 </div>
             </div>
             </div>
         </div>
         </div>

+ 27 - 0
app/view/dashboard/modal.ejs

@@ -0,0 +1,27 @@
+<% if (versionList.length > 0) { %>
+<div class="modal fade" id="version" 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="modal-height-500" style="overflow-y:auto">
+                    <% for (const version of versionList) { %>
+                    <div class="card mt-2">
+                        <div class="card-body">
+                            <h4><%- version.name %></h4>
+                            <p class="card-text"><%= moment(version.create_time * 1000).format('YYYY-MM-DD') %></p>
+                            <p class="card-text"><%- version.content %></p>
+                        </div>
+                    </div>
+                    <% } %>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+<% } %>

+ 1 - 0
app/view/tender/detail_modal.ejs

@@ -930,6 +930,7 @@
             sheet.setText(2, 0, '签约合同价(不含暂列金)');
             sheet.setText(2, 0, '签约合同价(不含暂列金)');
             sheet.setText(3, 0, '签约开工预付款');
             sheet.setText(3, 0, '签约开工预付款');
             sheet.setText(4, 0, '签约材料预付款');
             sheet.setText(4, 0, '签约材料预付款');
+            sheet.getCell(2, 1).locked(true);
             const lineBorder = new spreadNS.LineBorder('#dee2e6', spreadNS.LineStyle.thin);
             const lineBorder = new spreadNS.LineBorder('#dee2e6', spreadNS.LineStyle.thin);
             sheet.getRange(0, 0, 5, 2).setBorder(lineBorder, {all: true});
             sheet.getRange(0, 0, 5, 2).setBorder(lineBorder, {all: true});
             sheet.getRange(0, 0, 5, 2).formatter('@');
             sheet.getRange(0, 0, 5, 2).formatter('@');