瀏覽代碼

联动计量

MaiXinRong 3 月之前
父節點
當前提交
fda8a1384d

+ 2 - 0
app/controller/setting_controller.js

@@ -1017,6 +1017,8 @@ module.exports = app => {
                 if (data.gxby_check !== undefined) updateData.s2b_gxby_check = data.gxby_check;
                 if (data.dagl_limit !== undefined) updateData.s2b_dagl_limit = data.dagl_limit;
                 if (data.dagl_check !== undefined) updateData.s2b_dagl_check = data.dagl_check;
+                if (data.multi_limit !== undefined) updateData.s2b_multi_limit = data.multi_limit;
+                if (data.multi_check !== undefined) updateData.s2b_multi_check = data.multi_check;
                 await ctx.service.tender.saveApiRela(data.tid, updateData);
                 ctx.body = {err: 0, msg: '', data: null};
             } catch (error) {

+ 3 - 0
app/controller/stage_controller.js

@@ -225,6 +225,8 @@ module.exports = app => {
             this.ledgerExtraColumn = ['is_tp'];
             if (this.ctx.session.sessionProject.gxby) this.ledgerExtraColumn.push('gxby_status', 'gxby_url', 'gxby_limit');
             if (this.ctx.session.sessionProject.dagl) this.ledgerExtraColumn.push('dagl_status', 'dagl_url', 'dagl_limit');
+            // if (tender.data.s2b_multi_check) this.ledgerExtraColumn.push('multi_limit', 'gxby_date');
+            if (tender.data.s2b_multi_check) this.ledgerExtraColumn.push('multi_limit');
             this.ledgerMemoColumn = ['memo'];
 
             this.posColumn = ['id', 'tid', 'lid', 'name', 'position', 'porder', 'sgfh_qty', 'quantity', 'ex_qty1', 'add_stage_order', 'drawing_code'];
@@ -233,6 +235,7 @@ module.exports = app => {
             this.posExtraColumn = [];
             if (this.ctx.session.sessionProject.gxby) this.posExtraColumn.push('gxby_status', 'gxby_url', 'gxby_limit');
             if (this.ctx.session.sessionProject.dagl) this.posExtraColumn.push('dagl_status', 'dagl_url', 'dagl_limit');
+            // if (tender.data.s2b_multi_check) this.posExtraColumn.push('gxby_date');
             this.posMemoColumn = [];
 
             const extraFields = await spreadSetting.getExtraFields(this.ctx, tender.id, 'stage');

+ 36 - 39
app/lib/ledger.js

@@ -916,58 +916,55 @@ class checkData {
         }
         return 0; // 合法
     }
-    _checkMulti3f(checkData, statusData, limitOption){
+    _checkMulti3f(bills, checkData, statusData, limitOption){
         if (!this._checkMultiCondition(statusData, limitOption.condition)) return;
 
-        if (checkData.is_tp) return this._check3fMultiTp(checkData, limitOption.limit, limitOption);
-        return this._check3fMultiQty(checkData, limitOption.limit, limitOption, checkData.unit);
+        if (bills.is_tp) return this._check3fMultiTp(checkData, limitOption.limit, limitOption);
+        return this._check3fMultiQty(checkData, limitOption.limit, limitOption, bills.unit);
+    }
+    _getMulti3fErrorInfo(bills, lo, checkResult, pos = null) {
+        if (!checkResult || checkResult <= 0) return;
+        const errorType = checkResult === 1 ? '超计' : '漏计';
+        if (!lo.rangeHint) lo.rangeHint = lo.limit ? (lo.lower === lo.upper ? `${lo.lower}%` : `${lo.lower}%~${lo.upper}%`) : '不允许计量';
+        if (pos) {
+            this.checkResult.error.push({
+                ledger_id: bills.ledger_id, pid: pos.id, code: pos.code, b_code: '', name: pos.name, data: pos, errorType: 's2b_multi', memo: `${errorType}:${lo.hint}(${lo.rangeHint})`
+            });
+        } else {
+            this.checkResult.error.push({
+                ledger_id: bills.ledger_id, pid: '', code: bills.code, b_code: bills.b_code, name: bills.name, data: bills, errorType: 's2b_multi', memo: `${errorType}:${lo.hint}(${lo.rangeHint})`
+            });
+        }
+
     }
-    _checkLeafPos3fMultiLimit(xmj, leafXmj, pos, posTree, multiLimit) {
+    _checkLeafBills3fMultiLimit(bills, multiLimit, leafXmj) {
         if (!multiLimit) return;
-
         const limitOption = this.limits.find(x => { return x.limit_id === multiLimit; });
         if (!limitOption) return;
 
-        const ctNode = leafXmj || xmj;
-
-        for (const lo of limitOption.options) {
-            const checkResult = this._checkMulti3f(pos, ctNode, lo);
-            if (checkResult > 0) {
-                const errorType = checkResult === 1 ? '超计' : '漏计';
-                if (!lo.rangeHint) lo.rangeHint = lo.limit ? (lo.lower === lo.upper ? `${lo.lower}%` : `${lo.lower}%~${lo.upper}%`) : '不允许计量';
-                this.checkResult.error.push({
-                    xid: xmj.ledger_id, pid: pos.tree_id, errorType: 's2b_multi',
-                    code: pos.code, b_code: pos.b_code, name: pos.name, data: pos,
-                    memo: `${errorType}:${lo.hint}(${lo.rangeHint})`,
-                });
-            }
-        }
-    }
-    _recursiveCheckPos3fMultiLimit(xmj, leafXmj, pos, posTree, parentLimit) {
-        if (pos.children && pos.children.length > 0) {
-            for (const p of pos.children) {
-                this._recursiveCheckPos3fMultiLimit(xmj, pos.b_code ? leafXmj : pos, p, posTree, parentLimit);
+        const posRange = this.checkPos.getLedgerPos(bills.id);
+        if (posRange && posRange.length > 0) {
+            for (const p of posRange) {
+                for (const lo of limitOption.options) {
+                    const checkResult = this._checkMulti3f(bills, p, p, lo);
+                    this._getMulti3fErrorInfo(bills, lo, checkResult, p);
+                }
             }
         } else {
-            this._checkLeafPos3fMultiLimit(xmj, leafXmj, pos, posTree, parentLimit);
-        }
-    }
-    _checkLeafXmj3fMultiLimit(xmj, multiLimit) {
-        const posRange = this.checkPos.minorTree(xmj.id);
-        if (posRange && posRange.nodes.length > 0) {
-            for (const p of posRange.children) {
-                this._recursiveCheckPos3fMultiLimit(xmj, null, p, posRange, multiLimit);
+            for (const lo of limitOption.options) {
+                const checkResult = this._checkMulti3f(bills, bills, leafXmj, lo);
+                this._getMulti3fErrorInfo(bills, lo, checkResult);
             }
         }
     }
-    _recursiveCheckXmj3fMultiLimit(xmj, parentLimit = '') {
-        const limit = xmj.multi_limit || parentLimit;
-        if (xmj.children && xmj.children.length > 0) {
-            for (const c of xmj.children) {
-                this._recursiveCheckXmj3fMultiLimit(c, limit);
+    _recursiveCheckBills3fMultiLimit(bills, parentLimit = '', leafXmj = null) {
+        const limit = bills.multi_limit || parentLimit;
+        if (bills.children && bills.children.length > 0) {
+            for (const c of bills.children) {
+                this._recursiveCheckBills3fMultiLimit(c, limit, c.b_code ? (bills.b_code ? leafXmj : bills) : c);
             }
         } else {
-            this._checkLeafXmj3fMultiLimit(xmj, limit);
+            this._checkLeafBills3fMultiLimit(bills, limit, bills.b_code ? leafXmj : bills);
         }
     }
 
@@ -1058,7 +1055,7 @@ class checkData {
         this.valueCheck = new ValueCheck(this.ctx);
 
         for (const b of this.checkBills.children) {
-            this._recursiveCheckXmj3fMultiLimit(b);
+            this._recursiveCheckBills3fMultiLimit(b);
         }
     }
     checkBillsQty(fields) {

+ 17 - 15
app/public/js/ledger_check.js

@@ -430,51 +430,51 @@ const ledgerCheckUtil = {
             }
             return result;
         };
-        const checkMulti3f = function(checkData, statusData, limitOption) {
+        const checkMulti3f = function(bills, checkData, statusData, limitOption) {
             if (!checkMultiCondition(statusData, limitOption.condition)) return;
 
-            if (checkData.is_tp) return check3fTp(checkData, limitOption.limit, limitOption);
-            return check3fQty(checkData, limitOption.limit, limitOption, checkData.unit);
+            if (bills.is_tp) return check3fTp(checkData, limitOption.limit, limitOption);
+            return check3fQty(checkData, limitOption.limit, limitOption, bills.unit);
         };
 
         const getErrorInfo = function(bills, lo, checkResult, pos = null) {
-            if (checkResult <= 0) return;
+            if (!checkResult || checkResult <= 0) return;
             const errorType = checkResult === 1 ? '超计' : '漏计';
             if (!lo.rangeHint) lo.rangeHint = lo.limit ? (lo.lower === lo.upper ? `${lo.lower}%` : `${lo.lower}%~${lo.upper}%`) : '不允许计量';
             if (pos) {
-                error.push({lid: ledgerTree.getNodeKey(bills), pid: pos.id, code: pos.code, b_code: '', name: pos.name, data: pos, memo: `${errorType}:${lo.hint}(${lo.rangeHint})` });
+                error.push({ledger_id: ledgerTree.getNodeKey(bills), pid: pos.id, code: pos.code, b_code: '', name: pos.name, data: pos, errorType: 's2b_multi', memo: `${errorType}:${lo.hint}(${lo.rangeHint})` });
             } else {
-                error.push({lid: ledgerTree.getNodeKey(bills), pid: '', code: bills.code, b_code: bills.b_code, name: bills.name, data: bills, memo: `${errorType}:${lo.hint}(${lo.rangeHint})` });
+                error.push({ledger_id: ledgerTree.getNodeKey(bills), pid: '', code: bills.code, b_code: bills.b_code, name: bills.name, data: bills, errorType: 's2b_multi', memo: `${errorType}:${lo.hint}(${lo.rangeHint})` });
             }
         };
-        const checkLeafBills3fMultiLimit = function(bills, multiLimit) {
+        const checkLeafBills3fMultiLimit = function(bills, multiLimit, leafXmj) {
             if (!multiLimit) return;
-            const limitOption = option.limits.find(x => { return x.id === multiLimit });
+            const limitOption = option.limits.find(x => { return x.limit_id === multiLimit });
             if (!limitOption) return;
 
-            const posRange = pos.getLedgerPos(bills.id);
-            if (posRange && posRange.nodes.length > 0) {
+            const posRange = ledgerPos.getLedgerPos(bills.id);
+            if (posRange && posRange.length > 0) {
                 for (const p of posRange) {
                     for (const lo of limitOption.options) {
-                        const checkResult = checkMulti3f(p, bills, lo);
+                        const checkResult = checkMulti3f(bills, p, p, lo);
                         getErrorInfo(bills, lo, checkResult, p);
                     }
                 }
             } else {
                 for (const lo of limitOption) {
-                    const checkResult = checkMulti3f(bills, bills, lo);
+                    const checkResult = checkMulti3f(bills, bills, leafXmj, lo);
                     getErrorInfo(bills, lo, checkResult);
                 }
             }
         };
-        const recursiveCheckBills3fMultiLimit = function (bills, parentLimit = '') {
+        const recursiveCheckBills3fMultiLimit = function (bills, parentLimit = '', leafXmj = null) {
             const limit = bills.multi_limit || parentLimit;
             if (bills.children && bills.children.length > 0) {
                 for (const c of bills.children) {
-                    recursiveCheckBills3fMultiLimit(c, limit);
+                    recursiveCheckBills3fMultiLimit(c, limit, c.b_code ? (bills.b_code ? leafXmj : bills) : c);
                 }
             } else {
-                checkLeafBills3fMultiLimit(bills, limit);
+                checkLeafBills3fMultiLimit(bills, limit, bills.b_code ? leafXmj : bills);
             }
         };
 
@@ -494,9 +494,11 @@ const ledgerCheck2 = async function (setting) {
             warningData.push({
                 type: checkType,
                 ledger_id: node.ledger_id,
+                pid: node.pid,
                 code: node.code,
                 b_code: node.b_code,
                 name: node.name,
+                memo: node.memo,
             })
         }
     };

+ 72 - 0
app/public/js/setting_tender.js

@@ -0,0 +1,72 @@
+$(document).ready(() => {
+    autoFlashHeight();
+    const xmjSpread = SpreadJsObj.createNewSpread($('#xmj-spread')[0]);
+    const xmjSheet = xmjSpread.getActiveSheet();
+    const limitItems = limits.map(l => {
+        return { value: l.limit_id, text: l.name };
+    });
+    limitItems.unshift({ value: '', text: '' });
+    const setting = {
+        cols: [
+            { title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 180, formatter: '@', cellType: 'tree', readOnly: true, },
+            { title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 360, formatter: '@', readOnly: true, },
+            { title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 60, formatter: '@', cellType: 'unit', readOnly: true, },
+            { title: '联动计量配置', colSpan: '1', rowSpan: '2', field: 'multi_limit', hAlign: 0, width: 150, cellType: 'customizeCombo', comboItems: limitItems },
+        ],
+        emptyRows: 0,
+        headRows: 2,
+        headRowHeight: [25, 25],
+        defaultRowHeight: 21,
+        headerFont: '12px 微软雅黑',
+        font: '12px 微软雅黑',
+    };
+    sjsSettingObj.setFxTreeStyle(setting, sjsSettingObj.FxTreeStyle.jz);
+    SpreadJsObj.initSheet(xmjSheet, setting);
+    const xmjTree = createNewPathTree('ledger', {
+        id: 'ledger_id',
+        pid: 'ledger_pid',
+        order: 'order',
+        level: 'level',
+        rootId: -1,
+        keys: ['id', 'tender_id', 'ledger_id'],
+        autoExpand: 3,
+    });
+    const xmjTreeObj = {
+        /**
+         * 编辑单元格响应事件
+         * @param {Object} e
+         * @param {Object} info
+         */
+        editEnded: function (e, info) {
+            if (!info.sheet.zh_setting) return;
+
+            const col = info.sheet.zh_setting.cols[info.col];
+            if (col.field !== 'multi_limit') return;
+
+            const node = SpreadJsObj.getSelectObject(info.sheet);
+            const updateData = { id: node.id, multi_limit: info.editingText || '' };
+            if (updateData.multi_limit === node.multi_limit || (!updateData.multi_limit && !node.multi_limit)) return;
+
+            // 更新至服务器
+            postData(window.location.pathname + '/update', updateData, function (result) {
+                const xmj = xmjTree.nodes.find(x => { return x.id === result.id });
+                if (xmj) xmj.multi_limit = result.multi_limit;
+                SpreadJsObj.reLoadRowData(info.sheet, info.row, 1);
+            }, function() {
+                SpreadJsObj.reLoadRowData(info.sheet, info.row, 1);
+            });
+        },
+    };
+    xmjSpread.bind(spreadNS.Events.EditEnded, xmjTreeObj.editEnded);
+
+    postData(window.location.pathname + '/load', {filter: 'xmj;limit'}, function(result) {
+        result.limit.forEach(l => {
+            const rx = result.xmj.find(x => { return x.id === l.id; });
+            if (rx) rx.multi_limit = l.multi_limit;
+        });
+        xmjTree.loadDatas(result.xmj);
+        SpreadJsObj.loadSheetData(xmjSheet, SpreadJsObj.DataType.Tree, xmjTree);
+    });
+
+
+});

+ 2 - 1
app/public/js/shares/cs_tools.js

@@ -83,6 +83,7 @@ const showSelectTab = function(select, spread, afterShow) {
                                 case 's2b_over_dagl': return '违规计量(档案管理)';
                                 case 's2b_lost_gxby': return '遗漏计量(工序报验)';
                                 case 's2b_lost_dagl': return '遗漏计量(档案管理)';
+                                case 's2b_multi': return x.memo || '联动计量超限';
                                 case 'minus_cb': return '负变更清单漏计';
                                 case 'change_over': return '变更令超计';
                                 case 'settle': return '结算清单';
@@ -226,7 +227,7 @@ const showSelectTab = function(select, spread, afterShow) {
                         title: '类型', field: 'type', width: 150, formatter: '@',
                         getValue: function (data){
                             if (setting.checkType) {
-                                return checkTypeText[data.type] || '';
+                                return data.memo || checkTypeText[data.type] || '';
                             } else {
                                 return '';
                             }

+ 9 - 0
app/service/ledger_extra.js

@@ -31,6 +31,15 @@ module.exports = app => {
                 columns: ['id', ...columns],
             });
         }
+
+        async updateMultiLimit(id, multi_limit) {
+            const exist = await this.getDataById(id);
+            if (exist) {
+                await this.defaultUpdate({ id, multi_limit });
+            } else {
+                await this.db.insert(this.tableName, { id, tid: this.ctx.tender.id, multi_limit });
+            }
+        }
     }
 
     return LedgerExtra;

+ 3 - 1
app/service/tender.js

@@ -15,7 +15,9 @@ 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', 'create_time',
-    'total_price', 'deal_tp', 'copy_id', 's2b_gxby_check', 's2b_gxby_limit', 's2b_dagl_check', 's2b_dagl_limit', 'has_rela', 'his_id', 'rpt_show_level',
+    'total_price', 'deal_tp', 'copy_id',
+    's2b_gxby_check', 's2b_gxby_limit', 's2b_dagl_check', 's2b_dagl_limit', 's2b_multi_check', 's2b_multi_limit',
+    'has_rela', 'his_id', 'rpt_show_level',
     'build_status', 'settle_order', 'spid',
 ];
 

+ 16 - 0
app/view/setting/s2b.ejs

@@ -135,6 +135,7 @@
                                     <th class="text-center" >标段创建时间/期审批时间</th>
                                     <th class="text-center">工序报验</th>
                                     <th class="text-center">档案管理</th>
+                                    <th class="text-center">联动计量</th>
                                 </tr>
                                 </thead>
                                 <% for (const t of tenders) { %>
@@ -168,6 +169,21 @@
                                             <label class="form-check-label" for="inlineCheckbox4">限制上报</label>
                                         </div>
                                     </td>
+                                    <td class="text-center">
+                                        <div class="form-check form-check-inline">
+                                            <input class="form-check-input" type="checkbox" id="inlineCheckbox5" <% if (t.s2b_multi_check) { %>checked<% } %> name="multi_check" onchange="updateS2bSetting(this);" value="<%- t.s2b_multi_check %>">
+                                            <input type="hidden" name="_csrf_j2" value="<%= ctx.csrf %>">
+                                            <label class="form-check-label" for="inlineCheckbox5">检查计量</label>
+                                        </div>
+                                        <div class="form-check form-check-inline">
+                                            <input class="form-check-input" type="checkbox" id="inlineCheckbox6" <% if (t.s2b_multi_limit) { %>checked<% } %> name="multi_limit" onchange="updateS2bSetting(this);" value="<%- t.s2b_multi_limit %>">
+                                            <input type="hidden" name="_csrf_j2" value="<%= ctx.csrf %>">
+                                            <label class="form-check-label" for="inlineCheckbox6">限制上报</label>
+                                        </div>
+                                        <div class="form-check form-check-inline">
+                                            <a class="btn btn-sm btn-primary" href="/setting/api/tender/<%- t.id %>" target="_blank">详细配置</a>
+                                        </div>
+                                    </td>
                                 </tr>
                                 <% } %>
                             </table>

+ 17 - 0
app/view/setting/tender.ejs

@@ -0,0 +1,17 @@
+<% include ./sub_menu.ejs %>
+<div class="panel-content">
+    <div class="panel-title">
+        <div class="title-main">
+            <h2>标段【<%- tender.name %>】联动计量配置</h2>
+        </div>
+    </div>
+    <div class="content-wrap">
+        <div class="c-body">
+            <div class="sjs-height-0" id="xmj-spread">
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    const limits = JSON.parse('<%- JSON.stringify(limits) %>');
+</script>

+ 1 - 0
app/view/stage/index.ejs

@@ -578,6 +578,7 @@
     const settleStatus = JSON.parse('<%- JSON.stringify(settleStatus) %>');
     const contractExpr = <%- !!ctx.subProject.page_show.openContractExpr %>;
     const deleteFilePermission = <%- deleteFilePermission %>;
+    const limits = JSON.parse('<%- JSON.stringify(limits) %>');
 </script>
 <style>
 

+ 13 - 0
config/web.js

@@ -1667,6 +1667,19 @@ const JsFiles = {
                 mergeFiles: ['/public/js/setting_s2b.js'],
                 mergeFile: 'setting_s2b',
             },
+            tender: {
+                files: [
+                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
+                ],
+                mergeFiles: [
+                    '/public/js/spreadjs_rela/spreadjs_zh.js',
+                    '/public/js/shares/sjs_setting.js',
+                    '/public/js/path_tree.js',
+                    '/public/js/shares/cs_tools.js',
+                    '/public/js/setting_tender.js',
+                ],
+                mergeFile: 'setting_tender',
+            },
             sp_permission: {
                 files: [],
                 mergeFiles: [

+ 205 - 0
sql/update.sql

@@ -41,6 +41,211 @@ CREATE TABLE `zh_multi_limit`  (
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;
 
+ALTER TABLE `zh_tender`
+ADD COLUMN `s2b_multi_check` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '联动计量-检查计量' AFTER `map_pic`,
+ADD COLUMN `s2b_multi_limit` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '联动计量-限制上报' AFTER `s2b_multi_check`;
+
+ALTER TABLE `zh_ledger_extra_0`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_1`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_2`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_3`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_4`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_5`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_6`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_7`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_8`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_9`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_10`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_11`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_12`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_13`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_14`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_15`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_16`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_17`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_18`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_19`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_20`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_21`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_22`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_23`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_24`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_25`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_26`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_27`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_28`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_29`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_30`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_31`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_32`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_33`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_34`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_35`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_36`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_37`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_38`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_39`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_40`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_41`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_42`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_43`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_44`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_45`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_46`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_47`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_48`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_49`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_50`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_51`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_52`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_53`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_54`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_55`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_56`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_57`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_58`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_59`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_60`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_61`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_62`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_63`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_64`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_65`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_66`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_67`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_68`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_69`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_70`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_71`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_72`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_73`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_74`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_75`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_76`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_77`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_78`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_79`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_80`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_81`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_82`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_83`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_84`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_85`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_86`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_87`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_88`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_89`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_90`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_91`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_92`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_93`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_94`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_95`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_96`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_97`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_98`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+ALTER TABLE `zh_ledger_extra_99`
+ADD COLUMN `multi_limit` varchar(36) NOT NULL DEFAULT '' COMMENT '联动计量配置' AFTER `gxby_id`;
+
 ------------------------------------
 -- 表数据
 ------------------------------------