Forráskód Böngészése

Merge branch 'master' of http://192.168.1.41:3000/SmartCost/ConstructionOperation

zhangweicheng 1 hónapja
szülő
commit
80ee15ad16

+ 19 - 22
modules/all_models/stdGlj_glj.js

@@ -2,24 +2,23 @@
  * Created by Zhong on 2018/3/22.
  */
 /*标准工料机*/
-const mongoose = require("mongoose");
+const mongoose = require('mongoose');
 const Schema = mongoose.Schema;
 //标准工料机的组成物只来自标准工料机
 const std_gljComponent = new Schema(
-  {
-    ID: Number,
-    consumeAmt: Number,
-    consumeAmtProperty: {
-      type: Schema.Types.Mixed,
-      default: {},
+    {
+        ID: Number,
+        consumeAmt: Number,
+        consumeAmtProperty: {
+            type: Schema.Types.Mixed,
+            default: {}
+        }
     },
-  },
-  { _id: false },
-  { versionKey: false }
+    { _id: false },
+    { versionKey: false }
 );
 
-const std_glj = new Schema(
-  {
+const std_glj = new Schema({
     deleted: Boolean,
     repositoryId: Number,
     ID: Number,
@@ -28,11 +27,10 @@ const std_glj = new Schema(
     specs: String,
     basePrice: Number,
     priceProperty: {
-      type: Schema.Types.Mixed,
-      default: {},
+        type: Schema.Types.Mixed,
+        default: {}
     },
     gljClass: Number,
-    classSeq: Number,
     gljType: Number,
     shortName: String,
     unit: String,
@@ -43,12 +41,11 @@ const std_glj = new Schema(
     materialCoe: Number, //三材系数
     model: Number, //机型
     //经济指标数据
-    materialIndexType: String, //工料指标类别
-    materialIndexUnit: String, //工料指标单位
-    materialIndexCoe: Number, //单位转换系数
+    materialIndexType: String,//工料指标类别
+    materialIndexUnit: String,//工料指标单位
+    materialIndexCoe: Number,//单位转换系数
     lossRate: Number, // 损耗率
-  },
-  { versionKey: false }
-);
 
-mongoose.model("std_glj_lib_gljList", std_glj, "std_glj_lib_gljList");
+}, { versionKey: false });
+
+mongoose.model('std_glj_lib_gljList', std_glj, 'std_glj_lib_gljList');

+ 5 - 9
modules/all_models/stdGlj_gljClass.js

@@ -2,19 +2,15 @@
  * Created by Zhong on 2018/3/22.
  */
 /*标准工料机分类树*/
-const mongoose = require("mongoose");
+const mongoose = require('mongoose');
 const Schema = mongoose.Schema;
-const std_gljClass = new Schema(
-  {
+const std_gljClass = new Schema({
     repositoryId: Number,
     ID: Number,
     ParentID: Number,
     NextSiblingID: Number,
     Name: String,
-    deleted: Boolean,
-    classSeq: Number,
-  },
-  { versionKey: false }
-);
+    deleted: Boolean
+}, {versionKey: false});
 
-mongoose.model("std_glj_lib_gljClass", std_gljClass, "std_glj_lib_gljClass");
+mongoose.model('std_glj_lib_gljClass', std_gljClass, 'std_glj_lib_gljClass');

+ 24 - 17
modules/all_models/tpl_tree_node.js

@@ -19,27 +19,34 @@ let Schema = mongoose.Schema;
 // });
 
 let TplNodeSchema = new Schema({
-    nodeType: Number,   //节点类型:树节点(枝) 或 模板节点(叶), 统一结构
-    ID: Number,         //template节点ID,只有在nodeType是模板节点有效
-    refId: Number,      //引用报表模板id (引用 collection: rpt_templates)
-    name: String,       //显示名称
-    released: Boolean,  //是否已发布
-    items: []           //子节点
+  nodeType: Number, //节点类型:树节点(枝) 或 模板节点(叶), 统一结构
+  ID: Number, //template节点ID,只有在nodeType是模板节点有效
+  refId: Number, //引用报表模板id (引用 collection: rpt_templates)
+  name: String, //显示名称
+  released: Boolean, //是否已发布
+  items: [], //子节点
 });
 
 let RptTplTreeSchema = new Schema({
-    compilationId: String,      //编办的ObjectId
-    // engineerId: Number,         //工程专业Id(参考 /modules/common/const/engineering.js)
-    userId: String,             //用户名的object_id串
-    properties: [],             //这是一个预留的属性,假定未来还会有不同的划分细节(如:招标/投标/清单 ... etc)
-    name: String,               //显示名称
-    released: Boolean,          //是否已发布
-    isDeleted: Boolean,         //删除标记
-    flags: Schema.Types.Mixed,  //额外标记集合(这些标记可能会影响到前端显示,如‘计税方式’等)
-    items: []                   //TplNodeSchema entity
+  compilationId: String, //编办的ObjectId
+  // engineerId: Number,         //工程专业Id(参考 /modules/common/const/engineering.js)
+  userId: String, //用户名的object_id串
+  properties: [], //这是一个预留的属性,假定未来还会有不同的划分细节(如:招标/投标/清单 ... etc)
+  name: String, //显示名称
+  released: Boolean, //是否已发布
+  isDeleted: Boolean, //删除标记
+  flags: Schema.Types.Mixed, //额外标记集合(这些标记可能会影响到前端显示,如‘计税方式’等)
+  items: [], //TplNodeSchema entity
+  UUID: String,
 });
-RptTplTreeSchema.statics.findAndModify = function (query, sort, doc, options, callback) {
-    return this.collection.findAndModify(query, sort, doc, options, callback);
+RptTplTreeSchema.statics.findAndModify = function (
+  query,
+  sort,
+  doc,
+  options,
+  callback
+) {
+  return this.collection.findAndModify(query, sort, doc, options, callback);
 };
 
 mongoose.model("rpt_tpl_tree", RptTplTreeSchema, "rpt_tpl_tree");

+ 3 - 3
modules/bills_lib/models/bills_lib_interfaces.js

@@ -12,7 +12,7 @@ let moment = require("moment");
 let billsGuidanceLib = mongoose.model("std_billsGuidance_lib");
 const engLibModel = mongoose.model("engineering_lib");
 let uuid = require("uuid");
-let billsLibDao = function () { };
+let billsLibDao = function () {};
 
 billsLibDao.prototype.copyLib = async function (
   userName,
@@ -406,13 +406,13 @@ billsLibDao.prototype.createBills = function (cbillsData, callback) {
   let newBills = [];
   for (let bill of insertBills) {
     newBills.push({
+      ...bill,
       code: "",
       name: "",
       unit: "",
       ruleText: "",
       Expression: "",
       recharge: "",
-      ...bill,
       deleted: false,
     });
   }
@@ -4142,7 +4142,7 @@ billsLibDao.prototype.importBills = async function (billsLibId, sheetData) {
       recharge: "",
     };
     let jobData =
-      typeof rowData[4] !== "undefined" ? getDivideData(rowData[4]) : [],
+        typeof rowData[4] !== "undefined" ? getDivideData(rowData[4]) : [],
       itemData =
         typeof rowData[5] !== "undefined" ? getDivideData(rowData[5]) : [];
     bills.jobData = jobData;

+ 23 - 6
modules/reports/controllers/rpt_tpl_controller.js

@@ -588,13 +588,30 @@ let mExport = {
       });
   },
   // 导出所有的报表数据
-  async getAllBackupData(req, res) {
+  getAllBackupData: async function (req, res) {
     try {
-      const filePath = "./public/highWay_reportBackup.zip";
-      const rptConfig = await rpt_cfg_mdl.find({}, "-_id");
-      const rptTemplate = await RptTplModel.find({}, "-_id");
-      const rptTplTree = await TreeNodeModel.find({}, "-_id");
-      const rptField = await Rpt_Map_Fld_Mdl.find({}, "-_id");
+      const filePath = "./public/building_reportBackup.zip";
+      let rptTemplate = [];
+      let rptTplTree = [];
+      let rptConfig = [];
+      let rptField = [];
+      await new Promise(async function (resolve) {
+        rptTemplate = await RptTplModel.find({}, "-_id");
+        resolve();
+      });
+
+      await new Promise(async function (resolve) {
+        rptTplTree = await TreeNodeModel.find({}, "-_id");
+        resolve();
+      });
+      await new Promise(async function (resolve) {
+        rptConfig = await rpt_cfg_mdl.find({}, "-_id");
+        resolve();
+      });
+      await new Promise(async function (resolve) {
+        rptField = await Rpt_Map_Fld_Mdl.find({}, "-_id");
+        resolve();
+      });
       var zip = new JSZip();
       zip.file(
         "报表模板备份.json",

+ 110 - 139
public/web/id_tree.js

@@ -122,12 +122,12 @@ var idTree = {
             },
             addUpdateDataForParent: function (datas, nodes, pid) {
                 nodes.forEach(function (node) {
-                    datas.push({ type: 'update', data: node.tree.getDataTemplate(node.getID(), pid, node.getNextSiblingID()) });
+                    datas.push({type: 'update', data: node.tree.getDataTemplate(node.getID(), pid, node.getNextSiblingID())});
                 });
             },
             addUpdateDataForNextSibling: function (datas, node, nid) {
                 if (node) {
-                    datas.push({ type: 'update', data: node.tree.getDataTemplate(node.getID(), node.getParentID(), nid) });
+                    datas.push({type: 'update', data: node.tree.getDataTemplate(node.getID(), node.getParentID(), nid)});
                 }
             }
         };
@@ -221,14 +221,14 @@ var idTree = {
 
 
         // 获取节点所有后代节点
-        Node.prototype.getPosterity = function () {
+        Node.prototype.getPosterity = function() {
             let posterity = [];
             getNodes(this.children);
             return posterity;
             function getNodes(nodes) {
                 for (let node of nodes) {
                     posterity.push(node);
-                    if (node.children.length > 0) {
+                    if (node.children.length > 0){
                         getNodes(node.children);
                     }
                 }
@@ -236,12 +236,12 @@ var idTree = {
         };
 
         // 担心链有问题,preSibling不靠谱的话,按照显示顺序算preSibling
-        Node.prototype.prevNode = function () {
+        Node.prototype.prevNode = function() {
             const parent = this.parent || this.tree.roots;
             if (!parent) {
                 return null;
             }
-            const children = parent === this.tree.roots ? this.tree.roots : parent.children;
+            const children = parent === this.tree.roots ? this.tree.roots :  parent.children;
             const index = children.indexOf(this);
             return children[index - 1] || null;
         }
@@ -296,12 +296,12 @@ var idTree = {
                     tools.addUpdateDataForNextSibling(data, this.preSibling, this.tree.setting.rootId);
                 }
                 tools.addUpdateDataForNextSibling(data, this.parent, this.getID());
-                data.push({ type: 'update', data: this.tree.getDataTemplate(this.getID(), this.parent.getParentID(), this.parent.getNextSiblingID()) });
+                data.push({type: 'update', data: this.tree.getDataTemplate(this.getID(), this.parent.getParentID(), this.parent.getNextSiblingID())});
             }
             return data;
         };
         Node.prototype.upLevel = function () {
-            var result = { success: false, updateDatas: [] };
+            var result = {success: false, updateDatas: []};
             var iIndex = this.parent.children.indexOf(this), orgParent = this.parent, newNextSibling = this.parent.nextSibling;
             if (this.canUpLevel) {
                 // NextSiblings become child
@@ -328,7 +328,7 @@ var idTree = {
                     tools.addUpdateDataForNextSibling(data, this.preSibling.lastChild(), this.getID());
                 }
                 tools.addUpdateDataForNextSibling(data, this.preSibling, this.getNextSiblingID());
-                data.push({ type: 'update', data: this.tree.getDataTemplate(this.getID(), this.preSibling.getID(), this.tree.setting.rootId) });
+                data.push({type: 'update', data: this.tree.getDataTemplate(this.getID(), this.preSibling.getID(), this.tree.setting.rootId)});
             }
             return data;
         };
@@ -532,7 +532,7 @@ var idTree = {
         Tree.prototype.insert = function (parentID, nextSiblingID) {
             var newID = this.newNodeID(), node = null, data = {};
             var parent = parentID == -1 ? null : this.nodes[this.prefix + parentID];
-            var nextSibling = nextSiblingID == -1 ? null : this.nodes[this.prefix + nextSiblingID];
+            var nextSibling = nextSiblingID == -1 ? null: this.nodes[this.prefix + nextSiblingID];
             if (newID !== -1) {
                 data = {};
                 data[this.setting.id] = newID;
@@ -550,24 +550,24 @@ var idTree = {
             }
             return node;
         };
-        Tree.prototype.m_insert = function (datas, parentID, nextSiblingID) {
-            // var newID = this.newNodeID(), node = null, data = {};
+        Tree.prototype.m_insert = function (datas,parentID, nextSiblingID) {
+           // var newID = this.newNodeID(), node = null, data = {};
             var parent = parentID == -1 ? null : this.nodes[this.prefix + parentID];
-            var nextSibling = nextSiblingID == -1 ? null : this.nodes[this.prefix + nextSiblingID];
-            let preInsertNode = null, nodes = [];
-            for (let d of datas) {
-                let node = new Node(this, d.data);
-                if (preInsertNode == null) {
+            var nextSibling = nextSiblingID == -1 ? null: this.nodes[this.prefix + nextSiblingID];
+            let preInsertNode = null,nodes = [];
+            for(let d of datas){
+                let node = new Node(this,d.data);
+                if(preInsertNode == null){
                     if (nextSibling) {
                         tools.addNodes(this, parent, [node], nextSibling.siblingIndex());
                     } else {
                         tools.addNodes(this, parent, [node]);
                     }
-                } else {
+                }else {
                     tools.addNodes(this, parent, [node], preInsertNode.siblingIndex());
                 }
                 this.nodes[this.prefix + d.data.ID] = node;
-                if (preInsertNode) node.setNextSibling(preInsertNode);
+                if(preInsertNode) node.setNextSibling(preInsertNode);
                 preInsertNode = node;
                 nodes.push(node);
             }
@@ -580,7 +580,7 @@ var idTree = {
         Tree.prototype.insertByID = function (newID, parentID, nextSiblingID) {
             var node = null, data = {};
             var parent = parentID == -1 ? null : this.nodes[this.prefix + parentID];
-            var nextSibling = nextSiblingID == -1 ? null : this.nodes[this.prefix + nextSiblingID];
+            var nextSibling = nextSiblingID == -1 ? null: this.nodes[this.prefix + nextSiblingID];
             if (newID) {
                 data = {};
                 data[this.setting.id] = newID;
@@ -601,9 +601,9 @@ var idTree = {
             var data = [];
             var newID = this.newNodeID();
             var parent = parentID == -1 ? null : this.nodes[this.prefix + parentID];
-            var nextSibling = nextSiblingID == -1 ? null : this.nodes[this.prefix + nextSiblingID];
+            var nextSibling = nextSiblingID == -1 ? null: this.nodes[this.prefix + nextSiblingID];
             if (newID !== -1) {
-                data.push({ type: 'new', data: this.getDataTemplate(newID, parent ? parent.getID() : this.setting.rootId, nextSibling ? nextSibling.getID() : this.setting.rootId) });
+                data.push({type: 'new', data: this.getDataTemplate(newID, parent ? parent.getID() : this.setting.rootId, nextSibling ? nextSibling.getID() : this.setting.rootId)});
 
                 if (nextSibling && nextSibling.preSibling) {
                     tools.addUpdateDataForNextSibling(data, nextSibling.preSibling, newID);
@@ -616,17 +616,17 @@ var idTree = {
             return data;
         };
         //插入多行
-        Tree.prototype.getInsertDatas = function (rowCount, parentID, nextSiblingID) {
-            let data = [], preInsertID = null, lastID;
+        Tree.prototype.getInsertDatas = function (rowCount,parentID, nextSiblingID) {
+            let data = [],preInsertID = null,lastID;
             let parent = parentID == -1 ? null : this.nodes[this.prefix + parentID];
-            let nextSibling = nextSiblingID == -1 ? null : this.nodes[this.prefix + nextSiblingID];
-            for (let i = 0; i < rowCount; i++) {//先插入的在最后,后插的在最前
+            let nextSibling = nextSiblingID == -1 ? null: this.nodes[this.prefix + nextSiblingID];
+            for(let i=0;i<rowCount ;i++){//先插入的在最后,后插的在最前
                 let newID = this.newNodeID();
-                if (newID !== -1) {
-                    if (preInsertID == null) {//说明是第一个插入的
-                        data.push({ type: 'new', data: this.getDataTemplate(newID, parent ? parent.getID() : this.setting.rootId, nextSibling ? nextSibling.getID() : this.setting.rootId) });
-                    } else {//其它的下一节点ID取上一个插入的节点
-                        data.push({ type: 'new', data: this.getDataTemplate(newID, parent ? parent.getID() : this.setting.rootId, preInsertID) });
+                if(newID !== -1){
+                    if(preInsertID == null){//说明是第一个插入的
+                        data.push({type: 'new', data: this.getDataTemplate(newID, parent ? parent.getID() : this.setting.rootId, nextSibling ? nextSibling.getID() : this.setting.rootId)});
+                    }else {//其它的下一节点ID取上一个插入的节点
+                        data.push({type: 'new', data: this.getDataTemplate(newID, parent ? parent.getID() : this.setting.rootId, preInsertID)});
                     }
                     this.maxNodeID(newID);
                     preInsertID = newID;
@@ -655,36 +655,25 @@ var idTree = {
                 } else {
                     tools.addNodes(this, parent, [node]);
                 }
-                this.nodes[this.prefix + data[this.setting.id]] = node;
+                this.nodes[this.prefix +  data[this.setting.id]] = node;
                 tools.sortTreeItems(this);
-                this.maxNodeID(data[this.setting.id]);
+                this.maxNodeID( data[this.setting.id]);
                 return node;
             }
         };
-
-        // 插入离散节点
-        Tree.prototype.insertByDatas = function (datas) {
-            const nodes = [];
-            datas.forEach(item => {
-                const node = this.insertByData(item, item.ParentID, item.NextSiblingID);
-                nodes.push(node);
-            });
-            return nodes;
-        };
-
         //批量新增节点到节点后项,节点已有树结构数据
         Tree.prototype.insertDatasTo = function (preData, datas) {
             let rst = [];
-            for (let data of datas) {
+            for(let data of datas){
                 this.nodes[this.prefix + data.ID] = new Node(this, data.ID);
                 this.nodes[this.prefix + data.ID]['data'] = data;
                 rst.push(this.nodes[this.prefix + data.ID]);
             }
-            for (let data of datas) {
+            for(let data of datas){
                 let node = this.nodes[this.prefix + data.ID];
                 let parent = data.ParentID == -1 ? null : this.nodes[this.prefix + data.ParentID];
                 node.parent = parent;
-                if (!parent) {
+                if(!parent){
                     this.roots.push(node);
                 }
                 else {
@@ -692,14 +681,14 @@ var idTree = {
                 }
                 let next = data.NextSiblingID == -1 ? null : this.nodes[this.prefix + data.NextSiblingID];
                 node.nextSibling = next;
-                if (next) {
+                if(next){
                     next.preSibling = node;
                 }
             }
             let preNode = this.nodes[this.prefix + preData.ID];
-            if (preNode) {
+            if(preNode){
                 preNode.nextSibling = this.nodes[this.prefix + preData.NextSiblingID] ? this.nodes[this.prefix + preData.NextSiblingID] : null;
-                if (preNode.nextSibling) {
+                if(preNode.nextSibling){
                     preNode.nextSibling.preSibling = preNode;
                 }
             }
@@ -710,7 +699,7 @@ var idTree = {
         };
         Tree.prototype.delete = function (node) {
             var success = false, that = this;
-            if (node) success = that.m_delete([node]);
+            if(node) success = that.m_delete([node]);
             return success;
         };
         Tree.prototype.m_delete = function (nodes) {
@@ -721,7 +710,7 @@ var idTree = {
                     deleteIdIndex(node.children);
                 })
             };
-            for (let n of nodes) {
+            for(let n of nodes){
                 deleteIdIndex([n]);
                 if (n.preSibling) {
                     n.preSibling.setNextSibling(n.nextSibling);
@@ -744,76 +733,76 @@ var idTree = {
             let o_next = o_parent.nextSibling;//父节点的下一节点
             let o_pre = nodes[0].preSibling;
             let o_children = o_parent.children;//旧的所有兄弟节点
-            let children = o_parent.parent ? o_parent.parent.children : this.roots;//新的兄弟节点
+            let children = o_parent.parent?o_parent.parent.children:this.roots;//新的兄弟节点
             let last;
             let lastNext;//最后一个选中节点后面的所有兄弟节点变成最后一个节点的子节点
-            for (let i = 0; i < nodes.length; i++) {
+            for(let i = 0; i<nodes.length;i++){
                 let index = children.indexOf(o_parent) + 1;
-                children.splice(index + i, 0, nodes[i]);//往新的父节点的子节点插入节点
+                children.splice(index + i,0,nodes[i]);//往新的父节点的子节点插入节点
                 o_children.splice(nodes[i].siblingIndex(), 1);//旧的数组删除节点
-                if (i == 0) {//第一个节点变成原来父节点的下一节点
+                if(i == 0){//第一个节点变成原来父节点的下一节点
                     o_parent.setNextSibling(nodes[i]);
-                    if (o_pre) o_pre.setNextSibling(null); //第一个选中节点的前一节点的下一节点设置为空
+                    if(o_pre) o_pre.setNextSibling(null); //第一个选中节点的前一节点的下一节点设置为空
                 }
                 nodes[i].setParent(o_parent.parent);
                 last = nodes[i];
                 lastNext = last.nextSibling;
             }
             last.setNextSibling(o_next);//最后一个选中的节点的下一个节点设置为原父节点的下一节点
-            if (lastNext) {
+            if(lastNext){
                 let t_index = o_children.indexOf(lastNext);
-                for (let j = t_index; j < o_children.length; j++) {//剩下的添加为最后一个选中节点的子节点
+                for(let j = t_index;j <o_children.length;j++ ){//剩下的添加为最后一个选中节点的子节点
                     last.addChild(o_children[j]);
                 }
-                if (o_children.length > t_index) o_children.splice(t_index, o_children.length - t_index);//从原先的children中移除
+                if(o_children.length > t_index)  o_children.splice(t_index, o_children.length - t_index);//从原先的children中移除
             }
-            if (o_parent.parent && !o_parent.parent.expanded) o_parent.parent.setExpanded(true);
+            if (o_parent.parent&& !o_parent.parent.expanded)  o_parent.parent.setExpanded(true);
             tools.sortTreeItems(this);
             return true;
         };
         Tree.prototype.getUpLevelDatas = function (nodes) {
             //getParentID
-            let o_parentID = nodes[0].getParentID();
+            let o_parentID =  nodes[0].getParentID();
             let o_children = nodes[0].parent.children;//旧的所有兄弟节点
             let o_pre = nodes[0].preSibling;
             let new_parentID = nodes[0].parent.getParentID();
             let o_nextID = nodes[0].parent.getNextSiblingID();
-            let dataMap = {}, updateDatas = [], lastID, lastNext;
-            for (let i = 0; i < nodes.length; i++) {
-                if (i == 0) {
-                    dataMap[o_parentID] = { "ID": o_parentID, "NextSiblingID": nodes[i].getID() };
-                    if (o_pre) dataMap[o_pre.getID()] = { "ID": o_pre.getID(), "NextSiblingID": -1 }; //nodes[i].preSibling.setNextSibling(null);
+            let dataMap = {},updateDatas=[],lastID,lastNext;
+            for(let i = 0; i<nodes.length;i++){
+                if(i == 0){
+                    dataMap[o_parentID] = {"ID":o_parentID,"NextSiblingID":nodes[i].getID()};
+                    if(o_pre) dataMap[o_pre.getID()] = {"ID":o_pre.getID(),"NextSiblingID":-1}; //nodes[i].preSibling.setNextSibling(null);
                 }
-                dataMap[nodes[i].getID()] = { "ID": nodes[i].getID(), "ParentID": new_parentID };
+                dataMap[nodes[i].getID()] = {"ID":nodes[i].getID(),"ParentID":new_parentID};
                 lastID = nodes[i].getID();
                 lastNext = nodes[i].nextSibling;
             }
-            if (dataMap[lastID] !== undefined) {
+            if(dataMap[lastID] !== undefined){
                 dataMap[lastID].NextSiblingID = o_nextID;
             }
-            if (lastNext) {
+            if(lastNext){
                 let t_index = o_children.indexOf(lastNext);
-                for (let j = t_index; j < o_children.length; j++) {//剩下的添加为最后一个选中节点的子节点
-                    dataMap[o_children[j].getID()] = { "ID": o_children[j].getID(), "ParentID": lastID };
+                for(let j = t_index;j <o_children.length;j++ ){//剩下的添加为最后一个选中节点的子节点
+                    dataMap[o_children[j].getID()] = {"ID":o_children[j].getID(),"ParentID":lastID};
                 }
             }
-            for (let key in dataMap) {
-                updateDatas.push({ type: 'update', data: dataMap[key] });
+            for(let key in dataMap){
+                updateDatas.push({type: 'update', data:dataMap[key]});
             }
             return updateDatas;
         };
         Tree.prototype.m_downLevel = function (nodes) {
-            let pre = nodes[0].preSibling; //第一个节点的前一节点,即会成为新的父节点
-            let next;//最后一个节点的后一节点,会成为pre 的下一个节点
-            let last;//选中的最后一个节点,nextSibling要设置为0
-            for (let n of nodes) {
+            let pre = nodes[0].preSibling ; //第一个节点的前一节点,即会成为新的父节点
+            let next ;//最后一个节点的后一节点,会成为pre 的下一个节点
+            let last ;//选中的最后一个节点,nextSibling要设置为0
+            for( let n of nodes){
                 next = n.nextSibling;
                 last = n;
-                let children = n.parent ? n.parent.children : this.roots;
+                let  children = n.parent?n.parent.children:this.roots;
                 children.splice(n.siblingIndex(), 1);
                 pre.addChild(n);
             }
-            if (!pre.expanded) pre.setExpanded(true);
+            if (!pre.expanded)  pre.setExpanded(true);
             pre.setNextSibling(next);
             last.nextSibling = null;
             tools.sortTreeItems(this);
@@ -821,25 +810,25 @@ var idTree = {
         };
 
         Tree.prototype.getDownLevelDatas = function (nodes) {
-            let dataMap = {}, updateDatas = [], nextID, last;//注释同m_downLevel 方法
+            let dataMap = {},updateDatas=[],nextID,last;//注释同m_downLevel 方法
             let newParent = nodes[0].preSibling;//{"type":"update","data":{"ID":3,"ParentID":-1,"NextSiblingID":5}}
-            let newPre = newParent.children && newParent.children.length > 0 ? newParent.children[newParent.children.length - 1] : null;
-            if (newPre) { //如果新的父节点有子节点,则把新的父节点的最后一个子节点的下一节点的值改成第一个选中节点的ID
-                dataMap[newPre.getID()] = { "ID": newPre.getID(), "NextSiblingID": nodes[0].getID() }
+            let newPre = newParent.children && newParent.children.length > 0 ? newParent.children[newParent.children.length -1]:null;
+            if(newPre){ //如果新的父节点有子节点,则把新的父节点的最后一个子节点的下一节点的值改成第一个选中节点的ID
+                dataMap[newPre.getID()] = {"ID":newPre.getID(),"NextSiblingID":nodes[0].getID()}
             }
-            for (let n of nodes) {
+            for(let n of nodes){
                 nextID = n.getNextSiblingID();
                 last = n;
-                dataMap[n.getID()] = { "ID": n.getID(), "ParentID": newParent.getID() }//修改父ID;
+                dataMap[n.getID()] = {"ID":n.getID(),"ParentID":newParent.getID()}//修改父ID;
             }
-            dataMap[newParent.getID()] = { "ID": newParent.getID(), "NextSiblingID": nextID }//设置新的父节点的下一个节点ID;
-            if (dataMap[last.getID()] !== undefined) {//把最后一个节点的下一个节点ID变成-1
+            dataMap[newParent.getID()] = {"ID":newParent.getID(),"NextSiblingID":nextID}//设置新的父节点的下一个节点ID;
+            if(dataMap[last.getID()]!==undefined){//把最后一个节点的下一个节点ID变成-1
                 dataMap[last.getID()].NextSiblingID = -1
-            } else {
-                dataMap[last.getID()] = { "ID": last.getID(), "NextSiblingID": -1 };
+            }else {
+                dataMap[last.getID()] = {"ID":last.getID(),"NextSiblingID":-1};
             }
-            for (let key in dataMap) {
-                updateDatas.push({ type: 'update', data: dataMap[key] });
+            for(let key in dataMap){
+                updateDatas.push({type: 'update', data:dataMap[key]});
             }
             return updateDatas;
         };
@@ -850,7 +839,7 @@ var idTree = {
                 nodes.forEach(function (node) {
                     var delData = {};
                     delData[node.tree.setting.id] = node.getID();
-                    datas.push({ type: 'delete', data: delData });
+                    datas.push({type: 'delete', data: delData});
                     addUpdateDataForDelete(datas, node.children);
                 })
             };
@@ -862,32 +851,32 @@ var idTree = {
             }
             return data;
         };
-        Tree.prototype.getDeleteDatas = function (deleteMap, deleteNodes) {//批量删除
+        Tree.prototype.getDeleteDatas = function (deleteMap,deleteNodes){//批量删除
             let datas = [];
-            addDeleteDatas(datas, deleteNodes);
-            for (let d of deleteNodes) {
-                addPreUpdateData(datas, deleteMap, d.preSibling, d.nextSibling);
-            }
-            function addPreUpdateData(updateDatas, map, preSibling, nextSibling) {
-                if (preSibling && (map[preSibling.getID()] == undefined || map[preSibling.getID()] == null)) {
-                    if (nextSibling) {
-                        if (map[nextSibling.getID()]) {//如果下一个节点也是要删除的,则再往下顺延
-                            addPreUpdateData(updateDatas, map, preSibling, nextSibling.nextSibling);
-                        } else {
-                            updateDatas.push({ type: 'update', data: preSibling.tree.getDataTemplate(preSibling.getID(), preSibling.getParentID(), nextSibling.getID()) });
-                        }
-                    } else {
-                        updateDatas.push({ type: 'update', data: preSibling.tree.getDataTemplate(preSibling.getID(), preSibling.getParentID(), -1) });
-                    }
-                }
-            }
-
-            function addDeleteDatas(dataArray, nodes) {
-                for (let n of nodes) {
+            addDeleteDatas(datas,deleteNodes);
+            for(let d of deleteNodes){
+                addPreUpdateData(datas,deleteMap,d.preSibling,d.nextSibling);
+            }
+           function addPreUpdateData(updateDatas,map,preSibling,nextSibling) {
+               if(preSibling && (map[preSibling.getID()] == undefined || map[preSibling.getID()] == null)){
+                   if(nextSibling){
+                      if(map[nextSibling.getID()]){//如果下一个节点也是要删除的,则再往下顺延
+                          addPreUpdateData(updateDatas,map,preSibling,nextSibling.nextSibling);
+                      }else {
+                          updateDatas.push({type: 'update', data: preSibling.tree.getDataTemplate(preSibling.getID(), preSibling.getParentID(),nextSibling.getID())});
+                      }
+                   }else {
+                       updateDatas.push({type: 'update', data: preSibling.tree.getDataTemplate(preSibling.getID(), preSibling.getParentID(),-1)});
+                   }
+               }
+           }
+
+            function addDeleteDatas(dataArray,nodes) {
+                for(let n of nodes){
                     let delData = {};
                     delData[n.tree.setting.id] = n.getID();
-                    dataArray.push({ type: 'delete', data: delData });
-                    addDeleteDatas(dataArray, n.children);
+                    dataArray.push({type: 'delete', data: delData});
+                    addDeleteDatas(dataArray,n.children);
                 }
             }
             return datas;
@@ -895,8 +884,8 @@ var idTree = {
 
         Tree.prototype.getExpState = function (nodes) {
             let sessionExpanded = [];
-            function getStat(items) {
-                for (let item of items) {
+            function getStat(items){
+                for(let item of items){
                     sessionExpanded.push(item.expanded ? 1 : 0);
                 }
             }
@@ -908,9 +897,9 @@ var idTree = {
         //节点根据展开收起列表'010101'展开收起
         Tree.prototype.setExpandedByState = function (nodes, expState) {
             let expStateArr = expState.split('');
-            for (let i = 0; i < nodes.length; i++) {
+            for(let i = 0; i < nodes.length; i++){
                 let expanded = expStateArr[i] == 1 ? true : false;
-                if (nodes[i].expanded === expanded) {
+                if(nodes[i].expanded === expanded){
                     continue;
                 }
                 nodes[i].setExpanded(expanded);
@@ -981,25 +970,7 @@ var idTree = {
             this.event[eventName] = eventFun;
         };
 
-        Tree.prototype.resetID = function (items, IDFunc) {
-            const IDMap = {};
-            items.forEach(item => {
-                IDMap[item.ID] = IDFunc();
-            });
-            items.forEach(item => {
-                if (IDMap[item.ID]) {
-                    item.ID = IDMap[item.ID];
-                }
-                if (IDMap[item.ParentID]) {
-                    item.ParentID = IDMap[item.ParentID];
-                }
-                if (IDMap[item.NextSiblingID]) {
-                    item.NextSiblingID = IDMap[item.NextSiblingID];
-                }
-            });
-        };
-
         return new Tree(setting);
     },
-    updateType: { update: 'update', new: 'new', delete: 'delete' }
+    updateType: {update: 'update', new: 'new', delete: 'delete'}
 };

+ 0 - 23
public/web/lock_util.js

@@ -78,28 +78,6 @@ const lockUtil = (() => {
         $url.prop('href', curURL);
     }
 
-    function unLockSpreads(spreads) {
-        spreads.forEach(spread => {
-            spread.unbind(GC.Spread.Sheets.Events.ButtonClicked);
-            const sheetCount = spread.getSheetCount();
-            for (let i = 0; i < sheetCount; i++) {
-                const sheet = spread.getSheet(i);
-                sheet.suspendPaint();
-                sheet.suspendEvent();
-                sheet.options.isProtected = false;
-                const rowCount = sheet.getRowCount();
-                const colCount = sheet.getColumnCount();
-                for (let row = 0; row < rowCount; row++) {
-                    for (let col = 0; col < colCount; col++) {
-                        sheet.getCell(row, col).locked(false);
-                    }
-                }
-                sheet.resumePaint();
-                sheet.resumeEvent();
-            }
-        });
-    }
-
     function displayLock($lock, locked) {
         $lock.data('locked', locked);
         const innerHtml = locked ? '<i class="fa fa-unlock-alt"></i>' : '<i class="fa fa-lock"></i>';
@@ -129,7 +107,6 @@ const lockUtil = (() => {
         getLocked,
         lockTools,
         lockSpreads,
-        unLockSpreads,
         lockURL,
         displayLock,
         handleLockClick,

+ 375 - 325
public/web/rpt_value_define.js

@@ -2,329 +2,379 @@
  * Created by Tony on 2017/6/7.
  */
 const JV = {
-    NODE_CROSS_INFO: "交叉表_信息",
-    NODE_CROSS_ROW: "交叉行",
-    NODE_CROSS_COL: "交叉列",
-    NODE_CROSS_CONTENT: "交叉数据",
-    NODE_CROSS_ROW_SUM: "交叉行合计",
-    NODE_CROSS_COL_SUM: "交叉列合计",
-    NODE_CROSS_ROW_EXT: "交叉行拓展",
-    NODE_CROSS_ROW_SUM_EXT: "交叉行拓展合计",
-    NODE_CROSS_ROW_AD_HOC: "交叉行AD_HOC",
-    NODE_FIELD_MAP: "指标_数据_映射",
-    NODE_DISCRETE_FIELDS: "离散指标_集合",
-    NODE_NO_MAPPING_FIELDS: "无映射离散指标_集合",
-    NODE_DISCRETE_PARAMS: "离散参数_集合",
-    NODE_MASTER_FIELDS: "主数据指标_集合",
-    NODE_MASTER_FIELDS_EX: "主数据指标_拓展集合",
-    NODE_DETAIL_FIELDS: "从数据指标_集合",
-    NODE_DETAIL_FIELDS_EX: "从数据指标_拓展集合",
-    NODE_BAND_COLLECTION: "布局框_集合",
-    NODE_FORMULAS: "计算式_集合",
-    NODE_EVENTS: "事件_集合",
-    NODE_DISCRETE_INFO: "离散信息",
-    NODE_BILL_INFO: "账单式表_信息",
-    NODE_BILL_CONTENT : "账单式表_数据",
-    NODE_FLOW_INFO: "流水式表_信息",
-    NODE_FLOW_INFO_EX: "流水式表_拓展信息",
-    NODE_FLOW_GROUP: "流水式表_分组信息",
-    NODE_FLOW_SEG_SUM: "流水式表_段统计信息",
-    NODE_FLOW_PAGE_SUM: "流水式表_页统计信息",
-    NODE_FLOW_COLUMN : "流水式表_列",
-    NODE_FLOW_CONTENT : "流水式表_数据",
-    PROP_MULTI_COLUMN: "多列显示数量",
-    PROP_FLOW_EX_DISPLAY_MODE: "流水拓展显示模式",
-    DISPLAY_MODE_INDEPENDENT: "单独模式",
-    DISPLAY_MODE_FOLLOW: "紧随模式",
-
-    NODE_MAIN_INFO: "主信息",
-    NODE_MAIN_INFO_RPT_NAME: "报表名称",
-    NODE_PAGE_INFO: "打印页面_信息",
-    NODE_PAGE_SIZE: "纸张宽高",
-    NODE_MARGINS: "页边距",
-    NODE_RPT_BIZ_TYPE: "报表业务类型",
-    NODE_BIZ_TYPE_AUDI: "审核类型",
-    NODE_BIZ_TYPE_SUM: "汇总类型",
-    NODE_BIZ_TYPE_DETAIL: "明细类型",
-
-    NODE_MAP_DATA_HANDLE_INFO: "映射数据预处理",
-    PROP_DATA_KEY: "映射数据对象",
-    PROP_PARENT_DATA_KEY: "父映射数据对象",
-    PROP_PARENT_CHILD_SORT_KEY: "父子排序键",
-    PROP_PARENT_SORT_KEYS: "父排序键值集",
-    PROP_CHILD_SORT_KEYS: "子排序键值集",
-    PROP_OTHER_SUB_SORT: "其他子排序",
-    PROP_OTHER_SUB_FILTER: "其他子过滤",
-    PROP_HANDLE_TYPE: "预处理类型",
-    PROP_FILTER_KEYS: "过滤键值集",
-    PROP_FILTER_TOP_BILLS_NODES: "清单顶节点集",
-    PROP_FILTER_OTHER_BILLS_NODES: "其他清单节点集",
-    PROP_FILTER_COMPARE_OBJ: "compareObjKey",
-    PROP_FILTER_COMPARE_OBJ_KEY: "compareObjIdKey",
-    PROP_FILTER_COMPARE_VAL: "compareValue",
-    PROP_FILTER_CONDITION: "判断条件",
-    PROP_HANDLE_TYPE_FILTER: "过滤",
-    PROP_HANDLE_TYPE_SUM: "合计",
-    PROP_HANDLE_TYPE_SORT: "排序",
-    PROP_HANDLE_TYPE_ADD_DUMMY: "增加Dummy数据",
-    PROP_HANDLE_TYPE_ADJUST: "数据调整",
-    PROP_HANDLE_TYPE_BILLS_DATA_MOVE: "量材数据转移",
-    PROP_HANDLE_TYPE_COMPONENT_MOVE: "组成物数据转移",
-    PROP_HANDLE_TYPE_COMPONENT_REPLACEMENT: "组成物替换",
-    PROP_HANDLE_TYPE_PRECISION: "合计精度",
-
-    PROP_ADJUST_COLLECTION: "数据调整集",
-    PROP_ADJUST_ACTION: "action",
-    PROP_ADJUST_ACTION_VAL: "actionValue",
-    PROP_DUMMY_COLLECTION: "Dummy数据集",
-    PROP_DUMMY_VAL: "Dummy数据对象值",
-    PROP_FREQUENCY: "频率",
-    PROP_GRP_KEYS: "GrpKeyIds",
-    PROP_SORT_TYPE: "排序方式",
-    PROP_SORT_TYPE_SELF_DEFINE_LOGIC: "自定义逻辑",
-    PROP_SORT_KEYS: "排序键值集",
-    PROP_SUM_GROUP_KEYS: "分组键值集",
-    PROP_SUM_SUM_KEYS: "统计键值集",
-    PROP_SUM_CALC_AHEAD: "统计前计算",
-    PROP_SUM_CACL_TYPE: "计算类型",
-    PROP_FIELD_EXP_MAP: "mapExpression",
-    PROP_PRECISION: "Precision",
-    PROP_FIXED_PRECISION_AMT: "fixedPrecisionNum",
-    PROP_FIELD_EXP_FIXED_MAP: "fixedMapExpression",
-    PROP_FIELD_EXP_FLEXIBLE_MAP: "flexibleMapExpression",
-    PROP_FLEXIBLE_REF_FILED_ID: "flexibleRefFieldID",
-
-    NODE_FONT_COLLECTION: "font_collection",
-    NODE_STYLE_COLLECTION: "style_collection",
-    NODE_CONTROL_COLLECTION: "control_collection",
-
-    PROP_ID: "ID",
-    PROP_AD_HOC_DATA: "data_field",
-    PROP_CMN_HEIGHT: "CommonHeight",
-    PROP_CMN_WIDTH: "CommonWidth",
-    PROP_BAND_NAME: "BandName",
-    PROP_BAND_NORMAL_ONLY: "normalOnly",
-    PROP_BAND_EX_ONLY: "exOnly",
-    PROP_BAND_EX_JOIN_AFTER: "isJoinAfter",
-
-    PROP_UNITS: "单位",
-    PROP_PAGE_SIZE: "页规格",
-    PROP_ORIENTATION: "方向",
-    PROP_LEFT: "Left",
-    PROP_RIGHT: "Right",
-    PROP_TOP: "Top",
-    PROP_BOTTOM: "Bottom",
-    PROP_DATA_TYPE: "DataType",
-    PROP_NAME: "Name",
-    PROP_DFT_VALUE: "Default_Value",
-    PROP_EXPRESSION: "expression",
-    PROP_RUN_TYPE: "run_type",
-    PROP_BORDER_STYLE: "border_style",
-    PROP_POSITION: "Position",
-    PROP_HIDDEN: "Hidden",
-    PROP_IS_SERIAL: "isSerial",
-    PROP_IS_MERGE: "isMerge",
-    PROP_COMBINE_TYPE: "combineType",
-    PROP_IS_AUTO_HEIGHT: "isAutoHeight",
-    PROP_FONT: "font",
-    PROP_CONTROL: "control",
-    PROP_STYLE: "style",
-    PROP_VALUE: "Value",
-    PROP_LABEL: "Label",
-    PROP_AREA: "area",
-    PROP_DISCRETE_FIELDS: "discrete_field_s",
-    PROP_FLOW_FIELDS: "flow_field_s",
-    PROP_BILL_FIELDS: "bill_field_s",
-    PROP_CROSS_FIELDS: "cross_field_s",
-    PROP_CROSS_DISPLAY_ORDER: "cross_display_order",
-    PROP_GROUP_FIELDS: "group_field_s", //用来分组的指标(如按清单、定额etc...)
-    PROP_GROUP_LINES: "group_lines",    //显示分组行,因分组的特殊性,分组的数据当成流水数据一样(行高相同),group_lines里的每一条数据占用流水的一整行,里面再细分(指标/text)
-    PROP_GROUP_SUM_KEYS: "SumKey_S",
-    PROP_SUM_KEY: "SumKey",
-    PROP_SUM_FIELDS: "sum_field_s",
-    PROP_TEXTS: "text_s",
-    PROP_TEXT: "text",
-    PROP_PARAMS: "param_s",
-    PROP_FIELD_ID: "FieldID",
-    PROP_PARAM_ID: "ParamID",
-    PROP_PREFIX: "Prefix",
-    PROP_SUFFIX: "Suffix",
-    PROP_FORMAT: "Format",
-
-    PROP_SHOW_ZERO: "ShowZero",
-    PROP_EXTENSION_TYPE: "ExtType",
-
-    PROP_CALCULATION: "CalculationType",
-    PROP_H_CALCULATION: "H_CalculationType",
-    PROP_V_CALCULATION: "V_CalculationType",
-    PROP_FIT_AREA: "isFitArea",
-
-    IDX_LEFT: 0,
-    IDX_TOP: 1,
-    IDX_RIGHT: 2,
-    IDX_BOTTOM: 3,
-
-    BAND_PROP_NAME: "Name",
-    BAND_PROP_MERGE_BAND: "MergeBand",
-    BAND_PROP_STYLE: "style",
-    BAND_PROP_CONTROL: "control",
-    BAND_PROP_HEIGHT: "Height",
-    BAND_PROP_WIDTH: "Width",
-    BAND_PROP_DISPLAY_TYPE: "DisplayType",
-    BAND_PROP_ALIGNMENT: "Alignment",
-    BAND_PROP_MERGE_BORDER: "MergeBorder",
-    BAND_PROP_SUB_BANDS: "band_s",
-
-    MEASUREMENT: {
-        PIXEL:["像素点", "象素点", "PIXEL"],
-        CM: ["厘米", "CM"],
-        INCH: ["英寸","INCH"]
-    },
-
-    PROP_IS_ID: "isID",
-    PROP_ID_SEQ: "IDSeq",
-
-    TAB_FIELD_PROP_SORT: "Sort",
-    TAB_FIELD_PROP_SORT_VAL_NOSORT: "no_sort",
-    TAB_FIELD_PROP_SORT_VAL_ASC: "ascend",
-    TAB_FIELD_PROP_SORT_VAL_DESC: "descend",
-
-    DATA_DISCRETE_DATA: "discrete_data",
-    DATA_MASTER_DATA: "master_data",
-    DATA_DETAIL_DATA: "detail_data",
-    DATA_MASTER_DATA_EX: "master_data_ex",
-    DATA_DETAIL_DATA_EX: "detail_data_ex",
-
-    BLANK_FIELD_INDEX: -10,
-    BLANK_VALUE_INDEX: -100,
-    BLANK_PAGE_VALUE_INDEX: -200,
-
-    PROP_SEG_GRP_IDX: "segGrpRecStartIdx",
-    PROP_PRE_ADD_GRP_REC_INFO: "preAddPageGrpInfo",
-    PROP_INSERTED_GRP_REC: "insertedGrpRecAmt",
-    PROP_GRP_LINES: "group_lines_amt",
-
-    RUN_TYPE_BEFORE_ANALYZING: "before_analyzing",
-    RUN_TYPE_BEFORE_PAGING: "before_paging",
-    RUN_TYPE_BEFORE_OUTPUT: "before_output",
-    RUN_TYPE_BEFORE_COMBINE: "before_combine",
-    RUN_TYPE_AFTER_COMBINE: "after_combine",
-
-    RUN_TYPE_BEFORE_GROUP_TEXT_OUT: "before_group_text_output",
-
-    PAGE_STATUS: ["EveryPage","FirstPage", "LastPage", "SegmentStart", "SegmentEnd", "Group", "CrossRowEnd", "CrossColEnd"],
-
-    CONTROL_PROPS: ["Shrink", "ShowZero", "Horizon", "Vertical", "Wrap", "VerticalForExcel", "ShrinkFirst", "CloseOutput"],
-    CONTROL_PROP_IDX_SHRINK: 0,
-    CONTROL_PROP_IDX_SHOW_ZERO: 1,
-    CONTROL_PROP_IDX_HORIZON: 2,
-    CONTROL_PROP_IDX_VERTICAL: 3,
-    CONTROL_PROP_IDX_WRAP: 4,
-    CONTROL_PROP_IDX_VERTICAL_EXCEL: 5,
-    CONTROL_PROP_IDX_SHRINK_FIRST: 6,
-    CONTROL_PROP_IDX_CLOSE_OUTPUT: 7,
-    BORDER_STYLE_PROPS: ["LineWeight", "DashStyle", "Color"],
-    PROP_LINE_WEIGHT: "LineWeight",
-    PROP_DASH_STYLE: "DashStyle",
-    PROP_COLOR: "Color",
-    FONT_PROPS: ["Name", "FontHeight", "FontColor", "FontBold", "FontItalic", "FontUnderline", "FontStrikeOut", "FontAngle"],
-    FONT_PROP_IDX_NAME: 0,
-    FONT_PROP_IDX_HEIGHT: 1,
-    FONT_PROP_IDX_COLOR: 2,
-    FONT_PROP_IDX_BOLD: 3,
-    FONT_PROP_IDX_ITALIC: 4,
-    FONT_PROP_IDX_UNDERLINE: 5,
-    FONT_PROP_IDX_STRIKEOUT: 6,
-    FONT_PROP_IDX_ANGLE: 7,
-
-    STATUS_NORMAL: 0,
-    STATUS_REPORT_START: 1,
-    STATUS_REPORT_END: 2,
-    STATUS_SEGMENT_START: 3,
-    STATUS_SEGMENT_END: 4,
-    STATUS_GROUP: 5,
-    STATUS_CROSS_ROW_END: 6,
-    STATUS_CROSS_COL_END: 7,
-
-    LAYOUT: ["Top","Bottom", "Left", "Right", "Fulfill"],
-    LAYOUT_TOP: 0,
-    LAYOUT_BOTTOM: 1,
-    LAYOUT_LEFT: 2,
-    LAYOUT_RIGHT: 3,
-    LAYOUT_FULFILL: 4,
-
-    OUTPUT_ALIGN: {
-        H: ["left", "center", "right"],
-        V: ["top", "center", "bottom"]
-    },
-    H_ALIGN_IDX_LEFT : 0,
-    H_ALIGN_IDX_CENTER : 1,
-    H_ALIGN_IDX_RIGHT : 2,
-    V_ALIGN_IDX_TOP : 0,
-    V_ALIGN_IDX_CENTER : 1,
-    V_ALIGN_IDX_BOTTOM : 2,
-
-    CAL_TYPE:["percentage","abstract"],
-    CAL_TYPE_PERCENTAGE: 0,
-    CAL_TYPE_ABSTRACT: 1,
-
-    EVENT_TYPE: ["GRP_ON_CREATE", "FLOW_CONTENT_ON_CREATE"],
-    EVENT_IDX_GRP_ON_CREATE: 0,
-    EVENT_IDX_FLOW_CONTENT_ON_CREATE: 1,
-
-    PAGE_ORIENTATION_V_FIRST: 0,
-    PAGE_ORIENTATION_H_FIRST: 1,
-
-    ORIENTATION_PORTRAIT: "PORTRAIT",
-    ORIENTATION_LANDSCAPE: "LANDSCAPE",
-    ORIENTATION_PORTRAIT_CHN: "纵向",
-    ORIENTATION_LANDSCAPE_CHN: "横向",
-    SIZE_A3: [11.69, 16.54],
-    SIZE_A4: [8.27, 11.69],
-    SIZE_A5: [5.83, 8.27],
-    SIZE_B5: [6.93, 9.84],
-    SIZE_LETTER: [8.5, 11.0],
-    SIZE_LEGAL: [8.5, 14.0],
-    SIZE_16K: [7.75, 10.75],
-    SIZE_EXECUTIVE: [7.25, 10.5],
-
-    OUTPUT_OFFSET: [2,2,1,3],
-    OFFSET_IDX_LEFT: 0,
-    OFFSET_IDX_RIGHT: 1,
-    OFFSET_IDX_TOP: 2,
-    OFFSET_IDX_BOTTOM: 3,
-
-    PROP_PAGE_SEQ: "page_seq",
-    PROP_PAGE_MERGE_BORDER: "page_merge_border",
-    PROP_CELLS: "cells",
-
-    PAGING_OPTION_NORMAL: 'normal',
-    PAGING_OPTION_INFINITY: 'infinity',
-
-    OUTPUT_TYPE_NORMAL: 'normal',
-    OUTPUT_TYPE_SVG: 'svg',
-    OUTPUT_TYPE_PDF: 'pdf',
-    OUTPUT_TYPE_EXCEL: 'excel',
-
-    DISPLAY_VAL_TYPE_NORMAL: 0,
-    DISPLAY_VAL_TYPE_GROUP: 1,
-    DISPLAY_VAL_TYPE_AUTO_HEIGHT: 2,
-
-    TYPE_FOLLOW_MODE: 1,
-
-    PAGE_SELF_DEFINE: "自定义",
-    PAGE_SPECIAL_MERGE_POS: "page_merge_pos",
-
-    PAGES_SIZE_STR: ["A3", "A4", "A5", "B5", "LETTER", "LEGAL", "EXECUTIVE", "16K"],
-    PAGES_SIZE_IDX: [8, 9, 11, 13, 1, 5, 7, 93],
-    PAGES_SIZE: [[11.69, 16.54], [8.27, 11.69], [5.83, 8.27], [6.93, 9.84], [8.5, 11.0], [8.5, 14.0], [7.25, 10.5], [7.25, 10.5]],
-
-    HUNDRED_PERCENT : 100.0,
-
-    VERTICAL_ANGLE: "90",
-    ANTI_VERTICAL_ANGLE: "-90",
-    VERTICAL_ANGLE_INT: 90,
-    ANTI_VERTICAL_ANGLE_INT: -90,
-
-    LAST_DEF: ""
+  NODE_CROSS_INFO: "交叉表_信息",
+  NODE_CROSS_ROW: "交叉行",
+  NODE_CROSS_COL: "交叉列",
+  NODE_CROSS_CONTENT: "交叉数据",
+  NODE_CROSS_ROW_SUM: "交叉行合计",
+  NODE_CROSS_COL_SUM: "交叉列合计",
+  NODE_CROSS_ROW_EXT: "交叉行拓展",
+  NODE_CROSS_ROW_SUM_EXT: "交叉行拓展合计",
+  NODE_CROSS_ROW_AD_HOC: "交叉行AD_HOC",
+  NODE_FIELD_MAP: "指标_数据_映射",
+  NODE_DISCRETE_FIELDS: "离散指标_集合",
+  NODE_NO_MAPPING_FIELDS: "无映射离散指标_集合",
+  NODE_DISCRETE_PARAMS: "离散参数_集合",
+  NODE_MASTER_FIELDS: "主数据指标_集合",
+  NODE_MASTER_FIELDS_EX: "主数据指标_拓展集合",
+  NODE_DETAIL_FIELDS: "从数据指标_集合",
+  NODE_DETAIL_FIELDS_EX: "从数据指标_拓展集合",
+  NODE_BAND_COLLECTION: "布局框_集合",
+  NODE_FORMULAS: "计算式_集合",
+  NODE_EVENTS: "事件_集合",
+  NODE_DISCRETE_INFO: "离散信息",
+  NODE_BILL_INFO: "账单式表_信息",
+  NODE_BILL_CONTENT: "账单式表_数据",
+  NODE_FLOW_INFO: "流水式表_信息",
+  NODE_FLOW_INFO_EX: "流水式表_拓展信息",
+  NODE_FLOW_GROUP: "流水式表_分组信息",
+  NODE_FLOW_SEG_SUM: "流水式表_段统计信息",
+  NODE_FLOW_PAGE_SUM: "流水式表_页统计信息",
+  NODE_FLOW_COLUMN: "流水式表_列",
+  NODE_FLOW_CONTENT: "流水式表_数据",
+  PROP_MULTI_COLUMN: "多列显示数量",
+  PROP_FLOW_EX_DISPLAY_MODE: "流水拓展显示模式",
+  DISPLAY_MODE_INDEPENDENT: "单独模式",
+  DISPLAY_MODE_FOLLOW: "紧随模式",
+
+  NODE_MAIN_INFO: "主信息",
+  NODE_MAIN_INFO_RPT_NAME: "报表名称",
+  NODE_PAGE_INFO: "打印页面_信息",
+  NODE_PAGE_SIZE: "纸张宽高",
+  NODE_MARGINS: "页边距",
+  NODE_RPT_BIZ_TYPE: "报表业务类型",
+  NODE_BIZ_TYPE_AUDI: "审核类型",
+  NODE_BIZ_TYPE_SUM: "汇总类型",
+  NODE_BIZ_TYPE_DETAIL: "明细类型",
+
+  NODE_MAP_DATA_HANDLE_INFO: "映射数据预处理",
+  PROP_DATA_KEY: "映射数据对象",
+  PROP_PARENT_DATA_KEY: "父映射数据对象",
+  PROP_PARENT_CHILD_SORT_KEY: "父子排序键",
+  PROP_PARENT_SORT_KEYS: "父排序键值集",
+  PROP_CHILD_SORT_KEYS: "子排序键值集",
+  PROP_OTHER_SUB_SORT: "其他子排序",
+  PROP_OTHER_SUB_FILTER: "其他子过滤",
+  PROP_HANDLE_TYPE: "预处理类型",
+  PROP_FILTER_KEYS: "过滤键值集",
+  PROP_FILTER_TOP_BILLS_NODES: "清单顶节点集",
+  PROP_FILTER_OTHER_BILLS_NODES: "其他清单节点集",
+  PROP_FILTER_COMPARE_OBJ: "compareObjKey",
+  PROP_FILTER_COMPARE_OBJ_KEY: "compareObjIdKey",
+  PROP_FILTER_COMPARE_VAL: "compareValue",
+  PROP_FILTER_CONDITION: "判断条件",
+  PROP_HANDLE_TYPE_FILTER: "过滤",
+  PROP_HANDLE_TYPE_SUM: "合计",
+  PROP_HANDLE_TYPE_SORT: "排序",
+  PROP_HANDLE_TYPE_ADD_DUMMY: "增加Dummy数据",
+  PROP_HANDLE_TYPE_ADJUST: "数据调整",
+  PROP_HANDLE_TYPE_BILLS_DATA_MOVE: "量材数据转移",
+  PROP_HANDLE_TYPE_COMPONENT_MOVE: "组成物数据转移",
+  PROP_HANDLE_TYPE_COMPONENT_REPLACEMENT: "组成物替换",
+  PROP_HANDLE_TYPE_PRECISION: "合计精度",
+  PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS: "转化工程量清单",
+  PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_SORT_TYPE: "工程量清单排序类型",
+  PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_DATA_TYPE: "工程量清单数据类型",
+
+  PROP_ADJUST_COLLECTION: "数据调整集",
+  PROP_ADJUST_ACTION: "action",
+  PROP_ADJUST_ACTION_VAL: "actionValue",
+  PROP_DUMMY_COLLECTION: "Dummy数据集",
+  PROP_DUMMY_VAL: "Dummy数据对象值",
+  PROP_FREQUENCY: "频率",
+  PROP_GRP_KEYS: "GrpKeyIds",
+  PROP_SORT_TYPE: "排序方式",
+  PROP_SORT_TYPE_SELF_DEFINE_LOGIC: "自定义逻辑",
+  PROP_SORT_KEYS: "排序键值集",
+  PROP_SUM_GROUP_KEYS: "分组键值集",
+  PROP_SUM_SUM_KEYS: "统计键值集",
+  PROP_SUM_CALC_AHEAD: "统计前计算",
+  PROP_SUM_CACL_TYPE: "计算类型",
+  PROP_FIELD_EXP_MAP: "mapExpression",
+  PROP_PRECISION: "Precision",
+  PROP_FIXED_PRECISION_AMT: "fixedPrecisionNum",
+  PROP_FIELD_EXP_FIXED_MAP: "fixedMapExpression",
+  PROP_FIELD_EXP_FLEXIBLE_MAP: "flexibleMapExpression",
+  PROP_FLEXIBLE_REF_FILED_ID: "flexibleRefFieldID",
+
+  NODE_FONT_COLLECTION: "font_collection",
+  NODE_STYLE_COLLECTION: "style_collection",
+  NODE_CONTROL_COLLECTION: "control_collection",
+
+  PROP_ID: "ID",
+  PROP_AD_HOC_DATA: "data_field",
+  PROP_CMN_HEIGHT: "CommonHeight",
+  PROP_CMN_WIDTH: "CommonWidth",
+  PROP_BAND_NAME: "BandName",
+  PROP_BAND_NORMAL_ONLY: "normalOnly",
+  PROP_BAND_EX_ONLY: "exOnly",
+  PROP_BAND_EX_JOIN_AFTER: "isJoinAfter",
+
+  PROP_UNITS: "单位",
+  PROP_PAGE_SIZE: "页规格",
+  PROP_ORIENTATION: "方向",
+  PROP_LEFT: "Left",
+  PROP_RIGHT: "Right",
+  PROP_TOP: "Top",
+  PROP_BOTTOM: "Bottom",
+  PROP_DATA_TYPE: "DataType",
+  PROP_NAME: "Name",
+  PROP_DFT_VALUE: "Default_Value",
+  PROP_EXPRESSION: "expression",
+  PROP_RUN_TYPE: "run_type",
+  PROP_BORDER_STYLE: "border_style",
+  PROP_POSITION: "Position",
+  PROP_HIDDEN: "Hidden",
+  PROP_IS_SERIAL: "isSerial",
+  PROP_IS_MERGE: "isMerge",
+  PROP_COMBINE_TYPE: "combineType",
+  PROP_IS_AUTO_HEIGHT: "isAutoHeight",
+  PROP_FONT: "font",
+  PROP_CONTROL: "control",
+  PROP_STYLE: "style",
+  PROP_VALUE: "Value",
+  PROP_LABEL: "Label",
+  PROP_AREA: "area",
+  PROP_DISCRETE_FIELDS: "discrete_field_s",
+  PROP_FLOW_FIELDS: "flow_field_s",
+  PROP_BILL_FIELDS: "bill_field_s",
+  PROP_CROSS_FIELDS: "cross_field_s",
+  PROP_CROSS_DISPLAY_ORDER: "cross_display_order",
+  PROP_GROUP_FIELDS: "group_field_s", //用来分组的指标(如按清单、定额etc...)
+  PROP_GROUP_LINES: "group_lines", //显示分组行,因分组的特殊性,分组的数据当成流水数据一样(行高相同),group_lines里的每一条数据占用流水的一整行,里面再细分(指标/text)
+  PROP_GROUP_SUM_KEYS: "SumKey_S",
+  PROP_SUM_KEY: "SumKey",
+  PROP_SUM_FIELDS: "sum_field_s",
+  PROP_TEXTS: "text_s",
+  PROP_TEXT: "text",
+  PROP_PARAMS: "param_s",
+  PROP_FIELD_ID: "FieldID",
+  PROP_PARAM_ID: "ParamID",
+  PROP_PREFIX: "Prefix",
+  PROP_SUFFIX: "Suffix",
+  PROP_FORMAT: "Format",
+
+  PROP_SHOW_ZERO: "ShowZero",
+  PROP_EXTENSION_TYPE: "ExtType",
+
+  PROP_CALCULATION: "CalculationType",
+  PROP_H_CALCULATION: "H_CalculationType",
+  PROP_V_CALCULATION: "V_CalculationType",
+  PROP_FIT_AREA: "isFitArea",
+
+  IDX_LEFT: 0,
+  IDX_TOP: 1,
+  IDX_RIGHT: 2,
+  IDX_BOTTOM: 3,
+
+  BAND_PROP_NAME: "Name",
+  BAND_PROP_MERGE_BAND: "MergeBand",
+  BAND_PROP_STYLE: "style",
+  BAND_PROP_CONTROL: "control",
+  BAND_PROP_HEIGHT: "Height",
+  BAND_PROP_WIDTH: "Width",
+  BAND_PROP_DISPLAY_TYPE: "DisplayType",
+  BAND_PROP_ALIGNMENT: "Alignment",
+  BAND_PROP_MERGE_BORDER: "MergeBorder",
+  BAND_PROP_SUB_BANDS: "band_s",
+
+  MEASUREMENT: {
+    PIXEL: ["像素点", "象素点", "PIXEL"],
+    CM: ["厘米", "CM"],
+    INCH: ["英寸", "INCH"],
+  },
+
+  PROP_IS_ID: "isID",
+  PROP_ID_SEQ: "IDSeq",
+
+  TAB_FIELD_PROP_SORT: "Sort",
+  TAB_FIELD_PROP_SORT_VAL_NOSORT: "no_sort",
+  TAB_FIELD_PROP_SORT_VAL_ASC: "ascend",
+  TAB_FIELD_PROP_SORT_VAL_DESC: "descend",
+
+  DATA_DISCRETE_DATA: "discrete_data",
+  DATA_MASTER_DATA: "master_data",
+  DATA_DETAIL_DATA: "detail_data",
+  DATA_MASTER_DATA_EX: "master_data_ex",
+  DATA_DETAIL_DATA_EX: "detail_data_ex",
+
+  BLANK_FIELD_INDEX: -10,
+  BLANK_VALUE_INDEX: -100,
+  BLANK_PAGE_VALUE_INDEX: -200,
+
+  PROP_SEG_GRP_IDX: "segGrpRecStartIdx",
+  PROP_PRE_ADD_GRP_REC_INFO: "preAddPageGrpInfo",
+  PROP_INSERTED_GRP_REC: "insertedGrpRecAmt",
+  PROP_GRP_LINES: "group_lines_amt",
+
+  RUN_TYPE_BEFORE_ANALYZING: "before_analyzing",
+  RUN_TYPE_BEFORE_PAGING: "before_paging",
+  RUN_TYPE_BEFORE_OUTPUT: "before_output",
+  RUN_TYPE_BEFORE_COMBINE: "before_combine",
+  RUN_TYPE_AFTER_COMBINE: "after_combine",
+
+  RUN_TYPE_BEFORE_GROUP_TEXT_OUT: "before_group_text_output",
+
+  RUN_TYPE_RESET_CROSS_COLUMNS: "reset_cross_columns",
+
+  PAGE_STATUS: [
+    "EveryPage",
+    "FirstPage",
+    "LastPage",
+    "SegmentStart",
+    "SegmentEnd",
+    "Group",
+    "CrossRowEnd",
+    "CrossColEnd",
+  ],
+
+  CONTROL_PROPS: [
+    "Shrink",
+    "ShowZero",
+    "Horizon",
+    "Vertical",
+    "Wrap",
+    "VerticalForExcel",
+    "ShrinkFirst",
+    "CloseOutput",
+  ],
+  CONTROL_PROP_IDX_SHRINK: 0,
+  CONTROL_PROP_IDX_SHOW_ZERO: 1,
+  CONTROL_PROP_IDX_HORIZON: 2,
+  CONTROL_PROP_IDX_VERTICAL: 3,
+  CONTROL_PROP_IDX_WRAP: 4,
+  CONTROL_PROP_IDX_VERTICAL_EXCEL: 5,
+  CONTROL_PROP_IDX_SHRINK_FIRST: 6,
+  CONTROL_PROP_IDX_CLOSE_OUTPUT: 7,
+  BORDER_STYLE_PROPS: ["LineWeight", "DashStyle", "Color"],
+  PROP_LINE_WEIGHT: "LineWeight",
+  PROP_DASH_STYLE: "DashStyle",
+  PROP_COLOR: "Color",
+  FONT_PROPS: [
+    "Name",
+    "FontHeight",
+    "FontColor",
+    "FontBold",
+    "FontItalic",
+    "FontUnderline",
+    "FontStrikeOut",
+    "FontAngle",
+  ],
+  FONT_PROP_IDX_NAME: 0,
+  FONT_PROP_IDX_HEIGHT: 1,
+  FONT_PROP_IDX_COLOR: 2,
+  FONT_PROP_IDX_BOLD: 3,
+  FONT_PROP_IDX_ITALIC: 4,
+  FONT_PROP_IDX_UNDERLINE: 5,
+  FONT_PROP_IDX_STRIKEOUT: 6,
+  FONT_PROP_IDX_ANGLE: 7,
+
+  STATUS_NORMAL: 0,
+  STATUS_REPORT_START: 1,
+  STATUS_REPORT_END: 2,
+  STATUS_SEGMENT_START: 3,
+  STATUS_SEGMENT_END: 4,
+  STATUS_GROUP: 5,
+  STATUS_CROSS_ROW_END: 6,
+  STATUS_CROSS_COL_END: 7,
+
+  LAYOUT: ["Top", "Bottom", "Left", "Right", "Fulfill"],
+  LAYOUT_TOP: 0,
+  LAYOUT_BOTTOM: 1,
+  LAYOUT_LEFT: 2,
+  LAYOUT_RIGHT: 3,
+  LAYOUT_FULFILL: 4,
+
+  OUTPUT_ALIGN: {
+    H: ["left", "center", "right"],
+    V: ["top", "center", "bottom"],
+  },
+  H_ALIGN_IDX_LEFT: 0,
+  H_ALIGN_IDX_CENTER: 1,
+  H_ALIGN_IDX_RIGHT: 2,
+  V_ALIGN_IDX_TOP: 0,
+  V_ALIGN_IDX_CENTER: 1,
+  V_ALIGN_IDX_BOTTOM: 2,
+
+  CAL_TYPE: ["percentage", "abstract"],
+  CAL_TYPE_PERCENTAGE: 0,
+  CAL_TYPE_ABSTRACT: 1,
+
+  EVENT_TYPE: ["GRP_ON_CREATE", "FLOW_CONTENT_ON_CREATE"],
+  EVENT_IDX_GRP_ON_CREATE: 0,
+  EVENT_IDX_FLOW_CONTENT_ON_CREATE: 1,
+
+  PAGE_ORIENTATION_V_FIRST: 0,
+  PAGE_ORIENTATION_H_FIRST: 1,
+
+  ORIENTATION_PORTRAIT: "PORTRAIT",
+  ORIENTATION_LANDSCAPE: "LANDSCAPE",
+  ORIENTATION_PORTRAIT_CHN: "纵向",
+  ORIENTATION_LANDSCAPE_CHN: "横向",
+  SIZE_A3: [11.69, 16.54],
+  SIZE_A4: [8.27, 11.69],
+  SIZE_A5: [5.83, 8.27],
+  SIZE_B5: [6.93, 9.84],
+  SIZE_LETTER: [8.5, 11.0],
+  SIZE_LEGAL: [8.5, 14.0],
+  SIZE_16K: [7.75, 10.75],
+  SIZE_EXECUTIVE: [7.25, 10.5],
+
+  OUTPUT_OFFSET: [2, 2, 1, 3],
+  OFFSET_IDX_LEFT: 0,
+  OFFSET_IDX_RIGHT: 1,
+  OFFSET_IDX_TOP: 2,
+  OFFSET_IDX_BOTTOM: 3,
+
+  PROP_PAGE_SEQ: "page_seq",
+  PROP_PAGE_MERGE_BORDER: "page_merge_border",
+  PROP_CELLS: "cells",
+
+  PAGING_OPTION_NORMAL: "normal",
+  PAGING_OPTION_INFINITY: "infinity",
+
+  OUTPUT_TYPE_NORMAL: "normal",
+  OUTPUT_TYPE_SVG: "svg",
+  OUTPUT_TYPE_PDF: "pdf",
+  OUTPUT_TYPE_EXCEL: "excel",
+
+  DISPLAY_VAL_TYPE_NORMAL: 0,
+  DISPLAY_VAL_TYPE_GROUP: 1,
+  DISPLAY_VAL_TYPE_AUTO_HEIGHT: 2,
+
+  TYPE_FOLLOW_MODE: 1,
+
+  PAGE_SELF_DEFINE: "自定义",
+  PAGE_SPECIAL_MERGE_POS: "page_merge_pos",
+
+  PAGES_SIZE_STR: [
+    "A3",
+    "A4",
+    "A5",
+    "B5",
+    "LETTER",
+    "LEGAL",
+    "EXECUTIVE",
+    "16K",
+  ],
+  PAGES_SIZE_IDX: [8, 9, 11, 13, 1, 5, 7, 93],
+  PAGES_SIZE: [
+    [11.69, 16.54],
+    [8.27, 11.69],
+    [5.83, 8.27],
+    [6.93, 9.84],
+    [8.5, 11.0],
+    [8.5, 14.0],
+    [7.25, 10.5],
+    [7.25, 10.5],
+  ],
+
+  HUNDRED_PERCENT: 100.0,
+
+  VERTICAL_ANGLE: "90",
+  ANTI_VERTICAL_ANGLE: "-90",
+  VERTICAL_ANGLE_INT: 90,
+  ANTI_VERTICAL_ANGLE_INT: -90,
+
+  LAST_DEF: "",
 };

+ 2 - 39
public/web/tree_sheet/tree_sheet_controller.js

@@ -91,42 +91,6 @@ var TREE_SHEET_CONTROLLER = {
             return nodes;
         };
 
-        controller.prototype.insertByDatas = function (datas) {
-            let nodes = [], that = this, sels = this.sheet.getSelections();
-            if (this.tree) {
-                nodes = this.tree.insertByDatas(datas);
-            }
-            let length = nodes.length;
-            if (nodes.length > 0) {
-                TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
-                    that.sheet.addRows(nodes[0].serialNo(), length);
-                    TREE_SHEET_HELPER.refreshTreeNodeData(that.setting, that.sheet, nodes, false);
-                    that.setTreeSelected(nodes[0]);
-                    that.sheet.setSelection(nodes[0].serialNo(), sels[0].col, 1, 1);
-                    //that.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center);
-                });
-            }
-            return nodes;
-        };
-
-        controller.prototype.insertByDatas = function (datas) {
-            let nodes = [], that = this, sels = this.sheet.getSelections();
-            if (this.tree) {
-                nodes = this.tree.insertByDatas(datas);
-            }
-            let length = nodes.length;
-            if (nodes.length > 0) {
-                TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
-                    that.sheet.addRows(nodes[length - 1].serialNo(), length);
-                    TREE_SHEET_HELPER.refreshTreeNodeData(that.setting, that.sheet, nodes, false);
-                    that.setTreeSelected(nodes[length - 1]);
-                    that.sheet.setSelection(nodes[length - 1].serialNo(), sels[0].col, 1, 1);
-                    //that.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center);
-                });
-            }
-            return nodes;
-        };
-
 
         controller.prototype.insertByID = function (ID) {
             var newNode = null, that = this, sels = this.sheet.getSelections();
@@ -209,9 +173,8 @@ var TREE_SHEET_CONTROLLER = {
                             rowCount = rowCount + node.posterityCount() + 1;
                         }
                         that.sheet.deleteRows(sels[0].row, rowCount);
-                        const locateRow = that.tree.items.length <= sels[0].row ? that.tree.items.length - 1 : sels[0].row;
-                        that.setTreeSelected(that.tree.items[locateRow]);
-                        that.sheet.setSelection(locateRow, sels[0].col, 1, sels[0].colCount);
+                        that.setTreeSelected(that.tree.items[sels[0].row]);
+                        that.sheet.setSelection(sels[0].row, sels[0].col, 1, sels[0].colCount);
                     });
                 }
             }

+ 1 - 25
web/maintain/bills_lib/css/main.css

@@ -281,28 +281,4 @@ body {
     pointer-events: none;
     opacity: .65;
     color:#666;
-}
-
-.search-container {
-    position: relative;
-    display: inline-block;
-  }
-  
-  .icon-input {
-    padding: 2px 16px 2px 6px; /* 右侧留出32px图标空间 */
-    width: 160px;
-  }
-  
-  .search-icon {
-    position: absolute;
-    right: 12px;
-    top: 50%;
-    transform: translateY(-50%);
-    color: #666;
-    pointer-events: none; /* 防止图标阻挡输入框点击 */
-  }
-  .next-btn{
-      height: 30px;
-      padding: 6px;
-      font-size: 14px;
-  }
+}

+ 1 - 98
web/maintain/bills_lib/html/qingdan.html

@@ -9,7 +9,6 @@
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/maintain/bills_lib/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
-    <link rel="stylesheet" href="/lib/jquery-contextmenu/jquery.contextMenu.css">
     <!--spread-->
     <link rel="stylesheet" href="/lib/spreadjs/sheets/css/gc.spread.sheets.sc.css">
     <link rel="stylesheet" href="/lib/codemirror/codemirror.css">
@@ -66,17 +65,6 @@
                           <li class="nav-item">
                               <a class="nav-link text-primary lock-btn-control" doing="false" fcsOnBills="true" canMove="false" id="downMove" href="javascript: void(0);"><i class="fa fa-arrow-down" aria-hidden="true"></i>下移</a>
                           </li>
-                          <li class="nav-item">
-                            <div class="search-container">
-                                <input type="text" placeholder="输入后按回车查找..." id="searchInput" class="icon-input">
-                                <i class="fa fa-search search-icon"></i>
-                            </div> 
-                        </li>
-                        <li class="nav-item" id="searchResult" style="display: none;">
-                            搜索结果:<span id="searchCount">0</span>  
-                            <a class="btn btn-primary next-btn" doing="false" canMove="false" id="search-pre" href="javascript: void(0);">上一个</a> 
-                            <a class="btn btn-primary next-btn" doing="false" canMove="false" id="search-next" href="javascript: void(0);">下一个</a> 
-                        </li>
                       </ul>
                   </div>
                 </nav>
@@ -352,21 +340,16 @@
     <%include ../../../common/html/uploadImg.html %>
     <!-- JS. -->
     <script src = "/lib/spreadjs/sheets/gc.spread.sheets.all.11.1.2.min.js"></script>
-    <script src = "/lib/localforage/localforage.min.js"></script>
-    <script src="/public/common_util.js"></script>
     <script>GC.Spread.Sheets.LicenseKey =  '<%- LicenseKey %>';</script>
     <script src="/public/web/uuid.js"></script>
     <script src="/lib/jquery/jquery.min.js"></script>
     <script src="/lib/tether/tether.min.js"></script>
-    <script src="/lib/jquery-contextmenu/jquery.contextMenu.min.js"></script>
-    <script src="/lib/jquery-contextmenu/jquery.ui.position.js"></script>
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script src="/web/maintain/bills_lib/scripts/global.js"></script>
     <script src="/public/web/PerfectLoad.js"></script>
     <script src="/public/web/common_ajax.js"></script>
     <script src="/public/web/lock_util.js"></script>
     <script src="/public/web/sheet/sheet_common.js"></script>
-    <script type="text/javascript" src="/public/web/sheet/sheet_data_helper.js"></script>
     <script src="/web/maintain/bills_lib/scripts/set_sheets.js"></script>
     <script src="/web/maintain/bills_lib/scripts/bills_lib_ajax.js"></script>
     <!--idTree-->
@@ -476,84 +459,6 @@
             dbController.delete(controller, btnDelete, totalJobs, totalItems);
             $('#delAlert').modal('hide');
         });
-
-        function isMatch(bill,searchInput){
-            searchInput = searchInput.toLowerCase().trim()
-            const billName = bill.data.name? bill.data.name.toLowerCase():''; 
-            const code = bill.data.code? bill.data.code.toLowerCase():''; 
-            return billName.includes(searchInput) || code.includes(searchInput);
-        }
-
-
-        function locateBill(bill){
-            if(bill){
-                controller.setTreeSelected(bill);
-                controller.sheet.setSelection(bill.serialNo(), 1, 1, 1); 
-                controller.sheet.showRow(bill.serialNo(), GC.Spread.Sheets.VerticalPosition.center);
-            }
-        }
-
-        $('#searchInput').on('keypress', function(e) {
-            // 检查是否按下的是 Enter 键(keyCode 13 或 which 13)
-            if (e.which === 13 || e.keyCode === 13) {
-                const searchValue = $(this).val().toLowerCase().trim();
-                if(searchValue){
-                    const controller = dbController.controller;
-                    let select = null;
-                    let count =0
-                    for(const bill of controller.tree.items){
-                       if(isMatch(bill,searchValue)){
-                          if(select===null) select=bill   
-                          count++;                    
-                        }
-                    }
-                    locateBill(select);   
-                    $('#searchCount').text(count); 
-                    $('#searchResult').show();     
-                }else{
-                    $('#searchResult').hide();
-                }    
-            }
-        });
-
-
-        $('#search-next').click(function(){
-            const searchValue = $('#searchInput').val().toLowerCase().trim();
-            if(searchValue){
-                const controller = dbController.controller;
-                const selected = controller.tree.selected;
-                if(selected){
-                    const index = controller.tree.items.indexOf(selected)+1;
-                    if(index>=controller.tree.items.length) return ;
-                    for(let i=index ;i<controller.tree.items.length;i++){
-                        if(isMatch(controller.tree.items[i],searchValue)){
-                            locateBill(controller.tree.items[i]);
-                            break;
-                        }
-                    }
-                } 
-            } 
-        });
-
-        $('#search-pre').click(function(){
-            const searchValue = $('#searchInput').val().toLowerCase().trim();
-            if(searchValue){
-                const controller = dbController.controller;
-                const selected = controller.tree.selected;
-                if(selected){
-                    const index = controller.tree.items.indexOf(selected)-1;
-                    if(index<0) return ;
-                    for(let i=index ;i>=0;i--){
-                        if(isMatch(controller.tree.items[i],searchValue)){
-                            locateBill(controller.tree.items[i]);
-                            break;
-                        }
-                    }
-                } 
-            } 
-        });
-
-
         btnDelete.click(function(){
             if(btnDelete.attr('doing') === 'false' && btnDelete.attr('fcsOnBills') === 'true'){
                 $('#delAlert').modal('show');
@@ -676,7 +581,6 @@
         let kindComboList = kindList.map((data) => data.name);
         let kindCol = setting.cols.findIndex((data) => data.data.field === 'kind');
         setCombo(billsSheet, kindCol, kindComboList);
-        onContextmenuOpr(billsSpread, controller);
     }
 
     function switchFcs(controller, billsSheet, billsSpread, jobsSheet, itemsSheet){
@@ -966,9 +870,8 @@
         sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, function (sender, args) {
             sheetBillsDatas = tools.getsheetDatas(sheet, 'bills', controller);
             let maxCol = args.cellRange.col + args.cellRange.colCount - 1;
-            let maxRow = args.cellRange.row + args.cellRange.rowCount - 1;
             //复制的列数超过正确的列数,不可复制
-            if(maxCol >= billsLibSetting.cols.length || maxRow >= controller.tree.items.length){
+            if(maxCol >= billsLibSetting.cols.length){
                 args.cancel = true;
             }
         });

+ 46 - 277
web/maintain/bills_lib/scripts/db_controller.js

@@ -47,273 +47,6 @@ function getNewBIlls(controller, rowCount, billsLibId) {
   return { insertBills, updatePreData };
 }
 
-// 创建清单
-const createBills = (controller, btn, insertBills, updatePreData, isInsertByDatas) => {
-  billsAjax.createBills(
-    userAccount,
-    billsLibId,
-    updatePreData,
-    insertBills,
-    function () {
-      if (updatePreData) {
-        const node = controller.tree.findNode(updatePreData.ID);
-        if (node) {
-          Object.assign(node.data, updatePreData);
-        }
-      }
-      // 显示的时候,类别和固定ID转换为名称显示
-      const kindMap = {};
-      kindList.forEach(item => {
-        kindMap[item.value] = item.name;
-      });
-      const flagMap = {};
-      BillsFixedFlagList.forEach(item => {
-        flagMap[item.value] = item.name;
-      });
-      insertBills.forEach(bill => {
-        if (bill.kind) {
-          bill.kind = kindMap[bill.kind] || '';
-        }
-        if (bill.fixedFlag) {
-          bill.fixedFlag = flagMap[bill.fixedFlag] || '';
-        }
-      })
-      const treeData = insertBills.map((item) => ({
-        type: "new",
-        data: item,
-      }));
-      const newNodes = isInsertByDatas ? controller.insertByDatas(insertBills) : controller.m_insert(treeData);
-      newNodes.forEach(n => {
-        n.jobs = [];
-        n.items = [];
-        n.designs = [];
-        controller.sheet.setTag(
-          n.serialNo(),
-          0,
-          n.getID()
-        );
-      });
-      sheetBillsDatas = tools.getsheetDatas(
-        controller.sheet,
-        "bills",
-        controller
-      );
-      if (btn) {
-        tools.btnAction(btn);
-        btn.attr("doing", "false");
-      }
-      controller.sheet.getParent().focus(true);
-    }
-  );
-}
-
-// 获取需要复制的节点(与第一个节点同层的所有节点,包括后代)
-const getCopyNodes = (controller) => {
-  const { tree, sheet } = controller;
-  const selection = sheet.getSelections()[0];
-  const nodes = [];
-  const firstNode = tree.items[selection.row];
-  if (!firstNode) {
-    return [];
-  }
-  const firstNodeDepth = firstNode.depth();
-  for (let i = 0; i < selection.rowCount; i++) {
-    const row = selection.row + i;
-    const node = tree.items[row];
-    if (node && node.depth() === firstNodeDepth) {
-      nodes.push(node);
-    }
-  }
-  const rst = [];
-  nodes.forEach(node => {
-    const allNodes = [node, ...node.getPosterity()];
-    allNodes.forEach(n => {
-      if (!rst.includes(n)) {
-        rst.push(n);
-      }
-    })
-  });
-  return rst;
-}
-
-// 复制整块
-const copyBlock = async (controller) => {
-  try {
-    $.bootstrapLoading.start();
-    const nodes = getCopyNodes(controller);
-    const bills = [];
-    nodes.forEach(node => {
-      const bill = {};
-      Object.keys(node.data).forEach(key => {
-        if (typeof node.data[key] !== 'object') {
-          bill[key] = node.data[key];
-          bill.ID = node.getID();
-          bill.ParentID = node.getParentID();
-          bill.NexSiblingID = node.getNextSiblingID();
-        }
-      });
-      bills.push(bill);
-    });
-    await localforage.setItem('billsBlock', bills);
-    console.log(bills);
-  } catch (error) {
-    alert(error.message);
-  }
-  $.bootstrapLoading.end();
-}
-
-// 设置节点的前三层信息
-const setPasteSectionInfo = (tree, bills) => {
-  const IDMap = {};
-  tree.items.forEach(item => {
-    IDMap[item.getID()] = { ID: item.getID(), ParentID: item.getParentID(), NexSiblingID: item.getNextSiblingID() }; // 树操作后可能有缓存问题,data里的ID还没变
-  });
-  bills.forEach(bill => {
-    IDMap[bill.ID] = bill;
-  });
-  const getThreeParentIDs = (bill) => {
-    const parentIDs = [];
-    let cur = bill;
-    for (let i = 0; i < 3; i++) {
-      const parent = IDMap[cur.ParentID];
-      if (parent) {
-        parentIDs.push(parent.ID);
-        cur = parent;
-      } else {
-        break;
-      }
-    }
-    return parentIDs.reverse();
-  };
-  bills.forEach(bill => {
-    const parentIDs = getThreeParentIDs(bill);
-    const sectionInfo = { first: parentIDs[0] || null, second: parentIDs[1] || null, third: parentIDs[2] || null };
-    bill.sectionInfo = sectionInfo;
-  });
-}
-
-// 获取粘贴整块数据
-const getPasteData = async (controller) => {
-  const bills = await localforage.getItem('billsBlock');
-  if (!bills || !bills.length) {
-    throw new Error('请先复制整块!');
-  }
-  const { tree } = controller;
-  const selected = tree.selected;
-  if (!selected) {
-    throw new Error('请选中节点!');
-  }
-  tree.resetID(bills, uuid.v1);
-  // 粘贴到选中节点的最末子项
-  let updatePreData = null;
-  const lastChild = selected.lastChild();
-  const firstBill = bills[0];
-  if (lastChild) {
-    updatePreData = { ID: lastChild.getID(), NextSiblingID: firstBill.ID };
-  }
-  let lastRoot = firstBill;
-  const kindMap = {};
-  kindList.forEach(item => {
-    kindMap[item.name] = item.value;
-  });
-  const flagMap = {};
-  BillsFixedFlagList.forEach(item => {
-    flagMap[item.name] = item.value;
-  });
-  const firstParentID = firstBill.ParentID;
-  bills.forEach(bill => {
-    bill.billsLibId = billsLibId;
-    bill.jobs = [];
-    bill.items = [];
-    bill.designs = [];
-    if (bill.kind) {
-      bill.kind = kindMap[bill.kind] || undefined;
-    }
-    if (bill.fixedFlag) {
-      bill.fixedFlag = flagMap[bill.fixedFlag] || undefined;
-    }
-    if (bill.ParentID === firstParentID) {
-      bill.ParentID = selected.getID();
-      lastRoot = bill;
-    }
-  });
-  if (lastRoot) {
-    lastRoot.NexSiblingID = -1;
-  }
-  setPasteSectionInfo(tree, bills);
-  return { insertBills: bills, updatePreData };
-}
-
-// 粘贴整块
-const pasteBlock = async (controller) => {
-  try {
-    $.bootstrapLoading.end();
-    const { insertBills, updatePreData } = await getPasteData(controller);
-    if (insertBills.length) {
-      createBills(controller, undefined, insertBills, updatePreData, true);
-    }
-    controller.event.refreshBaseActn(controller.tree);
-  } catch (error) {
-    alert(error.message);
-  }
-  $.bootstrapLoading.end();
-}
-
-
-// 右键
-const onContextmenuOpr = (workBook, controller) => {
-  //右键菜单
-  $.contextMenu({
-    selector: "#spreadBills",
-    build: function ($triggerElement, e) {
-      //控制允许右键菜单在哪个位置出现
-      let target = SheetDataHelper.safeRightClickSelection(
-        $triggerElement,
-        e,
-        workBook
-      );
-      let bill = controller.tree.items[target.row] || null;
-      controller.setTreeSelected(bill);
-      if (target.hitTestType === 3) {
-        return {
-          callback: function () { },
-          items: {
-            copyBlock: {
-              name: "复制整块",
-              disabled: function () {
-                const inValidCell =
-                  !commonUtil.isDef(target.row) ||
-                  !commonUtil.isDef(target.col);
-                const inValidData = target.row >= controller.tree.items.length;
-                return locked || inValidCell || inValidData;
-              },
-              icon: "fa-copy",
-              callback: function (key, opt) {
-                copyBlock(controller);
-              },
-            },
-            pasteBlock: {
-              name: "粘贴整块",
-              disabled: function () {
-                const inValidCell =
-                  !commonUtil.isDef(target.row) ||
-                  !commonUtil.isDef(target.col);
-                const inValidData = target.row >= controller.tree.items.length;
-                return locked || inValidCell || inValidData;
-              },
-              icon: "fa-paste",
-              callback: function (key, opt) {
-                pasteBlock(controller);
-              },
-            },
-          },
-        };
-      } else {
-        return false;
-      }
-    },
-  });
-};
 var dbController = {
   controller: null,
   currentEditData: null,
@@ -325,7 +58,44 @@ var dbController = {
       rowCount,
       billsLibId
     );
-    createBills(controller, btn, insertBills, updatePreData);
+    billsAjax.createBills(
+      userAccount,
+      billsLibId,
+      updatePreData,
+      insertBills,
+      function () {
+        if (updatePreData) {
+          const node = controller.tree.findNode(updatePreData.ID);
+          if (node) {
+            Object.assign(node.data, updatePreData);
+          }
+        }
+
+        const treeData = insertBills.map((item) => ({
+          type: "new",
+          data: item,
+        }));
+        const newNodes = controller.m_insert(treeData);
+        newNodes.forEach(n => {
+          n.jobs = [];
+          n.items = [];
+          console.log(n.serialNo(), n.getID());
+          controller.sheet.setTag(
+            n.serialNo(),
+            0,
+            n.getID()
+          );
+        });
+        sheetBillsDatas = tools.getsheetDatas(
+          controller.sheet,
+          "bills",
+          controller
+        );
+        tools.btnAction(btn);
+        btn.attr("doing", "false");
+        controller.sheet.getParent().focus(true);
+      }
+    );
   },
 
   upLevel: function (controller, btn) {
@@ -409,8 +179,8 @@ var dbController = {
         );
 
         billsAjax.upLevel(userAccount, billsLibId, updateData, function () {
-          tools.btnAction(btn);
-          btn.attr('doing', 'false');
+          //tools.btnAction(btn);
+          //btn.attr('doing', 'false');
           for (let upLevelNode of selNodes) {
             controller.setTreeSelected(upLevelNode);
             controller.upLevel();
@@ -426,8 +196,8 @@ var dbController = {
             billsAjax.updateSectionInfo(
               tools.getUpdateSectionData(toUpSectionNodes),
               function () {
-                /* tools.btnAction(btn);
-                btn.attr("doing", "false"); */
+                tools.btnAction(btn);
+                btn.attr("doing", "false");
               }
             );
           }
@@ -483,8 +253,8 @@ var dbController = {
         );
 
         billsAjax.downLevel(userAccount, billsLibId, updateData, function () {
-          tools.btnAction(btn);
-          btn.attr('doing', 'false');
+          //tools.btnAction(btn);
+          //btn.attr('doing', 'false');
           for (let downNode of selNodes) {
             controller.setTreeSelected(downNode);
             controller.downLevel();
@@ -500,8 +270,8 @@ var dbController = {
             billsAjax.updateSectionInfo(
               tools.getUpdateSectionData(toUpSectionNodes),
               function () {
-                /* tools.btnAction(btn);
-                btn.attr("doing", "false"); */
+                tools.btnAction(btn);
+                btn.attr("doing", "false");
               }
             );
           }
@@ -511,7 +281,6 @@ var dbController = {
   },
 
   delete: function (controller, btn, totalJobs, totalItems) {
-    debugger;
     tools.btnClose(btn);
     btn.attr("doing", "true");
     var node = controller.tree.selected;

+ 10 - 33
web/maintain/price_info_lib/js/priceArea.js

@@ -1,7 +1,5 @@
 // 地区表
 const AREA_BOOK = (() => {
-  // 地区表格锁
-  let areaLocked = true;
   const cache = areaList;
   const setting = {
     header: [
@@ -11,7 +9,7 @@ const AREA_BOOK = (() => {
   };
   // 初始化表格
   const workBook = initSheet($('#area-spread')[0], setting);
-  lockUtil.lockSpreads([workBook], locked || areaLocked);
+  lockUtil.lockSpreads([workBook], locked);
   workBook.options.allowExtendPasteRange = false;
   workBook.options.allowUserDragDrop = false;
   workBook.options.allowUserDragFill = false;
@@ -57,18 +55,13 @@ const AREA_BOOK = (() => {
       });
     }
   }
-
-  const bindEdit = () => {
-    sheet.bind(GC.Spread.Sheets.Events.ValueChanged, function (e, info) {
-      const changedCells = [{ row: info.row, col: info.col }];
-      handleEdit(changedCells);
-    });
-    sheet.bind(GC.Spread.Sheets.Events.RangeChanged, function (e, info) {
-      handleEdit(info.changedCells);
-    });
-  };
-
-  bindEdit();
+  sheet.bind(GC.Spread.Sheets.Events.ValueChanged, function (e, info) {
+    const changedCells = [{ row: info.row, col: info.col }];
+    handleEdit(changedCells);
+  });
+  sheet.bind(GC.Spread.Sheets.Events.RangeChanged, function (e, info) {
+    handleEdit(info.changedCells);
+  });
 
   const curArea = { ID: null, name: '' };
   // 焦点变更处理
@@ -146,27 +139,11 @@ const AREA_BOOK = (() => {
           }
           return {
             items: {
-              lock: {
-                name: areaLocked ? '解锁' : '锁定',
-                icon: areaLocked ? "fa-unlock" : 'fa-lock',
-                disabled: function () {
-                  return locked;
-                },
-                callback: function (key, opt) {
-                  areaLocked = !areaLocked;
-                  if (locked || areaLocked) {
-                    lockUtil.lockSpreads([workBook], locked || areaLocked);
-                  } else {
-                    lockUtil.unLockSpreads([workBook]);
-                    bindEdit();
-                  }
-                }
-              },
               insert: {
                 name: '新增',
                 icon: "fa-arrow-left",
                 disabled: function () {
-                  return locked || areaLocked;
+                  return locked;
                 },
                 callback: function (key, opt) {
                   insert();
@@ -176,7 +153,7 @@ const AREA_BOOK = (() => {
                 name: '删除',
                 icon: "fa-arrow-left",
                 disabled: function () {
-                  return locked || areaLocked || !cache[target.row];
+                  return locked || !cache[target.row];
                 },
                 callback: function (key, opt) {
                   del();

+ 61 - 4
web/maintain/report/html/rpt_tpl_dtl_info.html

@@ -50,16 +50,73 @@
                     <div class="input-group-addon">计税方式</div>
                     <select class="form-control input-sm" id="element_flags_select" onchange="zTreeOprObj.onChangeFlag('taxType', this)"><option value ="NA">N/A</option><option value ="1">一般计税</option><option value ="2">简易计税</option></select>
                 </div>
-                <div class="input-group col-3">
+                <div class="input-group col-2">
                     <div class="input-group-addon">建设项目汇总类型</div>
-                    <select class="form-control input-sm" id="element_constructSumFlags_select" onchange="zTreeOprObj.onChangeFlag('constructSumType', this)"><option value ="NA">N/A</option><option value ="constructSum">建设项目汇总</option></select>
+                    <select class="form-control input-sm" id="element_constructSumFlags_select" onchange="zTreeOprObj.onChangeFlag('constructSumType', this)"><option value ="NA">N/A</option><option value ="constructSum">建设项目汇总</option><option value="singleSum">单项项目汇总</option></select>
                 </div>
-                <div class="input-group col-2">
+                <div class="input-group col-3">
                     <div class="input-group-addon">审核对比类型</div>
                     <select class="form-control input-sm" id="element_constructSumFlags_audit" onchange="zTreeOprObj.onChangeFlag('auditType', this)"><option value ="NA">N/A</option><option value ="audit_compare">审核对比</option><option value="project_compare">步骤对比</option></select>
                 </div>
+                <div class="input-group col-4">
+                    <div class="input-group-addon">项目汇总级别</div>
+                    <select class="form-control input-sm" id="element_sumLv_flags"
+                        onchange="zTreeOprObj.onChangeFlag('sumLevelType', this)">
+                        <option value="NA">N/A</option>
+                        <option value="construct">建设项目级别</option>
+                        <option value="Single">单项工程级别</option>
+                        <option value="custom">用户自选工程</option>
+                        <option value="unitPriceContrast">单价偏差对比</option>
+                        <option value="stageUnitContrast">审核项目对比(一对一)</option>
+                        <option value="stageUnitFontContrast">项目对比(当前单位对其他单位)</option>
+                        <option value="stageUnitBackContrast">项目对比(其他单位对当前单位)</option>
+                        <option value="stageContrast">前后阶段对比(当前项目对其他项目)</option>
+                        <option value="stageGLJContrast">前后阶段工料机对比(当前项目对其他项目)</option>
+                        <option value="stageBackContrast">审核项目对比(其他项目对当前项目)</option>
+                        <option value="stageMultipleUnitContrast">审核项目对比(多对多)</option>
+                        <option value="complexUnit">跨项目自选工程(3个建设项目单位工程,一对一对一)</option>
+                        <option value="complexConstruct">跨项目汇总对比(3个建设项目,一对多对多)</option>
+                        <option value="complexConstructMultiple">各阶段项目对比(3个建设项目,多对多对多)</option>
+                        <option value="complexSelfConstructMultiple">各阶段项目对比(当前建设项目对本阶段对其他阶段)</option>
+                        <option value="businessSummary">多个业务汇总</option>
+                        <option value="changeProjectSummary">变更业务对比汇总</option>
+                        <option value="changeProjectGljSummary">变更业务工料机对比汇总</option>
+                        <option value="compareConstruct">对比建设项目</option>
+                    </select>
+                </div>
             </div>
-            <p>
+            <p><div class="row p-3">
+                <div class="input-group col-3">
+                    <div class="input-group-addon">审核对比数据级别</div>
+                    <select id="element_contrastType_select" class="form-control"
+                        onchange="zTreeOprObj.onChangeFlag('contrastType', this)">
+                        <option value="NA">N/A</option>
+                        <option value="chapter">项目节</option>
+                        <option value="bill">清单</option>
+                        <option value="quantities">工程量明细</option>
+                    </select>
+                </div>
+                <div class="input-group col-2">
+                    <div class="input-group-addon">存在数据级别</div>
+                    <select id="element_existLevel_select" class="form-control"
+                        onchange="zTreeOprObj.onChangeFlag('existLevel', this)">
+                        <option value="NA">N/A</option>
+                        <option value="true">是</option>
+                        <option value="false">否</option>
+                    </select>
+                </div>
+                <div class="input-group col-2">
+                    <div class="input-group-addon">汇总规则设置</div>
+                    <select id="element_summaryRule_select" class="form-control"
+                        onchange="zTreeOprObj.onChangeFlag('existSummaryRule', this)">
+                        <option value="NA">N/A</option>
+                        <option value="true">是</option>
+                        <option value="false">否</option>
+                    </select>
+                </div>
+            </div></p>
+            
+            
             <div class="row">
                 <div class="input-group col-2">
                     <div class="input-group-addon">概算类型</div>

+ 2 - 0
web/maintain/report/html/rpt_tpl_dtl_pre_hdl.html

@@ -33,6 +33,8 @@
             <%include ./rpt_tpl_dtl_pre_hdl_adjust.html %>
             <!--dummy数据处理-->
             <%include ./rpt_tpl_dtl_pre_hdl_addDummy.html %>
+            <!--工程量清单数据处理-->
+            <%include ./rpt_tpl_dtl_pre_hdl_change_quantities_bills.html %>
         </div>
     </div>
 </div>

+ 32 - 0
web/maintain/report/html/rpt_tpl_dtl_pre_hdl_change_quantities_bills.html

@@ -0,0 +1,32 @@
+<div id="div_quantities_bills_sort_bar">
+    <div class="form-group row" id="div_quantities_bills_sort_type">
+        <div class="input-group col-5">
+            <div class="input-group-addon">排序方式</div>
+            <select class="form-control input-sm" id="select_quantities_bills_sort_types"
+                onchange="preHandleQuantitiesBillsSortObj.onQuantitiesBillsSortTypeChange(this)">
+                <option value="onlyBill">清单排序合并</option>
+                <option value="onlyBillWithChapt">清单排序合并(含章节小计)</option>
+                <option value="all">同项目节下排序合并</option>
+                <option value="onlyChapt">只有章节汇总数据</option>
+                <option value="auditComparison">审核对比合并排序(流水)</option>
+                <option value="onlyBillAuditComparison">工程量清单审核对比合并排序(流水)</option>
+                <option value="summaryAudit">汇总对比合并排序(交叉)</option>
+                <option value="stageContrast">阶段对比合并排序(流水)</option>
+                <option value="constructAudit">跨建设项目对比合并排序(交叉)</option>
+                <option value="onlyBillStageContrast">工程量清单阶段对比合并排序(流水)</option>
+            </select>
+        </div>
+    </div>
+    <div class="form-group row" id="div_quantities_bills_type">
+        <div class="input-group col-5">
+            <div class="input-group-addon">处理对象</div>
+            <select class="form-control input-sm" id="select_quantities_bills_types"
+                onchange="preHandleQuantitiesBillsSortObj.onQuantitiesBillsTypesChange(this)">
+                <option value="normal">普通</option>
+                <option value="cross">交叉数据</option>
+                <option value="flow">流水数据</option>
+            </select>
+        </div>
+    </div>
+   
+</div>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 639 - 633
web/maintain/report/js/cfg_const.js


+ 14 - 7
web/maintain/report/js/rpt_tpl_calculation.js

@@ -28,12 +28,13 @@ let calculationTreeOprObj = {
     },
     buildRunType: function() {
         let et = $("#exprRunType");
-        et.append("<option value='" + JV.RUN_TYPE_BEFORE_PAGING + "'>预运行</option>");
-        et.append("<option value='" + JV.RUN_TYPE_BEFORE_OUTPUT + "'>实时运行</option>");
-        et.append("<option value='" + JV.RUN_TYPE_BEFORE_ANALYZING + "'>数据分析前运行</option>");
-        et.append("<option value='" + JV.RUN_TYPE_BEFORE_COMBINE + "'>合并单元格前事件</option>");
-        et.append("<option value='" + JV.RUN_TYPE_AFTER_COMBINE + "'>合并单元格后事件</option>");
-        et.append("<option value='" + JV.RUN_TYPE_BEFORE_GROUP_TEXT_OUT + "'>分组text输出前事件</option>");
+        et.append(`<option value="${JV.RUN_TYPE_BEFORE_PAGING}">默认运行</option>`);
+        et.append(`<option value="${JV.RUN_TYPE_BEFORE_OUTPUT}">每页实时运行</option>`);
+        et.append(`<option value="${JV.RUN_TYPE_BEFORE_ANALYZING}">数据分析前运行</option>`);
+        et.append(`<option value="${JV.RUN_TYPE_BEFORE_COMBINE}">合并单元格前事件</option>`);
+        et.append(`<option value="${JV.RUN_TYPE_AFTER_COMBINE}">合并单元格后事件</option>`);
+        et.append(`<option value="${JV.RUN_TYPE_BEFORE_GROUP_TEXT_OUT}">分组text输出前事件</option>`);
+        et.append(`<option value="${JV.RUN_TYPE_RESET_CROSS_COLUMNS}">重设交叉表列数</option>`);
     },
     buildTreeData: function (rptTpl) {
         let me = this, rst = {"Name": "计算式", items: []};
@@ -103,8 +104,14 @@ let calculationTreeOprObj = {
                 $("#exprRunType")[0].selectedIndex = 2;
             } else if (treeNode[JV.PROP_RUN_TYPE] === JV.RUN_TYPE_BEFORE_COMBINE) {
                 $("#exprRunType")[0].selectedIndex = 3;
-            } else {
+            } else if (treeNode[JV.PROP_RUN_TYPE] === JV.RUN_TYPE_AFTER_COMBINE) {
                 $("#exprRunType")[0].selectedIndex = 4;
+            } else if (treeNode[JV.PROP_RUN_TYPE] === JV.RUN_TYPE_BEFORE_GROUP_TEXT_OUT) {
+                $("#exprRunType")[0].selectedIndex = 5;
+            } else if (treeNode[JV.PROP_RUN_TYPE] === JV.RUN_TYPE_RESET_CROSS_COLUMNS) {
+                $("#exprRunType")[0].selectedIndex = 6;
+            } else {
+                $("#exprRunType")[0].selectedIndex = 2;
             }
             $("#exprFormat")[0].value = (treeNode["format"])?treeNode["format"]:"";
             $("#exprContent")[0].value = treeNode[JV.PROP_EXPRESSION];

+ 491 - 400
web/maintain/report/js/rpt_tpl_field_map.js

@@ -4,428 +4,519 @@
  * 包括:可映射指标、报表已选指标集合、离散独立指标和参数
  */
 
-'use strict'
+"use strict";
 
 let fieldMapTreeOprObj = {
-    treeObj : null,
-    currentNode: null,
-    dataTypeDef: ['string', 'int32', 'int64', 'double', 'currency', 'date', 'image', 'object'],
-    iniTree: function(rptTpl) {
-        var me = this;
-        let fieldMapList = me.buildTreeData(rptTpl);
-        me.treeObj = $.fn.zTree.init($("#field_map_tree_reversed"), fieldMapSetting, fieldMapList);
-        me.treeObj.expandAll(true);
-        let topNodes = me.treeObj.getNodes();
-        for (let node of topNodes) {
-            me.treeObj.setChkDisabled(node, true);
-        }
-    },
-    buildTreeData: function (rptTpl) {
-        let rst = [];
-        let private_setSubFields = function (parent, fieldList) {
-            for (let field of fieldList) {
-                if (field[JV.PROP_IS_ID]) {
-                    field.checked = true;
-                }
-                field.Title = "ID: " + field[JV.PROP_ID];
-                parent.items.push(field);
-            }
+  treeObj: null,
+  currentNode: null,
+  dataTypeDef: [
+    "string",
+    "int32",
+    "int64",
+    "double",
+    "currency",
+    "date",
+    "image",
+    "object",
+  ],
+  iniTree: function (rptTpl) {
+    var me = this;
+    let fieldMapList = me.buildTreeData(rptTpl);
+    me.treeObj = $.fn.zTree.init(
+      $("#field_map_tree_reversed"),
+      fieldMapSetting,
+      fieldMapList
+    );
+    me.treeObj.expandAll(true);
+    let topNodes = me.treeObj.getNodes();
+    for (let node of topNodes) {
+      me.treeObj.setChkDisabled(node, true);
+    }
+  },
+  buildTreeData: function (rptTpl) {
+    let rst = [];
+    let private_setSubFields = function (parent, fieldList) {
+      for (let field of fieldList) {
+        if (field[JV.PROP_IS_ID]) {
+          field.checked = true;
         }
+        field.Title = "ID: " + field[JV.PROP_ID];
+        parent.items.push(field);
+      }
+    };
 
-        if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS]) {
-            rst.push({Name: JV.NODE_DISCRETE_FIELDS, items: [], isParent: true});
-            private_setSubFields(rst[rst.length - 1], rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS])
-        }
-        if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]) {
-            rst.push({Name: JV.NODE_MASTER_FIELDS, items: [], isParent: true});
-            private_setSubFields(rst[rst.length - 1], rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS])
-        }
-        if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]) {
-            rst.push({Name: JV.NODE_DETAIL_FIELDS, items: [], isParent: true});
-            private_setSubFields(rst[rst.length - 1], rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS])
-        }
+    if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS]) {
+      rst.push({ Name: JV.NODE_DISCRETE_FIELDS, items: [], isParent: true });
+      private_setSubFields(
+        rst[rst.length - 1],
+        rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS]
+      );
+    }
+    if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]) {
+      rst.push({ Name: JV.NODE_MASTER_FIELDS, items: [], isParent: true });
+      private_setSubFields(
+        rst[rst.length - 1],
+        rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]
+      );
+    }
+    if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]) {
+      rst.push({ Name: JV.NODE_DETAIL_FIELDS, items: [], isParent: true });
+      private_setSubFields(
+        rst[rst.length - 1],
+        rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]
+      );
+    }
 
-        return rst;
-    },
-    copySelectedFieldList: function () {
-        let me = fieldMapTreeOprObj, rst = [];
-        if (me.treeObj) {
-            let nodes = me.treeObj.getNodes();
-            for (let node of nodes) {
-                let item = {Name: node.Name, items: [], isParent: true, Title: ""};
-                if (node.items) {
-                    for (let subNode of node.items) {
-                        let subItem = me.createMapFieldByNode(subNode);
-                        item.items.push(subItem);
-                    }
-                }
-                rst.push(item)
-            }
-        }
-        return rst;
-    },
-    onClick: function (event,treeId,treeNode) {
-        let me = fieldMapTreeOprObj;
-        me.currentNode = treeNode;
-        //then refresh the field map tab properties
-        //数据类型
-        // switch (me.dataTypeDef.indexOf(treeNode[JV.PROP_DATA_TYPE])) {
-        //     case 0:
-        //         $("#fieldDataTypeSelection").get(0).selectedIndex = 0;
-        //         break;
-        //     case 1:
-        //     case 2:
-        //     case 3:
-        //     case 4:
-        //         $("#fieldDataTypeSelection").get(0).selectedIndex = 1;
-        //         break;
-        //     case 5:
-        //         $("#fieldDataTypeSelection").get(0).selectedIndex = 2;
-        //         break;
-        //     case 6:
-        //         $("#fieldDataTypeSelection").get(0).selectedIndex = 3;
-        //         break;
-        //     default:
-        //         $("#fieldDataTypeSelection").get(0).selectedIndex = 0;
-        //         break;
-        // }
-        //映射指标
-    },
-    onBeforeRemove: function(treeId, treeNode){
-        if (treeNode.level === 0) {
-            return false;
+    return rst;
+  },
+  copySelectedFieldList: function () {
+    let me = fieldMapTreeOprObj,
+      rst = [];
+    if (me.treeObj) {
+      let nodes = me.treeObj.getNodes();
+      for (let node of nodes) {
+        let item = { Name: node.Name, items: [], isParent: true, Title: "" };
+        if (node.items) {
+          for (let subNode of node.items) {
+            let subItem = me.createMapFieldByNode(subNode);
+            item.items.push(subItem);
+          }
         }
-        return true;
-    },
-    beforeRename: function(treeId, treeNode, newName, isCancel) {
-        if (isCancel) {
-            return true;
-        }
-        if (treeNode.level === 0) {
-            return false;
+        rst.push(item);
+      }
+    }
+    return rst;
+  },
+  onClick: function (event, treeId, treeNode) {
+    let me = fieldMapTreeOprObj;
+    me.currentNode = treeNode;
+    //then refresh the field map tab properties
+    //数据类型
+    // switch (me.dataTypeDef.indexOf(treeNode[JV.PROP_DATA_TYPE])) {
+    //     case 0:
+    //         $("#fieldDataTypeSelection").get(0).selectedIndex = 0;
+    //         break;
+    //     case 1:
+    //     case 2:
+    //     case 3:
+    //     case 4:
+    //         $("#fieldDataTypeSelection").get(0).selectedIndex = 1;
+    //         break;
+    //     case 5:
+    //         $("#fieldDataTypeSelection").get(0).selectedIndex = 2;
+    //         break;
+    //     case 6:
+    //         $("#fieldDataTypeSelection").get(0).selectedIndex = 3;
+    //         break;
+    //     default:
+    //         $("#fieldDataTypeSelection").get(0).selectedIndex = 0;
+    //         break;
+    // }
+    //映射指标
+  },
+  onBeforeRemove: function (treeId, treeNode) {
+    if (treeNode.level === 0) {
+      return false;
+    }
+    return true;
+  },
+  beforeRename: function (treeId, treeNode, newName, isCancel) {
+    if (isCancel) {
+      return true;
+    }
+    if (treeNode.level === 0) {
+      return false;
+    }
+    return true;
+  },
+  onBeforeDrop: function (treeId, treeNodes, targetNode, moveType) {
+    let rst = true;
+    if (
+      treeId === "selectable_field_tree_reversed" ||
+      targetNode.level === 0 ||
+      moveType === "inner"
+    ) {
+      rst = false;
+    } else {
+      //
+    }
+    return rst;
+  },
+  onRemove: function (e, treeId, treeNode) {
+    //
+  },
+  onRename: function (e, treeId, treeNode, isCancel) {
+    //
+  },
+  extractFieldMaps: function (rptTpl) {
+    let me = this;
+    for (let rootNode of me.treeObj.getNodes()) {
+      rptTpl[JV.NODE_FIELD_MAP][rootNode.Name] = [];
+      let idSeq = 1;
+      for (let mappingFieldNode of rootNode.items) {
+        let item = me.createMapFieldByNode(mappingFieldNode);
+        if (mappingFieldNode.checked) {
+          item[JV.PROP_IS_ID] = true;
+          item[JV.PROP_ID_SEQ] = idSeq;
+          idSeq++;
         }
-        return true;
-    },
-    onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
-        let rst = true;
-        if (treeId === 'selectable_field_tree_reversed' || targetNode.level === 0 || moveType === 'inner') {
-            rst = false;
+        rptTpl[JV.NODE_FIELD_MAP][rootNode.Name].push(item);
+      }
+    }
+  },
+  createMapFieldByNode: function (node) {
+    let rst = {},
+      me = this;
+    me.copyMapFieldNode(node, rst);
+    return rst;
+  },
+  copyMapFieldNode: function (src, dest) {
+    dest[JV.PROP_ID] = src[JV.PROP_ID];
+    dest[JV.PROP_NAME] = src[JV.PROP_NAME];
+    dest[JV.PROP_DATA_TYPE] = src[JV.PROP_DATA_TYPE];
+    dest.mapExpression = src.mapExpression;
+    dest.adHocFormula = src.adHocFormula;
+    dest.descr = src.descr;
+    dest.Title = "ID: " + src[JV.PROP_ID];
+    if (src.Precision) {
+      dest.Precision = src.Precision;
+    }
+  },
+  refreshFields: function () {
+    let me = this;
+    if (me.treeObj && selectableFiledTreeOprObj.treeObj) {
+      let selectableFields = [];
+      let private_get_all_selectable_fields = function (fieldNode) {
+        if (fieldNode.isParent) {
+          for (let dtlSF of fieldNode.items) {
+            private_get_all_selectable_fields(dtlSF);
+          }
         } else {
-            //
-        }
-        return rst;
-    },
-    onRemove: function (e, treeId, treeNode) {
-        //
-    },
-    onRename: function (e, treeId, treeNode, isCancel) {
-        //
-    },
-    extractFieldMaps: function (rptTpl) {
-        let me = this;
-        for (let rootNode of me.treeObj.getNodes()) {
-            rptTpl[JV.NODE_FIELD_MAP][rootNode.Name] = [];
-            let idSeq = 1;
-            for (let mappingFieldNode of rootNode.items) {
-                let item = me.createMapFieldByNode(mappingFieldNode);
-                if (mappingFieldNode.checked) {
-                    item[JV.PROP_IS_ID] = true;
-                    item[JV.PROP_ID_SEQ] = idSeq;
-                    idSeq++;
-                }
-                rptTpl[JV.NODE_FIELD_MAP][rootNode.Name].push(item);
-            }
+          selectableFields.push(fieldNode);
         }
-    },
-    createMapFieldByNode: function (node) {
-        let rst = {}, me = this;
-        me.copyMapFieldNode(node, rst);
-        return rst;
-    },
-    copyMapFieldNode: function (src, dest) {
-        dest[JV.PROP_ID] = src[JV.PROP_ID];
-        dest[JV.PROP_NAME] = src[JV.PROP_NAME];
-        dest[JV.PROP_DATA_TYPE] = src[JV.PROP_DATA_TYPE];
-        dest.mapExpression = src.mapExpression;
-        dest.adHocFormula = src.adHocFormula;
-        dest.descr = src.descr;
-        dest.Title = "ID: " + src[JV.PROP_ID];
-        if (src.Precision) {
-            dest.Precision = src.Precision;
-        }
-    },
-    refreshFields: function () {
-        let me = this;
-        if (me.treeObj && selectableFiledTreeOprObj.treeObj) {
-            let selectableFields = [];
-            let private_get_all_selectable_fields = function (fieldNode) {
-                if (fieldNode.isParent) {
-                    for (let dtlSF of fieldNode.items) {
-                        private_get_all_selectable_fields(dtlSF);
-                    }
-                } else {
-                    selectableFields.push(fieldNode);
-                }
-            };
-            let selectableFieldNodes = selectableFiledTreeOprObj.treeObj.getNodes();
-            for (let subFn of selectableFieldNodes) {
-                private_get_all_selectable_fields(subFn);
-            }
-            let topNodes = me.treeObj.getNodes();
-            for (let node of topNodes) {
-                if (node.items && node.items.length > 0) {
-                    for (let dtl of node.items) {
-                        for (let sf of selectableFields) {
-                            if (sf.ID === dtl.ID) {
-                                me.copyMapFieldNode(sf, dtl);
-                                break;
-                            }
-                        }
-                    }
-                }
+      };
+      let selectableFieldNodes = selectableFiledTreeOprObj.treeObj.getNodes();
+      for (let subFn of selectableFieldNodes) {
+        private_get_all_selectable_fields(subFn);
+      }
+      let topNodes = me.treeObj.getNodes();
+      for (let node of topNodes) {
+        if (node.items && node.items.length > 0) {
+          for (let dtl of node.items) {
+            for (let sf of selectableFields) {
+              if (sf.ID === dtl.ID) {
+                me.copyMapFieldNode(sf, dtl);
+                break;
+              }
             }
+          }
         }
+      }
     }
+  },
+};
+
+const setNodeFieldID = (data) => {
+  if (data.items && data.items.length > 0) {
+    data.items.forEach((i) => {
+      setNodeFieldID(i);
+    });
+  } else {
+    data.Name = data.Name + "(" + data.ID + ")";
+  }
 };
 
 let selectableFiledTreeOprObj = {
-    treeObj : null,
-    currentNode: null,
-    iniTree: function() {
-        let me = this, params = {};
-        params.userId = userID;
-        CommonAjax.postEx("report_tpl_api/getMappingFields", params, 20000, true, function(result){
-                let showRst = [];
-                for (let item of result) {
-                    me.decorateMappingFieldList(item);
-                    if (item.items.length > 0) {
-                        showRst.push(item);
-                    }
-                }
-                me.treeObj = $.fn.zTree.init($("#selectable_field_tree_reversed"), selectableFieldSetting, showRst);
-                let nodes = me.treeObj.getNodes();
-                for (let node of nodes) {
-                    me.treeObj.expandNode(node, true, false);
-                }
-                // me.treeObj.expandAll(true);
-                showRst = null;
-            }, null, null
-        );
-    },
-    decorateMappingFieldList: function (rawMappingField) {
-        let me = this;
-        if (rawMappingField.items && rawMappingField.items.length > 0) {
-            for (const subMappingField of rawMappingField.items) {
-                me.decorateMappingFieldList(subMappingField);
-            }
-        } else {
-            rawMappingField.Title = "ID: " + rawMappingField[JV.PROP_ID];
-        }
-    },
-    onClick: function (event,treeId,treeNode) {
-        let me = fieldMapTreeOprObj;
-        me.currentNode = treeNode;
-    },
-    onBeforeDrag: function (treeId, treeNodes) {
-        let rst = true;
-        for (let node of treeNodes) {
-            if (node.level === 0) {
-                rst = false;
-                break;
-            }
-        }
-        return rst;
-    },
-    onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
-        let rst = true;
-        if (treeId === 'field_map_tree_reversed') {
-            if ( (targetNode.level === 0 && moveType !== 'inner') || (targetNode.level > 0 && moveType === 'inner')) {
-                rst = false;
-            }
-        } else {
-            rst = false;
+  treeObj: null,
+  currentNode: null,
+  iniTree: function () {
+    let me = this,
+      params = {};
+    params.userId = userID;
+    CommonAjax.postEx(
+      "report_tpl_api/getMappingFields",
+      params,
+      20000,
+      true,
+      function (result) {
+        let showRst = [];
+        for (let item of result) {
+          me.decorateMappingFieldList(item);
+          if (item.items.length > 0) {
+            setNodeFieldID(item);
+            showRst.push(item);
+          }
         }
-        return rst;
-    },
-    addDiyDom: function (treeId, treeNode) {
-        if (treeNode.level > 0) {
-            let aObj = $("#" + treeNode.tId + "_a");
-            if ($("#diyBtn_"+treeNode.ID).length>0) return;
-            let editStr = "<span>&nbsp(" + treeNode.DataType + ")</span>";
-            aObj.append(editStr);
-            let btn = $("#diyBtn_"+treeNode.ID);
-            if (btn) btn.bind("click", function(){alert("diy Button for " + treeNode.name);});
+        me.treeObj = $.fn.zTree.init(
+          $("#selectable_field_tree_reversed"),
+          selectableFieldSetting,
+          showRst
+        );
+        let nodes = me.treeObj.getNodes();
+        for (let node of nodes) {
+          me.treeObj.expandNode(node, true, false);
         }
+        // me.treeObj.expandAll(true);
+        showRst = null;
+      },
+      null,
+      null
+    );
+  },
+  decorateMappingFieldList: function (rawMappingField) {
+    let me = this;
+    if (rawMappingField.items && rawMappingField.items.length > 0) {
+      for (const subMappingField of rawMappingField.items) {
+        me.decorateMappingFieldList(subMappingField);
+      }
+    } else {
+      rawMappingField.Title = "ID: " + rawMappingField[JV.PROP_ID];
+    }
+  },
+  onClick: function (event, treeId, treeNode) {
+    let me = fieldMapTreeOprObj;
+    me.currentNode = treeNode;
+  },
+  onBeforeDrag: function (treeId, treeNodes) {
+    let rst = true;
+    for (let node of treeNodes) {
+      if (node.level === 0) {
+        rst = false;
+        break;
+      }
     }
+    return rst;
+  },
+  onBeforeDrop: function (treeId, treeNodes, targetNode, moveType) {
+    let rst = true;
+    if (treeId === "field_map_tree_reversed") {
+      if (
+        (targetNode.level === 0 && moveType !== "inner") ||
+        (targetNode.level > 0 && moveType === "inner")
+      ) {
+        rst = false;
+      }
+    } else {
+      rst = false;
+    }
+    return rst;
+  },
+  addDiyDom: function (treeId, treeNode) {
+    if (treeNode.level > 0) {
+      let aObj = $("#" + treeNode.tId + "_a");
+      if ($("#diyBtn_" + treeNode.ID).length > 0) return;
+      let editStr = "<span>&nbsp(" + treeNode.DataType + ")</span>";
+      aObj.append(editStr);
+      let btn = $("#diyBtn_" + treeNode.ID);
+      if (btn)
+        btn.bind("click", function () {
+          alert("diy Button for " + treeNode.name);
+        });
+    }
+  },
 };
 
 let discreteFieldParamTreeOprObj = {
-    treeObj : null,
-    currentNode: null,
-    local_idx : 12000,
-    iniTree: function(rptTpl) {
-        var me = this;
-        let fieldMapList = me.buildTreeData(rptTpl);
-        me.treeObj = $.fn.zTree.init($("#tpl_discrete_fields_params_reversed"), discreteFieldParamSetting, fieldMapList);
-        me.treeObj.expandAll(true);
-    },
-    buildTreeData: function(rptTpl){
-        let me = this, rst = [];
-        let disFieldNode = {Name: JV.NODE_NO_MAPPING_FIELDS, items: [], isParent: true, Title: ""};
-        let disParamNode = {Name: JV.NODE_DISCRETE_PARAMS, items: [], isParent: true, Title: ""};
-        rst.push(disFieldNode);
-        rst.push(disParamNode);
-        if (rptTpl[JV.NODE_NO_MAPPING_FIELDS] && rptTpl[JV.NODE_NO_MAPPING_FIELDS].length > 0) {
-            for (let df of rptTpl[JV.NODE_NO_MAPPING_FIELDS]) {
-                let node = {};
-                node[JV.PROP_ID] = df[JV.PROP_ID];
-                node[JV.PROP_FIELD_ID] = df[JV.PROP_ID];
-                node[JV.PROP_NAME] = df[JV.PROP_NAME];
-                node[JV.PROP_DATA_TYPE] = df[JV.PROP_DATA_TYPE];
-                node.Title = "ID: " + df[JV.PROP_ID];
-                disFieldNode.items.push(node);
-                if (parseInt(df[JV.PROP_ID]) >= me.local_idx) me.local_idx = parseInt(df[JV.PROP_ID]) + 1;
-            }
-        }
-        if (rptTpl[JV.NODE_DISCRETE_PARAMS]) {
-            for (let dp of rptTpl[JV.NODE_DISCRETE_PARAMS]) {
-                let node = {};
-                node[JV.PROP_ID] = dp[JV.PROP_ID];
-                node[JV.PROP_PARAM_ID] = dp[JV.PROP_ID];
-                node[JV.PROP_NAME] = dp[JV.PROP_NAME];
-                node[JV.PROP_DATA_TYPE] = dp[JV.PROP_DATA_TYPE];
-                node[JV.PROP_DFT_VALUE] = dp[JV.PROP_DFT_VALUE];
-                node.Title = "ID: " + dp[JV.PROP_ID];
-                disParamNode.items.push(node);
-                if (parseInt(dp[JV.PROP_ID]) >= me.local_idx) me.local_idx = parseInt(dp[JV.PROP_ID]) + 1;
-            }
-        }
-        return rst;
-    },
-    getAndModifyLocalIdx: function() {
-        let me = discreteFieldParamTreeOprObj, rst = me.local_idx;
-        me.local_idx++;
-        return rst;
-    },
-    addHoverDom: function(treeId, treeNode) {
-        let me = discreteFieldParamTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
-        if (treeNode.level > 0 || $("#addBtn_"+treeNode.tId).length > 0) return;
-        let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
-        sObj.after(addStr);
-        let btn = $("#addBtn_"+treeNode.tId);
-        if (btn) btn.bind("click", function(){
-            if (treeNode[JV.PROP_NAME] === JV.NODE_NO_MAPPING_FIELDS) {
-                let field = me.private_setup_dummy_discrete_field_node();
-                let newNodes = [field];
-                me.treeObj.addNodes(treeNode, -1, newNodes, true);
-            } else if (treeNode[JV.PROP_NAME] === JV.NODE_DISCRETE_PARAMS) {
-                let param = me.private_setup_dummy_discrete_param_node();
-                let newNodes = [param];
-                me.treeObj.addNodes(treeNode, -1, newNodes, true);
-            }
-        });
-    },
-    private_setup_dummy_discrete_field_node: function () {
-        let me = discreteFieldParamTreeOprObj, rst = {};
-        rst[JV.PROP_ID] = me.getAndModifyLocalIdx();
-        rst[JV.PROP_NAME] = "新离散指标";
-        rst[JV.PROP_DATA_TYPE] = "string";
-        rst.descr = "";
-        rst.Title = "ID: " + rst[JV.PROP_ID];
-        return rst;
-    },
-    private_setup_dummy_discrete_param_node: function () {
-        let me = discreteFieldParamTreeOprObj, rst = {};
-        rst[JV.PROP_ID] = me.getAndModifyLocalIdx();
-        rst[JV.PROP_NAME] = "新离散参数";
-        rst[JV.PROP_DATA_TYPE] = "string";
-        rst[JV.PROP_DFT_VALUE] = "";
-        rst.Title = "ID: " + rst[JV.PROP_ID];
-        return rst;
-    },
-    removeHoverDom: function(treeId, treeNode) {
-        $("#addBtn_"+treeNode.tId).unbind().remove();
-    },
-    onBeforeRemove: function(treeId, treeNode){
-        let rst = true;
-        if (treeNode.isParent) {
-            rst = false;
-        }
-        return rst;
-    },
-    beforeRename: function(treeId, treeNode, newName, isCancel) {
-        let rst = true;
-        if (treeNode.isParent && !isCancel) {
-            rst = false;
+  treeObj: null,
+  currentNode: null,
+  local_idx: 12000,
+  iniTree: function (rptTpl) {
+    var me = this;
+    let fieldMapList = me.buildTreeData(rptTpl);
+    me.treeObj = $.fn.zTree.init(
+      $("#tpl_discrete_fields_params_reversed"),
+      discreteFieldParamSetting,
+      fieldMapList
+    );
+    me.treeObj.expandAll(true);
+  },
+  buildTreeData: function (rptTpl) {
+    let me = this,
+      rst = [];
+    let disFieldNode = {
+      Name: JV.NODE_NO_MAPPING_FIELDS,
+      items: [],
+      isParent: true,
+      Title: "",
+    };
+    let disParamNode = {
+      Name: JV.NODE_DISCRETE_PARAMS,
+      items: [],
+      isParent: true,
+      Title: "",
+    };
+    rst.push(disFieldNode);
+    rst.push(disParamNode);
+    if (
+      rptTpl[JV.NODE_NO_MAPPING_FIELDS] &&
+      rptTpl[JV.NODE_NO_MAPPING_FIELDS].length > 0
+    ) {
+      for (let df of rptTpl[JV.NODE_NO_MAPPING_FIELDS]) {
+        let node = {};
+        node[JV.PROP_ID] = df[JV.PROP_ID];
+        node[JV.PROP_FIELD_ID] = df[JV.PROP_ID];
+        node[JV.PROP_NAME] = df[JV.PROP_NAME];
+        node[JV.PROP_DATA_TYPE] = df[JV.PROP_DATA_TYPE];
+        node.Title = "ID: " + df[JV.PROP_ID];
+        disFieldNode.items.push(node);
+        if (parseInt(df[JV.PROP_ID]) >= me.local_idx)
+          me.local_idx = parseInt(df[JV.PROP_ID]) + 1;
+      }
+    }
+    if (rptTpl[JV.NODE_DISCRETE_PARAMS]) {
+      for (let dp of rptTpl[JV.NODE_DISCRETE_PARAMS]) {
+        let node = {};
+        node[JV.PROP_ID] = dp[JV.PROP_ID];
+        node[JV.PROP_PARAM_ID] = dp[JV.PROP_ID];
+        node[JV.PROP_NAME] = dp[JV.PROP_NAME];
+        node[JV.PROP_DATA_TYPE] = dp[JV.PROP_DATA_TYPE];
+        node[JV.PROP_DFT_VALUE] = dp[JV.PROP_DFT_VALUE];
+        node.Title = "ID: " + dp[JV.PROP_ID];
+        disParamNode.items.push(node);
+        if (parseInt(dp[JV.PROP_ID]) >= me.local_idx)
+          me.local_idx = parseInt(dp[JV.PROP_ID]) + 1;
+      }
+    }
+    return rst;
+  },
+  getAndModifyLocalIdx: function () {
+    let me = discreteFieldParamTreeOprObj,
+      rst = me.local_idx;
+    me.local_idx++;
+    return rst;
+  },
+  addHoverDom: function (treeId, treeNode) {
+    let me = discreteFieldParamTreeOprObj,
+      sObj = $("#" + treeNode.tId + "_span");
+    if (treeNode.level > 0 || $("#addBtn_" + treeNode.tId).length > 0) return;
+    let addStr =
+      "<span class='button add' id='addBtn_" +
+      treeNode.tId +
+      "' title='新增子节点' onfocus='this.blur();'></span>";
+    sObj.after(addStr);
+    let btn = $("#addBtn_" + treeNode.tId);
+    if (btn)
+      btn.bind("click", function () {
+        if (treeNode[JV.PROP_NAME] === JV.NODE_NO_MAPPING_FIELDS) {
+          let field = me.private_setup_dummy_discrete_field_node();
+          let newNodes = [field];
+          me.treeObj.addNodes(treeNode, -1, newNodes, true);
+        } else if (treeNode[JV.PROP_NAME] === JV.NODE_DISCRETE_PARAMS) {
+          let param = me.private_setup_dummy_discrete_param_node();
+          let newNodes = [param];
+          me.treeObj.addNodes(treeNode, -1, newNodes, true);
         }
-        return rst;
-    },
-    onBeforeDrag: function (treeId, treeNodes) {
-        let rst = true;
-        for (let node of treeNodes) {
-            if (node.level === 0) {
-                rst = false;
-                break;
-            }
+      });
+  },
+  private_setup_dummy_discrete_field_node: function () {
+    let me = discreteFieldParamTreeOprObj,
+      rst = {};
+    rst[JV.PROP_ID] = me.getAndModifyLocalIdx();
+    rst[JV.PROP_NAME] = "新离散指标";
+    rst[JV.PROP_DATA_TYPE] = "string";
+    rst.descr = "";
+    rst.Title = "ID: " + rst[JV.PROP_ID];
+    return rst;
+  },
+  private_setup_dummy_discrete_param_node: function () {
+    let me = discreteFieldParamTreeOprObj,
+      rst = {};
+    rst[JV.PROP_ID] = me.getAndModifyLocalIdx();
+    rst[JV.PROP_NAME] = "新离散参数";
+    rst[JV.PROP_DATA_TYPE] = "string";
+    rst[JV.PROP_DFT_VALUE] = "";
+    rst.Title = "ID: " + rst[JV.PROP_ID];
+    return rst;
+  },
+  removeHoverDom: function (treeId, treeNode) {
+    $("#addBtn_" + treeNode.tId)
+      .unbind()
+      .remove();
+  },
+  onBeforeRemove: function (treeId, treeNode) {
+    let rst = true;
+    if (treeNode.isParent) {
+      rst = false;
+    }
+    return rst;
+  },
+  beforeRename: function (treeId, treeNode, newName, isCancel) {
+    let rst = true;
+    if (treeNode.isParent && !isCancel) {
+      rst = false;
+    }
+    return rst;
+  },
+  onBeforeDrag: function (treeId, treeNodes) {
+    let rst = true;
+    for (let node of treeNodes) {
+      if (node.level === 0) {
+        rst = false;
+        break;
+      }
+    }
+    return rst;
+  },
+  onBeforeDrop: function (treeId, treeNodes, targetNode, moveType) {
+    // let rst = false;
+    // if (targetNode.tId && targetNode.tId.indexOf("tpl_data_info_reversed") >= 0 && (!(targetNode.isParent && moveType !== 'inner')) ) {
+    //     if (targetNode.level === 0) {
+    //         if (targetNode.Name !== "离散信息" && moveType === 'inner') {
+    //             rst = true;
+    //         }
+    //     } else {
+    //         let parentNode = targetNode.getParentNode();
+    //         if (parentNode.Name === "离散信息") {
+    //             if (targetNode.Name === "Fields") {
+    //                 rst = true;
+    //             }
+    //         } else if (parentNode.Name === "Fields") {
+    //             rst = true;
+    //         }
+    //     }
+    // }
+    // return rst;
+  },
+  onRemove: function () {
+    //
+  },
+  onRename: function () {
+    //
+  },
+  extractFieldMaps: function (rptTpl) {
+    let me = this;
+    for (let rootNode of me.treeObj.getNodes()) {
+      if (rootNode[JV.PROP_NAME] === JV.NODE_NO_MAPPING_FIELDS) {
+        rptTpl[JV.NODE_NO_MAPPING_FIELDS] = [];
+        for (let fNode of rootNode.items) {
+          rptTpl[JV.NODE_NO_MAPPING_FIELDS].push(
+            me.createDiscreteFieldByNode(fNode)
+          );
         }
-        return rst;
-    },
-    onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
-        // let rst = false;
-        // if (targetNode.tId && targetNode.tId.indexOf("tpl_data_info_reversed") >= 0 && (!(targetNode.isParent && moveType !== 'inner')) ) {
-        //     if (targetNode.level === 0) {
-        //         if (targetNode.Name !== "离散信息" && moveType === 'inner') {
-        //             rst = true;
-        //         }
-        //     } else {
-        //         let parentNode = targetNode.getParentNode();
-        //         if (parentNode.Name === "离散信息") {
-        //             if (targetNode.Name === "Fields") {
-        //                 rst = true;
-        //             }
-        //         } else if (parentNode.Name === "Fields") {
-        //             rst = true;
-        //         }
-        //     }
-        // }
-        // return rst;
-    },
-    onRemove: function () {
-        //
-    },
-    onRename: function () {
-        //
-    },
-    extractFieldMaps: function (rptTpl) {
-        let me = this;
-        for (let rootNode of me.treeObj.getNodes()) {
-            if (rootNode[JV.PROP_NAME] === JV.NODE_NO_MAPPING_FIELDS) {
-                rptTpl[JV.NODE_NO_MAPPING_FIELDS] = [];
-                for (let fNode of rootNode.items) {
-                    rptTpl[JV.NODE_NO_MAPPING_FIELDS].push(me.createDiscreteFieldByNode(fNode));
-                }
-            } else if (rootNode[JV.PROP_NAME] === JV.NODE_DISCRETE_PARAMS) {
-                rptTpl[JV.NODE_DISCRETE_PARAMS] = [];
-                for (let pNode of rootNode.items) {
-                    rptTpl[JV.NODE_DISCRETE_PARAMS].push(me.createDiscreteParamByNode(pNode));
-                }
-            }
+      } else if (rootNode[JV.PROP_NAME] === JV.NODE_DISCRETE_PARAMS) {
+        rptTpl[JV.NODE_DISCRETE_PARAMS] = [];
+        for (let pNode of rootNode.items) {
+          rptTpl[JV.NODE_DISCRETE_PARAMS].push(
+            me.createDiscreteParamByNode(pNode)
+          );
         }
-    },
-    createDiscreteFieldByNode: function (node) {
-        let rst = {};
-        rst[JV.PROP_ID] = node[JV.PROP_ID];
-        rst[JV.PROP_NAME] = node[JV.PROP_NAME];
-        rst[JV.PROP_DATA_TYPE] = node[JV.PROP_DATA_TYPE];
-        rst.descr = node.descr;
-        return rst;
-    },
-    createDiscreteParamByNode: function (node) {
-        let rst = {};
-        rst[JV.PROP_ID] = node[JV.PROP_ID];
-        rst[JV.PROP_NAME] = node[JV.PROP_NAME];
-        rst[JV.PROP_DATA_TYPE] = node[JV.PROP_DATA_TYPE];
-        rst[JV.PROP_DFT_VALUE] = node[JV.PROP_DFT_VALUE];
-        return rst;
+      }
     }
-};
+  },
+  createDiscreteFieldByNode: function (node) {
+    let rst = {};
+    rst[JV.PROP_ID] = node[JV.PROP_ID];
+    rst[JV.PROP_NAME] = node[JV.PROP_NAME];
+    rst[JV.PROP_DATA_TYPE] = node[JV.PROP_DATA_TYPE];
+    rst.descr = node.descr;
+    return rst;
+  },
+  createDiscreteParamByNode: function (node) {
+    let rst = {};
+    rst[JV.PROP_ID] = node[JV.PROP_ID];
+    rst[JV.PROP_NAME] = node[JV.PROP_NAME];
+    rst[JV.PROP_DATA_TYPE] = node[JV.PROP_DATA_TYPE];
+    rst[JV.PROP_DFT_VALUE] = node[JV.PROP_DFT_VALUE];
+    return rst;
+  },
+};

+ 99 - 0
web/maintain/report/js/rpt_tpl_main.js

@@ -606,6 +606,10 @@ let zTreeOprObj = {
     let me = zTreeOprObj;
     zTreeOprObj.treeObj.checkNode(treeNodes[0], false, false);
     treeNodes[0].released = false;
+    // 拷贝后的uuid重复的问题
+    if (isCopy) {
+      treeNodes[0].UUID = `${new Date().getTime()}_${me.generateRandomString()}`;
+    }
     let targetTopNode = me.getParentNodeByNodeLevel(
       targetNode,
       NODE_LEVEL_COMPILATION_NEW
@@ -1318,6 +1322,8 @@ let zTreeOprObj = {
                 let val = me.currentNode.flags["constructSumType"];
                 if (val === "constructSum") {
                   $("#element_constructSumFlags_select")[0].selectedIndex = 1;
+                } else if (val === "singleSum") {
+                  $("#element_constructSumFlags_select")[0].selectedIndex = 2;
                 } else {
                   $("#element_constructSumFlags_select")[0].selectedIndex = 0;
                 }
@@ -1411,6 +1417,95 @@ let zTreeOprObj = {
               } else {
                 $("#element_Flags_tplType")[0].selectedIndex = 0;
               }
+
+              if (me.currentNode.flags.hasOwnProperty("sumLevelType")) {
+                let sumLvType = me.currentNode.flags["sumLevelType"];
+                if (sumLvType === "construct")
+                  $("#element_sumLv_flags")[0].selectedIndex = 1;
+                else if (sumLvType === "Single")
+                  $("#element_sumLv_flags")[0].selectedIndex = 2;
+                else if (sumLvType === "custom")
+                  $("#element_sumLv_flags")[0].selectedIndex = 3;
+                else if (sumLvType === "unitPriceContrast")
+                  $("#element_sumLv_flags")[0].selectedIndex = 4;
+                else if (sumLvType === "stageUnitContrast")
+                  $("#element_sumLv_flags")[0].selectedIndex = 5;
+                else if (sumLvType === "stageUnitFontContrast")
+                  $("#element_sumLv_flags")[0].selectedIndex = 6;
+                else if (sumLvType === "stageUnitBackContrast")
+                  $("#element_sumLv_flags")[0].selectedIndex = 7;
+                else if (sumLvType === "stageContrast")
+                  $("#element_sumLv_flags")[0].selectedIndex = 8;
+                else if (sumLvType === "stageGLJContrast")
+                  $("#element_sumLv_flags")[0].selectedIndex = 9;
+                else if (sumLvType === "stageBackContrast")
+                  $("#element_sumLv_flags")[0].selectedIndex = 10;
+                else if (sumLvType === "stageMultipleUnitContrast")
+                  $("#element_sumLv_flags")[0].selectedIndex = 11;
+                else if (sumLvType === "complexUnit")
+                  $("#element_sumLv_flags")[0].selectedIndex = 12;
+                else if (sumLvType === "complexConstruct")
+                  $("#element_sumLv_flags")[0].selectedIndex = 13;
+                else if (sumLvType === "complexConstructMultiple")
+                  $("#element_sumLv_flags")[0].selectedIndex = 14;
+                else if (sumLvType === "complexSelfConstructMultiple")
+                  $("#element_sumLv_flags")[0].selectedIndex = 15;
+                else if (sumLvType === "businessSummary")
+                  $("#element_sumLv_flags")[0].selectedIndex = 16;
+                else if (sumLvType === "changeProjectSummary")
+                  $("#element_sumLv_flags")[0].selectedIndex = 17;
+                else if (sumLvType === "changeProjectGljSummary")
+                  $("#element_sumLv_flags")[0].selectedIndex = 18;
+                else if (sumLvType === "compareConstruct")
+                  $("#element_sumLv_flags")[0].selectedIndex = 19;
+                else {
+                  $("#element_sumLv_flags")[0].selectedIndex = 0;
+                }
+                $("#outputDesignDataBar").show();
+                if (me.currentNode.flags.hasOwnProperty("outputDesignData")) {
+                  if (me.currentNode.flags.outputDesignData) {
+                    $("#outputDesignData").attr("checked", true);
+                  } else {
+                    $("#outputDesignData").attr("checked", false);
+                  }
+                }
+              } else {
+                $("#element_sumLv_flags")[0].selectedIndex = 0;
+              }
+              if (me.currentNode.flags.hasOwnProperty("contrastType")) {
+                let contrastType = me.currentNode.flags["contrastType"];
+                if (contrastType === "chapter")
+                  $("#element_contrastType_select")[0].selectedIndex = 1;
+                else if (contrastType === "bill")
+                  $("#element_contrastType_select")[0].selectedIndex = 2;
+                else if (contrastType === "quantities")
+                  $("#element_contrastType_select")[0].selectedIndex = 3;
+                else $("#element_contrastType_select")[0].selectedIndex = 0;
+              }
+              if (me.currentNode.flags.hasOwnProperty("existLevel")) {
+                let existLevel = me.currentNode.flags["existLevel"];
+                if (existLevel === "true") {
+                  $("#element_existLevel_select")[0].selectedIndex = 1;
+                } else if (existLevel === "false") {
+                  $("#element_existLevel_select")[0].selectedIndex = 2;
+                } else {
+                  $("#element_existLevel_select")[0].selectedIndex = 0;
+                }
+              } else {
+                $("#element_existLevel_select")[0].selectedIndex = 0;
+              }
+              if (me.currentNode.flags.hasOwnProperty("existSummaryRule")) {
+                let existSummaryRule = me.currentNode.flags["existSummaryRule"];
+                if (existSummaryRule === "true") {
+                  $("#element_summaryRule_select")[0].selectedIndex = 1;
+                } else if (existSummaryRule === "false") {
+                  $("#element_summaryRule_select")[0].selectedIndex = 2;
+                } else {
+                  $("#element_summaryRule_select")[0].selectedIndex = 0;
+                }
+              } else {
+                $("#element_summaryRule_select")[0].selectedIndex = 0;
+              }
             } else {
               $("#element_flags_select")[0].selectedIndex = 0;
               $("#element_constructSumFlags_select")[0].selectedIndex = 0;
@@ -1420,11 +1515,15 @@ let zTreeOprObj = {
               $("#element_Flags_budgetCalcType")[0].selectedIndex = 0;
               $("#element_Flags_tplType")[0].selectedIndex = 0;
               $("#element_prjFlags_select")[0].selectedIndex = 0;
+              $("#element_contrastType_select")[0].selectedIndex = 0;
+              $("#element_existLevel_select")[0].selectedIndex = 0;
+              $("#element_summaryRule_select")[0].selectedIndex = 0;
               // 清空工程类型
               $("#valuationSelector").hide();
               $("#element_prjFlags_select")[0].value = "";
               $("#element_prjFlags_selectStr")[0].value = "";
               $("#valuationSelector .mutiSelector li").removeClass("checked");
+              $("#element_sumLv_flags")[0].selectedIndex = 0;
             }
 
             if (

+ 74 - 0
web/maintain/report/js/rpt_tpl_pre_handle.js

@@ -327,6 +327,10 @@ let preHandleObj = {
     types.push({ Name: JV.PROP_HANDLE_TYPE_SUM, Title: "" });
     types.push({ Name: JV.PROP_HANDLE_TYPE_ADJUST, Title: "" });
     types.push({ Name: JV.PROP_HANDLE_TYPE_ADD_DUMMY, Title: "" });
+    types.push({
+      Name: JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS,
+      Title: "",
+    });
     // types.push({Name: "纯手工填写", Title: ""});
     me.typeTreeObj = $.fn.zTree.init(
       $("#pre_handle_type_reversed"),
@@ -411,6 +415,14 @@ let preHandleObj = {
           Dummy数据集: [],
         };
         break;
+      case JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS:
+        rst = {
+          Name: "预处理环节",
+          Title: "",
+          映射数据对象: "bills",
+          预处理类型: preHandleType,
+        };
+        break;
       default:
         rst = {
           Name: "预处理环节",
@@ -456,6 +468,10 @@ let preHandleObj = {
       case JV.PROP_HANDLE_TYPE_ADD_DUMMY:
         item[JV.PROP_DUMMY_COLLECTION] = [];
         break;
+      case JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS:
+        item[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_SORT_TYPE] = "all"; // 工程量清单排序
+        item[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_DATA_TYPE] = "bills"; // 工程量清单输出级别
+        break;
       default:
         item[JV.PROP_HANDLE_TYPE] = JV.PROP_HANDLE_TYPE_SORT;
         item[JV.PROP_SORT_TYPE] = "normal";
@@ -479,6 +495,10 @@ let preHandleObj = {
       preHandleAdjustObj.copyNode(src, dest);
     } else if (src[JV.PROP_HANDLE_TYPE] === JV.PROP_HANDLE_TYPE_ADD_DUMMY) {
       preHandleAddDummyObj.copyNode(src, dest);
+    } else if (
+      src[JV.PROP_HANDLE_TYPE] === JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS
+    ) {
+      preHandleQuantitiesBillsSortObj.copyNode(src, dest);
     }
   },
   private_set_title: function (node) {
@@ -526,6 +546,8 @@ let preHandleObj = {
           preHandleAdjustObj.refresh_node();
         } else if (typeNode[JV.PROP_NAME] === "增加Dummy数据") {
           preHandleAddDummyObj.refresh_node();
+        } else if (typeNode[JV.PROP_NAME] === "转化工程量清单") {
+          preHandleQuantitiesBillsSortObj.refresh_node();
         }
       }
     }
@@ -700,6 +722,11 @@ let preHandleObj = {
           case JV.PROP_HANDLE_TYPE_ADD_DUMMY:
             rst.push(preHandleAddDummyObj.extractTabFields(handleObj));
             break;
+          case JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS:
+            rst.push(
+              preHandleQuantitiesBillsSortObj.extractTabFields(handleObj)
+            );
+            break;
           default:
             break;
         }
@@ -1572,3 +1599,50 @@ let preHandleAddDummyObj = {
     return rst;
   },
 };
+let preHandleQuantitiesBillsSortObj = {
+  copyNode: function (src, dest) {
+    dest[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_SORT_TYPE] =
+      src.billSortType;
+    dest[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_DATA_TYPE] =
+      src.billSortData;
+  },
+  refresh_node: function () {
+    $("#div_quantities_bills_sort_bar")[0].style.display = "";
+    if (preHandleObj.currentNode) {
+      $("#select_quantities_bills_sort_types")[0].value =
+        preHandleObj.currentNode[
+          JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_SORT_TYPE
+        ] || "all";
+      $("#select_quantities_bills_types")[0].value =
+        preHandleObj.currentNode[
+          JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_DATA_TYPE
+        ] || "bills";
+    }
+  },
+  extractTabFields: function (handleObj) {
+    let me = preHandleQuantitiesBillsSortObj,
+      rst = {};
+    me.copyNode(handleObj, rst);
+    rst = {
+      预处理类型: "转化工程量清单",
+      映射数据对象: "bills",
+      billSortType:
+        handleObj[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_SORT_TYPE],
+      billSortData:
+        handleObj[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_DATA_TYPE],
+    };
+    return rst;
+  },
+  onQuantitiesBillsSortTypeChange: function (dom) {
+    // 工程量清单排序类型
+    let me = preHandleObj;
+    me.currentNode[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_SORT_TYPE] =
+      dom.value;
+  },
+  onQuantitiesBillsTypesChange: function (dom) {
+    // 工程量清单排序对象类型
+    let me = preHandleObj;
+    me.currentNode[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_DATA_TYPE] =
+      dom.value;
+  },
+};

+ 0 - 4
web/maintain/std_glj_lib/js/glj.js

@@ -56,7 +56,6 @@ let repositoryGljObj = {
   treeObj: null,
   workBook: null,
   gljCurTypeId: -1,
-  gljCurClassSeq: 0,
   currentRepositoryId: -1,
   currentCache: null,
   parentNodeIds: {},
@@ -469,7 +468,6 @@ let repositoryGljObj = {
           );
           if (result.data && result.data.length > 0) {
             me.gljCurTypeId = result.data[0].ID;
-            me.gljCurClassSeq = result.data[0].classSeq;
           } else {
             //重新创建库?
             gljTypeTreeOprObj.addRootNode();
@@ -1288,7 +1286,6 @@ let repositoryGljObj = {
     }
     if (!me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]) {
       rObj.gljClass = me.gljCurTypeId;
-      rObj.classSeq = me.gljCurClassSeq;
     }
     if (updateArr.length > 0 || addArr.length > 0) {
       me.currentEditingGlj = null;
@@ -1970,7 +1967,6 @@ let repositoryGljObj = {
     //pasteObj.basePrice = !isNaN(parseFloat(pasteObj.basePrice)) && (pasteObj.basePrice && typeof pasteObj.basePrice !== 'undefined') ? parseFloat(pasteObj.basePrice) : 0;
     if (!me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]) {
       pasteObj.gljClass = me.gljCurTypeId;
-      pasteObj.classSeq = me.gljCurClassSeq;
     }
     return true;
   },

+ 0 - 1
web/maintain/std_glj_lib/js/gljClassTree.js

@@ -730,7 +730,6 @@ let gljClassTreeObj = {
     }
     let gljTypeId = node.data.ID;
     re.gljCurTypeId = node.data.ID;
-    re.gljCurClassSeq = node.data.classSeq;
     re.addGljObj = null;
     sheetCommonObj.cleanSheet(that.workBook.getSheet(0), that.setting, 10);
     if (re.parentNodeIds["_pNodeId_" + gljTypeId]) {