소스 검색

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

Tony Kang 1 년 전
부모
커밋
f39f986819

+ 1 - 0
modules/all_models/compilation.js

@@ -101,6 +101,7 @@ let modelSchema = {
         default: 12 // 总部id
     },
     defaultLocation:String,//默认工程所在地
+    type:String,//编办类型
     freeUse:Boolean
 };
 mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));

+ 1 - 0
modules/all_models/stdBills_bills.js

@@ -34,6 +34,7 @@ const stdBills_bills = new Schema({
     kind: Number, // 前台里(重构、微前端)BRType: 1: 大项费用、 8:XMJ 4:清单
     erratumRecord: String, // 勘误记录
     unitPrice: Number, // 单价
+    isBillBudget: Boolean, // 清单预算标记
 },
     { versionKey: false }
 );

+ 23 - 0
modules/users/controllers/compilation_controller.js

@@ -76,6 +76,7 @@ class CompilationController extends BaseController {
             compilationList: compilationList,
             categoryList: categoryList,
             locationList: locationList,
+            typeList: [{label:'建设工程',value:'building'},{label:'公路建设',value:'highway'},{label:'公路养护',value:'yanghu'},{label:'成本测算',value:'cost'}],
             selectedCompilation: selectedCompilation,
             title: config[process.env.NODE_ENV].title ? config[process.env.NODE_ENV].title : '养护云版',
             layout: 'users/views/layout/layout',
@@ -813,6 +814,28 @@ class CompilationController extends BaseController {
         }
     }
 
+       /**
+   * 更改编办默认工程所在工
+   *
+   * @param request
+   * @param response
+   * @return {Promise.<void>}
+   */
+       async changeCompilation(request, response) {
+        let compilationId = request.body.id;
+        let update = request.body.update;
+        try {
+            let compilationModel = new CompilationModel();
+            let result = await compilationModel.updateById(compilationId, update);
+            if (result) {
+                response.json({ error: 0, message: '', data: null });
+            } else {
+                response.json({ error: 1, message: '更新数据错误', data: null });
+            }
+        } catch (error) {
+            response.json({ error: 1, message: '更新数据错误', data: null });
+        }
+    }
 
     /**
     * 更改编办默认工程所在工

+ 1 - 1
modules/users/models/compilation_model.js

@@ -44,7 +44,7 @@ class CompilationModel extends BaseModel {
             "rough_valuation.id": 1, "rough_valuation.name": 1, "rough_valuation.enable": 1,
             "bill_valuation.id": 1, "bill_valuation.name": 1, "bill_valuation.enable": 1,
             "estimation_valuation.id": 1, "estimation_valuation.name": 1, "estimation_valuation.enable": 1,
-            "bill_valuation.fileTypes": 1
+            "bill_valuation.fileTypes": 1,type:1
         } : fields;
         // 一定要查询序号,然后排序输出
         field.serialNumber = 1;

+ 1 - 0
modules/users/routes/compilation_route.js

@@ -37,6 +37,7 @@ module.exports = function (app) {
 
     router.post('/changeCategory', compilationController.auth, compilationController.init, compilationController.changeCategory);
     router.post('/changeLocation', compilationController.auth, compilationController.init, compilationController.changeLocation);
+    router.post('/changeCompilation', compilationController.auth, compilationController.init, compilationController.changeCompilation);
     router.post('/changeFreeUse', compilationController.auth, compilationController.init, compilationController.changeFreeUse);
     router.post('/setEdition', compilationController.auth, compilationController.init, compilationController.setEdition);
     router.post('/setSerialNumber', compilationController.auth, compilationController.init, compilationController.setSerialNumber);

+ 21 - 17
public/web/rpt_value_define.js

@@ -24,14 +24,14 @@ const JV = {
     NODE_EVENTS: "事件_集合",
     NODE_DISCRETE_INFO: "离散信息",
     NODE_BILL_INFO: "账单式表_信息",
-    NODE_BILL_CONTENT : "账单式表_数据",
+    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 : "流水式表_数据",
+    NODE_FLOW_COLUMN: "流水式表_列",
+    NODE_FLOW_CONTENT: "流水式表_数据",
     PROP_MULTI_COLUMN: "多列显示数量",
     PROP_ERASE_BLANK_ROWS: '空行提上',
     PROP_FLOW_EX_DISPLAY_MODE: "流水拓展显示模式",
@@ -73,6 +73,9 @@ const JV = {
     PROP_HANDLE_TYPE_COMPONENT_MOVE: "组成物数据转移",
     PROP_HANDLE_TYPE_COMPONENT_REPLACEMENT: "组成物替换",
     PROP_HANDLE_TYPE_PRECISION: "合计精度",
+    PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS: "转化工程量清单",
+    PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_SORT_TYPE: "工程量清单排序类型",
+    PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_DATA_TYPE: "工程量清单数据类型",
 
     PROP_ADJUST_COLLECTION: "数据调整集",
     PROP_ADJUST_ACTION: "action",
@@ -94,6 +97,7 @@ const JV = {
     PROP_FIELD_EXP_FIXED_MAP: "fixedMapExpression",
     PROP_FIELD_EXP_FLEXIBLE_MAP: "flexibleMapExpression",
     PROP_FLEXIBLE_REF_FILED_ID: "flexibleRefFieldID",
+    PROP_QUANTITIES_BILLS_LEVEL: "工程量清单输出类型",
 
     NODE_FONT_COLLECTION: "font_collection",
     NODE_STYLE_COLLECTION: "style_collection",
@@ -177,9 +181,9 @@ const JV = {
     BAND_PROP_SUB_BANDS: "band_s",
 
     MEASUREMENT: {
-        PIXEL:["像素点", "象素点", "PIXEL"],
+        PIXEL: ["像素点", "象素点", "PIXEL"],
         CM: ["厘米", "CM"],
-        INCH: ["英寸","INCH"]
+        INCH: ["英寸", "INCH"]
     },
 
     PROP_IS_ID: "isID",
@@ -213,7 +217,7 @@ const JV = {
 
     RUN_TYPE_BEFORE_GROUP_TEXT_OUT: "before_group_text_output",
 
-    PAGE_STATUS: ["EveryPage","FirstPage", "LastPage", "SegmentStart", "SegmentEnd", "Group", "CrossRowEnd", "CrossColEnd"],
+    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,
@@ -247,7 +251,7 @@ const JV = {
     STATUS_CROSS_ROW_END: 6,
     STATUS_CROSS_COL_END: 7,
 
-    LAYOUT: ["Top","Bottom", "Left", "Right", "Fulfill"],
+    LAYOUT: ["Top", "Bottom", "Left", "Right", "Fulfill"],
     LAYOUT_TOP: 0,
     LAYOUT_BOTTOM: 1,
     LAYOUT_LEFT: 2,
@@ -258,14 +262,14 @@ const JV = {
         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"],
+    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,
 
@@ -289,7 +293,7 @@ const JV = {
     SIZE_16K: [7.75, 10.75],
     SIZE_EXECUTIVE: [7.25, 10.5],
 
-    OUTPUT_OFFSET: [2,2,1,3],
+    OUTPUT_OFFSET: [2, 2, 1, 3],
     OFFSET_IDX_LEFT: 0,
     OFFSET_IDX_RIGHT: 1,
     OFFSET_IDX_TOP: 2,
@@ -320,7 +324,7 @@ const JV = {
     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,
+    HUNDRED_PERCENT: 100.0,
 
     VERTICAL_ANGLE: "90",
     ANTI_VERTICAL_ANGLE: "-90",

+ 1 - 1
public/web/tools_const.js

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

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

@@ -443,7 +443,7 @@
         let btnDownLevel = $('#downLevel');
         let btnUpMove = $('#upMove');
         let btnDownMove = $('#downMove');
-        dbController.editData(controller);
+        dbController.editData(controller, billsSpread);
         btnInsert.click(function(){
             if(btnInsert.attr('doing') === 'false' && btnInsert.attr('fcsOnBills') === 'true'){
                 dbController.insert(controller, btnInsert);
@@ -537,6 +537,11 @@
             }
         }
         billsTree.loadDatas(datas);
+        for (col of setting.cols) {
+            if (col.data.field === 'isBillBudget') {
+                col.data.cellType = new GC.Spread.Sheets.CellTypes.CheckBox();
+            }
+    }
         let controller = TREE_SHEET_CONTROLLER.createNew(billsTree.tree, billsSpread.getActiveSheet(), setting);
         controller.showTreeData();
         dbController.controller = controller;

+ 18 - 1
web/maintain/bills_lib/scripts/bills_lib_setting.js

@@ -155,7 +155,24 @@ var billsLibSetting = {
                 font: 'Arial'
             },
             width: 100
-        }
+        },
+        {
+            width: 60,
+            head: {
+                titleNames: ["清单预算\n标记"],
+                spanCols: [1],
+                spanRows: [1],
+                vAlign: [1],
+                hAlign: [1],
+                font: ["Arial"],
+            },
+            data: {
+                field: "isBillBudget",
+                vAlign: 0,
+                hAlign: 1,
+                font: "Arail",
+            },
+        },
     ],
     headRows: 1,
     headRowHeight: [47],

+ 33 - 1
web/maintain/bills_lib/scripts/db_controller.js

@@ -397,7 +397,39 @@ var dbController = {
     onEnterCell: function (sender, args) {
         args.sheet.repaint();
     },
-    editData: function (controller) {
+
+    onButtonClicked: function (sender, info) {
+        if (info.sheet.isEditing()) {
+            info.sheet.endEdit(true);
+        }
+        debugger;
+        const field = dbController.controller.setting.cols[info.col].data.field;
+        var node = dbController.controller.tree.items[info.row];
+        if (node && field === 'isBillBudget') {
+            const isChecked = Boolean(info.sheet.getValue(info.row, info.col));
+            const allNodes = [node, ...node.getPosterity()];
+            const postData = [];
+            allNodes.forEach(item => {
+                postData.push({ ID: item.data.ID, [field]: isChecked });
+            });
+            billsAjax.pasteBills(userAccount, billsLibId, postData, () => {
+                allNodes.forEach(item => {
+                    const row = node.tree.items.indexOf(item);
+                    if (row >= 0) {
+                        sheetBillsDatas.datasIdx['rowIdx' + row][field] = isChecked;
+                        item.data[field] = isChecked;
+                    }
+                });
+                dbController.controller.refreshTreeNode(allNodes, false);
+            })
+
+            /* node.data[field] = isChecked;
+            sheetBillsDatas.datasIdx['rowIdx' + info.row][field] = isChecked;
+            billsAjax.updateBills(userAccount, billsLibId, node.getID(), field, isChecked); */
+        }
+    },
+    editData: function (controller, billsSpread) {
+        billsSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, this.onButtonClicked);
         controller.sheet.bind(GC.Spread.Sheets.Events.EditStarting, this.onEditStart);
         controller.sheet.bind(GC.Spread.Sheets.Events.EditEnded, this.onEditEnded);
         controller.sheet.bind(GC.Spread.Sheets.Events.EnterCell, this.onEnterCell);

+ 3 - 1
web/maintain/report/css/main.css

@@ -358,7 +358,9 @@ body {
   left: 105px;
   top: 38px;
   border: 1px solid #d9d9d9;
-  display: none;
+  display: none;    
+  z-index: 999;
+  background-color: #fff;
 }
 .mutiSelector {
   width: 130px;

+ 11 - 0
web/maintain/report/html/rpt_tpl_dtl_info.html

@@ -127,6 +127,17 @@
                     <option value="constructSum">建设项目汇总</option>
                 </select>
             </div>
+            <div class="input-group col-2">
+                <div class="input-group-addon">报表模板级别</div>
+                <select class="form-control input-sm" id="element_Flags_tplType"
+                    onchange="zTreeOprObj.onChangeFlag('rptTplType', this)">
+                    <option value="NA">N/A</option>
+                    <option value="construct">建设项目级别</option>
+                    <option value="single">单项工程级别</option>
+                    <option value="unit">单位工程级别</option>
+                </select>
+            </div>
         </div>
+      
     </div>
 </div>

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

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

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

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

+ 35 - 34
web/maintain/report/js/rpt_tpl_field_location.js

@@ -10,7 +10,7 @@ let fieldLocationOprObj = {
     iniSpreadJs: function (columnParentNode, contentParentNode) {
         let me = this;
         if (me.columnWorkBook === null) {
-            me.columnWorkBook = new GC.Spread.Sheets.Workbook($('#rptTplColumnWorkbook')[0], {sheetCount: 1});
+            me.columnWorkBook = new GC.Spread.Sheets.Workbook($('#rptTplColumnWorkbook')[0], { sheetCount: 1 });
             // me.columnWorkBook.setHei
             me.columnWorkBook.options.tabStripVisible = false;
             // me.columnWorkBook.options.scrollbarMaxAlign = true;
@@ -30,7 +30,7 @@ let fieldLocationOprObj = {
     },
     restoreColumn: function () {
         let me = this;
-        let rptTpl = (zTreeOprObj.currentNode)?zTreeOprObj.currentNode.rptTpl:null;
+        let rptTpl = (zTreeOprObj.currentNode) ? zTreeOprObj.currentNode.rptTpl : null;
         me.setupColumn(rptTpl, me.columnParentNode, me.contentParentNode);
     },
     setupColumn: function (rptTpl, columnParentNode, contentParentNode) {
@@ -42,9 +42,8 @@ let fieldLocationOprObj = {
             sheet.suspendPaint();
             sheet.clearSelection();
             sheet.setRowCount(0);
-            let spans =sheet.getSpans();
-            for(let i = 0; i < spans.length; i++)
-            {
+            let spans = sheet.getSpans();
+            for (let i = 0; i < spans.length; i++) {
                 sheet.removeSpan(spans[i].row, spans[i].col, GC.Spread.Sheets.SheetArea.viewport);
             }
             // sheet.setRowCount(1);
@@ -53,10 +52,10 @@ let fieldLocationOprObj = {
             let bandW = 700;
             let pIdx = JV.PAGES_SIZE_STR.indexOf(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE]);
             if (pIdx >= 0) {
-                bandW = Math.round(JV.PAGES_SIZE[pIdx][0] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT])) /2.54*96 );
+                bandW = Math.round(JV.PAGES_SIZE[pIdx][0] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT])) / 2.54 * 96);
                 if (rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE ||
                     rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE_CHN) {
-                    bandW = Math.round(JV.PAGES_SIZE[pIdx][1] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT])) /2.54*96 );
+                    bandW = Math.round(JV.PAGES_SIZE[pIdx][1] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT])) / 2.54 * 96);
                 }
             }
             if (columnParentNode.items && columnParentNode.items.length > 0) {
@@ -84,10 +83,10 @@ let fieldLocationOprObj = {
                 for (let jCol = 0; jCol < sheet.getColumnCount(); jCol++) {
                     sheet.getCell(iSelectedRow, jCol).cellType(cellType);
                 }
-                xPos.sort(function(x1, x2){
+                xPos.sort(function (x1, x2) {
                     return (x1 - x2);
                 });
-                yPos.sort(function(y1, y2){
+                yPos.sort(function (y1, y2) {
                     return (y1 - y2);
                 });
                 for (let contentItemNode of contentParentNode.items) {
@@ -151,7 +150,7 @@ let fieldLocationOprObj = {
         let me = fieldLocationOprObj,
             sheet = me.columnWorkBook.getActiveSheet(),
             selectedRanges = sheet.getSelections()
-        ;
+            ;
         let rc = sheet.getRowCount();
         if (rc > 2) {
             if (selectedRanges.length > 0) {
@@ -184,7 +183,7 @@ let fieldLocationOprObj = {
         let me = fieldLocationOprObj,
             sheet = me.columnWorkBook.getActiveSheet(),
             selectedRanges = sheet.getSelections()
-        ;
+            ;
         let cc = sheet.getColumnCount();
         if (cc > 1) {
             if (selectedRanges.length > 0) {
@@ -215,8 +214,7 @@ let fieldLocationOprObj = {
         let spans = sheet.getSpans();
         if (selectedRanges.length > 0 && spans.length > 0) {
             let selectedSpans = [];
-            for(let i = 0; i < spans.length; i++)
-            {
+            for (let i = 0; i < spans.length; i++) {
                 for (let j = 0; j < selectedRanges.length; j++) {
                     if (spans[i].row >= selectedRanges[j].row && spans[i].col >= selectedRanges[j].col &&
                         spans[i].row < selectedRanges[j].row + selectedRanges[j].rowCount && spans[i].col < selectedRanges[j].col + selectedRanges[j].colCount) {
@@ -230,14 +228,14 @@ let fieldLocationOprObj = {
         }
     },
     fitTheWidth: function (factor) {
-        let me = this, rptTpl = (zTreeOprObj.currentNode)?zTreeOprObj.currentNode.rptTpl:null;
+        let me = this, rptTpl = (zTreeOprObj.currentNode) ? zTreeOprObj.currentNode.rptTpl : null;
         let pIdx = JV.PAGES_SIZE_STR.indexOf(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE]);
         let bandW = 700;
         if (pIdx >= 0) {
-            bandW = Math.round(JV.PAGES_SIZE[pIdx][0] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT])) /2.54*96 );
+            bandW = Math.round(JV.PAGES_SIZE[pIdx][0] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT])) / 2.54 * 96);
             if (rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE ||
                 rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE_CHN) {
-                bandW = Math.round(JV.PAGES_SIZE[pIdx][1] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT])) /2.54*96 );
+                bandW = Math.round(JV.PAGES_SIZE[pIdx][1] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT])) / 2.54 * 96);
             }
         }
         bandW *= factor;
@@ -255,10 +253,10 @@ let fieldLocationOprObj = {
         let me = fieldLocationOprObj,
             sheet = me.columnWorkBook.getActiveSheet(),
             fieldRowIdx = sheet.getRowCount() - 1
-        ;
+            ;
         //sheet.getSelectio
         let selectedRanges = sheet.getSelections();
-        for(let i = 0; i < selectedRanges.length; i++){
+        for (let i = 0; i < selectedRanges.length; i++) {
             if (selectedRanges[i].row === fieldRowIdx) {
                 let ctrl = me.columnFieldCtrls[selectedRanges[i].col]
                 ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK]] = 'F';
@@ -352,7 +350,7 @@ let fieldLocationOprObj = {
         }
     },
     private_create_dft_ctrl: function () {
-        return {"Shrink" : "T", "ShowZero" : "T", "Horizon": "left", "Vertical": "bottom", "Wrap": "F", "isNarrow": false, "isAutoHeight": false };
+        return { "Shrink": "T", "ShowZero": "T", "Horizon": "left", "Vertical": "bottom", "Wrap": "F", "isNarrow": false, "isAutoHeight": false };
     },
     private_merge_ctrl: function (rptTpl, srcIdx, fieldNode, directCtrl) {
         let me = this, ctrl = null;
@@ -405,23 +403,24 @@ let fieldLocationOprObj = {
             $("#eleIsAutoHeightEx")[0].removeAttribute("disabled");
         } else {
             $("#fieldControlDiv")[0].style.cursor = "not-allowed";
-            $("#hOptionLeft")[0].disabled = "disabled" ;
-            $("#hOptionCenter")[0].disabled = "disabled" ;
-            $("#hOptionRight")[0].disabled = "disabled" ;
-            $("#vOptionUp")[0].disabled = "disabled" ;
-            $("#vOptionCenter")[0].disabled = "disabled" ;
-            $("#vOptionDown")[0].disabled = "disabled" ;
-            $("#eleShrinkEx")[0].disabled = "disabled" ;
-            $("#eleShowZeroEx")[0].disabled = "disabled" ;
-            $("#eleAutoWrapEx")[0].disabled = "disabled" ;
-            $("#eleIsNarrowEx")[0].disabled = "disabled" ;
-            $("#eleIsAutoHeightEx")[0].disabled = "disabled" ;
+            $("#hOptionLeft")[0].disabled = "disabled";
+            $("#hOptionCenter")[0].disabled = "disabled";
+            $("#hOptionRight")[0].disabled = "disabled";
+            $("#vOptionUp")[0].disabled = "disabled";
+            $("#vOptionCenter")[0].disabled = "disabled";
+            $("#vOptionDown")[0].disabled = "disabled";
+            $("#eleShrinkEx")[0].disabled = "disabled";
+            $("#eleShowZeroEx")[0].disabled = "disabled";
+            $("#eleAutoWrapEx")[0].disabled = "disabled";
+            $("#eleIsNarrowEx")[0].disabled = "disabled";
+            $("#eleIsAutoHeightEx")[0].disabled = "disabled";
         }
     },
     private_create_content_node: function (colWidthArr, cellValue, colIdx, rptTpl) {
         let me = this;
-        let rst = {"Name": cellValue, "Title": '', "FieldID": -1, "font": "Content", "control": "Column", "style" : "Default_Normal", "isAutoHeight" : false,
-            "area" : {"Left" : 0, "Right" : 100, "Top" : 0, "Bottom" : 100, "H_CalculationType" : "percentage", "V_CalculationType" : "percentage"}
+        let rst = {
+            "Name": cellValue, "Title": '', "FieldID": -1, "font": "Content", "control": "Column", "style": "Default_Normal", "isAutoHeight": false,
+            "area": { "Left": 0, "Right": 100, "Top": 0, "Bottom": 100, "H_CalculationType": "percentage", "V_CalculationType": "percentage" }
         };
         //1. 设置FieldID
         let hasChkField = false;
@@ -429,6 +428,7 @@ let fieldLocationOprObj = {
             for (let field of rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]) {
                 if (field[JV.PROP_NAME] === cellValue) {
                     rst.FieldID = field[JV.PROP_ID];
+                    // rst.Name = field.Name + "(" + field[JV.PROP_ID] + ")";
                     rst["Title"] = "ID: " + field[JV.PROP_ID];
                     hasChkField = true;
                     break;
@@ -439,6 +439,7 @@ let fieldLocationOprObj = {
             for (let field of rptTpl[JV.NODE_NO_MAPPING_FIELDS]) {
                 if (field[JV.PROP_NAME] === cellValue) {
                     rst.FieldID = field[JV.PROP_ID];
+                    // rst.Name = field.Name + "(" + field[JV.PROP_ID] + ")";
                     rst["Title"] = "ID: " + field[JV.PROP_ID];
                     hasChkField = true;
                     break;
@@ -490,7 +491,7 @@ let fieldLocationOprObj = {
 
     applyColumnBack: function () {
         let me = this;
-        let rptTpl = (zTreeOprObj.currentNode)?zTreeOprObj.currentNode.rptTpl:null;
+        let rptTpl = (zTreeOprObj.currentNode) ? zTreeOprObj.currentNode.rptTpl : null;
         if (rptTpl && me.columnParentNode && me.contentParentNode && confirm(`请确认提交应用!`)) {
             let sheet = me.columnWorkBook.getActiveSheet();
             if (sheet.getRowCount() > 1 && sheet.getColumnCount() > 0) {
@@ -513,7 +514,7 @@ let fieldLocationOprObj = {
                 //1. 重新生成节点
                 let contentNodes = [];
                 let contenRowIdx = sheet.getRowCount() - 1;
-                let rptTpl = (zTreeOprObj.currentNode)?zTreeOprObj.currentNode.rptTpl:null;
+                let rptTpl = (zTreeOprObj.currentNode) ? zTreeOprObj.currentNode.rptTpl : null;
                 for (let iCol = 0; iCol < sheet.getColumnCount(); iCol++) {
                     let cellValue = sheet.getValue(contenRowIdx, iCol);
                     if (!(stringUtil.isEmptyString(cellValue))) {

+ 62 - 49
web/maintain/report/js/rpt_tpl_field_map.js

@@ -7,10 +7,10 @@
 'use strict'
 
 let fieldMapTreeOprObj = {
-    treeObj : null,
+    treeObj: null,
     currentNode: null,
     dataTypeDef: ['string', 'int32', 'int64', 'double', 'currency', 'date', 'image', 'object'],
-    iniTree: function(rptTpl) {
+    iniTree: function (rptTpl) {
         var me = this;
         let fieldMapList = me.buildTreeData(rptTpl);
         me.treeObj = $.fn.zTree.init($("#field_map_tree_reversed"), fieldMapSetting, fieldMapList);
@@ -27,21 +27,22 @@ let fieldMapTreeOprObj = {
                 if (field[JV.PROP_IS_ID]) {
                     field.checked = true;
                 }
+                // field.Name = field.Name + "(" + field[JV.PROP_ID] + ")";
                 field.Title = "ID: " + field[JV.PROP_ID];
                 parent.items.push(field);
             }
         }
 
         if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS]) {
-            rst.push({Name: JV.NODE_DISCRETE_FIELDS, items: [], isParent: true});
+            rst.push({ Name: JV.NODE_DISCRETE_FIELDS, items: [], isParent: true });
             private_setSubFields(rst[rst.length - 1], rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DISCRETE_FIELDS])
         }
         if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS]) {
-            rst.push({Name: JV.NODE_MASTER_FIELDS, items: [], isParent: true});
+            rst.push({ Name: JV.NODE_MASTER_FIELDS, items: [], isParent: true });
             private_setSubFields(rst[rst.length - 1], rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS])
         }
         if (rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]) {
-            rst.push({Name: JV.NODE_DETAIL_FIELDS, items: [], isParent: true});
+            rst.push({ Name: JV.NODE_DETAIL_FIELDS, items: [], isParent: true });
             private_setSubFields(rst[rst.length - 1], rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS])
         }
 
@@ -52,7 +53,7 @@ let fieldMapTreeOprObj = {
         if (me.treeObj) {
             let nodes = me.treeObj.getNodes();
             for (let node of nodes) {
-                let item = {Name: node.Name, items: [], isParent: true, Title: ""};
+                let item = { Name: node.Name, items: [], isParent: true, Title: "" };
                 if (node.items) {
                     for (let subNode of node.items) {
                         let subItem = me.createMapFieldByNode(subNode);
@@ -64,7 +65,7 @@ let fieldMapTreeOprObj = {
         }
         return rst;
     },
-    onClick: function (event,treeId,treeNode) {
+    onClick: function (event, treeId, treeNode) {
         let me = fieldMapTreeOprObj;
         me.currentNode = treeNode;
         //then refresh the field map tab properties
@@ -91,13 +92,13 @@ let fieldMapTreeOprObj = {
         // }
         //映射指标
     },
-    onBeforeRemove: function(treeId, treeNode){
+    onBeforeRemove: function (treeId, treeNode) {
         if (treeNode.level === 0) {
             return false;
         }
         return true;
     },
-    beforeRename: function(treeId, treeNode, newName, isCancel) {
+    beforeRename: function (treeId, treeNode, newName, isCancel) {
         if (isCancel) {
             return true;
         }
@@ -106,7 +107,7 @@ let fieldMapTreeOprObj = {
         }
         return true;
     },
-    onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
+    onBeforeDrop: function (treeId, treeNodes, targetNode, moveType) {
         let rst = true;
         if (treeId === 'selectable_field_tree_reversed' || targetNode.level === 0 || moveType === 'inner') {
             rst = false;
@@ -188,28 +189,40 @@ let fieldMapTreeOprObj = {
     }
 };
 
+const setNodeFieldID = (data) => {
+    if (data.items && data.items.length > 0) {
+        data.items.forEach(i => {
+            setNodeFieldID(i);
+        })
+
+    } else {
+        data.Name = data.Name + "(" + data.ID + ")";
+    }
+}
+
 let selectableFiledTreeOprObj = {
-    treeObj : null,
+    treeObj: null,
     currentNode: null,
-    iniTree: function() {
+    iniTree: function () {
         let me = this, params = {};
         params.userId = userID;
-        CommonAjax.postEx("report_tpl_api/getMappingFields", params, 20000, true, function(result){
-                let showRst = [];
-                for (let item of result) {
-                    me.decorateMappingFieldList(item);
-                    if (item.items.length > 0) {
-                        showRst.push(item);
-                    }
-                }
-                me.treeObj = $.fn.zTree.init($("#selectable_field_tree_reversed"), selectableFieldSetting, showRst);
-                let nodes = me.treeObj.getNodes();
-                for (let node of nodes) {
-                    me.treeObj.expandNode(node, true, false);
+        CommonAjax.postEx("report_tpl_api/getMappingFields", params, 20000, true, function (result) {
+            let showRst = [];
+            for (let item of result) {
+                me.decorateMappingFieldList(item);
+                if (item.items.length > 0) {
+                    setNodeFieldID(item);
+                    showRst.push(item);
                 }
-                // me.treeObj.expandAll(true);
-                showRst = null;
-            }, null, null
+            }
+            me.treeObj = $.fn.zTree.init($("#selectable_field_tree_reversed"), selectableFieldSetting, showRst);
+            let nodes = me.treeObj.getNodes();
+            for (let node of nodes) {
+                me.treeObj.expandNode(node, true, false);
+            }
+            // me.treeObj.expandAll(true);
+            showRst = null;
+        }, null, null
         );
     },
     decorateMappingFieldList: function (rawMappingField) {
@@ -222,7 +235,7 @@ let selectableFiledTreeOprObj = {
             rawMappingField.Title = "ID: " + rawMappingField[JV.PROP_ID];
         }
     },
-    onClick: function (event,treeId,treeNode) {
+    onClick: function (event, treeId, treeNode) {
         let me = fieldMapTreeOprObj;
         me.currentNode = treeNode;
     },
@@ -236,10 +249,10 @@ let selectableFiledTreeOprObj = {
         }
         return rst;
     },
-    onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
+    onBeforeDrop: function (treeId, treeNodes, targetNode, moveType) {
         let rst = true;
         if (treeId === 'field_map_tree_reversed') {
-            if ( (targetNode.level === 0 && moveType !== 'inner') || (targetNode.level > 0 && moveType === 'inner')) {
+            if ((targetNode.level === 0 && moveType !== 'inner') || (targetNode.level > 0 && moveType === 'inner')) {
                 rst = false;
             }
         } else {
@@ -250,29 +263,29 @@ let selectableFiledTreeOprObj = {
     addDiyDom: function (treeId, treeNode) {
         if (treeNode.level > 0) {
             let aObj = $("#" + treeNode.tId + "_a");
-            if ($("#diyBtn_"+treeNode.ID).length>0) return;
+            if ($("#diyBtn_" + treeNode.ID).length > 0) return;
             let editStr = "<span>&nbsp(" + treeNode.DataType + ")</span>";
             aObj.append(editStr);
-            let btn = $("#diyBtn_"+treeNode.ID);
-            if (btn) btn.bind("click", function(){alert("diy Button for " + treeNode.name);});
+            let btn = $("#diyBtn_" + treeNode.ID);
+            if (btn) btn.bind("click", function () { alert("diy Button for " + treeNode.name); });
         }
     }
 };
 
 let discreteFieldParamTreeOprObj = {
-    treeObj : null,
+    treeObj: null,
     currentNode: null,
-    local_idx : 12000,
-    iniTree: function(rptTpl) {
+    local_idx: 12000,
+    iniTree: function (rptTpl) {
         var me = this;
         let fieldMapList = me.buildTreeData(rptTpl);
         me.treeObj = $.fn.zTree.init($("#tpl_discrete_fields_params_reversed"), discreteFieldParamSetting, fieldMapList);
         me.treeObj.expandAll(true);
     },
-    buildTreeData: function(rptTpl){
+    buildTreeData: function (rptTpl) {
         let me = this, rst = [];
-        let disFieldNode = {Name: JV.NODE_NO_MAPPING_FIELDS, items: [], isParent: true, Title: ""};
-        let disParamNode = {Name: JV.NODE_DISCRETE_PARAMS, items: [], isParent: true, Title: ""};
+        let disFieldNode = { Name: JV.NODE_NO_MAPPING_FIELDS, items: [], isParent: true, Title: "" };
+        let disParamNode = { Name: JV.NODE_DISCRETE_PARAMS, items: [], isParent: true, Title: "" };
         rst.push(disFieldNode);
         rst.push(disParamNode);
         if (rptTpl[JV.NODE_NO_MAPPING_FIELDS] && rptTpl[JV.NODE_NO_MAPPING_FIELDS].length > 0) {
@@ -302,18 +315,18 @@ let discreteFieldParamTreeOprObj = {
         }
         return rst;
     },
-    getAndModifyLocalIdx: function() {
+    getAndModifyLocalIdx: function () {
         let me = discreteFieldParamTreeOprObj, rst = me.local_idx;
         me.local_idx++;
         return rst;
     },
-    addHoverDom: function(treeId, treeNode) {
+    addHoverDom: function (treeId, treeNode) {
         let me = discreteFieldParamTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
-        if (treeNode.level > 0 || $("#addBtn_"+treeNode.tId).length > 0) return;
+        if (treeNode.level > 0 || $("#addBtn_" + treeNode.tId).length > 0) return;
         let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
         sObj.after(addStr);
-        let btn = $("#addBtn_"+treeNode.tId);
-        if (btn) btn.bind("click", function(){
+        let btn = $("#addBtn_" + treeNode.tId);
+        if (btn) btn.bind("click", function () {
             if (treeNode[JV.PROP_NAME] === JV.NODE_NO_MAPPING_FIELDS) {
                 let field = me.private_setup_dummy_discrete_field_node();
                 let newNodes = [field];
@@ -343,17 +356,17 @@ let discreteFieldParamTreeOprObj = {
         rst.Title = "ID: " + rst[JV.PROP_ID];
         return rst;
     },
-    removeHoverDom: function(treeId, treeNode) {
-        $("#addBtn_"+treeNode.tId).unbind().remove();
+    removeHoverDom: function (treeId, treeNode) {
+        $("#addBtn_" + treeNode.tId).unbind().remove();
     },
-    onBeforeRemove: function(treeId, treeNode){
+    onBeforeRemove: function (treeId, treeNode) {
         let rst = true;
         if (treeNode.isParent) {
             rst = false;
         }
         return rst;
     },
-    beforeRename: function(treeId, treeNode, newName, isCancel) {
+    beforeRename: function (treeId, treeNode, newName, isCancel) {
         let rst = true;
         if (treeNode.isParent && !isCancel) {
             rst = false;
@@ -370,7 +383,7 @@ let discreteFieldParamTreeOprObj = {
         }
         return rst;
     },
-    onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
+    onBeforeDrop: function (treeId, treeNodes, targetNode, moveType) {
         // let rst = false;
         // if (targetNode.tId && targetNode.tId.indexOf("tpl_data_info_reversed") >= 0 && (!(targetNode.isParent && moveType !== 'inner')) ) {
         //     if (targetNode.level === 0) {

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

@@ -985,6 +985,20 @@ let zTreeOprObj = {
                         } else {
                             $("#element_constructSumFlags_select")[0].selectedIndex = 0;
                         }
+                        if (me.currentNode.flags.hasOwnProperty('rptTplType')) {
+                            let val = me.currentNode.flags['rptTplType'];
+                            if (val === 'construct') {
+                                $("#element_Flags_tplType")[0].selectedIndex = 1;
+                            } else if (val === 'single') {
+                                $("#element_Flags_tplType")[0].selectedIndex = 2;
+                            } else if (val === 'unit') {
+                                $("#element_Flags_tplType")[0].selectedIndex = 3;
+                            } else {
+                                $("#element_Flags_tplType")[0].selectedIndex = 0;
+                            }
+                        } else {
+                            $("#element_Flags_tplType")[0].selectedIndex = 0;
+                        }
                     } else {
                         $("#element_flags_select")[0].selectedIndex = 0;
                         $("#element_prjFlags_select")[0].selectedIndex = 0;
@@ -996,6 +1010,7 @@ let zTreeOprObj = {
                         $("#element_prjFlags_selectStr")[0].value = '';
                         $('#valuationSelector .mutiSelector li').removeClass('checked');
                         $("#element_existLevel_select")[0].selectedIndex = 0;
+                        $("#element_Flags_tplType")[0].selectedIndex = 0;
                     }
 
                     if ($("#rpt_tpl_visual_tab")[0].className === "nav-link p-1 active") {

+ 54 - 1
web/maintain/report/js/rpt_tpl_pre_handle.js

@@ -286,9 +286,12 @@ let preHandleObj = {
         types.push({ Name: JV.PROP_HANDLE_TYPE_SUM, Title: "" });
         types.push({ Name: JV.PROP_HANDLE_TYPE_ADJUST, Title: "" });
         types.push({ Name: JV.PROP_HANDLE_TYPE_ADD_DUMMY, Title: "" });
+        types.push({
+            Name: JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS, Title: ''
+        });
         // types.push({Name: "纯手工填写", Title: ""});
         me.typeTreeObj = $.fn.zTree.init($("#pre_handle_type_reversed"), preHandleTypeSetting, types);
-        me.setDisabledBandSelect([0, 1, 2, 3, 4, 5, 6]);
+        me.setDisabledBandSelect([0, 1, 2, 3, 4, 5, 6, 7]);
         me.build_handle_data_selection();
     },
     setDisabledBandSelect: function (disabledIdxArr) {
@@ -331,6 +334,9 @@ let preHandleObj = {
             case JV.PROP_HANDLE_TYPE_ADD_DUMMY:
                 rst = { Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "Dummy数据集": [] };
                 break;
+            case JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS:
+                rst = { Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType };
+                break;
             default:
                 rst = { Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": "排序", "排序方式": "normal", "排序键值集": [] };
                 break;
@@ -370,6 +376,10 @@ let preHandleObj = {
             case JV.PROP_HANDLE_TYPE_ADD_DUMMY:
                 item[JV.PROP_DUMMY_COLLECTION] = [];
                 break;
+            case JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS:
+                item[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_SORT_TYPE] = "all";// 工程量清单排序
+                item[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_DATA_TYPE] = 'bills'; // 工程量清单输出级别
+                break;
             default:
                 item[JV.PROP_HANDLE_TYPE] = JV.PROP_HANDLE_TYPE_SORT;
                 item[JV.PROP_SORT_TYPE] = "normal";
@@ -393,6 +403,8 @@ let preHandleObj = {
             preHandleAdjustObj.copyNode(src, dest);
         } else if (src[JV.PROP_HANDLE_TYPE] === JV.PROP_HANDLE_TYPE_ADD_DUMMY) {
             preHandleAddDummyObj.copyNode(src, dest);
+        } else if (src[JV.PROP_HANDLE_TYPE] === JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS) {
+            preHandleQuantitiesBillsSortObj.copyNode(src, dest);
         }
     },
     private_set_title: function (node) {
@@ -435,6 +447,8 @@ let preHandleObj = {
                     preHandleAdjustObj.refresh_node();
                 } else if (typeNode[JV.PROP_NAME] === "增加Dummy数据") {
                     preHandleAddDummyObj.refresh_node();
+                } else if (typeNode[JV.PROP_NAME] === "转化工程量清单") {
+                    preHandleQuantitiesBillsSortObj.refresh_node();
                 }
             }
         }
@@ -451,6 +465,7 @@ let preHandleObj = {
         $("#div_sort_type_parent_data")[0].style.display = "none";
         $("#div_sort_tree")[0].style.display = "none";
         $("#div_sort_self_define")[0].style.display = "none";
+        $("#div_quantities_bills_sort_bar")[0].style.display = "none";
     },
     onPreHandleClick: function (event, treeId, treeNode) {
         //点击预处理环节 节点
@@ -577,6 +592,9 @@ let preHandleObj = {
                     case JV.PROP_HANDLE_TYPE_COMPONENT_MOVE:
                         rst.push(preHandleBillDataMoveObj.extractTabFields(handleObj));
                         break;
+                    case JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS:
+                        rst.push(preHandleQuantitiesBillsSortObj.extractTabFields(handleObj));
+                        break;
                     default:
                         break;
                 }
@@ -1252,3 +1270,38 @@ let preHandleAddDummyObj = {
         return rst;
     }
 };
+let preHandleQuantitiesBillsSortObj = {
+    copyNode: function (src, dest) {
+        dest[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_SORT_TYPE] = src.billSortType;
+        dest[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_DATA_TYPE] = src.billSortData;
+    },
+    refresh_node: function () {
+        $("#div_quantities_bills_sort_bar")[0].style.display = "";
+        if (preHandleObj.currentNode) {
+            $("#select_quantities_bills_sort_types")[0].value = preHandleObj.currentNode[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_SORT_TYPE] || 'all';
+            $("#select_quantities_bills_types")[0].value = preHandleObj.currentNode[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_DATA_TYPE] || 'bills';
+        }
+    },
+    extractTabFields: function (handleObj) {
+        let me = preHandleQuantitiesBillsSortObj, rst = {};
+        me.copyNode(handleObj, rst);
+        rst = {
+            "预处理类型": "转化工程量清单",
+            "映射数据对象": "bills",
+            'billSortType': handleObj[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_SORT_TYPE],
+            'billSortData': handleObj[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_DATA_TYPE],
+        }
+        return rst;
+    },
+    onQuantitiesBillsSortTypeChange: function (dom) {
+        // 工程量清单排序类型
+        let me = preHandleObj;
+        me.currentNode[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_SORT_TYPE] = dom.value;
+
+    },
+    onQuantitiesBillsTypesChange: function (dom) {
+        // 工程量清单排序对象类型
+        let me = preHandleObj;
+        me.currentNode[JV.PROP_HANDLE_TYPE_CHANGE_QUANTITIES_BILLS_DATA_TYPE] = dom.value;
+    },
+}

+ 27 - 25
web/maintain/report/js/rpt_tpl_vis_sum.js

@@ -11,7 +11,7 @@ let virtualSummaryOprObj = {
             me.summaryWorkBook.destroy();
             me.summaryWorkBook = null;
         }
-        me.summaryWorkBook = new GC.Spread.Sheets.Workbook($('#rptTplSummaryWorkbook')[0], {sheetCount: 1});
+        me.summaryWorkBook = new GC.Spread.Sheets.Workbook($('#rptTplSummaryWorkbook')[0], { sheetCount: 1 });
         me.summaryWorkBook.options.tabStripVisible = false;
         me.summaryWorkBook.options.allowCopyPasteExcelStyle = false;
         me.summaryWorkBook.options.allowUserDragDrop = false;
@@ -24,7 +24,7 @@ let virtualSummaryOprObj = {
     },
     restoreSummary: function () {
         let me = this;
-        let rptTpl = (zTreeOprObj.currentNode)?zTreeOprObj.currentNode.rptTpl:null;
+        let rptTpl = (zTreeOprObj.currentNode) ? zTreeOprObj.currentNode.rptTpl : null;
         me.private_setup_control_options(false);
         me.setupSummary(rptTpl, me.summaryParentNode);
     },
@@ -46,17 +46,17 @@ let virtualSummaryOprObj = {
             if (columnParentNode) {
                 let yColumnPos = [], xPos = [], ySummaryPos = [0]
                     // , xSummaryPos = [0]
-                ;
+                    ;
                 let sheet = me.summaryWorkBook.getActiveSheet();
                 let columnBand = visualCommonOprObj.getBandEx(columnParentNode[JV.PROP_BAND_NAME], rptTpl);
                 let bandH = Math.round(parseFloat(columnBand[JV.BAND_PROP_HEIGHT]) / 2.54 * 96);
                 let bandW = 700;
                 let pIdx = JV.PAGES_SIZE_STR.indexOf(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE]);
                 if (pIdx >= 0) {
-                    bandW = Math.round(JV.PAGES_SIZE[pIdx][0] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT])) /2.54*96 );
+                    bandW = Math.round(JV.PAGES_SIZE[pIdx][0] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT])) / 2.54 * 96);
                     if (rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE ||
                         rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] === JV.ORIENTATION_LANDSCAPE_CHN) {
-                        bandW = Math.round(JV.PAGES_SIZE[pIdx][1] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT])) /2.54*96 );
+                        bandW = Math.round(JV.PAGES_SIZE[pIdx][1] * 96 - (parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) + parseFloat(rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT])) / 2.54 * 96);
                     }
                 }
                 //1. 设置column位置(让用户知道位置,后期无需用户再调)
@@ -72,10 +72,10 @@ let virtualSummaryOprObj = {
                 sheet.setColumnCount(xPos.length - 1, GC.Spread.Sheets.SheetArea.viewport);
                 // sheet.clear();
 
-                xPos.sort(function(x1, x2){
+                xPos.sort(function (x1, x2) {
                     return (x1 - x2);
                 });
-                yColumnPos.sort(function(y1, y2){
+                yColumnPos.sort(function (y1, y2) {
                     return (y1 - y2);
                 });
                 for (let idx = 1; idx < xPos.length; idx++) {
@@ -127,7 +127,7 @@ let virtualSummaryOprObj = {
         let me = this,
             sheet = me.summaryWorkBook.getActiveSheet(),
             selectedRanges = sheet.getSelections()
-        ;
+            ;
         sheet.suspendPaint();
         if (selectedRanges.length > 0) {
             sheet.deleteRows(selectedRanges[0].row, 1);
@@ -207,8 +207,7 @@ let virtualSummaryOprObj = {
         if (selectedRanges.length > 0 && spans.length > 0) {
             sheet.suspendPaint();
             let selectedSpans = [];
-            for(let i = 0; i < spans.length; i++)
-            {
+            for (let i = 0; i < spans.length; i++) {
                 for (let j = 0; j < selectedRanges.length; j++) {
                     if (spans[i].row >= selectedRanges[j].row && spans[i].col >= selectedRanges[j].col &&
                         spans[i].row <= selectedRanges[j].row + selectedRanges[j].rowCount && spans[i].col <= selectedRanges[j].col + selectedRanges[j].colCount) {
@@ -243,8 +242,8 @@ let virtualSummaryOprObj = {
             let hA = GC.Spread.Sheets.HorizontalAlign.left, vA = GC.Spread.Sheets.VerticalAlign.top;
             if ($(`#hOptionCenterSum`)[0].checked) hA = GC.Spread.Sheets.HorizontalAlign.center;
             if ($(`#hOptionRightSum`)[0].checked) hA = GC.Spread.Sheets.HorizontalAlign.right;
-            if ($(`#vOptionCenterSum`)[0].checked ) vA = GC.Spread.Sheets.VerticalAlign.center;
-            if ($(`#vOptionDownSum`)[0].checked ) vA = GC.Spread.Sheets.VerticalAlign.bottom;
+            if ($(`#vOptionCenterSum`)[0].checked) vA = GC.Spread.Sheets.VerticalAlign.center;
+            if ($(`#vOptionDownSum`)[0].checked) vA = GC.Spread.Sheets.VerticalAlign.bottom;
             cell.hAlign(hA);
             cell.vAlign(vA);
             if ($(`#eleIsNarrowSumEx`)[0].checked) {
@@ -258,9 +257,9 @@ let virtualSummaryOprObj = {
     changeCtrl: function (dom) {
         let me = virtualSummaryOprObj,
             sheet = me.summaryWorkBook.getActiveSheet()
-        ;
+            ;
         let selectedRanges = sheet.getSelections();
-        for(let i = 0; i < selectedRanges.length; i++){
+        for (let i = 0; i < selectedRanges.length; i++) {
             //         let ctrl = me.columnFieldCtrls[selectedRanges[i].col]
             //         ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK]] = 'F';
             //         ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHOW_ZERO]] = 'F';
@@ -314,21 +313,22 @@ let virtualSummaryOprObj = {
             $("#eleIsNarrowSumEx")[0].removeAttribute("disabled");
         } else {
             $("#sumFieldControlDiv")[0].style.cursor = "not-allowed";
-            $("#hOptionLeftSum")[0].disabled = "disabled" ;
-            $("#hOptionCenterSum")[0].disabled = "disabled" ;
-            $("#hOptionRightSum")[0].disabled = "disabled" ;
-            $("#vOptionUpSum")[0].disabled = "disabled" ;
-            $("#vOptionCenterSum")[0].disabled = "disabled" ;
-            $("#vOptionDownSum")[0].disabled = "disabled" ;
-            $("#rdIsText")[0].disabled = "disabled" ;
-            $("#rdIsField")[0].disabled = "disabled" ;
+            $("#hOptionLeftSum")[0].disabled = "disabled";
+            $("#hOptionCenterSum")[0].disabled = "disabled";
+            $("#hOptionRightSum")[0].disabled = "disabled";
+            $("#vOptionUpSum")[0].disabled = "disabled";
+            $("#vOptionCenterSum")[0].disabled = "disabled";
+            $("#vOptionDownSum")[0].disabled = "disabled";
+            $("#rdIsText")[0].disabled = "disabled";
+            $("#rdIsField")[0].disabled = "disabled";
             $("#eleIsNarrowSumEx")[0].disabled = "disabled";
         }
     },
     private_create_field_node: function (sheet, colWidthArr, rowHeightArr, text, rptTpl) {
         let cellValue = text[`text`].toString().slice(1, -1);
-        let rst = {"Name": cellValue, "Title": '', "FieldID": -1, "font": "GrandTotal", "control": "Column_Right", "style" : "Default_Normal", "isAutoHeight" : false,
-            "area" : {"Left" : 0, "Right" : 100, "Top" : 0, "Bottom" : 100, "H_CalculationType" : "percentage", "V_CalculationType" : "percentage"}
+        let rst = {
+            "Name": cellValue, "Title": '', "FieldID": -1, "font": "GrandTotal", "control": "Column_Right", "style": "Default_Normal", "isAutoHeight": false,
+            "area": { "Left": 0, "Right": 100, "Top": 0, "Bottom": 100, "H_CalculationType": "percentage", "V_CalculationType": "percentage" }
         };
         //1. 设置FieldID
         let hasChkField = false;
@@ -336,6 +336,7 @@ let virtualSummaryOprObj = {
             for (let field of rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS]) {
                 if (field[JV.PROP_NAME] === cellValue) {
                     rst.FieldID = field[JV.PROP_ID];
+                    // field.Name = field.Name + "(" + field[JV.PROP_ID] + ")";
                     rst["Title"] = "ID: " + field[JV.PROP_ID];
                     hasChkField = true;
                     break;
@@ -346,6 +347,7 @@ let virtualSummaryOprObj = {
             for (let field of rptTpl[JV.NODE_NO_MAPPING_FIELDS]) {
                 if (field[JV.PROP_NAME] === cellValue) {
                     rst.FieldID = field[JV.PROP_ID];
+                    // field.Name = field.Name + "(" + field[JV.PROP_ID] + ")";
                     rst["Title"] = "ID: " + field[JV.PROP_ID];
                     hasChkField = true;
                     break;
@@ -364,7 +366,7 @@ let virtualSummaryOprObj = {
 
     applySummaryBack: function () {
         let me = this;
-        let rptTpl = (zTreeOprObj.currentNode)?zTreeOprObj.currentNode.rptTpl:null;
+        let rptTpl = (zTreeOprObj.currentNode) ? zTreeOprObj.currentNode.rptTpl : null;
         if (rptTpl && me.summaryParentNode) {
             let sheet = me.summaryWorkBook.getActiveSheet();
             let rAmt = sheet.getRowCount(), pixH = [0];

+ 15 - 0
web/users/js/compilation.js

@@ -594,6 +594,21 @@ $(document).ready(function () {
         });
     })
 
+       // 选择编办类型
+       $('#type-select').change(function () {
+        $.ajax({
+            url: '/compilation/changeCompilation',
+            type: 'post',
+            data: { id: id, update:{type: $(this).val()} },
+            dataType: "json",
+            success: function (response) {
+                if (response.error !== 0) {
+                    alert('更改失败');
+                }
+            }
+        });
+    })
+
     // 修改是否提供免费版
     $('#freeUse').change(function (val) {
         $.ajax({

+ 8 - 0
web/users/views/compilation/index.html

@@ -300,6 +300,14 @@
                             <% }) %>
                     </select>
                 </td></tr>
+                <tr><td><p>编办类型</p>
+                    <select class="form-control" style="width:200px" id="type-select">
+                        <option value=""></option>
+                        <% typeList.forEach(function(type) { %>
+                            <option value="<%= type.value %>" <% if (selectedCompilation.type !== undefined && type.value === selectedCompilation.type) { %>selected="selected"<% } %> ><%= type.label %></option>
+                            <% }) %>
+                    </select>
+                </td></tr>
                 <tr>
                     <td>
                         <p><span> 提供免费版:</span> <input type="checkbox" id="freeUse"  <% if (selectedCompilation.freeUse) { %> checked <% } %>></p>