Browse Source

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

Tony Kang 1 year ago
parent
commit
d70d00d245

+ 5 - 0
app/const/rpt_archive.js

@@ -16,6 +16,10 @@ const BusinessType = [
     { stageId: -302, type: 'change_project' },
     { stageId: -303, type: 'change_apply' },
 ];
+const getStageId = function(type) {
+    const bType = BusinessType.find(x => { return x.type === type; });
+    return bType ? bType.stageId : null;
+};
 const getBusinessType = function(stageId) {
     const sid = parseInt(stageId);
     if (sid > 0) return 'stage';
@@ -32,6 +36,7 @@ const BusinessStageId = (function(businessType) {
 
 module.exports = {
     BusinessType,
+    getStageId,
     getBusinessType,
     BusinessStageId,
 };

+ 3 - 0
app/const/spec_3f.js

@@ -30,6 +30,9 @@ const pushTiming = [
     { value:'change_project.flow', name: '变更立项-上报/审批' },
     { value:'change_project.checked', name: '变更立项-审批通过' },
     { value:'report.file', name: '报表-推送归档' },
+    { value:'report.change_file', name: '报表-变更令-同步档案系统' },
+    { value:'report.change_plan_file', name: '报表-变更方案-同步档案系统' },
+    { value:'report.change_apply_file', name: '报表-变更申请-同步档案系统' },
 ];
 
 const pushOperate = (function () {

+ 1 - 58
app/controller/change_controller.js

@@ -299,7 +299,7 @@ module.exports = app => {
                 // 在生成新变更令后,需要copy前一个变更令报表的签名信息
                 const lastChange = await ctx.service.change.getLastChange(tenderId);
                 const change = await ctx.service.change.add(tenderId, ctx.session.sessionUser.accountId, data.code, data.plan_code, data.name, stateInfo.value);
-                await ctx.service.roleRptRel.createRoleRelationshipFromOtherBz(tenderId, '-300', change.cid, lastChange.cid);
+                await ctx.service.roleRptRel.createRoleRelationshipFromOtherBz(tenderId, '-300', change.cid, lastChange ? lastChange.cid : null);
 
                 ctx.body = { err: 0, msg: '', data: change };
             } catch (err) {
@@ -873,20 +873,6 @@ module.exports = app => {
             }
         }
 
-        async report(ctx) {
-            try {
-                const renderData = {
-                    change: ctx.change,
-                    tender: ctx.tender,
-                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.change.report),
-                };
-                await this.layout('change/report.ejs', renderData);
-            } catch (err) {
-                this.log(err);
-                ctx.redirect('/tender/' + ctx.params.id + '/change');
-            }
-        }
-
         /**
          * 变更清单 - 操作 (Ajax)
          * @param ctx
@@ -2359,20 +2345,6 @@ module.exports = app => {
             }
         }
 
-        async projectReport(ctx) {
-            try {
-                const renderData = {
-                    change: ctx.change,
-                    tender: ctx.tender,
-                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.change.report),
-                };
-                await this.layout('change/project_report.ejs', renderData);
-            } catch (err) {
-                this.log(err);
-                ctx.redirect('/tender/' + ctx.params.id + '/change/project');
-            }
-        }
-
         // 审批相关
         /**
          * 添加审批人
@@ -3133,20 +3105,6 @@ module.exports = app => {
             }
         }
 
-        async applyReport(ctx) {
-            try {
-                const renderData = {
-                    change: ctx.change,
-                    tender: ctx.tender,
-                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.change.report),
-                };
-                await this.layout('change/apply_report.ejs', renderData);
-            } catch (err) {
-                this.log(err);
-                ctx.redirect('/tender/' + ctx.params.id + '/change/apply');
-            }
-        }
-
         async applyInformationNotice(ctx) {
             try {
                 const tender = await ctx.service.tender.getDataById(ctx.tender.id);
@@ -3931,21 +3889,6 @@ module.exports = app => {
             }
         }
 
-        async planReport(ctx) {
-            try {
-                const renderData = {
-                    change: ctx.change,
-                    tender: ctx.tender,
-                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.change.report),
-                };
-                await this.layout('change/plan_report.ejs', renderData);
-            } catch (err) {
-                this.log(err);
-                ctx.redirect('/tender/' + ctx.params.id + '/change/plan');
-            }
-        }
-
-
         // 审批相关
         /**
          * 添加审批人

+ 106 - 0
app/controller/report_archive_controller.js

@@ -17,6 +17,8 @@ const shenpiConst = require('../const/shenpi');
 const accountGroup = require('../const/account_group').group;
 const sendToWormhole = require('stream-wormhole');
 const pushOperate = require('../const/spec_3f').pushOperate;
+const sourceTypeConst = require('../const/source_type');
+const rptArchiveConst = require('../const/rpt_archive');
 
 module.exports = app => {
     class ReportArchiveController extends app.BaseController {
@@ -166,6 +168,91 @@ module.exports = app => {
             };
         }
 
+        async _createNodes(ctx, source_type, pid) {
+            const treeNodes = await ctx.service.rptTreeNode.getNodesBySourceType([pid], source_type); // 这个查定制的
+            const commonTreeNodes = await ctx.service.rptTreeNode.getNodesByProjectId([-1]); // 这个查通用的
+            const nodeItems = JSON.parse(commonTreeNodes[0].items);
+            const commonArrs = [];
+            nodeItems.forEach(nodeItem => {
+                const srcType = nodeItem.source_type ? nodeItem.source_type : 1;
+                if (srcType === source_type) {
+                    commonArrs.push(nodeItem);
+                }
+            });
+            // 加一个dummy的通用报表
+            const dummyCommonRptNode = { id: 1, name: '通用报表', pid: -1, rpt_type: 0, items: JSON.stringify(commonArrs) };
+            treeNodes.push(dummyCommonRptNode);
+            const custCfg = await ctx.service.rptCustomizeCfg.getCustomizeCfgByUserId('Administrator');
+            return { treeNodes, commonArrs, custCfg };
+        }
+
+        async getReportArchive4bz(ctx) {
+            const params = JSON.parse(ctx.request.body.params);
+            const type = params.business_type;
+            const tenderId = params.tenderId;
+            const stgId = rptArchiveConst.getStageId(type);
+            const is_type_change = !params.bzId; // post值里不存在bzId代表切换总变更种类,存在代表切换变更列表值
+            const postBody = {};
+            if (is_type_change) {
+                let changes = [];
+                const allArchives = await ctx.service.rptArchive.getPrjStgArchiveByBz(ctx.session.sessionProject.id, stgId, tenderId);
+                switch (type) {
+                    case 'change':
+                        changes = await ctx.service.change.getListByArchives(tenderId, ctx.helper._.map(allArchives, 'business_id'));
+                        break;
+                    case 'change_project':
+                        changes = await ctx.service.changeProject.getListByArchives(tenderId, ctx.helper._.map(allArchives, 'business_id'));
+                        break;
+                    case 'change_apply':
+                        changes = await ctx.service.changeApply.getListByArchives(tenderId, ctx.helper._.map(allArchives, 'business_id'));
+                        break;
+                    case 'change_plan':
+                        changes = await ctx.service.changePlan.getListByArchives(tenderId, ctx.helper._.map(allArchives, 'business_id'));
+                        break;
+                    default: break;
+                }
+                postBody.changes = changes;
+            }
+            const bzId = !is_type_change ? params.bzId : (postBody.changes.length > 0 ? postBody.changes[0].cid || postBody.changes[0].id : null);
+            let archiveList = [];
+            const archives = await ctx.service.rptArchive.getArchiveByBzId(ctx.session.sessionProject.id, stgId, bzId);
+            const archiveEncryptions = await ctx.service.rptArchiveEncryption.getArchiveEncryptionByBzId(ctx.session.sessionProject.id, stgId, bzId);
+            if (archives.length > 0) {
+                archiveList = JSON.parse(archives[0].content);
+            }
+            // ctx.body = await this._getReport(ctx, params);
+            let archiveEncryptionList = [];
+            if (archives.length > 0) {
+                archiveList = JSON.parse(archives[0].content);
+            }
+            if (archiveEncryptions.length > 0) {
+                archiveEncryptionList = JSON.parse(archiveEncryptions[0].content);
+            }
+            const { treeNodes, custCfg } = await this._createNodes(ctx, sourceTypeConst.sourceType[type], ctx.session.sessionProject.id);
+            const cust_select_keys = JSON.stringify(['common', 'customize']); // 因其他地方也有可能保存用户报表的显示选择项,因当初设计问题,不好改数据库结构了,但可以调节内部json来满足需求
+            const rpt_tpl_items = { customize: [], common: [] };
+            if (treeNodes && treeNodes.length > 0) {
+                for (let tIdx = treeNodes.length - 1; tIdx >= 0; tIdx--) {
+                    treeNodes[tIdx].items = treeNodes[tIdx].items ? JSON.parse(treeNodes[tIdx].items) : [];
+                    if (treeNodes[tIdx].name === '通用报表') {
+                        const items = treeNodes[tIdx].items;
+                        for (let itemIdx = items.length - 1; itemIdx >= 0; itemIdx--) {
+                            rpt_tpl_items.common.push(items[itemIdx].name);
+                        }
+                    } else {
+                        rpt_tpl_items.customize.push(treeNodes[tIdx].name);
+                    }
+                }
+            }
+            postBody.data = archiveList;
+            postBody.encryptionData = archiveEncryptionList;
+            postBody.rpt_tpl_data = treeNodes;
+            // postBody.cust_tpl_data = rpt_tpl_items;
+            // postBody.cust_select_keys = cust_select_keys;
+            // postBody.cust_cfg = JSON.stringify(custCfg);
+            ctx.body = postBody;
+        }
+
         async _updateReportArchiveAdhocInfo(ctx, params) {
             const userId = ctx.session.sessionUser.accountId;
             const prjId = params.prjId;
@@ -882,6 +969,25 @@ module.exports = app => {
                 this.ctx.ajaxErrorBody(err, '操作失败');
             }
         }
+
+        async sendOtherFileMsg(ctx) {
+            try {
+                if (this.ctx.session.sessionUser.accountId !== ctx.tender.data.user_id) throw '您无权操作';
+
+                const data = JSON.parse(ctx.request.body.data);
+                const needFileMsg = await this.ctx.service.specMsg.tenderNeedMsg(this.ctx.session.sessionProject.id, this.ctx.tender.id, data.msgType);
+                if (!needFileMsg) throw '该标段暂不可进行该操作';
+
+                const waitingMsg = await this.ctx.service.specMsg.getDataByCondition({ tid: this.ctx.tender.id, timing: data.msgType, status: [0, 1] });
+                if (waitingMsg) throw '上一次归档完成,未执行完毕,请稍后再试';
+
+                await this.ctx.service.specMsg.addOtherReportMsg(null, this.ctx.session.sessionProject.id, this.ctx.tender.data, data.id, data.msgType);
+                ctx.body = { err: 0, msg: '提交成功,稍后将同步至档案系统', data: null };
+            } catch (err) {
+                this.ctx.log(err);
+                this.ctx.ajaxErrorBody(err, '操作失败');
+            }
+        }
     }
     return ReportArchiveController;
 };

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

@@ -828,9 +828,9 @@ $(document).ready(() => {
                 });
                 if (def && def.color) return def.color;
             }
-        }
-        if (data.settle_status === settleStatus.finish) {
-            return spreadColor.stage.settle;
+            if (data.settle_status === settleStatus.finish) {
+                return spreadColor.stage.settle;
+            }
         }
         if (checkTzMeasureType()) {
             return hintOver && checkUtils.posOver(data)  ? spreadColor.stage.over : defaultColor;

+ 2 - 4
app/router.js

@@ -460,6 +460,7 @@ module.exports = app => {
     app.get('/budget/:id/report', sessionAuth, budgetCheck, 'reportController.indexForDynamicGrandTotal');
     app.get('/tender/:id/archiveReport', sessionAuth, tenderCheck, uncheckTenderCheck, 'reportArchiveController.index');
     app.post('/tender/report_api/getReportArchive', sessionAuth, 'reportArchiveController.getReportArchive');
+    app.post('/tender/report_api/getReportArchive4bz', sessionAuth, 'reportArchiveController.getReportArchive4bz');
     app.get('/getArchivedFileByUUID/:uuid/:rptName', sessionAuth, 'reportArchiveController.getArchivedFileByUUID');
     app.get('/tender/:id/measure/stage/:order/archiveReport', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'reportArchiveController.index');
     app.get('/archive/pdf/show', sessionAuth, 'reportArchiveController.pdfShow');
@@ -498,6 +499,7 @@ module.exports = app => {
     app.post('/tender/report_api/removeArchiveEncryption', sessionAuth, 'reportArchiveController.removeReportArchiveEncryption');
     app.post('/tender/:id/sendReportFileMsg', sessionAuth, tenderCheck, uncheckTenderCheck, 'reportArchiveController.sendFileMsg');
     app.post('/tender/:id/measure/stage/:order/sendReportFileMsg', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'reportArchiveController.sendFileMsg');
+    app.post('/tender/:id/sendReportFileMsg', sessionAuth, tenderCheck, uncheckTenderCheck, 'reportArchiveController.sendOtherFileMsg');
 
     // 电子签名
     app.get('/tender/:id/signReport', sessionAuth, tenderCheck, uncheckTenderCheck, 'reportArchiveController.signReport');
@@ -533,7 +535,6 @@ module.exports = app => {
     // 变更令 - 新版本
     app.get('/tender/:id/change/:cid/info', sessionAuth, tenderCheck, uncheckTenderCheck, changeCheck, changeAuditCheck, 'changeController.information');// 针对旧数据wap端跳转web问题
     app.get('/tender/:id/change/:cid/information', sessionAuth, tenderCheck, uncheckTenderCheck, changeCheck, changeAuditCheck, 'changeController.information');
-    app.get('/tender/:id/change/:cid/information/report', sessionAuth, tenderCheck, uncheckTenderCheck, changeCheck, changeAuditCheck, 'changeController.report');
     app.post('/tender/:id/change/:cid/information/save', sessionAuth, tenderCheck, uncheckTenderCheck, changeCheck, 'changeController.saveListsData');
     app.post('/tender/:id/change/:cid/information/audit/start', sessionAuth, tenderCheck, uncheckTenderCheck, changeCheck, changeAuditCheck, 'changeController.startAudit');
     app.post('/tender/:id/change/:cid/information/file/upload', sessionAuth, 'changeController.uploadFile');
@@ -566,7 +567,6 @@ module.exports = app => {
     app.post('/tender/:id/change/project/check/revise', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changeProjectCheck, 'changeController.checkProjectRevise');
     app.post('/tender/:id/change/project/cancel/revise', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changeProjectCheck, 'changeController.cancelProjectRevise');
     app.post('/tender/:id/change/project/check/again', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changeProjectCheck, 'changeController.checkProjectAgain');
-    app.get('/tender/:id/change/project/:cpid/information/report', sessionAuth, tenderCheck, uncheckTenderCheck, changeProjectCheck, 'changeController.projectReport');
     // 变更申请
     app.get('/tender/:id/change/apply', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.apply');
     app.get('/tender/:id/change/apply/status/:status', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.applyStatus');
@@ -587,7 +587,6 @@ module.exports = app => {
     app.post('/tender/:id/change/apply/check/revise', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changeApplyCheck, 'changeController.checkApplyRevise');
     app.post('/tender/:id/change/apply/cancel/revise', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changeApplyCheck, 'changeController.cancelApplyRevise');
     app.post('/tender/:id/change/apply/check/again', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changeApplyCheck, 'changeController.checkApplyAgain');
-    app.get('/tender/:id/change/apply/:caid/information/report', sessionAuth, tenderCheck, uncheckTenderCheck, changeApplyCheck, 'changeController.applyReport');
     // 变更方案
     app.get('/tender/:id/change/plan', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.plan');
     app.get('/tender/:id/change/plan/status/:status', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.planStatus');
@@ -608,7 +607,6 @@ module.exports = app => {
     app.post('/tender/:id/change/plan/check/revise', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changePlanCheck, 'changeController.checkPlanRevise');
     app.post('/tender/:id/change/plan/cancel/revise', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changePlanCheck, 'changeController.cancelPlanRevise');
     app.post('/tender/:id/change/plan/check/again', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, changePlanCheck, 'changeController.checkPlanAgain');
-    app.get('/tender/:id/change/plan/:cpid/information/report', sessionAuth, tenderCheck, uncheckTenderCheck, changePlanCheck, 'changeController.planReport');
     // 材料调差
     app.get('/tender/:id/measure/material', sessionAuth, tenderCheck, uncheckTenderCheck, 'materialController.index');
     app.post('/tender/:id/measure/material/add', sessionAuth, tenderCheck, uncheckTenderCheck, tenderBuildCheck, 'materialController.add');

+ 11 - 1
app/service/change.js

@@ -2059,7 +2059,17 @@ module.exports = app => {
                 }
             }
         }
-
+        // 获取列表并按审批完成时间排序
+        async getListByArchives(tid, ids) {
+            if (ids.length === 0) return [];
+            const list = await this.getAllDataByCondition({ where: { tid, cid: ids }, orders: [['sin_time', 'desc'], ['cin_time', 'desc']] });
+            // 为了通用化id和code值,这里需要把值改改 cid->id,p_code->code
+            for (const l of list) {
+                l.id = l.cid;
+                l.code = l.p_code;
+            }
+            return list;
+        }
     }
 
     return Change;

+ 10 - 0
app/service/change_apply.js

@@ -439,6 +439,16 @@ module.exports = app => {
                 }
             }
         }
+
+        async getListByArchives(tid, ids) {
+            if (ids.length === 0) return [];
+            const sql = 'SELECT a.* FROM ?? as c LEFT JOIN (SELECT caid, MAX(end_time) as end_time FROM ?? WHERE ' +
+                'tid = ? AND caid in (' + this.ctx.helper.getInArrStrSqlFilter(ids) + ') GROUP BY caid) as ca ON c.id = ca.caid WHERE' +
+                ' c.tid = ? AND c.id in (' + this.ctx.helper.getInArrStrSqlFilter(ids) + ') AND c.status = ? ORDER BY ca.end_time DESC';
+            const params = [this.tableName, this.ctx.service.changeApplyAudit.tableName, tid, tid, audit.status.checked];
+            const list = await this.db.query(sql, params);
+            return list;
+        }
     }
 
     return ChangeApply;

+ 10 - 0
app/service/change_plan.js

@@ -462,6 +462,16 @@ module.exports = app => {
                 }
             }
         }
+
+        async getListByArchives(tid, ids) {
+            if (ids.length === 0) return [];
+            const sql = 'SELECT a.* FROM ?? as c LEFT JOIN (SELECT cpid, MAX(end_time) as end_time FROM ?? WHERE ' +
+                'tid = ? AND cpid in (' + this.ctx.helper.getInArrStrSqlFilter(ids) + ') GROUP BY cpid) as ca ON c.id = ca.cpid WHERE' +
+                ' c.tid = ? AND c.id in (' + this.ctx.helper.getInArrStrSqlFilter(ids) + ') AND c.status = ? ORDER BY ca.end_time DESC';
+            const params = [this.tableName, this.ctx.service.changePlanAudit.tableName, tid, tid, audit.status.checked];
+            const list = await this.db.query(sql, params);
+            return list;
+        }
     }
 
     return ChangePlan;

+ 10 - 0
app/service/change_project.js

@@ -413,6 +413,16 @@ module.exports = app => {
                 }
             }
         }
+
+        async getListByArchives(tid, ids) {
+            if (ids.length === 0) return [];
+            const sql = 'SELECT a.* FROM ?? as c LEFT JOIN (SELECT cpid, MAX(end_time) as end_time FROM ?? WHERE ' +
+                'tid = ? AND cpid in (' + this.ctx.helper.getInArrStrSqlFilter(ids) + ') GROUP BY cpid) as ca ON c.id = ca.cpid WHERE' +
+                ' c.tid = ? AND c.id in (' + this.ctx.helper.getInArrStrSqlFilter(ids) + ') AND c.status = ? ORDER BY ca.end_time DESC';
+            const params = [this.tableName, this.ctx.service.changeProjectAudit.tableName, tid, tid, audit.status.checked];
+            const list = await this.db.query(sql, params);
+            return list;
+        }
     }
 
     return ChangeProject;

+ 21 - 0
app/service/rpt_archive.js

@@ -39,6 +39,7 @@ module.exports = app => {
             if (stgId > 0) {
                 return await this.getPrjStgArchive(prjId, stgId);
             }
+            if (!bzId) return [];
             this.initSqlBuilder();
             this.sqlBuilder.setAndWhere('prj_id', {
                 value: prjId,
@@ -58,6 +59,26 @@ module.exports = app => {
             return rstList;
         }
 
+        async getPrjStgArchiveByBz(prjId, stgId, tenderId) {
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('prj_id', {
+                value: prjId,
+                operate: '=',
+            });
+            this.sqlBuilder.setAndWhere('stage_id', {
+                value: stgId,
+                operate: '=',
+            });
+            this.sqlBuilder.setAndWhere('tender_id', {
+                value: tenderId,
+                operate: '=',
+            });
+            // this.sqlBuilder.columns = ['id', 'prj_id', 'stage_id', 'tender_id', 'content'];
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+            const rstList = await this.db.query(sql, sqlParam);
+            return rstList;
+        }
+
         async getPrjStgArchive(prjId, stgId) {
             this.initSqlBuilder();
             this.sqlBuilder.setAndWhere('prj_id', {

+ 1 - 0
app/service/rpt_archive_encryption.js

@@ -39,6 +39,7 @@ module.exports = app => {
             if (stgId > 0) {
                 return await this.getPrjStgArchiveEncryption(prjId, stgId);
             }
+            if (!bzId) return [];
             this.initSqlBuilder();
             this.sqlBuilder.setAndWhere('prj_id', {
                 value: prjId,

+ 32 - 0
app/service/spec_msg.js

@@ -7,6 +7,7 @@
  * @date
  * @version
  */
+const pushOperate = require('../const/spec_3f').pushOperate;
 
 module.exports = app => {
     class SpecPull extends app.BaseService {
@@ -110,6 +111,37 @@ module.exports = app => {
                 await this.db.insert(this.tableName, { pid, tid: tender.id, sid: stage ? stage.id : 0, timing, extra_info: JSON.stringify(subInfo || {}) });
             }
         }
+
+        async _getOtherMsgBaseData(id, timing) {
+            switch(timing) {
+                case pushOperate.report.change_file:
+                    const change = await this.ctx.service.change.getAllDataByCondition({ where: { cid: id } });
+                    return change.map(x => { return { cid: x.cid } });
+                case pushOperate.report.change_plan_file:
+                    const changePlan = await this.ctx.service.changePlan.getAllDataByCondition({ where: { id } });
+                    return changePlan.map(x => { return { c_plan_id: x.id } });
+                case pushOperate.report.change_apply_file:
+                    const changeApply = await this.ctx.service.changeApply.getAllDataByCondition({ where: { id } });
+                    return changeApply.map(x => { return { c_apply_id: x.id } });
+                default:
+                    return [];
+            }
+        }
+
+        async addOtherReportMsg(transaction, pid, tender, id, timing, subInfo) {
+            const needMsg = await this.tenderNeedMsg(pid, tender.id, timing);
+            if (!needMsg) return;
+
+            const data = await this._getOtherMsgBaseData(id, timing);
+            const insertMsg = data.map(x => {
+                return { pid, tid: tender.id, timing, extra_info: JSON.stringify(subInfo || {}), ...x };
+            });
+            if (transaction) {
+                await transaction.insert(this.tableName, insertMsg);
+            } else {
+                await this.db.insert(this.tableName, insertMsg);
+            }
+        }
     }
 
     return SpecPull;

+ 125 - 5
app/view/report/index_archive.ejs

@@ -17,11 +17,12 @@
                         <button class="btn btn-sm btn-light dropdown-toggle text-primary" type="button" id="bizDropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                             计量期
                         </button>
-                        <div class="dropdown-menu" aria-labelledby="bizDropdownMenuButton">
-                            <a class="dropdown-item" href="#">变更令</a>
-                            <a class="dropdown-item" href="#">变更立项</a>
-                            <a class="dropdown-item" href="#">变更方案</a>
-                            <a class="dropdown-item" href="#">变更申请</a>
+                        <div class="dropdown-menu" aria-labelledby="bizDropdownMenuButton" id="select-item">
+                            <a class="dropdown-item" href="javascript:void(0);" data-type="stage" style="display: none">计量期</a>
+                            <a class="dropdown-item" href="javascript:void(0);" data-type="change">变更令</a>
+                            <a class="dropdown-item" href="javascript:void(0);" data-type="change_project">变更立项</a>
+                            <a class="dropdown-item" href="javascript:void(0);" data-type="change_apply">变更申请</a>
+                            <a class="dropdown-item" href="javascript:void(0);" data-type="change_plan">变更方案</a>
                         </div>
                     </div>
                 </div>
@@ -31,6 +32,12 @@
                         <div class="dropdown-menu" aria-labelledby="dropdownMenuButton" id="optionSelectableStages"></div>
                     </div>
                 </div>
+                <div class="d-inline-block">
+                    <div class="dropdown" id="divSelectableChanges" style="display: none">
+                        <button class="btn btn-sm btn-light dropdown-toggle text-primary" type="button" id="btnCurrentChange" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></button>
+                        <div class="dropdown-menu" aria-labelledby="dropdownMenuButton" id="optionSelectableChanges"></div>
+                    </div>
+                </div>
                 <% if (ctx.session.sessionUser.accountId === ctx.tender.data.user_id && needFileMsg) { %>
                 <div class="d-inline-block">
                     <button class="btn btn-sm btn-primary" type="button" onclick="sendReportFileMsg();">同步档案系统</button>
@@ -191,6 +198,8 @@
     const STAGE_LIST = <%- stage_list %>;
     const can_netcasign = <%- can_netcasign %>;
     const oss_path = JSON.parse('<%- JSON.stringify(ossPath) %>');
+    let business_type = 'stage';
+    let CHANGE_LIST = [], current_change_id = -1, current_change_code = '';
 
     const FOLDER_SEPERATER = '->';
 
@@ -301,6 +310,29 @@
         }
     }
 
+    function buildChangeSelection() {
+        if (CHANGE_LIST.length === 0) {
+            $("#optionSelectableChanges")[0].style.display = 'none';
+            $("#btnCurrentChange")[0].innerText = '';
+        } else {
+            $("#optionSelectableChanges")[0].style.display = '';
+            $("#btnCurrentChange")[0].innerText = current_change_code;
+
+            $("#optionSelectableChanges").empty();
+            if (CHANGE_LIST.length > 0) {
+                for (let i = CHANGE_LIST.length; i > 0; i--) {
+                    if (parseInt(CHANGE_LIST[i - 1].status) === 3 && CHANGE_LIST[i - 1].code !== current_change_code) {
+                        const str = '<a class="dropdown-item" style="cursor:pointer" onclick="changeCurrentChange(this)" change_id = "' + CHANGE_LIST[i - 1].id + '" change_code = "' + CHANGE_LIST[i - 1].code + '">' + CHANGE_LIST[i - 1].code + '</a>';
+                        $("#optionSelectableChanges").append(str);
+                    }
+                }
+            }
+        }
+        // if (CHANGE_ID > 0) {
+        //     $("#divSelectableChanges")[0].style.display = 'none';
+        // }
+    }
+
     function changeCurrentStage(ele) {
         // alert('you are selecting: ' + ele.innerText);
         current_stage_order = parseInt(ele.attributes.stg_order.value);
@@ -332,6 +364,31 @@
         );
     }
 
+    function changeCurrentChange(ele) {
+        // alert('you are selecting: ' + ele.innerText);
+        current_change_id = ele.attributes.change_id.value;
+        current_change_code = ele.attributes.change_code.value;
+        buildChangeSelection();
+        //还有必要触发归档报表刷新!
+        //rptArchiveObj.onClick(null, null, rptArchiveObj.currentNode);
+        const params = {tenderId: TENDER_ID, business_type, bzId: current_change_id};
+        $.bootstrapLoading.start();
+        CommonAjax.postXsrfEx("/tender/report_api/getReportArchive4bz", params, 10000, true, getCookie('csrfToken_j'),
+            function(result){
+                $.bootstrapLoading.end();
+                ARCHIVE_LIST = result.data;
+                ARCHIVE_ENCRYPTION_LIST = result.encryptionData;
+                TOP_TREE_NODES = JSON.parse(JSON.stringify(result.rpt_tpl_data));
+                buildTplTree();
+                rptArchiveObj.iniPage();
+            }, function(err){
+                $.bootstrapLoading.end();
+            }, function(ex){
+                $.bootstrapLoading.end();
+            }
+        );
+    }
+
 
     function sendReportFileMsg() {
         postData('sendReportFileMsg', { sid: current_stage_id, sorder: current_stage_order }, function (result, msg) {
@@ -364,6 +421,69 @@
                 pauseEvent(e);
             }
         });
+
+        $('#select-item a').on('click', function () {
+           $('#select-item a').show();
+           $(this).hide();
+           $('#select-item').siblings('button').text($(this).text());
+           const type = $(this).data('type');
+           business_type = type;
+           if (type === 'stage') {
+               $('#divSelectableStages').show();
+               $('#divSelectableChanges').hide();
+               // 下列树结构重新加载
+//还有必要触发归档报表刷新!
+               //rptArchiveObj.onClick(null, null, rptArchiveObj.currentNode);
+               const params = {prjId: PROJECT_ID, stgId: current_stage_id};
+               $.bootstrapLoading.start();
+               CommonAjax.postXsrfEx("/tender/report_api/getReportArchive", params, 10000, true, getCookie('csrfToken_j'),
+                   function(result){
+                       $.bootstrapLoading.end();
+                       // console.log(result);
+                       ARCHIVE_LIST = result.data;
+                       ARCHIVE_ENCRYPTION_LIST = result.encryptionData;
+                       TOP_TREE_NODES = JSON.parse(JSON.stringify(ORG_TOP_TREE_NODES));
+                       buildTplTree();
+                       rptArchiveObj.iniPage();
+                   }, function(err){
+                       $.bootstrapLoading.end();
+                   }, function(ex){
+                       $.bootstrapLoading.end();
+                   }
+               );
+           } else {
+               $('#divSelectableStages').hide();
+               $('#divSelectableChanges').show();
+               // 下列树结构重新加载
+               //rptArchiveObj.onClick(null, null, rptArchiveObj.currentNode);
+               const params = {tenderId: TENDER_ID, business_type: type};
+               $.bootstrapLoading.start();
+               // ARCHIVE_LIST = [];
+               // ARCHIVE_ENCRYPTION_LIST = [];
+               // TOP_TREE_NODES = JSON.parse(JSON.stringify(ORG_TOP_TREE_NODES));
+               // rptArchiveObj.iniPage();
+               CommonAjax.postXsrfEx("/tender/report_api/getReportArchive4bz", params, 10000, true, getCookie('csrfToken_j'),
+                   function(result){
+                       $.bootstrapLoading.end();
+                       // console.log(result);
+                       ARCHIVE_LIST = result.data;
+                       ARCHIVE_ENCRYPTION_LIST = result.encryptionData;
+                       CHANGE_LIST = result.changes;
+                       current_change_id = CHANGE_LIST.length > 0 ? CHANGE_LIST[0].cid || CHANGE_LIST[0].id : -1;
+                       current_change_code = CHANGE_LIST.length > 0 ? CHANGE_LIST[0].code : '';
+                       TOP_TREE_NODES = JSON.parse(JSON.stringify(result.rpt_tpl_data));
+                       buildTplTree();
+                       rptArchiveObj.iniPage();
+                       buildChangeSelection();
+                   }, function(err){
+                       $.bootstrapLoading.end();
+                   }, function(ex){
+                       $.bootstrapLoading.end();
+                   }
+               );
+           }
+
+        });
     })
 
     rptArchiveObj.iniPage();

+ 34 - 31
db_script/depart_table.js

@@ -1,14 +1,16 @@
 const BaseUtil = require('./baseUtils');
 
-const ledgerTables = ['zh_ledger', 'zh_ledger_extra', 'zh_revise_bills', 'zh_stage_bills', 'zh_stage_bills_final', 'zh_settle_bills'];
+const ledgerTables = ['zh_ledger', 'zh_ledger_extra', 'zh_revise_bills', 'zh_stage_bills', 'zh_stage_bills_final'];
 const ledgerDepartKey = ['tender_id', 'tid', 'tender_id', 'tid', 'tid', 'tid'];
-const posTables = ['zh_pos', 'zh_pos_extra', 'zh_revise_pos', 'zh_stage_pos', 'zh_stage_pos_final', 'zh_settle_pos'];
+const ledgerPrimaryKey = ['uuid', 'uuid', 'uuid', 'id', 'id', 'id'];
+const posTables = ['zh_pos', 'zh_pos_extra', 'zh_revise_pos', 'zh_stage_pos', 'zh_stage_pos_final'];
 const posDepartKey = ['tid', 'tid', 'tid', 'tid', 'tid', 'tid'];
+const posPrimaryKey = ['uuid', 'uuid', 'uuid', 'id', 'id', 'id'];
 const orgLedgerDepart = 10, orgPosDepart = 20;
-const tableDepart = 1000;
+const tableDepart = 100;
 
 const sqlArr = [];
-const getDepartSql = function (table, key, orgDepart, newDepart) {
+const getDepartSql = function (table, key, primaryKey, orgDepart, newDepart) {
     sqlArr.push(`-- ${table}`);
     sqlArr.push(`-- ${table} RENAME`);
     for (let i = 0; i < orgDepart; i++) {
@@ -17,41 +19,42 @@ const getDepartSql = function (table, key, orgDepart, newDepart) {
     sqlArr.push(`-- ${table} RE_DEPART`);
     for (let i = 0; i < newDepart; i++) {
         const orgDepartIndex = i % orgDepart;
-        sqlArr.push(`Create Table ${table}_${i} SELECT * FROM ${table}_bak_${orgDepartIndex} WHERE ${key} % 100 = ${i};`);
+        sqlArr.push(`Create Table ${table}_${i} LIKE ${table}_bak_${orgDepartIndex};`);
+        sqlArr.push(`INSERT INTO ${table}_${i} SELECT * FROM ${table}_bak_${orgDepartIndex} WHERE ${key} % 100 = ${i};`);
     }
     sqlArr.push('');
 };
-const getArrDepartSql = function(tableArr, keyArr, orgDepart, newDepart) {
+const getArrDepartSql = function(tableArr, keyArr, primaryKeyArr, orgDepart, newDepart) {
     for (let i = 0, iLen = tableArr.length; i < iLen; i++) {
-        getDepartSql(tableArr[i], keyArr[i], orgDepart, newDepart);
+        getDepartSql(tableArr[i], keyArr[i], primaryKeyArr[i], orgDepart, newDepart);
     }
 };
-getArrDepartSql(ledgerTables, ledgerDepartKey, orgLedgerDepart, tableDepart);
-getArrDepartSql(posTables, posDepartKey, orgPosDepart, tableDepart);
+getArrDepartSql(ledgerTables, ledgerDepartKey, ledgerPrimaryKey, orgLedgerDepart, tableDepart);
+getArrDepartSql(posTables, posDepartKey, posPrimaryKey, orgPosDepart, tableDepart);
 
-BaseUtil.saveBufferFile(sqlArr.join('\n'), BaseUtil.getFileName('depart_table.sql'));
+BaseUtil.saveBufferFile(sqlArr.join('\n'), BaseUtil.getFileName('depart_table_qa.sql'));
 
-Select Sum(amount) FROM (
-    Select Count(*) As amount From zh_settle_bills_bak_0
-    UNION ALL
-    Select Count(*) As amount From zh_settle_bills_bak_1
-    UNION ALL
-    Select Count(*) As amount From zh_settle_bills_bak_2
-    UNION ALL
-    Select Count(*) As amount From zh_settle_bills_bak_3
-    UNION ALL
-    Select Count(*) As amount From zh_settle_bills_bak_4
-    UNION ALL
-    Select Count(*) As amount From zh_settle_bills_bak_5
-    UNION ALL
-    Select Count(*) As amount From zh_settle_bills_bak_6
-    UNION ALL
-    Select Count(*) As amount From zh_settle_bills_bak_7
-    UNION ALL
-    Select Count(*) As amount From zh_settle_bills_bak_8
-    UNION ALL
-    Select Count(*) As amount From zh_settle_bills_bak_9
-) As temp;
+// Select Sum(amount) FROM (
+//     Select Count(*) As amount From zh_settle_bills_bak_0
+//     UNION ALL
+//     Select Count(*) As amount From zh_settle_bills_bak_1
+//     UNION ALL
+//     Select Count(*) As amount From zh_settle_bills_bak_2
+//     UNION ALL
+//     Select Count(*) As amount From zh_settle_bills_bak_3
+//     UNION ALL
+//     Select Count(*) As amount From zh_settle_bills_bak_4
+//     UNION ALL
+//     Select Count(*) As amount From zh_settle_bills_bak_5
+//     UNION ALL
+//     Select Count(*) As amount From zh_settle_bills_bak_6
+//     UNION ALL
+//     Select Count(*) As amount From zh_settle_bills_bak_7
+//     UNION ALL
+//     Select Count(*) As amount From zh_settle_bills_bak_8
+//     UNION ALL
+//     Select Count(*) As amount From zh_settle_bills_bak_9
+// ) As temp;
 
 // 数据量预估
 // qa执行时间(分表100)