MaiXinRong 3 gadi atpakaļ
vecāks
revīzija
d00250d024

+ 2 - 0
app/controller/measure_controller.js

@@ -249,6 +249,8 @@ module.exports = app => {
                 if (ctx.request.body.confirm !== undefined && ctx.request.body.confirm !== '确认删除本期') {
                     throw '请输入正确的文本信息';
                 }
+                const relaStage = await ctx.service.stageRela.getDataByCondition({ rela_sid: stage_id });
+                if (relaStage) throw `该期已关联到标段"${relaStage.rela_tname}",不可删除`;
                 if (stageInfo && (ctx.session.sessionUser.accountId === stageInfo.user_id || (ctx.session.sessionUser.is_admin && ctx.request.body.confirm === '确认删除本期')) && stage_highOrder === stageInfo.order) {
                     const result = await ctx.service.stage.deleteStage(stage_id);
                     if (!result) {

+ 185 - 0
app/controller/stage_rela_controller.js

@@ -0,0 +1,185 @@
+'use strict';
+
+/**
+ * 关联台账
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+const auditConst = require('../const/audit').stage;
+const spreadSetting = require('../lib/spread_setting');
+const measureType = require('../const/tender').measureType;
+const tenderConst = require('../const/tender');
+
+module.exports = app => {
+
+    class StageRelaController extends app.BaseController {
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+        }
+
+        async _getDefaultRenderData(ctx) {
+            console.log(ctx.stage.id);
+            const stageRela = await ctx.service.stageRela.getStageRela(ctx.stage.id);
+            return { stageRela };
+        }
+
+        async index(ctx) {
+            try {
+                const renderData = await this._getDefaultRenderData(ctx);
+                renderData.auditConst = auditConst;
+                renderData.jsFiles = this.app.jsFiles.common.concat(this.app.jsFiles.stageRela.info);
+                renderData.History = await ctx.service.stageRela.getHistoryStageRela(this.ctx.stage.tid, this.ctx.stage.sorder);
+                await this.layout('stage_rela/index.ejs', renderData, 'stage_rela/modal.ejs');
+            } catch (err) {
+                ctx.log(err);
+            }
+        }
+
+        async add(ctx) {
+            try {
+                const tid = ctx.request.body.ar_tid ? parseInt(ctx.request.body.ar_tid) : 0;
+                const sorder = ctx.request.body.ar_sorder ? parseInt(ctx.request.body.ar_sorder) : 0;
+                if (!tid || !sorder) throw '参数错误';
+                const stage = await this.ctx.service.stage.getDataByCondition({ tid, order: sorder});
+                if (!stage) throw '关联标段/期不存在';
+                await this.ctx.service.stageRela.addStageRela(stage);
+                ctx.redirect(ctx.request.header.referer + '/' + tid);
+            } catch (err) {
+                ctx.log(err);
+                ctx.postError(err, '新增关联失败');
+                ctx.redirect(ctx.request.header.referer);
+            }
+        }
+
+        async del(ctx) {
+            try {
+                const srid = ctx.request.body.srid ? parseInt(ctx.request.body.srid) : 0;
+                if (!srid) throw '关联标段不存在';
+                await this.ctx.service.stageRela.deleteStageRela(srid);
+                ctx.redirect(ctx.request.header.referer);
+            } catch (err) {
+                ctx.log(err);
+                ctx.postError(err, '删除关联失败');
+                ctx.redirect(ctx.request.header.referer);
+            }
+        }
+
+        async update(ctx) {
+            try {
+                const srid = ctx.request.body.srid ? parseInt(ctx.request.body.srid) : 0;
+                if (!srid) throw '关联标段不存在';
+                await this.ctx.service.stageRela.updateStageRela(srid);
+                ctx.redirect(ctx.request.header.referer);
+            } catch (err) {
+                ctx.log(err);
+                ctx.postError(err, '更新失败');
+                ctx.redirect(ctx.request.header.referer);
+            }
+        }
+
+        async detail(ctx) {
+            try {
+                const relaStage = await this.ctx.service.stageRela.getDataById(ctx.params.trid);
+                if (!relaStage) throw '不存在该关联标段';
+                const renderData = await this._getDefaultRenderData(ctx);
+                renderData.jsFiles = this.app.jsFiles.common.concat(this.app.jsFiles.stageRela.detail);
+                [renderData.ledgerSpread, renderData.posSpread] = await spreadSetting.getStageSpreadSetting(ctx, null, true);
+                renderData.measureType = measureType;
+                renderData.whiteList = this.ctx.app.config.multipart.whitelist;
+                renderData.curAuditor = ctx.stage.curAuditor;
+                renderData.auditConst = auditConst;
+                renderData.thirdParty = {
+                    gxby: ctx.session.sessionProject.gxby_status, dagl: ctx.session.sessionProject.dagl_status,
+                };
+                renderData.relaTender = await this.ctx.service.tender.getDataById(relaStage.rela_tid);
+                renderData.relaStage = await this.ctx.service.stage.getDataById(relaStage.rela_sid);
+                renderData.imType = tenderConst.imType;
+                const attData = await ctx.service.stageAtt.getDataByTenderIdAndStageId(relaStage.rela_tid, relaStage.rela_sorder);
+                for (const index in attData) {
+                    attData[index].in_time = ctx.moment(attData[index].in_time * 1000).format('YYYY-MM-DD');
+                }
+                renderData.attData = attData;
+                await this.layout('stage_rela/detail.ejs', renderData, 'stage_rela/detail_modal.ejs');
+            } catch (err) {
+                ctx.log(err);
+                ctx.postError(err, '查看关联标段错误');
+            }
+        }
+
+        async _getStageRelaLedgerData(ctx, relaStage) {
+            const ledgerData = await ctx.service.ledger.getData(relaStage.rela_tid);
+            for (const l of ledgerData) {
+                delete l.unit_price;
+            }
+            const dgnData = await ctx.service.stageBillsDgn.getDgnData(relaStage.rela_tid);
+            const curStageData = await ctx.service.stageRelaBills.getAllDataByCondition({
+                where: {sid: ctx.stage.id, rela_tid: relaStage.rela_tid},
+            });
+            const endStageData = await ctx.service.stageRelaBillsFinal.getAllDataByCondition({
+                where: {sid: ctx.stage.id, rela_tid: relaStage.rela_tid},
+            });
+            this.ctx.helper.assignRelaData(ledgerData, [
+                { data: dgnData, fields: ['deal_dgn_qty1', 'deal_dgn_qty2', 'c_dgn_qty1', 'c_dgn_qty2'], prefix: '', relaId: 'id' },
+                { data: curStageData, fields: ['unit_price', 'contract_qty', 'contract_expr', 'contract_tp', 'qc_qty', 'qc_tp', 'postil'], prefix: '', relaId: 'lid' },
+                { data: endStageData, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', ], prefix: 'end_', relaId: 'lid' },
+            ]);
+            return ledgerData;
+        }
+
+        async _getStageRelaPosData(ctx, relaStage) {
+            const posData = await ctx.service.pos.getPosData({tid: relaStage.rela_tid});
+            const curStageData = await ctx.service.stagePos.getLastestStageData2(relaStage.rela_tid, relaStage.rela_sid);
+            const endStageData = await ctx.service.stagePosFinal.getFinalData({id: relaStage.rela_tid}, relaStage.rela_sid);
+            this.ctx.helper.assignRelaData(posData, [
+                { data: curStageData, fields: ['contract_qty', 'contract_expr', 'contract_tp', 'qc_qty', 'qc_tp', 'postil'], prefix: '', relaId: 'lid' },
+                { data: endStageData, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', ], prefix: 'end_', relaId: 'lid' },
+            ]);
+            return posData;
+        }
+
+        async load(ctx) {
+            try {
+                const relaStage = await this.ctx.service.stageRela.getDataById(ctx.params.trid);
+                const data = JSON.parse(ctx.request.body.data);
+                const filter = data.filter.split(';');
+                const responseData = { err: 0, msg: '', data: {} };
+                for (const f of filter) {
+                    switch (f) {
+                        case 'ledger':
+                            responseData.data.ledgerData = await this._getStageRelaLedgerData(ctx, relaStage);
+                            break;
+                        case 'pos':
+                            responseData.data.posData = await this._getStageRelaPosData(ctx, relaStage);
+                            break;
+                        case 'detail':
+                            responseData.data.detailData = await ctx.service.stageDetail.getLastestStageData(relaStage.rela_tid, relaStage.rela_sid);
+                            break;
+                        case 'change':
+                            responseData.data.changeData = await ctx.service.stageChange.getLastestAllStageData(relaStage.rela_tid, relaStage.rela_sid);
+                            break;
+                        case 'tag':
+                            responseData.data.tags = await ctx.service.ledgerTag.getDatas(relaStage.rela_tid, relaStage.rela_sid);
+                            break;
+                    }
+                }
+
+                ctx.body = responseData;
+            } catch (err) {
+                this.log(err);
+                ctx.body = { err: 1, msg: err.toString(), data: null };
+            }
+        }
+    }
+
+
+    return StageRelaController;
+};

+ 42 - 0
app/controller/tender_controller.js

@@ -1186,6 +1186,48 @@ module.exports = app => {
             }
         }
 
+        async listLoad2(ctx) {
+            try {
+                const data = JSON.parse(ctx.request.body.data);
+                if (!data.type) throw '数据错误';
+                const responseData = {
+                    err: 0,
+                    msg: '',
+                    data: { ledgerAuditConst: auditConst.ledger, stageAuditConst: auditConst.stage },
+                };
+                responseData.data.category = await this.ctx.service.category.getAllCategory(this.ctx.session.sessionProject.id);
+                // 获取用户权限
+                const accountInfo = await this.ctx.service.projectAccount.getDataById(this.ctx.session.sessionUser.accountId);
+                const userPermission = accountInfo !== undefined && accountInfo.permission !== '' ? JSON.parse(accountInfo.permission) : null;
+                const tenderList = await this.ctx.service.tender.getList('', userPermission);
+                for (const t of tenderList) {
+                    if (t.ledger_status === auditConst.ledger.status.checked) {
+                        t.lastStage = await this.ctx.service.stage.getLastestStage(t.id, false);
+                        t.lastCheckedStage = await this.ctx.service.stage.getLastestCompleteStage(t.id);
+                    }
+                }
+                if (data.type === 'all') {
+                    responseData.data.tenders = tenderList;
+                } else if (data.type === 'ledger-checked') {
+                    responseData.data.tenders = tenderList.filter(x => {
+                        return x.ledger_status === auditConst.ledger.status.checked;
+                    });
+                } else if (data.type === 'stage') {
+                    responseData.data.tenders = tenderList.filter(x => {
+                        return x.ledger_status === auditConst.ledger.status.checked && !!x.lastStage;
+                    });
+                } else if (data.type === 'stage-checked') {
+                    responseData.data.tenders = tenderList.filter(x => {
+                        return x.ledger_status === auditConst.ledger.status.checked && !!x.lastCheckedStage;
+                    });
+                }
+                ctx.body = responseData;
+            } catch(err) {
+                this.log(err);
+                this.ajaxErrorBody(err, '获取标段列表错误');
+            }
+        }
+
         async sumLoad(ctx) {
             try {
                 const data = JSON.parse(ctx.request.body.data);

+ 55 - 0
app/extend/context.js

@@ -9,7 +9,62 @@
  */
 
 const moment = require('moment');
+const messageType = require('../const/message_type');
 
 module.exports = {
     moment,
+    setMessage(message, type) {
+        let icon = '';
+        switch (type) {
+            case messageType.SUCCESS:
+                icon = 'check';
+                break;
+            case messageType.ERROR:
+                icon = 'exclamation-circle';
+                break;
+            case messageType.INFO:
+                icon = 'info-circle';
+                break;
+            case messageType.WARNING:
+                icon = 'warning';
+                break;
+            default:
+                break;
+        }
+        this.session.message = {
+            type,
+            icon,
+            message,
+        };
+    },
+
+    postError(error, msg) {
+        if (error.stack) {
+            this.session.postError = msg;
+        } else {
+            this.session.postError = error.toString();
+        }
+    },
+
+    ajaxErrorBody(error, msg) {
+        if (error.stack) {
+            return {err: 4, msg: msg, data: null};
+        } else {
+            return {err: 3, msg: error.toString(), data: null};
+        }
+    },
+
+    log(error) {
+        if (error.stack) {
+            this.logger.error(error);
+        } else {
+            this.setMessage(error, messageType.ERROR);
+            this.getLogger('fail').info(JSON.stringify({
+                error: error,
+                project: this.session.sessionProject,
+                user: this.session.sessionUser,
+                body: this.session.body,
+            }));
+        }
+    }
 };

+ 1 - 1
app/extend/helper.js

@@ -1372,7 +1372,7 @@ module.exports = {
         const sjsSettings = sjsSetting instanceof Array ? sjsSetting : [sjsSetting];
         for (const field of sjsRela) {
             if (field.show) {
-                for (const ss of sjsSetting) {
+                for (const ss of sjsSettings) {
                     const lCol = ss.cols.find(x => {
                         return x.field === field.field;
                     });

+ 100 - 0
app/lib/spread_setting.js

@@ -0,0 +1,100 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+const spreadConst = require('../const/spread');
+const _ = require('lodash');
+const measureType = require('../const/tender').measureType;
+
+const getCtxTender = async function (ctx, tid) {
+    const tender = { id: tid };
+    tender.data = await ctx.service.tender.getDataById(tid);
+    tender.info = await ctx.service.tenderInfo.getTenderInfo(tid);
+    return tender;
+};
+
+function removeFieldCols(setting, cols) {
+    _.remove(setting.cols, function(c) {
+        return cols.indexOf(c.field) > -1;
+    });
+};
+
+function refreshSpreadShow(sjsRela, sjsSetting) {
+    const sjsSettings = sjsSetting instanceof Array ? sjsSetting : [sjsSetting];
+    for (const field of sjsRela) {
+        if (field.show) {
+            for (const ss of sjsSettings) {
+                const lCol = ss.cols.find(x => {
+                    return x.field === field.field;
+                });
+                if (lCol) lCol.title = field.alias || field.name;
+            }
+        } else {
+            for (const ss of sjsSetting) {
+                removeFieldCols(ss, [field.field]);
+            }
+        }
+    }
+}
+
+const getLedgerSpreadSetting = async function(ctx, tid, readOnly) {
+    let tender = tid ? await getCtxTender(ctx, tid) : ctx.tender;
+
+    const setting = tender.data.measure_type === measureType.tz.value
+        ? (tender.info.display.ledger.clQty ? spreadConst.withCl : spreadConst.withoutCl)
+        : (tender.info.display.ledger.clQty ? spreadConst.withClGcl : spreadConst.withoutClGcl);
+
+    const ledger = JSON.parse(JSON.stringify(setting.ledger));
+    const pos = setting.pos ? JSON.parse(JSON.stringify(setting.pos)) : spreadConst.blank;
+    ledger.readOnly = readOnly;
+    pos.readOnly = readOnly;
+    if (tender.data.measure_type === measureType.tz.value) removeFieldCols(ledger, spreadConst.filterCols.tzWithoutCols);
+    if (!tender.info.display.ledger.dgnQty) removeFieldCols(ledger, spreadConst.filterCols.dgnCols);
+
+    const sjsRela = await ctx.service.project.getSjsRela(ctx.session.sessionProject.id);
+    refreshSpreadShow(sjsRela.ledgerCol, [ledger, pos]);
+
+    return [ledger, pos];
+};
+
+const getStageSpreadSetting = async function (ctx, tid, readOnly) {
+    const tender = tid ? await getCtxTender(ctx, tid) : ctx.tender;
+
+    const stageSetting = tender.data.measure_type === measureType.tz.value
+        ? spreadConst.stageTz
+        : (tender.info.display.ledger.clQty ? spreadConst.stageCl : spreadConst.stageNoCl);
+    const ledger = JSON.parse(JSON.stringify(stageSetting.ledger));
+    if (!tender.info.display.ledger.dgnQty) {
+        removeFieldCols(ledger, spreadConst.filterCols.stageDgnCols);
+    }
+    const pos = JSON.parse(JSON.stringify(stageSetting.pos));
+    if (!tender.info.display.stage.realComplete) {
+        removeFieldCols(pos, spreadConst.filterCols.realCompleteCols);
+    }
+    if (!ctx.session.sessionProject.gxby) {
+        removeFieldCols(ledger, spreadConst.filterCols.thirdPartyCols.gxby);
+        removeFieldCols(pos, spreadConst.filterCols.thirdPartyCols.gxby);
+    }
+    if (!ctx.session.sessionProject.dagl) {
+        removeFieldCols(ledger, spreadConst.filterCols.thirdPartyCols.dagl);
+        removeFieldCols(pos, spreadConst.filterCols.thirdPartyCols.dagl);
+    }
+    ledger.readOnly = readOnly;
+    pos.readOnly = readOnly;
+
+    const sjsRela = await ctx.service.project.getSjsRela(ctx.session.sessionProject.id);
+    refreshSpreadShow(sjsRela.ledgerCol, [ledger, pos]);
+
+    return [ledger, pos];
+};
+
+module.exports = {
+    getLedgerSpreadSetting,
+    getStageSpreadSetting,
+};

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1204 - 0
app/public/js/sr_detail.js


+ 247 - 0
app/public/js/sr_info.js

@@ -0,0 +1,247 @@
+'use strict';
+
+const AddRela = function (setting) {
+    const tsObj = {
+        setting,
+        tenderSpread: null,
+        tenderSheet: null,
+        resultSpread: null,
+        resultSheet: null,
+        tenderSourceTree: null,
+        trArray: [],
+        _rebuildStageSelect: function () {
+            const getItems = function (data) {
+                if (!data) return [];
+                const items = [];
+                for (let i = 1; i <= data.stageCount; i++) {
+                    items.push({value: i, text: `第${i}期`});
+                }
+                return items;
+            };
+            for (let i = 0; i < tsObj.resultSheet.getRowCount(); i++) {
+                const cellType2 = new spreadNS.CellTypes.ComboBox().itemHeight(10).editorValueType(spreadNS.CellTypes.EditorValueType.value).items(getItems(tsObj.trArray[i]));
+                tsObj.resultSheet.getCell(i, 1).cellType(cellType2);
+            }
+        },
+        _addTender: function (tender) {
+            const tr = tsObj.trArray.find(x => { return x.tid === tender.tid; });
+            const t = {tid: tender.tid, name: tender.name, stageCount: tender.stageCount};
+            if (!tr) tsObj.trArray.push(t);
+            return t;
+        },
+        _removeTender: function (tender) {
+            const gri = tsObj.trArray.findIndex(function (x, i, arr) {
+                return x.tid === tender.tid;
+            });
+            if (gri >= 0) tsObj.trArray.splice(gri, 1);
+        },
+        reloadResultData: function () {
+            SpreadJsObj.reLoadSheetData(tsObj.resultSheet);
+            this._rebuildStageSelect();
+        },
+        asButtonClicked: function (e, info) {
+            if (!info.sheet.zh_setting) return;
+
+            const col = info.sheet.zh_setting.cols[info.col];
+            if (col.field !== 'selected') return;
+
+            const node = SpreadJsObj.getSelectObject(info.sheet);
+            node.selected = !node.selected;
+            if (node.children && node.children.length > 0) {
+                const posterity = tsObj.tenderSourceTree.getPosterity(node);
+                for (const p of posterity) {
+                    p.selected = node.selected;
+                    if (!p.children || p.children.length === 0){
+                        if (p.selected) {
+                            tsObj._addTender(p);
+                        } else {
+                            tsObj._removeTender(p);
+                        }
+                    }
+                }
+                SpreadJsObj.reLoadRowData(info.sheet, info.row, posterity.length + 1);
+            } else {
+                if (node.selected) {
+                    if (tsObj.trArray.length > 0) {
+                        const orgTender = tsObj.tenderSourceTree.nodes.find(x => { return x.tid === tsObj.trArray[0].tid});
+                        orgTender.selected = false;
+                        tsObj._removeTender(orgTender);
+                        SpreadJsObj.reLoadRowData(info.sheet, tsObj.tenderSourceTree.getNodeIndex(orgTender), 1);
+                    }
+                    tsObj._addTender(node);
+                } else {
+                    tsObj._removeTender(node);
+                }
+                SpreadJsObj.reLoadRowData(info.sheet, info.row, 1);
+            }
+            tsObj.reloadResultData();
+        },
+        arEditEnded: function (e, info) {
+            const data = SpreadJsObj.getSelectObject(info.sheet);
+            const col = info.sheet.zh_setting.cols[info.col];
+            data[col.field] = info.sheet.getValue(info.row, info.col);
+        },
+        initTenderSelect: function () {
+            if (this.tenderSpread) return;
+
+            this.tenderSpread = SpreadJsObj.createNewSpread($('#ar-source-spread')[0]);
+            this.tenderSheet = this.tenderSpread.getActiveSheet();
+            SpreadJsObj.initSheet(this.tenderSheet, {
+                cols: [
+                    {title: '选择', field: 'selected', hAlign: 1, width: 40, formatter: '@', cellType: 'checkbox'},
+                    {title: '名称', field: 'name', hAlign: 0, width: 180, formatter: '@', cellType: 'tree'},
+                    {title: '期数', field: 'phase', hAlign: 1, width: 60, formatter: '@'},
+                    {title: '审批状态', field: 'status', hAlign: 1, width: 60, formatter: '@'}
+                ],
+                emptyRows: 0,
+                headRows: 1,
+                headRowHeight: [32],
+                defaultRowHeight: 21,
+                headerFont: '12px 微软雅黑',
+                font: '12px 微软雅黑',
+                headColWidth: [0],
+                selectedBackColor: '#fffacd',
+                readOnly: true,
+            });
+
+            this.resultSpread = SpreadJsObj.createNewSpread($('#ar-result-spread')[0]);
+            this.resultSheet = this.resultSpread.getActiveSheet();
+
+            const resultSpreadSetting = {
+                cols: [
+                    {title: '名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 180, formatter: '@', readOnly: true},
+                    {title: '可选期', colSpan: '1', rowSpan: '1', field: 'stage', hAlign: 0, width: 60},
+                ],
+                emptyRows: 0,
+                headRows: 1,
+                headRowHeight: [32],
+                defaultRowHeight: 21,
+                headerFont: '12px 微软雅黑',
+                font: '12px 微软雅黑',
+                headColWidth: [],
+                getColor: function (sheet, data, row, col, defaultColor) {
+                    if (data) {
+                        return data.invalid ? '#ddd' : defaultColor;
+                    } else {
+                        return defaultColor;
+                    }
+                }
+            };
+            SpreadJsObj.initSheet(this.resultSheet, resultSpreadSetting);
+            this.tenderSpread.bind(spreadNS.Events.ButtonClicked, tsObj.asButtonClicked);
+            this.resultSpread.bind(spreadNS.Events.EditEnded, tsObj.arEditEnded);
+
+            postData('/list/load2', { type: 'stage-checked' }, function (data) {
+                tsObj.tenderSourceTree = Tender2Tree.convert(data.category, data.tenders, data.ledgerAuditConst, data.stageAuditConst);
+                SpreadJsObj.loadSheetData(tsObj.tenderSheet, SpreadJsObj.DataType.Tree, tsObj.tenderSourceTree);
+                SpreadJsObj.loadSheetData(tsObj.resultSheet, SpreadJsObj.DataType.Data, tsObj.trArray);
+            });
+
+            $('#add-rela-form').submit(function (e) {
+                if (tsObj.trArray.length === 0 || !tsObj.trArray[0].stage) {
+                    e.preventDefault();
+                } else {
+                    $('[name=ar_tid]').val(tsObj.trArray[0].tid);
+                    $('[name=ar_sorder]').val(tsObj.trArray[0].stage);
+                }
+            });
+            // $('#add-rela-ok').click(function () {
+            //     if (tsObj.trArray.length > 0) {
+            //         postData(window.location.pathname + '/add', tsObj.trArray[0], result => {
+            //             tsObj.setting.afterLoad(result);
+            //             $('#add-rela').modal('hide');
+            //         });
+            //     } else {
+            //         $('#add-rela').modal('hide');
+            //     }
+            // });
+        }
+    };
+
+    $('#add-rela').on('shown.bs.modal', () => {
+        tsObj.initTenderSelect();
+        tsObj.trArray.length = 0;
+    });
+
+    const showSelect = function () {
+        $('#add-rela-hint').hide();
+        tsObj.trArray = [];
+        $('#add-rela').modal('show');
+    };
+
+    return { showSelect }
+};
+
+$(document).ready(() => {
+    autoFlashHeight();
+
+    const addRela = AddRela();
+
+    $.subMenu({
+        menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
+        toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
+        key: 'menu.1.0.0',
+        miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
+        callback: function (info) {
+            if (info.mini) {
+                $('.panel-title').addClass('fluid');
+                $('#sub-menu').removeClass('panel-sidebar');
+            } else {
+                $('.panel-title').removeClass('fluid');
+                $('#sub-menu').addClass('panel-sidebar');
+            }
+            autoFlashHeight();
+        }
+    });
+
+    $.divResizer({
+        select: '#revise-right-spr',
+    });
+    // 展开收起标准清单
+    $('a', '#side-menu').bind('click', function (e) {
+        e.preventDefault();
+        const tab = $(this), tabPanel = $(tab.attr('content'));
+        const showSideTools = function (show) {
+            const left = $('#left-view'), right = $('#right-view'), parent = left.parent();
+            if (show) {
+                right.show();
+                autoFlashHeight();
+                /**
+                 * right.show()后, parent被撑开成2倍left.height, 导致parent.width减少了10px
+                 * 第一次left.width调整后,parent的缩回left.height, 此时parent.width又增加了10px
+                 * 故需要通过最终的parent.width再计算一次left.width
+                 *
+                 * Q: 为什么不通过先计算left.width的宽度,以避免计算两次left.width?
+                 * A: 右侧工具栏不一定显示,当右侧工具栏显示过一次后,就必须使用parent和right来计算left.width
+                 *
+                 */
+                    //left.css('width', parent.width() - right.outerWidth());
+                    //left.css('width', parent.width() - right.outerWidth());
+                const percent = 100 - right.outerWidth() /parent.width() * 100;
+                left.css('width', percent + '%');
+            } else {
+                left.width(parent.width());
+                right.hide();
+            }
+        };
+        // 展开工具栏、切换标签
+        if (!tab.hasClass('active')) {
+            const close = $('.active', '#side-menu').length === 0;
+            $('a', '#side-menu').removeClass('active');
+            tab.addClass('active');
+            $('.tab-content .tab-pane').removeClass('active');
+            tabPanel.addClass('active');
+            showSideTools(tab.hasClass('active'));
+        } else {// 收起工具栏
+            tab.removeClass('active');
+            tabPanel.removeClass('active');
+            showSideTools(tab.hasClass('active'));
+        }
+    });
+
+    $('#sr-add').click(addRela.showSelect);
+    $('#sr-del').click(function() {
+        $('[name=srid]', '#del-rela').val(this.getAttribute('srid'));
+        $('#del-rela').modal('show');
+    })
+});

+ 9 - 0
app/router.js

@@ -112,6 +112,7 @@ module.exports = app => {
     // 金额概况
     app.get('/list', sessionAuth, 'tenderController.listDefault');
     app.post('/list/load', sessionAuth, 'tenderController.listLoad');
+    app.post('/list/load2', sessionAuth, 'tenderController.listLoad2');
     app.get('/list/info', sessionAuth, 'tenderController.listInfo');
 
     // 计量进度
@@ -319,6 +320,14 @@ module.exports = app => {
     app.get('/tender/:id/measure/stage/:order/extra/download/file', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageExtraController.downloadFile');
     app.post('/tender/:id/measure/stage/:order/extra/delete/file', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageExtraController.deleteFile');
 
+    //关联台账
+    app.get('/tender/:id/measure/stage/:order/rela', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageRelaController.index');
+    app.post('/tender/:id/measure/stage/:order/rela/add', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageRelaController.add');
+    app.post('/tender/:id/measure/stage/:order/rela/del', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageRelaController.del');
+    app.post('/tender/:id/measure/stage/:order/rela/update', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageRelaController.update');
+    app.get('/tender/:id/measure/stage/:order/rela/detail/:trid', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageRelaController.detail');
+    app.post('/tender/:id/measure/stage/:order/rela/detail/:trid/load', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageRelaController.load');
+
     // 期审批管理
     app.get('/tender/:id/measure/stage/:order/manager', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageController.manager');
     app.post('/tender/:id/measure/stage/:order/manager/audit/delete', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageController.managerAuditDelete');

+ 15 - 36
app/service/stage.js

@@ -223,11 +223,13 @@ module.exports = app => {
                 await this.doCheckStage(stage);
                 if (!stage.readOnly && stage.check_calc) {
                     const tpData = await this.ctx.service.stageBills.getSumTotalPrice(stage);
-                    stage.contract_tp = tpData.contract_tp;
-                    stage.qc_tp = tpData.qc_tp;
+                    const srCache = await this.ctx.service.stageRela.getSumCacheTp(stage.id);
+                    stage.contract_tp = this.ctx.helper.add(tpData.contract_tp, srCache.contract_tp);
+                    stage.qc_tp = this.ctx.helper.add(tpData.qc_tp, srCache.qc_tp);
                     const tp = await this.ctx.service.stagePay.getSpecialTotalPrice(stage);
                     stage.yf_tp = tp.yf;
                     stage.sf_tp = tp.sf;
+                    stage.end_tp = this.ctx.helper.add(stage.pre_tp, stage.tp);
                     await this.update({
                         check_calc: false,
                         contract_tp: stage.contract_tp, qc_tp: stage.qc_tp,
@@ -235,13 +237,13 @@ module.exports = app => {
                     }, { id: stage.id });
                 } else if (stage.tp_history) {
                     const his = this.ctx.helper._.find(stage.tp_history, { times: stage.curTimes, order: stage.curOrder });
-                    // console.log(his);
                     if (his) {
                         stage.contract_tp = his.contract_tp;
                         stage.qc_tp = his.qc_tp;
                         stage.yf_tp = his.yf_tp;
                         stage.sf_tp = his.sf_tp;
                         stage.tp = this.ctx.helper.add(stage.contract_tp, stage.qc_tp);
+                        stage.end_tp = this.ctx.helper.add(stage.pre_tp, stage.tp);
                     }
                 }
             }
@@ -272,30 +274,7 @@ module.exports = app => {
             // 最新一期计量(未审批完成),当前操作人的期详细数据,应实时计算
             if (stages.length === 0) return stages;
 
-            if (stages[0].status !== auditConst.status.checked) {
-                const stage = stages[0];
-                await this.doCheckStage(stage);
-                if (!stage.readOnly) {
-                    const tpData = await this.ctx.service.stageBills.getSumTotalPrice(stage);
-                    stage.contract_tp = tpData.contract_tp;
-                    stage.qc_tp = tpData.qc_tp;
-                    const tp = await this.ctx.service.stagePay.getSpecialTotalPrice(stage);
-                    stage.yf_tp = tp.yf;
-                    stage.sf_tp = tp.sf;
-                    stage.tp = this.ctx.helper.add(stage.contract_tp, stage.qc_tp);
-                    stage.end_tp = this.ctx.helper.add(stage.pre_tp, stage.tp);
-                } else {
-                    const his = this.ctx.helper._.find(stage.tp_history, { times: stage.curTimes, order: stage.curOrder });
-                    if (his) {
-                        stage.contract_tp = his.contract_tp;
-                        stage.qc_tp = his.qc_tp;
-                        stage.yf_tp = his.yf_tp;
-                        stage.sf_tp = his.sf_tp;
-                        stage.tp = this.ctx.helper.add(stage.contract_tp, stage.qc_tp);
-                        stage.end_tp = this.ctx.helper.add(stage.pre_tp, stage.tp);
-                    }
-                }
-            }
+            await this.checkStageGatherData(stages[0]);
             for (const s of stages) {
                 if (s.yf_tp && s.sf_tp === 0) {
                     const sf = await this.ctx.service.stagePay.getHistorySf(s);
@@ -454,6 +433,7 @@ module.exports = app => {
             for (const cb of calcBase) {
                 const sum = await this.ctx.service.stageBills.getSumTotalPrice(stage);
                 const bg = await this.ctx.service.stageChange.getQualityTotalPrice(stage);
+                const srCache = await this.ctx.service.stageRela.getSumCacheTp(stage.id);
                 switch (cb.code) {
                     case 'htj':
                         cb.value = param.contractPrice;
@@ -471,7 +451,7 @@ module.exports = app => {
                         cb.value = param.materialAdvance;
                         break;
                     case 'bqwc':
-                        cb.value = this.ctx.helper.add(sum.contract_tp, sum.qc_tp);
+                        cb.value = this.ctx.helper.sum([sum.contract_tp, sum.qc_tp, srCache.gather_tp]);
                         break;
                     case 'bqht':
                         cb.value = sum.contract_tp;
@@ -481,16 +461,16 @@ module.exports = app => {
                         break;
                     case 'ybbqwc':
                         const sumGcl = await this.ctx.service.stageBills.getSumTotalPriceGcl(stage, '^[^0-9]*1[0-9]{2}(-|$)');
-                        cb.value = this.ctx.helper.add(sumGcl.contract_tp, sumGcl.qc_tp);
+                        cb.value = this.ctx.helper.sum([sumGcl.contract_tp, sumGcl.qc_tp, srCache.gather_tp_100]);
                         break;
                     case 'ybbqbg':
-                        cb.value = bg.common;
+                        cb.value = this.ctx.helper.add(bg.common, srCache.bg_common);
                         break;
                     case 'jdbqbg':
-                        cb.value = bg.more;
+                        cb.value = this.ctx.helper.add(bg.more, srCache.bg_more);
                         break;
                     case 'zdbqbg':
-                        cb.value = bg.great;
+                        cb.value = this.ctx.helper.add(bg.great, srCache.bg_great);
                         break;
                     default:
                         cb.value = 0;
@@ -528,6 +508,9 @@ module.exports = app => {
                 await transaction.delete(this.ctx.service.stageDetail.tableName, { sid: id });
                 await transaction.delete(this.ctx.service.stagePosFinal.tableName, { sid: id });
                 await transaction.delete(this.ctx.service.stageBillsFinal.tableName, { sid: id });
+                await transaction.delete(this.ctx.service.stageRela.tableName, { sid: id });
+                await transaction.delete(this.ctx.service.stageRelaBills.tableName, { sid: id });
+                await transaction.delete(this.ctx.service.stageRelaBillsFinal.tableName, { sid: id });
                 // 删除计量合同支付附件
                 const payList = await this.ctx.service.stagePay.getAllDataByCondition({ where: { sid: id } });
                 if (payList) {
@@ -630,10 +613,6 @@ module.exports = app => {
             return calcBase;
         }
 
-        async getSumbqyfByMaterial(stage) {
-
-        }
-
         /**
          * 获取必要的stage信息调用curTimes, curOrder, id , times, curAuditor(材料调差)
          * @param stage_id_list

+ 252 - 0
app/service/stage_rela.js

@@ -0,0 +1,252 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+const auditConst = require('../const/audit').stage;
+const changeConst = require('../const/change');
+
+module.exports = app => {
+    class StageRela extends app.BaseService {
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'stage_rela';
+        }
+
+        _analysisStageRela(data) {
+            const datas = data instanceof Array ? data : [data];
+            for (const d of datas) {
+                d.cache_tp = d.cache_tp ? JSON.parse(d.cache_tp) : {};
+                d.cache_org_tp = d.cache_org_tp ? JSON.parse(d.cache_org_tp) : {};
+            }
+        }
+
+        async getStageRela(sid) {
+            const result = await this.getAllDataByCondition({
+                where: { sid },
+                orders: [['add_time', 'asc']],
+            });
+            this._analysisStageRela(result);
+            return result;
+        }
+
+        async getHistoryStageRela(tid, sorder) {
+            const sql = 'SELECT * FROM ' + this.tableName + ' WHERE tid = ? And sorder < ? ORDER BY add_time desc';
+            const result = await this.db.query(sql, [tid, sorder]);
+            this._analysisStageRela(result);
+            return result;
+        }
+
+        async getPreRelaStage(tid, sorder, rela_tid) {
+            const sql = 'SELECT * FROM ' + this.tableName + ' WHERE tid = ? AND rela_tid = ? And sorder < ? ORDER BY sorder';
+            return await this.db.queryOne(sql, [tid, rela_tid, sorder]);
+        }
+
+        async _getCacheOrgTp(stage) {
+            const bg = await this.ctx.service.stageChange.getQualityTotalPrice(stage);
+            const gcl100 = await this.ctx.service.stageBills.getSumTotalPriceGcl(stage, '^[^0-9]*1[0-9]{2}(-|$)');
+            return {
+                contract_tp: stage.contract_tp, qc_tp: stage.qc_tp,
+                gather_tp: this.ctx.helper.add(stage.contract_tp, stage.qc_tp),
+                gather_tp_100: this.ctx.helper.add(gcl100.contract_tp, gcl100.qc_tp),
+                bg_common: bg.common, bg_more: bg.more, bg_great: bg.great,
+            };
+        }
+
+        async _calculateRelaStage(stage, preRelaStage) {
+            const result = {}, helper = this.ctx.helper, stageBills = [];
+            const ledger = await this.ctx.service.ledger.getData(stage.tid);
+            const curBillsData = await this.ctx.service.stageBills.getLastestStageData(stage.tid, stage.id);
+            helper.assignRelaData(ledger, [
+                { data: curBillsData, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'postil'], prefix: '', relaId: 'lid' },
+            ]);
+            const dealBills = await this.ctx.service.dealBills.getAllDataByCondition({ where: { tender_id: this.ctx.stage.tid } });
+
+            const gcl = {}, gcl100 = {}, gcl100reg = /^[^0-9]*1[0-9]{2}(-|$)/;
+            for (const t of ledger) {
+                const db = dealBills.find(x => {
+                    return x.code === t.b_code && x.name === t.name && x.unit === t.unit;
+                });
+                t.unit_price = db ? db.unit_price : 0;
+                if (t.contract_qty) t.contract_tp = helper.mul(t.unit_price, t.contract_qty, this.ctx.tender.info.decimal.tp);
+                if (t.qc_qty) t.qc_tp = helper.mul(t.unit_price, t.qc_qty, this.ctx.tender.info.decimal.tp);
+                gcl.contract_tp = helper.add(gcl.contract_tp, t.contract_tp);
+                gcl.qc_tp = helper.add(gcl.qc_tp, t.qc_tp);
+                if (gcl100reg.test(t.b_code)) {
+                    gcl100.contract_tp = helper.add(gcl100.contract_tp, t.contract_tp);
+                    gcl100.qc_tp = helper.add(gcl100.qc_tp, t.qc_tp);
+                }
+                if (t.contract_qty || t.contract_tp || t.qc_qty || t.qc_tp) {
+                    stageBills.push({
+                        tid: this.ctx.tender.id, sid: this.ctx.stage.id, sorder: this.ctx.stage.order,
+                        rela_tid: stage.tid, rela_sid: stage.id, rela_sorder: stage.order,
+                        lid: t.id, unit_price: t.unit_price,
+                        contract_qty: t.contract_qty, contract_tp: t.contract_tp, contract_expr: t.contract_expr,
+                        qc_qty: t.qc_qty, qc_tp: t.qc_tp,
+                        postil: t.postil,
+                    });
+                }
+            }
+            result.contract_tp = gcl.contract_tp;
+            result.qc_tp = gcl.qc_tp;
+            result.gather_tp = helper.add(gcl.contract_tp, gcl.qc_tp);
+            result.gather_tp_100 = helper.add(gcl100.contract_tp, gcl100.qc_tp);
+
+            const sql = 'SELECT sc.*, c.quality, cb.code, cb.name, cb.unit FROM ' + this.ctx.service.stageChange.tableName + ' sc' +
+                '  LEFT JOIN ' + this.ctx.service.change.tableName + ' c ON sc.cid = c.cid' +
+                '  LEFT JOIN ' + this.ctx.service.changeAuditList.tableName + ' cb ON sc.cbid = cb.id' +
+                '  WHERE sid = ?';
+            const data = await this.db.query(sql, [stage.id]);
+            const bqData = [];
+            for (const d of data) {
+                if (!d.qty) continue;
+                let bd = bqData.find(x => { return x.lid === d.lid && x.quality === d.quality; });
+                if (!bd) {
+                    const bills = dealBills.find(x => {
+                        return x.code === d.code && x.name === d.name && x.unit === d.unit;
+                    });
+                    if (!bills) continue;
+                    bd = { lid: d.lid, quality: d.quality, unit_price: bills.unit_price };
+                    bqData.push(bd);
+                }
+                const tp = this.ctx.helper.mul(d.qty, bd.unit_price, tender.info.decimal.tp);
+                bd.tp = this.ctx.helper.add(bd.tp, tp);
+            }
+            result.bg_common = helper.sum(helper._.map(bqData.filter(x => {return x.quality === changeConst.quality.common.value; }), 'tp'));
+            result.bg_more = helper.sum(helper._.map(bqData.filter(x => {return x.quality === changeConst.quality.more.value; }), 'tp'));
+            result.bg_great = helper.sum(helper._.map(bqData.filter(x => {return x.quality === changeConst.quality.great.value; }), 'tp'));
+
+            const stageBillsFinal = [];
+            const preStageBills = preRelaStage
+                ? this.ctx.service.stageRelaBillsFinal.getAllDataByCondition({ where: { sid: preRelaStage.sid, rela_tid: preRelaStage.rela_tid } })
+                : [];
+            for (const b of stageBills) {
+                const p = preStageBills.find(x => { return x.lid === b.lid });
+                stageBillsFinal.push({
+                    tid: this.ctx.tender.id, sid: this.ctx.stage.id, sorder: this.ctx.stage.order,
+                    rela_tid: stage.tid, rela_sid: stage.id, rela_sorder: stage.order,
+                    lid: b.lid,
+                    contract_qty: p ? helper.add(p.contract_qty, b.contract_qty) : b.contract_qty,
+                    contract_tp: p ? helper.add(p.contract_tp, b.contract_tp) : b.contract_tp,
+                    qc_qty: p ? helper.add(p.qc_qty, b.qc_qty) : b.qc_qty,
+                    qc_tp: p ? helper.add(p.qc_tp, b.qc_tp) : b.qc_tp,
+                });
+                if (p) preStageBills.splice(preStageBills.indexOf(p), 1);
+            }
+            for (const p of preStageBills) {
+                stageBillsFinal.push({
+                    tid: this.ctx.tender.id, sid: this.ctx.stage.id, sorder: this.ctx.stage.order,
+                    rela_tid: stage.tid, rela_sid: stage.id, rela_sorder: stage.order,
+                    lid: b.lid,
+                    contract_qty: p.contract_qty, contract_tp: p.contract_tp,
+                    qc_qty: p.qc_qty, qc_tp: p.qc_tp,
+                });
+            }
+            return [result, stageBills, stageBillsFinal];
+        }
+
+        async calculateRelaStage(relaStage) {
+            const preRelaStage = await this.getPreRelaStage(this.ctx.tender.id, this.ctx.stage.order, relaStage.tid);
+            const cache_org_tp = await this._getCacheOrgTp(relaStage);
+            const [cache_tp, stageBills, stageBillsFinal] = await this._calculateRelaStage(relaStage, preRelaStage);
+            return { cache_tp, cache_org_tp, stageBills, stageBillsFinal }
+        }
+
+        async addStageRela(relaStage) {
+            const addTime = new Date();
+            const tender = await this.ctx.service.tender.getDataById(relaStage.tid);
+            if (!tender) throw '关联标段不存在';
+            const conn = await this.db.beginTransaction();
+            try {
+                const result = await this.calculateRelaStage(relaStage);
+                const data = {
+                    tid: this.ctx.tender.id,
+                    sid: this.ctx.stage.id, sorder: this.ctx.stage.order,
+                    rela_tid: relaStage.tid, rela_sid: relaStage.id, rela_sorder: relaStage.order, rela_tname: tender.name,
+                    add_time: addTime, update_time: addTime,
+                    cache_tp: JSON.stringify(result.cache_tp), cache_org_tp: JSON.stringify(result.cache_org_tp),
+                };
+                await conn.insert(this.tableName, data);
+                if (result.stageBills.length > 0) await conn.insert(this.ctx.service.stageRelaBills.tableName, result.stageBills);
+                if (result.stageBillsFinal.length > 0) await conn.insert(this.ctx.service.stageRelaBillsFinal.tableName, result.stageBillsFinal);
+                await conn.update(this.ctx.service.stage.tableName, { id: this.ctx.stage.id, check_calc: 1 });
+                await conn.commit();
+            } catch (err) {
+                await conn.rollback();
+                throw err;
+            }
+        }
+
+        async deleteStageRela(id) {
+            const rela = await this.getDataById(id);
+            if (!rela) throw '关联标段不存在';
+            const conn = await this.db.beginTransaction();
+            try {
+                await conn.delete(this.tableName, { id: rela.id });
+                await conn.delete(this.ctx.service.stageRelaBills.tableName, {sid: rela.sid, rela_tid: rela.rela_tid});
+                await conn.delete(this.ctx.service.stageRelaBillsFinal.tableName, {sid: rela.sid, rela_tid: rela.rela_tid});
+                await conn.update(this.ctx.service.stage.tableName, { id: this.ctx.stage.id, check_calc: 1 });
+                await conn.commit();
+            } catch (err) {
+                await conn.rollback();
+                throw err;
+            }
+        }
+
+        async updateStageRela(id) {
+            const rela = await this.getDataById(id);
+            const relaStage = await this.ctx.service.stage.getDataById(rela.rela_sid);
+            const conn = await this.db.beginTransaction();
+            try {
+                const result = await this.calculateRelaStage(relaStage);
+                await conn.update(this.tableName, {
+                    id: rela.id, update_time: new Date(),
+                    cache_tp: JSON.stringify(result.cache_tp), cache_org_tp: JSON.stringify(result.cache_org_tp)
+                });
+
+                await conn.delete(this.ctx.service.stageRelaBills.tableName, {sid: rela.sid, rela_tid: rela.rela_tid});
+                if (result.stageBills.length > 0) await conn.insert(this.ctx.service.stageRelaBills.tableName, result.stageBills);
+
+                await conn.delete(this.ctx.service.stageRelaBillsFinal.tableName, {sid: rela.sid, rela_tid: rela.rela_tid});
+                if (result.stageBillsFinal.length > 0) await conn.insert(this.ctx.service.stageRelaBillsFinal.tableName, result.stageBillsFinal);
+
+                await conn.update(this.ctx.service.stage.tableName, { id: this.ctx.stage.id, check_calc: 1 });
+                await conn.commit();
+            } catch (err) {
+                await conn.rollback();
+                throw err;
+            }
+        }
+
+        async getSumCacheTp (sid) {
+            const result = {};
+            const relas = await this.getAllDataByCondition({ where: { sid } });
+            if (relas.length === 0) return result;
+
+            this._analysisStageRela(relas);
+            for (const r of relas) {
+                result.contract_tp = this.ctx.helper.add(result.contract_tp, r.cache_tp.contract_tp);
+                result.qc_tp = this.ctx.helper.add(result.qc_tp, r.cache_tp.qc_tp);
+                result.gather_tp = this.ctx.helper.add(result.gather_tp, r.cache_tp.gather_tp);
+                result.gather_tp_100 = this.ctx.helper.add(result.gather_tp_100, r.cache_tp.gather_tp_100);
+                result.bg_common = this.ctx.helper.add(result.bg_common, r.cache_tp.bg_common);
+                result.bg_more = this.ctx.helper.add(result.bg_more, r.cache_tp.bg_more);
+                result.bg_great = this.ctx.helper.add(result.bg_more, r.cache_tp.bg_more);
+            }
+            return result;
+        }
+    }
+
+    return StageRela;
+};

+ 29 - 0
app/service/stage_rela_bills.js

@@ -0,0 +1,29 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date 2021/9/11
+ * @version
+ */
+
+module.exports = app => {
+
+    class StageRelaBills extends app.BaseService {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'stage_rela_bills';
+        }
+
+    }
+
+    return StageRelaBills;
+};

+ 29 - 0
app/service/stage_rela_bills_final.js

@@ -0,0 +1,29 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date 2021/9/11
+ * @version
+ */
+
+module.exports = app => {
+
+    class StageRelaBillsFinal extends app.BaseService {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'stage_rela_bills_final';
+        }
+
+    }
+
+    return StageRelaBillsFinal;
+};

+ 5 - 38
app/service/tender.js

@@ -15,7 +15,7 @@ const fs = require('fs');
 const path = require('path');
 const commonQueryColumns = [
     'id', 'project_id', 'name', 'status', 'category', 'ledger_times', 'ledger_status', 'measure_type', 'user_id', 'valuation',
-    'total_price', 'deal_tp', 'copy_id', 's2b_gxby_check', 's2b_gxby_limit', 's2b_dagl_check', 's2b_dagl_limit'
+    'total_price', 'deal_tp', 'copy_id', 's2b_gxby_check', 's2b_gxby_limit', 's2b_dagl_check', 's2b_dagl_limit', 'has_rela',
 ];
 
 module.exports = app => {
@@ -305,6 +305,10 @@ module.exports = app => {
                 await transaction.delete(this.ctx.service.stageBonus.tableName, { tid: id });
                 await transaction.delete(this.ctx.service.stageOther.tableName, { tid: id });
 
+                await transaction.delete(this.ctx.service.stageRela.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.stageRelaBills.tableName, { tid: id });
+                await transaction.delete(this.ctx.service.stageRelaBillsFinal.tableName, { tid: id });
+
                 await transaction.delete(this.ctx.service.change.tableName, { tid: id });
                 await transaction.delete(this.ctx.service.changeAudit.tableName, { tid: id });
                 await transaction.delete(this.ctx.service.changeAuditList.tableName, { tid: id });
@@ -345,43 +349,6 @@ module.exports = app => {
             }
         }
 
-        /**
-         * 切换标段
-         *
-         * @param {Number} tenderId - 标段id
-         * @return {Boolean} - 返回切换结果
-         */
-        async switchTender(tenderId) {
-            // 获取该用户拥有的项目数据
-            const sessionUser = this.ctx.session.sessionUser;
-            const tenderInfo = await this.ctx.service.projectAccount.getProjectInfoByAccount(sessionUser.account);
-
-            let result = false;
-            // 判断切换的标段是否属于对应用户
-            if (tenderInfo.length < 0) {
-                return result;
-            }
-
-            let targetTender = {};
-            for (const tmp of tenderInfo) {
-                if (tmp.id === tenderId) {
-                    result = true;
-                    targetTender = tmp;
-                }
-            }
-
-            // 成功后更改session
-            if (result) {
-                this.ctx.session.sessionTender = {
-                    id: targetTender.id,
-                    name: targetTender.name,
-                    userAccount: targetTender.user_account,
-                };
-            }
-
-            return result;
-        }
-
         async getCheckTender(tid) {
             const tender = await this.ctx.service.tender.getTender(tid);
             tender.info = await this.ctx.service.tenderInfo.getTenderInfo(tid);

+ 9 - 0
app/view/stage/stage_sub_menu.ejs

@@ -15,6 +15,15 @@
                 </li>
             </ul>
         </div>
+        <% if (ctx.tender.data.has_rela) { %>
+        <div class="nav-box">
+            <ul class="nav-list list-unstyled">
+                <li class="<% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/stage/' + ctx.stage.order + '/rela') { %>active<% } %>">
+                    <a href="/tender/<%- ctx.tender.id %>/measure/stage/<%- ctx.stage.order %>/rela"><span class="ml-3">关联台账</span></a>
+                </li>
+            </ul>
+        </div>
+        <% } %>
         <% if (ctx.session.sessionProject.page_show.stageExtra) { %>
         <div class="nav-box">
             <ul class="nav-list list-unstyled">

+ 9 - 0
app/view/stage/stage_sub_mini_menu.ejs

@@ -17,6 +17,15 @@
                 </li>
             </ul>
         </div>
+        <% if (ctx.tender.data.has_rela) { %>
+        <div class="nav-box">
+            <ul class="nav-list list-unstyled">
+                <li class="<% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/stage/' + ctx.stage.order + '/rela') { %>active<% } %>">
+                    <a href="/tender/<%- ctx.tender.id %>/measure/stage/<%- ctx.stage.order %>/rela"><span class="ml-3">关联台账</span></a>
+                </li>
+            </ul>
+        </div>
+        <% } %>
         <% if (ctx.session.sessionProject.page_show.stageExtra) { %>
         <div class="nav-box">
             <ul class="nav-list list-unstyled">

+ 416 - 0
app/view/stage_rela/detail.ejs

@@ -0,0 +1,416 @@
+<% include ./stage_rela_menu.ejs %>
+<div class="panel-content">
+    <div class="panel-title">
+        <div class="title-main d-flex">
+            <% include ./stage_rela_mini_menu.ejs %>
+            <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">
+                            <i class="fa fa-list-ol"></i> 显示层级
+                        </button>
+                        <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
+                            <a class="dropdown-item" name="showLevel" tag="1" href="javascript: void(0);">第一层</a>
+                            <a class="dropdown-item" name="showLevel" tag="2" href="javascript: void(0);">第二层</a>
+                            <a class="dropdown-item" name="showLevel" tag="3" href="javascript: void(0);">第三层</a>
+                            <a class="dropdown-item" name="showLevel" tag="4" href="javascript: void(0);">第四层</a>
+                            <a class="dropdown-item" name="showLevel" tag="5" href="javascript: void(0);">第五层</a>
+                            <a class="dropdown-item" name="showLevel" tag="last" href="javascript: void(0);">最底层</a>
+                            <a class="dropdown-item" name="showLevel" tag="leafXmj" href="javascript: void(0);">只显示项目节</a>
+                            <a class="dropdown-item" name="showLevel" tag="curMeasure" href="javascript: void(0);">只显示本期计量</a>
+                        </div>
+                    </div>
+                </div>
+                <div class="d-inline-block">
+                    <div class="input-group input-group-sm ml-2">
+                        <div class="input-group-prepend">
+                            <span class="input-group-text" id="basic-addon1">表达式</span>
+                        </div>
+                        <input type="text" class="form-control form-control-sm m-0" id="bills-expr" readonly="">
+                    </div>
+                </div>
+            </div>
+            <div class="ml-auto">
+            </div>
+        </div>
+    </div>
+    <div class="content-wrap pr-46">
+        <div class="c-header p-0">
+        </div>
+        <div class="row w-100 sub-content">
+            <div id="left-view" class="c-body" style="width: 100%">
+                <!--上部分-->
+                <div class="sjs-height-1" id="stage-ledger">
+                </div>
+                <!--下部分-->
+                <div class="bcontent-wrap" id="main-bottom">
+                    <div id="main-resize" class="resize-y" r-Type="height" div1="#stage-ledger" div2="#main-bottom" store-id="stage-main" store-version="1.0.0" min="100"></div>
+                    <div class="bc-bar mb-1">
+                        <ul class="nav nav-tabs">
+                            <li class="nav-item">
+                                <a class="nav-link active" href="#">计量单元</a>
+                            </li>
+                            <!--工程量清单模式操作-->
+                            <li class="nav-item">
+                                <div class="ml-2">
+                                    <div class="input-group input-group-sm">
+                                        <div class="input-group-prepend" style="display: none">
+                                            <div class="input-group-text">
+                                                <div class="form-group form-check mb-0">
+                                                    <input type="checkbox" class="form-check-input group-checkbox" id="pos-over-search">
+                                                    <label class="form-check-label" for="pos-over-search">超计</label><!--勾选状态增加颜色text-danger-->
+                                                </div>
+                                            </div>
+                                            <div class="input-group-text">
+                                                <div class="form-group form-check mb-0">
+                                                    <input type="checkbox" class="form-check-input group-checkbox" id="pos-empty-search">
+                                                    <label class="form-check-label" for="pos-empty-search">漏计</label><!--勾选状态增加颜色text-warning-->
+                                                </div>
+                                            </div>
+                                        </div>
+                                        <input type="text" class="form-control form-control-sm" placeholder="按名称查找" id="pos-search-keyword">
+                                        <!--搜索结果显示-->
+                                        <div class="input-group-append" >
+                                            <span class="input-group-text" id="pos-search-result">结果:0</span>
+                                        </div>
+                                        <div class="input-group-append" >
+                                            <button class="btn btn-outline-secondary btn-sm" type="button" title="上一个" id="pos-search-pre"><i class="fa fa-angle-double-left"></i></button>
+                                            <button class="btn btn-outline-secondary btn-sm" type="button" title="下一个" id="pos-search-next"><i class="fa fa-angle-double-right"></i></button>
+                                        </div>
+                                    </div>
+                                </div>
+                            </li>
+                            <li class="nav-item">
+                                <div class="d-inline-block">
+                                    <div class="input-group input-group-sm ml-2">
+                                        <div class="input-group-prepend">
+                                            <span class="input-group-text" id="basic-addon1">表达式</span>
+                                        </div>
+                                        <input type="text" class="form-control form-control-sm m-0" id="pos-expr" readonly="">
+                                    </div>
+                                </div>
+                            </li>
+                        </ul>
+                    </div>
+                    <div class="sp-wrap" id="stage-pos">
+                    </div>
+                </div>
+            </div>
+            <div id="right-view" class="c-body" style="display: none; width: 33%;">
+                <div class="resize-x" id="right-spr" r-Type="width" div1="#left-view" div2="#right-view" title="调整大小" a-type="percent"><!--调整左右高度条--></div>
+                <div class="tab-content">
+                    <!--中间计量-->
+                    <div id="zhongjian" class="tab-pane tab-select-show">
+                        <div class="sjs-bar">
+                            <div class="d-flex">
+                                <button class="btn btn-sm btn-outline-primary" id="im-locate2bills">定位</button>
+                                <div class="input-group input-group-sm col-6">
+                                    <div class="input-group-prepend">
+                                        <span class="input-group-text" id="im-locate-info">1/20</span>
+                                    </div>
+                                    <div class="input-group-append">
+                                        <button class="btn btn-outline-secondary" type="button" title="上一个" id="im-locate-pre"><i class="fa fa-angle-double-left"></i></button>
+                                        <button class="btn btn-outline-secondary" type="button" title="下一个" id="im-locate-next"><i class="fa fa-angle-double-right"></i></button>
+                                    </div>
+                                </div>
+                                <button class="btn btn-sm btn-outline-primary ml-auto" href="#choose" data-toggle="modal" data-target="#choose">设置生成规则</button>
+                            </div>
+                        </div>
+                        <div class="sjs-height-5" id="detail-spread" style="overflow:hidden">
+                        </div>
+                        <div class="sjs-bottom">
+                            <div class="resize-y" id="zhongjian-spr" r-Type="height" div1=".sjs-height-5" div2=".sjs-bottom" title="调整大小"><!--调整上下高度条--></div>
+                            <div class="zhongjian-msg" style="height:400px;overflow-y: auto">
+                                <table class="table table-sm table-bordered" id="detail-show">
+                                    <tbody>
+                                    <tr><th width="120" id="type-title-contract">本期合同计量数量</th><td id="show-contract-jl"></td></tr>
+                                    <tr><th id="type-title-qc">本期变更计量数量</th><td id="show-qc-jl"></td></tr>
+                                    <tr><th>变更令号</th><td id="show-bgl-code"></td></tr>
+                                    <tr><th>变更图号</th><td id="show-bgl-drawing-code"></td></tr>
+                                    <tr><th>部位</th><td id="show-bw-name"></td></tr>
+                                    <tr><th>起止桩号</th><td id="show-peg"></td></tr>
+                                    <tr><th>细目</th><td id="show-xm-name"></td></tr>
+                                    <tr><th>位置</th><td id="show-position"></td></tr>
+                                    <tr><th>计量单元</th><td id="show-jldy"></td></tr>
+                                    <tr><th>图册号</th><td id="show-drawing-code"></td></tr>
+                                    <tr><th colspan="2">计算式说明</th></tr>
+                                    <tr><td colspan="2" id="show-calc-memo" style="word-wrap:break-word"></td></tr>
+                                    <tr><th colspan="2">草图</th></tr>
+                                    <tr><td colspan="2"><a href="#imgview" data-toggle="modal" data-target="#imgview"><img src="" id="show-calc-img" class="w-100"></a></td></tr>
+                                    </tbody>
+                                </table>
+                                <div style="display: none;" id="detail-edit">
+                                    <!--编辑状态-->
+                                    <div class="input-group input-group-sm mb-2">
+                                        <div class="input-group-prepend">
+                                            <span class="input-group-text" id="type-title-contract">本期合同计量数量</span>
+                                        </div>
+                                        <input type="text" class="form-control" value="" id="contract-jl" readonly="">
+                                    </div>
+                                    <div class="input-group input-group-sm mb-2">
+                                        <div class="input-group-prepend">
+                                            <span class="input-group-text" id="type-title-qc">本期变更计量数量</span>
+                                        </div>
+                                        <input type="text" class="form-control" value="" id="qc-jl" readonly="">
+                                    </div>
+                                    <div class="input-group input-group-sm mb-2">
+                                        <div class="input-group-prepend">
+                                            <span class="input-group-text">变更令号</span>
+                                        </div>
+                                        <input type="text" class="form-control" value="" readonly="" id="bgl-code">
+                                    </div>
+                                    <div class="input-group input-group-sm mb-2">
+                                        <div class="input-group-prepend">
+                                            <span class="input-group-text">变更图号</span>
+                                        </div>
+                                        <input type="text" class="form-control" value="" readonly="" id="bgl-drawing-code">
+                                    </div>
+                                    <div class="input-group input-group-sm mb-2">
+                                        <div class="input-group-prepend">
+                                            <span class="input-group-text" style="width: 66px">部位</span>
+                                        </div>
+                                        <input type="text" class="form-control" value="" id="bw-name">
+                                    </div>
+                                    <div class="input-group input-group-sm mb-2">
+                                        <div class="input-group-prepend">
+                                            <span class="input-group-text">起止桩号</span>
+                                        </div>
+                                        <input type="text" class="form-control" value="" id="peg">
+                                    </div>
+                                    <div class="input-group input-group-sm mb-2">
+                                        <div class="input-group-prepend">
+                                            <span class="input-group-text" style="width: 66px">细目</span>
+                                        </div>
+                                        <input type="text" class="form-control" value="" id="xm-name">
+                                    </div>
+                                    <div class="input-group input-group-sm mb-2">
+                                        <div class="input-group-prepend">
+                                            <span class="input-group-text" style="width: 66px">位置</span>
+                                        </div>
+                                        <input type="text" class="form-control" value="" id="position">
+                                    </div>
+                                    <div class="input-group input-group-sm mb-2">
+                                        <div class="input-group-prepend">
+                                            <span class="input-group-text" style="width: 66px">计量单元</span>
+                                        </div>
+                                        <input type="text" class="form-control" value="" id="jldy">
+                                    </div>
+                                    <div class="input-group input-group-sm mb-2">
+                                        <div class="input-group-prepend">
+                                            <span class="input-group-text" style="width: 66px">图册号</span>
+                                        </div>
+                                        <input type="text" class="form-control" value="" id="drawing-code">
+                                    </div>
+                                    <div class="form-group">
+                                        <label>计算式说明:</label>
+                                        <textarea class="form-control" id="calc-memo"></textarea>
+                                    </div>
+                                    <div class="form-group">
+                                        <div class="d-flex justify-content-between my-3">
+                                            <label>计算草图:</label>
+                                        </div>
+                                        <p><a href="#imgview" data-toggle="modal" data-target="#imgview"><img src="" id="calc-img" class="w-100"></a></p>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <!--查找定位-->
+                    <div id="search" class="tab-pane tab-select-show">
+                        <div class="sjs-bar-1">
+                            <div class="input-group input-group-sm pb-1">
+                                <div class="input-group-prepend">
+                                    <div class="input-group-text">
+                                        <input type="radio" name="searchType" id="over"> 超计
+                                    </div>
+                                    <div class="input-group-text">
+                                        <input type="radio" name="searchType" id="empty"> 漏计
+                                    </div>
+                                </div>
+                                <input type="text" class="form-control form-control-sm" placeholder="可查找 项目节编号 / 清单编号 /名称" id="keyword">
+                                <div class="input-group-append">
+                                    <button class="btn btn-outline-secondary btn-sm" type="button" id="searchLedger">搜索</button>
+                                </div>
+                            </div>
+                        </div>
+                        <div id="search-result" class="sjs-sh-1">
+                        </div>
+                    </div>
+                    <!--附件-->
+                    <div id="fujian" class="tab-pane tab-select-show">
+                        <div class="sjs-bar">
+                            <ul class="nav nav-tabs">
+                                <li class="nav-item">
+                                    <a class="nav-link active" data-toggle="tab" href="#dqjiedian" role="tab" fujian-content="dqjiedian">当前节点</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a class="nav-link" data-toggle="tab" href="#syfujian" role="tab" fujian-content="syfujian">所有附件</a>
+                                </li>
+                                <li class="nav-item ml-auto pt-1">
+                                    <a href="javascript:void(0);" id="bach-download" class="btn btn-sm btn-primary" type="curr">批量下载</a>
+                                    <!--所有附件 翻页-->
+                                    <span id="showPage" style="display: none"><a href="javascript:void(0);" class="page-select ml-3" content="pre"><i class="fa fa-chevron-left"></i></a> <span id="currentPage">1</span>/<span id="totalPage">10</span> <a href="javascript:void(0);" class="page-select mr-3" content="next"><i class="fa fa-chevron-right"></i></a></span>
+                                </li>
+                            </ul>
+                        </div>
+                        <a href="javascript: void(0);" id="zipDown" download style="display: none;"></a>
+                        <div class="tab-content">
+                            <div class="tab-pane active" id="dqjiedian">
+                                <div class="sjs-height-3" style="overflow:auto; overflow-x:hidden;">
+                                    <table class="table table-sm table-bordered table-hover" style="word-break:break-all; table-layout: fixed">
+                                        <tr><th width="25"><input type="checkbox" class="check-all-file"><th>文件名</th><th width="80">上传</th></tr>
+                                        <tbody id="nodelist-table" class="list-table">
+                                        </tbody>
+                                    </table>
+                                </div>
+                            </div>
+                            <div class="tab-pane" id="syfujian">
+                                <div class="sjs-height-3" style="overflow:auto; overflow-x:hidden;">
+                                    <table class="table table-sm table-bordered table-hover" style="word-break:break-all; table-layout: fixed">
+                                        <tr><th width="25"><input type="checkbox" class="check-all-file"></th><th>文件名</th><th width="80">上传</th></tr>
+                                        <tbody id="alllist-table" class="list-table">
+                                        </tbody>
+                                    </table>
+                                </div>
+                            </div>
+                            <div class="sjs-bottom">
+                                <div class="resize-y" id="file-spr" r-Type="height" div1=".sjs-height-3" div2=".sjs-bottom" title="调整大小"><!--调整上下高度条--></div>
+                                <br>
+                                <div class="tab-content" id="showAttachment" style="display: none" file-id="">
+                                    <div class="sjs-bottom-2">
+                                        <a href="javascript:void(0);" target="_blank" style="display: none" id="load-file"></a>
+                                        <div class="d-flex justify-content-end mb-1" id="btn-att">
+                                            <a href="javascript:void(0);" content="location" class="btn btn-sm btn-outline-primary" style="margin-right: 5px">定位</a>
+                                            <a href="javascript:void(0);" content="view" class="btn btn-sm btn-outline-primary" style="margin-right: 5px">查看</a>
+                                            <!--默认 有删除权限-->
+                                            <a href="javascript:void(0);" content="del" class="btn btn-sm text-danger" style="display: none; margin-right: 5px">删除</a>
+                                            <!--默认 有编辑权限-->
+                                            <a href="javascript:void(0);" content="edit" class="btn btn-sm btn-outline-primary" style="display: none; margin-right: 5px">编辑</a>
+                                            <!--编辑模式-->
+                                            <a href="javascript:void(0);" content="save" class="btn btn-sm btn-outline-success mr-1" style="display: none; margin-right: 5px">保存</a>
+                                            <a href="javascript:void(0);" content="cancel" class="btn btn-sm btn-outline-secondary" style="display: none; margin-right: 5px">取消</a>
+                                        </div>
+                                        <!--显示信息-->
+                                        <table class="table table-sm table-bordered" id="show-att" style="word-break:break-all; table-layout: fixed">
+                                            <tbody>
+                                            <tr><th>文件名</th><td colspan="3">asdasd.jpg</td></tr>
+                                            <tr><th>所在节点</th><td colspan="3" id="show-att-node">1 第一部分 建筑安装工程非</td></tr>
+                                            <!-- <tr><td colspan="4"><a href="javascript:void(0);" target="_blank"><span>下载附件</span></a></td></tr> -->
+                                            <tr><th>上传者</th><td>张三</td><th>上传时间</th><td>2018-10-20</td></tr>
+                                            <tr><th>备注</th><td colspan="3"></td></tr>
+                                            </tbody>
+                                        </table>
+                                        <div id="edit-att" style="display: none">
+                                            <!--编辑模式-->
+                                            <div class="form-group">
+                                                <div class="input-group input-group-sm">
+                                                    <div class="input-group-prepend">
+                                                        <span class="input-group-text">文件名</span>
+                                                    </div>
+                                                    <input type="text" class="form-control form-control-sm" value="asdasd">
+                                                    <div class="input-group-append">
+                                                        <span class="input-group-text">.jpg</span>
+                                                    </div>
+                                                </div>
+                                            </div>
+                                            <div class="form-group">
+                                                <div class="input-group input-group-sm">
+                                                    <div class="input-group-prepend">
+                                                        <span class="input-group-text">所在节点</span>
+                                                    </div>
+                                                    <input type="text" class="form-control form-control-sm" value="1 第一部分 建筑安装工程非" readonly="">
+                                                </div>
+                                            </div>
+                                            <div class="form-group">
+                                                <div class="input-group input-group-sm">
+                                                    <div class="input-group-prepend">
+                                                        <span class="input-group-text">上传时间</span>
+                                                    </div>
+                                                    <input type="text" class="form-control form-control-sm" value="2018-10-20" readonly="">
+                                                </div>
+                                            </div>
+                                            <div class="form-group">
+                                                <div class="input-group input-group-sm">
+                                                    <div class="input-group-prepend">
+                                                        <span class="input-group-text">备注</span>
+                                                    </div>
+                                                    <input type="text" class="form-control form-control-sm" value="">
+                                                </div>
+                                            </div>
+                                            <div class="form-group">
+                                                <label>替换文件</label>
+                                                <div class="custom-file">
+                                                    <input type="file" class="custom-file-input" id="change-att-btn">
+                                                    <label class="custom-file-label" data-browse="浏览" for="customFile">选择文件</label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div id="bills-tag" class="tab-pane tab-select-show">
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="side-menu">
+            <!--右侧菜单-->
+            <ul class="nav flex-column right-nav">
+                <li class="nav-item">
+                    <a class="nav-link" content="#zhongjian" id="zhongjiantab" href="javascript: void(0);">中间计量</a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link" content="#search" href="javascript: void(0);">查找定位</a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link" content="#fujian" href="javascript: void(0);">附件</a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link" content="#bills-tag" href="javascript: void(0);">书签</a>
+                </li>
+            </ul>
+        </div>
+    </div>
+    <div style="display: none">
+        <img src="/public/images/ellipsis_horizontal.png" id="ellipsis-icon" />
+        <img src="/public/images/icon-ok.png" id="icon-ok" />
+        <img src="/public/images/file_clip.png" id="rela-file-icon">
+        <img src="/public/images/file_clip_hover.png" id="rela-file-hover">
+    </div>
+</div>
+<script src="/public/js/moment/moment.min.js"></script>
+<script>
+    String.prototype.replaceAll = function (FindText, RepText) {
+        regExp = new RegExp(FindText, 'g');
+        return this.replace(regExp, RepText);
+    }
+    const readOnly = true;
+    const ledgerSpreadSetting = JSON.parse('<%- JSON.stringify(ledgerSpread) %>');
+    ledgerSpreadSetting.localCache = {
+        key: 'stage-bills',
+        colWidth: true,
+    }
+    const posSpreadSetting = JSON.parse('<%- JSON.stringify(posSpread) %>');
+    posSpreadSetting.localCache = {
+        key: 'stage-pos',
+        colWidth: true,
+    }
+    const tender = JSON.parse(unescape('<%- escape(JSON.stringify(ctx.tender)) %>'));
+    const tenderInfo = JSON.parse(unescape('<%- escape(JSON.stringify(ctx.tender.info)) %>'));
+    const thousandth = <%- ctx.tender.info.display.thousandth %>;
+    const stage = JSON.parse(unescape('<%- escape(JSON.stringify(ctx.stage)) %>'));
+    const relaStage = JSON.parse(unescape('<%- escape(JSON.stringify(relaStage)) %>'));
+    const relaTender = JSON.parse(unescape('<%- escape(JSON.stringify(relaTender)) %>'));
+    const whiteList = JSON.parse('<%- JSON.stringify(whiteList) %>');
+    let attData = JSON.parse(unescape('<%- escape(JSON.stringify(attData)) %>'));
+    const ckColSetting = 'stage-col-visible-1.0.3-<%- ctx.tender.id %>';
+    const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');
+    const thirdParty = JSON.parse('<%- JSON.stringify(thirdParty) %>');
+    const measureType = JSON.parse('<%- JSON.stringify(measureType) %>');
+    const imType = JSON.parse('<%- JSON.stringify(imType) %>');
+</script>
+<style>
+
+</style>

+ 0 - 0
app/view/stage_rela/detail_modal.ejs


+ 88 - 0
app/view/stage_rela/index.ejs

@@ -0,0 +1,88 @@
+<% include ./stage_rela_menu.ejs %>
+<div class="panel-content">
+    <div class="panel-title">
+        <div class="title-main d-flex justify-content-between">
+            <% include ./stage_rela_mini_menu.ejs %>
+            <div class="ml-auto">
+                <% if (!ctx.stage.readOnly && [auditConst.status.uncheck, auditConst.status.checkNo].indexOf(ctx.stage.status) >= 0) {%>
+                <a href="javascript: void(0);" id="sr-add" class="btn btn-primary btn-sm">新增关联</a>
+                <% } %>
+            </div>
+        </div>
+    </div>
+    <div class="content-wrap row pr-46">
+        <div class="c-header p-0 col-12"></div>
+        <div class="w-100 sub-content row">
+            <div class="c-body" id="left-view" style="width: 100%">
+                <div class="sjs-height-0">
+                    <table class="table table-bordered">
+                        <thead>
+                        <tr>
+                            <th class="text-center" width="80px">标段名称</th>
+                            <th class="text-center" width="70px">期</th>
+                            <th class="text-center" width="110px">新增时间</th>
+                            <th class="text-center" width="110px">本期计量金额</th>
+                            <th class="text-center" width="90px">操作</th>
+                        </tr>
+                        </thead>
+                        <tbody>
+                            <% for (const sr of stageRela) { %>
+                            <td><%- sr.rela_tname %></td>
+                            <td>第<%- sr.rela_sorder %>期</td>
+                            <td><%- ctx.moment(sr.add_time).format('YYYY-MM-DD HH:mm:ss') %></td>
+                            <td><%- (sr.cache_tp.gather_tp ? sr.cache_tp.gather_tp : '') %></td>
+                            <td>
+                                <% if (!ctx.stage.readOnly || [auditConst.stauts.uncheck, auditConst.status.checkNo].indexOf(ctx.stage.status) >= 0) { %>
+                                <div class="d-inline-block">
+                                    <form method="post" action="/tender/<%= ctx.tender.id %>/measure/stage/<%= ctx.stage.order %>/rela/update">
+                                        <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />
+                                        <input type="hidden" name="srid" value="<%- sr.id %>" />
+                                        <button type="submit" class="btn btn-primary btn-sm">更新</button>
+                                    </form>
+                                </div>
+                                <a href="javascript: void(0);" srid="<%- sr.id %>" class="btn btn-danger btn-sm ">删除</a>
+                                <% } %>
+                            </td>
+                            <% } %>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+            <!--右栏-->
+            <div class="c-body" id="right-view" style="display: none; width: 33%;">
+                <div class="resize-x" id="revise-right-spr" r-Type="width" div1="#left-view" div2="#right-view" title="调整大小" a-type="percent"><!--调整左右高度条--></div>
+                <div class="tab-content">
+                    <div id="tr-history" class="tab-pane">
+                        <div class="sjs-sh-2" style="overflow:auto">
+                            <table class="table table-bordered">
+                                <thead>
+                                <tr>
+                                    <th class="text-center" width="80px">往期</th>
+                                    <th class="text-center" width="80px">标段名称</th>
+                                    <th class="text-center" width="70px">期</th>
+                                    <th class="text-center" width="110px">新增时间</th>
+                                    <th class="text-center" width="110px">计量金额</th>
+                                </tr>
+                                </thead>
+                                <tbody>
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <!--右侧菜单-->
+        <div class="side-menu">
+            <!--右侧菜单-->
+            <ul class="nav flex-column right-nav" id="side-menu">
+                <li class="nav-item">
+                    <a class="nav-link" content="#tr-history" href="javascript: void(0);">关联历史</a>
+                </li>
+            </ul>
+        </div>
+    </div>
+</div>
+<script>
+
+</script>

+ 58 - 0
app/view/stage_rela/modal.ejs

@@ -0,0 +1,58 @@
+<div class="modal fade" id="add-rela" data-backdrop="static">
+    <div class="modal-dialog modal-lg" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="add-rela-title">选择标段</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="row">
+                    <div class="col-6">
+                        <h5>可选标段 </h5>
+                        <div class="modal-height-300" id="ar-source-spread">
+                        </div>
+                    </div>
+                    <div class="col-6">
+                        <h5>已选标段 </h5>
+                        <div class="modal-height-300" id="ar-result-spread">
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <form class="modal-footer" id="add-rela-form" method="post" action="/tender/<%= ctx.tender.id %>/measure/stage/<%= ctx.stage.order %>/rela/add">
+                <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>"/>
+                <input type="hidden" name="ar_tid">
+                <input type="hidden" name="ar_sorder">
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
+                <button type="submit" class="btn btn-sm btn-primary" id="add-rela-ok">确定</button>
+            </form>
+        </div>
+    </div>
+</div>
+
+<div class="modal fade" id="del-rela" data-backdrop="static">
+    <form class="modal-dialog" role="document" action="/tender/<%= ctx.tender.id %>/measure/stage/<%= ctx.stage.order %>/rela/del" method="post" onsubmit="return $.trim($('#del-rela-confirm').val()) === '删除关联';">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">删除关联标段</h5>
+            </div>
+            <div class="modal-body">
+                <div class="alert alert-danger">
+                    删除后,数据无法恢复,请谨慎操作;
+                    <br>确认删除,请在以下输入框输入"&nbsp;&nbsp;&nbsp;<b>删除关联</b>&nbsp;&nbsp;&nbsp;",再点击“确认”按钮。
+                </div>
+                <div class="form-group">
+                    <input class="form-control form-control-sm" placeholder="" type="text" id="del-rela-confirm">
+                </div>
+            </div>
+            <div class="modal-footer">
+                <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />
+                <input type="hidden" name="srid" />
+                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal" >取消</button>
+                <button type="submit" class="btn btn-danger btn-sm">确认</button>
+            </div>
+        </div>
+    </form>
+</div>

+ 14 - 0
app/view/stage_rela/stage_rela_menu.ejs

@@ -0,0 +1,14 @@
+<div class="panel-sidebar" id="sub-menu">
+    <div class="sidebar-title" data-toggle="tooltip" data-placement="right" data-original-title="第<%- ctx.stage.order%>期 - 关联台账">
+        关联台账
+    </div>
+    <div class="scrollbar-auto">
+        <% include ./stage_rela_menu_list.ejs %>
+        <div class="side-fold"><a href="javascript: void(0)" data-toggle="tooltip" data-placement="top" data-original-title="折叠侧栏" id="to-mini-menu"><i class="fa fa-upload fa-rotate-270"></i></a></div>
+    </div>
+    <script>
+        new Vue({
+            el: '.scrollbar-auto',
+        });
+    </script>
+</div>

+ 5 - 0
app/view/stage_rela/stage_rela_menu_list.ejs

@@ -0,0 +1,5 @@
+<nav-menu title="返回" url="/tender/<%= ctx.tender.id %>/measure/stage/<%= ctx.stage.order %>" tclass="text-primary" ml="1" icon="fa-chevron-left"></nav-menu>
+<nav-menu title="概况" url="/tender/<%= ctx.tender.id %>/measure/stage/<%= ctx.stage.order + '/rela'%>" ml="3" active="<%= (ctx.url.indexOf('detail') < 0 ? 1 : -1) %>"></nav-menu>
+<% for (const sr of stageRela ) { %>
+<nav-menu title="<%- sr.rela_tname %>" url="/tender/<%= ctx.tender.id %>/measure/stage/<%= ctx.stage.order %>/rela/detail/<%- sr.id %>" ml="3" active="<%= ctx.url.indexOf('/detail/' + sr.id) %>"></nav-menu>
+<% } %>

+ 16 - 0
app/view/stage_rela/stage_rela_mini_menu.ejs

@@ -0,0 +1,16 @@
+<!--折起的菜单-->
+<div class="min-side" id="sub-mini-menu" style="display: none;">
+    <div id="sub-mini-hint" class="side-switch" data-container="body" data-toggle="popover" data-placement="bottom" data-content="这里打开收起的菜单栏"></div>
+    <div class="side-switch">
+        <i class="fa fa-bars"></i>
+    </div>
+    <div class="side-menu" id="mini-menu-list" style="display: none">
+        <% include ./stage_rela_menu_list.ejs %>
+        <div class="side-fold"><a href="javascript: void(0);" data-toggle="tooltip" data-placement="top" data-original-title="展开侧栏" id="to-menu"><i class="fa fa-upload fa-rotate-90"></i></a></div>
+    </div>
+</div>
+<script>
+    new Vue({
+        el: '.side-menu',
+    });
+</script>

+ 39 - 0
config/web.js

@@ -504,6 +504,45 @@ const JsFiles = {
                 mergeFile: 'se_other',
             },
         },
+        stageRela: {
+            info: {
+                files: [
+                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
+                    '/public/js/decimal.min.js',
+                ],
+                mergeFiles: [
+                    '/public/js/component/menu.js',
+                    '/public/js/sub_menu.js',
+                    '/public/js/div_resizer.js',
+                    '/public/js/spreadjs_rela/spreadjs_zh.js',
+                    '/public/js/path_tree.js',
+                    '/public/js/shares/tenders2tree.js',
+                    '/public/js/shares/sjs_setting.js',
+                    '/public/js/zh_calc.js',
+                    '/public/js/sr_info.js',
+                ],
+                mergeFile: 'sr_info',
+            },
+            detail: {
+                files: [
+                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
+                    '/public/js/decimal.min.js',
+                ],
+                mergeFiles: [
+                    '/public/js/component/menu.js',
+                    '/public/js/sub_menu.js',
+                    '/public/js/div_resizer.js',
+                    '/public/js/shares/cs_tools.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/stage_im.js',
+                    '/public/js/sr_detail.js',
+                ],
+                mergeFile: 'sr_detail',
+            },
+        },
         measure: {
             compare: {
                 files: [

+ 20 - 302
sql/update.sql

@@ -1,302 +1,20 @@
-ALTER TABLE `zh_ledger_0`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_ledger_1`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_ledger_2`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_ledger_3`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_ledger_4`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_ledger_5`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_ledger_6`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_ledger_7`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_ledger_8`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_ledger_9`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_bills_0`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_bills_1`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_bills_2`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_bills_3`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_bills_4`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_bills_5`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_bills_6`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_bills_7`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_bills_8`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_bills_9`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_0`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_1`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_2`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_3`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_4`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_5`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_6`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_7`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_8`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_9`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_10`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_11`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_12`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_13`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_14`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_15`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_16`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_17`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_18`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_pos_19`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_0`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_1`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_2`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_3`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_4`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_5`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_6`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_7`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_8`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_9`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_10`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_11`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_12`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_13`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_14`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_15`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_16`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_17`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_18`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_revise_pos_19`
-ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
-ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
-ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
-
-ALTER TABLE `zh_project`
-ADD COLUMN `sjs_rela`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'sjs相关配置' AFTER `fun_rela`;
+ALTER TABLE `zh_tender`
+ADD COLUMN `has_rela`  tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否有关联台账' AFTER `had_map`;
+
+CREATE TABLE `NewTable` (
+`id`  int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id' ,
+`tid`  int(11) UNSIGNED NOT NULL COMMENT '标段id' ,
+`sid`  int(11) UNSIGNED NOT NULL COMMENT '期id' ,
+`sorder`  tinyint(4) UNSIGNED NOT NULL COMMENT '期序号' ,
+`rela_tid`  int(11) UNSIGNED NOT NULL COMMENT '关联标段id' ,
+`rela_sid`  int(11) UNSIGNED NOT NULL COMMENT '关联期id' ,
+`rela_sorder`  tinyint(4) UNSIGNED NOT NULL COMMENT '关联期序号' ,
+`add_time`  datetime NOT NULL COMMENT '添加时间' ,
+`update_time`  datetime NOT NULL COMMENT '更新时间' ,
+`total_price`  decimal(28,6) NULL ,
+`cache_tp`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '缓存金额(当前标段单价计算)' ,
+`cache_org_tp`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '缓存金额(原关联标段单价计算)' ,
+PRIMARY KEY (`id`)
+)
+COMMENT='计量期-关联台账(含缓存数据)'
+;

+ 302 - 0
sql/update20210906.sql

@@ -0,0 +1,302 @@
+ALTER TABLE `zh_ledger_0`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_ledger_1`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_ledger_2`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_ledger_3`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_ledger_4`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_ledger_5`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_ledger_6`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_ledger_7`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_ledger_8`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_ledger_9`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_bills_0`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_bills_1`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_bills_2`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_bills_3`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_bills_4`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_bills_5`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_bills_6`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_bills_7`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_bills_8`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_bills_9`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `check_calc`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_0`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_1`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_2`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_3`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_4`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_5`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_6`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_7`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_8`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_9`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_10`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_11`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_12`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_13`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_14`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_15`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_16`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_17`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_18`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_pos_19`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_0`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_1`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_2`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_3`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_4`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_5`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_6`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_7`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_8`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_9`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_10`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_11`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_12`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_13`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_14`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_15`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_16`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_17`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_18`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_revise_pos_19`
+ADD COLUMN `ex_memo1`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注1' AFTER `dagl_url`,
+ADD COLUMN `ex_memo2`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注2' AFTER `ex_memo1`,
+ADD COLUMN `ex_memo3`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注3' AFTER `ex_memo2`;
+
+ALTER TABLE `zh_project`
+ADD COLUMN `sjs_rela`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'sjs相关配置' AFTER `fun_rela`;