Jelajahi Sumber

fix: 1.报表计算式选择合并格子后,刷新后还是显示分析前的问题。2.空行提上配置相关

lishihao 1 Minggu lalu
induk
melakukan
0ab9b1d485

+ 371 - 325
public/web/rpt_value_define.js

@@ -2,329 +2,375 @@
  * 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_ERASE_BLANK_ROWS: "空行提上",
+  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: "",
 };

+ 6 - 1
web/maintain/report/html/rpt_tpl_dtl_info.html

@@ -25,10 +25,15 @@
             <div class="form-group" id="multiColCnt">
                 <label>显示调整</label>
                 <div class="row">
-                    <div class="input-group col-6">
+                    <div class="input-group col-3">
                         <div class="input-group-addon">分栏</div>
                         <select class="form-control input-sm" id="rptTplMultiCols"><option>1</option><option>2</option></select>
                     </div>
+                    <div class="input-group input-group-sm col-3">
+                        <label class="form-check-label">空行提上
+                            <input id="rptTplEraseBlankRows" type="checkbox">
+                        </label>
+                    </div>
                     <div class="input-group col-6" style="display: none">
                         <div class="input-group-addon">缩放</div>
                         <input class="form-control input-sm" type="number" value="1" step="0.25">

+ 229 - 171
web/maintain/report/js/rpt_tpl_calculation.js

@@ -3,180 +3,238 @@
  */
 
 let calculationTreeOprObj = {
-    treeObj : null,
-    extCodeTreeObj: null,
-    currentNode: null,
-    currentExtCodeNode: null,
-    iniTree: function(rptTpl) {
-        var me = this;
-        let fieldMapList = me.buildTreeData(rptTpl);
-        me.treeObj = $.fn.zTree.init($("#rpt_tpl_formulas"), caculationSetting, fieldMapList);
-        me.treeObj.expandAll(true);
-        $("#exprDetail")[0].style.display = "none";
-    },
-    iniExtCodeTpl: function () {
-        let me = this, params = {};
-        CommonAjax.postEx("report_tpl_api/getExtCodeTpl", params, 10000, true, function(result){
-            me.extCodeTreeObj = $.fn.zTree.init($("#rpt_ext_code_tpl"), extCodeSetting, result);
-            let nodes = me.extCodeTreeObj.getNodes();
-            for (let node of nodes) {
-                me.extCodeTreeObj.expandNode(node, true, false);
-            }
-            // me.extCodeTreeObj.expandAll(true);
-            }, null, null
+  treeObj: null,
+  extCodeTreeObj: null,
+  currentNode: null,
+  currentExtCodeNode: null,
+  iniTree: function (rptTpl) {
+    var me = this;
+    let fieldMapList = me.buildTreeData(rptTpl);
+    me.treeObj = $.fn.zTree.init(
+      $("#rpt_tpl_formulas"),
+      caculationSetting,
+      fieldMapList
+    );
+    me.treeObj.expandAll(true);
+    $("#exprDetail")[0].style.display = "none";
+  },
+  iniExtCodeTpl: function () {
+    let me = this,
+      params = {};
+    CommonAjax.postEx(
+      "report_tpl_api/getExtCodeTpl",
+      params,
+      10000,
+      true,
+      function (result) {
+        me.extCodeTreeObj = $.fn.zTree.init(
+          $("#rpt_ext_code_tpl"),
+          extCodeSetting,
+          result
         );
-    },
-    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>");
-    },
-    buildTreeData: function (rptTpl) {
-        let me = this, rst = {"Name": "计算式", items: []};
-        if (rptTpl[JV.NODE_FORMULAS]) {
-            for (let cItem of rptTpl[JV.NODE_FORMULAS]) {
-                let node = {};
-                me.copyContent(cItem, node);
-                node[JV.PROP_NAME] = cItem[JV.PROP_NAME];
-                node[JV.PROP_RUN_TYPE] = cItem[JV.PROP_RUN_TYPE];
-                node[JV.PROP_EXPRESSION] = cItem[JV.PROP_EXPRESSION];
-                node["format"] = (cItem["format"])?cItem["format"]:"";
-                rst.items.push(node);
-            }
+        let nodes = me.extCodeTreeObj.getNodes();
+        for (let node of nodes) {
+          me.extCodeTreeObj.expandNode(node, true, false);
         }
-        return rst;
-    },
-    copyContent: function(source, target) {
-        target[JV.PROP_NAME] = source[JV.PROP_NAME];
-        target[JV.PROP_RUN_TYPE] = source[JV.PROP_RUN_TYPE];
-        target[JV.PROP_EXPRESSION] = source[JV.PROP_EXPRESSION];
-        target["format"] = (source["format"])?source["format"]:"";
-    },
-    changeRunType: function (dom) {
-        let me = calculationTreeOprObj;
-        if (me.currentNode) {
-            me.currentNode[JV.PROP_RUN_TYPE] = dom.value;
-        }
-    },
-    setExtCodeTemplate: function (dom) {
-        let me = calculationTreeOprObj;
-        if (me.currentExtCodeNode && me.currentExtCodeNode["Template"] !== '') {
-            $("#exprContent")[0].value = me.currentExtCodeNode["Template"];
-            editor2.setValue($("#exprContent")[0].value);
-        }
-    },
-    addExtCodeTemplate: function (dom) {
-        let me = calculationTreeOprObj;
-        if (me.currentExtCodeNode && me.currentExtCodeNode["Template"] !== '') {
-            $("#exprContent")[0].value += me.currentExtCodeNode["Template"];
-            editor2.setValue($("#exprContent")[0].value);
-        }
-    },
-    changeFormat: function (dom) {
-        let me = calculationTreeOprObj;
-        if (me.currentNode) {
-            me.currentNode["format"] = dom.value;
-        }
-    },
-    changeExpression: function (dom) {
-        let me = calculationTreeOprObj;
-        if (me.currentNode) {
-            me.currentNode[JV.PROP_EXPRESSION] = dom.value;
-        }
-    },
-    onClick: function (event,treeId,treeNode) {
-        let me = calculationTreeOprObj;
-        me.currentNode = treeNode;
-        if (treeNode.level === 0) {
-            $("#exprDetail")[0].style.display = "none";
-        } else {
-            $("#exprDetail")[0].style.display = "";
-            if (treeNode[JV.PROP_RUN_TYPE] === JV.RUN_TYPE_BEFORE_PAGING) {
-                $("#exprRunType")[0].selectedIndex = 0;
-            } else if (treeNode[JV.PROP_RUN_TYPE] === JV.RUN_TYPE_BEFORE_OUTPUT) {
-                $("#exprRunType")[0].selectedIndex = 1;
-            } else if (treeNode[JV.PROP_RUN_TYPE] === JV.RUN_TYPE_BEFORE_ANALYZING) {
-                $("#exprRunType")[0].selectedIndex = 2;
-            } else if (treeNode[JV.PROP_RUN_TYPE] === JV.RUN_TYPE_BEFORE_COMBINE) {
-                $("#exprRunType")[0].selectedIndex = 3;
-            } else {
-                $("#exprRunType")[0].selectedIndex = 4;
-            }
-            $("#exprFormat")[0].value = (treeNode["format"])?treeNode["format"]:"";
-            $("#exprContent")[0].value = treeNode[JV.PROP_EXPRESSION];
-            editor2.setValue($("#exprContent")[0].value);
-        }
-    },
-    onExtCodeTreeClick: function (event, treeId, treeNode) {
-        let me = calculationTreeOprObj;
-        me.currentExtCodeNode = treeNode;
-    },
-    onBeforeRemove: function(treeId, treeNode){
-        let rst = false;
-        if (treeNode.level > 0) {
-            rst = confirm('请确认是否真的删除?');
-        }
-        return rst;
-    },
-    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 = false;
-        if (targetNode.level === 1 && (moveType === "next" || moveType === "prev")) {
-            return true;
-        }
-        return rst;
-    },
-    addHoverDom: function(treeId, treeNode) {
-        let me = calculationTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
-        if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length > 0 || treeNode.level > 0) {
-            return;
-        } else {
-            let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增' onfocus='this.blur();'></span>";
-            sObj.after(addStr);
-            let btn = $("#addBtn_"+treeNode.tId);
-            btn.bind("click", function(){
-                let newNodes = [], node = {};
-                node[JV.PROP_NAME] = "新计算式";
-                node[JV.PROP_RUN_TYPE] = JV.RUN_TYPE_BEFORE_PAGING;
-                node[JV.PROP_EXPRESSION] = "";
-                node["format"] = "";
-                newNodes.push(node);
-                me.treeObj.addNodes(treeNode, -1, newNodes, true);
-            });
-        }
-    },
-    removeHoverDom: function(treeId, treeNode) {
-        $("#addBtn_"+treeNode.tId).unbind().remove();
-    },
-    extractCalculation: function (rptTpl) {
-        let me = this, newCaclList = [];
-        let topNode = me.treeObj.getNodes()[0];
-        for (let node of topNode.items) {
-            let item = {};
-            me.copyContent(node, item);
-            newCaclList.push(item);
-        }
-        rptTpl[JV.NODE_FORMULAS] = newCaclList;
+        // me.extCodeTreeObj.expandAll(true);
+      },
+      null,
+      null
+    );
+  },
+  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>"
+    );
+  },
+  buildTreeData: function (rptTpl) {
+    let me = this,
+      rst = { Name: "计算式", items: [] };
+    if (rptTpl[JV.NODE_FORMULAS]) {
+      for (let cItem of rptTpl[JV.NODE_FORMULAS]) {
+        let node = {};
+        me.copyContent(cItem, node);
+        node[JV.PROP_NAME] = cItem[JV.PROP_NAME];
+        node[JV.PROP_RUN_TYPE] = cItem[JV.PROP_RUN_TYPE];
+        node[JV.PROP_EXPRESSION] = cItem[JV.PROP_EXPRESSION];
+        node["format"] = cItem["format"] ? cItem["format"] : "";
+        rst.items.push(node);
+      }
+    }
+    return rst;
+  },
+  copyContent: function (source, target) {
+    target[JV.PROP_NAME] = source[JV.PROP_NAME];
+    target[JV.PROP_RUN_TYPE] = source[JV.PROP_RUN_TYPE];
+    target[JV.PROP_EXPRESSION] = source[JV.PROP_EXPRESSION];
+    target["format"] = source["format"] ? source["format"] : "";
+  },
+  changeRunType: function (dom) {
+    let me = calculationTreeOprObj;
+    if (me.currentNode) {
+      me.currentNode[JV.PROP_RUN_TYPE] = dom.value;
     }
-}
+  },
+  setExtCodeTemplate: function (dom) {
+    let me = calculationTreeOprObj;
+    if (me.currentExtCodeNode && me.currentExtCodeNode["Template"] !== "") {
+      $("#exprContent")[0].value = me.currentExtCodeNode["Template"];
+      editor2.setValue($("#exprContent")[0].value);
+    }
+  },
+  addExtCodeTemplate: function (dom) {
+    let me = calculationTreeOprObj;
+    if (me.currentExtCodeNode && me.currentExtCodeNode["Template"] !== "") {
+      $("#exprContent")[0].value += me.currentExtCodeNode["Template"];
+      editor2.setValue($("#exprContent")[0].value);
+    }
+  },
+  changeFormat: function (dom) {
+    let me = calculationTreeOprObj;
+    if (me.currentNode) {
+      me.currentNode["format"] = dom.value;
+    }
+  },
+  changeExpression: function (dom) {
+    let me = calculationTreeOprObj;
+    if (me.currentNode) {
+      me.currentNode[JV.PROP_EXPRESSION] = dom.value;
+    }
+  },
+  onClick: function (event, treeId, treeNode) {
+    let me = calculationTreeOprObj;
+    me.currentNode = treeNode;
+    if (treeNode.level === 0) {
+      $("#exprDetail")[0].style.display = "none";
+    } else {
+      $("#exprDetail")[0].style.display = "";
+      if (treeNode[JV.PROP_RUN_TYPE] === JV.RUN_TYPE_BEFORE_PAGING) {
+        $("#exprRunType")[0].selectedIndex = 0;
+      } else if (treeNode[JV.PROP_RUN_TYPE] === JV.RUN_TYPE_BEFORE_OUTPUT) {
+        $("#exprRunType")[0].selectedIndex = 1;
+      } else if (treeNode[JV.PROP_RUN_TYPE] === JV.RUN_TYPE_BEFORE_ANALYZING) {
+        $("#exprRunType")[0].selectedIndex = 2;
+      } else if (treeNode[JV.PROP_RUN_TYPE] === JV.RUN_TYPE_BEFORE_COMBINE) {
+        $("#exprRunType")[0].selectedIndex = 3;
+      } 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 {
+        $("#exprRunType")[0].selectedIndex = 2;
+      }
+      $("#exprFormat")[0].value = treeNode["format"] ? treeNode["format"] : "";
+      $("#exprContent")[0].value = treeNode[JV.PROP_EXPRESSION];
+      editor2.setValue($("#exprContent")[0].value);
+    }
+  },
+  onExtCodeTreeClick: function (event, treeId, treeNode) {
+    let me = calculationTreeOprObj;
+    me.currentExtCodeNode = treeNode;
+  },
+  onBeforeRemove: function (treeId, treeNode) {
+    let rst = false;
+    if (treeNode.level > 0) {
+      rst = confirm("请确认是否真的删除?");
+    }
+    return rst;
+  },
+  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 = false;
+    if (
+      targetNode.level === 1 &&
+      (moveType === "next" || moveType === "prev")
+    ) {
+      return true;
+    }
+    return rst;
+  },
+  addHoverDom: function (treeId, treeNode) {
+    let me = calculationTreeOprObj,
+      sObj = $("#" + treeNode.tId + "_span");
+    if (
+      treeNode.editNameFlag ||
+      $("#addBtn_" + treeNode.tId).length > 0 ||
+      treeNode.level > 0
+    ) {
+      return;
+    } else {
+      let addStr =
+        "<span class='button add' id='addBtn_" +
+        treeNode.tId +
+        "' title='新增' onfocus='this.blur();'></span>";
+      sObj.after(addStr);
+      let btn = $("#addBtn_" + treeNode.tId);
+      btn.bind("click", function () {
+        let newNodes = [],
+          node = {};
+        node[JV.PROP_NAME] = "新计算式";
+        node[JV.PROP_RUN_TYPE] = JV.RUN_TYPE_BEFORE_PAGING;
+        node[JV.PROP_EXPRESSION] = "";
+        node["format"] = "";
+        newNodes.push(node);
+        me.treeObj.addNodes(treeNode, -1, newNodes, true);
+      });
+    }
+  },
+  removeHoverDom: function (treeId, treeNode) {
+    $("#addBtn_" + treeNode.tId)
+      .unbind()
+      .remove();
+  },
+  extractCalculation: function (rptTpl) {
+    let me = this,
+      newCaclList = [];
+    let topNode = me.treeObj.getNodes()[0];
+    for (let node of topNode.items) {
+      let item = {};
+      me.copyContent(node, item);
+      newCaclList.push(item);
+    }
+    rptTpl[JV.NODE_FORMULAS] = newCaclList;
+  },
+};
 
 $(document).ready(function () {
-    editor2.on('change', function () {
-        let me = calculationTreeOprObj;
-        if (me.currentNode) {
-            me.currentNode[JV.PROP_EXPRESSION] = editor2.getValue();
-        }
-    });
+  editor2.on("change", function () {
+    let me = calculationTreeOprObj;
+    if (me.currentNode) {
+      me.currentNode[JV.PROP_EXPRESSION] = editor2.getValue();
+    }
+  });
 });

+ 214 - 174
web/maintain/report/js/rpt_tpl_helper.js

@@ -4,189 +4,229 @@
  * 管理:编办、工程类型等
  */
 let tplHelper = {
-    createDftRptTpl: function(treeNode) {
-        var me = this, rst = {GROUP_KEY: 'CONSTRUCT', ID_KEY: null};
-        rst[JV.NODE_MAIN_INFO] = me.createDftRptMainInfo(treeNode.name);
-        rst[JV.NODE_FIELD_MAP] = {};
-        rst[JV.NODE_BAND_COLLECTION] = {};
-        rst[JV.NODE_CROSS_INFO] = {};
-        rst[JV.NODE_DISCRETE_PARAMS] = {};
-        rst[JV.NODE_FORMULAS] = {};
-        rst[JV.NODE_FLOW_INFO] = {};
-        rst[JV.NODE_NO_MAPPING_FIELDS] = {};
-        return rst;
-    },
-    createDftRptMainInfo: function(rptName) {
-        let rst = {};
-        rst[JV.NODE_MAIN_INFO_RPT_NAME] = rptName;
-        rst[JV.PROP_UNITS] = JV.MEASUREMENT.CM[0];
+  createDftRptTpl: function (treeNode) {
+    var me = this,
+      rst = { GROUP_KEY: "CONSTRUCT", ID_KEY: null };
+    rst[JV.NODE_MAIN_INFO] = me.createDftRptMainInfo(treeNode.name);
+    rst[JV.NODE_FIELD_MAP] = {};
+    rst[JV.NODE_BAND_COLLECTION] = {};
+    rst[JV.NODE_CROSS_INFO] = {};
+    rst[JV.NODE_DISCRETE_PARAMS] = {};
+    rst[JV.NODE_FORMULAS] = {};
+    rst[JV.NODE_FLOW_INFO] = {};
+    rst[JV.NODE_NO_MAPPING_FIELDS] = {};
+    return rst;
+  },
+  createDftRptMainInfo: function (rptName) {
+    let rst = {};
+    rst[JV.NODE_MAIN_INFO_RPT_NAME] = rptName;
+    rst[JV.PROP_UNITS] = JV.MEASUREMENT.CM[0];
 
-        rst[JV.NODE_PAGE_INFO] = {};
-        rst[JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = "A4";
-        rst[JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = "LANDSCAPE";
+    rst[JV.NODE_PAGE_INFO] = {};
+    rst[JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = "A4";
+    rst[JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = "LANDSCAPE";
 
-        rst[JV.NODE_MARGINS] = {};
-        rst[JV.NODE_MARGINS][JV.PROP_LEFT] = 0.8;
-        rst[JV.NODE_MARGINS][JV.PROP_RIGHT] = 0.8;
-        rst[JV.NODE_MARGINS][JV.PROP_TOP] = 0.8;
-        rst[JV.NODE_MARGINS][JV.PROP_BOTTOM] = 0.8;
+    rst[JV.NODE_MARGINS] = {};
+    rst[JV.NODE_MARGINS][JV.PROP_LEFT] = 0.8;
+    rst[JV.NODE_MARGINS][JV.PROP_RIGHT] = 0.8;
+    rst[JV.NODE_MARGINS][JV.PROP_TOP] = 0.8;
+    rst[JV.NODE_MARGINS][JV.PROP_BOTTOM] = 0.8;
 
-        return rst;
-    },
+    return rst;
+  },
 
-    getJsTxt: function(destDom) {
-        let me = this;
-        if (destDom && me.reCombineRptTpl()) {
-            let rptTpl = zTreeOprObj.currentNode.rptTpl;
-            destDom.value = JSON.stringify(rptTpl, null, 4);
-        }
-    },
-
-    setFromJsTxt: function (srcDom) {
-        if (srcDom && zTreeOprObj.currentNode && zTreeOprObj.currentNode.refId > 0 &&
-            confirm("导入将覆盖原模板所有信息,请确认!")) {
-            try {
-                // let rptTpl = JSON.parse(srcDom.value);
-                let rptTpl = JSON.parse(stringUtil.replaceAll(srcDom.value, "\t", " "));
-                // JSON.format()
-                delete rptTpl["__v"];
-                delete rptTpl["_id"];
-                rptTpl["ID"] = zTreeOprObj.currentNode.rptTpl["ID"];
-                //以下从zTreeOprObj.chkAndRreshRefTpl中参考
-                zTreeOprObj.currentNode.rptTpl = rptTpl;
-                zTreeOprObj.currentNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = zTreeOprObj.currentNode.name;
-                if (zTreeOprObj.currentNode.rptTpl["GROUP_KEY"]) {
-                    let grp_keys = zTreeOprObj.currentNode.rptTpl["GROUP_KEY"].split('_');
-                    if (grp_keys.length > 0) {
-                        grp_keys[1] = zTreeOprObj.currentNode.name;
-                    }
-                    zTreeOprObj.currentNode.rptTpl["GROUP_KEY"] = grp_keys.join("_");
-                }
-                tplHelper.refreshTplView(zTreeOprObj.currentNode.rptTpl);
-                displayMessage("导入成功!", "green", 1000, "id_after_js_load_lbl");
-            } catch (ex) {
-                console.log(ex);
-                // alert("导入失败!请仔细检查JS对象的正确性");
-                displayMessage("导入失败!请仔细检查JS对象的正确性!", "red", 3000, "id_after_js_load_lbl");
-            }
-        }
-    },
+  getJsTxt: function (destDom) {
+    let me = this;
+    if (destDom && me.reCombineRptTpl()) {
+      let rptTpl = zTreeOprObj.currentNode.rptTpl;
+      destDom.value = JSON.stringify(rptTpl, null, 4);
+    }
+  },
 
-    refreshTplView: function (rptTpl) {
-        if (rptTpl) {
-            //1. 模板信息
-            $("#rptTplName")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME];
-            $("#rptTplPageSize")[0].selectedIndex = JV.PAGES_SIZE_STR.indexOf(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE]);
-            if (rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_PORTRAIT ||
-                rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_PORTRAIT_CHN) {
-                $("#rptTplPageOrientation")[0].selectedIndex = 1;
-            } else {
-                $("#rptTplPageOrientation")[0].selectedIndex = 0;
-            }
-            if (rptTpl[JV.NODE_FLOW_INFO]) {
-                $("#multiColCnt")[0].style.display = "";
-                $("#rptTplMultiCols")[0].value = rptTpl[JV.NODE_FLOW_INFO][JV.PROP_MULTI_COLUMN];
-            } else {
-                $("#multiColCnt")[0].style.display = "none";
-            }
-            // $("#rptTplMarginLeft")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT];
-            // $("#rptTplMarginRight")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT];
-            // $("#rptTplMarginTop")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP];
-            // $("#rptTplMarginBottom")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM];
-            //2. 模板布局
-            bandTreeOprObj.iniTree(rptTpl);
-            //3. 指标映射
-            fieldMapTreeOprObj.iniTree(rptTpl);
-            //4. 指标摆放
-            dataInfoMapTreeOprObj.iniTree(rptTpl);
-            discreteFieldParamTreeOprObj.iniTree(rptTpl);
-            dataInfoMapTreeOprObj.iniDataMap();
-            //5. 数据预处理
-            preHandleObj.iniTree(rptTpl);
-            preHandleObj.hide_all_dom();
-            //6. 计算式
-            calculationTreeOprObj.iniTree(rptTpl);
-            //7. 刷白js对象text区域
-            document.getElementById('tplScriptTextContent').value = "";
-            //9. 刷白预览区域
-            let canvas = $('#tplCanvas')[0];
-            JpcCanvasOutput.cleanCanvas(canvas);
-            preview_util.drawBorder(canvas);
-            // JpcCanvasOutput.drawBorderLine(canvas);
+  setFromJsTxt: function (srcDom) {
+    if (
+      srcDom &&
+      zTreeOprObj.currentNode &&
+      zTreeOprObj.currentNode.refId > 0 &&
+      confirm("导入将覆盖原模板所有信息,请确认!")
+    ) {
+      try {
+        // let rptTpl = JSON.parse(srcDom.value);
+        let rptTpl = JSON.parse(stringUtil.replaceAll(srcDom.value, "\t", " "));
+        // JSON.format()
+        delete rptTpl["__v"];
+        delete rptTpl["_id"];
+        rptTpl["ID"] = zTreeOprObj.currentNode.rptTpl["ID"];
+        //以下从zTreeOprObj.chkAndRreshRefTpl中参考
+        zTreeOprObj.currentNode.rptTpl = rptTpl;
+        zTreeOprObj.currentNode.rptTpl[JV.NODE_MAIN_INFO][
+          JV.NODE_MAIN_INFO_RPT_NAME
+        ] = zTreeOprObj.currentNode.name;
+        if (zTreeOprObj.currentNode.rptTpl["GROUP_KEY"]) {
+          let grp_keys = zTreeOprObj.currentNode.rptTpl["GROUP_KEY"].split("_");
+          if (grp_keys.length > 0) {
+            grp_keys[1] = zTreeOprObj.currentNode.name;
+          }
+          zTreeOprObj.currentNode.rptTpl["GROUP_KEY"] = grp_keys.join("_");
         }
-    },
+        tplHelper.refreshTplView(zTreeOprObj.currentNode.rptTpl);
+        displayMessage("导入成功!", "green", 1000, "id_after_js_load_lbl");
+      } catch (ex) {
+        console.log(ex);
+        // alert("导入失败!请仔细检查JS对象的正确性");
+        displayMessage(
+          "导入失败!请仔细检查JS对象的正确性!",
+          "red",
+          3000,
+          "id_after_js_load_lbl"
+        );
+      }
+    }
+  },
 
-    saveRptTpl: function (directSave) {
-        let me = this, params = null;
-        if (directSave || me.reCombineRptTpl()) {
-            displayMessage("正在保存...", "yellow", 1000);
-            let rptTpl = zTreeOprObj.currentNode.rptTpl;
-            params = {};
-            params.rptTpl = JSON.stringify(rptTpl);
-            CommonAjax.postEx("report_tpl_api/updateRptTpl", params, 20000, true, function(result){
-                    if (result) {
-                        displayMessage("保存成功!", "green", 3000);
-                    } else {
-                        displayMessage("保存失败!", "red", 3000);
-                    }
-                }, null, null
-            );
-        }
-    },
+  refreshTplView: function (rptTpl) {
+    if (rptTpl) {
+      //1. 模板信息
+      $("#rptTplName")[0].value =
+        rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME];
+      $("#rptTplPageSize")[0].selectedIndex = JV.PAGES_SIZE_STR.indexOf(
+        rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE]
+      );
+      if (
+        rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] ===
+          JV.ORIENTATION_PORTRAIT ||
+        rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] ===
+          JV.ORIENTATION_PORTRAIT_CHN
+      ) {
+        $("#rptTplPageOrientation")[0].selectedIndex = 1;
+      } else {
+        $("#rptTplPageOrientation")[0].selectedIndex = 0;
+      }
+      if (rptTpl[JV.NODE_FLOW_INFO]) {
+        $("#multiColCnt")[0].style.display = "";
+        $("#rptTplMultiCols")[0].value =
+          rptTpl[JV.NODE_FLOW_INFO][JV.PROP_MULTI_COLUMN];
+        $("#rptTplEraseBlankRows").get(0).checked =
+          !!rptTpl[JV.NODE_FLOW_INFO][JV.PROP_ERASE_BLANK_ROWS];
+      } else {
+        $("#multiColCnt")[0].style.display = "none";
+      }
+      // $("#rptTplMarginLeft")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT];
+      // $("#rptTplMarginRight")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT];
+      // $("#rptTplMarginTop")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP];
+      // $("#rptTplMarginBottom")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM];
+      //2. 模板布局
+      bandTreeOprObj.iniTree(rptTpl);
+      //3. 指标映射
+      fieldMapTreeOprObj.iniTree(rptTpl);
+      //4. 指标摆放
+      dataInfoMapTreeOprObj.iniTree(rptTpl);
+      discreteFieldParamTreeOprObj.iniTree(rptTpl);
+      dataInfoMapTreeOprObj.iniDataMap();
+      //5. 数据预处理
+      preHandleObj.iniTree(rptTpl);
+      preHandleObj.hide_all_dom();
+      //6. 计算式
+      calculationTreeOprObj.iniTree(rptTpl);
+      //7. 刷白js对象text区域
+      document.getElementById("tplScriptTextContent").value = "";
+      //9. 刷白预览区域
+      let canvas = $("#tplCanvas")[0];
+      JpcCanvasOutput.cleanCanvas(canvas);
+      preview_util.drawBorder(canvas);
+      // JpcCanvasOutput.drawBorderLine(canvas);
+    }
+  },
 
-    saveDirectFromJs: function (srcDom) {
-        if (confirm("将覆盖原模板所有信息并保存,请确认!")) {
-            let me = this;
-            try {
-                //1. 覆盖原模板信息
-                let rptTpl = JSON.parse(stringUtil.replaceAll(srcDom.value, "\t", " "));
-                // JSON.format()
-                delete rptTpl["__v"];
-                delete rptTpl["_id"];
-                rptTpl["ID"] = zTreeOprObj.currentNode.rptTpl["ID"];
-                //以下从zTreeOprObj.chkAndRreshRefTpl中参考
-                zTreeOprObj.currentNode.rptTpl = rptTpl;
-                zTreeOprObj.currentNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = zTreeOprObj.currentNode.name;
-                if (zTreeOprObj.currentNode.rptTpl["GROUP_KEY"]) {
-                    let grp_keys = zTreeOprObj.currentNode.rptTpl["GROUP_KEY"].split('_');
-                    if (grp_keys.length > 0) {
-                        grp_keys[1] = zTreeOprObj.currentNode.name;
-                    }
-                    zTreeOprObj.currentNode.rptTpl["GROUP_KEY"] = grp_keys.join("_");
-                }
-                tplHelper.refreshTplView(zTreeOprObj.currentNode.rptTpl);
-                displayMessage("导入成功!", "green", 3000, "id_after_js_load_lbl");
-                //2. 直接保存
-                me.saveRptTpl(true);
-            } catch (ex) {
-                console.log(ex);
-                displayMessage("导入失败!请仔细检查JS对象的正确性!", "red", 3000, "id_after_js_load_lbl");
-            }
-        }
-    },
+  saveRptTpl: function (directSave) {
+    let me = this,
+      params = null;
+    if (directSave || me.reCombineRptTpl()) {
+      displayMessage("正在保存...", "yellow", 1000);
+      let rptTpl = zTreeOprObj.currentNode.rptTpl;
+      params = {};
+      params.rptTpl = JSON.stringify(rptTpl);
+      CommonAjax.postEx(
+        "report_tpl_api/updateRptTpl",
+        params,
+        20000,
+        true,
+        function (result) {
+          if (result) {
+            displayMessage("保存成功!", "green", 3000);
+          } else {
+            displayMessage("保存失败!", "red", 3000);
+          }
+        },
+        null,
+        null
+      );
+    }
+  },
 
-    reCombineRptTpl: function () {
-        let rst = true;
-        if (zTreeOprObj.currentNode && zTreeOprObj.currentNode.nodeType === RT.NodeType.TEMPLATE && zTreeOprObj.currentNode.rptTpl !== null) {
-            let rptTpl = zTreeOprObj.currentNode.rptTpl;
-            //1. 模板信息
-            zTreeOprObj.extractMainInfo(rptTpl);
-            //2. 模板布局
-            bandTreeOprObj.extractBands(rptTpl);
-            //3. 指标映射
-            fieldMapTreeOprObj.extractFieldMaps(rptTpl);
-            //4. 指标摆放
-            dataInfoMapTreeOprObj.extractTabFields(rptTpl);
-            dataInfoMapTreeOprObj.extractDiscreteFieldParam(rptTpl);
-            discreteFieldParamTreeOprObj.extractFieldMaps(rptTpl);
-            //5. 指标预处理
-            preHandleObj.extractTabFields(rptTpl);
-            //6. 计算式
-            calculationTreeOprObj.extractCalculation(rptTpl);
-        } else {
-            rst = false;
+  saveDirectFromJs: function (srcDom) {
+    if (confirm("将覆盖原模板所有信息并保存,请确认!")) {
+      let me = this;
+      try {
+        //1. 覆盖原模板信息
+        let rptTpl = JSON.parse(stringUtil.replaceAll(srcDom.value, "\t", " "));
+        // JSON.format()
+        delete rptTpl["__v"];
+        delete rptTpl["_id"];
+        rptTpl["ID"] = zTreeOprObj.currentNode.rptTpl["ID"];
+        //以下从zTreeOprObj.chkAndRreshRefTpl中参考
+        zTreeOprObj.currentNode.rptTpl = rptTpl;
+        zTreeOprObj.currentNode.rptTpl[JV.NODE_MAIN_INFO][
+          JV.NODE_MAIN_INFO_RPT_NAME
+        ] = zTreeOprObj.currentNode.name;
+        if (zTreeOprObj.currentNode.rptTpl["GROUP_KEY"]) {
+          let grp_keys = zTreeOprObj.currentNode.rptTpl["GROUP_KEY"].split("_");
+          if (grp_keys.length > 0) {
+            grp_keys[1] = zTreeOprObj.currentNode.name;
+          }
+          zTreeOprObj.currentNode.rptTpl["GROUP_KEY"] = grp_keys.join("_");
         }
-        return rst;
+        tplHelper.refreshTplView(zTreeOprObj.currentNode.rptTpl);
+        displayMessage("导入成功!", "green", 3000, "id_after_js_load_lbl");
+        //2. 直接保存
+        me.saveRptTpl(true);
+      } catch (ex) {
+        console.log(ex);
+        displayMessage(
+          "导入失败!请仔细检查JS对象的正确性!",
+          "red",
+          3000,
+          "id_after_js_load_lbl"
+        );
+      }
     }
+  },
 
-}
+  reCombineRptTpl: function () {
+    let rst = true;
+    if (
+      zTreeOprObj.currentNode &&
+      zTreeOprObj.currentNode.nodeType === RT.NodeType.TEMPLATE &&
+      zTreeOprObj.currentNode.rptTpl !== null
+    ) {
+      let rptTpl = zTreeOprObj.currentNode.rptTpl;
+      //1. 模板信息
+      zTreeOprObj.extractMainInfo(rptTpl);
+      //2. 模板布局
+      bandTreeOprObj.extractBands(rptTpl);
+      //3. 指标映射
+      fieldMapTreeOprObj.extractFieldMaps(rptTpl);
+      //4. 指标摆放
+      dataInfoMapTreeOprObj.extractTabFields(rptTpl);
+      dataInfoMapTreeOprObj.extractDiscreteFieldParam(rptTpl);
+      discreteFieldParamTreeOprObj.extractFieldMaps(rptTpl);
+      //5. 指标预处理
+      preHandleObj.extractTabFields(rptTpl);
+      //6. 计算式
+      calculationTreeOprObj.extractCalculation(rptTpl);
+    } else {
+      rst = false;
+    }
+    return rst;
+  },
+};

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

@@ -1496,6 +1496,8 @@ let zTreeOprObj = {
       rptTpl[JV.NODE_FLOW_INFO][JV.PROP_MULTI_COLUMN] = parseInt(
         $("#rptTplMultiCols")[0].value
       );
+      rptTpl[JV.NODE_FLOW_INFO][JV.PROP_ERASE_BLANK_ROWS] =
+        $("#rptTplEraseBlankRows").get(0).checked || false;
     }
     //考虑到页边距必然跟用户设置走,所以这里没必要特意去设置了,全部下架
   },