ソースを参照

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

TonyKang 5 年 前
コミット
ee856ae287

+ 7 - 10
app/base/base_tree_service.js

@@ -1030,13 +1030,16 @@ class TreeService extends Service {
      * @param {Array} block - 复制节点Id
      * @return {Object} - 提价后的数据(其中新增粘贴数据,只返回第一层)
      */
-    async pasteBlock(mid, kid, block) {
+    async pasteBlock(mid, kid, paste) {
         if ((mid <= 0) || (kid <= 0)) return [];
 
+        console.log(mid);
+        console.log(kid);
+        console.log(paste);
         const selectData = await this.getDataByKid(mid, kid);
         if (!selectData) throw '数据错误';
 
-        const copyNodes = await this.getDataByNodeIds(mid, block);
+        const copyNodes = await this.getDataByNodeIds(paste.tid, paste.block);
         if (!copyNodes || copyNodes.length <= 0)  throw '复制数据错误';
         for (const node of copyNodes) {
             if (node[this.setting.pid] !== copyNodes[0][this.setting.pid]) throw '复制数据错误:仅可操作同层节点';
@@ -1048,7 +1051,7 @@ class TreeService extends Service {
         this.transaction = await this.db.beginTransaction();
         try {
             // 选中节点的所有后兄弟节点,order+粘贴节点个数
-            await this._updateSelectNextsOrder(selectData, copyNodes.length);
+            await this._updateChildrenOrder(mid, selectData[this.setting.pid], selectData[this.setting.order], copyNodes.length);
             for (let iNode = 0; iNode < copyNodes.length; iNode++) {
                 const node = copyNodes[iNode];
                 let datas = await this.getDataByFullPath(mid, node[this.setting.fullPath] + '%');
@@ -1102,13 +1105,7 @@ class TreeService extends Service {
         }
 
         // 查询应返回的结果
-        const createData = await this.getDataByIds(newIds);
-        const updateData = await this.getNextsData(selectData[this.setting.mid], selectData[this.setting.pid], selectData[this.setting.order] + copyNodes.length);
-        //const posData = await this.ctx.service.pos.getPosData({ lid: newIds });
-        return {
-            ledger: { create: createData, update: updateData },
-            //pos: posData,
-        };
+        return await this.getPasteBlockResult(selectData, copyNodes);
     }
 
 }

+ 1 - 1
app/controller/ledger_controller.js

@@ -222,7 +222,7 @@ module.exports = app => {
             if ((isNaN(data.id) || data.id <= 0) ||
                 (!data.tid && data.tid <= 0) ||
                 (!data.block || data.block.length <= 0)) throw '参数错误';
-            return await ctx.service.ledger.pasteBlock(data.tid, data.id, data.block);
+            return await ctx.service.ledger.pasteBlock(ctx.tender.id, data.id, {tid: data.tid, block: data.block});
         }
         /**
          * 从标准项目表添加数据

+ 3 - 0
app/controller/measure_controller.js

@@ -107,6 +107,9 @@ module.exports = app => {
                 }
                 const date = ctx.request.body.date;
                 const period = ctx.request.body.period;
+                if (!date || !period) {
+                    throw '请选择计量年月和开始-截止日期';
+                }
                 const newStage = await ctx.service.stage.addStage(ctx.tender.id, date, period);
                 if (!newStage) {
                     throw '新增计量期失败,请重试';

+ 1 - 1
app/controller/revise_controller.js

@@ -432,7 +432,7 @@ module.exports = app => {
             if ((isNaN(data.id) || data.id <= 0) ||
                 (!data.tid && data.tid <= 0) ||
                 (!data.block || data.block.length <= 0)) throw '参数错误';
-            return await this.ctx.service.revise.pasteBlock(data.tid, data.id, data.block);
+            return await this.ctx.service.revise.pasteBlock(ctx.tender.id, data.id, {tid: data.tid, block: data.block});
         }
         async _addStd(revise, data) {
             if ((isNaN(data.id) || data.id <= 0) || !data.stdType || !data.stdNode) throw '参数错误';

+ 7 - 6
app/lib/rpt_data_analysis.js

@@ -57,13 +57,15 @@ const changeSort = {
      * @param options - 计算设置
      */
     fun: function(ctx, data, fieldsKey, options) {
-        if (!data.change) return;
+        const change = options && options.change ? data[options.change] : data.change;
+        if (!change) return;
         // 变更令排序
-        data.change.sort(function (a, b) {
+        change.sort(function (a, b) {
             return a.code.localeCompare(b.code);
         });
-        if (data.change_audit_list) {
-            data.change_audit_list.sort(function (a, b) {
+        const changeBills = options && options.changeBills ? data[options.changeBills] : data.change_audit_list;
+        if (changeBills) {
+            changeBills.sort(function (a, b) {
                 const aCIndex = data.change.findIndex(function (c) {
                     return c.cid === a.cid;
                 });
@@ -378,7 +380,7 @@ const gatherChapter = {
                 if (m.node_type === d.node_type) return true;
             } else if (m.field) {
                 const value = d[m.field];
-                if (m.part) {
+                if (m.part && value) {
                     if (value.indexOf(m.part) >= 0) return true;
                 }
             }
@@ -451,7 +453,6 @@ const gatherChapter = {
                 return true;
             }
         });
-        //console.log(data[fieldsKey[0].table]);
     },
 };
 const join = {

+ 29 - 5
app/public/js/ledger.js

@@ -967,7 +967,7 @@ $(document).ready(function() {
             }
         }
         this.addClass(item._icon);
-        const $obj = $('<div>' + item.name + '<input class="text-right ml-1 mr-1" type="tel" max="20" min="1" value="' + item.value + '" style="width: 30px; height: 18px; padding-right: 4px;">行</div>')
+        const $obj = $('<div>' + item.name + '<input class="text-right ml-1 mr-1" type="tel" max="100" min="1" value="' + item.value + '" style="width: 30px; height: 18px; padding-right: 4px;">行</div>')
             .appendTo(this);
         const $input = $obj.find('input');
         const event = () => {
@@ -1381,7 +1381,7 @@ $(document).ready(function() {
                         data.updateData = {id: posData.id, name: newText};
                     }
                 } else if (!posData) {
-                    toastr.warning('新增部位请先输入名称');
+                    toastr.warning('新增计量单元请先输入名称');
                     SpreadJsObj.reLoadRowData(info.sheet, info.row);
                     return;
                 } else {
@@ -1523,7 +1523,7 @@ $(document).ready(function() {
                 const sortData = info.sheet.zh_data || [];
                 if (sortData.length === 0 || info.cellRange.row + info.cellRange.rowCount > sortData.length) {
                     if (info.cellRange.col !== 0) {
-                        toastr.warning('新增部位请先输入名称');
+                        toastr.warning('新增计量单元请先输入名称');
                         posOperationObj.loadCurPosData();
                         return;
                     }
@@ -2088,7 +2088,7 @@ $(document).ready(function() {
                             const index = qdSheet.getRowCount();
                             qdSheet.getCell(qdSheet.getRowCount() - 1, 0, spreadNS.SheetArea.rowHeader).text('清单' + index);
                             posSheet.addColumns(posSheet.getColumnCount(), 1);
-                            posSheet.getCell(0, index + 2, spreadNS.SheetArea.colHeader).text('清单' + index);
+                            posSheet.getCell(0, index + 2 - 1, spreadNS.SheetArea.colHeader).text('清单' + index);
                         },
                     },
                     'delete': {
@@ -2135,10 +2135,33 @@ $(document).ready(function() {
 
                     const colCount = posSheet.getColumnCount() + 1
                     posSheet.setColumnCount(colCount);
-                    posSheet.getCell(0, colCount - 1, GC.Spread.Sheets.SheetArea.colHeader).text('数量' + count);
+                    posSheet.getCell(0, colCount - 1, GC.Spread.Sheets.SheetArea.colHeader).text('清单' + count);
                 }
                 qdSheet.setSelection(sel.row + 1, sel.col, 1, 1);
             });
+            this.qdSpread.bind(spreadNS.Events.ClipboardPasted, function (e, info) {
+                const billsCount = info.sheet.getRowCount(), posSheet = self.posSpread.getActiveSheet();
+                const count = posSheet.getColumnCount() - 2;
+                if (billsCount > count) {
+                    posSheet.setColumnCount(billsCount + 2);
+                    for (let i = count + 1; i <= billsCount; i++) {
+                        info.sheet.getCell(i - 1, 0, spreadNS.SheetArea.rowHeader).text('清单' + i);
+                        posSheet.getCell(0, i + 2 - 1, spreadNS.SheetArea.colHeader).text('清单' + i);
+                    }
+                }
+            });
+            this.qdSpread.bind(spreadNS.Events.EditEnded, function (e, info) {
+                if (info.col === 0) {
+                    const dealBills = self.dealSpread.getActiveSheet().zh_data;
+                    if (dealBills && dealBills.length > 0) {
+                        const bills = _.find(dealBills, {code: info.editingText});
+                        if (bills) {
+                            info.sheet.getCell(info.row, 1).value(bills.name);
+                            info.sheet.getCell(info.row, 2).value(bills.unit);
+                        }
+                    }
+                }
+            });
 
             this.obj.bind('shown.bs.modal', function () {
                 self.qdSpread.refresh();
@@ -2175,6 +2198,7 @@ $(document).ready(function() {
         initView () {
             // 初始化 清单编号
             const qdSheet = this.qdSpread.getActiveSheet();
+            qdSheet.setColumnWidth(0, 45, spreadNS.SheetArea.rowHeader);
             SpreadJsObj.initSheet(qdSheet, this.qdSpreadSetting);
             SpreadJsObj.refreshColumnAlign(qdSheet);
             // 清理原有数据

+ 8 - 0
app/public/js/measure_stage.js

@@ -87,6 +87,14 @@ $('a[data-target="#sp-list" ]').on('click', function () {
 });
 
 function checkValidForm() {
+    if ($('#add-qi input[name="date"]').val() === '') {
+        toastr.error('请选择计量年月');
+        return false;
+    }
+    if ($('#add-qi input[name="period"]').val() === '') {
+        toastr.error('请选择开始-截止日期');
+        return false;
+    }
     $('#add-stage-btn').attr('disabled', true);
     $('#hide-all').show();
     return true;

+ 67 - 3
app/public/js/revise.js

@@ -1066,7 +1066,7 @@ $(document).ready(() => {
                     data.postData = {id: posData.id, name: newText};
                 }
             } else if (!posData) {
-                toastr.warning('新增部位请先输入名称');
+                toastr.warning('新增计量单元请先输入名称');
                 SpreadJsObj.reLoadRowData(info.sheet, info.row);
                 return;
             } else {
@@ -1224,7 +1224,7 @@ $(document).ready(() => {
             const sortData = info.sheet.zh_data || [];
             if (sortData.length === 0 || info.cellRange.row + info.cellRange.rowCount > sortData.length) {
                 if (info.cellRange.col !== 0) {
-                    toastr.warning('新增部位请先输入名称');
+                    toastr.warning('新增计量单元请先输入名称');
                     posSpreadObj.loadCurPosData();
                     return;
                 }
@@ -1614,11 +1614,34 @@ $(document).ready(() => {
 
                     const colCount = posSheet.getColumnCount() + 1;
                     posSheet.setColumnCount(colCount);
-                    posSheet.getCell(0, colCount - 1, GC.Spread.Sheets.SheetArea.colHeader).text('数量' + count);
+                    posSheet.getCell(0, colCount - 1, GC.Spread.Sheets.SheetArea.colHeader).text('清单' + count);
                 }
                 qdSheet.setSelection(sel.row + 1, sel.col, 1, 1);
                 qdSheet.getParent().focus();
             });
+            this.qdSpread.bind(spreadNS.Events.ClipboardPasted, function (e, info) {
+                const billsCount = info.sheet.getRowCount(), posSheet = self.posSpread.getActiveSheet();
+                const count = posSheet.getColumnCount() - 2;
+                if (billsCount > count) {
+                    posSheet.setColumnCount(billsCount + 2);
+                    for (let i = count + 1; i <= billsCount; i++) {
+                        info.sheet.getCell(i - 1, 0, spreadNS.SheetArea.rowHeader).text('清单' + i);
+                        posSheet.getCell(0, i + 2 - 1, spreadNS.SheetArea.colHeader).text('清单' + i);
+                    }
+                }
+            });
+            this.qdSpread.bind(spreadNS.Events.EditEnded, function (e, info) {
+                if (info.col === 0) {
+                    const dealBills = self.dealSpread.getActiveSheet().zh_data;
+                    if (dealBills && dealBills.length > 0) {
+                        const bills = _.find(dealBills, {code: info.editingText});
+                        if (bills) {
+                            info.sheet.getCell(info.row, 1).value(bills.name);
+                            info.sheet.getCell(info.row, 2).value(bills.unit);
+                        }
+                    }
+                }
+            });
 
             this.obj.bind('shown.bs.modal', function () {
                 self.qdSpread.refresh();
@@ -1645,6 +1668,47 @@ $(document).ready(() => {
                     }, null, true);
                 }
             });
+
+            $.contextMenu({
+                selector: '.batch-l-t',
+                build: function ($trigger, e) {
+                    const target = SpreadJsObj.safeRightClickSelection($trigger, e, self.qdSpread);
+                    return target.hitTestType === spreadNS.SheetArea.viewport || target.hitTestType === spreadNS.SheetArea.rowHeader;
+                },
+                items: {
+                    'create': {
+                        name: '新增行',
+                        icon: 'fa-sign-in',
+                        callback: function (key, opt) {
+                            const qdSheet = self.qdSpread.getActiveSheet();
+                            const posSheet = self.posSpread.getActiveSheet();
+                            qdSheet.addRows(qdSheet.getRowCount(), 1);
+                            const index = qdSheet.getRowCount();
+                            qdSheet.getCell(qdSheet.getRowCount() - 1, 0, spreadNS.SheetArea.rowHeader).text('清单' + index);
+                            posSheet.addColumns(posSheet.getColumnCount(), 1);
+                            posSheet.getCell(0, index + 2 - 1, spreadNS.SheetArea.colHeader).text('清单' + index);
+                        },
+                    },
+                    'delete': {
+                        name: '删除行',
+                        icon: 'fa-remove',
+                        callback: function (key, opt) {
+                            const qdSheet = self.qdSpread.getActiveSheet();
+                            const posSheet = self.posSpread.getActiveSheet();
+                            const sel = qdSheet.getSelections()[0];
+                            qdSheet.deleteRows(sel.row, sel.rowCount);
+                            posSheet.deleteColumns(sel.row + 2, sel.rowCount);
+                            for (let iRow = 0, iLen = qdSheet.getRowCount(); iRow < iLen; iRow++) {
+                                qdSheet.getCell(iRow, 0, spreadNS.SheetArea.rowHeader).text('清单' + (iRow+1));
+                            }
+                            for (let iCol = 0, iLen = posSheet.getColumnCount() - 2; iCol < iLen; iCol++) {
+                                posSheet.getCell(0, iCol + 2, spreadNS.SheetArea.colHeader).text('清单' + (iCol+1));
+                            }
+                            qdSheet.setSelection(sel.row, sel.col, 1, 1);
+                        },
+                    },
+                }
+            });
         }
         // 初始化左侧表格
         initView () {

+ 2 - 2
app/public/js/stage.js

@@ -1069,7 +1069,7 @@ $(document).ready(() => {
                         data.updateData = {pid: posData.id, lid: posData.lid, name: newText};
                     }
                 } else if (!posData) {
-                    toastr.warning('新增部位请先输入名称');
+                    toastr.warning('新增计量单元请先输入名称');
                 } else {
                     data.updateType = 'update';
                     data.updateData = {pid: posData.id, lid: posData.lid};
@@ -1149,7 +1149,7 @@ $(document).ready(() => {
                 if (sortData && (info.cellRange.row >= sortData.length)) {
                     data.updateType = 'add';
                     if (info.cellRange.col !== 0) {
-                        toastr.warning('新增部位请先输入名称');
+                        toastr.warning('新增计量单元请先输入名称');
                         stagePosSpreadObj.loadCurPosData();
                         return;
                     }

+ 12 - 9
app/public/report/js/rpt_main.js

@@ -316,16 +316,19 @@ let zTreeOprObj = {
                     JpcCanvasOutput.cleanCanvas(canvas);
                     JpcCanvasOutput.drawPageBorder(me.currentRptPageRst, canvas, getScreenDPI());
                 }
-                if (is_debug && result.debugInfo) {
-                    console.log('含有key的debug信息:');
-                    for (const k in result.debugInfo.key) {
-                        console.log(k + ':', ...result.debugInfo.key[k]);
-                    }
-                    //console.log(result.debugInfo.key);
-                    console.log('其他debug信息:');
-                    for (const di of result.debugInfo.other) {
-                        console.log(...di);
+                try {
+                    if (is_debug && result.debugInfo) {
+                        console.log('含有key的debug信息:');
+                        for (const k in result.debugInfo.key) {
+                            console.log(k + ':', ...result.debugInfo.key[k]);
+                        }
+                        //console.log(result.debugInfo.key);
+                        console.log('其他debug信息:');
+                        for (const di of result.debugInfo.other) {
+                            console.log(...di);
+                        }
                     }
+                } catch(err) {
                 }
             }, function(err){
                 // hintBox.unWaitBox();

+ 19 - 6
app/reports/rpt_component/jpc_flow_tab.js

@@ -14,7 +14,7 @@ const JpcAreaHelper = require('./helper/jpc_helper_area');
 const fsUtil = require('../public/fsUtil');
 const strUtil = require('../public/stringUtil');
 const fontWidthMap = require('./helper/jpc_helper_font_width');
-
+const bc = require('../../lib/base_calc.js');
 
 const JpcFlowTabSrv = function() {};
 JpcFlowTabSrv.prototype.createNew = function() {
@@ -244,12 +244,19 @@ JpcFlowTabSrv.prototype.createNew = function() {
                             }
                         }
                     }
+                    // for (let j = 0; j < me.segments[i].length; j++) {
+                    //     // 3. start to sum
+                    //     // rowGrandTotal[di] = rowGrandTotal[di] + 1.0 * JpcFieldHelper.getValue(data_fields[di], me.segments[i][j]);
+                    //     const sv = JpcFieldHelper.getValue(data_fields[di], me.segments[i][j]);
+                    //     if (sv) {
+                    //         rowGrandTotal[di] = rowGrandTotal[di] + parseFloat(parseFloat(sv).toFixed(precisionAmt));
+                    //     }
+                    // }
                     for (let j = 0; j < me.segments[i].length; j++) {
-                        // 3. start to sum
-                        // rowGrandTotal[di] = rowGrandTotal[di] + 1.0 * JpcFieldHelper.getValue(data_fields[di], me.segments[i][j]);
-                        const sv = JpcFieldHelper.getValue(data_fields[di], me.segments[i][j]);
+                        let sv = JpcFieldHelper.getValue(data_fields[di], me.segments[i][j]);
                         if (sv) {
-                            rowGrandTotal[di] = rowGrandTotal[di] + parseFloat(parseFloat(sv).toFixed(precisionAmt));
+                            if (typeof sv === 'string') sv = parseFloat(sv);
+                            rowGrandTotal[di] = bc.add(rowGrandTotal[di] ? rowGrandTotal[di] : 0, sv ? sv: 0);
                         }
                     }
                 }
@@ -285,7 +292,13 @@ JpcFlowTabSrv.prototype.createNew = function() {
                         }
                     }
                     // sumV += parseFloat(JpcFieldHelper.getValue(data_field, segDataIdx[si]));
-                    sumV += parseFloat(parseFloat(JpcFieldHelper.getValue(data_field, segDataIdx[si])).toFixed(precisionAmt));
+
+                    let sv = JpcFieldHelper.getValue(data_field, segDataIdx[si]);
+                    if (sv) {
+                        if (typeof sv === 'string') sv = parseFloat(sv);
+                        sumV = bc.add(sumV, sv ? sv : 0);
+                    }
+                    //sumV += parseFloat(parseFloat(JpcFieldHelper.getValue(data_field, segDataIdx[si])).toFixed(precisionAmt));
                 }
                 // me.group_sum_values[segIdx][j].push(sumV);
                 me.group_sum_values[segIdx][me.group_sum_fields[j][JV.PROP_SUM_KEY]].push(sumV);

+ 26 - 14
app/service/ledger.js

@@ -300,7 +300,7 @@ module.exports = app => {
          * @param {Array} block - 复制节点Id
          * @return {Object} - 提价后的数据(其中新增粘贴数据,只返回第一层)
          */
-        async pasteBlock(tenderId, selectId, block) {
+        async pasteBlock(tenderId, selectId, paste) {
             if ((tenderId <= 0) || (selectId <= 0)) {
                 return [];
             }
@@ -310,7 +310,7 @@ module.exports = app => {
             }
             const newParentPath = selectData.full_path.replace(selectData.ledger_id, '');
 
-            const copyNodes = await this.getDataByNodeIds(tenderId, block);
+            const copyNodes = await this.getDataByNodeIds(paste.tid, paste.block);
             if (!copyNodes || copyNodes.length <= 0) {
                 throw '复制数据错误';
             }
@@ -330,17 +330,25 @@ module.exports = app => {
             this.transaction = await this.db.beginTransaction();
             try {
                 // 选中节点的所有后兄弟节点,order+粘贴节点个数
-                await this._updateChildrenOrder(tenderId, selectData.ledger_pid, selectData.order + 1);
+                await this._updateChildrenOrder(tenderId, selectData.ledger_pid, selectData.order + 1, copyNodes.length);
                 // 数据库创建新增节点数据
                 for (let iNode = 0; iNode < copyNodes.length; iNode++) {
                     const node = copyNodes[iNode];
-                    let datas = await this.getDataByFullPath(tenderId, node.full_path + '%');
+                    let datas = await this.getDataByFullPath(paste.tid, node.full_path + '%');
                     datas = this._.sortBy(datas, 'level');
 
                     const maxId = await this._getMaxLid(this.ctx.tender.id);
 
                     const leafBillsId = [];
                     // 计算粘贴数据中需更新部分
+                    datas.sort(function (x, y) {
+                        return x.level - y.level;
+                    });
+                    for (const data of datas) {
+                        data.children = datas.filter(function (x) {
+                            return x.ledger_pid === data.ledger_id;
+                        })
+                    }
                     for (let index = 0; index < datas.length; index++) {
                         const data = datas[index];
                         const newId = maxId + index + 1;
@@ -350,18 +358,12 @@ module.exports = app => {
                         data.id = this.uuid.v4();
                         idChange.new = data.id;
                         data.tender_id = this.ctx.tender.id;
-                        if (!data.is_leaf) {
-                            for (const children of datas) {
-                                children.full_path = children.full_path.replace('-' + data.ledger_id, '-' + newId);
-                                if (children.ledger_pid === data.ledger_id) {
-                                    children.ledger_pid = newId;
-                                }
+                        if (data.children && data.children.length > 0) {
+                            for (const child of data.children) {
+                                child.ledger_pid = newId;
                             }
-                        } else {
-                            data.full_path = data.full_path.replace('-' + data.ledger_id, '-' + newId);
                         }
                         data.ledger_id = newId;
-                        data.full_path = data.full_path.replace(orgParentPath, newParentPath);
                         if (data.ledger_pid === node.ledger_pid) {
                             data.ledger_pid = selectData.ledger_pid;
                             data.order = selectData.order + iNode + 1;
@@ -372,6 +374,17 @@ module.exports = app => {
                         }
                         newIds.push(data.id);
                     }
+                    for (const data of datas) {
+                        delete data.children;
+                        const p = datas.find(function (x) {
+                            return x.ledger_id === data.ledger_pid;
+                        });
+                        if (p) {
+                            data.full_path = p.full_path + '-' + data.ledger_id;
+                        } else {
+                            data.full_path = newParentPath + '' + data.ledger_id;
+                        }
+                    }
                     const newData = await this.transaction.insert(this.tableName, datas);
                     for (const id of leafBillsId) {
                         await this.ctx.service.pos.copyBillsPosData(id.org, id.new, this.transaction);
@@ -384,7 +397,6 @@ module.exports = app => {
                 throw err;
             }
 
-
             // 查询应返回的结果
             const order = [];
             for (let i = 1; i <= copyNodes.length; i++) {

+ 2 - 2
app/service/report_memory.js

@@ -354,7 +354,7 @@ module.exports = app => {
                     ]);
                 }
             }
-            if (this._checkFieldsExist(fields, preFields)) {
+            if (this._checkFieldsExist(fields, preFields.concat(endFields, finalFields))) {
                 const preStage = this.ctx.stage.order > 1 ? await this.ctx.service.stageBillsFinal.getFinalData(this.ctx.tender, this.ctx.stage.order - 1) : [];
                 this.ctx.helper.assignRelaData(billsData, [
                     {data: preStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'pre_', relaId: 'lid'}
@@ -467,7 +467,7 @@ module.exports = app => {
                 ]);
             }
 
-            if (this._checkFieldsExist(fields, preFields)) {
+            if (this._checkFieldsExist(fields, preFields.concat(endFields, finalFields))) {
                 const preStage = this.ctx.stage.order > 1 ? await this.ctx.service.stageBillsFinal.getFinalData(this.ctx.tender, this.ctx.stage.order - 1) : [];
                 this.ctx.helper.assignRelaData(billsData, [
                     {data: preStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'pre_', relaId: 'lid'}

+ 4 - 2
app/view/ledger/explode_modal.ejs

@@ -110,6 +110,7 @@
                     <div class="card-header">
                         审批流程
                     </div>
+                    <div class="modal-height-500" style="overflow: auto">
                     <ul class="list-group list-group-flush" id="auditors">
                         <% for (let i = 0, iLen = auditorList.length; i < iLen; i++) { %>
                         <li class="list-group-item" auditorId="<%- auditorList[i].audit_id %>">
@@ -119,6 +120,7 @@
                         </li>
                         <% } %>
                     </ul>
+                    </div>
                 </div>
             </div>
             <form class="modal-footer" method="post" action="/tender/<%- tender.id %>/ledger/audit/start" onsubmit="return checkAuditorFrom()">
@@ -140,7 +142,7 @@
             </div>
             <div class="modal-body">
                 <div class="row">
-                    <div class="col-4">
+                    <div class="col-4 modal-height-500" style="overflow: auto">
                         <a href="#sub-sp" data-toggle="modal" data-target="#sub-sp" id="hideSp">修改审批流程</a>
                         <div class="card mt-3">
                             <ul class="list-group list-group-flush">
@@ -402,4 +404,4 @@
 </div>
 <% } %>
 <% include ../shares/merge_peg_modal.ejs %>
-<% include ../shares/import_excel_modal.ejs %>
+<% include ../shares/import_excel_modal.ejs %>

+ 3 - 1
app/view/material/audit_modal.ejs

@@ -30,6 +30,7 @@
                     <div class="card-header">
                         审批流程
                     </div>
+                    <div class="modal-height-500" style="overflow: auto">
                     <ul class="list-group list-group-flush" id="auditors">
                         <% for (let i = 0, iLen = ctx.material.auditorList.length; i < iLen; i++) { %>
                         <li class="list-group-item" auditorId="<%- ctx.material.auditorList[i].aid %>">
@@ -39,6 +40,7 @@
                         </li>
                         <% } %>
                     </ul>
+                    </div>
                 </div>
             </div>
             <form class="modal-footer" method="post" action="<%- preUrl %>/audit/start" onsubmit="return checkAuditorFrom()">
@@ -567,7 +569,7 @@
                 </div>
                 <div class="modal-body">
                     <div class="row">
-                        <div class="col-4">
+                        <div class="col-4 modal-height-500" style="overflow: auto">
                             <a href="#sub-sp" data-toggle="modal" data-target="#sub-sp" id="hideSp">修改审批流程</a>
                             <div class="card mt-3">
                                 <ul class="list-group list-group-flush">

+ 20 - 9
app/view/measure/stage_modal.ejs

@@ -13,12 +13,12 @@
                     <input class="form-control form-control-sm" value="第 <%- stages.length + 1 %> 期" type="text" readonly="">
                 </div>
                 <div class="form-group">
-                    <label>计量年月</label>
-                    <input class="datepicker-here form-control form-control-sm" autocomplete="off" placeholder="点击选择年月" data-view="months" data-min-view="months" data-date-format="yyyy-MM" data-language="zh" type="text" name="date" autocomplete="off">
+                    <label>计量年月<b class="text-danger">*</b></label>
+                    <input class="datepicker-here form-control form-control-sm" autocomplete="off" readonly placeholder="点击选择年月" data-view="months" data-min-view="months" data-date-format="yyyy-MM" data-language="zh" type="text" name="date" autocomplete="off">
                 </div>
                 <div class="form-group">
-                    <label>开始-截止日期</label>
-                    <input class="datepicker-here form-control form-control-sm" autocomplete="off" placeholder="点击选择时间" data-range="true" data-multiple-dates-separator=" ~ " data-language="zh" type="text" name="period" autocomplete="off">
+                    <label>开始-截止日期<b class="text-danger">*</b></label>
+                    <input class="datepicker-here form-control form-control-sm" autocomplete="off" readonly placeholder="点击选择时间" data-range="true" data-multiple-dates-separator=" ~ " data-language="zh" type="text" name="period" autocomplete="off">
                 </div>
             </div>
             <div class="modal-footer">
@@ -116,7 +116,7 @@
 <!--设置-->
 <div class="modal fade" id="edit" data-backdrop="static">
     <div class="modal-dialog" role="document">
-        <form class="modal-content" action="<%- preUrl + '/measure/save' %>" method="post">
+        <form class="modal-content" action="<%- preUrl + '/measure/save' %>" method="post" onsubmit="return checkForm();">
             <div class="modal-header">
                 <h5 class="modal-title">期编辑</h5>
             </div>
@@ -126,12 +126,12 @@
                     <input class="form-control form-control-sm" value="第 <%- stages[0].order %> 期" type="text" readonly="" name="name">
                 </div>
                 <div class="form-group">
-                    <label>计量年月</label>
-                    <input class="datepicker-here form-control form-control-sm" autocomplete="off" id="edit-date" name="date" placeholder="点击选择年月" data-view="months" data-min-view="months" data-date-format="yyyy-MM" data-language="zh" type="text">
+                    <label>计量年月<b class="text-danger">*</b></label>
+                    <input class="datepicker-here form-control form-control-sm" autocomplete="off" readonly id="edit-date" name="date" placeholder="点击选择年月" data-view="months" data-min-view="months" data-date-format="yyyy-MM" data-language="zh" type="text">
                 </div>
                 <div class="form-group">
-                    <label>开始-截止日期</label>
-                    <input class="datepicker-here form-control form-control-sm" autocomplete="off" id="edit-period" name="period" placeholder="点击选择时间" data-range="true" data-multiple-dates-separator=" ~ " data-language="zh" type="text">
+                    <label>开始-截止日期<b class="text-danger">*</b></label>
+                    <input class="datepicker-here form-control form-control-sm" autocomplete="off" readonly id="edit-period" name="period" placeholder="点击选择时间" data-range="true" data-multiple-dates-separator=" ~ " data-language="zh" type="text">
                 </div>
             </div>
             <div class="modal-footer">
@@ -162,6 +162,17 @@
     if (period.length > 0) {
         editPeriod.selectDate(period);
     }
+
+    function checkForm () {
+        if ($('#edit-date').val() == '') {
+            toastr.error('请选择计量年月');
+            return false;
+        }
+        if ($('#edit-period').val() == '') {
+            toastr.error('请选择开始-截止日期');
+            return false;
+        }
+    }
     <% } %>
     $('.datepicker-here').datepicker({
         autoClose: true,

+ 3 - 1
app/view/revise/info_modal.ejs

@@ -61,6 +61,7 @@
                     <div class="card-header">
                         审批流程
                     </div>
+                    <div class="modal-height-500" style="overflow: auto">
                     <ul class="list-group list-group-flush" id="auditors">
                         <% for (let i = 0, iLen = auditorList.length; i < iLen; i++) { %>
                         <li class="list-group-item" auditorId="<%- auditorList[i].audit_id %>">
@@ -70,6 +71,7 @@
                         </li>
                         <% } %>
                     </ul>
+                    </div>
                 </div>
             </div>
             <form class="modal-footer" method="post" action="/tender/<%- ctx.tender.id %>/revise/audit/start" onsubmit="return checkAuditorFrom()">
@@ -91,7 +93,7 @@
             </div>
             <div class="modal-body">
                 <div class="row">
-                    <div class="col-4">
+                    <div class="col-4 modal-height-500" style="overflow: auto">
                         <a href="#sub-sp" data-toggle="modal" data-target="#sub-sp" id="hideSp">修改审批流程</a>
                         <div class="card mt-3">
                             <ul class="list-group list-group-flush">

+ 3 - 1
app/view/stage/audit_modal.ejs

@@ -52,6 +52,7 @@
                             <div class="card-header">
                                 审批流程
                             </div>
+                            <div class="modal-height-500" style="overflow: auto">
                             <ul class="list-group list-group-flush" id="auditors">
                                 <% for (let i = 0, iLen = ctx.stage.auditorList.length; i < iLen; i++) { %>
                                     <li class="list-group-item" auditorId="<%- ctx.stage.auditorList[i].aid %>">
@@ -61,6 +62,7 @@
                                     </li>
                                 <% } %>
                             </ul>
+                            </div>
                         </div>
                     </div>
                     <form class="modal-footer" method="post" action="<%- preUrl %>/audit/start" onsubmit="return checkAuditorFrom()">
@@ -705,7 +707,7 @@
                     </div>
                     <div class="modal-body">
                         <div class="row">
-                            <div class="col-4">
+                            <div class="col-4 modal-height-500" style="overflow: auto">
                                 <a href="#sub-sp" data-toggle="modal" data-target="#sub-sp" id="hideSp">修改审批流程</a>
                                 <div class="card mt-3">
                                     <ul class="list-group list-group-flush">

+ 17 - 12
test/app/service/report.test.js

@@ -11,22 +11,23 @@
 const { app, assert } = require('egg-mock/bootstrap');
 const mockData = {};
 const path = require('path');
+const reportDataAnalysis = require('../../../app/lib/rpt_data_analysis');
 
 describe('test/app/service/report_memory.test.js', () => {
     // 准备测试数据
     before(function* () {
         const ctx = app.mockContext();
         // 模拟登录session
-        const postData = {
-            account: '734406061@qq.com',
-            project: 'T201711273363',
-            project_password: 'mai654321',
-        };
         // const postData = {
-        //     account: 'chente',
+        //     account: '734406061@qq.com',
         //     project: 'T201711273363',
-        //     project_password: '123456',
+        //     project_password: 'mai654321',
         // };
+        const postData = {
+            account: 'fuqingqing',
+            project: 'P0505',
+            project_password: '123456',
+        };
         ctx.session = {};
         const loginResult = yield ctx.service.projectAccount.accountLogin(postData, 2);
         assert(loginResult);
@@ -37,13 +38,17 @@ describe('test/app/service/report_memory.test.js', () => {
         const ctx = app.mockContext(mockData);
 
         // test12 - 第6期
-        const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6});
+        //const stage = yield ctx.service.stage.getDataByCondition({tid: 2076, order: 2});
         const params = {
-            tender_id: stage.tid,
-            stage_id: stage.id,
+            tender_id: 1977
+        };
+        const filters = ['change', 'mem_change_bills'];
+        const fields = {
+            change: [],
+            mem_stage_bills: [],
         };
-        const filters = ['change', 'change_audit_list'];
-        const result = yield ctx.service.report.getReportData(ctx, params, filters);
+        const result = yield ctx.service.report.getReportData(params, filters, fields);
+        reportDataAnalysis.analysisObj.changeSort.fun(ctx, result, [], {change: "change", changeBills: 'mem_change_bills'});
         const savePath = path.join(ctx.app.baseDir, 'report_temp');
         yield ctx.helper.recursiveMkdirSync(savePath);
         for (const table in result) {