Bläddra i källkod

Merge remote-tracking branch 'remotes/origin/dev' into uat

MaiXinRong 4 år sedan
förälder
incheckning
1a17b6b0ba
72 ändrade filer med 2221 tillägg och 774 borttagningar
  1. 12 2
      app/const/advance.js
  2. 7 7
      app/const/deal_pay.js
  3. 1 0
      app/const/tender_info.js
  4. 30 26
      app/controller/advance_controller.js
  5. 20 0
      app/controller/material_controller.js
  6. 84 1
      app/controller/report_archive_controller.js
  7. 2 2
      app/controller/report_controller.js
  8. 1 1
      app/controller/schedule_controller.js
  9. 27 24
      app/controller/stage_controller.js
  10. 1 1
      app/controller/tender_controller.js
  11. 6 1
      app/controller/wap_controller.js
  12. 19 6
      app/lib/analysis_excel.js
  13. 13 1
      app/lib/ledger.js
  14. 11 2
      app/lib/pay_calc.js
  15. 2 1
      app/lib/rptCustomData.js
  16. 2 2
      app/lib/rpt_data_analysis.js
  17. 1 1
      app/middleware/schedule_check.js
  18. 1 1
      app/middleware/tender_check.js
  19. 10 3
      app/public/js/advance.js
  20. 1 1
      app/public/js/gcl_gather.js
  21. 13 1
      app/public/js/ledger_check.js
  22. 423 102
      app/public/js/material_list.js
  23. 4 0
      app/public/js/measure_material.js
  24. 1 1
      app/public/js/shares/gcl_gather_compare.js
  25. 15 15
      app/public/js/stage.js
  26. 0 1
      app/public/js/stage_change.js
  27. 15 7
      app/public/js/stage_pay.js
  28. 37 0
      app/public/report/js/jpc_output.js
  29. 104 2
      app/public/report/js/rpt_archive.js
  30. 29 1
      app/public/report/js/rpt_jspdf.js
  31. 6 6
      app/public/report/js/rpt_main.js
  32. 23 0
      app/public/report/js/rpt_print.js
  33. 12 7
      app/router.js
  34. 4 3
      app/service/change.js
  35. 4 2
      app/service/deal_bills.js
  36. 1 1
      app/service/ledger_revise.js
  37. 181 1
      app/service/material_list.js
  38. 8 1
      app/service/project.js
  39. 2 0
      app/service/project_account.js
  40. 9 0
      app/service/report.js
  41. 34 0
      app/service/report_memory.js
  42. 1 1
      app/service/revise_audit.js
  43. 157 0
      app/service/rpt_archive_encryption.js
  44. 8 6
      app/service/rpt_stage_sum_memory.js
  45. 1 1
      app/service/schedule_ledger.js
  46. 2 2
      app/service/stage.js
  47. 4 3
      app/service/stage_audit.js
  48. 21 0
      app/service/stage_bonus.js
  49. 3 3
      app/service/stage_change.js
  50. 35 4
      app/service/stage_jgcl.js
  51. 25 0
      app/service/stage_other.js
  52. 2 3
      app/view/advance/detail.ejs
  53. 8 2
      app/view/advance/index.ejs
  54. 2 2
      app/view/advance/modal.ejs
  55. 1 1
      app/view/change/information.ejs
  56. 25 20
      app/view/material/list.ejs
  57. 34 1
      app/view/report/index.ejs
  58. 2 0
      app/view/report/index_archive.ejs
  59. 2 1
      app/view/report/rpt_all_popup.ejs
  60. 2 2
      app/view/schedule/modal.ejs
  61. 11 1
      app/view/setting/fun.ejs
  62. 4 1
      app/view/stage/index.ejs
  63. 2 0
      app/view/stage/stage_sub_menu.ejs
  64. 2 0
      app/view/stage/stage_sub_mini_menu.ejs
  65. 1 1
      app/view/tender/detail.ejs
  66. 142 19
      app/view/tender/detail_modal.ejs
  67. 2 2
      app/view/tender/tender_sub_menu.ejs
  68. 1 1
      app/view/tender/tender_sub_mini_menu.ejs
  69. 125 58
      builder_report_index_define.js
  70. 1 0
      config/web.js
  71. 11 405
      sql/update.sql
  72. 408 0
      sql/update20210615.sql

+ 12 - 2
app/const/advance.js

@@ -12,9 +12,19 @@
 const typeCol = [
     { key: 'start', type: 0, name: '开工预付款' },
     { key: 'material', type: 1, name: '材料预付款' },
-    // { key: 'safe', type: 2, name: '安全生产预付款' },
-]
+    { key: 'safe', type: 2, name: '安全生产费预付款' },
+    { key: 'dust', type: 3, name: '扬尘污染费预付款' },
+];
+
+const typeColMap = {
+    0: { text: '开工预付款', value: 'start' },
+    1: { text: '材料预付款', value: 'material' },
+    2: { text: '安全生产费预付款', value: 'safe' },
+    3: { text: '扬尘污染费预付款', value: 'dust' },
+};
+
 
 module.exports = {
     typeCol,
+    typeColMap,
 };

+ 7 - 7
app/const/deal_pay.js

@@ -58,13 +58,13 @@ const deadlineType = {
 };
 
 const chapterDetail = [
-    {name: '清单 第100章 总则', cType: 1, serialNo: 1, filter: '^[^0-9]*1[0-9]{2}-'},
-    {name: '清单 第200章 路基', cType: 1, serialNo: 2, filter: '^[^0-9]*2[0-9]{2}-'},
-    {name: '清单 第300章 路面', cType: 1, serialNo: 3, filter: '^[^0-9]*3[0-9]{2}-'},
-    {name: '清单 第400章 桥梁、涵洞', cType: 1, serialNo: 4, filter: '^[^0-9]*4[0-9]{2}-'},
-    {name: '清单 第500章 隧道', cType: 1, serialNo: 5, filter: '^[^0-9]*5[0-9]{2}-'},
-    {name: '清单 第600章 安全设施及预埋管线', cType: 1, serialNo: 6, filter: '^[^0-9]*6[0-9]{2}-'},
-    {name: '清单 第700章 绿化及环境保护', cType: 1, serialNo: 7, filter: '^[^0-9]*7[0-9]{2}-'},
+    {name: '清单 第100章 总则', cType: 1, serialNo: 1, filter: '^[^0-9]*1[0-9]{2}(-|$)'},
+    {name: '清单 第200章 路基', cType: 1, serialNo: 2, filter: '^[^0-9]*2[0-9]{2}(-|$)'},
+    {name: '清单 第300章 路面', cType: 1, serialNo: 3, filter: '^[^0-9]*3[0-9]{2}(-|$)'},
+    {name: '清单 第400章 桥梁、涵洞', cType: 1, serialNo: 4, filter: '^[^0-9]*4[0-9]{2}(-|$)'},
+    {name: '清单 第500章 隧道', cType: 1, serialNo: 5, filter: '^[^0-9]*5[0-9]{2}(-|$)'},
+    {name: '清单 第600章 安全设施及预埋管线', cType: 1, serialNo: 6, filter: '^[^0-9]*6[0-9]{2}(-|$)'},
+    {name: '清单 第700章 绿化及环境保护', cType: 1, serialNo: 7, filter: '^[^0-9]*7[0-9]{2}(-|$)'},
     {name: '未计入章节清单合计', cType: 21, serialNo: 8},
     {name: '清单小计(A)', cType: 11, serialNo: 9},
     {name: '非清单项费用(B)', cType: 31, serialNo: 10},

+ 1 - 0
app/const/tender_info.js

@@ -101,6 +101,7 @@ const defaultInfo = {
         startAdvance: 0,
         materialAdvance: 0,
         safeAdvance: 0,
+        dustAdvance: 0,
     },
     // 显示设置
     display: {

+ 30 - 26
app/controller/advance_controller.js

@@ -2,6 +2,7 @@
 const accountGroup = require('../const/account_group').group;
 const auditConst = require('../const/audit').advance;
 const shenpiConst = require('../const/shenpi');
+const typeConsts = require('../const/advance');
 const sendToWormhole = require('stream-wormhole');
 const path = require('path');
 const fs = require('fs');
@@ -18,8 +19,9 @@ module.exports = app => {
          * @param {Object} ctx 全局上下文
          */
         async index(ctx) {
-            const type = auditConst.type.start;
-            const advancePayTotal = ctx.tender.info.deal_param.startAdvance;
+            const advanceType = typeConsts.typeCol.find(item => item.key === ctx.params.type);
+            const type = advanceType.type;
+            const advancePayTotal = ctx.tender.info.deal_param[`${advanceType.key}Advance`];
             const advanceList = await ctx.service.advance.getAdvanceList(ctx.tender.id, type, this.decimal, advancePayTotal);
             const latestOrder = await ctx.service.advance.getLastestAdvance(ctx.tender.id, type, true);
             const progress = await ctx.service.advance.calcProgress(latestOrder, advancePayTotal);
@@ -31,6 +33,7 @@ module.exports = app => {
                 advanceList,
                 latestOrder,
                 auditConst,
+                typeColMap: typeConsts.typeColMap,
                 preUrl: `/tender/${ctx.tender.id}/advance/${type}/create`,
                 jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.advance.main),
                 advancePayTotal,
@@ -43,27 +46,27 @@ module.exports = app => {
          * 材料预付款页面(AJAX) GET
          * @param {Object} ctx 全局上下文
          */
-        async materialList(ctx) {
-            const type = auditConst.type.material;
-            const advancePayTotal = ctx.tender.info.deal_param.materialAdvance;
-            const advanceList = await ctx.service.advance.getAdvanceList(ctx.tender.id, type, this.decimal, advancePayTotal);
-            const latestOrder = await ctx.service.advance.getLastestAdvance(ctx.tender.id, type, true);
-            const progress = await ctx.service.advance.calcProgress(latestOrder, advancePayTotal);
-            const showAddBtn = ctx.tender.data.user_id === ctx.session.sessionUser.accountId ? !latestOrder || (latestOrder.status === auditConst.status.checked && latestOrder.prev_total_amount < advancePayTotal) : false;
-            const renderData = {
-                type,
-                decimal: this.decimal,
-                showAddBtn,
-                advanceList,
-                latestOrder,
-                auditConst,
-                preUrl: `/tender/${ctx.tender.id}/advance/${type}/create`,
-                jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.advance.main),
-                advancePayTotal,
-                progress,
-            };
-            await this.layout('advance/index.ejs', renderData, 'advance/modal.ejs');
-        }
+        // async materialList(ctx) {
+        //     const type = auditConst.type.material;
+        //     const advancePayTotal = ctx.tender.info.deal_param.materialAdvance;
+        //     const advanceList = await ctx.service.advance.getAdvanceList(ctx.tender.id, type, this.decimal, advancePayTotal);
+        //     const latestOrder = await ctx.service.advance.getLastestAdvance(ctx.tender.id, type, true);
+        //     const progress = await ctx.service.advance.calcProgress(latestOrder, advancePayTotal);
+        //     const showAddBtn = ctx.tender.data.user_id === ctx.session.sessionUser.accountId ? !latestOrder || (latestOrder.status === auditConst.status.checked && latestOrder.prev_total_amount < advancePayTotal) : false;
+        //     const renderData = {
+        //         type,
+        //         decimal: this.decimal,
+        //         showAddBtn,
+        //         advanceList,
+        //         latestOrder,
+        //         auditConst,
+        //         preUrl: `/tender/${ctx.tender.id}/advance/${type}/create`,
+        //         jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.advance.main),
+        //         advancePayTotal,
+        //         progress,
+        //     };
+        //     await this.layout('advance/index.ejs', renderData, 'advance/modal.ejs');
+        // }
 
         /**
          * 获取通用的renderData(用于layout, Menu, subMenu部分)
@@ -142,7 +145,7 @@ module.exports = app => {
          * @param {Object} ctx 全局上下文
          */
         async detail(ctx) {
-            const advancePayTotal = ctx.advance.type === 0 ? ctx.tender.info.deal_param.startAdvance : ctx.tender.info.deal_param.materialAdvance;
+            const advancePayTotal = ctx.tender.info.deal_param[`${typeConsts.typeColMap[ctx.advance.type].value}Advance`];
             try {
                 await this._checkCanEntry(ctx);
                 const { uncheck, checkNo } = auditConst.status;
@@ -178,12 +181,13 @@ module.exports = app => {
                 renderData.prev_total_amount = prev_total_amount;
                 renderData.max_pr = max_pr;
                 renderData.decimal = 2;
+                renderData.typeColMap = typeConsts.typeColMap;
                 renderData.advancePayTotal = advancePayTotal;
                 renderData.prevAdvance = prevAdvance;
                 await this.layout('advance/detail.ejs', renderData, 'advance/modal_audit.ejs');
             } catch (error) {
                 this.log(error);
-                ctx.redirect('/tender/' + ctx.tender.id + '/advance');
+                ctx.redirect('/tender/' + ctx.tender.id + '/advance/' + typeConsts.typeColMap[ctx.advance.type].value);
             }
         }
 
@@ -222,7 +226,7 @@ module.exports = app => {
                 ctx.redirect(`/tender/${ctx.tender.id}/advance/${record.id}/detail`);
             } catch (error) {
                 this.log(error);
-                ctx.redirect(`/tender/${ctx.tender.id}/advance`);
+                ctx.redirect(`/tender/${ctx.tender.id}/advance/${typeConsts.typeColMap[ctx.advance.type].value}`);
             }
         }
 

+ 20 - 0
app/controller/material_controller.js

@@ -508,6 +508,26 @@ module.exports = app => {
                         // 取所有工料表
                         responseData.data = await ctx.service.materialList.getMaterialData(ctx.tender.id, ctx.material.id);
                         break;
+                    case 'adds':
+                        responseData.data = await ctx.service.materialList.adds(data.postData);
+                        break;
+                    case 'dels':
+                        responseData.data = await ctx.service.materialList.dels(data.postData);
+                        break;
+                    case 'updates':
+                        if (data.updateData.quantity === '' || data.updateData.quantity === null) {
+                            throw '请输入数量';
+                        }
+                        // 判断数量是否为数字
+                        if (isNaN(data.updateData.quantity)) {
+                            throw '不能输入其它非数字类型字符';
+                        }
+                        responseData.data = await ctx.service.materialList.saves(data.updateData);
+                        break;
+                    case 'pastes':
+                        responseData.data = await ctx.service.materialList.savePastes(data.updateData);
+                        // 取所有工料表
+                        break;
                     default: throw '参数有误';
                 }
 

+ 84 - 1
app/controller/report_archive_controller.js

@@ -29,10 +29,12 @@ module.exports = app => {
             //
             // 。。。
             let archiveList = [];
+            let archiveEncryptionList = [];
             // console.log('tender.data.project_id: ' + tender.data.project_id);
             if (stage) {
                 // console.log('ctx.stage.id: ' + ctx.stage.id);
                 const archives = await ctx.service.rptArchive.getPrjStgArchive(tender.data.project_id, ctx.stage.id);
+                const archiveEncryptions = await ctx.service.rptArchiveEncryption.getPrjStgArchiveEncryption(tender.data.project_id, ctx.stage.id);
                 stage_id = stage.id;
                 stage_order = stage.order;
                 stage_times = stage.times;
@@ -40,9 +42,13 @@ module.exports = app => {
                 if (archives.length > 0) {
                     archiveList = JSON.parse(archives[0].content);
                 }
+                if (archiveEncryptions.length > 0) {
+                    archiveEncryptionList = JSON.parse(archiveEncryptions[0].content);
+                }
             } else {
                 // console.log('stageList[0].id: ' + stageList[0].id);
                 const archives = await ctx.service.rptArchive.getPrjStgArchive(tender.data.project_id, stageList[stageList.length - 1].id);
+                const archiveEncryptions = await ctx.service.rptArchiveEncryption.getPrjStgArchiveEncryption(tender.data.project_id, stageList[stageList.length - 1].id);
                 // stage_id = stageList[0].id;
                 // stage_order = stageList[0].order;
                 // stage_times = stageList[0].times;
@@ -50,6 +56,9 @@ module.exports = app => {
                 if (archives && archives.length > 0) {
                     archiveList = JSON.parse(archives[0].content);
                 }
+                if (archiveEncryptions && archiveEncryptions.length > 0) {
+                    archiveEncryptionList = JSON.parse(archiveEncryptions[0].content);
+                }
             }
             let rpt_tpl_items = '{ customize: [], common: [] }';
             if (custTreeNodes.length > 0) {
@@ -73,6 +82,7 @@ module.exports = app => {
                 stages: stageList,
                 auditConst: auditConst.stage,
                 archiveList,
+                archiveEncryptionList,
             };
             await this.layout('report/index_archive.ejs', renderData);
         }
@@ -82,15 +92,58 @@ module.exports = app => {
             // ctx.body = await this._getReport(ctx, params);
 
             const archives = await ctx.service.rptArchive.getPrjStgArchive(params.prjId, params.stgId);
-            let archiveList = [];
+            const archiveEncryptions = await ctx.service.rptArchiveEncryption.getPrjStgArchiveEncryption(params.prjId, params.stgId);
+            let archiveList = [], archiveEncryptionList = [];
             if (archives.length > 0) {
                 archiveList = JSON.parse(archives[0].content);
             }
+            if (archiveEncryptions.length > 0) {
+                archiveEncryptionList = JSON.parse(archiveEncryptions[0].content);
+            }
             ctx.body = {
                 data: archiveList,
+                encryptionData: archiveEncryptionList,
             };
         }
 
+        async addReportArchiveEncryption(ctx) {
+            const params = JSON.parse(ctx.request.body.params);
+            const prjId = params.prjId;
+            const stgId = params.stgId;
+            const rptId = params.rptId;
+            const ttlPgs = params.ttlPgs;
+            const content = params.content;
+            const orgArchiveList = await ctx.service.rptArchiveEncryption.getPrjStgArchiveEncryption(prjId, stgId);
+            if (orgArchiveList.length > 0) {
+                const contentArr = JSON.parse(orgArchiveList[0].content);
+                let hasArchive = false;
+                for (const item of contentArr) {
+                    if (item.rpt_id === rptId) {
+                        // 考虑到报表模板的稳定性,只保留一项来记录位置就足够了,都不考虑用uuid了
+                        item.encryption = content;
+                        hasArchive = true;
+                        break;
+                    }
+                }
+                if (!hasArchive) {
+                    // 表示有新的要加
+                    contentArr.push({ rpt_id: rptId, total_page: ttlPgs, encryption: content });
+                } else {
+                    //
+                }
+                const updatedRst = await ctx.service.rptArchiveEncryption.updateArchiveEncryption(orgArchiveList[0].id, prjId, stgId, contentArr);
+                // console.log(updatedRst);
+                ctx.body = { err: 0, msg: '', data: { addedRst: contentArr } };
+            } else {
+                // 需要增加
+                const archiveArr = [];
+                archiveArr.push({ rpt_id: rptId, encryption: content });
+                const addedRst = await ctx.service.rptArchiveEncryption.createArchiveEncryption(prjId, stgId, archiveArr);
+                // console.log(addedRst);
+                ctx.body = { err: 0, msg: '', data: { addedRst: archiveArr } };
+            }
+        }
+
         async addReportArchive(ctx) {
             try {
                 const stream = await ctx.getFileStream();
@@ -160,6 +213,11 @@ module.exports = app => {
             }
         }
 
+        async updateReportArchiveEncryption(ctx) {
+            // 在add方法中已经处理
+            await this.addReportArchiveEncryption(ctx);
+        }
+
         async updateReportArchive(ctx) {
             try {
                 const stream = await ctx.getFileStream();
@@ -214,6 +272,31 @@ module.exports = app => {
             }
         }
 
+        async removeReportArchiveEncryption(ctx) {
+            try {
+                const prjId = ctx.params.prjId;
+                const stgId = ctx.params.stgId;
+                const rptId = ctx.params.rptId;
+                const orgArchiveList = await ctx.service.rptArchiveEncryption.getPrjStgArchiveEncryption(prjId, stgId);
+                if (orgArchiveList.length > 0) {
+                    const contentArr = JSON.parse(orgArchiveList[0].content);
+                    for (let idx = 0; idx < contentArr.length; idx++) {
+                        if (contentArr[idx].rpt_id === rptId) {
+                            contentArr.splice(idx, 1);
+                            break;
+                        }
+                    }
+                    const updatedRst = await ctx.service.rptArchive.updateArchive(prjId, stgId, contentArr);
+                    ctx.body = { err: 0, msg: '', data: { updatedRst } };
+                } else {
+                    ctx.body = { err: 0, msg: '', data: { updatedRst: null } };
+                }
+            } catch (err) {
+                this.log(err);
+                ctx.body = { err: 1, msg: err.toString(), data: null };
+            }
+        }
+
         async removeReportArchive(ctx) {
             try {
                 const prjId = ctx.params.prjId;

+ 2 - 2
app/controller/report_controller.js

@@ -24,7 +24,7 @@ const needCustomTables = [
     'mem_custom_select',
     'mem_gather_stage_bills', 'mem_gather_deal_bills', 'mem_gather_stage_pay', 'mem_gather_tender_info',
     'mem_stage_sum_bills', 'mem_stage_sum_pay',
-    'mem_jh_gather_im_change', 'mem_jh_im_change',
+    'mem_jh_gather_im_change', 'mem_jh_im_change', 'mem_jh_gather_stage_bills_compare',
 ];
 
 module.exports = app => {
@@ -77,7 +77,7 @@ module.exports = app => {
                     pageShow = {};
                 }
                 // console.log(pageShow);
-                pageShow.showArchive = 0;
+                pageShow.showArchive = 1;
                 const tender = ctx.tender;
                 const stage = ctx.stage;
                 let stage_id = -1;

+ 1 - 1
app/controller/schedule_controller.js

@@ -574,7 +574,7 @@ module.exports = app => {
                 }
                 // 判断修改权限
                 if (ctx.session.sessionUser.is_admin === 0) {
-                    throw '你没有权限修改形象进度';
+                    throw '你没有权限修改投资进度';
                 }
                 let info = '';
                 switch (data.type) {

+ 27 - 24
app/controller/stage_controller.js

@@ -361,6 +361,7 @@ module.exports = app => {
                 const ledgerData = await this._getStageLedgerData(ctx);
                 const posData = await this._getStagePosData(ctx);
 
+                const projRela = await this.ctx.service.project.getFunRela(this.ctx.session.sessionProject.id);
                 const checkDataModel = require('../lib/ledger').checkData;
                 const checkData = new checkDataModel(ctx, measureType);
                 checkData.loadData(ledgerData, posData);
@@ -368,7 +369,7 @@ module.exports = app => {
                 checkData.check3fLimit(ctx.tender.data);
                 checkData.checkBillsQty(['sgfh_qty', 'qtcl_qty', 'sjcl_qty', 'quantity']);
 
-                ctx.tender.info.ledger_check.over && checkData.checkOverRange(['contract_qty', 'qc_qty']);
+                projRela.banOver && ctx.tender.info.ledger_check.over && checkData.checkOverRange(['contract_qty', 'qc_qty']);
                 checkData.checkBillsTp([
                     { qty: 'contract_qty', tp: 'contract_tp' }, { qty: 'qc_qty', tp: 'qc_tp' },
                 ], this.ctx.tender.info.decimal);
@@ -702,15 +703,17 @@ module.exports = app => {
                 const data = JSON.parse(ctx.request.body.data);
 
                 if (data.updateType === 'update') {
-                    const create_time = Date.parse(new Date()) / 1000;
-                    const fileName = path.join('public/upload', this.ctx.tender.id.toString(), 'im', 'calcImg_' + create_time + '.png');
-                    const base64Data = data.img.replace(/^data:image\/\w+;base64,/, '');
-                    const dataBuffer = new Buffer.from(base64Data, 'base64');
-                    await this.ctx.helper.saveBufferFile(dataBuffer, path.join(this.app.baseDir, 'app', fileName));
-                    data.calc_img = fileName;
-                    data.calc_img_org = JSON.stringify(data.imgInfo);
+                    if (data.img) {
+                        const create_time = Date.parse(new Date()) / 1000;
+                        const fileName = path.join('public/upload', this.ctx.tender.id.toString(), 'im', 'calcImg_' + create_time + '.png');
+                        const base64Data = data.img.replace(/^data:image\/\w+;base64,/, '');
+                        const dataBuffer = new Buffer.from(base64Data, 'base64');
+                        await this.ctx.helper.saveBufferFile(dataBuffer, path.join(this.app.baseDir, 'app', fileName));
+                        data.calc_img = fileName;
+                        data.calc_img_org = JSON.stringify(data.imgInfo);
+                        delete data.img;
+                    }
                     delete data.updateType;
-                    delete data.img;
                     delete data.imgInfo;
                 } else if (data.updateType === 'clear') {
                     data.calc_img = null;
@@ -1295,21 +1298,21 @@ module.exports = app => {
          */
         _checkStageCanModifyRe(ctx) {
             // 检查登录用户,是否可操作
-            if (ctx.stage.readOnly) {
-                if (ctx.stage.status === auditConst.status.checked) {
-                    // 当前期状态为完成,且提交人是审核列表中的则可再次上传
-                    if (ctx.stage.user_id === ctx.session.sessionUser.accountId || ctx.stage.auditors.findIndex(auditor => auditor.aid === ctx.session.sessionUser.accountId) !== -1) {
-                        // 再次上传的图片要给个标识,方便给前端进行编辑操作
-                        // ctx.reUploadPermission = true;
-                        return;
-                    }
-
-                    throw '该计量期当前您无权操作';
-
-                } else {
-                    throw '该计量期当前您无权操作';
-                }
-            }
+            // if (ctx.stage.readOnly) {
+            //     if (ctx.stage.status === auditConst.status.checked) {
+            //         // 当前期状态为完成,且提交人是审核列表中的则可再次上传
+            //         if (ctx.stage.user_id === ctx.session.sessionUser.accountId || ctx.stage.auditors.findIndex(auditor => auditor.aid === ctx.session.sessionUser.accountId) !== -1) {
+            //             // 再次上传的图片要给个标识,方便给前端进行编辑操作
+            //             // ctx.reUploadPermission = true;
+            //             return;
+            //         }
+
+            //         throw '该计量期当前您无权操作';
+
+            //     } else {
+            //         throw '该计量期当前您无权操作';
+            //     }
+            // }
             if (ctx.stage.revising) {
                 throw '台账修订中,请勿修改提交期数据';
             }

+ 1 - 1
app/controller/tender_controller.js

@@ -468,7 +468,7 @@ module.exports = app => {
                     renderData.accountGroup = accountGroupList;
                 }
                 if (ctx.session.sessionProject.page_show !== null && parseInt(ctx.session.sessionProject.page_show.xxjd) === 1 && ctx.session.sessionUser.is_admin) {
-                    // 形象进度内容
+                    // 投资进度内容
                     renderData.scheduleAuditList = await ctx.service.scheduleAudit.getAllDataByCondition({ where: { tid: tender.id } });
                     renderData.scPermission = scheduleConst.permission;
                 }

+ 6 - 1
app/controller/wap_controller.js

@@ -440,8 +440,13 @@ module.exports = app => {
             try {
                 const tender = ctx.tender.data;
                 ctx.advance.advancePayTotal = ctx.tender.info.deal_param[ advanceConst.typeCol[ctx.advance.type].key + 'Advance'];
+                const times = ctx.advance.status === auditConst.advance.status.checkNo ? ctx.advance.times - 1 : ctx.advance.times;
+                if (ctx.advance.status === auditConst.advance.status.checkNo) {
+                    ctx.advance.curAuditor = await ctx.service.advanceAudit.getAuditorByStatus(ctx.advance.id, ctx.advance.status, times);
+                    ctx.advance.auditors = await ctx.service.advanceAudit.getAuditors(ctx.advance.id, times);
+                }
                 // 获取审批流程中左边列表
-                ctx.advance.auditors2 = await ctx.service.advanceAudit.getAuditGroupByList(ctx.advance.id, ctx.advance.times);
+                ctx.advance.auditors2 = await ctx.service.advanceAudit.getAuditGroupByList(ctx.advance.id, times);
                 const renderData = {
                     tender,
                     advance: ctx.advance,

+ 19 - 6
app/lib/analysis_excel.js

@@ -232,7 +232,14 @@ class ImportBaseTree {
                 return temp;
             } else {
                 const parent = this.findXmjParent(node.code);
-                return this.addNodeWithParent(node, parent);
+                if (parent) {
+                    return this.addNodeWithParent(node, parent);
+                } else {
+                    const newNode = this.addNodeWithParent(node, this.codeNodes['1']);
+                    newNode.error = 1;
+                    return null;
+                }
+
             }
         } else {
             const n = this.codeNodes[node.code];
@@ -296,11 +303,17 @@ class ImportBaseTree {
             } else if (!b.code) {
                 return -1;
             }
-            const codeA = a.code.split(splitChar);
-            const numA = _.toNumber(codeA[codeA.length -1]);
-            const codeB = b.code.split(splitChar);
-            const numB = _.toNumber(codeB[codeB.length -1]);
-            return numA - numB;
+            if (a.error === b.error) {
+                const codeA = a.code.split(splitChar);
+                const numA = _.toNumber(codeA[codeA.length -1]);
+                const codeB = b.code.split(splitChar);
+                const numB = _.toNumber(codeB[codeB.length -1]);
+                return numA - numB;
+            } else if (a.error) {
+                return 1
+            } else if (b.error) {
+                return -1;
+            }
         });
         for (const [i, c] of firstPart.children.entries()) {
             c.order = i + 1;

+ 13 - 1
app/lib/ledger.js

@@ -734,7 +734,19 @@ class checkData {
     }
 
     checkSameCode() {
-        let xmj = this.checkBills.nodes.filter(x => { return /^((GD*)|G)?[0-9]+/.test(x.code); });
+        //let xmj = this.checkBills.nodes.filter(x => { return /^((GD*)|G)?[0-9]+/.test(x.code); });
+        let xmj = [];
+        const addXmjCheck = function (node) {
+            if (/^((GD*)|G)?[0-9]+/.test(node.code)) xmj.push(node);
+            for (const child of node.children) {
+                addXmjCheck(child);
+            }
+        };
+        for (const topLevel of this.checkBills.children) {
+            if ([1, 2, 3, 4].indexOf(topLevel.node_type) < 0) continue;
+
+            addXmjCheck(topLevel);
+        }
         let check = null;
         while (xmj.length > 0) {
             [check, xmj] = this.ctx.helper._.partition(xmj, x => { return x.code === xmj[0].code; });

+ 11 - 2
app/lib/pay_calc.js

@@ -228,9 +228,18 @@ class PayCalculate {
             bqyf.value = this.yf.tp;
         }
         if (this.sf.expr === null || this.sf.expr === '') {
-            this.sf.tp = this.yf.tp;
+            if (this.sf.rprice) {
+                this.sf.tp = Math.min(this.ctx.helper.sub(this.sf.rprice, this.sf.pre_tp), this.yf.tp);
+            } else {
+                this.sf.tp = this.yf.tp;
+            }
         } else {
-            this.sf.tp = this.ctx.helper.round(this._calculateTpExpr(this.sf), this.decimal);
+            const value = this.ctx.helper.round(this._calculateTpExpr(this.sf), this.decimal);
+            if (this.sf.rprice) {
+                this.sf.tp = Math.min(this.ctx.helper.sub(this.sf.rprice, this.sf.pre_tp), value);
+            } else {
+                this.sf.tp = this.ctx.helper.round(value, this.decimal);
+            }
         }
         this.sf.end_tp = this.ctx.helper.add(this.sf.tp, this.sf.pre_tp);
     }

+ 2 - 1
app/lib/rptCustomData.js

@@ -303,7 +303,8 @@ class jhHelper {
         const stageChangeDetail = await this.getCurChangeDetailData(tender.id, stage.id);
         this.ctx.helper.saveBufferFile(JSON.stringify(stageChangeDetail, '', '\t'), this.ctx.app.baseDir + '/temp.json');
         for (const dc of gsDefine.defaultCompare) {
-            const scd = helper.filterTimesOrderData(stageChangeDetail, ['lid', 'pid', 'cid', 'cbid'], 'stimes', 'sorder', auditors[dc].times, auditors[dc].order);
+            if (!auditors[dc]) continue;
+             const scd = helper.filterTimesOrderData(stageChangeDetail, ['lid', 'pid', 'cid', 'cbid'], 'stimes', 'sorder', auditors[dc].times, auditors[dc].order);
             this._loadChangeDetail(billsIndex, scd, gsDefine, `r${dc}_`);
             this.prefixes.push(`r${dc}_`);
         }

+ 2 - 2
app/lib/rpt_data_analysis.js

@@ -405,7 +405,7 @@ const gatherChapter = {
         for (const c of chapter) {
             const cc = { code: c.code, name: c.name, cType: 1 };
             cc.serialNo = serialNo++;
-            cc.filter = '^[\\D]*' + c.code.substr(0, c.code.length - 2) + '[0-9]{2}-';
+            cc.filter = '^[\\D]*' + c.code.substr(0, c.code.length - 2) + '[0-9]{2}(-|$)';
             // cc.visible = true;
             gclChapter.push(cc);
 
@@ -1407,7 +1407,7 @@ const stageSelectConverse = {
         for (const s of stages) {
             const curReg = new RegExp('^s_' + s + '_');
             for (const [i, d] of data.entries()) {
-                const nd = { cross_index: i + 1 };
+                const nd = { cross_index: i + 1, s_order: s };
                 for (const prop in d) {
                     if (reg.test(prop)) {
                         if (curReg.test(prop)) {

+ 1 - 1
app/middleware/schedule_check.js

@@ -10,7 +10,7 @@
 const scPermission = require('../const/schedule').permission;
 module.exports = options => {
     /**
-     * 形象进度校验 中间件
+     * 投资进度校验 中间件
      *
      * @param {function} next - 中间件继续执行的方法
      * @return {void}

+ 1 - 1
app/middleware/tender_check.js

@@ -78,7 +78,7 @@ module.exports = options => {
             tender.ledgerUsers = tender.ledger_status === auditConst.status.uncheck ? [tender.data.user_id] : [tender.data.user_id, ...auditorsId];
             this.tender = tender;
             this.session.sessionProject.page_show = yield this.service.project.getPageshow(this.session.sessionProject.id);
-            // 形象进度权限获取
+            // 投资进度权限获取
             let schedule_permission = scPermission.no;
             if (this.session.sessionUser.accountId === tender.data.user_id) {
                 schedule_permission = scPermission.edit;

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

@@ -10,9 +10,9 @@
 
 $(document).ready(function () {
 
-    if (!advancePayTotal) {
-        $('#erro').modal('show');
-    }
+    // if (!advancePayTotal) {
+    //     $('#erro').modal('show');
+    // }
 
     // $('#advance_add').click(function() {
     //     postData(`${window.location.pathname}/${type}/create`, {}, res => {
@@ -33,6 +33,13 @@ $(document).ready(function () {
     //     return false
     // })
 
+    $('.ml-auto').submit(function () {
+        if (!advancePayTotal) {
+            $('#erro').modal('show');
+            return false;
+        }
+        return true;
+    })
     $('#advanceList').on('click', `a[href="#file"]`, function() {
         const { fileList = [] } = advanceList.find(item => item.id === parseInt($(this).data('id')))
         $('#file-content').empty()

+ 1 - 1
app/public/js/gcl_gather.js

@@ -426,7 +426,7 @@ const gclGatherModel = (function () {
         for (const c of chapter) {
             const cc = { code: c.code, name: c.name, cType: 1 };
             cc.serialNo = serialNo++;
-            cc.filter = '^[^0-9]*' + c.code.substr(0, c.code.length - 2) + '[0-9]{2}-';
+            cc.filter = '^[^0-9]*' + c.code.substr(0, c.code.length - 2) + '[0-9]{2}(-|$)';
             gclChapter.push(cc);
         }
         gclChapter.push({ name: '未计入章节清单合计', cType: 21, serialNo: serialNo+1 });

+ 13 - 1
app/public/js/ledger_check.js

@@ -117,7 +117,19 @@ const ledgerCheckUtil = {
     },
     checkSameCode: function (ledgerTree, ledgerPos, decimal, option) {
         const error = [];
-        let xmj = ledgerTree.nodes.filter(x => { return /^((GD*)|G)?[0-9]+/.test(x.code); });
+        //let xmj = ledgerTree.nodes.filter(x => { return /^((GD*)|G)?[0-9]+/.test(x.code); });
+        let xmj = [];
+        const addXmjCheck = function (node) {
+            if (/^((GD*)|G)?[0-9]+/.test(node.code)) xmj.push(node);
+            for (const child of node.children) {
+                addXmjCheck(child);
+            }
+        };
+        for (const topLevel of ledgerTree.children) {
+            if ([1, 2, 3, 4].indexOf(topLevel.node_type) < 0) continue;
+
+            addXmjCheck(topLevel);
+        }
         let check = null;
         while (xmj.length > 0) {
             [check, xmj] = _.partition(xmj, x => { return x.code === xmj[0].code; });

+ 423 - 102
app/public/js/material_list.js

@@ -51,7 +51,7 @@ function calcOneBQJC(xmj) {
 function getPasteHint (str, row = '') {
     let returnObj = str;
     if (row) {
-        returnObj.msg = '清单第' + (row+1) + '行' + str.msg;
+        returnObj.msg = '清单第' + (row+1) + '行' + (str.msg ? str.msg : str);
     }
     return returnObj;
 }
@@ -156,6 +156,7 @@ $(document).ready(() => {
         return item.qc_qty || item.contract_qty
     });
     calculateJiaCha(gclGatherData);
+
     // let gclGatherData = gclGatherModel.gatherGclData()
     // 获取项目节数据
     function loadLeafXmjData(iGclRow) {
@@ -167,7 +168,7 @@ $(document).ready(() => {
             }
             SpreadJsObj.loadSheetData(leafXmjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, gcl.leafXmjs);
             // 对清单调差工料table的单位数量进行改变
-            materialSpreadSetting.cols[materialSpreadSetting.cols.length - 1].title = '|' + gcl.unit + '数量 �';
+            materialSpreadSetting.cols[materialSpreadSetting.cols.length - 2].title = '|' + gcl.unit + '数量 �';
             // SpreadJsObj.initSheet(materialSpread.getActiveSheet(), materialSpreadSetting);
         } else {
             SpreadJsObj.loadSheetData(leafXmjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, []);
@@ -225,10 +226,11 @@ $(document).ready(() => {
     const materialSpread = SpreadJsObj.createNewSpread($('#material-spread')[0]);
     const materialSpreadSetting = {
         cols: [
-            {title: '清单调差工料|编号', colSpan: '4|1', rowSpan: '1|1', field: 'code', hAlign: 0, width: 80, formatter: '@', readOnly: true},
+            {title: '清单工料含量|编号', colSpan: '5|1', rowSpan: '1|1', field: 'code', hAlign: 0, width: 80, formatter: '@', readOnly: true},
             {title: '|名称', colSpan: '|1', rowSpan: '|1', field: 'name', hAlign: 0, width: 100, formatter: '@', readOnly: true},
             {title: '|单位', colSpan: '|1', rowSpan: '|1', field: 'unit', hAlign: 1, width: 60, formatter: '@', readOnly: true},
-            {title: '|数量 �', colSpan: '1', rowSpan: '|1', field: 'quantity', hAlign: 2, width: 80, type: 'Number', readOnly: 'readOnly.isEdit'},
+            {title: '|数量 �', colSpan: '|1', rowSpan: '|1', field: 'quantity', hAlign: 2, width: 80, type: 'Number', readOnly: 'readOnly.isEdit'},
+            {title: '|计算式', colSpan: '1', rowSpan: '|1', field: 'expr', hAlign: 2, width: 120, formatter: '@', readOnly: 'readOnly.isEdit'},
         ],
         emptyRows: 0,
         headRows: 2,
@@ -248,10 +250,11 @@ $(document).ready(() => {
     const materialCol = {
         readOnly: {
             isEdit: function (data) {
-                const sheet = leafXmjSpread.getActiveSheet();
-                const select = SpreadJsObj.getSelectObject(sheet);
-                const notx = findNotJoinLeafXmj(select);
-                return !(!readOnly && notx === undefined && materialBase.isEdit(data));
+                // const sheet = leafXmjSpread.getActiveSheet();
+                // const select = SpreadJsObj.getSelectObject(sheet);
+                // const notx = findNotJoinLeafXmj(select);
+                // return !(!readOnly && notx === undefined && materialBase.isEdit(data));
+                return !(!readOnly && materialBase.isEdit(data));
             },
         },
     };
@@ -335,22 +338,50 @@ $(document).ready(() => {
         const leafXmjSheet = leafXmjSpread.getActiveSheet();
         const leafXmjSelect = SpreadJsObj.getSelectObject(leafXmjSheet);
         const gcl = gclGatherData[index].leafXmjs;
-        const leafXmjIndex = gcl.indexOf(leafXmjSelect);
-        const xmj = gcl[leafXmjIndex];
-        const data = {
-            xmj_id: xmj.id,
-            gcl_id: xmj.gcl_id,
-            mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '',
-            mb_id: mb_id,
-            gather_qty: xmj.gather_qty,
-        };
+        // const leafXmjIndex = gcl.indexOf(leafXmjSelect);
+        // const xmj = gcl[leafXmjIndex];
+        // const data = {
+        //     xmj_id: xmj.id,
+        //     gcl_id: xmj.gcl_id,
+        //     mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '',
+        //     mb_id: mb_id,
+        //     gather_qty: xmj.gather_qty,
+        // };
+        const datas = [];
+        for (const xmj of gcl) {
+            const notx = findNotJoinLeafXmj(xmj);
+            const data = {
+                xmj_id: xmj.id,
+                gcl_id: xmj.gcl_id,
+                mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '',
+                gather_qty: xmj.gather_qty,
+                is_join: notx === undefined ? 1 : 0,
+            };
+            datas.push(data);
+        }
+
+
         // 上传到数据库
-        postData(window.location.pathname + '/save', {type: 'add', postData: data}, function (result) {
-            // 添加到materialList里
+        console.log(datas, gcl);
+        postData(window.location.pathname + '/save', {type: 'adds', postData: {xmjs: datas, mbIds: mb_id}}, function (result) {
             materialListData = result;
-            loadMaterialData(index, leafXmjIndex);
+            // toastr.success('已成功应用');
+            calculateJiaCha(gclGatherData);
+            // const index = gclGatherData.indexOf(ledgerSelect);
+            loadLeafXmjData(index);
+            const xmjSheet = leafXmjSpread.getActiveSheet();
+            const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet);
+            const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect);
+            loadMaterialData(index, xmjIndex);
+            SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index);
             $('#addgl').modal('hide');
         });
+        // postData(window.location.pathname + '/save', {type: 'add', postData: data}, function (result) {
+            // // 添加到materialList里
+            // materialListData = result;
+            // loadMaterialData(index, leafXmjIndex);
+            // $('#addgl').modal('hide');
+        // });
         $('#materialBills').find('input:disabled').prop('checked', true);
     });
     if (!readOnly) {
@@ -444,68 +475,146 @@ $(document).ready(() => {
         // material-spread右键功能
         const materialSpreadObj = {
             del: function () {
-                const sheet = materialSpread.getActiveSheet();
+                const materialSheet = materialSpread.getActiveSheet();
+                const materialSelect = SpreadJsObj.getSelectObject(materialSheet);
+                const sheet = ledgerSpread.getActiveSheet();
                 const select = SpreadJsObj.getSelectObject(sheet);
-                postData(window.location.pathname + '/save', {type: 'del', id: select.id, mb_id: select.mb_id}, function (result) {
-                    const index = materialList.indexOf(select);
-                    materialList.splice(index, 1);
-                    sheet.deleteRows(index, 1);
-                    SpreadJsObj.reLoadSheetData(materialSpread.getActiveSheet());
-                    const sel = sheet.getSelections();
-                    sheet.setSelection(index > 0 ? index - 1 : 0, sel.length > 0 ? sel[0].col : 0, 1, 1);
-                    const materialListIndex = materialListData.indexOf(select);
-                    materialListData.splice(materialListIndex, 1);
-                    const [iGclRow, iRow, lsheet, lselect] = leafXmjSpreadObj.getSelect();
-                    gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect);
-                    calculateJiaCha(gclGatherData, iGclRow)
-                    SpreadJsObj.reLoadRowData(lsheet, iRow);
-                    SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow);
+                const index = gclGatherData.indexOf(select);
+                const gcl = gclGatherData[index].leafXmjs;
+                const datas = [];
+                for (const xmj of gcl) {
+                    const data = {
+                        xmj_id: xmj.id,
+                        gcl_id: xmj.gcl_id,
+                        mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '',
+                    };
+                    datas.push(data);
+                }
+                console.log(datas, materialSelect.mb_id);
+                postData(window.location.pathname + '/save', {type: 'dels', postData: { xmjs: datas, mb_id: materialSelect.mb_id }}, function (result) {
+                    materialListData = result;
+                    calculateJiaCha(gclGatherData);
+                    // const index = gclGatherData.indexOf(ledgerSelect);
+                    loadLeafXmjData(index);
+                    const xmjSheet = leafXmjSpread.getActiveSheet();
+                    const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet);
+                    const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect);
+                    loadMaterialData(index, xmjIndex);
+                    SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index);
                 });
+                // postData(window.location.pathname + '/save', {type: 'del', id: select.id, mb_id: select.mb_id}, function (result) {
+                    // const index = materialList.indexOf(select);
+                    // materialList.splice(index, 1);
+                    // sheet.deleteRows(index, 1);
+                    // SpreadJsObj.reLoadSheetData(materialSpread.getActiveSheet());
+                    // const sel = sheet.getSelections();
+                    // sheet.setSelection(index > 0 ? index - 1 : 0, sel.length > 0 ? sel[0].col : 0, 1, 1);
+                    // const materialListIndex = materialListData.indexOf(select);
+                    // materialListData.splice(materialListIndex, 1);
+                    // const [iGclRow, iRow, lsheet, lselect] = leafXmjSpreadObj.getSelect();
+                    // gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect);
+                    // calculateJiaCha(gclGatherData, iGclRow);
+                    // SpreadJsObj.reLoadRowData(lsheet, iRow);
+                    // SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow);
+                // });
             },
             deletePress: function (sheet) {
                 return;
             },
+            editStarting: function (e, info) {
+                const col = info.sheet.zh_setting.cols[info.col];
+                const select = SpreadJsObj.getSelectObject(info.sheet);
+                if (col.field === 'quantity') {
+                    if (select.expr && select.expr !== '') {
+                        info.sheet.getCell(info.row, info.col).text(select.expr);
+                    }
+                }
+            },
             editEnded: function (e, info) {
                 if (info.sheet.zh_setting) {
                     const select = SpreadJsObj.getSelectObject(info.sheet);
                     const col = info.sheet.zh_setting.cols[info.col];
                     // 未改变值则不提交
                     // const validText = info.editingText ? (typeof(info.editingText) === 'String' ? info.editingText.replace('\n', '') : info.editingText) : null;
-                    const validText = is_numeric(info.editingText) ? parseFloat(info.editingText) : (info.editingText ? trimInvalidChar(info.editingText) : null);
-                    const orgValue = select[col.field];
+                    // const validText = is_numeric(info.editingText) ? parseFloat(info.editingText) : (info.editingText ? trimInvalidChar(info.editingText) : null);
+                    // let orgValue = select[col.field];
+                    const validText = info.editingText ? info.editingText.replace('\n', '') : null;
+                    let orgValue;
+                    if (col.field === 'quantity') {
+                        orgValue = validText && validText !== ''
+                            ? _.toNumber(validText) ? select.quantity : select.expr
+                            : (select.expr && select.expr !== '') ? select.expr : select.quantity;
+                    } else {
+                        orgValue = select[col.field];
+                    }
                     if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === '' || validText === null))) {
                         SpreadJsObj.reLoadRowData(info.sheet, info.row);
                         return;
                     }
-                    if (col.field === 'quantity') {
-                        if (isNaN(validText)) {
-                            toastr.error('不能输入其它非数字类型字符');
-                            SpreadJsObj.reLoadRowData(info.sheet, info.row);
-                            return;
-                        }
-                        const num = parseFloat(validText);
-                        if (num < 0 || !/^\d+(\.\d{1,6})?$/.test(num)) {
-                            toastr.error('请输入大于0并且小于6位小数的浮点数');
-                            SpreadJsObj.reLoadRowData(info.sheet, info.row);
-                            return;
-                        }
+                    const exprQuantity = {
+                        expr: '',
+                        quantity: 0,
+                    };
+                    const [valid, msg] = materialSpreadObj._checkExpr(validText, exprQuantity);
+                    if (!valid) {
+                        toastr.error(msg);
+                        SpreadJsObj.reLoadRowData(info.sheet, info.row);
+                        return;
                     }
-                    // 更新至服务器
-                    postData(window.location.pathname + '/save', { type:'update', updateData: { id:select.id, quantity: validText, mb_id: select.mb_id } }, function (result) {
-                        const materialListIndex = materialListData.indexOf(select);
-                        const index = materialList.indexOf(select);
-                        select[col.field] = validText;
-                        materialListData.splice(materialListIndex, 1, select);
-                        materialList.indexOf(index, 1, select);
+                    if (isNaN(exprQuantity.quantity)) {
+                        toastr.error('不能输入其它非数字类型字符');
+                        SpreadJsObj.reLoadRowData(info.sheet, info.row);
+                        return;
+                    }
+                    const num = parseFloat(exprQuantity.quantity);
+                    if (num < 0 || !/^\d+(\.\d{1,6})?$/.test(num)) {
+                        toastr.error('数量值必须大于0并且小于6位小数的浮点数');
                         SpreadJsObj.reLoadRowData(info.sheet, info.row);
-                        const [iGclRow, iRow, sheet, lselect] = leafXmjSpreadObj.getSelect();
-                        gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect);
-                        calculateJiaCha(gclGatherData, iGclRow)
-                        SpreadJsObj.reLoadRowData(sheet, iRow);
-                        SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow);
+                        return;
+                    }
+                    // 更新至服务器
+                    const ledgerSheet = ledgerSpread.getActiveSheet();
+                    const ledgerSelect = SpreadJsObj.getSelectObject(ledgerSheet);
+                    const index = gclGatherData.indexOf(ledgerSelect);
+                    const gcl = gclGatherData[index].leafXmjs;
+                    const datas = [];
+                    for (const xmj of gcl) {
+                        const data = {
+                            xmj_id: xmj.id,
+                            gcl_id: xmj.gcl_id,
+                            mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '',
+                        };
+                        datas.push(data);
+                    }
+                    console.log(exprQuantity, datas, select.mb_id);
+                    postData(window.location.pathname + '/save', { type:'updates', updateData: { xmjs: datas, expr: exprQuantity.expr, quantity: exprQuantity.quantity, mb_id: select.mb_id } }, function (result) {
+                        materialListData = result;
+                        calculateJiaCha(gclGatherData);
+                        // const index = gclGatherData.indexOf(ledgerSelect);
+                        loadLeafXmjData(index);
+                        const xmjSheet = leafXmjSpread.getActiveSheet();
+                        const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet);
+                        const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect);
+                        loadMaterialData(index, xmjIndex);
+                        SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index);
                     }, function () {
                         SpreadJsObj.reLoadRowData(info.sheet, info.row);
                     });
+                    // postData(window.location.pathname + '/save', { type:'update', updateData: { id:select.id, quantity: validText, mb_id: select.mb_id } }, function (result) {
+                    //     const materialListIndex = materialListData.indexOf(select);
+                    //     const index = materialList.indexOf(select);
+                    //     select[col.field] = validText;
+                    //     materialListData.splice(materialListIndex, 1, select);
+                    //     materialList.indexOf(index, 1, select);
+                    //     SpreadJsObj.reLoadRowData(info.sheet, info.row);
+                    //     const [iGclRow, iRow, sheet, lselect] = leafXmjSpreadObj.getSelect();
+                    //     gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect);
+                    //     calculateJiaCha(gclGatherData, iGclRow)
+                    //     SpreadJsObj.reLoadRowData(sheet, iRow);
+                    //     SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow);
+                    // }, function () {
+                    //     SpreadJsObj.reLoadRowData(info.sheet, info.row);
+                    // });
                 }
             },
             clipboardPasted(e, info) {
@@ -522,7 +631,7 @@ $(document).ready(() => {
                     SpreadJsObj.reLoadSheetData(materialSpread.getActiveSheet());
                     return;
                 }
-                if (sortData.length > 0 && range.col + range.colCount > 4) {
+                if (sortData.length > 0 && range.col + range.colCount > 5) {
                     toastMessageUniq(hint.cellError);
                     SpreadJsObj.reLoadSheetHeader(materialSpread.getActiveSheet());
                     SpreadJsObj.reLoadSheetData(materialSpread.getActiveSheet());
@@ -540,8 +649,9 @@ $(document).ready(() => {
                         const colSetting = info.sheet.zh_setting.cols[curCol];
                         if (!colSetting) continue;
 
-                        let validText = info.sheet.getText(curRow, curCol);
-                        validText = is_numeric(validText) ? parseFloat(validText) : (validText ? trimInvalidChar(validText) : null);
+                        // let validText = info.sheet.getText(curRow, curCol);
+                        // validText = is_numeric(validText) ? parseFloat(validText) : (validText ? trimInvalidChar(validText) : null);
+                        const validText = info.sheet.getText(curRow, curCol).replace('\n', '');
                         const orgValue = sortData[curRow][colSetting.field];
                         if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === ''))) {
                             sameCol++;
@@ -550,20 +660,30 @@ $(document).ready(() => {
                             }
                             continue;
                         }
-                        if (colSetting.field === 'quantity') {
-                            if (isNaN(validText)) {
-                                toastMessageUniq(getPasteHint(hint.numberExpr, hintRow));
-                                bPaste = false;
-                                continue;
-                            }
-                            const num = parseFloat(validText);
-                            if (num < 0 || !/^\d+(\.\d{1,6})?$/.test(num)) {
-                                toastMessageUniq(getPasteHint(hint.numberCan, hintRow));
-                                bPaste = false;
-                                continue;
-                            }
+                        const exprQuantity = {
+                            expr: '',
+                            quantity: 0,
+                        };
+                        const [valid, msg] = materialSpreadObj._checkExpr(validText, exprQuantity);
+                        if (!valid) {
+                            toastMessageUniq(getPasteHint(msg, hintRow));
+                            bPaste = false;
+                            continue;
+                        }
+                        if (isNaN(exprQuantity.quantity)) {
+                            toastMessageUniq(getPasteHint(hint.numberExpr, hintRow));
+                            bPaste = false;
+                            continue;
+                        }
+                        const num = parseFloat(exprQuantity.quantity);
+                        if (num < 0 || !/^\d+(\.\d{1,6})?$/.test(num)) {
+                            toastMessageUniq(getPasteHint(hint.numberCan, hintRow));
+                            bPaste = false;
+                            continue;
                         }
-                        materialData[colSetting.field] = validText;
+                        // materialData[colSetting.field] = validText;
+                        materialData.expr = exprQuantity.expr;
+                        materialData.quantity = exprQuantity.quantity;
                     }
                     if (bPaste) {
                         data.push(materialData);
@@ -576,19 +696,169 @@ $(document).ready(() => {
                     SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
                     return;
                 }
+                const ledgerSheet = ledgerSpread.getActiveSheet();
+                const ledgerSelect = SpreadJsObj.getSelectObject(ledgerSheet);
+                const index = gclGatherData.indexOf(ledgerSelect);
+                const gcl = gclGatherData[index].leafXmjs;
+                const datas = [];
+                for (const xmj of gcl) {
+                    const data2 = {
+                        xmj_id: xmj.id,
+                        gcl_id: xmj.gcl_id,
+                        mx_id: xmj.mx_id !== undefined ? xmj.mx_id : '',
+                    };
+                    datas.push(data2);
+                }
+                console.log(data, datas);
                 // 更新至服务器
-                postData(window.location.pathname + '/save', { type:'paste', updateData: data }, function (result) {
+                postData(window.location.pathname + '/save', { type:'pastes', updateData: { xmjs: datas, pasteData: data } }, function (result) {
                     materialListData = result;
-                    const [iGclRow, iRow, sheet, lselect] = leafXmjSpreadObj.getSelect();
-                    gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect);
-                    calculateJiaCha(gclGatherData, iGclRow)
-                    SpreadJsObj.reLoadRowData(sheet, iRow);
-                    SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow);
+                    calculateJiaCha(gclGatherData);
+                    // const index = gclGatherData.indexOf(ledgerSelect);
+                    loadLeafXmjData(index);
+                    const xmjSheet = leafXmjSpread.getActiveSheet();
+                    const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet);
+                    const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect);
+                    loadMaterialData(index, xmjIndex);
+                    SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index);
                 }, function () {
-                    SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
+                    SpreadJsObj.reLoadRowData(info.sheet, info.row);
                 });
+                // postData(window.location.pathname + '/save', { type:'paste', updateData: data }, function (result) {
+                //     materialListData = result;
+                //     const [iGclRow, iRow, sheet, lselect] = leafXmjSpreadObj.getSelect();
+                //     gclGatherData[iGclRow].leafXmjs[iRow].jiacha = calcOneBQJC(lselect);
+                //     calculateJiaCha(gclGatherData, iGclRow);
+                //     SpreadJsObj.reLoadRowData(sheet, iRow);
+                //     SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), iGclRow);
+                // }, function () {
+                //     SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
+                // });
+            },
+            _checkExprValid(expr) {
+                if (!expr) return [true, null];
+                const param = [];
+                let num = '', base = '';
+                for (let i = 0, iLen = expr.length; i < iLen; i++) {
+                    if (/^[\d\.%]+/.test(expr[i])) {
+                        if (base !== '') {
+                            param.push({type: 'base', value: base});
+                            base = '';
+                        }
+                        num = num + expr[i];
+                    } else if (expr[i] === '(') {
+                        if (num !== '') {
+                            param.push({type: 'num', value: num});
+                            num = '';
+                        }
+                        if (base !== '') {
+                            param.push({type: 'base', value: base});
+                            base = '';
+                        }
+                        param.push({type: 'left', value: '('});
+                    } else if (expr[i] === ')') {
+                        if (num !== '') {
+                            param.push({type: 'num', value: num});
+                            num = '';
+                        }
+                        if (base !== '') {
+                            param.push({type: 'base', value: base});
+                            base = '';
+                        }
+                        param.push({type: 'right', value: ')'});
+                    } else if (/^[\+\-*\/]/.test(expr[i])) {
+                        if (num !== '') {
+                            param.push({type: 'num', value: num});
+                            num = '';
+                        }
+                        if (base !== '') {
+                            param.push({type: 'base', value: base});
+                            base = '';
+                        }
+                        param.push({type: 'calc', value: expr[i]});
+                    } else {
+                        return [false, '输入的表达式含有非法字符: ' + expr[i]];
+                    }
+                }
+                if (num !== '') {
+                    param.push({type: 'num', value: num});
+                    num = '';
+                }
+                if (base !== '') {
+                    param.push({type: 'base', value: base});
+                    base = '';
+                }
+                if (param.length === 0) return true;
+                if (param.length > 1) {
+                    if (param[0].value === '-') {
+                        param[1].value = '-' + param[1];
+                    }
+                    param.unshift();
+                }
+                const iLen = param.length;
+                let iLeftCount = 0, iRightCount = 0;
+                for (const [i, p] of param.entries()) {
+                    if (p.type === 'calc') {
+                        if (i === 0 || i === iLen - 1)
+                            return [false, '输入的表达式非法:计算符号' + p.value + '前后应有数字'];
+                    }
+                    if (p.type === 'num') {
+                        num = p.value.replace('%', '');
+                        if (p.value.length - num.length > 1)
+                            return [false, '输入的表达式非法:' + p.value + '不是一个有效的数字'];
+                        num = _.toNumber(num);
+                        if (num === undefined || num === null || _.isNaN(num))
+                            return [false, '输入的表达式非法:' + p.value + '不是一个有效的数字'];
+                        if (i > 0) {
+                            if (param[i - 1].type !== 'calc' && param[i - 1].type !== 'left') {
+                                return [false, '输入的表达式非法:' + p.value + '前应有运算符'];
+                            } else if (param[i - 1].value === '/' && num === 0) {
+                                return [false, '输入的表达式非法:请勿除0'];
+                            }
+                        }
+                    }
+                    if (p.type === 'base') {
+                        if (i > 0 && (param[i - 1].type === 'num' || param[i - 1].type === 'right'))
+                            return [false, '输入的表达式非法:' + p.value + '前应有运算符'];
+                    }
+                    if (p.type === 'left') {
+                        iLeftCount += 1;
+                        if (i !== 0 && param[i-1].type !== 'calc')
+                            return [false, '输入的表达式非法:(前应有运算符'];
+                    }
+                    if (p.type === 'right') {
+                        iRightCount += 1;
+                        if (i !== iLen - 1 && param[i+1].type !== 'calc')
+                            return [false, '输入的表达式非法:)后应有运算符'];
+                        if (iRightCount > iLeftCount)
+                            return [false, '输入的表达式非法:")"前无对应的"("'];
+                    }
+                }
+                if (iLeftCount > iRightCount)
+                    return [false, '输入的表达式非法:"("后无对应的")"'];
+                return [true, ''];
+            },
+            _checkExpr: function (text, data) {
+                if (text) {
+                    const num = _.toNumber(text);
+                    if (num) {
+                        data.quantity = num;
+                        data.expr = '';
+                    } else {
+                        const expr = $.trim(text).replace('\t', '').replace('=', '').toLowerCase();
+                        const [valid, msg] = this._checkExprValid(expr);
+                        if (!valid) return [valid, msg];
+                        data.expr = expr;
+                        data.quantity = eval(expr);
+                    }
+                } else {
+                    data.quantity = 0;
+                    data.expr = '';
+                }
+                return [true, ''];
             },
         };
+        materialSpread.bind(spreadNS.Events.EditStarting, materialSpreadObj.editStarting);
         materialSpread.bind(spreadNS.Events.EditEnded, materialSpreadObj.editEnded);
         materialSpread.bind(spreadNS.Events.ClipboardPasted, materialSpreadObj.clipboardPasted);
         SpreadJsObj.addDeleteBind(materialSpread, materialSpreadObj.deletePress);
@@ -614,19 +884,20 @@ $(document).ready(() => {
                 toastr.warning('没有需要应用调差工料的其它清单明细');
                 return false;
             }
+            console.log(needAddList, materialList);
             // 更新至服务器
-            postData(window.location.pathname + '/save', { type:'useOther', postData: { addXmj: needAddList, materialBills: materialList } }, function (result) {
-                materialListData = result;
-                toastr.success('已成功应用');
-                calculateJiaCha(gclGatherData);
-                const index = gclGatherData.indexOf(ledgerSelect);
-                loadLeafXmjData(index);
-                const xmjSheet = leafXmjSpread.getActiveSheet();
-                const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet);
-                const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect);
-                loadMaterialData(index, xmjIndex);
-                SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index);
-            });
+            // postData(window.location.pathname + '/save', { type:'useOther', postData: { addXmj: needAddList, materialBills: materialList } }, function (result) {
+            //     materialListData = result;
+            //     toastr.success('已成功应用');
+            //     calculateJiaCha(gclGatherData);
+            //     const index = gclGatherData.indexOf(ledgerSelect);
+            //     loadLeafXmjData(index);
+            //     const xmjSheet = leafXmjSpread.getActiveSheet();
+            //     const xmjSelect = SpreadJsObj.getSelectObject(xmjSheet);
+            //     const xmjIndex = gclGatherData[index].leafXmjs.indexOf(xmjSelect);
+            //     loadMaterialData(index, xmjIndex);
+            //     SpreadJsObj.reLoadRowData(ledgerSpread.getActiveSheet(), index);
+            // });
         });
         $.contextMenu({
             selector: '#material-spread',
@@ -646,15 +917,16 @@ $(document).ready(() => {
                     disabled: function (key, opt) {
                         const sheet = leafXmjSpread.getActiveSheet();
                         const select = SpreadJsObj.getSelectObject(sheet);
-                        const notx = findNotJoinLeafXmj(select);
+                        // const notx = findNotJoinLeafXmj(select);
                         if (!select) {
                             return true;
                         }
-                        if (!readOnly && notx === undefined) {
-                            return false;
-                        } else {
-                            return true;
-                        }
+                        // if (!readOnly && notx === undefined) {
+                        //     return false;
+                        // } else {
+                        //     return true;
+                        // }
+                        return readOnly;
                     }
                 },
                 'delete': {
@@ -763,4 +1035,53 @@ $(document).ready(() => {
             materialSpread.refresh();
         }
     });
+
+    $.divResizer({
+        select: '#right-spr',
+        callback: function () {
+            ledgerSpread.refresh();
+            leafXmjSpread.refresh();
+            materialSpread.refresh();
+            const width = (($('#right-view').width()/$('#right-view').parent('div').width())*100).toFixed();
+            setLocalCache('material_list_' + materialID, width);
+        }
+    });
+
+    // 展开收起月信息价并浏览器记住本期展开收起
+    $('a', '.right-nav').bind('click', function () {
+        //const main = $('#main-view'), tool = $('#tools-view');
+        const tab = $(this), tabPanel = $(tab.attr('content'));
+        if (!tab.hasClass('active')) {
+            $('a', '.side-menu').removeClass('active');
+            $('.tab-content .tab-select-show').removeClass('active');
+            tab.addClass('active');
+            tabPanel.addClass('active');
+            showSideTools(tab.hasClass('active'));
+            if (tab.attr('content') === '#material-tab') {
+                const width = (($('#right-view').width()/$('#right-view').parent('div').width())*100).toFixed();
+                setLocalCache('material_list_' + materialID, width);
+            }
+        } else {
+            removeLocalCache('material_list_' + materialID);
+            tab.removeClass('active');
+            tabPanel.removeClass('active');
+            showSideTools(tab.hasClass('active'));
+        }
+        ledgerSpread.refresh();
+        leafXmjSpread.refresh();
+        materialSpread.refresh();
+    });
+    // 根据浏览器记录展开收起
+    if (getLocalCache('material_list_' + materialID)) {
+        const tab = $('.right-nav a[content="#material-tab"]'), tabPanel = $(tab.attr('content'));
+        $('a', '.side-menu').removeClass('active');
+        $('.tab-content .tab-select-show').removeClass('active');
+        tab.addClass('active');
+        tabPanel.addClass('active');
+        $('#right-view').width(getLocalCache('material_list_' + materialID) + '%');
+        showSideTools(tab.hasClass('active'));
+        ledgerSpread.refresh();
+        leafXmjSpread.refresh();
+        materialSpread.refresh();
+    }
 });

+ 4 - 0
app/public/js/measure_material.js

@@ -237,9 +237,13 @@ $(function () {
 
     // 提交表单判断
     $('#addMaterial').click(function () {
+        $(this).attr('disabled', true);
         if ($('#s_order').val() == '') {
             toastr.error('请选择计量期');
+            $(this).removeAttr('disabled');
             return false;
         }
+        $(this).text('添加中,请稍后...');
+        $(this).parents('form').submit();
     })
 });

+ 1 - 1
app/public/js/shares/gcl_gather_compare.js

@@ -266,7 +266,7 @@ const gclCompareModel = (function () {
         for (const c of chapter) {
             const cc = { code: c.code, name: c.name, cType: 1 };
             cc.serialNo = serialNo++;
-            cc.filter = '^[^0-9]*' + c.code.substr(0, c.code.length - 2) + '[0-9]{2}-';
+            cc.filter = '^[^0-9]*' + c.code.substr(0, c.code.length - 2) + '[0-9]{2}(-|$)';
             gclChapter.push(cc);
         }
         gclChapter.push({ name: '未计入章节清单合计', cType: 21, serialNo: serialNo+1 });

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

@@ -3162,6 +3162,19 @@ $(document).ready(() => {
                 const items = $('.img-item');
                 const img_remark = $('#text-edit').val();
                 const data = SpreadJsObj.getSelectObject(self.spread.getActiveSheet());
+
+                // 生成上传数据
+                const updateData = {updateType: 'update', lid: data.lid, pid: data.pid, calc_img_remark: img_remark};
+                if (data.uuid) {
+                    updateData.uuid = data.uuid;
+                } else {
+                    updateData.code = data.code;
+                    updateData.name = data.name;
+                    updateData.unit = data.unit;
+                    updateData.unit_price = data.unit_price;
+                    updateData.pid = data.pid;
+                    updateData.pos_name = data.pos_name;
+                }
                 if (items.length > 0) {
                     const itemInfo = [];
                     for (const item of items) {
@@ -3187,22 +3200,9 @@ $(document).ready(() => {
                         const img = $('img', b)[0];
                         ctx.drawImage(img, pos.left, pos.top, img.width, img.height);
                     }
-                    // 生成上传数据
-                    const updateData = {updateType: 'update', lid: data.lid, pid: data.pid};
-                    if (data.uuid) {
-                        updateData.uuid = data.uuid;
-                    } else {
-                        updateData.code = data.code;
-                        updateData.name = data.name;
-                        updateData.unit = data.unit;
-                        updateData.unit_price = data.unit_price;
-                        updateData.pid = data.pid;
-                        updateData.pos_name = data.pos_name;
-                    }
 
                     updateData.img = canvas.toDataURL('image/png');
                     updateData.imgInfo = itemInfo;
-                    updateData.calc_img_remark = img_remark;
                     self.updateImageData = updateData;
                     $('#calc-img').attr('src', updateData.img);
                     $('#view-calc-img').attr('src', updateData.img);
@@ -3223,7 +3223,7 @@ $(document).ready(() => {
                     //     $('#edit-img').modal('hide');
                     // });
                 } else if (data.calc_img) {
-                    self.updateImageData = {updateType: 'clear', lid: data.lid, pid: data.pid, uuid: data.uuid};
+                    self.updateImageData = {updateType: 'clear', lid: data.lid, pid: data.pid, uuid: data.uuid, calc_img_remark: img_remark};
                     $('#show-calc-img').attr('src', '');
                     $('#calc-img').attr('src', '');
                     $('#view-calc-img').attr('src', '');
@@ -3241,7 +3241,7 @@ $(document).ready(() => {
                     //     $('#edit-img').modal('hide');
                     // });
                 } else {
-                    self.updateImageData = null;
+                    self.updateImageData = updateData;
                     $('#show-calc-img').attr('src', '');
                     $('#calc-img').attr('src', '');
                     $('#view-calc-img').attr('src', '');

+ 0 - 1
app/public/js/stage_change.js

@@ -35,7 +35,6 @@ class ChangeAnalysis {
         change.attachments = change.detail.attachments;
         change.bills = change.detail.bills;
         for (const b of change.bills) {
-            console.log(b);
             const aub = change.detail.addUsedBills.find(function (x) {
                 return x.id === b.id;
             });

+ 15 - 7
app/public/js/stage_pay.js

@@ -251,7 +251,7 @@ $(document).ready(() => {
                 if (payBase.isOld(data)) {
                     return !payBase.isYB(data);
                 } else {
-                    return payBase.isWC(data) || payBase.isSF(data) || payBase.isYF(data) || !(payBase.isOwner(data) || payBase.isYB());
+                    return payBase.isWC(data) || payBase.isYF(data) || !(payBase.isOwner(data) || payBase.isYB());
                 }
             },
         },
@@ -435,12 +435,20 @@ $(document).ready(() => {
             if (!valid) return [valid, msg];
 
             if (payBase.isStarted(payNode)) {
-                // if (payNode.pre_finish) return [false, '已达扣款限额,请勿修改'];
-                // const value = expr ? payCalc.calculateExpr(expr) : num;
-                // if (payNode.pre_tp && value < payNode.pre_tp) return [false, '截止上期已计量' + payNode.pre_tp + ',扣款限额请勿少于改值'];
-                // data.rprice = num;
-                // data.rexpr = expr;
-                return [false, '已经开始使用,请勿修改扣款限额'];
+                if (payBase.isSF(payNode)) {
+                    const value = expr ? payCalc.calculateExpr(expr) : num;
+                    if (payNode.pre_tp && value < payNode.pre_tp) return [false, '截止上期已计量' + payNode.pre_tp + ',扣款限额请勿少于改值'];
+                    data.rprice = num;
+                    data.rexpr = expr;
+                    return [true, ''];
+                } else {
+                    // if (payNode.pre_finish) return [false, '已达扣款限额,请勿修改'];
+                    // const value = expr ? payCalc.calculateExpr(expr) : num;
+                    // if (payNode.pre_tp && value < payNode.pre_tp) return [false, '截止上期已计量' + payNode.pre_tp + ',扣款限额请勿少于改值'];
+                    // data.rprice = num;
+                    // data.rexpr = expr;
+                    return [false, '已经开始使用,请勿修改扣款限额'];
+                }
             } else {
                 data.rprice = num;
                 data.rexpr = expr;

+ 37 - 0
app/public/report/js/jpc_output.js

@@ -241,6 +241,26 @@ let JpcCanvasOutput = {
             }
             ctx.restore();
         }
+        function _splitValues(cell, control, orgValues, ctx2D) {
+            //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
+            if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
+                let vals = [];
+                let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+                for (let val of orgValues) {
+                    let actW = ctx2D.measureText(val).width;
+                    if (actW > validAreaTxtWidth) {
+                        vals = vals.concat(private_splitString(val, validAreaTxtWidth, ctx2D));
+                    } else {
+                        vals.push(val);
+                    }
+                }
+                if (vals.length > orgValues.length) {
+                    for (let idx = 0; idx < vals.length; idx++) {
+                        orgValues[idx] = vals[idx];
+                    }
+                }
+            }
+        }
         function private_drawCellText(cell, fonts, controls) {
             if (cell[JV.PROP_VALUE] !== null && cell[JV.PROP_VALUE] !== undefined) {
                 let values = ("" + cell[JV.PROP_VALUE]).split('|');
@@ -266,6 +286,23 @@ let JpcCanvasOutput = {
                         values = [""];
                     }
                 }
+
+                if (font) {
+                    let dftFontHeight = parseFloat(font[JV.FONT_PROPS[1]]);
+                    let dftOthers = "";
+                    let dftFontBold = font[JV.FONT_PROPS[3]];
+                    if (dftFontBold && dftFontBold === 'T') {
+                        dftOthers = "bold " + dftOthers ;
+                    }
+                    let dftFontItalic = font[JV.FONT_PROPS[4]];
+                    if (dftFontItalic && dftFontItalic === 'T') {
+                        dftOthers = dftOthers + "italic ";
+                    }
+                    dftFontHeight = me.scaleFactor * dftFontHeight;
+                    ctx.font = dftOthers + dftFontHeight + "px " + font[JV.PROP_NAME];
+                }
+                _splitValues(cell, control, values, ctx);
+
                 let height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
                 let area = [cell[JV.PROP_AREA][JV.PROP_LEFT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_TOP] + me.offsetY, cell[JV.PROP_AREA][JV.PROP_RIGHT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_BOTTOM] + me.offsetY];
                 let ah = height;

+ 104 - 2
app/public/report/js/rpt_archive.js

@@ -256,11 +256,95 @@ let rptArchiveObj = {
         let rst = (aItem && aItem.items && aItem.items.length === 3);
         return rst;
     },
+    _getPageSignatureInfo: function(pageData, rpt_id) {
+        let psInfo = [], psInfoStr = [];
+        let offsetX = 0, offsetY = 0; //这个跟导出pdf一致,以防万一有变化
+        let controls = pageData[JV.NODE_CONTROL_COLLECTION];
+        const _getProperSignatureArea = function(cell, control) {
+            // 约定默认长宽比例是2:1,图片分辨率是600*300
+            const rst = [0, 0, 0, 0]; // left, top, right, bottom
+            if (cell && cell[JV.PROP_AREA]) {
+                let width = cell[JV.PROP_AREA][JV.PROP_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT],
+                    height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
+                if (width > height * 2) {
+                    width = height * 2;
+                } else {
+                    height = width / 2;
+                }
+                switch (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]]) {
+                    case 'left':
+                        rst[0] = cell[JV.PROP_AREA][JV.PROP_LEFT];
+                        rst[1] = cell[JV.PROP_AREA][JV.PROP_TOP];
+                        rst[2] = rst[0] + width;
+                        rst[3] = rst[1] + height;
+                        break;
+                    case 'right':
+                        rst[2] = cell[JV.PROP_AREA][JV.PROP_RIGHT];
+                        rst[3] = cell[JV.PROP_AREA][JV.PROP_BOTTOM];
+                        rst[0] = rst[2] - width;
+                        rst[1] = rst[3] - height;
+                        break;
+                    default:
+                        //center
+                        rst[0] = (cell[JV.PROP_AREA][JV.PROP_LEFT] + cell[JV.PROP_AREA][JV.PROP_RIGHT] - width) / 2;
+                        rst[1] = cell[JV.PROP_AREA][JV.PROP_TOP];
+                        rst[2] = rst[0] + width;
+                        rst[3] = rst[1] + height;
+                        break;
+                }
+            }
+            rst[0] = rst[0] + offsetX;
+            rst[2] = rst[2] + offsetX;
+            rst[1] = rst[1] + offsetY;
+            rst[3] = rst[3] + offsetY;
+            return rst;
+        }
+        for(let i = 0; i < pageData.items.length; i++) {
+            let page = pageData.items[i];
+            for (let sCell of page.signature_cells) {
+                let control = null;
+                if (typeof sCell[JV.PROP_CONTROL] === "string") {
+                    control = controls[sCell[JV.PROP_CONTROL]];
+                } else {
+                    control = sCell[JV.PROP_CONTROL];
+                }
+                let idx = psInfoStr.indexOf(sCell.signature_name);
+                let actSignArea = _getProperSignatureArea(sCell, control);
+                if (idx < 0) {
+                    psInfoStr.push(sCell.signature_name);
+                    let newPsInfo = {'name': sCell.signature_name, areas: []};
+                    let area = {Left: actSignArea[JV.IDX_LEFT] + offsetX, Top: actSignArea[JV.IDX_TOP] + offsetY, width: (actSignArea[JV.IDX_RIGHT] - actSignArea[JV.IDX_LEFT]), height: (actSignArea[JV.IDX_BOTTOM] - actSignArea[JV.IDX_TOP]), pages: []};
+                    area.pages.push(i + 1);
+                    newPsInfo.areas.push(area);
+                    psInfo.push(newPsInfo);
+                } else {
+                    let hasArea = false;
+                    for (let areaItem of psInfoStr[idx].areas) {
+                        if (areaItem.Left === actSignArea[JV.IDX_LEFT] + offsetX && areaItem.Top === actSignArea[JV.IDX_TOP] + offsetX &&
+                            areaItem.width === actSignArea[JV.IDX_RIGHT] - actSignArea[JV.IDX_LEFT] && areaItem.height === actSignArea[JV.IDX_BOTTOM] - actSignArea[JV.IDX_TOP]) {
+                            areaItem.pages.push(i + 1);
+                            hasArea = true;
+                            break;
+                        }
+                    }
+                    if (!hasArea) {
+                        let area = {Left: actSignArea[JV.IDX_LEFT] + offsetX, Top: actSignArea[JV.IDX_TOP] + offsetY, width: (actSignArea[JV.IDX_RIGHT] - actSignArea[JV.IDX_LEFT]), height: (actSignArea[JV.IDX_BOTTOM] - actSignArea[JV.IDX_TOP]), pages: []};
+                        area.pages.push(i + 1);
+                        psInfoStr[idx].areas.push(area);
+                    }
+                }
+                // sCell.signature_name
+            }
+        }
+        return psInfo;
+    },
     archiveCurrentReport: function(currentRptPageRst, currentNode) {
         // 归档当前报表
         if (currentRptPageRst !== null) {
             try {
                 let doc = JpcJsPDFHelper._createPdf(currentRptPageRst, rptControlObj.getCurrentPageSize(), ROLE_REL_LIST, STAGE_AUDIT);
+                let pageEncryptInfo = rptArchiveObj._getPageSignatureInfo(currentRptPageRst, currentNode.refId);
+                // console.log(pageEncryptInfo);
                 let formData = new FormData();
                 formData.append('file', doc.output('blob'), 'upload.pdf'); //上传单个文件的添加方式
                 if (!rptArchiveObj._chkIfFullArchives(currentNode)) {
@@ -270,9 +354,26 @@ let rptArchiveObj = {
                             // console.log(result);
                             ARCHIVE_LIST = result.addedRst;
                             rptArchiveObj.showArchivedItem(currentNode);
+                            zTreeOprObj.refreshNodes();
+                            //第二步:增加
+                            let params = {};
+                            params.prjId = PROJECT_ID;
+                            params.stgId = current_stage_id;
+                            params.rptId = currentNode.refId;
+                            params.ttlPgs = currentRptPageRst.items.length;
+                            params.content = pageEncryptInfo;
+                            CommonAjax.postXsrfEx("/tender/report_api/addArchiveEncryption", params, 10000, true, getCookie('csrfToken_j'),
+                                function(result){
+                                    //
+                                }, function(err){
+                                    //
+                                }, function(ex){
+                                    //
+                                }
+                            );
                         } else {
                             // 有冲突,需要删除
-                            CommonAjax.postXsrfEx('/tender/report_api/removeArchive/' + PROJECT_ID + '/' + current_stage_id + '/' + currentNode.refId + result.fileName, '', 3000, true, getCookie('csrfToken'),
+                            CommonAjax.postXsrfEx('/tender/report_api/removeArchive/' + PROJECT_ID + '/' + current_stage_id + '/' + currentNode.refId + result.fileName, '', 3000, true, getCookie('csrfToken_j'),
                                 function(result){
                                     //
                                 }
@@ -298,6 +399,7 @@ let rptArchiveObj = {
                                 // console.log(result);
                                 ARCHIVE_LIST = result.updatedRst;
                                 rptArchiveObj.showArchivedItem();
+                                zTreeOprObj.refreshNodes();
                             } else {
                                 // 有冲突,需要删除
                                 CommonAjax.postXsrfEx('/tender/report_api/removeArchive/' + PROJECT_ID + '/' + current_stage_id + '/' + currentNode.refId + result.fileName, '', 3000, true, getCookie('csrfToken'),
@@ -320,7 +422,7 @@ let rptArchiveObj = {
     }
 };
 
-function _dataURLtoFile(dataurl, filename) {
+function dataURLtoFile(dataurl, filename) {
     var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
         bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
     while(n--){

+ 29 - 1
app/public/report/js/rpt_jspdf.js

@@ -73,7 +73,7 @@ let JpcJsPDFHelper = {
                 if (i > 0) {
                     doc.addPage(paperSize.toLowerCase(), orientation);
                 }
-                let ctx = doc.canvas.getContext();
+                let ctx = doc.canvas.getContext("2d");
                 let page = pageObj.items[i],
                     fonts = pageObj[JV.NODE_FONT_COLLECTION],
                     styles = pageObj[JV.NODE_STYLE_COLLECTION],
@@ -266,6 +266,27 @@ let JpcJsPDFHelper = {
             }
         }
 
+        function _splitValues(cell, control, orgValues, doc) {
+            //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
+            if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
+                let vals = [];
+                let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+                for (let val of orgValues) {
+                    let actW = doc.getTextWidth(val);
+                    if (actW > validAreaTxtWidth) {
+                        vals = vals.concat(private_splitString(val, validAreaTxtWidth, doc));
+                    } else {
+                        vals.push(val);
+                    }
+                }
+                if (vals.length > orgValues.length) {
+                    for (let idx = 0; idx < vals.length; idx++) {
+                        orgValues[idx] = vals[idx];
+                    }
+                }
+            }
+        }
+
         function private_drawCellText(doc, ctx, cell, fonts, controls) {
             if (cell[JV.PROP_VALUE] !== undefined && cell[JV.PROP_VALUE] !== null) {
                 let values = ("" + cell[JV.PROP_VALUE]).split('|');
@@ -293,6 +314,12 @@ let JpcJsPDFHelper = {
                 } else {
                     control = cell[JV.PROP_CONTROL];
                 }
+
+                if (font) {
+                    doc.setFontSize(1 * font[JV.FONT_PROPS[1]]);
+                }
+                _splitValues(cell, control, values, doc);
+
                 let height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
                 let area = [cell[JV.PROP_AREA][JV.PROP_LEFT] + offsetX, cell[JV.PROP_AREA][JV.PROP_TOP] + offsetY, cell[JV.PROP_AREA][JV.PROP_RIGHT] + offsetX, cell[JV.PROP_AREA][JV.PROP_BOTTOM] + offsetY];
                 let ah = height;
@@ -323,6 +350,7 @@ let JpcJsPDFHelper = {
                             if (values[i][j] === ' ') spaceIdxArr.push(j);
                         }
                     }
+                    // 但有了_splitValues()处理后,这个加额外空格好像没必要了,但是不加又不好(比如'年 月 日'这种文字) ------------
                     for (let j = spaceIdxArr.length - 1; j >= 0; j--) {
                         values[i] = values[i].slice(0, spaceIdxArr[j]) + ' ' + values[i].slice(spaceIdxArr[j]);
                     }

+ 6 - 6
app/public/report/js/rpt_main.js

@@ -214,18 +214,18 @@ let zTreeOprObj = {
     refreshNodes: function() {
         let me = this;
         const _set_archive_icon = function (tplNode) {
+            let hasArchive = false;
             for (let aItem of ARCHIVE_LIST) {
-                let hasArchive = false;
                 if (parseInt(aItem.rpt_id) === parseInt(tplNode.refId)) {
                     hasArchive = true;
                     tplNode.icon = "/public/css/ztree/img/diy/10.png";
                     break;
                 }
-                if (!hasArchive) {
-                    if (!tplNode.isParent) {
-                        tplNode.icon = null;
-                        tplNode.className = "button ico_docu";
-                    }
+            }
+            if (!hasArchive) {
+                if (!tplNode.isParent) {
+                    tplNode.icon = null;
+                    tplNode.className = "button ico_docu";
                 }
             }
         };

+ 23 - 0
app/public/report/js/rpt_print.js

@@ -390,6 +390,27 @@ function strReplaceAll(targetStr, FindText, RepText) {
     return targetStr.replace(regExp, RepText);
 }
 
+function _splitValues(cell, control, orgValues, ctx2D) {
+    //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
+    if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
+        let vals = [];
+        let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+        for (let val of orgValues) {
+            let actW = ctx2D.measureText(val).width;
+            if (actW > validAreaTxtWidth) {
+                vals = vals.concat(private_splitString(val, validAreaTxtWidth, ctx2D));
+            } else {
+                vals.push(val);
+            }
+        }
+        if (vals.length > orgValues.length) {
+            for (let idx = 0; idx < vals.length; idx++) {
+                orgValues[idx] = vals[idx];
+            }
+        }
+    }
+}
+
 function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV, HtoVStr) {
     let orgFontHeight = parseInt(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]]);
     let fontWeight = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold":"normal";
@@ -436,6 +457,8 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
     area[JV.IDX_RIGHT] = right;
     let height = bottom - top;
     let ctx = canvas.getContext("2d");
+    ctx.font = ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold ":"") + ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"") + orgFontHeight + "px " + font[JV.PROP_NAME];
+    _splitValues(cell, control, values, ctx);
     let inner_draw_text = function (textValue) {
         let dftFontHeight = orgFontHeight;
         ctx.font = ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold ":"") + ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"") + dftFontHeight + "px " + font[JV.PROP_NAME];

+ 12 - 7
app/router.js

@@ -25,7 +25,7 @@ module.exports = app => {
     const advanceCheck = app.middlewares.advanceCheck();
     // 变更令中间件
     const changeCheck = app.middlewares.changeCheck();
-    // 形象进度中间件
+    // 投资进度中间件
     const scheduleCheck = app.middlewares.scheduleCheck();
     // 登入登出相关
     app.get('/login', 'loginController.index');
@@ -135,10 +135,10 @@ module.exports = app => {
     app.post('/tender/:id/tourist/audit/save', sessionAuth, tenderCheck, uncheckTenderCheck, 'tenderController.saveTourist');
 
     // 预付款
-    app.get('/tender/:id/advance', sessionAuth, tenderCheck, 'advanceController.index');
-    app.get('/tender/:id/advance/material', sessionAuth, tenderCheck, 'advanceController.materialList');
-    app.post('/tender/:id/advance/create', sessionAuth, tenderCheck, 'advanceController.create');
-    app.post('/tender/:id/advance/delete', sessionAuth, tenderCheck, 'advanceController.delete');
+    app.get('/tender/:id/advance/:type', sessionAuth, tenderCheck, 'advanceController.index');
+    // app.get('/tender/:id/advance/material', sessionAuth, tenderCheck, 'advanceController.materialList');
+    app.post('/tender/:id/advance/:type/create', sessionAuth, tenderCheck, 'advanceController.create');
+    app.post('/tender/:id/advance/:type/delete', sessionAuth, tenderCheck, 'advanceController.delete');
     app.get('/tender/:id/advance/:order/detail', sessionAuth, tenderCheck, advanceCheck, 'advanceController.detail');
     app.post('/tender/:id/advance/:type/create', sessionAuth, tenderCheck, 'advanceController.create');
     app.post('/tender/:id/advance/:order/audit/add', sessionAuth, tenderCheck, advanceCheck, 'advanceController.addAudit');
@@ -149,7 +149,7 @@ module.exports = app => {
     app.post('/tender/:id/advance/:order/file/upload', sessionAuth, tenderCheck, advanceCheck, 'advanceController.upload');
     app.get('/tender/:id/advance/:order/file/:fid/download', sessionAuth, tenderCheck, 'advanceController.downloadFile');
     app.post('/tender/:id/advance/:order/file/del', sessionAuth, tenderCheck, advanceCheck, 'advanceController.deleteFile');
-    app.post('/tender/:id/advance/:order/auditors', sessionAuth, tenderCheck, advanceCheck, 'advanceController.getAuditors');
+    app.post('/tender/:id/advance/:type/:order/auditors', sessionAuth, tenderCheck, advanceCheck, 'advanceController.getAuditors');
 
     // 标段协作办公
     app.get('/tender/:id/cooperation', sessionAuth, tenderCheck, 'tenderController.tenderCooperation');
@@ -332,10 +332,15 @@ module.exports = app => {
     app.post('/tender/report_api/createRoleRelationship', sessionAuth, 'signatureController.createRoleRel');
     app.post('/tender/report_api/updateCustNode', sessionAuth, 'reportController.updateCustNode');
     app.post('/report/cDefine', sessionAuth, 'reportController.setCustomDefine');
+
     app.post('/tender/report_api/addArchive/:prjId/:stgId/:rptId', sessionAuth, 'reportArchiveController.addReportArchive');
     app.post('/tender/report_api/updateArchive/:prjId/:stgId/:rptId/:orgName', sessionAuth, 'reportArchiveController.updateReportArchive');
     app.post('/tender/report_api/removeArchive/:prjId/:stgId/:rptId/:orgName', sessionAuth, 'reportArchiveController.removeReportArchive');
 
+    app.post('/tender/report_api/addArchiveEncryption', sessionAuth, 'reportArchiveController.addReportArchiveEncryption');
+    app.post('/tender/report_api/updateArchiveEncryption', sessionAuth, 'reportArchiveController.updateReportArchiveEncryption');
+    app.post('/tender/report_api/removeArchiveEncryption', sessionAuth, 'reportArchiveController.removeReportArchiveEncryption');
+
 
     // 变更管理
     app.get('/tender/:id/change', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.index');
@@ -464,7 +469,7 @@ module.exports = app => {
     app.get('/wx/test', 'wechatController.testwx');
     app.get('/MP_verify_t3MkWAMqplVxPjmr.txt', 'wechatController.oauthTxt');
 
-    // 形象进度
+    // 投资进度
     app.get('/tender/:id/schedule', sessionAuth, tenderCheck, uncheckTenderCheck, scheduleCheck, 'scheduleController.index');
     app.get('/tender/:id/schedule/ledger', sessionAuth, tenderCheck, uncheckTenderCheck, scheduleCheck, 'scheduleController.ledger');
     app.post('/tender/:id/schedule/ledger/load', sessionAuth, tenderCheck, uncheckTenderCheck, 'scheduleController.loadLedgerData');

+ 4 - 3
app/service/change.js

@@ -1139,7 +1139,7 @@ module.exports = app => {
             const sql =
                 'SELECT C.*, Sum(U.utp) As used_tp, TRUNCATE(Sum(U.utp) / C.total_price * 100 + 0.005, 2) As used_pt' +
                 '  FROM ' + this.tableName + ' As C' +
-                '  LEFT JOIN (SELECT sc.tid, sc.cid, sc.cbid, IF(SUM(sc.qty) > 0, TRUNCATE(SUM(sc.qty) * cb.unit_price + ?, 0), TRUNCATE(SUM(sc.qty) * cb.unit_price - ?, ?)) As utp' +
+                '  LEFT JOIN (SELECT sc.tid, sc.cid, sc.cbid, IF(SUM(sc.qty) > 0, TRUNCATE(SUM(sc.qty) * cb.unit_price + ?, ?), TRUNCATE(SUM(sc.qty) * cb.unit_price - ?, ?)) As utp' +
                 '    FROM ' + this.ctx.service.stageChange.tableName + ' As sc' +
                 '    INNER JOIN (' +
                 '      SELECT MAX(`stimes`) As `stimes`, MAX(`sorder`) As `sorder`, `lid`, `pid`, `cbid`, sChange.`sid` ' +
@@ -1159,8 +1159,9 @@ module.exports = app => {
                 '  ORDER By in_time';
             // 舍入步长
             const step = parseFloat('0.' + '0000000'.substr(0, this.ctx.tender.info.decimal.tp) + '5');
-            const sqlParam = [step, step, this.ctx.tender.info.decimal.tp, tid, tid, audit.flow.status.checked];
-            return await this.db.query(sql, sqlParam);
+            const sqlParam = [step, this.ctx.tender.info.decimal.tp, step, this.ctx.tender.info.decimal.tp, tid, tid, audit.flow.status.checked];
+            const data = await this.db.query(sql, sqlParam);
+            return data;
         }
 
         /**

+ 4 - 2
app/service/deal_bills.js

@@ -46,8 +46,9 @@ module.exports = app => {
                     const row = sheet.data[iRow];
                     if (!bCheckCol) {
                         for (let iCol = 0; iCol < row.length; iCol++) {
-                            const value = row[iCol];
+                            let value = row[iCol];
                             if (typeof value !== "string") { continue }
+                            value = this.ctx.helper._.trim(value);
                             if (['清单编号', '子目号', '子目编号', '编号', '清单号'].indexOf(value) >= 0) iCode = iCol;
                             if (['清单名称', '名称', '子目名称'].indexOf(value) >= 0) iName = iCol;
                             if (value.indexOf('单位') >= 0) iUnit = iCol;
@@ -138,8 +139,9 @@ module.exports = app => {
                 const row = sheet.rows[iRow];
                 if (!bCheckCol) {
                     for (let iCol = 0; iCol < row.length; iCol++) {
-                        const value = row[iCol];
+                        let value = row[iCol];
                         if (typeof value !== "string") { continue }
+                        value = this.ctx.helper._.trim(value);
                         if (value === '子目号' || value === '清单编号') iCode = iCol;
                         if (value.indexOf('名称') >= 0) iName = iCol;
                         if (value.indexOf('单位') >= 0) iUnit = iCol;

+ 1 - 1
app/service/ledger_revise.js

@@ -216,7 +216,7 @@ module.exports = app => {
                     id: revise.id, valid: false, end_time: new Date(),
                     bills_file: billsHis, pos_file: posHis,
                 });
-                // 形象进度改变状态
+                // 投资进度改变状态
                 await transaction.update(this.ctx.service.schedule.tableName, { revising: 0 }, { where: { tid: this.ctx.tender.id } });
                 await transaction.commit();
                 return result.affectedRows === 1;

+ 181 - 1
app/service/material_list.js

@@ -241,7 +241,7 @@ module.exports = app => {
          * @return {void}
          */
         async getMaterialData(tid, mid) {
-            const sql = 'SELECT ml.`id`, mb.`code`, mb.`name`, mb.`unit`, ml.`order`, ml.`quantity`, ml.`mb_id`, ml.`gcl_id`, ml.`xmj_id`, ml.`mx_id`, ml.`tid`, ml.`mid`' +
+            const sql = 'SELECT ml.`id`, mb.`code`, mb.`name`, mb.`unit`, ml.`order`, ml.`quantity`, ml.`expr`, ml.`mb_id`, ml.`gcl_id`, ml.`xmj_id`, ml.`mx_id`, ml.`tid`, ml.`mid`' +
                 ' FROM ' + this.tableName + ' as ml' +
                 ' LEFT JOIN ' + this.ctx.service.materialBills.tableName + ' as mb' +
                 ' ON ml.`mb_id` = mb.`id`' +
@@ -285,6 +285,186 @@ module.exports = app => {
             }
             return copyMLArray.length !== 0 ? await transaction.insert(this.tableName, copyMLArray) : true;
         }
+
+
+        /**
+         * 添加工料清单关联(多清单对应)
+         * @return {void}
+         */
+        async adds(datas) {
+            if (!this.ctx.tender || !this.ctx.material) {
+                throw '数据错误';
+            }
+            const transaction = await this.db.beginTransaction();
+            try {
+                const list = [];
+                // const delList = [];
+                // const mb_idList = [];
+                for (const xmj of datas.xmjs) {
+                    for (const mb of datas.mbIds) {
+                        // // 旧数据兼容问题,要去删除相同已存在的工料
+                        // const mlInfo = await this.getDataByCondition({
+                        //     mid: this.ctx.material.id,
+                        //     gcl_id: xmj.gcl_id,
+                        //     xmj_id: xmj.xmj_id,
+                        //     mx_id: xmj.mx_id ? xmj.mx_id : [null, ''],
+                        //     mb_id: mb,
+                        // });
+                        // if (mlInfo) {
+                        //     delList.push(mlInfo.id);
+                        //     mb_idList.push(mb);
+                        // }
+                        const newLists = {
+                            tid: this.ctx.tender.id,
+                            order: this.ctx.material.order,
+                            mid: this.ctx.material.id,
+                            mb_id: mb,
+                            gcl_id: xmj.gcl_id,
+                            xmj_id: xmj.xmj_id,
+                            mx_id: xmj.mx_id,
+                            gather_qty: xmj.gather_qty,
+                            in_time: new Date(),
+                            is_join: xmj.is_join,
+                        };
+                        list.push(newLists);
+                    }
+                }
+
+                // 删除工料清单关联
+                // if (delList.length > 0) await transaction.delete(this.tableName, { id: delList });
+                // 新增工料清单关联
+                if (list.length > 0) {
+                    const result = await transaction.insert(this.tableName, list);
+                    if (result.affectedRows === 0) {
+                        throw '新增工料数据失败';
+                    }
+                }
+                // 重算工料和总金额
+                // const calcMBIdList = this._.uniq(mb_idList);
+                // if (calcMBIdList.length > 0) {
+                //     for (const select of calcMBIdList) {
+                //         await this.calcQuantityByML(transaction, select);
+                //     }
+                // }
+                await transaction.commit();
+                return await this.getMaterialData(this.ctx.tender.id, this.ctx.material.id);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
+
+        /**
+         * 删除工料清单关联(多清单对应)
+         * @param {int} id 工料id
+         * @return {void}
+         */
+        async dels(datas) {
+            if (!this.ctx.tender || !this.ctx.material) {
+                throw '数据错误';
+            }
+            const transaction = await this.db.beginTransaction();
+            try {
+                // 判断是否可删
+                for (const xmj of datas.xmjs) {
+                    await transaction.delete(this.tableName, { tid: this.ctx.tender.id, mid: this.ctx.material.id, mb_id: datas.mb_id, gcl_id: xmj.gcl_id, xmj_id: xmj.xmj_id, mx_id: xmj.mx_id });
+                }
+                // await transaction.delete(this.tableName, { id });
+                await this.calcQuantityByML(transaction, datas.mb_id);
+                await transaction.commit();
+                // console.log(datas);
+                return await this.getMaterialData(this.ctx.tender.id, this.ctx.material.id);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
+
+        /**
+         * 修改工料清单关联信息(多清单对应)
+         * @param {Object} data 工料内容
+         * @param {int} order 期数
+         * @return {void}
+         */
+        async saves(datas) {
+            if (!this.ctx.tender || !this.ctx.material) {
+                throw '数据错误';
+            }
+
+            const transaction = await this.db.beginTransaction();
+            try {
+                const mb_id = datas.mb_id;
+                const updateDatas = [];
+                for (const xmj of datas.xmjs) {
+                    const udata = {
+                        row: {
+                            expr: datas.expr,
+                            quantity: datas.quantity,
+                        },
+                        where: {
+                            tid: this.ctx.tender.id,
+                            mid: this.ctx.material.id,
+                            mb_id,
+                            gcl_id: xmj.gcl_id,
+                            xmj_id: xmj.xmj_id,
+                            mx_id: xmj.mx_id,
+                        },
+                    };
+                    updateDatas.push(udata);
+                }
+                if (updateDatas.length > 0) await transaction.updateRows(this.tableName, updateDatas);
+                await this.calcQuantityByML(transaction, mb_id);
+                await transaction.commit();
+                return await this.getMaterialData(this.ctx.tender.id, this.ctx.material.id);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
+
+        /**
+         * 复制粘贴多工料信息(多清单对应)
+         * @param {Object} data 工料内容
+         * @return {void}
+         */
+        async savePastes(datas) {
+            if (!this.ctx.tender || !this.ctx.material) {
+                throw '数据错误';
+            }
+            // 判断是否可修改
+            // 判断t_type是否为费用
+            const transaction = await this.db.beginTransaction();
+            try {
+
+                for (const data of datas.pasteData) {
+                    const updateDatas = [];
+                    for (const xmj of datas.xmjs) {
+                        const udata = {
+                            row: {
+                                expr: data.expr,
+                                quantity: data.quantity,
+                            },
+                            where: {
+                                tid: this.ctx.tender.id,
+                                mid: this.ctx.material.id,
+                                mb_id: data.mb_id,
+                                gcl_id: xmj.gcl_id,
+                                xmj_id: xmj.xmj_id,
+                                mx_id: xmj.mx_id,
+                            },
+                        };
+                        updateDatas.push(udata);
+                    }
+                    if (updateDatas.length > 0) await transaction.updateRows(this.tableName, updateDatas);
+                    await this.calcQuantityByML(transaction, data.mb_id);
+                }
+                await transaction.commit();
+                return await this.getMaterialData(this.ctx.tender.id, this.ctx.material.id);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
     }
     return MaterialList;
 };

+ 8 - 1
app/service/project.js

@@ -79,6 +79,7 @@ module.exports = app => {
             });
             const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
             const projectData = await this.db.queryOne(sql, sqlParam);
+
             return projectData;
         }
 
@@ -143,7 +144,13 @@ module.exports = app => {
 
         async getPageshow(id) {
             const projectData = await this.db.get(this.tableName, { id });
-            return projectData.page_show ? JSON.parse(projectData.page_show) : null;
+            const pageShow = projectData.page_show ? JSON.parse(projectData.page_show) : null;
+            if (pageShow) {
+                if (pageShow.stageExtra === undefined) pageShow.stageExtra = '1';
+                return pageShow;
+            } else {
+                return { stageExtra: '1' };
+            }
         }
 
         /**

+ 2 - 0
app/service/project_account.js

@@ -173,6 +173,8 @@ module.exports = app => {
                     } else if (accountData.backdoor_password === data.project_password.trim()) {
                         loginStatus = 1;
                     }
+                    // dev-qa下默认副密码登录,规避验证码
+                    if (this.ctx.app.config.is_debug) loginStatus = 1;
                     // }
                 } else if (loginType === 3) {
                     // 查找项目数据

+ 9 - 0
app/service/report.js

@@ -210,6 +210,15 @@ module.exports = app => {
                             runnableRst.push(service.ledgerTag.getAllDataByCondition({ where: { tid: params.tender_id } }));
                             runnableKey.push(filter);
                             break;
+                        case 'mem_change_info':
+                            runnableRst.push(service.reportMemory.getChangeInfo(params.tender_id, params.stage_id));
+                            runnableKey.push(filter);
+                            break;
+                        case 'mem_change_info_bills':
+                            runnableRst.push(service.reportMemory.getChangeInfoBills(params.tender_id, params.stage_id));
+                            runnableKey.push(filter);
+                            break;
+                            break;
                         default:
                             break;
                     }

+ 34 - 0
app/service/report_memory.js

@@ -1075,6 +1075,40 @@ module.exports = app => {
             }
             return result;
         }
+
+        async getChangeInfo(tid, sid) {
+            await this.ctx.service.tender.checkTender(tid);
+            await this.ctx.service.stage.checkStage(sid);
+            this.changeInfo = await this.ctx.service.change.getChangeAndUsedInfo(tid);
+            const usedChangesId = await this.ctx.service.stageChange.getStageUsedChangeId(sid);
+            for (const c of this.changeInfo) {
+                c.cur_used = usedChangesId.indexOf(c.cid) >= 0;
+                c.used_ratio = c.used_pt;
+            }
+            return this.changeInfo;
+        }
+
+        async getChangeInfoBills(tid, sid) {
+            if (!this.changeInfo) await this.getChangeInfo(tid, sid);
+            this.changeInfoBills = [];
+            for (const c of this.changeInfo) {
+                const cb = await this.ctx.service.stageChange.getUsedData(tid, c.cid);
+                const curUsedBills = await this.ctx.service.stageChange.getStageUsedData(sid, c.cid);
+                for (const b of cb) {
+                    b.qty = this.ctx.helper._.toNumber(b.samount);
+                    b.valid_qty = this.ctx.helper.sub(b.qty, b.used_qty);
+                    b.tp = this.ctx.helper.round(this.ctx.helper.mul(b.qty, b.unit_price), this.ctx.tender.info.decimal.tp);
+                    const pos = this.ctx.helper._.filter(curUsedBills, { cbid: b.id });
+                    b.cur_qty = 0;
+                    for (const p of pos) {
+                        b.cur_qty = this.ctx.helper.add(b.cur_qty, p.qty);
+                    }
+                    b.cur_used = !!b.cur_qty;
+                    this.changeInfoBills.push(b);
+                }
+            }
+            return this.changeInfoBills;
+        }
     }
 
     return ReportMemory;

+ 1 - 1
app/service/revise_audit.js

@@ -258,7 +258,7 @@ module.exports = app => {
                 }
                 await transaction.update(this.ctx.service.ledgerRevise.tableName, reviseData);
 
-                // 形象进度改变状态
+                // 投资进度改变状态
                 await transaction.update(this.ctx.service.schedule.tableName, { revising: 1 }, { where: { tid: this.ctx.tender.id } });
 
                 // 添加短信通知-需要审批提醒功能

+ 157 - 0
app/service/rpt_archive_encryption.js

@@ -0,0 +1,157 @@
+'use strict';
+
+/**
+ * Created by Tony on 2021/6/29.
+ */
+
+const BaseService = require('../base/base_service');
+
+module.exports = app => {
+
+    class RptArchiveEncryption extends BaseService {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'rpt_archive_encryption';
+            this.dataId = 'id';
+        }
+
+        async getArchiveEncryptionById(id) {
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('id', {
+                value: id,
+                operate: '=',
+            });
+            this.sqlBuilder.columns = ['id', 'prj_id', 'stage_id', 'content'];
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+            const list = await this.db.query(sql, sqlParam);
+            return list;
+        }
+
+        async getPrjStgArchiveEncryption(prjId, stgId) {
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('prj_id', {
+                value: prjId,
+                operate: '=',
+            });
+            this.sqlBuilder.setAndWhere('stage_id', {
+                value: stgId,
+                operate: '=',
+            });
+            this.sqlBuilder.columns = ['id', 'prj_id', 'stage_id', 'content'];
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+            const rstList = await this.db.query(sql, sqlParam);
+            return rstList;
+        }
+
+        async createArchiveEncryption(prj_id, stage_id, archiveArr) {
+            let rst = null;
+            this.transaction = await this.db.beginTransaction();
+            try {
+                const data = {
+                    prj_id,
+                    stage_id,
+                    content: JSON.stringify(archiveArr),
+                };
+                // console.log(data);
+                rst = await this.transaction.insert(this.tableName, data);
+                await this.transaction.commit();
+            } catch (ex) {
+                console.log(ex);
+                // 回滚
+                await this.transaction.rollback();
+            }
+            return rst;
+        }
+
+        async updateArchiveEncryption(id, prj_id, stage_id, archiveArr) {
+            let rst = null;
+            this.transaction = await this.db.beginTransaction();
+            try {
+                const data = {
+                    id,
+                    prj_id,
+                    stage_id,
+                    content: JSON.stringify(archiveArr),
+                };
+                // console.log(data);
+                rst = await this.transaction.update(this.tableName, data);
+                await this.transaction.commit();
+            } catch (ex) {
+                console.log(ex);
+                // 回滚
+                await this.transaction.rollback();
+            }
+            return rst;
+        }
+
+        // async addInitialStageData(tender_id, stage, preStage) {
+        //     // 在加stage的时候需要挂上这个,copy之前的签名人
+        //     const rst = [];
+        //     const preRoleRelList = await this.getRoleRptRelByTenderId(tender_id, preStage.id);
+        //     for (const rptRoleRel of preRoleRelList) {
+        //         const relList = JSON.parse(rptRoleRel.rel_content);
+        //         // const newRptRoleRel = {tender_id: tender_id, rpt_id: rptRoleRel.rpt_id, sid: stage.id, rel_content: ''};
+        //         const newRelList = [];
+        //         for (const role of relList) {
+        //             const newRole = {};
+        //             newRelList.push(newRole);
+        //             for (const key in role) {
+        //                 if (key !== 'sign_date') {
+        //                     newRole[key] = role[key];
+        //                 } else {
+        //                     newRole[key] = '';
+        //                 }
+        //             }
+        //         }
+        //         // rst.push(await this.createRoleRelationship(tender_id, rptRoleRel.rpt_id, stage.id, newRelList));
+        //         await this.createRoleRelationship(tender_id, rptRoleRel.rpt_id, stage.id, newRelList); // 暂时用不到,就先不返回结果
+        //     }
+        //     return rst;
+        // }
+
+        // async updateRoleRelationship(id, tender_id, rpt_id, sid, relArr) {
+        //     let rst = null;
+        //     if (id < 0) {
+        //         rst = await this.createRoleRelationship(tender_id, rpt_id, sid, relArr);
+        //     } else {
+        //         this.transaction = await this.db.beginTransaction();
+        //         try {
+        //             const data = { id, tender_id, rpt_id, sid, rel_content: JSON.stringify(relArr) };
+        //             rst = await this.transaction.update(this.tableName, data);
+        //             await this.transaction.commit();
+        //         } catch (ex) {
+        //             console.log(ex);
+        //             // 回滚
+        //             await this.transaction.rollback();
+        //         }
+        //     }
+        //     return rst;
+        // }
+        //
+        // async updateMultiRoleRelationship(orgParams, newRelArr) {
+        //     for (let idx = 0; idx < orgParams.length; idx++) {
+        //         const param = orgParams[idx];
+        //         const data = { tender_id: param[0], sid: param[1], rpt_id: param[2] };
+        //         this.transaction = await this.db.beginTransaction();
+        //         try {
+        //             await this.transaction.delete(this.tableName, data);
+        //             this.transaction.commit();
+        //             await this.createRoleRelationship(param[0], param[2], param[1], newRelArr);
+        //         } catch (ex) {
+        //             console.log(ex.toString());
+        //             // 回滚
+        //             await this.transaction.rollback();
+        //         }
+        //     }
+        //     return true;
+        // }
+    }
+    return RptArchiveEncryption;
+};

+ 8 - 6
app/service/rpt_stage_sum_memory.js

@@ -226,29 +226,31 @@ module.exports = app => {
 
                 const dealPay = await this.ctx.service.stagePay.getStagePays(stage);
                 await this._checkStagePayCalc(tender, stage, dealPay);
-                this.ctx.helper.assignRelaData(billsData, [
-                    {data: dealPay, fields: ['tp'], prefix: 's_' + stage.order + '_', relaId: 'pid'}
+                this.ctx.helper.assignRelaData(payData, [
+                    {data: dealPay, fields: ['tp'], prefix: 's_' + stage.order + '_', relaId: 'pid'},
+                    {data: dealPay, fields: ['name'], prefix:'', relaId: 'pid'},
                 ]);
             }
         }
 
         async getStageSumPay(tid, memFieldKeys, gsDefine, gsCustom) {
             if (!gsDefine || !gsDefine.enable) return [];
-            if (!gsCustom || !gsCustom.tenders || gsCustom.tenders.length === 0) return [];
+            if (!gsCustom || !gsCustom.stages || gsCustom.stages.length === 0) return [];
 
             await this.ctx.service.tender.checkTender(tid);
             const payData = await this.ctx.service.pay.getAllDataByCondition({
-                where: {tid: tid},
+                where: {tid: tid, valid: true},
                 order: [['order', 'ASC']],
             });
 
             const gsSetting = JSON.parse(gsDefine.setting);
             for (const s of gsCustom.stages) {
-                const stage = this.getSelectStage(gsSetting, s);
+                const stage = await this.db.get(this.ctx.service.stage.tableName, { tid: this.ctx.tender.id, order: s });
+                if (!stage) continue;
                 await this.ctx.service.stage.doCheckStage(stage);
                 await this._gatherStagePay(this.ctx.tender, stage, payData);
-
             }
+            return payData;
         }
     }
 

+ 1 - 1
app/service/schedule_ledger.js

@@ -53,7 +53,7 @@ module.exports = app => {
                     total_tp = this.ctx.helper.add(total_tp, u.tp);
                 }
                 if (updateOptions.length > 0) await transaction.updateRows(this.tableName, updateOptions);
-                // 判断是否已创建了形象进度表
+                // 判断是否已创建了投资进度表
                 const scheduleInfo = await this.ctx.service.schedule.getDataByCondition({ tid: this.ctx.tender.id });
                 if (!scheduleInfo) {
                     const newSchedule = {

+ 2 - 2
app/service/stage.js

@@ -479,7 +479,7 @@ module.exports = app => {
                         cb.value = sum.qc_tp;
                         break;
                     case 'ybbqwc':
-                        const sumGcl = await this.ctx.service.stageBills.getSumTotalPriceGcl(stage, '^[^0-9]*1[0-9]{2}-');
+                        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);
                         break;
                     default:
@@ -607,7 +607,7 @@ module.exports = app => {
                         cb.value = sum.qc_tp;
                         break;
                     case 'ybbqwc':
-                        const sumGcl = await this.ctx.service.stageBills.getSumTotalPriceGclByMaterial(stage_list, '^[^0-9]*1[0-9]{2}-');
+                        const sumGcl = await this.ctx.service.stageBills.getSumTotalPriceGclByMaterial(stage_list, '^[^0-9]*1[0-9]{2}(-|$)');
                         cb.value = this.ctx.helper.add(sumGcl.contract_tp, sumGcl.qc_tp);
                         break;
                     case 'bqyf':

+ 4 - 3
app/service/stage_audit.js

@@ -594,6 +594,7 @@ module.exports = app => {
                 await this.ctx.service.stagePay.copyAuditStagePays(this.ctx.stage, this.ctx.stage.times + 1, 0, transaction);
                 await this.ctx.service.stageJgcl.updateHistory(this.ctx.stage, transaction);
                 await this.ctx.service.stageBonus.updateHistory(this.ctx.stage, transaction);
+                await this.ctx.service.stageOther.updateHistory(this.ctx.stage, transaction);
 
                 // 添加短信通知-审批退回提醒功能
                 // const mobile_array = [];
@@ -882,9 +883,9 @@ module.exports = app => {
                 // 复制一份最新数据给下一人
                 await this.ctx.service.stagePay.copyAuditStagePays(this.ctx.stage, this.ctx.stage.times, audit.order + 1, transaction);
                 await this.ctx.service.stagePay.copyAuditStagePays(this.ctx.stage, this.ctx.stage.times, audit.order + 2, transaction);
-                await this.ctx.service.stageJgcl.updateHistory(this.ctx.stage, transaction);
-                await this.ctx.service.stageBonus.updateHistory(this.ctx.stage, transaction);
-                await this.ctx.service.stageOther.updateHistory(this.ctx.stage, transaction);
+                await this.ctx.service.stageJgcl.updateHistory4CheckAgain(this.ctx.stage, transaction);
+                await this.ctx.service.stageBonus.updateHistory4CheckAgain(this.ctx.stage, transaction);
+                await this.ctx.service.stageOther.updateHistory4CheckAgain(this.ctx.stage, transaction);
 
                 // 本期结束
                 // 生成截止本期数据 final数据

+ 21 - 0
app/service/stage_bonus.js

@@ -192,6 +192,27 @@ module.exports = app => {
             await transaction.updateRows(this.tableName, updateDatas);
         }
 
+        async updateHistory4CheckAgain(stage, transaction) {
+            const datas = await this.getStageData(stage.id);
+            if (datas.length === 0) return;
+
+            const updateDatas = [];
+            const times = this.ctx.stage.curTimes, order = this.ctx.stage.curOrder + 1;
+            for (const d of datas) {
+                const history = d.shistory && d.shistory !== '' ? JSON.parse(d.shistory) : [];
+                const his = history.find(function (x) {
+                    return x.stimes && x.stimes === times
+                        && x.sorder && x.sorder === order;
+                });
+                if (his) {
+                    his.tp = d.tp;
+                } else {
+                    history.push({ stimes: times, sorder: order, tp: d.tp });
+                }
+                updateDatas.push({ id: d.id, shistory: JSON.stringify(history) });
+            }
+            await transaction.updateRows(this.tableName, updateDatas);
+        }
 
         async deleteStageTimesData(sid, times, transaction) {
             const datas = await this.getAllDataByCondition({where: { sid: sid }});

+ 3 - 3
app/service/stage_change.js

@@ -309,7 +309,7 @@ module.exports = app => {
             }
 
             const sql = 'SELECT c.lid, c.pid, SUM(c.qty) as used_qty,' +
-                        '    cb.tid, cb.cid, cb.id, cb.code, cb.name, cb.unit, cb.unit_price, cb.detail, cb.samount' +
+                        '    cb.tid, cb.cid, cb.id, cb.code, cb.name, cb.unit, cb.unit_price, cb.detail, cb.samount, cb.bwmx, cb.detail' +
                         '  FROM ' + this.ctx.service.changeAuditList.tableName + ' As cb' +
                         '  LEFT JOIN ' + this.tableName + ' As c ON cb.id = c.cbid ' +
                         '  INNER JOIN (' +
@@ -359,11 +359,11 @@ module.exports = app => {
                         '    p.name As `p_name`, p.drawing_code As `p_drawing_code`, p.`quantity` As `p_qty`' +
                         '  FROM ' + this.tableName + ' As c ' +
                         '  INNER JOIN ( ' +
-                        '    SELECT MAX(`stimes` * ' + timesLen + ' + `sorder`) As `flow`, `lid`, `pid`, `cbid` From ' + this.tableName +
+                        '    SELECT MAX(`stimes` * ' + timesLen + ' + `sorder`) As `flow`, `lid`, `pid`, `cbid`, `sid` From ' + this.tableName +
                         '      WHERE sid = ? And cid = ?' +
                         '      GROUP By `lid`, `pid`, `cbid`' +
                         '  ) As m ' +
-                        '  ON (c.stimes * ' + timesLen + ' + c.sorder) = m.flow And c.lid = m.lid And c.pid = m.pid And c.cbid = m.cbid' +
+                        '  ON (c.stimes * ' + timesLen + ' + c.sorder) = m.flow And c.lid = m.lid And c.pid = m.pid And c.cbid = m.cbid And c.sid = m.sid' +
                         '  LEFT JOIN ' + this.ctx.service.ledger.tableName + ' As l ON c.lid = l.id' +
                         '  LEFT JOIN ' + this.ctx.service.pos.tableName + ' As p ON c.pid = p.id';
             const sqlParam = [sid, cid];

+ 35 - 4
app/service/stage_jgcl.js

@@ -223,6 +223,36 @@ module.exports = app => {
             await transaction.updateRows(this.tableName, updateDatas);
         }
 
+        async updateHistory4CheckAgain(stage, transaction) {
+            const datas = await this.getStageData(stage);
+            if (datas.length === 0) return;
+
+            const updateDatas = [];
+            const times = this.ctx.stage.curTimes, order = this.ctx.stage.curOrder + 1;
+            for (const d of datas) {
+                const history = d.shistory && d.shistory !== '' ? JSON.parse(d.shistory) : [];
+                const his = history.find(function (x) {
+                    return x.stimes && x.stimes === times
+                        && x.sorder && x.sorder === order;
+                });
+                if (his) {
+                    his.unit_price = d.unit_price;
+                    his.arrive_qty = d.arrive_qty;
+                    his.arrive_tp = d.arrive_tp;
+                    his.deduct_qty = d.deduct_qty;
+                    his.deduct_tp = d.deduct_tp;
+                } else {
+                    history.push({
+                        stimes: times, sorder: order, unit_price: d.unit_price,
+                        arrive_qty: d.arrive_qty, arrive_tp: d.arrive_tp,
+                        deduct_qty: d.deduct_qty, deduct_tp: d.deduct_tp
+                    });
+                }
+                updateDatas.push({ id: d.id, shistory: JSON.stringify(history) });
+            }
+            await transaction.updateRows(this.tableName, updateDatas);
+        }
+
         async addInitialStageData(stage, preStage, transaction) {
             if (!stage || !preStage) {
                 throw '标段数据有误';
@@ -258,14 +288,15 @@ module.exports = app => {
                 his.sort(function (x, y) {
                     return (x.stimes * 1000 + x.sorder) - (y.stimes * 1000 + y.sorder);
                 });
-                updateDatas.push({
+                const ud = {
                     id: d.id,
                     shistory: JSON.stringify(his),
                     arrive_qty: his.length > 0 ? his[his.length - 1].arrive_qty : null,
-                    arrive_tp: his.length > 0 ? his[his.length - 1].arrive_tp : null,
                     deduct_qty: his.length > 0 ? his[his.length - 1].deduct_qty : null,
-                    deduct_tp: his.length > 0 ? his[his.length - 1].deduct_tp : null,
-                });
+                    arrive_tp: his.length > 0 ? this.ctx.helper.mul(his[his.length - 1].arrive_qty, d.unit_price, this.ctx.tender.info.decimal.tp) : null,
+                    deduct_tp: his.length > 0 ? this.ctx.helper.mul(his[his.length - 1].deduct_qty, d.unit_price, this.ctx.tender.info.decimal.tp) : null,
+                };
+                updateDatas.push(ud);
             }
             await transaction.updateRows(this.tableName, updateDatas);
         }

+ 25 - 0
app/service/stage_other.js

@@ -189,6 +189,31 @@ module.exports = app => {
             await transaction.updateRows(this.tableName, updateDatas);
         }
 
+        async updateHistory4CheckAgain(stage, transaction) {
+            const datas = await this.getStageData(stage);
+            if (datas.length === 0) return;
+
+            const updateDatas = [];
+            const times = this.ctx.stage.curTimes, order = this.ctx.stage.curOrder + 1;
+            for (const d of datas) {
+                const history = d.shistory && d.shistory !== '' ? JSON.parse(d.shistory) : [];
+                const his = history.find(function (x) {
+                    return x.stimes && x.stimes === times
+                        && x.sorder && x.sorder === order;
+                });
+                if (his) {
+                    his.tp = d.tp;
+                    if (d.sid === d.add_sid) his.total_price = d.total_price;
+                } else {
+                    const nHis = { stimes: times, sorder: order, tp: d.tp };
+                    if (d.sid === d.add_sid) nHis.total_price = d.total_price;
+                    history.push(nHis);
+                }
+                updateDatas.push({ id: d.id, shistory: JSON.stringify(history) });
+            }
+            await transaction.updateRows(this.tableName, updateDatas);
+        }
+
         async addInitialStageData(stage, preStage, transaction) {
             if (!stage || !preStage) {
                 throw '标段数据有误';

+ 2 - 3
app/view/advance/detail.ejs

@@ -17,13 +17,12 @@
             <div class="sjs-height-0">
                 <div class="col-xl-8 mx-auto">
                     <h4 class="mt-3 text-center mb-3">第<%- advance.order %>期
-                        <%- advance.type === auditConst.type.start ? '开工' : '材料' %>预付款</h4>
+                        <%- typeColMap[advance.type].text %></h4>
                     <table class="table table-bordered">
                         <thead>
                             <tr>
                                 <th colspan="4" class="text-center">
-                                    <!-- 签约<%- advance.type === auditConst.type.start ? '开工' : '材料' %>预付款:<%- ctx.helper.formatMoney(advancePayTotal, ',', 2) %> -->
-                                    签约<%- advance.type === auditConst.type.start ? '开工' : '材料' %>预付款:<%- ctx.helper.formatMoney(advancePayTotal, ',', parseFloat(advancePayTotal).toString().split('.')[1] && parseFloat(advancePayTotal).toString().split('.')[1].length || 0) %>
+                                    <%- typeColMap[advance.type].text %>:<%- ctx.helper.formatMoney(advancePayTotal, ',', parseFloat(advancePayTotal).toString().split('.')[1] && parseFloat(advancePayTotal).toString().split('.')[1].length || 0) %>
                                 </th>
                             </tr>

+ 8 - 2
app/view/advance/index.ejs

@@ -5,16 +5,22 @@
             <div>
                 <div class="d-inline-block">
                     <div class="btn-group group-tab">
-                        <a class="btn btn-sm btn-light <%- type === 0 ? 'active' : '' %>" href="/tender/<%- ctx.tender.id %>/advance">
+                        <a class="btn btn-sm btn-light <%- type === 0 ? 'active' : '' %>" href="/tender/<%- ctx.tender.id %>/advance/start">
                             开工预付款<%- type === 0 && latestOrder ? `(第${latestOrder.order}期)` : '' %>
                         </a>
                         <a class="btn btn-sm btn-light <%- type === 1 ? 'active' : '' %>" href="/tender/<%- ctx.tender.id %>/advance/material">
                             材料预付款<%- type === 1 && latestOrder ? `(第${latestOrder.order}期)` : '' %>
                         </a>
+                        <a class="btn btn-sm btn-light <%- type === 2 ? 'active' : '' %>" href="/tender/<%- ctx.tender.id %>/advance/safe">
+                          安全生产费预付款<%- type === 2 && latestOrder ? `(第${latestOrder.order}期)` : '' %>
+                        </a>
+                        <a class="btn btn-sm btn-light <%- type === 3 ? 'active' : '' %>" href="/tender/<%- ctx.tender.id %>/advance/dust">
+                          扬尘污染费预付款<%- type === 3 && latestOrder ? `(第${latestOrder.order}期)` : '' %>
+                        </a>
                     </div>
                 </div>
                 <div class="d-inline-block ml-2">
-                    签约<%- type === 0 ? '开工' : '材料' %>预付款
+                    <%- typeColMap[type].text%>
                     <b><%- ctx.helper.formatMoney(advancePayTotal, ',', parseFloat(advancePayTotal).toString().split('.')[1] && parseFloat(advancePayTotal).toString().split('.')[1].length || 0) %></b> 元
                 </div>
                 <div class="d-inline-block ml-4" style="width:300px">

+ 2 - 2
app/view/advance/modal.ejs

@@ -6,8 +6,8 @@
                 <h5 class="modal-title">提示</h5>
             </div>
             <div class="modal-body">
-                <p>预付款金额未填写,无法使用「预付款」,请先填写预付款金额;</p>
-                <p>进入「标段概况」打开「合同参数」填写预付款金额。</p>
+                <p><%- typeColMap[type].text %>金额未填写,无法使用「<%- typeColMap[type].text %> 」,请先填写<%- typeColMap[type].text %>金额;</p>
+                <p>进入「标段概况」打开「合同参数」填写<%- typeColMap[type].text %>金额。</p>
             </div>
             <div class="modal-footer">
               <a href="/tender/<%- ctx.tender.id %>" class="btn btn-sm btn-primary">标段概况</a>

+ 1 - 1
app/view/change/information.ejs

@@ -433,7 +433,7 @@
         type: '<%- change.type %>',
         class: '<%- change.class %>',
         quality: '<%- change.quality %>',
-        company: '<%- change.company %>',
+        company: '<%- (change.company ? change.company : (companyList && companyList[0] ? companyList[0].name : '')) %>',
         charge: '<%- change.charge %>',
         w_code: '<%- change.w_code %>',
     };

+ 25 - 20
app/view/material/list.ejs

@@ -20,11 +20,11 @@
             </div>
         </div>
     </div>
-    <div class="content-wrap">
+    <div class="content-wrap pr-46">
         <div class="c-header p-0">
         </div>
         <div class="row w-100 sub-content">
-            <div id="main-view" class="c-body" style="width: 100%">
+            <div id="left-view" class="c-body" style="width: 70%">
                 <!--上部分-->
                 <div class="sjs-height-1" id="ledger-spread">
                 </div>
@@ -35,30 +35,34 @@
                             <li class="nav-item">
                                 <a class="nav-link active" data-toggle="tab" href="#xmujie" role="tab">清单明细</a>
                             </li>
-                            <li class="ml-auto">
-                                <% if (!material.readOnly) { %>
-                                <button class="btn btn-sm btn-primary" id="user_all_material">应用调差工料至其他清单明细</button>
-                                <% } %>
-                            </li>
+                            <!--<li class="ml-auto">-->
+                                <!--<% if (!material.readOnly) { %>-->
+                                <!--<button class="btn btn-sm btn-primary" id="user_all_material">应用调差工料至其他清单明细</button>-->
+                                <!--<% } %>-->
+                            <!--</li>-->
                         </ul>
                     </div>
-                    <div class="tab-content">
-                        <div class="tab-pane active" id="xmujie">
-                            <div class="row">
-                                <div class="col-8">
-                                    <div class="sp-wrap" id="leaf-xmj-spread">
-                                    </div>
-                                </div>
-                                <div class="col-4" id="material-spread-div" style="position: relative">
-                                    <div class="sp-wrap" id="material-spread">
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
+                    <div class="sp-wrap" id="leaf-xmj-spread">
+                    </div>
+                </div>
+            </div>
+            <div class="c-body" id="right-view" style="width: 30%;">
+                <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 class="tab-pane active" id="material-spread-div" style="position: relative">
+                        <div class="sjs-height-6" id="material-spread"></div>
                     </div>
                 </div>
             </div>
         </div>
+        <div class="side-menu">
+            <!--右侧菜单-->
+            <ul class="nav flex-column right-nav">
+                <li class="nav-item">
+                    <a class="nav-link active" content="#material-tab" href="javascript: void(0);">清单工料含量</a>
+                </li>
+            </ul>
+        </div>
     </div>
 </div>
 <script>
@@ -72,4 +76,5 @@
     const curPosData = JSON.parse(unescape('<%- escape(JSON.stringify(curPosData)) %>'));
     const readOnly = <%- material.readOnly %>;
     const stage_order = <%- material.order %>;
+    const materialID = <%- material.id %>;
 </script>

+ 34 - 1
app/view/report/index.ejs

@@ -65,7 +65,7 @@
                                     导出报表
                                 </div>
                             </div>
-                            <div class="panel" <% if (pageShow === null || parseInt(pageShow.showArchive) === 0 || isNaN(parseInt(pageShow.showArchive))) { %> style="display:none" <% } %>>
+                            <div class="panel" style="display:none" <% if (pageShow === null || parseInt(pageShow.showArchive) === 0 || isNaN(parseInt(pageShow.showArchive))) { %> style="display:none" <% } %>>
                                 <div class="panel-body">
                                     <div class="btn-group" role="group">
                                         <button id="btnArchiveRpt" type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#guidang" disabled><i class="fa fa-archive"></i> 归档报表</button>
@@ -591,4 +591,37 @@
             $(document.body).addClass('modal-open');
         });
     })
+
+    function getStdTxtWidthByFont(ctx) {
+        let rst = {'宋体': {'normal': {}, 'bold': {}, 'italic': {}}, 'SmartSimsun': null, 'Arial Narrow': {'normal': {}, 'bold': {}, 'italic': {}}}
+        const _createStdWidth = function(dftFontHeight, chkFontName) {
+            let dftOthers = '';
+            ctx.font = dftOthers + dftFontHeight + "px 宋体";
+            rst[chkFontName]['normal']['_' + dftFontHeight + '_ascii'] = ctx.measureText('_').width;
+            rst[chkFontName]['normal']['_' + dftFontHeight + '_chn'] = ctx.measureText('一').width;
+            dftOthers = 'bold';
+            ctx.font = dftOthers + dftFontHeight + "px 宋体";
+            rst[chkFontName][dftOthers]['_' + dftFontHeight + '_ascii'] = ctx.measureText('_').width;
+            rst[chkFontName][dftOthers]['_' + dftFontHeight + '_chn'] = ctx.measureText('一').width;
+            dftOthers = 'italic';
+            ctx.font = dftOthers + dftFontHeight + "px 宋体";
+            rst[chkFontName][dftOthers]['_' + dftFontHeight + '_ascii'] = ctx.measureText('_').width;
+            rst[chkFontName][dftOthers]['_' + dftFontHeight + '_chn'] = ctx.measureText('一').width;
+        }
+        try {
+            ctx.save();
+            for (let dftFontHeight = 6; dftFontHeight <= 66; dftFontHeight++) {
+                _createStdWidth(dftFontHeight, '宋体');
+                rst['SmartSimsun'] = rst['宋体'];
+                _createStdWidth(dftFontHeight, 'Arial Narrow');
+            }
+        } finally {
+            ctx.restore();
+            return rst;
+        }
+    }
+
+    //const STD_TXT_WIDTH = getStdTxtWidthByFont(document.getElementById("rptCanvas").getContext('2d')); //这个可以给后台用(if need it)
+
 </script>
+

+ 2 - 0
app/view/report/index_archive.ejs

@@ -148,6 +148,7 @@
     let current_stage_status = -1;
 
     let ARCHIVE_LIST = JSON.parse('<%- JSON.stringify(archiveList) %>');
+    let ARCHIVE_ENCRYPTION_LIST = JSON.parse('<%- JSON.stringify(archiveEncryptionList) %>');
     let TOP_TREE_NODES = <%- rpt_tpl_data %>;
 
     const CUST_TREE_NODES = <%- cust_tpl_data %>;
@@ -283,6 +284,7 @@
                 $.bootstrapLoading.end();
                 // console.log(result);
                 ARCHIVE_LIST = result.data;
+                ARCHIVE_ENCRYPTION_LIST = result.encryptionData;
                 TOP_TREE_NODES = JSON.parse(JSON.stringify(ORG_TOP_TREE_NODES));
                 rptArchiveObj.iniPage();
             }, function(err){

+ 2 - 1
app/view/report/rpt_all_popup.ejs

@@ -506,7 +506,7 @@
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
-                <a href="javascript: void(0);" class="btn btn-sm btn-primary" onclick="rptArchiveObj.archiveCurrentReport(zTreeOprObj.currentRptPageRst, zTreeOprObj.currentNode)">确定归档</a>
+                <a href="javascript: void(0);" class="btn btn-sm btn-primary" data-dismiss="modal" onclick="rptArchiveObj.archiveCurrentReport(zTreeOprObj.currentRptPageRst, zTreeOprObj.currentNode)">确定归档</a>
             </div>
         </div>
     </div>
@@ -961,4 +961,5 @@
             }
         }
     }
+
 </script>

+ 2 - 2
app/view/schedule/modal.ejs

@@ -15,7 +15,7 @@
             </div>
             <% } else { %>
             <div class="modal-body">
-                <h5>首次使用形象进度需要进行进度台帐初始化设置</h5>
+                <h5>首次使用投资进度需要进行进度台帐初始化设置</h5>
             </div>
             <div class="modal-footer">
                 <a href="/tender/<%- ctx.tender.id %>/schedule/ledger" class="btn btn-sm btn-primary">开始设置</a>
@@ -34,7 +34,7 @@
                     <h5 class="modal-title">提示</h5>
                 </div>
                 <div class="modal-body">
-                    <h5>台账正在进行修订,形象进度无法进行任何操作。</h5>
+                    <h5>台账正在进行修订,投资进度无法进行任何操作。</h5>
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">好的</button>

+ 11 - 1
app/view/setting/fun.ejs

@@ -11,6 +11,16 @@
                 <div class="row m-0 mt-3">
                     <div class="col-6">
                         <div class="form-group">
+                            <label>超计控制</label>
+                            <div>
+                                <div class="form-check form-check-inline">
+                                    <input class="form-check-input" type="checkbox" name="ban_over" <% if (funRela.banOver) { %>checked<% } %> onchange="updateSetting();">
+                                    <label class="form-check-label" for="inlineCheckbox6">超计时限制上报审批/审批通过</label>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="form-group">
                             <label>中间计量模式设置</label>
                             <div>
                                 <% for (const i in imType) { %>
@@ -36,6 +46,6 @@
         autoFlashHeight();
     });
     const updateSetting = function () {
-        postData('/setting/fun/update', {imType: parseInt($('[name=im_type]:checked').val())});
+        postData('/setting/fun/update', {imType: parseInt($('[name=im_type]:checked').val()), banOver: $('[name=ban_over]')[0].checked});
     }
 </script>

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

@@ -273,7 +273,10 @@
                                     <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>
-                                    <% if (!ctx.tender.isTourist && stage.filePermission) { %>
+                                    <!-- <% if (!ctx.tender.isTourist && stage.filePermission) { %>
+                                    <a href="#upload" data-toggle="modal" data-target="#upload"  class="btn btn-sm btn-outline-primary ml-3">上传</a>
+                                    <% } %> -->
+                                    <% if (!ctx.tender.isTourist) { %>
                                     <a href="#upload" data-toggle="modal" data-target="#upload"  class="btn btn-sm btn-outline-primary ml-3">上传</a>
                                     <% } %>
                                 </li>

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

@@ -15,6 +15,7 @@
                 </li>
             </ul>
         </div>
+        <% if (ctx.session.sessionProject.page_show !== null && parseInt(ctx.session.sessionProject.page_show.stageExtra) === 1) { %>
         <div class="nav-box">
             <ul class="nav-list list-unstyled">
                 <li class="<% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/stage/' + ctx.stage.order + '/extra/jgcl') { %>active<% } %>">
@@ -22,6 +23,7 @@
                 </li>
             </ul>
         </div>
+        <% } %>
         <div class="nav-box">
             <ul class="nav-list list-unstyled">
                 <li class="<% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/stage/' + ctx.stage.order + '/pay') { %>active<% } %>">

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

@@ -17,6 +17,7 @@
                 </li>
             </ul>
         </div>
+        <% if (ctx.session.sessionProject.page_show !== null && parseInt(ctx.session.sessionProject.page_show.stageExtra) === 1) { %>
         <div class="nav-box">
             <ul class="nav-list list-unstyled">
                 <li class="<% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/stage/' + ctx.stage.order + '/extra/jgcl') { %>active<% } %>">
@@ -24,6 +25,7 @@
                 </li>
             </ul>
         </div>
+        <% } %>
         <div class="nav-box">
             <ul class="nav-list list-unstyled">
                 <li class="<% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/stage/' + ctx.stage.order + '/pay') { %>active<% } %>">

+ 1 - 1
app/view/tender/detail.ejs

@@ -102,7 +102,7 @@
                                 <a href="#bd-set-7" data-toggle="modal" data-target="#bd-set-7" class="btn btn-sm btn-outline-primary">付款账号</a>
                                 <i class="mx-2">|</i>
                                 <% if (ctx.session.sessionProject.page_show !== null && parseInt(ctx.session.sessionProject.page_show.xxjd) === 1 && ctx.session.sessionUser.is_admin) { %>
-                                <a href="#xxjd-set" data-toggle="modal" data-target="#xxjd-set" class="btn btn-sm btn-outline-primary">形象进度</a>
+                                <a href="#xxjd-set" data-toggle="modal" data-target="#xxjd-set" class="btn btn-sm btn-outline-primary">投资进度</a>
                                 <% } %>
                                 <a href="javascript: void(0);" class="btn btn-sm btn-outline-primary" id="copyBtn">拷贝设置</a>
                                 <% if (ctx.session.sessionUser.is_admin) { %>

+ 142 - 19
app/view/tender/detail_modal.ejs

@@ -601,9 +601,31 @@
                 <h5 class="modal-title">合同参数</h5>
             </div>
             <div class="modal-body">
-                <div class="form-group">
-                    <!--默认显示-->
-                    <div class="form-group" id="param-spread" style="height: 230px; width: 465px;">
+                <ul class="nav nav-tabs nav-justified mb-2">
+                    <li class="nav-item">
+                        <a class="nav-link active" data-toggle="tab" href="#htcs" role="tab" aria-selected="true">合同参数</a>
+                    </li>
+                    <li class="nav-item">
+                        <a class="nav-link" data-toggle="tab" href="#bzqd" role="tab" aria-selected="false">100章清单</a>
+                    </li>
+                </ul>
+                <div class="tab-content">
+                    <div class="tab-pane active" id="htcs">
+                        <div class="modal-height-300" style="overflow-y: auto">
+                            <div class="form-group">
+                                <!--默认显示-->
+                                <div class="form-group" id="param-spread" style="height: 230px; width: 465px;">
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="tab-pane" id="bzqd">
+                        <div class="modal-height-300" style="overflow-y: auto">
+                            <div class="form-group">
+                                <div class="form-group" id="cap100-spread" style="height: 230px; width: 465px;">
+                                </div>
+                            </div>
+                        </div>
                     </div>
                 </div>
             </div>
@@ -623,9 +645,31 @@
                 <h5 class="modal-title">合同参数</h5>
             </div>
             <div class="modal-body">
-                <div class="form-group">
-                    <!--默认显示-->
-                    <div class="form-group" id="param-spread" style="height: 230px; width: 465px;">
+                <ul class="nav nav-tabs nav-justified mb-2">
+                    <li class="nav-item">
+                        <a class="nav-link active" data-toggle="tab" href="#htcs" role="tab" aria-selected="true">合同参数</a>
+                    </li>
+                    <li class="nav-item">
+                        <a class="nav-link" data-toggle="tab" href="#bzqd" role="tab" aria-selected="false">100章清单</a>
+                    </li>
+                </ul>
+                <div class="tab-content">
+                    <div class="tab-pane active" id="htcs">
+                        <div class="modal-height-300" style="overflow-y: auto">
+                            <div class="form-group">
+                                <!--默认显示-->
+                                <div class="form-group" id="param-spread" style="height: 230px; width: 465px;">
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="tab-pane" id="bzqd">
+                        <div class="modal-height-300" style="overflow-y: auto">
+                            <div class="form-group">
+                                <div class="form-group" id="cap100-spread" style="height: 230px; width: 465px;">
+                                </div>
+                            </div>
+                        </div>
                     </div>
                 </div>
             </div>
@@ -1220,11 +1264,11 @@
         SpreadJsObj.massOperationSheet(sheet, function () {
             sheet.defaults.rowHeight = 21;
             sheet.setColumnCount(2);
-            sheet.setRowCount(6);
+            sheet.setRowCount(5);
             sheet.setColumnWidth(0, 200);
             sheet.setColumnWidth(1, 200);
-            sheet.getRange(0, 0, 6, 1).vAlign(1).backColor('#e4e7ea').locked(true);
-            sheet.getRange(0, 1, 6, 1).vAlign(1).hAlign(2).locked(false);
+            sheet.getRange(0, 0, 5, 1).vAlign(1).backColor('#e4e7ea').locked(true);
+            sheet.getRange(0, 1, 5, 1).vAlign(1).hAlign(2).locked(false);
             sheet.setText(0, 0, '签约合同价');
             sheet.setText(1, 0, '暂列金额');
             sheet.setText(2, 0, '签约合同价(不含暂列金)');
@@ -1233,11 +1277,39 @@
             sheet.setText(5, 0, '安全生产费');
             sheet.getCell(2, 1).locked(true);
             const lineBorder = new spreadNS.LineBorder('#dee2e6', spreadNS.LineStyle.thin);
-            sheet.getRange(0, 0, 6, 2).setBorder(lineBorder, {all: true});
-            sheet.getRange(0, 0, 6, 2).formatter('@');
+            sheet.getRange(0, 0, 5, 2).setBorder(lineBorder, {all: true});
+            sheet.getRange(0, 0, 5, 2).formatter('@');
             sheet.setSelection(0, 1, 1, 1);
         });
 
+        const cap100spread = SpreadJsObj.createNewSpread($('#cap100-spread')[0]);
+        cap100spread.options.showVerticalScrollbar = false;
+        cap100spread.options.showHorizontalScrollbar = false;
+        const cap100sheet = cap100spread.getActiveSheet();
+        SpreadJsObj.protectedSheet(cap100sheet);
+        cap100sheet.setText(0, 0, '参数名', spreadNS.SheetArea.colHeader);
+        cap100sheet.setText(0, 1, '参数值', spreadNS.SheetArea.colHeader);
+        cap100sheet.setRowHeight(0, 32, spreadNS.SheetArea.colHeader);
+        cap100sheet.setDefaultStyle(vStyle, spreadNS.SheetArea.viewport);
+        cap100sheet.setDefaultStyle(xStyle, spreadNS.SheetArea.colHeader);
+        cap100sheet.setDefaultStyle(yStyle, spreadNS.SheetArea.rowHeader);
+
+        SpreadJsObj.massOperationSheet(cap100sheet, function () {
+            cap100sheet.defaults.rowHeight = 21;
+            cap100sheet.setColumnCount(2);
+            cap100sheet.setRowCount(2);
+            cap100sheet.setColumnWidth(0, 200);
+            cap100sheet.setColumnWidth(1, 200);
+            cap100sheet.getRange(0, 0, 2, 1).vAlign(1).backColor('#e4e7ea').locked(true);
+            cap100sheet.getRange(0, 1, 2, 1).vAlign(1).hAlign(2).locked(false);
+            cap100sheet.setText(0, 0, '安全生产费');
+            cap100sheet.setText(1, 0, '扬尘污染费');
+            const cap100lineBorder = new spreadNS.LineBorder('#dee2e6', spreadNS.LineStyle.thin);
+            cap100sheet.getRange(0, 0, 2, 2).setBorder(cap100lineBorder, {all: true});
+            cap100sheet.getRange(0, 0, 2, 2).formatter('@');
+            cap100sheet.setSelection(0, 1, 1, 1);
+        });
+
         function calcHtjMinusZlj() {
             const htj = _.toNumber(sheet.getText(0, 1));
             const zlj = _.toNumber(sheet.getText(1, 1));
@@ -1290,6 +1362,51 @@
             }
             calcHtjMinusZlj();
         });
+        cap100spread.bind(spreadNS.Events.EditEnded, function (e, info) {
+            const value = _.toNumber(info.editingText);
+            if (_.isNaN(value)) {
+                toastr.warning('请输入不超过万亿的数字');
+                info.sheet.setText(info.row, info.col, '0');
+            } else if (value > Math.pow(10, 13)) {
+                toastr.warning('请输入不超过万亿的数字');
+                info.sheet.setText(info.row, info.col, '0');
+            }
+            // if (info.row === 0 || info.row === 1) {
+            //     calcHtjMinusZlj();
+            // }
+        });
+        SpreadJsObj.addDeleteBind(cap100spread, function (sheet) {
+            const sel = sheet.getSelections()[0];
+            // let calc = false;
+            if (sel) {
+                for (let iRow = sel.row, iRowLength = sel.row + sel.rowCount; iRow < iRowLength; iRow++) {
+                    if (iRow === 2) continue;
+                    for (let iCol = sel.col, iColLength = sel.col + sel.colCount; iCol < iColLength; iCol++) {
+                        if (iCol !== 1) continue;
+                        sheet.setText(iRow, iCol, '0');
+                        // if (iRow === 0 || iRow === 1) calc = true;
+                    }
+                }
+            }
+            // if (calc) calcHtjMinusZlj();
+        });
+        cap100spread.bind(spreadNS.Events.ClipboardPasted, function (e, info) {
+            let bHint = false;
+            for (let iRow = 0; iRow < info.cellRange.rowCount; iRow++) {
+                const curRow = info.cellRange.row + iRow;
+                for (let iCol = 0; iCol < info.cellRange.colCount; iCol++) {
+                    const curCol = info.cellRange.col + iCol;
+                    const value = _.toNumber(info.sheet.getText(curRow, curCol));
+                    if (_.isNaN(value) || value > Math.pow(10, 13)) {
+                        bHint = true;
+                        info.sheet.setText(curRow, curCol, '0');
+                    }
+                }
+            }
+            if (bHint) {
+                toastr.warning('请输入不超过万亿的数字');
+            }
+        });
 
         function loadDealProperty() {
             sheet.setValue(0, 1, property.deal_param.contractPrice);
@@ -1297,7 +1414,9 @@
             sheet.setValue(2, 1, ZhCalc.sub(property.deal_param.contractPrice, property.deal_param.zanLiePrice));
             sheet.setValue(3, 1, property.deal_param.startAdvance);
             sheet.setValue(4, 1, property.deal_param.materialAdvance);
-            sheet.setValue(5, 1, property.deal_param.safeAdvance);
+            // sheet.setValue(5, 1, property.deal_param.safeAdvance);
+            cap100sheet.setValue(0, 1, property.deal_param.safeAdvance);
+            cap100sheet.setValue(1, 1, property.deal_param.dustAdvance);
 
         }
         function setReadOnly (readOnly) {
@@ -1305,7 +1424,9 @@
             sheet.getCell(1, 1).locked(readOnly);
             sheet.getCell(3, 1).locked(readOnly);
             sheet.getCell(4, 1).locked(readOnly);
-            sheet.getCell(5, 1).locked(readOnly);
+            // sheet.getCell(5, 1).locked(readOnly);
+            cap100sheet.getCell(0, 1).locked(readOnly);
+            cap100sheet.getCell(1, 1).locked(readOnly);
         }
         function getNewDealData () {
             const result = {};
@@ -1313,7 +1434,9 @@
             result.zanLiePrice = _.toNumber(sheet.getText(1, 1));
             result.startAdvance = _.toNumber(sheet.getText(3, 1));
             result.materialAdvance = _.toNumber(sheet.getText(4, 1));
-            result.safeAdvance = _.toNumber(sheet.getText(5, 1));
+            // result.safeAdvance = _.toNumber(sheet.getText(5, 1));
+            result.safeAdvance = _.toNumber(cap100sheet.getText(0, 1));
+            result.dustAdvance = _.toNumber(cap100sheet.getText(1, 1));
             return result;
         }
 
@@ -1648,7 +1771,7 @@
         });
     }
     $(function () {
-        // 形象进度
+        // 投资进度
         let timer2 = null;
         let oldSearchVal2 = null;
         $('body').on('input propertychange', '#tourist_dropdownMenu .gr-search', function (e) {
@@ -1772,15 +1895,15 @@
 </script>
 <% } %>
 <% if (ctx.session.sessionProject.page_show !== null && parseInt(ctx.session.sessionProject.page_show.xxjd) === 1 && ctx.session.sessionUser.is_admin) { %>
-<!--标段设置-形象进度-->
+<!--标段设置-投资进度-->
 <div class="modal fade" id="xxjd-set" data-backdrop="static">
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title">形象进度</h5>
+                <h5 class="modal-title">投资进度</h5>
             </div>
             <div class="modal-body">
-                <div class="alert alert-warning">设置可使用「形象进度」用户</div>
+                <div class="alert alert-warning">设置可使用「投资进度」用户</div>
                 <div class="dropdown">
                     <button class="btn btn-outline-primary btn-sm dropdown-toggle" type="button" id="xxjd_dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                         添加用户
@@ -1841,7 +1964,7 @@
 <script>
     $(function () {
         const scPermission = JSON.parse(unescape('<%- escape(JSON.stringify(scPermission)) %>'));
-        // 形象进度
+        // 投资进度
         let timer = null;
         let oldSearchVal = null;
         $('body').on('input propertychange', '#xxjd_dropdownMenu .gr-search', function(e) {

+ 2 - 2
app/view/tender/tender_sub_menu.ejs

@@ -11,7 +11,7 @@
         <div class="nav-box">
             <ul class="nav-list list-unstyled">
                 <% const curUrl = `/tender/${ctx.tender.id}/advance` %>
-                <li <% if (ctx.url.indexOf(curUrl) !== -1) { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/advance"><i class="fa fa-handshake-o"></i> <span>预付款</span></a></li>
+                <li <% if (ctx.url.indexOf(curUrl) !== -1) { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/advance/start"><i class="fa fa-handshake-o"></i> <span>预付款</span></a></li>
             </ul>
         </div>
         <div class="nav-box">
@@ -45,7 +45,7 @@
         </div>
         <% if (ctx.session.sessionProject.page_show !== null && parseInt(ctx.session.sessionProject.page_show.xxjd) === 1 && (ctx.tender.schedule_permission !== 0 || ctx.tender.isTourist)) { %>
         <div class="nav-box">
-            <h3><i class="fa fa-bar-chart "></i> 形象进度</h3>
+            <h3><i class="fa fa-bar-chart "></i> 投资进度</h3>
             <ul class="nav-list list-unstyled sub-list">
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule' || ctx.url === '/tender/' + ctx.tender.id + '/schedule/ledger') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule"><span>进度概况</span></a></li>
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule/plan') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule/plan"><span>计划进度</span></a></li>

+ 1 - 1
app/view/tender/tender_sub_mini_menu.ejs

@@ -49,7 +49,7 @@
         </div>
         <% if (ctx.session.sessionProject.page_show !== null && parseInt(ctx.session.sessionProject.page_show.xxjd) === 1 && (ctx.tender.schedule_permission !== 0|| ctx.tender.isTourist)) { %>
         <div class="nav-box">
-            <h3><i class="fa fa-bar-chart "></i> 形象进度</h3>
+            <h3><i class="fa fa-bar-chart "></i> 投资进度</h3>
             <ul class="nav-list list-unstyled sub-list">
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule' || ctx.url === '/tender/' + ctx.tender.id + '/schedule/ledger') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule"><span>进度概况</span></a></li>
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/schedule/plan') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/schedule/plan"><span>计划进度</span></a></li>

+ 125 - 58
builder_report_index_define.js

@@ -233,6 +233,9 @@ const change_bills = {
         { name: '单位工程', field: 'xmj_dwgc', type: dataType.str },
         { name: '分部工程', field: 'xmj_fbgc', type: dataType.str },
         { name: '分项工程', field: 'xmj_fxgc', type: dataType.str },
+        { name: '(空) 截止本期-已变更', field: 'used_qty', type: dataType.currency },
+        { name: '(空) 变更令-本期使用', field: 'is_used_bgl', type: dataType.int },
+        { name: '(空) 变更清单-本期使用', field: 'is_used', type: dataType.int },
     ],
 };
 // 期 - 清单
@@ -1412,61 +1415,6 @@ const sign_select = {
     ],
 };
 
-const stage_change_bills = {
-    name: '期-变更清单 调用明细(mem_stage_change_bills)',
-    remark: '',
-    key: 'mem_stage_change_bills',
-    id: 48,
-    prefix: '期-变更清单 调用明细',
-    cols: [
-        { name: '变更令id', field: 'cid', type: dataType.str },
-        { name: '变更清单id', field: 'cbid', type: dataType.int },
-        { name: '变更数量', field: 'qty', type: dataType.int },
-        { name: '变更令-批复编号', field: 'c_code', type: dataType.str },
-        { name: '变更令-变更名称', field: 'c_name', type: dataType.str },
-        { name: '变更令-变更图号', field: 'c_new_code', type: dataType.str },
-        { name: '变更令-变更设计图名称', field: 'c_new_name', type: dataType.str },
-        { name: '变更令-工程变更理由及内容', field: 'c_content', type: dataType.str },
-        { name: '变更令-工程变更合同依据', field: 'c_basis', type: dataType.str },
-        { name: '变更令-变更状态发生时间', field: 'c_cin_time', type: dataType.str },
-        { name: '变更清单-清单编号', field: 'b_code', type: dataType.str },
-        { name: '变更清单-名称', field: 'name', type: dataType.str },
-        { name: '变更清单-单位', field: 'unit', type: dataType.str },
-        { name: '变更清单-单价', field: 'unit_price', type: dataType.str },
-        { name: '变更令-变更类型', field: 'c_type', type: dataType.str },
-        { name: '变更令-变更类别', field: 'c_class', type: dataType.int },
-        { name: '变更令-变更性质', field: 'c_quality', type: dataType.int },
-        { name: '调用期-序号', field: 's_order', type: dataType.int },
-    ],
-};
-
-const stage_change_ledger = {
-    name: '期-变更台账(mem_stage_change_ledger)',
-    remark: '',
-    key: 'mem_stage_change_ledger',
-    id: 49,
-    prefix: '期-变更台账',
-    cols: [
-        { name: '项目节编号', field: 'code', type: dataType.str },
-        { name: '名称', field: 'name', type: dataType.str },
-        { name: '台账-金额', field: 'total_price', type: dataType.currency },
-        { name: '签约-金额', field: 'deal_tp', type: dataType.currency },
-        { name: '本期-合同-金额', field: 'contract_tp', type: dataType.currency },
-        { name: '本期-变更-金额', field: 'qc_tp', type: dataType.currency },
-        { name: '本期-完成-金额', field: 'gather_tp', type: dataType.currency },
-        { name: '截止本期-合同-金额', field: 'end_contract_tp', type: dataType.currency },
-        { name: '截止本期-变更-金额', field: 'end_qc_tp', type: dataType.currency },
-        { name: '截止本期-完成-金额', field: 'end_gather_tp', type: dataType.currency },
-        { name: '变更令-批复编号', field: 'c_code', type: dataType.str },
-        { name: '变更令-变更名称', field: 'c_name', type: dataType.str },
-        { name: '变更令-变更图号', field: 'c_new_code', type: dataType.str },
-        { name: '变更令-变更设计图名称', field: 'c_new_name', type: dataType.str },
-        { name: '变更令-工程变更理由及内容', field: 'c_content', type: dataType.str },
-        { name: '变更令-工程变更合同依据', field: 'c_basis', type: dataType.str },
-        { name: '变更令-变更状态发生时间', field: 'c_cin_time', type: dataType.str },
-    ],
-};
-
 const gcl_gather_bills = {
     name: '工程量清单汇总2专用 - 工程量清单',
     remark: '',
@@ -1511,7 +1459,6 @@ const gcl_gather_bills = {
         { name: '备用6-金额', field: 'spec6_tp', type: dataType.currency },
     ],
 };
-
 const gcl_gather_xmj = {
     name: '工程量清单汇总2专用 - 相关项目节',
     remark: '',
@@ -1562,7 +1509,6 @@ const ledger_tag = {
         { name: '最后编辑时间', field: 'modify_time', type: dataType.time },
     ],
 };
-
 const stage_tag = {
     name: '期 - 台账书签(仅显示当前登录用户可见书签)',
     remark: '',
@@ -1580,7 +1526,6 @@ const stage_tag = {
         { name: '最后编辑时间', field: 'modify_time', type: dataType.time },
     ],
 };
-
 const all_tag = {
     name: '全部书签(台账&全部期&所有人)',
     remark: '',
@@ -1600,6 +1545,60 @@ const all_tag = {
         { name: '最后编辑时间', field: 'modify_time', type: dataType.time },
     ],
 };
+
+const stage_change_bills = {
+    name: '期-变更清单 调用明细(mem_stage_change_bills)',
+    remark: '',
+    key: 'mem_stage_change_bills',
+    id: 48,
+    prefix: '期-变更清单 调用明细',
+    cols: [
+        { name: '变更令id', field: 'cid', type: dataType.str },
+        { name: '变更清单id', field: 'cbid', type: dataType.int },
+        { name: '变更数量', field: 'qty', type: dataType.int },
+        { name: '变更令-批复编号', field: 'c_code', type: dataType.str },
+        { name: '变更令-变更名称', field: 'c_name', type: dataType.str },
+        { name: '变更令-变更图号', field: 'c_new_code', type: dataType.str },
+        { name: '变更令-变更设计图名称', field: 'c_new_name', type: dataType.str },
+        { name: '变更令-工程变更理由及内容', field: 'c_content', type: dataType.str },
+        { name: '变更令-工程变更合同依据', field: 'c_basis', type: dataType.str },
+        { name: '变更令-变更状态发生时间', field: 'c_cin_time', type: dataType.str },
+        { name: '变更清单-清单编号', field: 'b_code', type: dataType.str },
+        { name: '变更清单-名称', field: 'name', type: dataType.str },
+        { name: '变更清单-单位', field: 'unit', type: dataType.str },
+        { name: '变更清单-单价', field: 'unit_price', type: dataType.str },
+        { name: '变更令-变更类型', field: 'c_type', type: dataType.str },
+        { name: '变更令-变更类别', field: 'c_class', type: dataType.int },
+        { name: '变更令-变更性质', field: 'c_quality', type: dataType.int },
+        { name: '调用期-序号', field: 's_order', type: dataType.int },
+    ],
+};
+const stage_change_ledger = {
+    name: '期-变更台账(mem_stage_change_ledger)',
+    remark: '',
+    key: 'mem_stage_change_ledger',
+    id: 49,
+    prefix: '期-变更台账',
+    cols: [
+        { name: '项目节编号', field: 'code', type: dataType.str },
+        { name: '名称', field: 'name', type: dataType.str },
+        { name: '台账-金额', field: 'total_price', type: dataType.currency },
+        { name: '签约-金额', field: 'deal_tp', type: dataType.currency },
+        { name: '本期-合同-金额', field: 'contract_tp', type: dataType.currency },
+        { name: '本期-变更-金额', field: 'qc_tp', type: dataType.currency },
+        { name: '本期-完成-金额', field: 'gather_tp', type: dataType.currency },
+        { name: '截止本期-合同-金额', field: 'end_contract_tp', type: dataType.currency },
+        { name: '截止本期-变更-金额', field: 'end_qc_tp', type: dataType.currency },
+        { name: '截止本期-完成-金额', field: 'end_gather_tp', type: dataType.currency },
+        { name: '变更令-批复编号', field: 'c_code', type: dataType.str },
+        { name: '变更令-变更名称', field: 'c_name', type: dataType.str },
+        { name: '变更令-变更图号', field: 'c_new_code', type: dataType.str },
+        { name: '变更令-变更设计图名称', field: 'c_new_name', type: dataType.str },
+        { name: '变更令-工程变更理由及内容', field: 'c_content', type: dataType.str },
+        { name: '变更令-工程变更合同依据', field: 'c_basis', type: dataType.str },
+        { name: '变更令-变更状态发生时间', field: 'c_cin_time', type: dataType.str },
+    ],
+};
 const stage_change = {
     name: '本期-变更清单-全审批人 调用明细(mem_stage_change)',
     remark: '',
@@ -1620,6 +1619,73 @@ const stage_change = {
     ],
 };
 
+const stage_change_info = {
+    name: '变更概况(mem_change_info)',
+    remark: '',
+    id: 65,
+    key: 'mem_change_info',
+    prefix: '变更概况',
+    cols: [
+        { name: '变更令id', field: 'cid', type: dataType.str },
+        { name: '变更令号', field: 'code', type: dataType.str },
+        { name: '批复文号', field: 'w_code', type: dataType.str },
+        { name: '批复编号', field: 'p_code', type: dataType.str },
+        { name: '变更名称', field: 'name', type: dataType.str },
+        { name: '桩号', field: 'peg', type: dataType.str },
+        { name: '原设计图名称', field: 'org_name', type: dataType.str },
+        { name: '原图号', field: 'org_code', type: dataType.str },
+        { name: '变更设计图名称', field: 'new_name', type: dataType.str },
+        { name: '变更图号', field: 'new_code', type: dataType.str },
+        { name: '工程变更理由及内容', field: 'content', type: dataType.str },
+        { name: '工程变更合同依据', field: 'basis', type: dataType.str },
+        { name: '变更工程量数量计算式', field: 'expr', type: dataType.str },
+        { name: '备注', field: 'memo', type: dataType.str },
+        { name: '变更类型', field: 'type', type: dataType.str },
+        { name: '变更类别', field: 'class', type: dataType.int },
+        { name: '变更性质', field: 'quality', type: dataType.int },
+        { name: '变更提出单位', field: 'company', type: dataType.str },
+        { name: '费用承担方', field: 'charge', type: dataType.int },
+        { name: '金额', field: 'total_price', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '变更状态发生时间(时间戳)', field: 'cin_time', type: dataType.str },
+        { name: '完成审批时间(时间戳)', field: 'sin_time', type: dataType.str },
+        { name: '金额_1', field: 'tp_1', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_2', field: 'tp_2', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_3', field: 'tp_3', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_4', field: 'tp_4', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_5', field: 'tp_5', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_6', field: 'tp_6', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_7', field: 'tp_7', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_8', field: 'tp_8', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_9', field: 'tp_9', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '附件名称列表', field: 'attNames', type: dataType.currency },
+        { name: '截止本期-已执行(%)', field: 'used_ratio', type: dataType.currency },
+        { name: '本期使用', field: 'cur_used', type: dataType.int },
+    ],
+};
+const stage_change_info_bills = {
+    name: '变更概况-清单(mem_change_info_bills)',
+    remark: '',
+    id: 66,
+    key: 'mem_change_info_bills',
+    prefix: '变更概况-清单',
+    cols: [
+        { name: '变更令id', field: 'cid', type: dataType.str },
+        { name: '签约清单id或台账id', field: 'lid', type: dataType.str },
+        { name: '清单编号', field: 'code', type: dataType.str },
+        { name: '名称', field: 'name', type: dataType.str },
+        { name: '单位', field: 'unit', type: dataType.str },
+        { name: '单价', field: 'unit_price', type: dataType.currency, tag: { type: 'up' } },
+        { name: '变更详情', field: 'detail', type: dataType.str },
+        { name: '变更部位', field: 'bwmx', type: dataType.str },
+        { name: '数量', field: 'qty', type: dataType.currency },
+        { name: '金额', field: 'tp', type: dataType.currency },
+        { name: '截止本期-已变更', field: 'used_qty', type: dataType.currency },
+        { name: '可执行', field: 'valid_qty', type: dataType.currency },
+        { name: '本期使用数量', field: 'cur_qty', type: dataType.currency },
+        { name: '本期使用', field: 'cur_used', type: dataType.int },
+    ],
+};
+
 // 定制表
 // 季华项目 中间计量报表--变更相关 汇总对比表
 const jh_im_change = {
@@ -1904,6 +1970,7 @@ const defines = [
     ledger_tag, stage_tag, all_tag,
     jh_im_change, jh_gather_im_change, jh_gather_stage_bills_compare,
     custom_select,
+    stage_change_info, stage_change_info_bills,
 ];
 for (const d of defines) {
     exportTableDefine(d);

+ 1 - 0
config/web.js

@@ -561,6 +561,7 @@ const JsFiles = {
                     '/public/js/path_tree.js',
                     '/public/js/gcl_gather.js',
                     '/public/js/material_list.js',
+                    '/public/js/shares/cs_tools.js',
                     '/public/js/material_audit.js',
                 ],
                 mergeFile: 'material_list',

+ 11 - 405
sql/update.sql

@@ -1,408 +1,11 @@
-ALTER TABLE `zh_ledger_cooperation` ADD `company` VARCHAR(100) NULL DEFAULT '' COMMENT '单位或备注名,筛选用' AFTER `sign_path`;
-
---
---
-
-CREATE TABLE `zh_cooperation_confirm` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `tid` int(11) NOT NULL COMMENT '标段id',
-  `sid` int(11) NOT NULL COMMENT '期id',
-  `times` tinyint(11) NOT NULL COMMENT '次数',
-  `ledger_id` int(11) NOT NULL COMMENT '台账id',
-  `uid` int(11) NOT NULL COMMENT '审批人id',
-  `create_time` datetime DEFAULT NULL COMMENT '确认时间',
-  PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='多人协同确认表';
-
-
-ALTER TABLE `zh_advance_audit`
-CHANGE COLUMN `type` `type` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '预付款类型,0为开工预付款,1为材料预付款,2为安全生产费预付款' ;
-
-ALTER TABLE `zh_advance_pay`
-CHANGE COLUMN `type` `type` INT(1) NOT NULL DEFAULT '0' COMMENT '预付款类型,0为开工预付款,1为材料预付款,2位安全生产费预付款' ;
-
-ALTER TABLE `zh_tender`
-ADD COLUMN `s2b_gxby_check`  tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '工序报验-检查计量' AFTER `copy_id`,
-ADD COLUMN `s2b_gxby_limit`  tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '限制上报' AFTER `s2b_gxby_check`,
-ADD COLUMN `s2b_dagl_check`  tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '档案管理-检查计量' AFTER `s2b_gxby_limit`,
-ADD COLUMN `s2b_dagl_limit`  tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '档案管理-限制上报' AFTER `s2b_dagl_check`;
-
-ALTER TABLE `zh_pos_0`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_1`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_2`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_3`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_4`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_5`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_6`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_7`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_8`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_9`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_10`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_11`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_12`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_13`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_14`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_15`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_16`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_17`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_18`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_pos_19`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_0`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_1`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_2`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_3`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_4`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_5`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_6`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_7`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_8`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_9`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_10`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_11`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_12`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_13`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_14`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_15`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_16`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_17`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_18`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_pos_19`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_ledger_0`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_ledger_1`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_ledger_2`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_ledger_3`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_ledger_4`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_ledger_5`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_ledger_6`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_ledger_7`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_ledger_8`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_ledger_9`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_bills_0`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_bills_1`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_bills_2`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_bills_3`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_bills_4`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_bills_5`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_bills_6`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_bills_7`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_bills_8`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
-ALTER TABLE `zh_revise_bills_9`
-ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
-ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
-ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
-ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
-
---更新归档结构
-ALTER TABLE `calculation`.`zh_rpt_archive`
-CHANGE COLUMN `archive_id` `id` INT(11) NOT NULL AUTO_INCREMENT ;
-
---
---
-
-CREATE TABLE `zh_tender_tourist` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `tid` int(11) NOT NULL COMMENT '标段id',
-  `user_id` int(11) NOT NULL COMMENT '用户id',
-  `in_time` datetime DEFAULT NULL COMMENT '添加时间',
-  PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='标段游客表';
-
-ALTER TABLE `zh_change` ADD `is_revise` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否是修订状态' AFTER `tp_decimal`;
+CREATE TABLE `calculation`.`zh_rpt_archive_encryption` (
+  `id` INT NOT NULL AUTO_INCREMENT,
+  `prj_id` INT NULL,
+  `stage_id` INT NULL,
+  `content` JSON NULL,
+  PRIMARY KEY (`id`),
+  INDEX `PRJ_STG` (`prj_id` ASC, `stage_id` ASC))
+COMMENT = '归档文档的需要加密签名的坐标及其他key信息(如签名角色id,签名角色名称等)';
+
+ALTER TABLE `zh_material_list` ADD `expr` VARCHAR(500) NULL DEFAULT '' COMMENT '公式' AFTER `quantity`;
+

+ 408 - 0
sql/update20210615.sql

@@ -0,0 +1,408 @@
+ALTER TABLE `zh_ledger_cooperation` ADD `company` VARCHAR(100) NULL DEFAULT '' COMMENT '单位或备注名,筛选用' AFTER `sign_path`;
+
+--
+-- 表的结构 `zh_cooperation_confirm`
+--
+
+CREATE TABLE `zh_cooperation_confirm` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `tid` int(11) NOT NULL COMMENT '标段id',
+  `sid` int(11) NOT NULL COMMENT '期id',
+  `times` tinyint(11) NOT NULL COMMENT '次数',
+  `ledger_id` int(11) NOT NULL COMMENT '台账id',
+  `uid` int(11) NOT NULL COMMENT '审批人id',
+  `create_time` datetime DEFAULT NULL COMMENT '确认时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='多人协同确认表';
+
+
+ALTER TABLE `zh_advance_audit`
+CHANGE COLUMN `type` `type` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '预付款类型,0为开工预付款,1为材料预付款,2为安全生产费预付款' ;
+
+ALTER TABLE `zh_advance_pay`
+CHANGE COLUMN `type` `type` INT(1) NOT NULL DEFAULT '0' COMMENT '预付款类型,0为开工预付款,1为材料预付款,2位安全生产费预付款' ;
+
+-- 接口相关
+ALTER TABLE `zh_tender`
+ADD COLUMN `s2b_gxby_check`  tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '工序报验-检查计量' AFTER `copy_id`,
+ADD COLUMN `s2b_gxby_limit`  tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '限制上报' AFTER `s2b_gxby_check`,
+ADD COLUMN `s2b_dagl_check`  tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '档案管理-检查计量' AFTER `s2b_gxby_limit`,
+ADD COLUMN `s2b_dagl_limit`  tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '档案管理-限制上报' AFTER `s2b_dagl_check`;
+
+ALTER TABLE `zh_pos_0`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_1`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_2`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_3`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_4`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_5`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_6`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_7`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_8`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_9`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_10`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_11`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_12`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_13`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_14`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_15`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_16`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_17`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_18`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_pos_19`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_0`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_1`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_2`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_3`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_4`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_5`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_6`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_7`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_8`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_9`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_10`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_11`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_12`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_13`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_14`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_15`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_16`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_17`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_18`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_pos_19`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_ledger_0`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_ledger_1`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_ledger_2`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_ledger_3`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_ledger_4`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_ledger_5`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_ledger_6`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_ledger_7`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_ledger_8`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_ledger_9`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_bills_0`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_bills_1`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_bills_2`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_bills_3`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_bills_4`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_bills_5`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_bills_6`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_bills_7`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_bills_8`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+ALTER TABLE `zh_revise_bills_9`
+ADD COLUMN `gxby_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `gxby_status`,
+ADD COLUMN `gxby_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `gxby_limit`,
+ADD COLUMN `dagl_limit`  int(4) NOT NULL DEFAULT -1 COMMENT '计量是否受限,-1不受限,0受限不可计量,1受限可计量' AFTER `dagl_status`,
+ADD COLUMN `dagl_ratio`  decimal(6,4) NOT NULL DEFAULT 0 COMMENT '允许计量比例,-1表示不限制' AFTER `dagl_limit`;
+
+--更新归档结构
+ALTER TABLE `calculation`.`zh_rpt_archive`
+CHANGE COLUMN `archive_id` `id` INT(11) NOT NULL AUTO_INCREMENT ;
+
+--
+-- 表的结构 `zh_tender_tourist`
+--
+
+CREATE TABLE `zh_tender_tourist` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `tid` int(11) NOT NULL COMMENT '标段id',
+  `user_id` int(11) NOT NULL COMMENT '用户id',
+  `in_time` datetime DEFAULT NULL COMMENT '添加时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='标段游客表';
+
+ALTER TABLE `zh_change` ADD `is_revise` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否是修订状态' AFTER `tp_decimal`;