Browse Source

补充人材机多单价相关、广东添加税率列

vian 5 năm trước cách đây
mục cha
commit
7bd6cce613

+ 8 - 3
modules/all_models/compleGlj_glj.js

@@ -5,7 +5,7 @@
 //补充工料机的组成物可能来自标准工料机和补充工料机
 const mongoose = require('mongoose');
 const Schema = mongoose.Schema;
-const comple_gljComponent = new Schema(
+/* const comple_gljComponent = new Schema(
     {
         isStd: Boolean, //组成物里的工料机是否是标准的,否则是补充的
         ID: Number,
@@ -13,7 +13,7 @@ const comple_gljComponent = new Schema(
     },
     {_id: false},
     {versionKey: false}
-);
+); */
 //补充工料机跟用户和编办绑定
 const comple_glj = new Schema({
     userId: String,
@@ -24,11 +24,16 @@ const comple_glj = new Schema({
     specs: String,
     unit: String,
     basePrice: String,
+    priceProperty: {
+        type: Schema.Types.Mixed,
+        default: {}
+    },
     gljClass: String,
     gljType: Number,
     model: Number,
     shortName: String,
-    component: [comple_gljComponent]
+    component: Array,
+    taxRate: String //税率
 }, {versionKey: false});
 
 mongoose.model('complementary_glj_lib', comple_glj, 'complementary_glj_lib');

+ 4 - 0
modules/complementary_glj_lib/controllers/gljController.js

@@ -35,11 +35,15 @@ class GljController extends BaseController{
         }
         let overWriteUrl = req.session.sessionCompilation && req.session.sessionCompilation.overWriteUrl &&
                             req.session.sessionCompilation._id !== '5b4d581023a924000b760f2d' ? req.session.sessionCompilation.overWriteUrl : null;
+        const priceProperties = sessionCompilation.priceProperties || [];
+        const consumeAmtProperties = sessionCompilation.consumeAmtProperties || [];
         res.render('building_saas/complementary_glj_lib/html/tools-gongliaoji.html',{
             userID: req.session.sessionUser.id,
             gljLibId: gljLibId,
             compilationId: sessionCompilation._id,
             compilationName: sessionCompilation.name,
+            priceProperties: JSON.stringify(priceProperties),
+            consumeAmtProperties: JSON.stringify(consumeAmtProperties),
             versionName: req.session.compilationVersion,
             LicenseKey:config.getLicenseKey(process.env.NODE_ENV),
             overWriteUrl: overWriteUrl,

+ 2 - 0
modules/complementary_ration_lib/controllers/compleViewController.js

@@ -42,6 +42,7 @@ class CompleViewController extends BaseController{
         const redirectGlj = `/complementaryRation/glj`;
         const redirectCoe = `/complementaryRation/coe`;
         const redirectInstallation = `/complementaryRation/installation`;
+        const priceProperties = req.session.sessionCompilation.priceProperties || [];
         res.render('building_saas/complementary_ration_lib/html/dinge.html', {
             userID: req.session.sessionUser.id,
             redirectGlj: redirectGlj,
@@ -49,6 +50,7 @@ class CompleViewController extends BaseController{
             redirectInstallation: redirectInstallation,
             gljLibId: gljLibId,
             compilationName: req.session.sessionCompilation.name,
+            priceProperties: JSON.stringify(priceProperties),
             versionName: req.session.compilationVersion,
             LicenseKey:config.getLicenseKey(process.env.NODE_ENV)
         });

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

@@ -1354,6 +1354,18 @@ var sheetCommonObj = {
         workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.esc, false, false, false, false);
         workBook.commandManager().setShortcutKey('myEsc', GC.Spread.Commands.Key.esc, false, false, false, false);
     },
+    //生成列字段与列号映射
+    initColMapping: function (obj, headers) {
+        //colToField 列下标与列字段映射
+        //fieldToCol 列字段与列下标映射
+        let colMapping = {colToField: {}, fieldToCol: {}};
+        for(let header of headers){
+            colMapping['colToField'][headers.indexOf(header)] = header.dataCode;
+            colMapping['fieldToCol'][header.dataCode] = headers.indexOf(header);
+        }
+        console.log(colMapping);
+        obj.colMapping = colMapping
+    },
     //设置默认样式
     spreadDefaultStyle: function (workBook) {
         let defaultStyle = new GC.Spread.Sheets.Style();

+ 4 - 0
web/building_saas/complementary_glj_lib/html/tools-gongliaoji.html

@@ -24,6 +24,10 @@
         }
         .modal-lg{max-width: 1000px}
     </style>
+    <script type="text/javascript">
+        let priceProperties = JSON.parse('<%- priceProperties %>');
+        let consumeAmtProperties = JSON.parse('<%- consumeAmtProperties %>');
+    </script>
 </head>
 <body>
     <div class="header">

+ 115 - 65
web/building_saas/complementary_glj_lib/js/components.js

@@ -5,7 +5,7 @@
    弹出组成物窗口 组成物表
  * */
 let componentOprObj = {
-    treeObj:null,
+    treeObj: null,
     rootNode: null,//分类树根节点
     parentNodeIds: {},
     radiosSelected: null,//allGljs, stdGljs, complementaryGljs
@@ -14,18 +14,60 @@ let componentOprObj = {
     setting: {
         owner: "components",
         header: [
-            {headerName:"选择", headerWidth: 40, dataCode: "select", hAlign: "center", vAlign: "center"},
-            {headerName:"编码",headerWidth:80,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
-            {headerName:"名称",headerWidth:120,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
-            {headerName:"规格型号",headerWidth:80,dataCode:"specs", dataType: "String", hAlign: "center", vAlign: "center"},
-            {headerName:"单位",headerWidth:80,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
-            {headerName:"单价",headerWidth:80,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
-            {headerName:"类型",headerWidth:80,dataCode:"gljType", dataType: "String",  hAlign: "center", vAlign: "center"}
+            { headerName: "选择", headerWidth: 40, dataCode: "select", hAlign: "center", vAlign: "center" },
+            { headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center" },
+            { headerName: "名称", headerWidth: 120, dataCode: "name", dataType: "String", hAlign: "left", vAlign: "center" },
+            { headerName: "规格型号", headerWidth: 80, dataCode: "specs", dataType: "String", hAlign: "center", vAlign: "center" },
+            { headerName: "单位", headerWidth: 80, dataCode: "unit", dataType: "String", hAlign: "center", vAlign: "center" },
+            { headerName: "单价", headerWidth: 80, dataCode: "basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center" },
+            { headerName: "类型", headerWidth: 80, dataCode: "gljType", dataType: "String", hAlign: "center", vAlign: "center" }
         ]
     },
+    //生成列头(多单价)
+    initHeaders: function (priceProperties) {
+        let headers = [
+            { headerName: "选择", headerWidth: 40, dataCode: "select", hAlign: "center", vAlign: "center" },
+            { headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center" },
+            { headerName: "名称", headerWidth: 120, dataCode: "name", dataType: "String", hAlign: "left", vAlign: "center" },
+            { headerName: "规格型号", headerWidth: 80, dataCode: "specs", dataType: "String", hAlign: "center", vAlign: "center" },
+            { headerName: "单位", headerWidth: 80, dataCode: "unit", dataType: "String", hAlign: "center", vAlign: "center" },
+            { headerName: "类型", headerWidth: 80, dataCode: "gljType", dataType: "String", hAlign: "center", vAlign: "center" }
+
+        ];
+        //生成单价列
+        if (!priceProperties || priceProperties.length === 0) {
+            headers.push({ headerName: "定额价", headerWidth: 80, dataCode: "basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center" });
+        }
+        else {
+            for (let priceProp of priceProperties) {
+                let colData = {
+                    headerName: priceProp.price.dataName,
+                    headerWidth: 90,
+                    dataCode: priceProp.price.dataCode,
+                    dataType: 'Number',
+                    formatter: '0.00',
+                    hAlign: 'right',
+                    vAlign: 'center'
+                };
+                headers.push(colData);
+            }
+        }
+        let tailHeaders = [
+        ];
+        headers = headers.concat(tailHeaders);
+        return headers;
+    },
     buildSheet: function (container) {
         let me = componentOprObj;
+        //生成人材机组成物表格列头
+        me.setting.header = me.initHeaders(priceProperties);
+        //生成人材机组成物列映射
+        sheetCommonObj.initColMapping(me, me.setting.header);
+        repositoryGljObj.initPriceCols.call(me, priceProperties, me.colMapping);
         me.workBook = sheetOpr.buildSheet(container, me.setting, 30);
+        if (priceProperties && priceProperties.length > 0) {
+            me.workBook.getSheet(0).frozenColumnCount(6);
+        }
         sheetCommonObj.spreadDefaultStyle(me.workBook);
         me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
         me.workBook.getSheet(0).setFormatter(-1, 1, "@", GC.Spread.Sheets.SheetArea.viewport);
@@ -46,26 +88,26 @@ let componentOprObj = {
         let val = args.sheet.getValue(args.row, args.col);
         let thisComponent = me.currentCache[args.row];
         thisComponent.isChecked = val;
-        if(args.sheet.isEditing()){
+        if (args.sheet.isEditing()) {
             args.sheet.endEdit(true);
         }
-        else{
+        else {
             //维护选中组成物列表
-            if(val === true){
+            if (val === true) {
                 let isExist = false;
-                for(let i = 0, len = me.selectedList.length; i < len; i++){
-                    if(me.selectedList[i].ID === thisComponent.ID){
+                for (let i = 0, len = me.selectedList.length; i < len; i++) {
+                    if (me.selectedList[i].ID === thisComponent.ID) {
                         isExist = true;
                         break;
                     }
                 }
-                if(!isExist){
+                if (!isExist) {
                     me.selectedList.push(thisComponent);
                 }
             }
-            else if(val === false){
-                for(let i = 0, len = me.selectedList.length; i < len; i++){
-                    if(me.selectedList[i].ID === thisComponent.ID){
+            else if (val === false) {
+                for (let i = 0, len = me.selectedList.length; i < len; i++) {
+                    if (me.selectedList[i].ID === thisComponent.ID) {
                         me.selectedList.splice(i, 1);
                         break;
                     }
@@ -75,27 +117,27 @@ let componentOprObj = {
     },
     setShowGljList: function (gljList, clearChecked) {
         let that = repositoryGljObj, me = componentOprObj;
-            for(let i = 0; i < gljList.length; i++){
-                if(machineAllowComponent.includes(that.currentGlj.gljType) && machineComponent.includes(gljList[i].gljType) ||
-                    materialAllowComponent.includes(that.currentGlj.gljType) && gljList[i].gljType === 201 ||
-                    that.currentGlj.gljType === 4 && gljList[i].gljType === 4 && (!gljList[i].component || gljList[i].component.length === 0) && gljList[i].ID !== that.currentGlj.ID){
-                    //去除与已添加的组成物重复的条目
-                    let isExist = false;
-                    for(let j = 0; j < that.currentComponent.length; j++){
-                        if(that.currentComponent[j].ID === gljList[i].ID){
-                            isExist = true;
-                            break;
-                        }
-                    }
-                    if(!isExist){
-                        gljList[i].isChecked = false;
-                    }
-                    else {
-                        gljList[i].isChecked = true;
+        for (let i = 0; i < gljList.length; i++) {
+            if (machineAllowComponent.includes(that.currentGlj.gljType) && machineComponent.includes(gljList[i].gljType) ||
+                materialAllowComponent.includes(that.currentGlj.gljType) && gljList[i].gljType === 201 ||
+                that.currentGlj.gljType === 4 && gljList[i].gljType === 4 && (!gljList[i].component || gljList[i].component.length === 0) && gljList[i].ID !== that.currentGlj.ID) {
+                //去除与已添加的组成物重复的条目
+                let isExist = false;
+                for (let j = 0; j < that.currentComponent.length; j++) {
+                    if (that.currentComponent[j].ID === gljList[i].ID) {
+                        isExist = true;
+                        break;
                     }
-                    me.showGljList.push(gljList[i]);
                 }
+                if (!isExist) {
+                    gljList[i].isChecked = false;
+                }
+                else {
+                    gljList[i].isChecked = true;
+                }
+                me.showGljList.push(gljList[i]);
             }
+        }
     },
     //初始化分类树
     //@param {String}type(标准或补充) {Array}treeData(树数据)
@@ -107,10 +149,10 @@ let componentOprObj = {
         }
         zTreeHelper.createTree(treeData, componentSetting, "componentTree", componentOprObj);
         let rootNode = componentOprObj.treeObj.getNodes()[0];
-        if(rootNode && rootNode.isParent && rootNode.isFirstNode){
+        if (rootNode && rootNode.isParent && rootNode.isFirstNode) {
             componentOprObj.rootNode = rootNode;
         }
-        if(me.rootNode){
+        if (me.rootNode) {
             me.treeObj.selectNode(me.rootNode);
             componentTypeTreeOprObj.onClick(null, 'componentTree', me.rootNode);
         }
@@ -122,14 +164,14 @@ let componentOprObj = {
         //初始化组成物列表
         me.selectedList = [].concat(that.currentComponent);
         //默认radio所有工料机
-        if(typeof $("input[name='glj']:checked")[0] !== 'undefined'){
+        if (typeof $("input[name='glj']:checked")[0] !== 'undefined') {
             $("input[name='glj']:checked")[0].checked = false;
         }
         $("input[value = 'stdGljs']")[0].checked = true;
         me.radiosSelected = 'stdGljs';
         //初始为所有工料机,机械类型可添加机械组成物,混凝土,砂浆、配合比可添加普通材料
         me.showGljList = [];
-        if(me.radiosSelected === 'stdGljs'){
+        if (me.radiosSelected === 'stdGljs') {
             me.setShowGljList(that.stdGljList, true);
             //me.setShowGljList(that.complementaryGljList, true);
             that.sortGlj(me.showGljList);
@@ -141,19 +183,19 @@ let componentOprObj = {
         me.radiosSelected = val;
         //选择改变,数据重新筛选显示
         me.showGljList = [];
-        if(me.radiosSelected === 'allGljs'){
+        if (me.radiosSelected === 'allGljs') {
             me.setShowGljList(re.stdGljList);
             me.setShowGljList(re.complementaryGljList);
         }
-        else if(me.radiosSelected === 'stdGljs'){
+        else if (me.radiosSelected === 'stdGljs') {
             me.setShowGljList(re.stdGljList);
         }
-        else if(me.radiosSelected === 'complementaryGljs'){
+        else if (me.radiosSelected === 'complementaryGljs') {
             me.setShowGljList(re.complementaryGljList);
         }
         //搜索匹配
         let searchStr = $('#gljSearchKeyword').val();
-        if(searchStr && searchStr.trim() != ''){
+        if (searchStr && searchStr.trim() != '') {
             let reg = new RegExp(searchStr);
             me.showGljList = _.filter(me.showGljList, function (data) {
                 return reg.test(data.code) || reg.test(data.name);
@@ -164,10 +206,10 @@ let componentOprObj = {
         me.showGljItems(me.showGljList, me.gljCurTypeId);
         //切换radio后更新cache
         if (me.currentOprParent = 1) {
-            if(me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]){
+            if (me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]) {
                 me.currentCache = me.getParentCache(me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]);
             }
-            else{
+            else {
                 me.currentCache = [];
             }
         } else {
@@ -178,30 +220,31 @@ let componentOprObj = {
     radiosChange: function () {
         let me = componentOprObj, gc = gljClassTreeObj;
         $('.glj-radio').change(function () {
-            if($(this).val() === 'stdGljs') {
+            me.filterDatasAndShow();
+            if ($(this).val() === 'stdGljs') {
                 me.initClassTree('std', gc.treeData.std);
             } else {
                 me.initClassTree('comple', gc.treeData.comple);
             }
-            me.filterDatasAndShow();
+            //me.filterDatasAndShow();
         });
     },
     getParentCache: function (nodes) {
         let me = componentOprObj, rst = [];
-        for(let i = 0; i < me.showGljList.length; i++){
-            if(nodes.indexOf(me.showGljList[i].gljClass) !== -1){
+        for (let i = 0; i < me.showGljList.length; i++) {
+            if (nodes.indexOf(me.showGljList[i].gljClass) !== -1) {
                 rst.push(me.showGljList[i]);
             }
         }
         rst.sort(function (a, b) {
             let rst = 0;
-            if(a.code > b.code) rst = 1;
-            else if(a.code < b.code)rst = -1;
+            if (a.code > b.code) rst = 1;
+            else if (a.code < b.code) rst = -1;
             return rst;
         });
         return rst;
     },
-    getCache: function() {
+    getCache: function () {
         let me = componentOprObj, rst = [];
         for (let i = 0; i < me.showGljList.length; i++) {
             if (me.showGljList[i].gljClass == me.gljCurTypeId) {
@@ -210,7 +253,7 @@ let componentOprObj = {
         }
         return rst;
     },
-    showGljItems: function(data, type) {
+    showGljItems: function (data, type) {
         let me = componentOprObj, re = repositoryGljObj;
         if (me.workBook) {
             let cacheSection = [];
@@ -222,7 +265,7 @@ let componentOprObj = {
                     cacheSection.push(data[i]);
                 }
             }
-            sheetOpr.showData(me.workBook.getSheet(0), me.setting, cacheSection, re.distTypeTree);
+            sheetOpr.showData(me, me.workBook.getSheet(0), me.setting, cacheSection, re.distTypeTree);
             me.workBook.getSheet(0).setRowCount(cacheSection.length);
             cacheSection = null;
         }
@@ -235,25 +278,32 @@ let componentOprObj = {
             let updateArr = [];
             let newComponent = [];
             //re.currentGlj.component = [];
-            for(let i = 0, len = me.selectedList.length; i < len; i++){
+            for (let i = 0, len = me.selectedList.length; i < len; i++) {
                 let isExist = false;
-                for(let j = 0, jLen = re.currentGlj.component.length; j < jLen; j++){
-                    if(me.selectedList[i].ID === re.currentGlj.component[j].ID){
-                        newComponent.push({isStd: typeof me.selectedList[i].isStd !== 'undefined' ? me.selectedList[i].isStd : false
-                            , ID: me.selectedList[i].ID, consumeAmt: re.currentGlj.component[j].consumeAmt});
+                for (let j = 0, jLen = re.currentGlj.component.length; j < jLen; j++) {
+                    if (me.selectedList[i].ID === re.currentGlj.component[j].ID) {
+                        let newComponentObj = { isStd: typeof me.selectedList[i].isStd !== 'undefined' ? me.selectedList[i].isStd : false, ID: me.selectedList[i].ID }
+                        that.copyConsumeAmt(newComponentObj, re.currentGlj.component[j]);
+                        newComponent.push(newComponentObj);
+                        /* newComponent.push({
+                            isStd: typeof me.selectedList[i].isStd !== 'undefined' ? me.selectedList[i].isStd : false
+                            , ID: me.selectedList[i].ID, consumeAmt: re.currentGlj.component[j].consumeAmt
+                        }); */
                         isExist = true;
                         break;
                     }
                 }
-                if(!isExist){
-                    newComponent.push({isStd: typeof me.selectedList[i].isStd !== 'undefined' ? me.selectedList[i].isStd : false, ID: me.selectedList[i].ID, consumeAmt: 0});
+                if (!isExist) {
+                    let newComponentObj = { isStd: typeof me.selectedList[i].isStd !== 'undefined' ? me.selectedList[i].isStd : false, ID: me.selectedList[i].ID };
+                    that.initConsumeAmt(newComponentObj);
+                    newComponent.push(newComponentObj);
                 }
                 //re.currentGlj.component.push({ID: me.selectedList[i].ID, consumeAmt: 0});
             }
             re.currentGlj.component = newComponent;
             let gljBasePrc = that.reCalGljBasePrc(re.getCurrentComponent(re.currentGlj.component));
-            if(gljBasePrc !== re.currentGlj.basePrice){
-                re.currentGlj.basePrice = gljBasePrc;
+            if (re.isGljPriceChange(re.currentGlj, gljBasePrc)) {
+                re.setPrice(re.currentGlj, gljBasePrc);
                 re.reshowGljBasePrc(re.currentGlj);
                 //updateBasePrc.push({gljId: that.currentGlj.ID, gljType: that.currentGlj.gljType, basePrice: that.currentGlj.basePrice});
             }
@@ -265,9 +315,9 @@ let componentOprObj = {
 };
 
 let componentTypeTreeOprObj = {
-    onClick: function(event,treeId,treeNode) {
+    onClick: function (event, treeId, treeNode) {
         let me = componentOprObj, re = repositoryGljObj, that = gljComponentOprObj, gljTypeId = treeNode.ID;
-        if(me.gljCurTypeId !== treeNode.ID){
+        if (me.gljCurTypeId !== treeNode.ID) {
             me.gljCurTypeId = treeNode.ID;
             if (me.parentNodeIds["_pNodeId_" + treeNode.ID]) {
                 me.currentOprParent = 1;

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 652 - 384
web/building_saas/complementary_glj_lib/js/glj.js


+ 361 - 305
web/building_saas/complementary_glj_lib/js/gljComponent.js

@@ -7,29 +7,94 @@ let gljComponentOprObj = {
     processDecimal: -6,
     setting: {
         owner: "gljComponent",
-        header:[
-            {headerName:"编码",headerWidth:80,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
-            {headerName:"名称",headerWidth:90,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
-            {headerName:"单位",headerWidth:45,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
-            {headerName:"单价",headerWidth:60,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
-            {headerName:"消耗量",headerWidth:70,dataCode:"consumeAmt", dataType: "Number", formatter: "0.000", hAlign: "right", vAlign: "center"}
+        header: [
+            { headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center" },
+            { headerName: "名称", headerWidth: 90, dataCode: "name", dataType: "String", hAlign: "left", vAlign: "center" },
+            { headerName: "单位", headerWidth: 45, dataCode: "unit", dataType: "String", hAlign: "center", vAlign: "center" },
+            { headerName: "单价", headerWidth: 60, dataCode: "basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center" },
+            { headerName: "消耗量", headerWidth: 70, dataCode: "consumeAmt", dataType: "Number", formatter: "0.000", hAlign: "right", vAlign: "center" }
         ],
         view: {
-            lockedCols:[0, 1, 2, 3]
+            lockedCols: [0, 1, 2, 3]
+        }
+    },
+    //生成列头(多单价)(多消耗量)
+    initHeaders: function (priceProperties, consumeAmtProperties) {
+        let headers = [
+            { headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center" },
+            { headerName: "名称", headerWidth: 90, dataCode: "name", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center" },
+            { headerName: "单位", headerWidth: 45, dataCode: "unit", dataType: "String", hAlign: "center", vAlign: "center" },
+        ];
+        //生成消耗量列
+        if (!consumeAmtProperties || consumeAmtProperties.length === 0) {
+            headers.push({ headerName: "消耗量", headerWidth: 70, dataCode: "consumeAmt", dataType: "Number", formatter: "0.000", hAlign: "right", vAlign: "center" });
+        }
+        else {
+            for (let consumeAmtProp of consumeAmtProperties) {
+                let colData = {
+                    headerName: consumeAmtProp.consumeAmt.dataName,
+                    headerWidth: 60,
+                    dataCode: consumeAmtProp.consumeAmt.dataCode,
+                    dataType: 'Number',
+                    formatter: '0.000',
+                    hAlign: 'right',
+                    vAlign: 'center'
+                };
+                headers.push(colData);
+            }
+        }
+        //生成单价列
+        if (!priceProperties || priceProperties.length === 0) {
+            headers.push({ headerName: "定额价", headerWidth: 80, dataCode: "basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center" });
+        }
+        else {
+            for (let priceProp of priceProperties) {
+                let colData = {
+                    headerName: priceProp.price.dataName,
+                    headerWidth: 100,
+                    dataCode: priceProp.price.dataCode,
+                    dataType: 'Number',
+                    formatter: '0.00',
+                    hAlign: 'right',
+                    vAlign: 'center'
+                };
+                headers.push(colData);
+            }
+        }
+        return headers;
+    },
+    setFrozen: function (sheet) {
+        const fixedHeadersLen = 3;
+        let frozenCol = 0;
+        if (consumeAmtProperties && consumeAmtProperties.length > 0) {
+            frozenCol = fixedHeadersLen + consumeAmtProperties.length;
+        }
+        else if (priceProperties && priceProperties.length > 0) {
+            frozenCol = fixedHeadersLen + 1;
+        }
+        if (frozenCol > 0) {
+            sheet.frozenColumnCount(frozenCol);
         }
     },
     buildHeader: function (sheet, header) {
         sheet.setRowCount(2, GC.Spread.Sheets.SheetArea.colHeader);
         for (let i = 0; i < header.length; i++) {
             sheet.setValue(1, i, header[i].headerName, GC.Spread.Sheets.SheetArea.colHeader);
-            sheet.setColumnWidth(i, header[i].headerWidth? header[i].headerWidth:100);
+            sheet.setColumnWidth(i, header[i].headerWidth ? header[i].headerWidth : 100);
         }
         sheet.setValue(0, 0, '组成物信息', GC.Spread.Sheets.SheetArea.colHeader);
         sheet.addSpan(0, 0, 1, header.length, GC.Spread.Sheets.SheetArea.colHeader);
     },
-    buildSheet: function(container) {
+    buildSheet: function (container) {
         let me = gljComponentOprObj;
+        //生成人材机组成物表格列头
+        me.setting.header = me.initHeaders(priceProperties, consumeAmtProperties);
+        //生成人材机组成物列映射
+        sheetCommonObj.initColMapping(me, me.setting.header);
+        repositoryGljObj.initPriceCols.call(me, priceProperties, me.colMapping);
+        me.initConsumeAmtCols(consumeAmtProperties, me.colMapping);
         me.workBook = sheetOpr.buildSheet(container, me.setting, 30, false);
+        me.setFrozen(me.workBook.getSheet(0));
         me.buildHeader(me.workBook.getSheet(0), me.setting.header);
         sheetCommonObj.spreadDefaultStyle(me.workBook);
         me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
@@ -45,15 +110,24 @@ let gljComponentOprObj = {
 
     },
     getRowData: function (sheet, row, setting) {
-        let rst = {};
-        for(let i = 0; i < setting.header.length; i++){
-            rst[setting.header[i].dataCode] = sheet.getValue(row, i);
+        let rst = { priceProperty: {}, consumeAmtProperty: {} };
+        for (let i = 0; i < setting.header.length; i++) {
+            let v = sheet.getValue(row, i);
+            if (this.pricePropertyCols.includes(i)) {
+                rst.priceProperty[setting.header[i].dataCode] = v && v !== '' ? v : 0;
+            }
+            else if (this.consumeAmtPropertyCols.includes(i)) {
+                rst.consumeAmtProperty[setting.header[i].dataCode] = v && v !== '' ? v : 0;
+            }
+            else {
+                rst[setting.header[i].dataCode] = v;
+            }
         }
         return rst;
     },
     getComponent: function (sheet, rowCount) {
         let component = [];
-        for(let row = 0; row < rowCount; row++){
+        for (let row = 0; row < rowCount; row++) {
             let obj = {};
             obj.consumeAmt = sheet.getValue(row, 4);
             obj.ID = sheet.getTag(row, 0);
@@ -61,122 +135,194 @@ let gljComponentOprObj = {
         }
         return component;
     },
+    //根据消耗量字段设置组成物消耗量
+    setConsumeAmt: function (component, field, value) {
+        const compareStr = 'consumeAmt';
+        if (field.includes(compareStr)) {
+            if (field === compareStr) {
+                component[field] = value;
+            }
+            else {
+                component['consumeAmtProperty'][field] = value;
+            }
+        }
+    },
+    initConsumeAmtCols: function (consumeAmtProperties, colMapping) {
+        let consumeAmtCols = [],
+            consumeAmtPropertyCols = [];
+        if (!consumeAmtProperties || consumeAmtProperties.length === 0) {
+            consumeAmtCols.push(colMapping.fieldToCol['consumeAmt']);
+        }
+        for (let consumeAmtProp of consumeAmtProperties) {
+            consumeAmtPropertyCols.push(colMapping.fieldToCol[consumeAmtProp.consumeAmt.dataCode]);
+            consumeAmtCols.push(colMapping.fieldToCol[consumeAmtProp.consumeAmt.dataCode]);
+        }
+        this.consumeAmtCols = consumeAmtCols;
+        this.consumeAmtPropertyCols = consumeAmtPropertyCols;
+    },
+    //消耗量赋初值
+    initConsumeAmt: function (component) {
+        if (!consumeAmtProperties || consumeAmtProperties.length === 0) {
+            component.consumeAmt = 0;
+        } else {
+            let consumeAmtProperty = {};
+            for (let consumeAmtProp of consumeAmtProperties) {
+                consumeAmtProperty[consumeAmtProp.consumeAmt.dataCode] = 0;
+            }
+            component.consumeAmtProperty = consumeAmtProperty;
+        }
+    },
+    copyConsumeAmt: function (gljA, gljB) {
+        if (!consumeAmtProperties || consumeAmtProperties.length === 0) {
+            gljA.consumeAmt = gljB.consumeAmt;
+        } else {
+            gljA.consumeAmtProperty = _.cloneDeep(gljB.consumeAmtProperty);
+        }
+    },
+    consumeAmtChanged: function (component, consumeAmt, col) {
+        if (!consumeAmtProperties || consumeAmtProperties.length === 0) {
+            if (consumeAmt !== component.consumeAmt) {
+                return true;
+            }
+        }
+        else {
+            if (consumeAmt !== component.consumeAmtProperty[this.colMapping.colToField[col]]) {
+                return true;
+            }
+        }
+        return false;
+    },
+    consumeAmtIsEqual: function (consumeAmtA, consumeAmtB) {
+        if (!consumeAmtProperties || consumeAmtProperties.length === 0) {
+            return consumeAmtA.consumeAmt === consumeAmtB.consumeAmt;
+        }
+        return _.isEqual(consumeAmtA.consumeAmtProperty, consumeAmtB.consumeAmtProperty);
+    },
     onContextmenuOpr: function () {
         let me = gljComponentOprObj, that = repositoryGljObj, co = componentOprObj;
         $.contextMenu({
             selector: '#gljComponentSheet',
-            build: function($triggerElement, e){
+            build: function ($triggerElement, e) {
                 //控制允许右键菜单在哪个位置出现
                 let sheet = me.workBook.getSheet(0);
                 let offset = $("#gljComponentSheet").offset(),
                     x = e.pageX - offset.left,
                     y = e.pageY - offset.top;
                 let target = sheet.hitTest(x, y);
-                if(target.hitTestType === 3 && typeof target.row !== 'undefined' && typeof target.col !== 'undefined'){//在表格内
+                if (target.hitTestType === 3 && typeof target.row !== 'undefined' && typeof target.col !== 'undefined') {//在表格内
                     sheet.setActiveCell(target.row, target.col);
                     //getCurrentGlj
                     let thatRow = that.workBook.getSheet(0).getSelections()[0].row
                     that.currentGlj = thatRow < that.currentCache.length ? that.currentCache[thatRow] : null;
-                    that.currentComponent = that.currentGlj ?  that.getCurrentComponent(that.currentGlj.component) : [];
+                    that.currentComponent = that.currentGlj ? that.getCurrentComponent(that.currentGlj.component) : [];
                     //控制按钮是否可用
                     let insertDis = false,
                         delDis = false;
-                    if(!(that.currentGlj && allowComponent.includes(that.currentGlj.gljType)) || (that.currentGlj.gljType === 4 && that.isComponent(that.currentGlj.ID, that.stdGljList.concat(that.complementaryGljList)))){
+                    if (!(that.currentGlj && allowComponent.includes(that.currentGlj.gljType)) || (that.currentGlj.gljType === 4 && that.isComponent(that.currentGlj.ID, that.stdGljList.concat(that.complementaryGljList)))) {
                         insertDis = true;
                     }
-                    if(!that.currentGlj || typeof that.currentComponent === 'undefined' || (typeof that.currentComponent !== 'undefined' && target.row >= that.currentComponent.length)){//右键定位在有组成物的行,删除键才显示可用
+                    if (!that.currentGlj || typeof that.currentComponent === 'undefined' || (typeof that.currentComponent !== 'undefined' && target.row >= that.currentComponent.length)) {//右键定位在有组成物的行,删除键才显示可用
                         delDis = true;
                     }
                     return {
-                        callback: function(){},
+                        callback: function () { },
                         items: {
-                            "insert": {name: "插入", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
-                                let oprFunc = function () {
-                                    //默认radio所有工料机
-                                    co.initRadio();
-                                    co.gljCurTypeId = null;
-                                    //默认点击树根节点
-                                    co.initClassTree('std', gljClassTreeObj.treeData.std);
-                                    //弹出窗口
-                                    $('#component').modal('show');
-                                };
-                                if (repositoryGljObj.pullCompleteData) {
-                                    oprFunc();
-                                } else {
-                                    repositoryGljObj.getStdItems(pageOprObj.stdGljLibId, oprFunc);
-                                }
-                            }},
-                            "delete": {name: "删除", disabled: delDis, icon: "fa-remove", callback: function (key, opt) {
-                                //删除
-                                let deleteObj = that.currentComponent[target.row];
-                                let gljComponent = that.currentGlj.component;
-                                let updateArr = [];
-                                //更新当前工料机的组成物列表
-                                for(let i = 0, len = gljComponent.length; i < len; i++){
-                                    if(gljComponent[i].ID === deleteObj.ID){
-                                        gljComponent.splice(i, 1);
-                                        break;
+                            "insert": {
+                                name: "插入", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
+                                    let oprFunc = function () {
+                                        //默认radio所有工料机
+                                        co.initRadio();
+                                        co.gljCurTypeId = null;
+                                        //默认点击树根节点
+                                        co.initClassTree('std', gljClassTreeObj.treeData.std);
+                                        //弹出窗口
+                                        $('#component').modal('show');
+                                    };
+                                    if (repositoryGljObj.pullCompleteData) {
+                                        oprFunc();
+                                    } else {
+                                        repositoryGljObj.getStdItems(pageOprObj.stdGljLibId, oprFunc);
                                     }
                                 }
-                                //重新计算工料机
-                                let gljBasePrc = me.reCalGljBasePrc(that.getCurrentComponent(gljComponent));
-                                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});
+                            },
+                            "delete": {
+                                name: "删除", disabled: delDis, icon: "fa-remove", callback: function (key, opt) {
+                                    //删除
+                                    let deleteObj = that.currentComponent[target.row];
+                                    let gljComponent = that.currentGlj.component;
+                                    let updateArr = [];
+                                    //更新当前工料机的组成物列表
+                                    for (let i = 0, len = gljComponent.length; i < len; i++) {
+                                        if (gljComponent[i].ID === deleteObj.ID) {
+                                            gljComponent.splice(i, 1);
+                                            break;
+                                        }
+                                    }
+                                    //重新计算工料机
+                                    let gljBasePrc = me.reCalGljBasePrc(that.getCurrentComponent(gljComponent));
+                                    if (that.isGljPriceChange(that.currentGlj, gljBasePrc)) {
+                                        that.setPrice(that.currentGlj, gljBasePrc);
+                                        that.reshowGljBasePrc(that.currentGlj);
+                                        //updateBasePrc.push({gljId: that.currentGlj.ID, gljType: that.currentGlj.gljType, basePrice: that.currentGlj.basePrice});
+                                    }
+                                    /* 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);
+                                    me.updateComponent(updateArr);
                                 }
-                                updateArr.push(that.currentGlj);
-                                me.updateComponent(updateArr);
-                            }}
+                            }
                         }
                     };
                 }
-                else{
+                else {
                     return false;
                 }
             }
         });
     },
     gljComponentDelOpr: function () {
-        let me = gljComponentOprObj, that = repositoryGljObj, updateArr = [], removeArr = [], isUpdate = false, updateBasePrc= [];
-        me.workBook.commandManager().register('gljComponentDel', function () {
+        let me = gljComponentOprObj, that = repositoryGljObj, updateArr = [], removeArr = [], isUpdate = false, updateBasePrc = [];
+        /* me.workBook.commandManager().register('gljComponentDel', function () {
             let sels = me.workBook.getSheet(0).getSelections();
-            if(sels.length > 0 && that.currentComponent.length > 0){
+            if (sels.length > 0 && that.currentComponent.length > 0) {
                 let component = that.currentGlj.component;
-                for(let i = 0; i < sels.length > 0; i++){
-                    if(sels[i].colCount === me.setting.header.length){//可删除
-                        for(let j = 0; j < sels[i].rowCount; j++){
-                            if(sels[i].row + j < that.currentComponent.length){
+                for (let i = 0; i < sels.length > 0; i++) {
+                    if (sels[i].colCount === me.setting.header.length) {//可删除
+                        for (let j = 0; j < sels[i].rowCount; j++) {
+                            if (sels[i].row + j < that.currentComponent.length) {
                                 removeArr.push(that.currentComponent[sels[i].row + j].ID);
 
                             }
                         }
                     }
-                    else if(sels[i].col === 0){
-                            //编码不可为空
-                            alert("编码不可为空!");
+                    else if (sels[i].col === 0) {
+                        //编码不可为空
+                        alert("编码不可为空!");
 
                     }
-                    else if(sels[i].col === 4){//消耗量修改为0
-                        if(sels[i].row === -1){//全修改
-                           for(let j = 0; j < that.currentComponent.length; j++){
-                               isUpdate = true;
-                               that.currentComponent[j].consumeAmt = 0;
-                               for(let k = 0; k < component.length; k++){
-                                   if(component[k].ID === that.currentComponent[j].ID){
-                                       component[k].consumeAmt = 0;
-                                       break;
-                                   }
-                               }
-                           }
+                    else if (sels[i].col === 4) {//消耗量修改为0
+                        if (sels[i].row === -1) {//全修改
+                            for (let j = 0; j < that.currentComponent.length; j++) {
+                                isUpdate = true;
+                                that.currentComponent[j].consumeAmt = 0;
+                                for (let k = 0; k < component.length; k++) {
+                                    if (component[k].ID === that.currentComponent[j].ID) {
+                                        component[k].consumeAmt = 0;
+                                        break;
+                                    }
+                                }
+                            }
                         }
-                        else{//部分修改
-                            for(let j = 0; j < sels[i].rowCount; j++){
-                                if(sels[i].row + j < that.currentComponent.length){
+                        else {//部分修改
+                            for (let j = 0; j < sels[i].rowCount; j++) {
+                                if (sels[i].row + j < that.currentComponent.length) {
                                     isUpdate = true;
                                     that.currentComponent[sels[i].row + j].consumeAmt = 0;
-                                    for(let k = 0; k < component.length; k++){
-                                        if(component[k].ID === that.currentComponent[sels[i].row + j].ID){
+                                    for (let k = 0; k < component.length; k++) {
+                                        if (component[k].ID === that.currentComponent[sels[i].row + j].ID) {
                                             component[k].consumeAmt = 0;
                                             break;
                                         }
@@ -187,47 +333,48 @@ let gljComponentOprObj = {
                         }
                     }
                 }
-                if(removeArr.length > 0 || isUpdate){
-                    for(let i = 0; i < removeArr.length; i++){
-                        for(let j = 0; j < that.currentComponent.length; j++){
-                            if(that.currentComponent[j].ID === removeArr[i]){
+                if (removeArr.length > 0 || isUpdate) {
+                    for (let i = 0; i < removeArr.length; i++) {
+                        for (let j = 0; j < that.currentComponent.length; j++) {
+                            if (that.currentComponent[j].ID === removeArr[i]) {
                                 that.currentComponent.splice(j--, 1);
                             }
                         }
-                        for(let j = 0; j < component.length; j++){
-                            if(component[j].ID === removeArr[i]){
+                        for (let j = 0; j < component.length; j++) {
+                            if (component[j].ID === removeArr[i]) {
                                 component.splice(j--, 1);
                             }
                         }
                     }
                     //重新计算工料机
                     let gljBasePrc = me.reCalGljBasePrc(that.currentComponent);
-                    if(gljBasePrc !== that.currentGlj.basePrice){
+                    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});
+                        updateBasePrc.push({ gljId: that.currentGlj.ID, gljType: that.currentGlj.gljType, basePrice: that.currentGlj.basePrice });
                     }
                     updateArr.push(that.currentGlj);
                     me.updateComponent(updateArr);
-                    if(updateBasePrc.length > 0){
+                    if (updateBasePrc.length > 0) {
                         that.updateRationBasePrcRq(updateBasePrc);
                     }
                 }
             }
-        });
+        }); */
         me.workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
         //me.workBook.commandManager().setShortcutKey('gljComponentDel', GC.Spread.Commands.Key.del, false, false, false, false);
     },
-    onCellEditStart: function(sender, args) {
+    onCellEditStart: function (sender, args) {
         let me = gljComponentOprObj, that = repositoryGljObj;
         let rObj = me.getRowData(args.sheet, args.row, me.setting);
         me.currentEditingComponent = rObj;
         let thatRow = that.workBook.getSheet(0).getSelections()[0].row;
-        if(thatRow < that.currentCache.length){
+        if (thatRow < that.currentCache.length) {
             that.currentGlj = that.currentCache[thatRow];
-            if(me.setting.view.lockedCols.indexOf(args.col) !== -1 || !allowComponent.includes(that.currentGlj.gljType) ||
-                (that.currentGlj.gljType === 4 && that.isComponent(that.currentGlj.ID, that.stdGljList.concat(that.complementaryGljList))) ||
-                (args.col === 4 && (!that.currentComponent|| args.row >= that.currentComponent.length))){
+            //消耗量可编辑
+            if (!(me.colMapping.colToField[args.col].includes('consumeAmt')) || !allowComponent.includes(that.currentGlj.gljType) ||
+                (that.currentGlj.gljType === 4 && that.isComponent(that.currentGlj.ID, that.gljList)) ||
+                (args.col === 4 && (!that.currentComponent || args.row >= that.currentComponent.length))) {
                 args.cancel = true;
             }
         }
@@ -237,124 +384,44 @@ let gljComponentOprObj = {
     },
     onCellEditEnd: function (sender, args) {
         let me = gljComponentOprObj, that = repositoryGljObj, updateBasePrc = [];
-        let gljList = that.gljList, updateArr = [], materialComponent = [202, 203, 204], machineComponent = [302, 303];
-        // if(args.editingText !== me.currentEditingComponent.code){
-        //编码
-      /*  if(args.col === 0 && args.editingText && args.editingText.trim().length > 0 &&args.editingText !== me.currentEditingComponent.code){
-            let component = that.currentGlj.component, hasCode = false;
-            for(let i = 0; i < gljList.length; i++){
-                if(gljList[i].code === args.editingText){//有效的组成物
-                    hasCode = true;
-                    if((materialComponent.indexOf(that.currentGlj.gljType) !== -1 && gljList[i].gljType === 201)
-                        || (that.currentGlj.gljType === 301 && machineComponent.indexOf(gljList[i].gljType) !== -1 )){//普通材料
-                        //是否与原有组成物不同
-                        let isExist = false;
-                        for(let j = 0; j < component.length; j++){
-                            if(component[j].ID === gljList[i].ID){
-                                isExist = true;
-                                break;
-                            }
-                        }
-                        if(!isExist){
-                            let rObj = {};
-                            rObj.ID = gljList[i].ID;
-                            //rObj.basePrice = gljList[i].basePrice;
-                            if(typeof that.currentComponent[args.row] !== 'undefined'){
-                                rObj.consumeAmt = that.currentComponent[args.row].consumeAmt;
-                                let index;
-                                for(let j = 0; j < component.length; j++){
-                                    if(component[j].ID === that.currentComponent[args.row].ID){
-                                        index = j;
-                                        break;
-                                    }
-                                }
-                                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;
-                        }
-                        else{
-                            //已存在
-                            alert("已存在!");
-                            args.sheet.setValue(args.row, args.col, me.currentEditingComponent[me.setting.header[args.col].dataCode] ?
-                                me.currentEditingComponent[me.setting.header[args.col].dataCode]: '');
-                        }
-
-                    }
-                    else{
-                        if(materialComponent.indexOf(that.currentGlj.gljType) === 1){
-                            alert("该组成物只能是普通材料!");
-                        }
-                        else if(that.currentGlj.gljType === 301){
-                            alert("该组成物只能是机械组成物或机上人工!")
-                        }
-                        args.sheet.setValue(args.row, args.col, me.currentEditingComponent[me.setting.header[args.col].dataCode] ?
-                            me.currentEditingComponent[me.setting.header[args.col].dataCode]: '');
-                        //无效
-                    }
-                }
-            }
-            if(!hasCode){
-                alert("不存在此工料机,请先添加!");
-                args.sheet.setValue(args.row, args.col, me.currentEditingComponent[me.setting.header[args.col].dataCode] ?
-                    me.currentEditingComponent[me.setting.header[args.col].dataCode] : '');
-                //不存在
-            }
-        }*/
-         if(args.col === 4 && me.currentEditingComponent.code && args.editingText && args.editingText.trim().length > 0){//消耗量
+        let updateArr = [];
+        let dataCode = me.colMapping.colToField[args.col];
+        if (dataCode.includes('consumeAmt') && me.currentEditingComponent.code && args.editingText && args.editingText.trim().length > 0) {//消耗量
             let consumeAmt = parseFloat(args.editingText);
-            if(!isNaN(consumeAmt) && consumeAmt !== me.currentEditingComponent.consumeAmt){
+            if (!isNaN(consumeAmt) && me.consumeAmtChanged(me.currentEditingComponent, consumeAmt, args.col)) {
                 let roundCons = scMathUtil.roundTo(parseFloat(consumeAmt), -3);
                 let component = that.currentGlj.component;
-                for(let i = 0; i < component.length; i++){
-                    if(component[i].ID === that.currentComponent[args.row].ID){
-                        component[i].consumeAmt = roundCons;
+                for (let i = 0; i < component.length; i++) {
+                    if (component[i].ID === that.currentComponent[args.row].ID) {
+                        me.setConsumeAmt(component[i], dataCode, roundCons);
+                        //component[i].consumeAmt = roundCons;
                     }
                 }
-                that.currentComponent[args.row].consumeAmt = roundCons;
+                //that.currentComponent[args.row].consumeAmt = roundCons;
+                me.setConsumeAmt(that.currentComponent[args.row], dataCode, roundCons);
                 //计算工料机单价
                 let gljBasePrc = me.reCalGljBasePrc(that.currentComponent);
-                if(gljBasePrc !== that.currentGlj.basePrice){
-                    that.currentGlj.basePrice = gljBasePrc;
+                if (that.isGljPriceChange(that.currentGlj, gljBasePrc)) {
+                    that.setPrice(that.currentGlj, gljBasePrc);
                     that.reshowGljBasePrc(that.currentGlj);
                     //工料机单价改变,重算引用了该工料机的定额单价
                     //updateBasePrc.push({gljId: that.currentGlj.ID, gljType: that.currentGlj.gljType, basePrice: that.currentGlj.basePrice});
                 }
                 updateArr.push(that.currentGlj);
             }
-            else{
+            else {
                 //只能输入数值
-                args.sheet.setValue(args.row, args.col, me.currentEditingComponent[me.setting.header[args.col].dataCode] ?
-                    me.currentEditingComponent[me.setting.header[args.col].dataCode]: 0);
+                sheetOpr.showData(me, me.workBook.getSheet(0), me.setting, that.currentComponent);
+                /* args.sheet.setValue(args.row, args.col, me.currentEditingComponent[me.setting.header[args.col].dataCode] ?
+                    me.currentEditingComponent[me.setting.header[args.col].dataCode] : 0); */
 
             }
         }
-        else{
-            args.sheet.setValue(args.row, args.col, me.currentEditingComponent.consumeAmt);
+        else {
+            //args.sheet.setValue(args.row, args.col, me.currentEditingComponent.consumeAmt);
+            sheetOpr.showData(me, me.workBook.getSheet(0), me.setting, that.currentComponent);
         }
-        if(updateArr.length > 0){
+        if (updateArr.length > 0) {
             me.updateComponent(updateArr);
             /*if(updateBasePrc.length > 0){
                 that.updateRationBasePrcRq(updateBasePrc)
@@ -364,123 +431,86 @@ let gljComponentOprObj = {
     onClipboardPasting: function (sender, info) {
         let me = gljComponentOprObj, that = repositoryGljObj;
         let maxCol = info.cellRange.col + info.cellRange.colCount - 1;
+        /*  if (info.cellRange.col !== 4 && info.cellRange.colCount > 1 || (that.currentGlj.gljType === 4 && that.isComponent(that.currentGlj.ID, that.stdGljList.concat(that.complementaryGljList)))) {
+             args.cancel = true;
+         } */
         //复制的列数超过正确的列数,不可复制
-        if(info.cellRange.col !== 4 && info.cellRange.colCount > 1 || (that.currentGlj.gljType === 4 && that.isComponent(that.currentGlj.ID, that.stdGljList.concat(that.complementaryGljList)))){
-            args.cancel = true;
+        if (maxCol > me.setting.header.length - 1) {
+            return info.cancel = true;
+        }
+        if (that.currentGlj.gljType === 4 && that.isComponent(that.currentGlj.ID, that.stdGljList.concat(that.complementaryGljList))) {
+            return info.cancel = true;
+        }
+        //粘贴的字段只能是消耗量
+        for (let i = 0; i < info.cellRange.colCount; i++) {
+            let col = info.cellRange.col + i;
+            let dataCode = me.colMapping.colToField[col];
+            if (!dataCode.includes('consumeAmt')) {
+                return info.cancel = true;
+            }
         }
     },
     onClipboardPasted: function (sender, info) {
-        let me = gljComponentOprObj, that = repositoryGljObj, updateArr = [] ,materialComponent = [202, 203, 204], machineComponent = [302, 303],
+        let me = gljComponentOprObj, that = repositoryGljObj, updateArr = [], materialComponent = [202, 203, 204], machineComponent = [302, 303],
             component = that.currentGlj.component, newComponent = [], concatComponent = [], isChange = false, updateBasePrc = [];
-        let items = sheetOpr.analyzePasteData(me.setting, info);
         let gljCache = that.gljList;
-        //编码
-   /*     if(info.cellRange.col === 0){
-            for(let i = 0; i < items.length; i++){
-                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 === 301 && machineComponent.indexOf(gljCache[j].gljType) !== -1 )){
-                            //是否与原有组成物不同
-                            let isExist = false;
-                            for(let k = 0; k < component.length; k++){
-                                if(component[k].ID === gljCache[j].ID){
-                                    isExist = true;
-                                    me.workBook.getSheet(0).setValue(info.cellRange.row + i, info.cellRange.col,
-                                        typeof that.currentComponent[info.cellRange.row + i] !== 'undefined'? that.currentComponent[info.cellRange.row + i].code : '');
+        //消耗量
+        if (me.colMapping.colToField[info.cellRange.col].includes('consumeAmt')) {
+            let items = sheetCommonObj.analyzePasteData(me.setting, info);
+            let row = info.cellRange.row;
+            for (let i = 0; i < items.length; i++) {
+                if (row + i < that.currentComponent.length) {
+                    let currentObj = that.currentComponent[row + i];
+                    if (!me.consumeAmtIsEqual(items[i], currentObj)) {
+                        isChange = true;
+                        if (!consumeAmtProperties || consumeAmtProperties.length === 0) {
+                            let roundCons = scMathUtil.roundTo(parseFloat(items[i].consumeAmt), -3);
+                            currentObj.consumeAmt = roundCons;
+                            for (let j = 0; j < component.length; j++) {
+                                if (component[j].ID === currentObj.ID) {
+                                    component[j].consumeAmt = currentObj.consumeAmt;
                                     break;
                                 }
                             }
-                            if(!isExist){
-                                isChange = true;
-                                let obj = {};
-                                obj.ID = gljCache[j].ID;
-                                if(typeof that.currentComponent[info.cellRange.row + i] !== 'undefined'){//更新
-                                    obj.consumeAmt = that.currentComponent[info.cellRange.row + i].consumeAmt;
-                                    let index;
-                                    for(let k = 0; k < component.length; k++){
-                                        if(that.currentComponent[info.cellRange.row + i].ID === component[k].ID){
-                                            index = k;
-                                            break;
-                                        }
-                                    }
-                                    component.splice(index, 1);
-                                    component.splice(index, 0, obj);
-                                }
-                                else{//新增
-                                    obj.consumeAmt = 0;
-                                    component.push(obj);
+                        } else {
+                            for (let attr in items[i]) {
+                                //是消耗量字段
+                                if (attr.includes('consumeAmt') && items[i][attr] && !isNaN(parseFloat(items[i][attr]))) {
+                                    let roundCons = scMathUtil.roundTo(parseFloat(items[i][attr]), -3);
+                                    currentObj.consumeAmtProperty[attr] = roundCons;
                                 }
-                                break;
                             }
-
-                        }
-                        else{
-                            me.workBook.getSheet(0).setValue(info.cellRange.row + i, info.cellRange.col,
-                            typeof that.currentComponent[info.cellRange.row + i] !== 'undefined'? that.currentComponent[info.cellRange.row + i].code : '');
-
-                        }
-
-                    }
-                    else{
-                        me.workBook.getSheet(0).setValue(info.cellRange.row + i, info.cellRange.col,
-                            typeof that.currentComponent[info.cellRange.row + i] !== 'undefined'? that.currentComponent[info.cellRange.row + i].code : '');
-                    }
-                }
-            }
-            if(isChange){
-                //计算工料机单价
-                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);
-            }
-        }*/
-        //消耗量
-         if(info.cellRange.col === 4){
-            let items = sheetOpr.analyzePasteData(me.setting, info);
-            let row = info.cellRange.row;
-            for(let i = 0; i < items.length; i++){
-                if(row + i < that.currentComponent.length){
-                    let currentObj = that.currentComponent[row + i];
-                    if(items[i].consumeAmt.trim().length > 0 && items[i].consumeAmt !== currentObj.consumeAmt){
-                        let roundCons = scMathUtil.roundTo(parseFloat(items[i].consumeAmt), -3);
-                        isChange = true;
-                        currentObj.consumeAmt = roundCons;
-                        for(let j = 0; j < component.length; j++){
-                            if(component[j].ID === currentObj.ID){
-                                component[j].consumeAmt = currentObj.consumeAmt;
-                                break;
+                            for (let j = 0; j < component.length; j++) {
+                                if (component[j].ID === currentObj.ID) {
+                                    component[j].consumeAmtProperty = currentObj.consumeAmtProperty;
+                                    break;
+                                }
                             }
                         }
+                    } else {
+                        sheetOpr.showData(me, me.workBook.getSheet(0), me.setting, that.currentComponent);
+                        //me.workBook.getSheet(0).setValue(row + i, info.cellRange.col, currentObj.consumeAmt);
                     }
-                    else{
-                        me.workBook.getSheet(0).setValue(row + i, info.cellRange.col, currentObj.consumeAmt);
-                    }
-                }
-                else{
+                } else {
                     me.workBook.getSheet(0).setValue(row + i, info.cellRange.col, '');
                 }
             }
-            if(isChange){
+            if (isChange) {
                 //计算工料机单价
                 let gljBasePrc = me.reCalGljBasePrc(that.currentComponent);
-                if(gljBasePrc !== that.currentGlj.basePrice){
-                    that.currentGlj.basePrice = gljBasePrc;
+                if (that.isGljPriceChange(that.currentGlj, gljBasePrc)) {
+                    that.setPrice(that.currentGlj, gljBasePrc);
                     that.reshowGljBasePrc(that.currentGlj);
                     //updateBasePrc.push({gljId: that.currentGlj.ID, gljType: that.currentGlj.gljType, basePrice: that.currentGlj.basePrice});
                 }
                 updateArr.push(that.currentGlj);
             }
         }
-        if(updateArr.length > 0){
+        if (updateArr.length > 0) {
             me.updateComponent(updateArr);
-           /* if(updateBasePrc.length > 0){
-                that.updateRationBasePrcRq(updateBasePrc);
-            }*/
+            /* if(updateBasePrc.length > 0){
+                 that.updateRationBasePrcRq(updateBasePrc);
+             }*/
         }
     },
     updateComponent: function (updateArr) {
@@ -489,15 +519,15 @@ let gljComponentOprObj = {
         $.ajax({
             type: 'post',
             url: 'complementartGlj/api/updateComponent',
-            data: {"userId": pageOprObj.userId, "updateArr": JSON.stringify(updateArr)},
+            data: { "userId": pageOprObj.userId, "updateArr": JSON.stringify(updateArr) },
             dataType: 'json',
             success: function (result) {
-                if(!result.error){
-                        that.currentComponent =  that.getCurrentComponent(result.data[0].component);
-                        sheetOpr.cleanData(me.workBook.getSheet(0), me.setting, -1);
-                        sheetOpr.showData(me.workBook.getSheet(0), me.setting, that.currentComponent);
+                if (!result.error) {
+                    that.currentComponent = that.getCurrentComponent(result.data[0].component);
+                    sheetOpr.cleanData(me.workBook.getSheet(0), me.setting, -1);
+                    sheetOpr.showData(me, me.workBook.getSheet(0), me.setting, that.currentComponent);
                 }
-                else{
+                else {
                     sheetOpr.cleanData(me.workBook.getSheet(0), me.setting, -1);
                 }
                 $('#componentsCacnel').click();
@@ -505,18 +535,44 @@ let gljComponentOprObj = {
         })
     },
     round: function (v, e) {
-        let t=1;
-        for(;e>0;t*=10,e--);
-        for(;e<0;t/=10,e++);
-        return Math.round(v*t)/t;
+        let t = 1;
+        for (; e > 0; t *= 10, e--);
+        for (; e < 0; t /= 10, e++);
+        return Math.round(v * t) / t;
     },
-    reCalGljBasePrc: function (component) {
-        let me = gljComponentOprObj, gljBasePrc = 0;
-        for(let i = 0; i < component.length; i++){
-            let roundBasePrc = scMathUtil.roundTo(parseFloat(component[i].basePrice), -2);
-            let roundConsumeAmt = scMathUtil.roundTo(parseFloat(component[i].consumeAmt), -3);
-            gljBasePrc = scMathUtil.roundTo(scMathUtil.roundTo(roundBasePrc * roundConsumeAmt, me.processDecimal) + gljBasePrc, me.processDecimal);
+    reCalGljBasePrc: function (components) {
+        /*         let me = gljComponentOprObj;
+                let gljBasePrc = 0;
+                for(let i = 0; i < component.length; i++){
+                    let roundBasePrc = scMathUtil.roundTo(parseFloat(component[i].basePrice), -2);
+                    let roundConsumeAmt = scMathUtil.roundTo(parseFloat(component[i].consumeAmt), -3);
+                    gljBasePrc = scMathUtil.roundTo(scMathUtil.roundTo(roundBasePrc * roundConsumeAmt, me.processDecimal) + gljBasePrc, me.processDecimal);
+                }
+                return gljBasePrc;
+         */
+
+        let me = gljComponentOprObj, re = repositoryGljObj;
+        // 只有一个单价的情况,只有一个单价则只有一个消耗量
+        if (!priceProperties || priceProperties.length === 0) {
+            let gljBasePrc = 0;
+            for (let i = 0; i < components.length; i++) {
+                let roundBasePrc = scMathUtil.roundTo(parseFloat(components[i].basePrice), -2);
+                let roundConsumeAmt = scMathUtil.roundTo(parseFloat(components[i].consumeAmt), -3);
+                gljBasePrc = scMathUtil.roundTo(scMathUtil.roundTo(roundBasePrc * roundConsumeAmt, me.processDecimal) + gljBasePrc, me.processDecimal);
+            }
+            return scMathUtil.roundTo(gljBasePrc, -2);
+        } else { // 多单价的情况
+            let gljPriceProperty = re.getPriceProperty(priceProperties);
+            for (let priceProp in gljPriceProperty) {
+                let consumeAmtField = re.getConsumeAmtField(consumeAmtProperties, priceProp);
+                for (let component of components) {
+                    let roundBasePrc = scMathUtil.roundTo(parseFloat(component['priceProperty'][priceProp]), -2);
+                    let roundConsumeAmt = scMathUtil.roundTo(parseFloat(component['consumeAmtProperty'][consumeAmtField]), -3);
+                    gljPriceProperty[priceProp] = scMathUtil.roundTo(scMathUtil.roundTo(roundBasePrc * roundConsumeAmt, me.processDecimal) + gljPriceProperty[priceProp], me.processDecimal);
+                }
+                scMathUtil.roundTo(gljPriceProperty[priceProp], -2);
+            }
+            return gljPriceProperty;
         }
-        return gljBasePrc;
     }
 };

+ 146 - 5
web/building_saas/complementary_glj_lib/js/sheetOpr.js

@@ -114,7 +114,7 @@ let sheetOpr = {
             area.vAlign(GC.Spread.Sheets.VerticalAlign.center);
         }
     },
-    showData: function(sheet, setting, data, distTypeTree, machineModelIdx) {
+    /* showData: function(sheet, setting, data, distTypeTree, machineModelIdx) {
         var me = this, ch = GC.Spread.Sheets.SheetArea.viewport;
         sheet.suspendPaint();
         sheet.suspendEvent();
@@ -169,7 +169,7 @@ let sheetOpr = {
         sheet.resumeEvent();
         sheet.resumePaint();
         //me.shieldAllCells(sheet);
-    },
+    }, */
     analyzePasteData: function(setting, pastedInfo) {
         var rst = [], propId = pastedInfo.cellRange.col, preStrIdx = 0, itemObj = {};
         for (var i = 0; i < pastedInfo.pasteData.text.length; i++) {
@@ -196,12 +196,153 @@ let sheetOpr = {
         }
         return rst;
     },
+    showData: function(obj, sheet, setting, data, distTypeTree, materialTypeIdx, machineModelIdx) {
+        var me = this, ch = GC.Spread.Sheets.SheetArea.viewport;
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        if(typeof setting.owner !== 'undefined' && setting.owner === 'gljComponent'){
+            sheet.setRowCount(data.length + 5);
+        }
+        else{
+            sheet.setRowCount(typeof repositoryGljObj !== 'undefined' && repositoryGljObj.currentOprParent === 1 ? data.length : data.length + 10);
+        }
+        let checkBoxType = new GC.Spread.Sheets.CellTypes.CheckBox();
+        for (var col = 0; col < setting.header.length; col++) {
+            var hAlign = "left", vAlign = "center";
+            if (setting.header[col].hAlign) {
+                hAlign = setting.header[col].hAlign;
+            } else if (setting.header[col].dataType !== "String"){
+                hAlign = "right";
+            }
+            vAlign = setting.header[col].vAlign?setting.header[col].vAlign:vAlign;
+            me.setAreaAlign(sheet.getRange(-1, col, -1, 1), hAlign, vAlign);
+            if (setting.header[col].formatter) {
+                sheet.setFormatter(-1, col, setting.header[col].formatter, GC.Spread.Sheets.SheetArea.viewport);
+            }
+            for (var row = 0; row < data.length; row++) {
+                if(obj.pricePropertyCols.includes(col)){
+                    let price = data[row]['priceProperty'] && data[row]['priceProperty'][obj.colMapping.colToField[col]] !== undefined
+                        && data[row]['priceProperty'][obj.colMapping.colToField[col]] !== null
+                        ? data[row]['priceProperty'][obj.colMapping.colToField[col]] : '';
+                    sheet.setValue(row, col, price);
+                }
+                else if(obj.consumeAmtPropertyCols && obj.consumeAmtPropertyCols.includes(col)){
+                    let consumeAmt = data[row]['consumeAmtProperty'] && data[row]['consumeAmtProperty'][obj.colMapping.colToField[col]] !== undefined
+                    && data[row]['consumeAmtProperty'][obj.colMapping.colToField[col]] !== null
+                        ? data[row]['consumeAmtProperty'][obj.colMapping.colToField[col]] : '';
+                    sheet.setValue(row, col, consumeAmt);
+                }
+                else if(setting.header[col].dataCode === 'gljType' && data[row].gljType){
+                    let distTypeVal =  distTypeTree.distTypes[distTypeTree.prefix + data[row].gljType].data.fullName;
+                    sheet.setValue(row, col, distTypeVal, ch);
+                }
+                else if(setting.header[col].dataCode === 'materialType' && data[row].materialType){
+                    sheet.setValue(row, col, materialTypeIdx[data[row].materialType]);
+                }
+                else if(setting.header[col].dataCode === 'model' && data[row].model){
+                    sheet.setValue(row, col, machineModelIdx[data[row].model]);
+                }
+                else if(setting.header[col].dataCode === 'select'){
+                    if(data[row].isChecked === true){
+                        sheet.getCell(row, col).value(1);
+                    }
+                }
+                else {
+                    sheet.setValue(row, col, data[row][setting.header[col].dataCode], ch);
+                    sheet.setTag(row, 0, data[row].ID, ch);
+                }
+                //复选框
+                if(setting.header[col].dataCode === 'isComplementary'){
+                    sheet.setCellType(row, col, checkBoxType);
+                    sheet.getCell(row, col).value(1);
+                }
+                //新增组成物表,选择复选框
+                if(setting.header[col].dataCode === 'select'){
+                    sheet.setCellType(row, col, checkBoxType)
+                    if(data[row].isChecked === true){
+                        sheet.getCell(row, col).value(1);
+                    }
+                }
+            }
+        }
+        sheet.resumeEvent();
+        sheet.resumePaint();
+    },
     combineRowData: function(sheet, setting, row, repositoryGljObj) {
         let me = this;
+        var rst = {priceProperty: {}};
+        let gljTypeCombo = sheet.getCellType(row, repositoryGljObj.colMapping.fieldToCol['gljType']);
+        let items = gljTypeCombo.items();
+        let materialTypeCombo = sheet.getCellType(row, repositoryGljObj.colMapping.fieldToCol['materialType']);
+        let machineItems = sheet.getCellType(row, repositoryGljObj.colMapping.fieldToCol['model']).items();
+        let codeCol = 0;
+        for (var col = 0; col < setting.header.length; col++) {
+            if(repositoryGljObj.pricePropertyCols.includes(col)){
+                v = sheet.getValue(row, col);
+                rst.priceProperty[setting.header[col].dataCode] = v && v !== '' ? v : 0;
+            }
+            else if(setting.header[col].dataCode === 'gljType'){
+                items.forEach(function(item){
+                    if(sheet.getValue(row, col) === item.text){
+                        rst[setting.header[col].dataCode] = item.value;
+                        if(repositoryGljObj){
+                            rst.shortName = repositoryGljObj.distTypeTree.distTypes[repositoryGljObj.distTypeTree.prefix + item.value].data.shortName;
+                        }
+                    }
+                });
+            }
+            else if(setting.header[col].dataCode === 'model'){
+                machineItems.forEach(function(item){
+                    if(sheet.getValue(row, col) === item.text){
+                        rst[setting.header[col].dataCode] = item.value;
+                    }
+                });
+            }
+            else if (setting.header[col].dataCode === 'code'){
+                codeCol = col;
+                if(repositoryGljObj){
+                    let gljList = repositoryGljObj.gljList,
+                        orgCode = repositoryGljObj.orgCode,
+                        isExist = false;
+                    for(let i=0; i< gljList.length; i++){
+                        if(gljList[i].code === sheet.getValue(row, col) && sheet.getValue(row, col)!== orgCode){
+                            $('#alertText').text("输入的编号已存在,请重新输入!");
+                            $('#codeAlertBtn').click();
+                            $('#codAleConfBtn').click(function () {
+                                sheet.setValue(row, codeCol, orgCode);
+                                sheet.getCell(row, codeCol).formatter("@");
+                                sheet.setActiveCell(row, codeCol);
+                            });
+                            $('#codAleClose').click(function () {
+                                sheet.setValue(row, codeCol, orgCode);
+                                sheet.getCell(row, codeCol).formatter("@");
+                                sheet.setActiveCell(row, codeCol);
+                            });
+                            isExist = true
+                        }
+                    }
+                    if(!isExist){
+                        rst[setting.header[col].dataCode] = sheet.getValue(row, col);
+                    }
+                }
+                else{
+                    rst[setting.header[col].dataCode] = sheet.getValue(row, col);
+                }
+            }
+            else{
+                rst[setting.header[col].dataCode] = sheet.getValue(row, col);
+            }
+        }
+        return rst;
+    },
+    /* combineRowData: function(sheet, setting, row, repositoryGljObj) {
+        let me = this;
         var rst = {};
-        let comboBoxCellType = sheet.getCellType(row, 5);
+        const gljTypeCol = setting.header.findIndex(item => item.dataCode === 'gljType');
+        const modelCol = setting.header.findIndex(item => item.dataCode === 'model');
+        let comboBoxCellType = sheet.getCellType(row, gljTypeCol);
         let items = comboBoxCellType.items();
-        let machineItems = sheet.getCellType(row, 6).items();
+        let machineItems = sheet.getCellType(row, modelCol).items();
         for (var col = 0; col < setting.header.length; col++) {
             if(setting.header[col].dataCode === 'gljType'){
                 items.forEach(function(item){
@@ -277,7 +418,7 @@ let sheetOpr = {
             }
         }
         return rst;
-    },
+    }, */
     combineRationRowData: function(sheet, setting, row) {
         var rst = {};
         for (var col = 0; col < setting.header.length; col++) {

+ 1 - 0
web/building_saas/complementary_ration_lib/html/dinge.html

@@ -54,6 +54,7 @@
     <script>
         const gljLibId = '<%= gljLibId %>';
         const userID = '<%=userID %>';
+        let priceProperties = JSON.parse('<%- priceProperties %>');
     </script>
 </head>
 <body>

+ 6 - 0
web/building_saas/complementary_ration_lib/js/gljSelect.js

@@ -55,6 +55,12 @@ let gljSelOprObj = {
         this.sortGlj(this.stdGljList);
         this.sortGlj(this.complementaryGljList);
         gljAdjOprObj.gljList = this.stdGljList.concat(this.complementaryGljList);
+        if(priceProperties && priceProperties.length){
+            const priceField = priceProperties[0].price.dataCode;
+            for(let glj of gljAdjOprObj.gljList){
+                glj.basePrice = glj.priceProperty && glj.priceProperty[priceField] ? glj.priceProperty[priceField] : 0;
+            }
+        }
     },
     initClassTree: function (type, treeData) {
         let me = this;

+ 12 - 0
web/building_saas/complementary_ration_lib/js/ration_glj.js

@@ -424,6 +424,12 @@ var rationGLJOprObj = {
         let me = this;
         CommonAjax.post('api/getGljItemsByCodes', {gljCodes: codes, rationRepId: repId}, function (rstData) {
             if(rstData.length > 0){
+                if(priceProperties && priceProperties.length > 0){
+                    let priceField = priceProperties[0].price.dataCode;
+                    for(let glj of rstData){
+                        glj.basePrice = glj.priceProperty && glj.priceProperty[priceField] ? glj.priceProperty[priceField] : 0;
+                    }
+                }
                 sheetCommonObj.cleanData(me.sheet, me.setting, -1);
                 let rstArr = [], dummyR = {gljId: 0, consumeAmt:0}, newAddArr = [];
                 for (let i = 0; i < rstData.length; i++) {
@@ -605,6 +611,12 @@ var rationGLJOprObj = {
             }
             CommonAjax.post('api/getGljItemsByIds', {ids: gljIds}, function (rstData) {
                 sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
+                if(priceProperties && priceProperties.length > 0){
+                    let priceField = priceProperties[0].price.dataCode;
+                    for(let glj of rstData){
+                        glj.basePrice = glj.priceProperty && glj.priceProperty[priceField] ? glj.priceProperty[priceField] : 0;
+                    }
+                }
                 var cacheArr = [];
                 for (let i = 0; i < rstData.length; i++) {
                     for (let j = 0; j < rationGljList.length; j++) {

+ 4 - 2
web/building_saas/main/js/models/ration_glj.js

@@ -549,7 +549,8 @@ let ration_glj = {
                     let tmp = _.find(data.priceProperties, {region: property.region, taxModel: parseInt(property.taxType)});
                     if (tmp) {
                         let dataCode = tmp.price.dataCode;
-                        for (let glj of data.stdGLJ) {
+                        let allData = data.stdGLJ.concat(data.complementaryGLJs);
+                        for (let glj of allData) {
                             if (glj.priceProperty && gljUtil.isDef(glj.priceProperty[dataCode])) {
                                 glj.basePrice = glj.priceProperty[dataCode];
                             }
@@ -573,7 +574,8 @@ let ration_glj = {
                      let tem = _.find(data.datas.priceProperties,{region:property.region,taxModel:parseInt(property.taxType)});
                      if(tem){
                          let dataCode = tem.price.dataCode;
-                         for(let glj of data.datas.stdGLJ){
+                         let allData = data.datas.stdGLJ.concat(data.datas.complementaryGLJs);
+                         for(let glj of allData){
                              if(glj.priceProperty && gljUtil.isDef(glj.priceProperty[dataCode])) glj.basePrice = glj.priceProperty[dataCode];
                          }
                      }

+ 24 - 0
web/over_write/js/guangdong_2018.js

@@ -129,4 +129,28 @@ if (typeof module !== 'undefined') {
 
 if(typeof gljCol !== 'undefined'){
     gljCol.showTaxRate = true;
+}
+
+// 人材机库追加的列头
+if (typeof repositoryGljObj !== 'undefined') {
+    repositoryGljObj.setting.header = [
+        {headerName:"税率",headerWidth:60,dataCode:"taxRate", dataType: "Number", hAlign: "center", vAlign: "center"},
+        { headerName: "机型", headerWidth: 60, dataCode: "model", dataType: "Number", hAlign: "center", vAlign: "center" },
+        { headerName: "是否新增", headerWidth: 60, dataCode: "isComplementary", hAlign: "center", vAlign: "center" }
+    ]
+}
+
+// 定额人材机选择页面表头
+if (typeof gljOprObj !== 'undefined') {
+    gljOprObj.gljLibSheetSetting.header = [
+        {headerName: "选择", headerWidth: 40, dataCode: "select", hAlign: "center", vAlign: "center", cellType: "checkBox"},
+        {headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
+        {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String", hAlign: "left", vAlign: "center"},
+        {headerName: "规格型号", headerWidth: 160, dataCode: "specs", dataType: "String", hAlign: "left", vAlign: "center"},
+        {headerName: "单位", headerWidth: 40, dataCode: "unit", dataType: "String", hAlign: "center", vAlign: "center"},
+        {headerName: "单价", headerWidth: 55, dataCode: "basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
+        {headerName: "税率", headerWidth: 40, dataCode: "taxRate", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
+        {headerName: "类型", headerWidth: 60, dataCode: "typeName", dataType: "String", hAlign: "center", vAlign: "center"},
+        {headerName: "新增", headerWidth: 40, dataCode: "isComplementary", dataType: "String", hAlign: "center", vAlign: "center", cellType: "checkBox", readOnly: true}
+    ]
 }

+ 2 - 2
web/over_write/js/guangdong_2018_export.js

@@ -990,7 +990,7 @@ const XMLStandard = (function () {
                 // 工程编号
                 {
                     name: 'Number',
-                    value: ''
+                    value: _util.getValueByKey(basicInformation, 'projNum')
                 },
                 // 工程名称
                 {
@@ -1005,7 +1005,7 @@ const XMLStandard = (function () {
                 // 建设规模
                 {
                     name: 'Scale', dName: '建设规模', type: _type.DECIMAL, required: true,
-                    value: _util.getValueByKey(basicInformation, 'projectScale')
+                    value: _util.getValueByKey(basicInformation, 'scale')
                 },
                 // 建设规模单位
                 {