caiaolin 8 gadi atpakaļ
vecāks
revīzija
9989e76567
30 mainītis faili ar 533 papildinājumiem un 265 dzēšanām
  1. 2 2
      modules/bills_lib/models/bills_lib_schemas.js
  2. 1 1
      modules/ration_repository/controllers/ration_repository_controller.js
  3. 1 1
      modules/ration_repository/models/repository_map.js
  4. 1 0
      modules/reports/models/rpt_cfg.js
  5. 1 0
      modules/reports/models/rpt_mapping_field.js
  6. 1 0
      modules/reports/models/rpt_template.js
  7. 1 0
      modules/reports/models/tpl_tree_node.js
  8. 8 0
      modules/reports/rpt_component/jpc_bill_tab.js
  9. 1 1
      modules/reports/rpt_component/jpc_ex.js
  10. 16 12
      modules/std_glj_lib/models/gljMapModel.js
  11. 20 7
      modules/std_glj_lib/models/gljModel.js
  12. 18 2
      modules/templates/controllers/bills_template_controller.js
  13. 26 19
      modules/templates/models/bills_template.js
  14. 25 0
      modules/templates/models/schemas/bills_template.js
  15. 5 6
      modules/templates/routes/bills_template_router.js
  16. 7 0
      modules/users/controllers/compilation_controller.js
  17. 1 0
      public/web/sheet/sheet_common.js
  18. 10 0
      public/web/tree_sheet/tree_sheet_helper.js
  19. 7 0
      web/maintain/bills_lib/html/neirong.html
  20. 14 0
      web/maintain/bills_lib/html/qingdan.html
  21. 15 0
      web/maintain/bills_lib/html/tezheng.html
  22. 2 2
      web/maintain/bills_lib/scripts/bills_lib_ajax.js
  23. 1 1
      web/maintain/ration_repository/main.html
  24. 264 187
      web/maintain/std_glj_lib/js/glj.js
  25. 28 9
      web/maintain/std_glj_lib/js/gljComponent.js
  26. 11 5
      web/maintain/std_glj_lib/js/main.js
  27. 28 4
      web/users/js/col_setting.js
  28. 5 2
      web/users/js/compilation.js
  29. 3 2
      web/users/views/compilation/add.html
  30. 10 2
      web/users/views/compilation/modal.html

+ 2 - 2
modules/bills_lib/models/bills_lib_schemas.js

@@ -45,8 +45,8 @@ let billsSchema = mongoose.Schema({
     unit: String,
     ruleText: String,
     Expression: String,
-    jobs: [jobsSchema],
-    items: [itemsSchema],
+    jobs: [],
+    items: [],
     recharge:String,
     billsLibId: Number,
     deleted: Boolean

+ 1 - 1
modules/ration_repository/controllers/ration_repository_controller.js

@@ -4,7 +4,7 @@
 var rationRepository = require("../models/repository_map");
 import baseController from "../../common/base/base_controller";
 import CompilationModel from "../../users/models/compilation_model";
-import {gljMapModel} from "../../std_glj_lib/models/schemas";
+import gljMapModel from "../../std_glj_lib/models/schemas";
 import async from "async";
 var callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});

+ 1 - 1
modules/ration_repository/models/repository_map.js

@@ -6,7 +6,7 @@ var mongoose = require('mongoose');
 var dbm = require("../../../config/db/db_manager");
 let async = require("async");
 let moment = require('moment');
-import {gljMapModel} from "../../std_glj_lib/models/schemas";
+import gljMapModel from "../../std_glj_lib/models/schemas";
 //var stringUtil = require('../../../public/stringUtil');
 var rationLibdb = dbm.getCfgConnection("scConstruct");
 var Schema = mongoose.Schema;

+ 1 - 0
modules/reports/models/rpt_cfg.js

@@ -1,5 +1,6 @@
 /**
  * Created by Tony on 2017/6/14.
+ * 把报表相关的配置(字体、边框、格式等都放在一条记录中,方便整理,毕竟用户的报表格式基本是固定的,无需怎样调整)
  */
 let mongoose = require('mongoose');
 let Schema = mongoose.Schema;

+ 1 - 0
modules/reports/models/rpt_mapping_field.js

@@ -1,5 +1,6 @@
 /**
  * Created by Tony on 2017/7/11.
+ * 为后台报表模板选择指标用
  */
 let mongoose = require('mongoose');
 let MapFieldSchema = new mongoose.Schema({

+ 1 - 0
modules/reports/models/rpt_template.js

@@ -1,5 +1,6 @@
 /**
  * Created by Tony on 2016/12/23.
+ * 仅仅是存放报表模板的地方,由谁来引用是TreeNodeSchema的事情
  */
 let mongoose = require('mongoose');
 let Schema = mongoose.Schema;

+ 1 - 0
modules/reports/models/tpl_tree_node.js

@@ -1,5 +1,6 @@
 /**
  * Created by Tony on 2017/5/31.
+ * 不同的用户会有一套自己的模板结构列表
  */
 let mongoose = require('mongoose');
 let Schema = mongoose.Schema;

+ 8 - 0
modules/reports/rpt_component/jpc_bill_tab.js

@@ -20,6 +20,14 @@ JpcBillTabSrv.prototype.createNew = function(){
         let me = this;
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT][JV.PROP_BILL_FIELDS], null, me.disp_fields_idx);
     };
+    JpcBillTabResult.paging = function(rptTpl) {
+        let me = this, rst = 0;
+        let detail_fields = rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS];
+        if (detail_fields && detail_fields.length > 0) {
+            rst = detail_fields[0].length;
+        }
+        return rst;
+    };
     JpcBillTabResult.outputAsSimpleJSONPage = function (rptTpl, dataObj, page, bands, controls, $CURRENT_RPT) {
         let me = this, rst = [], tabRstLst = [];
         //1 calculate the band position

+ 1 - 1
modules/reports/rpt_component/jpc_ex.js

@@ -148,7 +148,7 @@ JpcExSrv.prototype.createNew = function(){
         } else if (me.crossTab) {
             me.totalPages = me.crossTab.preSetupPages(rptTpl, defProperties);
         } else if (me.billTab) {
-            //me.totalPages = billTab.paging();
+            me.totalPages = me.billTab.paging();
         }
     };
     JpcResult.executeFormulas = function(runType, $CURRENT_TEMPLATE, $CURRENT_DATA, $CURRENT_RPT) {

+ 16 - 12
modules/std_glj_lib/models/gljMapModel.js

@@ -1,7 +1,7 @@
 /**
  * Created by Zhong on 2017/8/11.
  */
-import {gljMapModel} from "./schemas";
+import gljMapModel from "./schemas";
 import moment from "moment";
 import counter from "../../../public/counter/counter";
 import async from "async";
@@ -135,20 +135,24 @@ class GljMapDao extends OprDao{
                 callback(err, '失败!')
             }
             else{
-                gljMapModel.update({ID: libId, deleted: false}, {$set: {deleted: true}}, function (err) {
+                gljMapModel.find({ID: libId, deleted: false}, function (err, result) {
                     if(err){
-                        callback(err, '移除工料机库失败!');
+                        callback(err, '数据不存在!');
                     }
                     else{
-                        //删除定额库引用标段gljLib
-                        rationRepositoryDao.updateGljLib(libId, function (err) {
-                            if(err){
-                                callback(null, "移除工料机成功,删除定额库引用字段失败!");
-                            }
-                            else{
-                                callback(null, '成功!');
-                            }
-                        })
+                        if(result[0].rationLibs.length > 0){//已被引用
+                            callback(null, '此工料机库已被引用!');
+                        }
+                        else{
+                            gljMapModel.update({ID: libId, deleted: false}, {$set: {deleted: true}}, function (err) {
+                                if(err){
+                                    callback(err, '移除工料机库失败!');
+                                }
+                                else{
+                                   callback(null, '删除成功');
+                                }
+                            });
+                        }
                     }
                 });
             }

+ 20 - 7
modules/std_glj_lib/models/gljModel.js

@@ -123,20 +123,33 @@ class GljDao  extends OprDao{
 
     mixUpdateGljItems (repId, lastOpr, updateItems, addItems, rIds, callback) {
         if (updateItems.length == 0 && rIds.length == 0) {
+            console.log(1);
             GljDao.addGljItems(repId, lastOpr, addItems, callback);
-        } else if (rIds.length > 0) {
-            GljDao.removeGljItems(repId, lastOpr, rIds, function(err, message, docs) {
-            });
-            gljModel.remove({ID: {$in: rIds}}, function (err) {
+        }
+        else if(rIds.length > 0 && updateItems.length > 0){
+            console.log(2);
+            async.parallel([
+                function (cb) {
+                    GljDao.removeGljItems(repId, lastOpr, rIds, cb);
+                },
+                function (cb) {
+                    GljDao.updateGljItems(repId, lastOpr, updateItems, cb);
+                }
+            ], function (err) {
                 if(err){
-                    callback(err, '删除错误', null);
+                    callback(true, "Fail to update and delete", false)
                 }
                 else{
-                    callback(null, '删除成功', null);
+                    callback(false, "Save successfully", false);
                 }
-            });
+            })
+        }
+        else if (rIds.length > 0 && updateItems.length === 0) {
+            console.log(3);
+            GljDao.removeGljItems(repId, lastOpr, rIds, callback);
         }
         else if(updateItems.length > 0 || addItems.length > 0){
+            console.log(4);
             GljDao.updateGljItems(repId, lastOpr, updateItems, function(err, results){
                 if (err) {
                     callback(true, "Fail to update", false);

+ 18 - 2
modules/templates/controllers/bills_template_controller.js

@@ -1,11 +1,25 @@
 /**
+ * 清单模板控制器
  * Created by Mai on 2017/4/17.
  */
-var BillsTemplateData = require('../models/bills_template');
+/*
+var BillsTemplateData = require('../models/bills_template_model');
 
 var callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
 };
+/!*
+class BillsTemplateController {
+    /!**
+     * 清单模板编辑页面
+     * @param req
+     * @param res
+     *!/
+    async index(req, res) {
+        let id = req.query.id;
+        let
+    }
+};*!/
 
 module.exports = {
     getBillsTemplate: function(req, res){
@@ -34,4 +48,6 @@ module.exports = {
             callback(req, res, err, message, data);
         });
     }
-}
+}
+
+export default BillsTemplateController;*/

+ 26 - 19
modules/templates/models/bills_template.js

@@ -2,25 +2,32 @@
  * Created by Mai on 2017/4/14.
  * 清单模板,新建项目使用
  */
-var counter = require("../../../public/counter/counter.js");
+import BaseModel from "../../common/base/base_model";
+import BillsTemplateSchema from "./schemas/bills_template";
 
-var mongoose = require('mongoose');
-var dbm = require("../../../config/db/db_manager");
-var templatesDB = dbm.getCfgConnection("templates");
-var Schema = mongoose.Schema;
-var deleteSchema = require('../../../public/models/delete_schema');
-var BillsTemplateSchema = new Schema({
-    ID: Number,
-    ParentID: Number,
-    NextSiblingID: Number,
-    code: String,
-    name: String,
-    unit: String,
-    deleteInfo: deleteSchema,
-    tempType: Number
-});
-var BillsTemplates = templatesDB.model('temp_bills', BillsTemplateSchema);
+class BillsTemplateModel extends BaseModel {
+    /**
+     * 构造函数
+     *
+     * @return {void}
+     */
+    constructor() {
+        let parent = super();
+        parent.model = BillsTemplateSchema;
+        parent.init();
+    }
+
+    async getTemplateData (valuationId) {
+        // 筛选字段
+        let field = {_id: 1, valuationId: 1, ID: 1, ParentID: 1, NextSiblingID: 1, code: 1, name: 1, unit: 1};
+        let data = await this.findDataByCondition({valuationId: valuationId}, field, false);
+
+        return data === null ? [] : data;
+    }
+};
 
+export default BillsTemplateModel;
+/*
 var BillsTemplateDAO = function(){};
 
 BillsTemplateDAO.prototype.getTemplate = function (type, callback) {
@@ -82,6 +89,6 @@ BillsTemplateDAO.prototype.getNewBillsTemplateID = function (count, callback) {
             callback(1, '获取主键失败', null);
         }
     });
-}
+};
 
-module.exports = new BillsTemplateDAO();
+module.exports = new BillsTemplateDAO();*/

+ 25 - 0
modules/templates/models/schemas/bills_template.js

@@ -0,0 +1,25 @@
+/**
+ * Created by Mai on 2017/8/17.
+ */
+import mongoose from "mongoose";
+let Schema = mongoose.Schema;
+
+let collectionName = 'temp_bills';
+
+let BillsTemplateSchema = {
+    // 树结构所需ID
+    ID: Number,
+    ParentID: Number,
+    NextSiblingID: Number,
+    // 编号
+    code: String,
+    // 名称
+    name: String,
+    // 单位
+    unit: String,
+    // 所属计价ID
+    valuationId: String
+};
+
+let model = mongoose.model(collectionName, new Schema(BillsTemplateSchema, {versionKey: false, collection: collectionName}));
+export {model as default, collectionName as collectionName};

+ 5 - 6
modules/templates/routes/bills_template_router.js

@@ -3,12 +3,11 @@
  */
 
 var express = require('express');
-
-var billsTemplateController = require('./../controllers/bills_template_controller');
-
+/*
+var billsTemplateController = require('./../controllers/bills_template_controller');*/
 
 module.exports = function (app) {
-    app.get('/template/bills', function (req, res) {
+    app.get('/template/bills/:id', function (req, res) {
         let checkAdmin = function (userAccount) {
             return true;
         }
@@ -32,12 +31,12 @@ module.exports = function (app) {
         }
     });
 
-    var billsTemplateRouter = express.Router();
+/*    var billsTemplateRouter = express.Router();
 
     billsTemplateRouter.post('/getBillsTemplate', billsTemplateController.getBillsTemplate);
     billsTemplateRouter.post('/updateBillsTemplate', billsTemplateController.updateBillsTemplate);
     billsTemplateRouter.post('/getNewBillsTemplateID', billsTemplateController.getNewBillsTemplateID);
-    app.use('/template/bills/api', billsTemplateRouter);
+    app.use('/template/bills/api', billsTemplateRouter);*/
 }
 
 

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

@@ -11,6 +11,7 @@ import STDRationLibMapModel from "../../common/std/std_ration_lib_map_model";
 import STDBillLibListsModel from "../../common/std/std_bills_lib_lists_model";
 import STDGLJLibMapModel from "../../common/std/std_glj_lib_map_model";
 import {default as EngineeringConst, List as EngineeringList} from "../../common/const/engineering";
+import BillsTemplateModel from "../../templates/models/bills_template_model";
 
 class CompilationController extends BaseController {
 
@@ -116,6 +117,7 @@ class CompilationController extends BaseController {
         let valuationData = {};
         let valuationList = {};
         let gljList = [];
+        let billsTemplateData = [];
         try {
             let compilationModel = new CompilationModel();
             compilationList = await compilationModel.getCompilationList();
@@ -138,6 +140,10 @@ class CompilationController extends BaseController {
                 throw '不存在数据';
             }
 
+            // 获取清单模板数据
+            let billsTemplateModel = new BillsTemplateModel();
+            billsTemplateData = await billsTemplateModel.getTemplateData(valuationId);
+
         } catch (error) {
             console.log(error);
         }
@@ -148,6 +154,7 @@ class CompilationController extends BaseController {
             rationList: JSON.stringify(rationList),
             gljList: JSON.stringify(gljList),
             mainTreeCol: JSON.stringify(valuationData.main_tree_col),
+            billsTemplateData: JSON.stringify(billsTemplateData),
             engineeringList: EngineeringList,
             selectedCompilation: selectedCompilation,
             valuationData: valuationData,

+ 1 - 0
public/web/sheet/sheet_common.js

@@ -36,6 +36,7 @@ var sheetCommonObj = {
         spreadBook.options.showHorizontalScrollbar = false;
         spreadBook.options.scrollbarMaxAlign = true;
         spreadBook.options.allowCopyPasteExcelStyle = false;
+        spreadBook.options.allowExtendPasteRange = true;
         var spreadNS = GC.Spread.Sheets;
         var sheet = spreadBook.getSheet(0);
         sheet.suspendPaint();

+ 10 - 0
public/web/tree_sheet/tree_sheet_helper.js

@@ -3,6 +3,16 @@
  */
 
 var TREE_SHEET_HELPER = {
+    createNewSpread: function (obj) {
+        var spread = new GC.Spread.Sheets.Workbook(obj, {sheetCount: 1});
+        spread.options.tabStripVisible = false;
+        spread.options.scrollbarMaxAlign = true;
+        spread.options.cutCopyIndicatorVisible = false;
+        spread.options.allowCopyPasteExcelStyle = false;
+        spread.options.allowUserDragDrop = false;
+        spread.getActiveSheet().setRowCount(3);
+        return spread;
+    },
     getSheetCellStyle: function (setting) {
         var style = new GC.Spread.Sheets.Style();
         style.locked = setting.readOnly ? true : false;

+ 7 - 0
web/maintain/bills_lib/html/neirong.html

@@ -262,6 +262,13 @@
 
         function pasteJobs(sheet, totalJobs){
             sheetJobsDatas = tools.getsheetDatas(sheet, 'total');
+            sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, function (sender, args) {
+                let maxCol = args.cellRange.col + args.cellRange.colCount - 1;
+                //复制的列数超过正确的列数,不可复制
+                if(maxCol >= totalJobsSetting.cols.length){
+                    args.cancel = true;
+                }
+            });
             sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, function(sender, args){
                 const colIdx = 1;
                 let orgRow = args.cellRange.row, orgCol = args.cellRange.col, rowCount = args.cellRange.rowCount, colCount = args.cellRange.colCount;

+ 14 - 0
web/maintain/bills_lib/html/qingdan.html

@@ -634,6 +634,13 @@
 
     function bindPasteBills(controller, sheet, setting){
         sheetBillsDatas = tools.getsheetDatas(sheet, 'bills', controller);
+        sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, function (sender, args) {
+            let maxCol = args.cellRange.col + args.cellRange.colCount - 1;
+            //复制的列数超过正确的列数,不可复制
+            if(maxCol >= billsLibSetting.cols.length){
+                args.cancel = true;
+            }
+        });
         sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, function(sender, args){
             let datas = [], field;
             let orgRow = args.cellRange.row, orgCol = args.cellRange.col, rowCount = args.cellRange.rowCount, colCount = args.cellRange.colCount;
@@ -676,6 +683,13 @@
     }
     function bindPasteRel(sheet, controller, totalJobs, setting){
         sheetDatas = tools.getsheetDatas(sheet, 'jobs');
+        sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, function (sender, args) {
+            let maxCol = args.cellRange.col + args.cellRange.colCount - 1;
+            //复制的列数超过正确的列数,不可复制
+            if(maxCol >= jobsSetting.cols.length){
+                args.cancel = true;
+            }
+        });
         sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, function(sender, args){
           //  sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.viewport);
            // sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.colHeader);

+ 15 - 0
web/maintain/bills_lib/html/tezheng.html

@@ -311,6 +311,13 @@
 
         function pasteItems(sheet, totalItems){
             totalItemsDatas = tools.getsheetDatas(sheet, 'total');
+            sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, function (sender, args) {
+                let maxCol = args.cellRange.col + args.cellRange.colCount - 1;
+                //复制的列数超过正确的列数,不可复制
+                if(maxCol >= totalItemsSetting.cols.length){
+                    args.cancel = true;
+                }
+            });
             sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, function(sender, args){
                 const colIdx = 1;
                 let orgRow = args.cellRange.row, orgCol = args.cellRange.col, rowCount = args.cellRange.rowCount, colCount = args.cellRange.colCount;
@@ -371,6 +378,14 @@
         }
 
         function pasteValue(sheet, totalItems){
+            sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, function (sender, args) {
+                let maxCol = args.cellRange.col + args.cellRange.colCount - 1;
+                //复制的列数超过正确的列数,不可复制
+                if(maxCol >= eigenValueSetting.cols.length){
+                    args.cancel = true;
+                }
+            });
+
             sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, function(sender, args){
                 valueDatas = tools.getsheetDatas(sheet, 'total');
                 const colIdx = 1;

+ 2 - 2
web/maintain/bills_lib/scripts/bills_lib_ajax.js

@@ -301,11 +301,11 @@ var billsAjax = {
             }
         })
     },
-    updateSerialNo: function (lastOperator, billsLibId, billsId, updateArr, field, callback) {
+    updateSerialNo: function (billsLibId, billsId, updateArr, field, callback) {
         $.ajax({
             type: 'post',
             url: 'stdBillsEditor/updateSerialNo',
-            data: {data: JSON.stringify({lastOperator: lastOperator, billsLibId: billsLibId, billsId: billsId, updateArr: updateArr, field: field})},
+            data: {data: JSON.stringify({lastOperator: userAccount, billsLibId: billsLibId, billsId: billsId, updateArr: updateArr, field: field})},
             dataType: 'json',
             success: function (result) {
                 if(!result.error && callback){

+ 1 - 1
web/maintain/ration_repository/main.html

@@ -116,7 +116,7 @@
                   <form>
                     <div class="form-group">
                       <label>定额库名称</label>
-                      <input class="form-control" id="renameText" placeholder="输入工料机库名称" type="text" value="">
+                      <input class="form-control" id="renameText" placeholder="输入定额库名称" type="text" value="">
                     </div>
                   </form>
                 </div>

+ 264 - 187
web/maintain/std_glj_lib/js/glj.js

@@ -1,11 +1,11 @@
 /**
  * Created by Zhong on 2017/8/14.
  */
-var pageOprObj = {
+let pageOprObj = {
     gljLibName : null,
     gljLibId: null,
     initPage : function(container, containerComponent) {
-        var me = this, gljLibId = getQueryString("gljLibId");//获取定额库参数
+        let me = this, gljLibId = getQueryString("gljLibId");//获取定额库参数
         me.gljLibId = gljLibId;
         repositoryGljObj.getGljLib(gljLibId, function () {
             repositoryGljObj.buildSheet(container);
@@ -22,7 +22,7 @@ var pageOprObj = {
         });
     }
 }
-repositoryGljObj = {
+let repositoryGljObj = {
     treeObj : null,
     workBook: null,
     gljCurTypeId: -1,
@@ -30,7 +30,8 @@ repositoryGljObj = {
     currentCache: null,
     parentNodeIds: {},
     gljList: [],
-    allowComponent: [202, 203, 204, 3],//可带组成物类型:混凝土、砂浆、配合比、机械
+    allowComponent: [202, 203, 204, 301],//可带组成物类型:混凝土、砂浆、配合比、机械台班
+    componentGljType: [201, 302, 303],//可成为组成物的工料机类型: 普通材料、 机械组成物、 机上人工
     distTypeTree: null,//add
     setting: {
 
@@ -81,7 +82,7 @@ repositoryGljObj = {
                 && distTypeObj.data.fullName !== '机上人工'){
                 distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID});
             }*/
-            if(distTypeObj.data.fullName !== '材料'){
+            if(distTypeObj.data.fullName !== '材料' && distTypeObj.data.fullName !== '机械'){
                 distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID});
             }
         });
@@ -127,7 +128,7 @@ repositoryGljObj = {
         })
     },
     getGljTree: function(gljLibId, callback) {
-        var me = this;
+        let me = this;
         $.ajax({
             type:"POST",
             url:"api/getGljTree",
@@ -153,7 +154,7 @@ repositoryGljObj = {
         })
     },
     getGljItems: function(repId) {
-        var me = this;
+        let me = this;
         $.ajax({
             type:"POST",
             url:"api/getGljItems",
@@ -179,11 +180,11 @@ repositoryGljObj = {
         })
     },
     showGljItems: function(data, type) {
-        var me = repositoryGljObj;
+        let me = repositoryGljObj;
         if (me.workBook) {
-            var cacheSection = [];
-            var pArr = me.parentNodeIds["_pNodeId_" + type];
-            for (var i = 0; i < data.length; i++) {
+            let cacheSection = [];
+            let pArr = me.parentNodeIds["_pNodeId_" + type];
+            for (let i = 0; i < data.length; i++) {
                 if (pArr && pArr.indexOf(data[i].gljClass) >= 0) {
                     cacheSection.push(data[i]);
                 } else if (type == data[i].gljClass) {
@@ -197,7 +198,7 @@ repositoryGljObj = {
         }
     },
     buildSheet: function(container) {
-        var me = repositoryGljObj;
+        let me = repositoryGljObj;
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30, me);
         me.repositoryGljDelOpr();
         me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
@@ -231,13 +232,51 @@ repositoryGljObj = {
         });
         return rst;
     },
+    //获得引用了组成物id为componentId的工料机,和重新变化组成物数组、重新计算单价
+    getUpdateGljs: function (rObj, isDelete) {
+        let me = repositoryGljObj, that = gljComponentOprObj,
+            rst = {updateArr: [], updateBasePrcArr: []};
+        //改变单价,以便reCalGljBasePrc方法可行
+        if(!isDelete){
+            for(let i = 0; i < me.gljList.length; i++){
+                if(me.gljList[i].ID === rObj.ID){
+                    me.gljList[i].basePrice = rObj.basePrice;
+                    break;
+                }
+            }
+        }
+        for(let i = 0; i < me.gljList.length; i++){
+            let thisComponent = me.gljList[i].component, isChange = false;
+            for(let j = 0; j < thisComponent.length; j++){
+                if(thisComponent[j].ID === rObj.ID){
+                    //删除
+                    isChange = true;
+                    if(isDelete){
+                        thisComponent.splice(j--, 1);
+                    }
+                    else {
+                        break;
+                    }
+                }
+            }
+            if(isChange){//引用了此组成物
+                let gljBasePrc = that.reCalGljBasePrc(me.getCurrentComponent(thisComponent));
+                if(me.gljList[i].basePrice !== gljBasePrc){
+                    me.gljList[i].basePrice = gljBasePrc;
+                    rst.updateBasePrcArr.push({gljId: me.gljList[i].ID, gljType: me.gljList[i].gljType, basePrice: me.gljList[i].basePrice});
+                }
+                rst.updateArr.push(me.gljList[i]);
+            }
+        }
+        return rst;
+    },
     reshowGljBasePrc: function (glj) {
         let me = repositoryGljObj;
-        for(let i = 0; i < me.gljList.length; i++){
-            if(glj.ID === me.gljList[i].ID){
-                me.gljList[i].basePrice = glj.basePrice;
+        let cacheSection = me.currentCache;
+        for(let i = 0; i < cacheSection.length; i++){
+            if(glj.ID === cacheSection[i].ID){
+                cacheSection[i].basePrice = glj.basePrice;
                 me.workBook.getSheet(0).setValue(i, 4, glj.basePrice);
-                console.log(i);
                 break;
             }
         }
@@ -257,8 +296,6 @@ repositoryGljObj = {
             if(row < me.currentCache.length){
                 //标记当前工料机
                 me.currentGlj = me.currentCache[row];
-                console.log(`me.currentCache`);
-                console.log(me.currentCache);
                 if(me.allowComponent.indexOf(me.currentCache[row].gljType) !== -1){
                     that.workBook.getSheet(0).getRange(-1, 0 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(false);
                     that.workBook.getSheet(0).getRange(-1, 4 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(false);
@@ -353,13 +390,13 @@ repositoryGljObj = {
         }
     },
     onCellEditStart: function(sender, args) {
-        var me = repositoryGljObj;
-        var rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row);
+        let me = repositoryGljObj;
+        let rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row);
         me.currentEditingGlj = rObj;
         me.orgCode = me.workBook.getSheet(0).getValue(args.row, 0);
-        var cacheSection = me.gljList;
+        let cacheSection = me.gljList;
         if (cacheSection) {
-            for (var j = 0; j < cacheSection.length; j++) {
+            for (let j = 0; j < cacheSection.length; j++) {
                 if (cacheSection[j][me.setting.header[0].dataCode] && cacheSection[j][me.setting.header[0].dataCode] == rObj[me.setting.header[0].dataCode]) {
                     rObj["ID"] = cacheSection[j]["ID"];
                     rObj.gljClass = cacheSection[j].gljClass;
@@ -369,12 +406,12 @@ repositoryGljObj = {
         }
     },
     onCellEditEnd: function(sender, args) {
-        var me = repositoryGljObj, rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row, me),
+        let me = repositoryGljObj, that = gljComponentOprObj,
+            rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row, me),
             updateArr = [], addArr = [], updateBasePrcArr = [];
         me.editingRowIdx = args.row;
         rObj.basePrice = rObj.basePrice ? rObj.basePrice : 0;
-        console.log(`me.currentGlj`);
-        console.log(me.currentGlj);
+        //更新
         if (me.currentEditingGlj["ID"]) {
             rObj["ID"] = me.currentEditingGlj["ID"];
             rObj.gljClass = me.currentEditingGlj.gljClass;
@@ -382,9 +419,41 @@ repositoryGljObj = {
                 if(me.currentEditingGlj[me.setting.header[col].dataCode] !== rObj[me.setting.header[col].dataCode]){
                     me.addGljObj = rObj;
                     if(rObj[me.setting.header[0].dataCode] && rObj[me.setting.header[1].dataCode] && rObj[me.setting.header[5].dataCode]){
-                        if(me.currentGlj){
-                            rObj.component = me.currentGlj.component;
+                        if(rObj.gljType !== me.currentEditingGlj.gljType){//修改了工料机类型
+                            if(me.currentGlj){
+                                me.currentGlj.component = [];
+                            }
+                            if(me.allowComponent.indexOf(rObj.gljType) !== -1){
+                                rObj.basePrice = 0;
+                            }
+                            if(me.componentGljType.indexOf(me.currentEditingGlj.gljType) !== -1 &&
+                                !(me.currentEditingGlj.gljType === 302 && rObj.gljType === 303) && !(me.currentEditingGlj.gljType === 303 && rObj.gljType === 302)){//修改了原本是组成物的工料机
+                               //寻找所有引用了此组成物的工料机,并从组成物中删去此工料机,并重算单价
+                                let updateGljs = me.getUpdateGljs(rObj);
+                                if(updateGljs.updateArr.length > 0 || updateGljs.updateBasePrcArr.length > 0){
+                                    for(let i = 0; i < updateGljs.updateArr.length; i++){
+                                        updateArr.push(updateGljs.updateArr[i]);
+                                    }
+                                    for(let i = 0; i < updateGljs.updateBasePrcArr.length; i++){
+                                        updateArr.push(updateGljs.updateBasePrcArr[i]);
+                                    }
+                                }
+                            }
                         }
+                        else if(rObj.basePrice !== me.currentEditingGlj.basePrice){//修改了单价,可修改单价的必为可成为组成物的
+                            //寻找所有引用了此组成物的工料机,并从组成物中删去此工料机,并重算单价
+                            let updateGljs = me.getUpdateGljs(rObj);
+                            if(updateGljs.updateArr.length > 0 || updateGljs.updateBasePrcArr.length > 0){
+                                for(let i = 0; i < updateGljs.updateArr.length; i++){
+                                    updateArr.push(updateGljs.updateArr[i]);
+                                }
+                                for(let i = 0; i < updateGljs.updateBasePrcArr.length; i++){
+                                    updateArr.push(updateGljs.updateBasePrcArr[i]);
+                                }
+                            }
+                            rObj.basePrice = !isNaN(parseFloat(rObj.basePrice)) && (rObj.basePrice && typeof rObj.basePrice !== 'undefined') ? parseFloat(rObj.basePrice) : 0;
+                        }
+                        rObj.component = me.currentGlj.component;
                         updateArr.push(rObj);
                         break;
                     }
@@ -411,6 +480,7 @@ repositoryGljObj = {
             }
             //update basePrice of ration when editting gljType of glj
             if(me.currentEditingGlj.gljType !== rObj.gljType){
+
                 let gljTypeObj = {gljId: me.currentEditingGlj.ID, gljType: rObj.gljType, basePrice: rObj.basePrice};
                 updateBasePrcArr.push(gljTypeObj);
                 if(me.rationLibs.length > 0){
@@ -418,7 +488,9 @@ repositoryGljObj = {
                 }
             }
             //-----------------------------------------------------------
-        } else {
+        }
+        //新增
+        else {
             me.addGljObj = rObj;
             let isCanSav = true;
             if(!rObj[me.setting.header[0].dataCode] || !rObj[me.setting.header[1].dataCode] || !rObj[me.setting.header[5].dataCode]){
@@ -427,10 +499,11 @@ repositoryGljObj = {
             if(isCanSav){
                 me.addGljObj = null;
                 rObj.component = [];
-                //如果类型为混凝土、砂浆、配合比、机械时,添加时填写的单价清空
+                //如果类型为混凝土、砂浆、配合比、机械台班时,添加时填写的单价清空
                 if(me.allowComponent.indexOf(rObj.gljType) !== -1){
                     rObj.basePrice = 0;
                 }
+                rObj.basePrice = !isNaN(parseFloat(rObj.basePrice)) && (rObj.basePrice && typeof rObj.basePrice !== 'undefined') ? parseFloat(rObj.basePrice) : 0;
                 addArr.push(rObj);
             }
         }
@@ -441,7 +514,6 @@ repositoryGljObj = {
             me.currentEditingGlj = null;
             //me.workBook.getSheet(0).setValue(11, 5, "人工");
             me.mixUpdateRequest(updateArr, addArr, []);
-            console.log(updateArr);
         }
     },
     repositoryGljDelOpr: function () {
@@ -460,6 +532,17 @@ repositoryGljObj = {
                     if(sels[i].colCount === me.setting.header.length){
                         for(let j = 0; j < sels[i].rowCount; j++){
                             if(sels[i].row + j < cacheSection.length){
+                                //删除了已被引用成组成物的工料机,重新计算所有引用此组成物的工料机的单价、组成物数组
+                                let updateGljs = me.getUpdateGljs(cacheSection[sels[i].row + j], true);
+                                if(updateGljs.updateArr.length > 0 || updateGljs.updateBasePrcArr.length > 0){
+                                    for(let i = 0; i < updateGljs.updateArr.length; i++){
+                                        updateArr.push(updateGljs.updateArr[i]);
+                                    }
+                                    for(let i = 0; i < updateGljs.updateBasePrcArr.length; i++){
+                                        updateBasePrcArr.push(updateGljs.updateBasePrcArr[i]);
+                                    }
+                                }
+                                console.log(updateArr);
                                 removeArr.push(cacheSection[sels[i].row + j].ID);
                                 //tempRemoveArr.push({ID: cacheSection[sels[i].row + j].ID, code: cacheSection[sels[i].row + j].code});
                                 //删除后重新计算引用了此工料机的定额单价
@@ -515,45 +598,6 @@ repositoryGljObj = {
                         }
                     }
                 }
-                //提取已被引用工料机
-               /* if(tempRemoveArr.length > 0){
-                    for(let i = 0; i < tempRemoveArr.length; i++){
-                        if(me.rationGljIds.indexOf(tempRemoveArr[i].ID) !== -1){
-                            refGljCodes.push(tempRemoveArr[i].code);
-                            tempRemoveArr.splice(i--, 1);
-                        }
-                        else{
-                            removeArr.push(tempRemoveArr[i].ID);
-                        }
-                    }
-                }*/
-                //提示
-              /*  if(refGljCodes.length > 0){
-                    let alertText;
-                    if(refGljCodes.length > 3){
-                        alertText = "编号: " + refGljCodes[0]+" 、" + refGljCodes[1] + " 、" + refGljCodes[2] + "...等工料机已有定额引用,删除失败!";
-                    }
-                    else {
-                        let alertCode = " ";
-                        for(let i=0; i< refGljCodes.length; i++){
-                            alertCode += refGljCodes[i] + " 、";
-                        }
-                        alertText = "编号:" + alertCode + "工料机已有定额引用,删除失败!"
-                    }
-                    $('#alertText').text(alertText);
-                    $('#codeAlertBtn').click();
-                    sheet.options.isProtected = true;
-                    $('#codAleConfBtn').click(function () {
-                        sheetCommonObj.lockSomeCodes(sheet, 0, cacheSection.length);
-                        if(removeArr.length > 0){
-                            me.mixUpdateRequest(updateArr, [], removeArr);
-                        }
-                    });
-                    $('#codAleClose').click(function () {
-                        sheetCommonObj.lockSomeCodes(sheet, 0, cacheSection.length);
-                        me.mixUpdateRequest(updateArr, [], removeArr);
-                    });
-                }*/
                 if(removeArr.length > 0 || updateArr.length > 0){
                     //删除警告
                     $('#alertGljTxt').text('可能已有定额引用了当前工料机,导致定额查找不到此工料机。确定要删除吗?');
@@ -574,7 +618,7 @@ repositoryGljObj = {
         me.workBook.commandManager().setShortcutKey('repositoryGljDel', GC.Spread.Commands.Key.del, false, false, false, false);
     },
     validUpdateObj: function (pasteObj, rowIdx) {
-        let rst = {}, backUpObj = {},
+        let rst = {updateGlj: [], updateBasePrcArr: []}, backUpObj = {},
             me = repositoryGljObj,
             tempObj = me.currentCache[rowIdx],
             reCalBasePrc = false,
@@ -615,9 +659,26 @@ repositoryGljObj = {
                 if(pasteObj.gljType === me.distTypeTree.comboDatas[i].text){
                     isExsit = true;
                     reCalBasePrc = true;
+                    //
+                    if(me.componentGljType.indexOf(tempObj.gljType) !== -1 &&
+                        !(tempObj.gljType === 302 && pasteObj.gljType === 303) && !(tempObj.gljType === 303 && pasteObj.gljType === 302)){//修改了原本是组成物的工料机
+                        //寻找所有引用了此组成物的工料机,并从组成物中删去此工料机,并重算单价
+                        let updateGljs = me.getUpdateGljs(tempObj, true);
+                        if(updateGljs.updateArr.length > 0 || updateGljs.updateBasePrcArr.length > 0){
+                            for(let i = 0; i < updateGljs.updateArr.length; i++){
+                                rst.updateGlj.push(updateGljs.updateArr[i]);
+                            }
+                            for(let i = 0; i < updateGljs.updateBasePrcArr.length; i++){
+                                rst.updateBasePrcArr.push(updateGljs.updateBasePrcArr[i]);
+                            }
+                        }
+                    }
                     tempObj.gljType = me.distTypeTree.comboDatas[i].value;
                     tempObj.shortName = me.distTypeTree.distTypes[me.distTypeTree.prefix + tempObj.gljType].data.shortName;
-
+                    if(me.allowComponent.indexOf(tempObj.gljType) !== -1){
+                        tempObj.basePrice = 0;
+                    }
+                    break;
                 }
             }
             if(!isExsit) isValid = false;
@@ -628,12 +689,23 @@ repositoryGljObj = {
         if(pasteObj.basePrice !== me.currentCache[rowIdx].basePrice){
             reCalBasePrc = true;
             tempObj.basePrice = pasteObj.basePrice;
+            let updateGljs = me.getUpdateGljs(tempObj, false);
+            if(updateGljs.updateArr.length > 0 || updateGljs.updateBasePrcArr.length > 0){
+                for(let i = 0; i < updateGljs.updateArr.length; i++){
+                    rst.updateGlj.push(updateGljs.updateArr[i]);
+                }
+                for(let i = 0; i < updateGljs.updateBasePrcArr.length; i++){
+                    rst.updateBasePrcArr.push(updateGljs.updateBasePrcArr[i]);
+                }
+            }
         }
         if(isValid){
-            rst.updateGlj = tempObj;
+            rst.updateGlj.push(tempObj);
             if(reCalBasePrc){
                 //重新计算定额基价对象
-                rst.updateBasePrc = {gljId: tempObj.ID, gljType: tempObj.gljType, basePrice: tempObj.basePrice};
+                //rst.updateBasePrc = {gljId: tempObj.ID, gljType: tempObj.gljType, basePrice: tempObj.basePrice};
+                let newReObj = {gljId: tempObj.ID, gljType: tempObj.gljType, basePrice: tempObj.basePrice};
+                rst.updateBasePrcArr.push(newReObj);
             }
         }
         else {
@@ -676,122 +748,128 @@ repositoryGljObj = {
         return true;
     },
     onClipboardPasting: function(sender, args) {
-        var me = repositoryGljObj;
+        let me = repositoryGljObj;
         /*if (args.cellRange.colCount != me.setting.header.length || me.gljCurTypeId < 0 || me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]) {
          args.cancel = true;
          }*/
         if (me.gljCurTypeId < 0 ) {
             args.cancel = true;
         }
+        let maxCol = args.cellRange.col + args.cellRange.colCount - 1;
+        //复制的列数超过正确的列数,不可复制
+        if(maxCol >= me.setting.header.length){
+            args.cancel = true;
+        }
     },
     onClipboardPasted: function(e, info) {
-        var me = repositoryGljObj;
-        var updateArr = [], addArr = [];
-        var items = sheetCommonObj.analyzePasteData(me.setting, info);
-        let beginRow = info.cellRange.row, endRow = info.cellRange.row + info.cellRange.rowCount - 1,
-            maxRow = me.currentCache.length - 1,
-            updateBasePrcArr = [] ,
-            updateCount, resumeArr = [];
-        if(endRow <= maxRow){
-            //updateItems = items;
-            for(let i = 0; i < items.length; i++){
-                let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
-                if(updateObj && typeof updateObj.updateGlj !== 'undefined'){
-                    updateArr.push(updateObj.updateGlj);
-                    if(typeof updateObj.updateBasePrc !== 'undefined'){
-                        updateBasePrcArr.push(updateObj.updateBasePrc);
+        let me = repositoryGljObj;
+            let updateArr = [], addArr = [];
+            let items = sheetCommonObj.analyzePasteData(me.setting, info);
+            let beginRow = info.cellRange.row, endRow = info.cellRange.row + info.cellRange.rowCount - 1,
+                maxRow = me.currentCache.length - 1,
+                updateBasePrcArr = [] ,
+                updateCount, resumeArr = [];
+            if(endRow <= maxRow){
+                //updateItems = items;
+                for(let i = 0; i < items.length; i++){
+                    let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
+                    console.log(updateObj);
+                    if(updateObj && typeof updateObj.updateGlj !== 'undefined'){
+                        updateArr = updateObj.updateGlj;
+                        if(typeof updateObj.updateBasePrc !== 'undefined'){
+                            updateBasePrcArr = updateObj.updateBasePrc;
+                        }
                     }
-                }
-                else{
-                    resumeArr.push(info.cellRange.row + i);
-                }
-            }
-        }
-        else if(beginRow <= maxRow && endRow > maxRow){
-            updateCount = maxRow - beginRow + 1;
-            for(let i = 0; i < updateCount; i++){
-                let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
-                if(updateObj && typeof updateObj.updateGlj !== 'undefined'){
-                    updateArr.push(updateObj.updateGlj);
-                    if(typeof updateObj.updateBasePrc !== 'undefined'){
-                        updateBasePrcArr.push(updateObj.updateBasePrc);
+                    else{
+                        resumeArr.push(info.cellRange.row + i);
                     }
                 }
-                else{
-                    resumeArr.push(info.cellRange.row + i);
-                }
             }
-            if(info.cellRange.colCount === me.setting.header.length){
-                for(let i = updateCount ; i < items.length; i++){
-                    if(me.isValidObj(items[i])){
-                        items[i].component = [];
-                        //类型为混凝土、砂浆、配合比、机械时,基价只能组成物计算
-                        if(me.allowComponent.indexOf(items[i].gljType) !== -1){
-                            items[i].basePrice = 0;
+            else if(beginRow <= maxRow && endRow > maxRow){
+                updateCount = maxRow - beginRow + 1;
+                for(let i = 0; i < updateCount; i++){
+                    let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
+                    if(updateObj && typeof updateObj.updateGlj !== 'undefined'){
+                        updateArr = updateObj.updateGlj;
+                        if(typeof updateObj.updateBasePrc !== 'undefined'){
+                            updateBasePrcArr = updateObj.updateBasePrc;
                         }
-                        addArr.push(items[i]);
                     }
                     else{
                         resumeArr.push(info.cellRange.row + i);
                     }
                 }
-            }
-            else{
-                for(let i = updateCount ; i < items.length; i++){
-                    resumeArr.push(info.cellRange.row + i);
-                }
-            }
-        }
-        else{
-            if(info.cellRange.colCount === me.setting.header.length){
-                for(let i = 0; i < items.length; i++){
-                    if(me.isValidObj(items[i])){
-                        items[i].component = [];
-                        if(me.allowComponent.indexOf(items[i].gljType) !== -1){
-                            items[i].basePrice = 0;
+                if(info.cellRange.colCount === me.setting.header.length){
+                    for(let i = updateCount ; i < items.length; i++){
+                        if(me.isValidObj(items[i])){
+                            items[i].component = [];
+                            //类型为混凝土、砂浆、配合比、机械时,基价只能组成物计算
+                            if(me.allowComponent.indexOf(items[i].gljType) !== -1){
+                                items[i].basePrice = 0;
+                            }
+                            addArr.push(items[i]);
+                        }
+                        else{
+                            resumeArr.push(info.cellRange.row + i);
                         }
-                        addArr.push(items[i]);
                     }
-                    else{
+                }
+                else{
+                    for(let i = updateCount ; i < items.length; i++){
                         resumeArr.push(info.cellRange.row + i);
                     }
                 }
             }
             else{
-                for(let i = 0; i < items.length; i++){
-                    resumeArr.push(info.cellRange.row + i);
-                }
-            }
-        }
-        //repaint
-        if(resumeArr.length > 0){
-            info.sheet.suspendPaint();
-            for(let i = 0; i < resumeArr.length ; i++){
-                if(resumeArr[i] < me.currentCache.length){
-                    for(let col = 0; col < me.setting.header.length; col++){
-                        if(me.setting.header[col].dataCode === 'gljType'){
-                            let gljType = me.currentCache[resumeArr[i]][me.setting.header[col].dataCode];
-                            info.sheet.setValue(resumeArr[i], col, me.distTypeTree.distTypes["gljType" + gljType].data.fullName);
+                if(info.cellRange.colCount === me.setting.header.length){
+                    for(let i = 0; i < items.length; i++){
+                        if(me.isValidObj(items[i])){
+                            items[i].component = [];
+                            if(me.allowComponent.indexOf(items[i].gljType) !== -1){
+                                items[i].basePrice = 0;
+                            }
+                            addArr.push(items[i]);
                         }
                         else{
-                            info.sheet.setValue(resumeArr[i], col, me.currentCache[resumeArr[i]][me.setting.header[col].dataCode]);
+                            resumeArr.push(info.cellRange.row + i);
                         }
                     }
                 }
                 else{
-                    for(let col = 0; col < me.setting.header.length; col++){
-                        info.sheet.setValue(resumeArr[i], col, '');
+                    for(let i = 0; i < items.length; i++){
+                        resumeArr.push(info.cellRange.row + i);
                     }
                 }
             }
-            info.sheet.resumePaint();
-        }
-        if (updateArr.length > 0 || addArr.length > 0) {
-            me.mixUpdateRequest(updateArr, addArr, []);
-        }
-        if(updateBasePrcArr.length > 0 && me.rationLibs.length > 0){
-            me.updateRationBasePrcRq(updateBasePrcArr);
-        }
+            //repaint
+            if(resumeArr.length > 0){
+                info.sheet.suspendPaint();
+                for(let i = 0; i < resumeArr.length ; i++){
+                    if(resumeArr[i] < me.currentCache.length){
+                        for(let col = 0; col < me.setting.header.length; col++){
+                            if(me.setting.header[col].dataCode === 'gljType'){
+                                let gljType = me.currentCache[resumeArr[i]][me.setting.header[col].dataCode];
+                                info.sheet.setValue(resumeArr[i], col, me.distTypeTree.distTypes["gljType" + gljType].data.fullName);
+                            }
+                            else{
+                                info.sheet.setValue(resumeArr[i], col, me.currentCache[resumeArr[i]][me.setting.header[col].dataCode]);
+                            }
+                        }
+                    }
+                    else{
+                        for(let col = 0; col < me.setting.header.length; col++){
+                            info.sheet.setValue(resumeArr[i], col, '');
+                        }
+                    }
+                }
+                info.sheet.resumePaint();
+            }
+            if (updateArr.length > 0 || addArr.length > 0) {
+                me.mixUpdateRequest(updateArr, addArr, []);
+            }
+            if(updateBasePrcArr.length > 0 && me.rationLibs.length > 0){
+                me.updateRationBasePrcRq(updateBasePrcArr);
+            }
     },
     updateRationBasePrcRq: function (basePrcArr) {
         $.ajax({
@@ -821,7 +899,7 @@ repositoryGljObj = {
         });
     },*/
     mixUpdateRequest: function(updateArr, addArr, removeIds) {
-        var me = repositoryGljObj;
+        let me = repositoryGljObj;
         $.ajax({
             type:"POST",
             url:"api/mixUpdateGljItems",
@@ -869,8 +947,8 @@ repositoryGljObj = {
         return rst;
     },
     getCache: function() {
-        var me = this, rst = [];
-        for (var i = 0; i < me.gljList.length; i++) {
+        let me = this, rst = [];
+        for (let i = 0; i < me.gljList.length; i++) {
             if (me.gljList[i].gljClass == me.gljCurTypeId) {
                 rst.push(me.gljList[i]);
             }
@@ -878,29 +956,29 @@ repositoryGljObj = {
         return rst;
     },
     updateCache: function(addArr, updateArr, removeIds, result) {
-        var me = this, cacheSection = me.gljList;
+        let me = this, cacheSection = me.gljList;
         if (addArr.length > 0) {
             me.gljList = me.gljList.concat(addArr);
             cacheSection = me.gljList;
         }
-        for (var i = removeIds.length - 1; i >= 0; i--) {
-            for (var j = cacheSection.length - 1; j >= 0 ; j--) {
+        for (let i = removeIds.length - 1; i >= 0; i--) {
+            for (let j = cacheSection.length - 1; j >= 0 ; j--) {
                 if (cacheSection[j]["ID"] == removeIds[i]) {
                     cacheSection.splice(j,1);
                 }
             }
         }
         if (result && result.data && result.data.ops && result.data.ops.length > 0) {
-            for (var i = 0; i < result.data.ops.length; i++) {
-                for (var j = 0; j < cacheSection.length; j++) {
+            for (let i = 0; i < result.data.ops.length; i++) {
+                for (let j = 0; j < cacheSection.length; j++) {
                     if (cacheSection[j][me.setting.header[0].dataCode] == result.data.ops[i][me.setting.header[0].dataCode]) {
                         cacheSection[j]["ID"] = result.data.ops[i]["ID"];
                     }
                 }
             }
         }
-        for (var i = 0; i < updateArr.length; i++) {
-            for (var j = 0; j < cacheSection.length; j++) {
+        for (let i = 0; i < updateArr.length; i++) {
+            for (let j = 0; j < cacheSection.length; j++) {
                 if (updateArr[i]["ID"] && cacheSection[j]["ID"]) {
                     if (cacheSection[j]["ID"] == updateArr[i]["ID"]) {
                         cacheSection[j] = updateArr[i];
@@ -914,9 +992,9 @@ repositoryGljObj = {
         }
     },
     sortGlj: function() {
-        var me = this;
+        let me = this;
         me.gljList.sort(function(a, b){
-            var rst = 0;
+            let rst = 0;
             if (a.code > b.code) rst = 1
             else if (a.code < b.code) rst = -1;
             return rst;
@@ -924,9 +1002,9 @@ repositoryGljObj = {
     }
 }
 
-var gljTypeTreeOprObj = {
+let gljTypeTreeOprObj = {
     onClick: function(event,treeId,treeNode) {
-        var me = repositoryGljObj,
+        let me = repositoryGljObj,
             that = gljComponentOprObj,
             gljTypeId = treeNode.ID;
         me.gljCurTypeId = treeNode.ID;
@@ -959,7 +1037,7 @@ var gljTypeTreeOprObj = {
         return true;
     },
     onRename : function(e, treeId, treeNode, isCancel) {
-        var nodes = [];
+        let nodes = [];
         nodes.push(treeNode);
         gljTypeTreeOprObj.updateNodes(nodes);
     },
@@ -972,20 +1050,20 @@ var gljTypeTreeOprObj = {
         if (!confirm("您确定要删除此节点及所有子节点的数据?删除后不可恢复!")) {
             return false;
         }
-        var nodeIds = [], preNode = treeNode.getPreNode(), preNodeId = -1;
+        let nodeIds = [], preNode = treeNode.getPreNode(), preNodeId = -1;
         if (preNode) {
             preNodeId = preNode.ID;
         }
         private_fetchAllSubItems = function(pItem){
             nodeIds.push(pItem.ID);
             if (pItem.items && pItem.items.length > 0) {
-                for (var i = 0; i < pItem.items.length; i++) {
+                for (let i = 0; i < pItem.items.length; i++) {
                     private_fetchAllSubItems(pItem.items[i]);
                 }
             }
         };
         nodeIds.push(treeNode.ID);
-        for (var i = 0; i < treeNode.items.length; i++) {
+        for (let i = 0; i < treeNode.items.length; i++) {
             private_fetchAllSubItems(treeNode.items[i]);
         }
         $.ajax({
@@ -996,7 +1074,7 @@ var gljTypeTreeOprObj = {
             cache:false,
             timeout:5000,
             success:function(result,textStatus,status){
-                var pNode = treeNode.getParentNode();
+                let pNode = treeNode.getParentNode();
                 if (pNode && pNode.items && pNode.items.length == 1) {
                     pNode.isParent = false;
                 }
@@ -1007,7 +1085,7 @@ var gljTypeTreeOprObj = {
         return true;
     },
     onRemove: function(e, treeId, treeNode){
-        var me = repositoryGljObj, pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
+        let me = repositoryGljObj, pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
         if (pNode && pNode.items && pNode.items.length == 0) {
             pNode.isParent = false;
             me.treeObj.refresh();
@@ -1015,9 +1093,9 @@ var gljTypeTreeOprObj = {
     },
     updateNodes: function(nodes){
         if (nodes && nodes.length > 0) {
-            var reqData = []
-            for (var i = 0; i < nodes.length; i++) {
-                var node = {};
+            let reqData = []
+            for (let i = 0; i < nodes.length; i++) {
+                let node = {};
                 node.repositoryId = nodes[i].repositoryId;
                 node.ID = nodes[i].ID;
                 node.ParentID = nodes[i].ParentID;
@@ -1041,13 +1119,13 @@ var gljTypeTreeOprObj = {
         }
     },
     addRootNode: function() {
-        var me = repositoryGljObj, rawNode = {ParentID: -1, NextSiblingID: -1, Name: "所有"}, lastNodeId = -1;
+        let me = repositoryGljObj, rawNode = {ParentID: -1, NextSiblingID: -1, Name: "所有"}, lastNodeId = -1;
         if (me.treeObj) {
-            var rootNodes = me.treeObj.getNodes();
+            let rootNodes = me.treeObj.getNodes();
             if (rootNodes.length == 0) {
                 gljTypeTreeOprObj.addNewNode(rawNode, lastNodeId, function(err, rst){
                     if (!(err)) {
-                        var newNodes = [], isSilent = false;
+                        let newNodes = [], isSilent = false;
                         newNodes.push({ repositoryId: rst.data.repositoryId, ID: rst.data.ID, ParentID: rst.data.ParentID, NextSiblingID:-1, Name:"所有",isParent:false, items:[]});
                         me.treeObj.addNodes(null, -1, newNodes, isSilent);
                     }
@@ -1077,21 +1155,20 @@ var gljTypeTreeOprObj = {
         }
         hoverOpr();
         function hoverOpr(){
-            //console.log(treeNode);
-            var me = repositoryGljObj, sObj = $("#" + treeNode.tId + "_span");
+            let me = repositoryGljObj, sObj = $("#" + treeNode.tId + "_span");
             if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
-            var addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
+            let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
             sObj.after(addStr);
-            var btn = $("#addBtn_"+treeNode.tId);
+            let btn = $("#addBtn_"+treeNode.tId);
             if (btn) btn.bind("click", function(){
                 treeNode.doing = true;
-                var rawNode = {ParentID: treeNode.ID, NextSiblingID: -1, Name: "新增子节点"}, lastNodeId = -1;
+                let rawNode = {ParentID: treeNode.ID, NextSiblingID: -1, Name: "新增子节点"}, lastNodeId = -1;
                 if (treeNode.items.length > 0) {
                     lastNodeId = treeNode.items[treeNode.items.length - 1].ID;
                 }
                 gljTypeTreeOprObj.addNewNode(rawNode, lastNodeId, function(err, rst){
                     if (!(err)) {
-                        var newNodes = [], isSilent = false;
+                        let newNodes = [], isSilent = false;
                         if(treeNode.items.length > 0){
                             treeNode.items[treeNode.items.length - 1].NextSiblingID = rst.data.ID;
                         }

+ 28 - 9
web/maintain/std_glj_lib/js/gljComponent.js

@@ -18,7 +18,7 @@ let gljComponentOprObj = {
         }
     },
     buildSheet: function(container) {
-        var me = gljComponentOprObj;
+        let me = gljComponentOprObj;
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30, me);
         me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
         me.workBook.getSheet(0).setFormatter(-1, 0, "@", GC.Spread.Sheets.SheetArea.viewport);
@@ -150,7 +150,7 @@ let gljComponentOprObj = {
                     if(gljList[i].code === args.editingText){//有效的组成物
                         hasCode = true;
                         if((materialComponent.indexOf(that.currentGlj.gljType) !== -1 && gljList[i].gljType === 201)
-                            || (that.currentGlj.gljType === 3 && machineComponent.indexOf(gljList[i].gljType) !== -1 )){//普通材料
+                            || (that.currentGlj.gljType === 301 && machineComponent.indexOf(gljList[i].gljType) !== -1 )){//普通材料
                             //是否与原有组成物不同
                             let isExist = false;
                             for(let j = 0; j < component.length; j++){
@@ -174,11 +174,27 @@ let gljComponentOprObj = {
                                     }
                                     component.splice(index, 1);
                                     component.splice(index, 0, rObj);
+                                    //计算工料机单价
+                                    let gljBasePrc = me.reCalGljBasePrc(that.getCurrentComponent(component));
+                                    if(gljBasePrc !== that.currentGlj.basePrice){
+                                        that.currentGlj.basePrice = gljBasePrc;
+                                        that.reshowGljBasePrc(that.currentGlj);
+                                        //工料机单价改变,重算引用了该工料机的定额单价
+                                        updateBasePrc.push({gljId: that.currentGlj.ID, gljType: that.currentGlj.gljType, basePrice: that.currentGlj.basePrice});
+                                    }
                                     updateArr.push(that.currentGlj);
                                 }
                                 else{
                                     rObj.consumeAmt = 0;
                                     component.push(rObj);
+                                    //计算工料机单价
+                                    let gljBasePrc = me.reCalGljBasePrc(that.getCurrentComponent(component));
+                                    if(gljBasePrc !== that.currentGlj.basePrice){
+                                        that.currentGlj.basePrice = gljBasePrc;
+                                        that.reshowGljBasePrc(that.currentGlj);
+                                        //工料机单价改变,重算引用了该工料机的定额单价
+                                        updateBasePrc.push({gljId: that.currentGlj.ID, gljType: that.currentGlj.gljType, basePrice: that.currentGlj.basePrice});
+                                    }
                                     updateArr.push(that.currentGlj);
                                 }
                                 break;
@@ -195,7 +211,7 @@ let gljComponentOprObj = {
                             if(materialComponent.indexOf(that.currentGlj.gljType) === 1){
                                 alert("该组成物只能是普通材料!");
                             }
-                            else if(that.currentGlj.gljType === 3){
+                            else if(that.currentGlj.gljType === 301){
                                 alert("该组成物只能是机械组成物或机上人工!")
                             }
                             args.sheet.setValue(args.row, args.col, me.currentEditingComponent[me.setting.header[args.col].dataCode] ?
@@ -250,7 +266,12 @@ let gljComponentOprObj = {
         }
     },
     onClipboardPasting: function (sender, info) {
-
+        let me = gljComponentOprObj;
+        let maxCol = info.cellRange.col + info.cellRange.colCount - 1;
+        //复制的列数超过正确的列数,不可复制
+        if(maxCol >= me.setting.header.length){
+            args.cancel = true;
+        }
     },
     onClipboardPasted: function (sender, info) {
         let me = gljComponentOprObj, that = repositoryGljObj, updateArr = [] ,materialComponent = [202, 203, 204], machineComponent = [302, 303],
@@ -262,7 +283,7 @@ let gljComponentOprObj = {
                 for(let j = 0; j < gljCache.length; j++){
                     if(items[i].code === gljCache[j].code){
                         if((materialComponent.indexOf(that.currentGlj.gljType) !== -1 && gljCache[j].gljType === 201)
-                            || (that.currentGlj.gljType === 3 && machineComponent.indexOf(gljCache[j].gljType) !== -1 )){
+                            || (that.currentGlj.gljType === 301 && machineComponent.indexOf(gljCache[j].gljType) !== -1 )){
                             //是否与原有组成物不同
                             let isExist = false;
                             for(let k = 0; k < component.length; k++){
@@ -312,7 +333,7 @@ let gljComponentOprObj = {
             }
             if(isChange){
                 //计算工料机单价
-                let gljBasePrc = me.reCalGljBasePrc(that.currentComponent);
+                let gljBasePrc = me.reCalGljBasePrc(that.getCurrentComponent(component));
                 if(gljBasePrc !== that.currentGlj.basePrice){
                     that.currentGlj.basePrice = gljBasePrc;
                     that.reshowGljBasePrc(that.currentGlj);
@@ -371,11 +392,9 @@ let gljComponentOprObj = {
             data: {libId: pageOprObj.gljLibId, updateArr: updateArr, oprtor: userAccount},
             dataType: 'json',
             success: function (result) {
-                console.log(result);
                 if(result.data.length > 0){
                     if(result.data[0]){
                         that.currentComponent =  that.getCurrentComponent(result.data[0].component);
-                        console.log(that.currentComponent);
                         sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
                         sheetCommonObj.showData(me.workBook.getSheet(0), me.setting, that.currentComponent);
                     }
@@ -384,7 +403,7 @@ let gljComponentOprObj = {
         })
     },
     round: function (v, e) {
-        var t=1;
+        let t=1;
         for(;e>0;t*=10,e--);
         for(;e<0;t/=10,e++);
         return Math.round(v*t)/t;

+ 11 - 5
web/maintain/std_glj_lib/js/main.js

@@ -185,11 +185,17 @@ function removeGljLib(delObj, dispNames){
         dataType: 'json',
         success: function (result) {
             if(!result.error){
-                var jqSel = "#"+ delObj.libId;
-                $(jqSel).remove();
-                let index = dispNames.indexOf(delObj.libName);
-                dispNames.splice(index, 1);
-                $('#delCancelBtn').click();
+                if(result.message === '此工料机库已被引用!'){
+                    $('#delCancelBtn').click();
+                    alert("此工料机库已被引用,不可删除!");
+                }
+                else if(result.message === '删除成功'){
+                    var jqSel = "#"+ delObj.libId;
+                    $(jqSel).remove();
+                    let index = dispNames.indexOf(delObj.libName);
+                    dispNames.splice(index, 1);
+                    $('#delCancelBtn').click();
+                }
             }
         }
     })

+ 28 - 4
web/users/js/col_setting.js

@@ -88,6 +88,19 @@ let ColSettingObj = {
         this.initSheet(colEditSpread.getActiveSheet(), setting);
         this.setColCount(this.colSetting.cols.length);
         this.setHeaderRowCount(this.colSetting.headRows);
+        // headerHeight
+        for (let iRow in this.colSetting.headRowHeight) {
+            colEditSpread.getActiveSheet().setRowHeight(iRow, this.colSetting.headRowHeight[iRow], GC.Spread.Sheets.SheetArea.viewport);
+        }
+
+        if (setting.treeCol >= 0) {
+            $('#is-tree')[0].checked = true;
+            $('#tree-col-div').removeClass('hidden');
+            $('#tree-col').val(setting.treeCol);
+        } else {
+            $('#is-tree')[0].checked = false;
+            $('#tree-col-div').addClass('hidden');
+        }
 
         if (setting.cols) {
             let sheet = colEditSpread.getActiveSheet(), iRow;
@@ -119,7 +132,7 @@ let ColSettingObj = {
                 cell.cellType(this.cellType.readOnly).value(col.readOnly).hAlign(GC.Spread.Sheets.HorizontalAlign.right);
             }
         }
-        let cell = info.sheet.getCell(0, 0, GC.Spread.Sheets.SheetArea.viewport);
+        let cell = colEditSpread.getActiveSheet().getCell(0, 0, GC.Spread.Sheets.SheetArea.viewport);
         if (cell) {
             $('#font').val(cell.font());
         }
@@ -174,8 +187,8 @@ let ColSettingObj = {
         let setting = {}, sheet = colEditSpread.getActiveSheet();
         setting.emptyRows = parseInt($('#empty-rows').val());
         setting.headRows = parseInt($('#header-row-count').val());
-        if ($('#is-tree').checked) {
-            setting.treeCol = parseInt($('#treeCol').val());
+        if ($('#is-tree')[0].checked) {
+            setting.treeCol = parseInt($('#tree-col').val());
         }
         setting.headRowHeight = [];
         for (let iRow = 0; iRow < setting.headRows; iRow++) {
@@ -245,6 +258,13 @@ $('#header-row-count').change(function () {
     ColSettingObj.setHeaderRowCount(parseInt($(this).val()));
     ColSettingObj.colSetting.headRows = parseInt($(this).val());
 });
+$('#is-tree').click(function () {
+    if (this.checked) {
+        $('#tree-col-div').removeClass('hidden');
+    } else {
+        $('#tree-col-div').addClass('hidden');
+    }
+});
 $('#merge').click(function () {
     let sheet = colEditSpread.getActiveSheet();
     let sel = sheet.getSelections();
@@ -279,7 +299,11 @@ $('#save-col-setting').click(function () {
     mainTreeCol = JSON.stringify(ColSettingObj.colSetting);
     $('input:hidden[name="main_tree_col"]').val(mainTreeCol);
     $('#set-column').modal('hide');
-    SheetDataHelper.loadSheetHeader(ColSettingObj.colSetting, colSpread.getActiveSheet());
+
+    let billsTemplateTree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1});
+    billsTemplateTree.loadDatas(JSON.parse(billsTemplateData));
+    TREE_SHEET_HELPER.loadSheetHeader(ColSettingObj.colSetting, colSpread.getActiveSheet());
+    TREE_SHEET_HELPER.showTreeData(ColSettingObj.colSetting, colSpread.getActiveSheet(), billsTemplateTree);
 });
 
 $('#h-left').click(function () {

+ 5 - 2
web/users/js/compilation.js

@@ -250,8 +250,11 @@ function initCompilation() {
         return false;
     }
     // 初始化 造价书列设置
-    colSpread = SheetDataHelper.createNewSpread($('#main-tree-col')[0]);
-    SheetDataHelper.loadSheetHeader(JSON.parse(mainTreeCol), colSpread.getActiveSheet());
+    colSpread = TREE_SHEET_HELPER.createNewSpread($('#main-tree-col')[0]);
+    let billsTemplateTree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1});
+    billsTemplateTree.loadDatas(JSON.parse(billsTemplateData));
+    TREE_SHEET_HELPER.loadSheetHeader(JSON.parse(mainTreeCol), colSpread.getActiveSheet());
+    TREE_SHEET_HELPER.showTreeData(JSON.parse(mainTreeCol), colSpread.getActiveSheet(), billsTemplateTree);
 
     // 标准清单
     let html = '';

+ 3 - 2
web/users/views/compilation/add.html

@@ -106,7 +106,6 @@
                             清单模板 / 造价书列
                             <a href="javascript:void(0)" data-toggle="modal" data-target="#set-column" class="btn btn-primary btn-sm pull-right">设置</a>
                             <a href="/compilation/template/<%= section %>/<%= valuationId %>" data-toggle="modal" data-target="" class="btn btn-primary btn-sm pull-right" style="margin-right:5px">模板设置</a>
-                        </legend>
                         <input type="hidden" name="main_tree_col" value="<%= mainTreeCol %>">
                         <div id="main-tree-col">
                         </div>
@@ -123,9 +122,11 @@
     let rationList = '<%- rationList %>';
     let gljList = '<%- gljList %>';
     let mainTreeCol = '<%- mainTreeCol %>';
+    let billsTemplateData = '<%- billsTemplateData %>';
     let colSpread = null;
     let colEditSpread = null;
 </script>
-<script type="text/javascript" src="/public/web/sheet/sheet_data_helper.js"></script>
+<script type="text/javascript" src="/public/web/id_tree.js"></script>
+<script type="text/javascript" src="/public/web/tree_sheet/tree_sheet_helper.js"></script>
 <script type="text/javascript" src="/web/users/js/compilation.js"></script>
 <%include ../compilation/modal.html %>

+ 10 - 2
web/users/views/compilation/modal.html

@@ -100,13 +100,21 @@
                             <input type="number" class="form-control input-sm" value="1" id="header-row-count">
                         </div>
                     </div>
-                    <div class="col-md-3">
+                </div>
+                <div class="row">
+                    <div class="col-md-2">
                         <div class="checkbox">
                             <label>
-                                <input type="checkbox" id="is-tree"> 是否包含树结构
+                                <input type="checkbox" id="is-tree" value> 是否包含树结构
                             </label>
                         </div>
                     </div>
+                    <div class="col-md-3" id="tree-col-div">
+                        <div class="input-group">
+                            <span class="input-group-addon" id="basic-addon1">树结构绘制列</span>
+                            <input type="number" class="form-control input-sm" value="1" id="tree-col">
+                        </div>
+                    </div>
                 </div>
                 <div class="">
                     <div class="btn-toolbar" role="toolbar">