소스 검색

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

zhangweicheng 4 달 전
부모
커밋
39fd8fca27

+ 1 - 1
config/config.js

@@ -127,7 +127,7 @@ module.exports = {
     uat_hw: {
         title: "公路2.0",
         startPort: 4080,
-        server: "172.18.111.231",
+        server: "112.74.42.187",
         port: "27017",
         dbname: 'stdHighway',
         options: {

+ 10 - 7
modules/all_models/ration_coe.js

@@ -17,12 +17,15 @@ var coeListSchema = mongoose.Schema({
     ID: String,                         // 系数ID(流水号ID)
     name: String,                       // 名称
     content: String,                    // 说明
-    rationID:String,
-    projectID:Number,
-    coeID:Number,
-    isAdjust:Number, //0不调整,1调整
-    seq:Number,//序数,排序用
-    coes: [coeSchema]
-}, {versionKey: false});
+    rationID: String,
+    projectID: Number,
+    coeID: Number,
+    isAdjust: Number, //0不调整,1调整
+    seq: Number,//序数,排序用
+    coes: [coeSchema],
+    actualVal: Number, // 实际值
+    maxVal: Number, // 最大值
+    minVal: Number, // 最小值
+}, { versionKey: false });
 
 mongoose.model('ration_coe', coeListSchema);

+ 3 - 0
modules/all_models/stdRation_coe.js

@@ -21,6 +21,9 @@ const coeListSchema = new Schema({
     libID: Number,                      // 所属定额定ID
     ID: Number,                         // 系数ID(流水号ID)
     serialNo: Number,                  //编号
+    actualVal: Number, // 实际值
+    maxVal: Number, // 最大值
+    minVal: Number, // 最小值
     name: String,                       // 名称
     content: String,                    // 说明
     original_code: String,               //原人材机编码

+ 6 - 0
modules/common/const/bills_fixed.js

@@ -224,6 +224,10 @@ if (process.env.NODE_ENV.indexOf('hw') !== -1) {
         BUDGET_COMPILATION: 196,
         // 招标费用
         INVITATION: 197,
+        // 补征地
+        ADD_REQ_LAND: 198,
+        // 国有土地
+        NATIONAL_LAND: 199,
     };
 }
 
@@ -295,6 +299,8 @@ const fixedFlagList = [
     { name: '清单编制费', value: fixedFlag.BILL_COMPILATION },
     { name: '预算编制费', value: fixedFlag.BUDGET_COMPILATION },
     { name: '招标费用', value: fixedFlag.INVITATION },
+    { name: '补征地', value: fixedFlag.ADD_REQ_LAND },
+    { name: '国有土地', value: fixedFlag.NATIONAL_LAND },
 ];
 
 export { fixedFlag as default, fixedFlagList as List };

+ 6 - 6
modules/price_info_lib/facade/index.js

@@ -189,12 +189,12 @@ async function importExcelData(libID, sheetData) {
     for (let row = 1; row < sheetData.length; row++) {
         const areaName = sheetData[row][colMap.area] || '';
         const className = sheetData[row][colMap.class] || '';
-        const code = sheetData[row][colMap.code] || '';
-        const name = sheetData[row][colMap.name] || '';
-        const specs = sheetData[row][colMap.specs] || '';
-        const unit = sheetData[row][colMap.unit] || '';
-        const noTaxPrice = sheetData[row][colMap.noTaxPrice] || '';
-        const taxPrice = sheetData[row][colMap.taxPrice] || '';
+        const code = sheetData[row][colMap.code] ? sheetData[row][colMap.code].trim() : '';
+        const name = sheetData[row][colMap.name] ? sheetData[row][colMap.name].trim() : '';
+        const specs = sheetData[row][colMap.specs] ? sheetData[row][colMap.specs].trim() : '';
+        const unit = sheetData[row][colMap.unit] ? sheetData[row][colMap.unit].trim() : '';
+        const noTaxPrice = sheetData[row][colMap.noTaxPrice] ? sheetData[row][colMap.noTaxPrice].trim() : '';
+        const taxPrice = sheetData[row][colMap.taxPrice] ? sheetData[row][colMap.taxPrice].trim() : '';
         if (!className && !code && !name && !specs && !noTaxPrice && !taxPrice) { // 认为是空数据
             continue;
         }

+ 11 - 0
modules/price_info_summary/controllers/index.js

@@ -60,6 +60,17 @@ class PriceInfoSummaryController extends BaseController {
         }
     }
 
+    // 清除前后空格
+    async trim(req, res) {
+        try {
+            await facade.trim();
+            res.json({ error: 0, message: 'trim success' });
+        } catch (err) {
+            console.log(err);
+            res.json({ error: 1, message: err.toString() });
+        }
+    }
+
     async aiMatch(req, res) {
         try {
             const { listA, listB } = JSON.parse(req.body.data);

+ 27 - 0
modules/price_info_summary/facade/index.js

@@ -97,6 +97,32 @@ async function exportExcelData() {
     return excelData;
 }
 
+// 清除前后空格
+async function trim() {
+    const bulks = [];
+    const items = await priceInfoSummaryModel.find({}, '-_id').lean();
+    items.forEach(item => {
+        const update = {};
+        let needUpdate = false;
+        ['code', 'classCode', 'expString', 'name', 'specs', 'unit'].forEach(key => {
+            const val = item[key];
+            if (val) {
+                const trimVal = val.trim();
+                if (trimVal !== val) {
+                    update[key] = trimVal;
+                    needUpdate = true;
+                }
+            }
+        });
+        if (needUpdate) {
+            bulks.push({ updateOne: { filter: { ID: item.ID }, update } });
+        }
+    });
+    if (bulks.length) {
+        await priceInfoSummaryModel.bulkWrite(bulks);
+    }
+}
+
 module.exports = {
     getData,
     getPagingData,
@@ -104,4 +130,5 @@ module.exports = {
     saveInSummary,
     exportExcelData,
     aiMatch,
+    trim,
 }

+ 1 - 0
modules/price_info_summary/routes/index.js

@@ -13,6 +13,7 @@ module.exports = function (app) {
     router.post("/editSummaryData", priceInfoSummaryController.auth, priceInfoSummaryController.init, priceInfoSummaryController.editSummaryData);
     router.post("/saveInSummary", priceInfoSummaryController.auth, priceInfoSummaryController.init, priceInfoSummaryController.saveInSummary);
     router.post("/aiMatch", priceInfoSummaryController.auth, priceInfoSummaryController.init, priceInfoSummaryController.aiMatch);
+    router.post("/trim", priceInfoSummaryController.auth, priceInfoSummaryController.init, priceInfoSummaryController.trim);
     router.get("/export", priceInfoSummaryController.auth, priceInfoSummaryController.init, priceInfoSummaryController.exportSummaryData);
 
     app.use("/priceInfoSummary", router);

+ 356 - 236
modules/reports/rpt_component/helper/jpc_helper_cross_tab.js

@@ -1,257 +1,377 @@
-let JV = require('../jpc_value_define');
-let JE = require('../jpc_rte');
-let JpcCommonHelper = require('./jpc_helper_common');
+let JV = require("../jpc_value_define");
+let JE = require("../jpc_rte");
+let JpcCommonHelper = require("./jpc_helper_common");
 
 let JpcCrossTabHelper = {
-    getColIDX: function(cl, val) {
-        let rst = -1;
-        for (let i = 0; i < cl.length; i++) {
-            let ca = cl[i];
-            for (let j = 0; j < ca.length; j++) {
-                if (ca[j] == val) {
-                    rst = i;
-                    break;
-                }
-            }
-            if (rst != -1) {
-                break;
-            }
+  getColIDX: function (cl, val) {
+    let rst = -1;
+    for (let i = 0; i < cl.length; i++) {
+      let ca = cl[i];
+      for (let j = 0; j < ca.length; j++) {
+        if (ca[j] == val) {
+          rst = i;
+          break;
         }
-        return rst;
-    },
-    pushToSeg: function(segArr, dataSeq, segIdx, sIdx, eIdx) {
-        let arrIdx = [];
-        for (let k = sIdx; k < eIdx; k++) {
-            arrIdx.push(dataSeq[segIdx][k]);
+      }
+      if (rst != -1) {
+        break;
+      }
+    }
+    return rst;
+  },
+  pushToSeg: function (segArr, dataSeq, segIdx, sIdx, eIdx) {
+    let arrIdx = [];
+    for (let k = sIdx; k < eIdx; k++) {
+      arrIdx.push(dataSeq[segIdx][k]);
+    }
+    segArr.push(arrIdx);
+  },
+  sortFieldValue: function (sIDX, eIDX, sortOrder, dataField, dataValSeq) {
+    let tmpSeq = [];
+    if (sortOrder && sortOrder !== JV.TAB_FIELD_PROP_SORT_VAL_NOSORT) {
+      if (sIDX >= 0 && eIDX >= sIDX && dataValSeq.length > eIDX) {
+        let reversed = 1;
+        if (sortOrder === JV.TAB_FIELD_PROP_SORT_VAL_DESC) {
+          reversed = -1;
         }
-        segArr.push(arrIdx);
-    },
-    sortFieldValue: function(sIDX, eIDX, sortOrder, dataField, dataValSeq) {
-        let tmpSeq = [];
-        if ((sortOrder) && (sortOrder !== JV.TAB_FIELD_PROP_SORT_VAL_NOSORT)) {
-            if (sIDX >= 0 && eIDX >= sIDX && dataValSeq.length > eIDX) {
-                let reversed = 1;
-                if (sortOrder === JV.TAB_FIELD_PROP_SORT_VAL_DESC) {
-                    reversed = -1;
-                }
-                for (let i = sIDX; i <= eIDX; i++) {
-                    tmpSeq.push(dataValSeq[i]);
-                }
-                tmpSeq.sort(function(idx1, idx2) {
-                    let rst = 0;
-                    // if (isNaN(parseFloat(dataField[idx1])) || isNaN(parseFloat(dataField[idx1]))) {
-                    if (typeof (dataField[idx1]) === 'string' || typeof (dataField[idx1]) === 'string' ) {
-                        if (dataField[idx1] > dataField[idx2]) {
-                            rst = reversed;
-                        } else if (dataField[idx1] < dataField[idx2]) {
-                            rst = -reversed;
-                        }
-                    } else {
-                        if ((1.0 * dataField[idx1]) > (1.0 * dataField[idx2])) {
-                            rst = reversed;
-                        } else if ((1.0 * dataField[idx1]) < (1.0 * dataField[idx2])) {
-                            rst = -reversed;
-                        }
-                    }
-                    return rst;
-                });
-            }
+        for (let i = sIDX; i <= eIDX; i++) {
+          tmpSeq.push(dataValSeq[i]);
         }
-        if (tmpSeq.length > 0) {
-            for (let i = sIDX; i <= eIDX; i++) {
-                dataValSeq[i] = tmpSeq[i - sIDX];
+        tmpSeq.sort(function (idx1, idx2) {
+          let rst = 0;
+          // if (isNaN(parseFloat(dataField[idx1])) || isNaN(parseFloat(dataField[idx1]))) {
+          if (
+            typeof dataField[idx1] === "string" ||
+            typeof dataField[idx1] === "string"
+          ) {
+            if (dataField[idx1] > dataField[idx2]) {
+              rst = reversed;
+            } else if (dataField[idx1] < dataField[idx2]) {
+              rst = -reversed;
             }
-        }
-        return tmpSeq;
-    },
-    checkIfEqual: function(dataFields, seq1, seq2) {
-        let rst = true;
-        for (let i = 0; i < dataFields.length; i++) {
-            if ((dataFields[i][seq1] !== dataFields[i][seq2])) {
-                rst = false;
-                break;
+          } else {
+            if (1.0 * dataField[idx1] > 1.0 * dataField[idx2]) {
+              rst = reversed;
+            } else if (1.0 * dataField[idx1] < 1.0 * dataField[idx2]) {
+              rst = -reversed;
             }
-        }
-        return rst;
-    },
-    sortTabFields: function(tabFields, fieldSeqs, data_details, dataSeq, $CURRENT_RPT) {
-        let me = this;
-        let sIDX = 0, eIDX = -1, isFirstSort = true;
-        for (let i = 0; i < tabFields.length; i++) {
-            let tabField = tabFields[i];
-            if (tabField[JV.TAB_FIELD_PROP_SORT] !== JV.TAB_FIELD_PROP_SORT_VAL_NOSORT) {
-                if (isFirstSort) {
-                    isFirstSort = false;
-                    //first field, should sort all data items
-                    for (let j = 0; j < dataSeq.length; j++) {
-                        sIDX = 0;
-                        eIDX = dataSeq[j].length - 1;
-                        //sort the field value here
-                        if (typeof(fieldSeqs[i]) === "object") {
-                            let exFirstField = JE.F(fieldSeqs[i][JV.PROP_ID], $CURRENT_RPT);
-                            if (exFirstField) {
-                                me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT], exFirstField[JV.PROP_AD_HOC_DATA], dataSeq[j]);
-                            } else {
-                                //不排序(健壮性)
-                            }
-                        } else {
-                            me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT],data_details[fieldSeqs[i]], dataSeq[j]);
-                        }
-                        // me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT],data_details[fieldSeqs[i]], dataSeq[j]);
-                    }
+          }
+          return rst;
+        });
+      }
+    }
+    if (tmpSeq.length > 0) {
+      for (let i = sIDX; i <= eIDX; i++) {
+        dataValSeq[i] = tmpSeq[i - sIDX];
+      }
+    }
+    return tmpSeq;
+  },
+  checkIfEqual: function (dataFields, seq1, seq2) {
+    let rst = true;
+    for (let i = 0; i < dataFields.length; i++) {
+      if (dataFields[i][seq1] !== dataFields[i][seq2]) {
+        rst = false;
+        break;
+      }
+    }
+    return rst;
+  },
+  sortTabFields: function (
+    tabFields,
+    fieldSeqs,
+    data_details,
+    dataSeq,
+    $CURRENT_RPT
+  ) {
+    let me = this;
+    let sIDX = 0,
+      eIDX = -1,
+      isFirstSort = true;
+    for (let i = 0; i < tabFields.length; i++) {
+      let tabField = tabFields[i];
+      if (
+        tabField[JV.TAB_FIELD_PROP_SORT] !== JV.TAB_FIELD_PROP_SORT_VAL_NOSORT
+      ) {
+        if (isFirstSort) {
+          isFirstSort = false;
+          //first field, should sort all data items
+          for (let j = 0; j < dataSeq.length; j++) {
+            sIDX = 0;
+            eIDX = dataSeq[j].length - 1;
+            //sort the field value here
+            if (typeof fieldSeqs[i] === "object") {
+              let exFirstField = JE.F(fieldSeqs[i][JV.PROP_ID], $CURRENT_RPT);
+              if (exFirstField) {
+                me.sortFieldValue(
+                  sIDX,
+                  eIDX,
+                  tabField[JV.TAB_FIELD_PROP_SORT],
+                  exFirstField[JV.PROP_AD_HOC_DATA],
+                  dataSeq[j]
+                );
+              } else {
+                //不排序(健壮性)
+              }
+            } else {
+              me.sortFieldValue(
+                sIDX,
+                eIDX,
+                tabField[JV.TAB_FIELD_PROP_SORT],
+                data_details[fieldSeqs[i]],
+                dataSeq[j]
+              );
+            }
+            // me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT],data_details[fieldSeqs[i]], dataSeq[j]);
+          }
+        } else {
+          //then sort the rest fields one by one
+          for (let j = 0; j < dataSeq.length; j++) {
+            let chkFields = [];
+            for (let k = 0; k < i; k++) {
+              if (typeof fieldSeqs[k] === "object") {
+                let exField = JE.F(fieldSeqs[k][JV.PROP_ID], $CURRENT_RPT);
+                if (exField) {
+                  chkFields.push(exField[JV.PROP_AD_HOC_DATA]);
                 } else {
-                    //then sort the rest fields one by one
-                    for (let j = 0; j < dataSeq.length; j++) {
-                        let chkFields = [];
-                        for (let k = 0; k < i; k++) {
-                            if (typeof(fieldSeqs[k]) === "object") {
-                                let exField = JE.F(fieldSeqs[k][JV.PROP_ID], $CURRENT_RPT);
-                                if (exField) {
-                                    chkFields.push(exField[JV.PROP_AD_HOC_DATA]);
-                                } else {
-                                    chkFields.push(null);
-                                }
-                            } else {
-                                chkFields.push(data_details[fieldSeqs[k]]);
-                            }
-                            // chkFields.push(data_details[fieldSeqs[k]]);
-                        }
-                        sIDX = 0, eIDX = -1;
-                        for (let m = 1; m < dataSeq[j].length; m++) {
-                            if (!(me.checkIfEqual(chkFields, dataSeq[j][m - 1], dataSeq[j][m]))) {
-                                eIDX = m - 1;
-                            } else if (m == dataSeq[j].length - 1) {
-                                eIDX = m;
-                            };
-                            if (eIDX >= sIDX) {
-                                if (eIDX != sIDX) {
-                                    if (typeof(fieldSeqs[i]) === "object") {
-                                        let exOtherField = JE.F(fieldSeqs[i][JV.PROP_ID], $CURRENT_RPT);
-                                        if (exOtherField) {
-                                            me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT], exOtherField[JV.PROP_AD_HOC_DATA], dataSeq[j]);
-                                        } else {
-                                            //不排序(健壮性)
-                                        }
-                                    } else {
-                                        me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT],data_details[fieldSeqs[i]], dataSeq[j]);
-                                    }
-                                    // me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT],data_details[fieldSeqs[i]], dataSeq[j]);
-                                }
-                                sIDX = m;
-                                eIDX = m - 1; //for protection purpose
-                            }
-                        }
-                    }
+                  chkFields.push(null);
                 }
+              } else {
+                chkFields.push(data_details[fieldSeqs[k]]);
+              }
+              // chkFields.push(data_details[fieldSeqs[k]]);
             }
-        }
-    },
-    getMaxRowsPerPage: function(bands, rptTpl) {
-        let rst = 1;
-        let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_BAND_NAME]];
-        if (band) {
-            rst =  getMaxTabCntPerPage(rptTpl, JV.NODE_CROSS_ROW, JV.PROP_CMN_HEIGHT, band.Bottom - band.Top);
-        }
-        return rst;
-    },
-    getMaxColsPerPage: function(bands, rptTpl) {
-        let rst = 1;
-        let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_BAND_NAME]];
-        if (band) {
-            rst =  getMaxTabCntPerPage(rptTpl, JV.NODE_CROSS_COL, JV.PROP_CMN_WIDTH, band.Right - band.Left);
-        }
-        return rst;
-    },
-    getActualRowsHeight: function(bands, rptTpl, segments, page) {
-        let rst = 1;
-        let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_BAND_NAME]];
-        if (band) {
-            rst =  getActualContentAreaMeasurement(rptTpl, JV.NODE_CROSS_ROW, JV.PROP_CMN_HEIGHT, band.Bottom - band.Top, segments, page);
-        }
-        return rst;
-    },
-    getActualColsWidth: function(bands, rptTpl, segments, page) {
-        let rst = 1;
-        let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_BAND_NAME]];
-        if (band) {
-            rst =  getActualContentAreaMeasurement(rptTpl, JV.NODE_CROSS_COL, JV.PROP_CMN_WIDTH, band.Right - band.Left, segments, page);
-        }
-        return rst;
-    },
-    chkTabEnd: function(tabType, rptTpl, bands, sortedSequence, segIdx, preRec, nextRec) {
-        let me = this, rst = true;
-        let remainAmt = preRec + nextRec - sortedSequence[segIdx].length;
-        rst = me.hasEnoughSpace(tabType, rptTpl, bands, remainAmt);
-        return rst;
-    },
-    hasEnoughSpace: function (tabType, rptTpl, bands, remainAmt) {
-        if (remainAmt < 0) return false;
-        let rst = true, measurement = 1.0, douDiffForCompare = 0.00001;
-        let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-        let band = null;
-        if (rptTpl[JV.NODE_CROSS_INFO][tabType]) {
-            band = bands[rptTpl[JV.NODE_CROSS_INFO][tabType][JV.PROP_BAND_NAME]];
-        }
-        if (band != null && band != undefined) {
-            if (tabType === JV.NODE_CROSS_ROW_SUM || tabType === JV.NODE_CROSS_ROW_EXT) {
-                measurement = 1.0 * rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_CMN_HEIGHT] * unitFactor;
-                let spareHeight = measurement * remainAmt;
-                let douH = 1.0 * (band.Bottom - band.Top);
-                rst = (spareHeight >= douH) || (spareHeight - douH <= douDiffForCompare);
-            } else if (tabType === JV.NODE_CROSS_COL_SUM) {
-                measurement = 1.0 * rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_CMN_WIDTH] * unitFactor;
-                let spareWidth = measurement * remainAmt;
-                let douW = 1.0 * (band.Right - band.Left);
-                rst = (spareWidth >= douW) || (spareWidth - douW <= douDiffForCompare);
+            (sIDX = 0), (eIDX = -1);
+            for (let m = 1; m < dataSeq[j].length; m++) {
+              if (
+                !me.checkIfEqual(chkFields, dataSeq[j][m - 1], dataSeq[j][m])
+              ) {
+                eIDX = m - 1;
+              } else if (m == dataSeq[j].length - 1) {
+                eIDX = m;
+              }
+              if (eIDX >= sIDX) {
+                if (eIDX != sIDX) {
+                  if (typeof fieldSeqs[i] === "object") {
+                    let exOtherField = JE.F(
+                      fieldSeqs[i][JV.PROP_ID],
+                      $CURRENT_RPT
+                    );
+                    if (exOtherField) {
+                      me.sortFieldValue(
+                        sIDX,
+                        eIDX,
+                        tabField[JV.TAB_FIELD_PROP_SORT],
+                        exOtherField[JV.PROP_AD_HOC_DATA],
+                        dataSeq[j]
+                      );
+                    } else {
+                      //不排序(健壮性)
+                    }
+                  } else {
+                    me.sortFieldValue(
+                      sIDX,
+                      eIDX,
+                      tabField[JV.TAB_FIELD_PROP_SORT],
+                      data_details[fieldSeqs[i]],
+                      dataSeq[j]
+                    );
+                  }
+                  // me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT],data_details[fieldSeqs[i]], dataSeq[j]);
+                }
+                sIDX = m;
+                eIDX = m - 1; //for protection purpose
+              }
             }
+          }
         }
-        return rst;
-    },
-    initialPageStatus: function (pageStatus) {
-        pageStatus[JV.STATUS_NORMAL] = true;
-        pageStatus[JV.STATUS_REPORT_START] = false;
-        pageStatus[JV.STATUS_REPORT_END] = false;
-        pageStatus[JV.STATUS_SEGMENT_START] = false;
-        pageStatus[JV.STATUS_SEGMENT_END] = false;
-        pageStatus[JV.STATUS_GROUP] = false;
-        pageStatus[JV.STATUS_CROSS_ROW_END] = false;
-        pageStatus[JV.STATUS_CROSS_COL_END] = false;
+      }
     }
-};
-
-function getMaxTabCntPerPage(rptTpl, tabNodeName, tabMeasurePropName, measureForCal) {
+  },
+  getMaxRowsPerPage: function (bands, rptTpl) {
     let rst = 1;
-    if (rptTpl[JV.NODE_CROSS_INFO][tabNodeName]) {
-        let tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName];
-        let maxFieldMeasure = 1.0;
-        if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
-            let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-            maxFieldMeasure = 1.0 * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] * unitFactor;
-        } else {
-            maxFieldMeasure = measureForCal * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] / JV.HUNDRED_PERCENT;
-        }
-        rst = Math.floor(measureForCal / maxFieldMeasure);
+    let band =
+      bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_BAND_NAME]];
+    if (band) {
+      rst = getMaxTabCntPerPage(
+        rptTpl,
+        JV.NODE_CROSS_ROW,
+        JV.PROP_CMN_HEIGHT,
+        band.Bottom - band.Top
+      );
     }
-    if (rst <= 0) rst = 1;
     return rst;
-};
-
-function getActualContentAreaMeasurement(rptTpl, tabNodeName, tabMeasurePropName, measureForCal, segments, page) {
+  },
+  getMaxColsPerPage: function (bands, rptTpl) {
     let rst = 1;
-    if (rptTpl[JV.NODE_CROSS_INFO][tabNodeName]) {
-        let tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName];
-        let maxFieldMeasure = 1.0;
-        if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
-            let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-            maxFieldMeasure = 1.0 * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] * unitFactor;
-        } else {
-            maxFieldMeasure = measureForCal * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] / JV.HUNDRED_PERCENT;
-        }
-        if (segments.length >= page) {
-            rst = segments[page - 1].length * maxFieldMeasure;
-        }
+    let band =
+      bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_BAND_NAME]];
+    if (band) {
+      rst = getMaxTabCntPerPage(
+        rptTpl,
+        JV.NODE_CROSS_COL,
+        JV.PROP_CMN_WIDTH,
+        band.Right - band.Left
+      );
     }
     return rst;
+  },
+  getActualRowsHeight: function (bands, rptTpl, segments, page) {
+    let rst = 1;
+    let band =
+      bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_BAND_NAME]];
+    if (band) {
+      rst = getActualContentAreaMeasurement(
+        rptTpl,
+        JV.NODE_CROSS_ROW,
+        JV.PROP_CMN_HEIGHT,
+        band.Bottom - band.Top,
+        segments,
+        page
+      );
+    }
+    return rst;
+  },
+  getActualColsWidth: function (bands, rptTpl, segments, page) {
+    let rst = 1;
+    let band =
+      bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_BAND_NAME]];
+    if (band) {
+      rst = getActualContentAreaMeasurement(
+        rptTpl,
+        JV.NODE_CROSS_COL,
+        JV.PROP_CMN_WIDTH,
+        band.Right - band.Left,
+        segments,
+        page
+      );
+    }
+    return rst;
+  },
+  chkTabEnd: function (
+    tabType,
+    rptTpl,
+    bands,
+    sortedSequence,
+    segIdx,
+    preRec,
+    nextRec
+  ) {
+    let me = this,
+      rst = true;
+    let remainAmt = preRec + nextRec - sortedSequence[segIdx].length;
+    rst = me.hasEnoughSpace(tabType, rptTpl, bands, remainAmt);
+    return rst;
+  },
+  hasEnoughSpace: function (tabType, rptTpl, bands, remainAmt) {
+    if (remainAmt < 0) return false;
+    let rst = true,
+      measurement = 1.0,
+      douDiffForCompare = 0.00001;
+    let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
+    let band = null;
+    if (rptTpl[JV.NODE_CROSS_INFO][tabType]) {
+      band = bands[rptTpl[JV.NODE_CROSS_INFO][tabType][JV.PROP_BAND_NAME]];
+    }
+    if (band != null && band != undefined) {
+      if (
+        tabType === JV.NODE_CROSS_ROW_SUM ||
+        tabType === JV.NODE_CROSS_ROW_EXT
+      ) {
+        measurement =
+          1.0 *
+          rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_CMN_HEIGHT] *
+          unitFactor;
+        let spareHeight = measurement * remainAmt;
+        let douH = 1.0 * (band.Bottom - band.Top);
+        rst = spareHeight >= douH || spareHeight - douH <= douDiffForCompare;
+      } else if (tabType === JV.NODE_CROSS_COL_SUM) {
+        measurement =
+          1.0 *
+          rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_CMN_WIDTH] *
+          unitFactor;
+        let spareWidth = measurement * remainAmt;
+        let douW = 1.0 * (band.Right - band.Left);
+        rst = spareWidth >= douW || spareWidth - douW <= douDiffForCompare;
+      }
+    }
+    return rst;
+  },
+  initialPageStatus: function (pageStatus) {
+    pageStatus[JV.STATUS_NORMAL] = true;
+    pageStatus[JV.STATUS_REPORT_START] = false;
+    pageStatus[JV.STATUS_REPORT_END] = false;
+    pageStatus[JV.STATUS_SEGMENT_START] = false;
+    pageStatus[JV.STATUS_SEGMENT_END] = false;
+    pageStatus[JV.STATUS_GROUP] = false;
+    pageStatus[JV.STATUS_CROSS_ROW_END] = false;
+    pageStatus[JV.STATUS_CROSS_COL_END] = false;
+  },
 };
 
-module.exports = JpcCrossTabHelper;
+function getMaxTabCntPerPage(
+  rptTpl,
+  tabNodeName,
+  tabMeasurePropName,
+  measureForCal
+) {
+  let rst = 1;
+  if (rptTpl[JV.NODE_CROSS_INFO][tabNodeName]) {
+    let tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName];
+    let maxFieldMeasure = 1.0;
+    if (
+      JV.CAL_TYPE_ABSTRACT ===
+      JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])
+    ) {
+      let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
+      maxFieldMeasure =
+        1.0 *
+        rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] *
+        unitFactor;
+    } else {
+      maxFieldMeasure =
+        (measureForCal *
+          rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName]) /
+        JV.HUNDRED_PERCENT;
+    }
+    rst = Math.floor(measureForCal / maxFieldMeasure);
+  }
+  if (rst <= 0) rst = 1;
+  return rst;
+}
+
+function getActualContentAreaMeasurement(
+  rptTpl,
+  tabNodeName,
+  tabMeasurePropName,
+  measureForCal,
+  segments,
+  page
+) {
+  let rst = 1;
+  if (rptTpl[JV.NODE_CROSS_INFO][tabNodeName]) {
+    let tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName];
+    let maxFieldMeasure = 1.0;
+    if (
+      JV.CAL_TYPE_ABSTRACT ===
+      JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])
+    ) {
+      let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
+      maxFieldMeasure =
+        1.0 *
+        rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] *
+        unitFactor;
+    } else {
+      maxFieldMeasure =
+        (measureForCal *
+          rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName]) /
+        JV.HUNDRED_PERCENT;
+    }
+    if (segments.length >= page) {
+      rst = segments[page - 1].length * maxFieldMeasure;
+    }
+  }
+  return rst;
+}
+
+module.exports = JpcCrossTabHelper;

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1793 - 754
modules/reports/rpt_component/jpc_cross_tab.js


+ 1 - 1
public/web/tools_const.js

@@ -10,7 +10,7 @@
 //允许使用的工料机类型:人工、普通材料、混凝土、砂浆、配合比、商品混凝土、商品砂浆、外购砼构件、绿化苗木
 // 机械台班、机械组成物、机上人工、设备
 let allowGljType = [
-  1, 201, 202, 203, 204, 205, 206, 208, 209, 301, 302, 303, 5, 9, 10,
+  1, 201, 202, 203, 204, 205, 206, 208, 209, 301, 302, 303, 5, 9, 10, 11
 ];
 
 //允许含有组成物的工料机类型:混凝土、砂浆、配合比、机械台班

+ 6 - 6
web/maintain/price_info_lib/js/priceEmpty.js

@@ -256,12 +256,12 @@ const EMPTY_BOOK = (() => {
       removeIDs.push(item.ID);
       documents.push({
         ID: uuid.v1(),
-        code: item.code,
-        classCode: item.classCode,
-        expString: item.expString,
-        name: item.name,
-        specs: item.specs,
-        unit: item.unit,
+        code: item.code ? item.code.trim() : '',
+        classCode: item.classCode ? item.classCode.trim() : '',
+        expString: item.expString ? item.expString.trim() : '',
+        name: item.name ? item.name.trim() : '',
+        specs: item.specs ? item.specs.trim() : '',
+        unit: item.unit ? item.unit.trim() : '',
       });
     });
     if (!documents.length) {

+ 2 - 1
web/maintain/price_info_summary/html/main.html

@@ -18,7 +18,8 @@
             <span class="header-logo px-2">材料信息价总表</span>
             <a class="lock" data-locked="true" href="javascript:void(0);" title="解锁"><i
                 class="fa fa-unlock-alt"></i></a>
-                <a id="export" class="btn btn-success btn-sm" href="javascript:void(0);" title="导出" style="margin-left: 10px;"><i class="fa fa-sign-out fa-rotate-270"></i>导出</a>
+            <a id="export" class="btn btn-success btn-sm" href="javascript:void(0);" title="导出" style="margin-left: 10px;"><i class="fa fa-sign-out fa-rotate-270"></i>导出</a>
+            <a id="trim" class="btn btn-success btn-sm" href="javascript:void(0);" title="清除前后空格" style="margin-left: 10px;">清除前后空格</a>
         </nav>
     </div>
     <div class="search">

+ 3 - 0
web/maintain/price_info_summary/js/index.js

@@ -23,4 +23,7 @@ $(document).ready(() => {
     $('#export').click(() => {
         window.location.href = '/priceInfoSummary/export';
     });
+
+    // 清除前后空格
+    $('#trim').click(_.debounce(SUMMARY_BOOK.handleTrim, 200, { leading: true }));
 });

+ 17 - 0
web/maintain/price_info_summary/js/summarySheet.js

@@ -155,6 +155,22 @@ const SUMMARY_BOOK = (() => {
     loadPageData(0);
   }
 
+  // 清除前后空格
+  const handleTrim = async () => {
+    try {
+      $.bootstrapLoading.progressStart('清除前后空格', true);
+      $("#progress_modal_body").text('正在清除前后空格,请稍后...');
+      await ajaxPost('/priceInfoSummary/trim', {}, 1000 * 60 * 5);
+      setTimeout(() => {
+        $.bootstrapLoading.progressEnd();
+        window.location.reload()
+      }, 1000)
+    } catch (error) {
+      console.log(error);
+      $.bootstrapLoading.progressEnd();
+    }
+  }
+
 
   // 无限滚动加载
   const onTopRowChanged = (sender, args) => {
@@ -255,5 +271,6 @@ const SUMMARY_BOOK = (() => {
   return {
     sheet,
     handleSearch,
+    handleTrim,
   }
 })()

+ 1 - 0
web/maintain/ration_repository/dinge.html

@@ -206,6 +206,7 @@
                             </div>
                         </div>
                     </div>
+                    <!-- 子目换算 -->
                     <div class="main-side p-0 main-side-right" id="rightContent" style="width: 25%; display: none">
                         <div class="resize-x" id="slideResizeRight"></div>
                         <div style="width: 99%; float: left" id="zmhsWrap">

+ 32 - 6
web/maintain/ration_repository/js/coe.js

@@ -231,7 +231,10 @@ let coeOprObj = {
             { headerName: "名称", headerWidth: 200, dataCode: "name", dataType: "String", hAlign: "left", vAlign: "center", readOnly: false },
             { headerName: "内容", headerWidth: 150, dataCode: "content", dataType: "String", hAlign: "left", vAlign: "center", readOnly: false },
             { headerName: "原人材机编码", headerWidth: 90, dataCode: "original_code", dataType: "String", hAlign: "center", vAlign: "center", readOnly: false },
-            { headerName: "可选人材机编码", headerWidth: 150, dataCode: "option_codes", dataType: "String", hAlign: "center", vAlign: "center", readOnly: false }
+            { headerName: "可选人材机编码", headerWidth: 150, dataCode: "option_codes", dataType: "String", hAlign: "center", vAlign: "center", readOnly: false },
+            { headerName: "实际值", headerWidth: 60, dataCode: "actualVal", dataType: "String", hAlign: "center", vAlign: "center", readOnly: false },
+            { headerName: "最大值", headerWidth: 60, dataCode: "maxVal", dataType: "String", hAlign: "center", vAlign: "center", readOnly: false },
+            { headerName: "最小值", headerWidth: 60, dataCode: "minVal", dataType: "String", hAlign: "center", vAlign: "center", readOnly: false },
         ]
     },
     buildSheet: function (container) {
@@ -293,8 +296,10 @@ let coeOprObj = {
                             alert('该编号已存在!');
                             args.sheet.setValue(args.row, args.col, updateObj[dataCode] + '');
                         }
-                    }
-                    else {
+                    } else if (['actualVal', 'maxVal', 'minVal'].includes(dataCode) && isNaN(inputT)) {
+                        alert('只能输入数值!');
+                        args.sheet.setValue(args.row, args.col, updateObj[dataCode] || '');
+                    } else {
                         updateObj[dataCode] = inputT;
                         me.setOptionList(dataCode, inputT, updateObj);
                         updateArr.push(updateObj);
@@ -323,6 +328,9 @@ let coeOprObj = {
                         args.sheet.setValue(args.row, args.col, '');
                         alert('该编号已存在!');
                     }
+                } else if (['actualVal', 'maxVal', 'minVal'].includes(dataCode) && isNaN(inputT)) {
+                    alert('只能输入数值!');
+                    args.sheet.setValue(args.row, args.col, updateObj[dataCode] + '');
                 }
                 else {
                     newCoe.serialNo = ++me.currentMaxNo;
@@ -359,6 +367,12 @@ let coeOprObj = {
         let items = sheetCommonObj.analyzePasteData(me.setting, info);
         let uniqItems = me.makeUniqItems(items);
         for (let i = 0, len = uniqItems.length; i < len; i++) {
+            for (let attr in uniqItems[i]) {
+                if (['actualVal', 'maxVal', 'minVal'].includes(attr) && isNaN(uniqItems[i][attr])) {
+                    uniqItems[i][attr] = undefined;
+                }
+            }
+
             let row = i + info.cellRange.row;
             //update
             if (row < me.currentCoeList.length) {
@@ -562,8 +576,18 @@ let coeOprObj = {
             }
         });
     },
+    keepNumber: function (arr) {
+        arr.forEach(item => {
+            Object.keys(item).forEach(key => {
+                if (['actualVal', 'maxVal', 'minVal'].includes(key)) {
+                    item[key] = +item[key];
+                }
+            })
+        })
+    },
     save: function (addArr, updateArr, deleteArr, refresh, callback) {
         let me = coeOprObj;
+        // me.keepNumber(updateArr);
         $.ajax({
             type: "POST",
             url: "api/saveCoeList",
@@ -599,7 +623,7 @@ let coeOprObj = {
     }
 };
 
-// 验证数量的有效性:可以输入数值,也可以输入表达式,eg: [人材机编码]*1.5+1
+// 验证数量的有效性:可以输入数值,也可以输入表达式,eg: [人材机编码]*1.5+1,1+([v]-50)/100。 [v]代表前台调用时,子目换算实际值
 const validateAmount = (amountStr) => {
     if (!amountStr) {
         return true;
@@ -609,7 +633,8 @@ const validateAmount = (amountStr) => {
         return true;
     }
     try {
-        str = amountStr.replace(/\s/g, '').replace(/\[\d+\]/g, '0');
+        debugger;
+        str = amountStr.replace(/\s/g, '').replace(/\[v\]/g, '0').replace(/\[\d+\]/g, '0');
         eval(str);
 
     } catch (error) {
@@ -723,7 +748,7 @@ let gljAdjOprObj = {
             dataCode = me.setting.header[args.col].dataCode;
         if (args.editingText && args.editingText.toString().trim().length > 0) {
             if (dataCode === 'amount' && !validateAmount(args.editingText)) {
-                alert("请输入数值或者表达式,如:[人材机编码]*0.3+1");
+                alert("请输入数值或者表达式,如:[人材机编码]*0.3+1、1+([v]-50)/100");
                 args.sheet.setValue(args.row, args.col, typeof me.currentGljAdjList[args.row] !== 'undefined' && typeof me.currentGljAdjList[args.row][dataCode] !== 'undefined'
                     ? me.currentGljAdjList[args.row][dataCode] + '' : '');
             }
@@ -891,6 +916,7 @@ let gljAdjOprObj = {
     onDelOpr: function (workBook, setting) {
         let me = gljAdjOprObj;
         workBook.commandManager().register('gljAdjDel', function () {
+            debugger;
             let sheet = workBook.getSheet(0);
             let sels = sheet.getSelections();
             let isUpdate = false;

+ 1 - 1
web/maintain/ration_repository/js/ration_glj.js

@@ -16,7 +16,7 @@ var rationGLJOprObj = {
             { headerName: "规格型号", headerWidth: 100, dataCode: "specs", dataType: "String" },
             { headerName: "单位", headerWidth: 60, dataCode: "unit", dataType: "String", hAlign: "center", vAlign: "center" },
             { headerName: "定额价", headerWidth: 80, dataCode: "basePrice", dataType: "Number", formatter: "0.00", precision: 2 },
-            { headerName: "定额消耗", headerWidth: 80, dataCode: "consumeAmt", dataType: "Number", formatter: "0.000", precision: 3 },
+            { headerName: "定额消耗", headerWidth: 80, dataCode: "consumeAmt", dataType: "Number", formatter: "0.00000", precision: 5 },
             { headerName: "类型", headerWidth: 70, dataCode: "gljType", dataType: "String", hAlign: "center", vAlign: "center" },
             { headerName: "配合比", headerWidth: 70, dataCode: "proportion", dataType: "Number", formatter: "0.00", precision: 2 },
             { headerName: "损耗编号", headerWidth: 80, dataCode: "lossRateNo", dataType: "Number" },

+ 7 - 3
web/maintain/report/html/rpt_tpl_dtl_info.html

@@ -87,7 +87,7 @@
                         <option value="2">简易计税</option>
                     </select>
                 </div>
-                <div class="input-group col-4">
+                <div class="input-group col-3">
                     <div class="input-group-addon">工程类型</div>
                     <input class="form-control input-sm" id="element_prjFlags_select"
                         onchange="zTreeOprObj.onChangeFlag('valuationType', this)" style="display: none;">
@@ -106,7 +106,7 @@
 
                     </div>
                 </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_rptFlags_select"
                         onchange="zTreeOprObj.onChangeFlag('reportType', this)">
@@ -115,7 +115,7 @@
                         <option value="gljSummary">工程工料机汇总</option>
                     </select>
                 </div>
-                <div class="input-group col-2">
+                <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)">
@@ -136,7 +136,11 @@
                         <option value="complexConstructMultiple">各阶段项目对比(3个建设项目,多对多对多)</option>
                         <option value="complexSelfConstructMultiple">各阶段项目对比(当前建设项目对本阶段对其他阶段)</option>
                     </select>
+                    <label class="form-check-label" id="outputDesignDataBar" style="display: none;">
+                        <input onchange="zTreeOprObj.onChangeFlag('outputDesignData', this)"  id="outputDesignData" type="checkbox">输出设计清单
+                    </label>
                 </div>
+                
             </div>
 
         </div>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1368 - 992
web/maintain/report/js/rpt_tpl_data_map.js


+ 34 - 6
web/maintain/report/js/rpt_tpl_main.js

@@ -990,13 +990,26 @@ let zTreeOprObj = {
   onChangeFlag: function (flagProp, flagDom) {
     let me = zTreeOprObj;
     if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE) {
+      // 前端控制;
+      if (flagProp === "sumLevelType") {
+        if ($("#element_sumLv_flags").val() === "stageBackContrast") {
+          $("#outputDesignDataBar").show();
+        } else {
+          $("#outputDesignDataBar").hide();
+        }
+      }
       if (!me.currentNode.hasOwnProperty("flags")) {
         me.currentNode.flags = {};
       }
-      me.currentNode.flags[flagProp] =
-        flagDom.selectedOptions[0].value === "NA"
-          ? null
-          : flagDom.selectedOptions[0].value;
+      if (flagProp === "outputDesignData") {
+        me.currentNode.flags[flagProp] = flagDom.checked;
+      } else {
+        me.currentNode.flags[flagProp] =
+          flagDom.selectedOptions[0].value === "NA"
+            ? null
+            : flagDom.selectedOptions[0].value;
+      }
+
       let subTopNode = me.getParentNodeByNodeLevel(
         me.currentNode,
         NODE_LEVEL_COMPILATION_NEW + 1
@@ -1160,6 +1173,11 @@ let zTreeOprObj = {
       me.currentNode.refId > 0
     ) {
       if (forceRefresh || !me.currentNode.rptTpl) {
+        // 初始化dom
+        // 该属性是根据项目汇总级别显示的
+        $("#outputDesignDataBar").hide();
+        $("#outputDesignData").attr("checked", false);
+        // 初始化dom
         params.rptTplId = me.currentNode.refId;
         CommonAjax.postEx(
           "report_tpl_api/getRefRptTpl",
@@ -1256,7 +1274,17 @@ let zTreeOprObj = {
                   $("#element_sumLv_flags")[0].selectedIndex = 14;
                 else if (sumLvType === "complexSelfConstructMultiple")
                   $("#element_sumLv_flags")[0].selectedIndex = 15;
-                else $("#element_sumLv_flags")[0].selectedIndex = 0;
+                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;
               }
@@ -1373,7 +1401,7 @@ let zTreeOprObj = {
                 );
               }
             });
-            if (me.currentNode.flags.hasOwnProperty("aidReportID")) {
+            if (me.currentNode.flags?.hasOwnProperty("aidReportID")) {
               let val = me.currentNode.flags["aidReportID"];
               $("#select_aid_report_data_select").val(val);
             }