浏览代码

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

Chenshilong 7 年之前
父节点
当前提交
f54ebd6834

+ 3 - 1
Dockerfile

@@ -4,7 +4,9 @@ COPY . ConstructionCost
 
 WORKDIR ConstructionCost
 
-RUN cnpm install 
+RUN cnpm install
+
+RUN gulp build
 
 EXPOSE 6060
 

+ 2 - 0
Dockerfile_qa

@@ -6,6 +6,8 @@ WORKDIR ConstructionCost
 
 RUN cnpm install
 
+RUN gulp build
+
 EXPOSE 6060
 
 ENV NODE_ENV=qa

+ 79 - 1
config/gulpConfig.js

@@ -26,5 +26,83 @@ module.exports = {
         'public/web/common_ajax.js',
         'web/building_saas/pm/js/**/*.js',
         'lib/ztree/*.js'
+    ],
+    main_css:[
+        'lib/ztree/css/zTreeStyle.css',
+        'lib/spreadjs/sheets/css/gc.spread.sheets.excel2013lightGray.10.0.1.css',
+        'lib/spreadjs/views/gc.spread.views.dataview.10.0.0.css',
+        'lib/jquery-contextmenu/jquery.contextMenu.css'
+    ],
+    main_jspaths:[
+        'lib/JSExpressionEval_src/*.js',
+        '!lib/JSExpressionEval_src/JsHashMap.js',
+        'lib/jquery-contextmenu/*.js',
+        'lib/lodash/lodash.js',
+        'web/building_saas/glj/js/project_glj.js',
+        'web/building_saas/glj/js/composition.js',
+        'web/building_saas/glj/js/common_spread.js',
+        'web/building_saas/glj/js/composition_spread.js',
+        'web/building_saas/glj/js/project_glj_spread.js',
+        'web/building_saas/glj/js/socket.io.slim.js',
+        'public/web/socket/connection.js',
+        'public/web/uuid.js',
+        'public/web/sheet/sheet_common.js',
+        'web/building_saas/main/js/models/calc_program.js',
+        'web/building_saas/main/js/views/calc_program_manage.js',
+        'public/web/common_ajax.js',
+        'public/web/url_util.js',
+        'public/web/number_util.js',
+        'public/web/sheet/sheet_common.js',
+       // 'lib/ztree/*.js',
+        'lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1',
+       // 'lib/spreadjs/views/gc.spread.views.dataview.10.0.0.min.js',
+       // "lib/spreadjs/views/common/gc.spread.common.10.0.0.min.js",
+      //  'lib/spreadjs/views/plugins/gc.spread.views.gridlayout.10.0.0.min.js',
+        'web/building_saas/main/js/models/main_consts.js',
+        'web/building_saas/main/js/models/project.js',
+        'web/building_saas/main/js/models/bills.js',
+        'web/building_saas/main/js/models/ration.js',
+        'web/building_saas/main/js/models/glj.js',
+        'web/building_saas/main/js/models/project_glj.js',
+        'web/building_saas/main/js/models/fee_rate.js',
+        'web/building_saas/main/js/models/ration_glj.js',
+        'web/building_saas/main/js/models/ration_coe.js',
+        'web/building_saas/main/js/models/ration_ass.js',
+        'web/building_saas/main/js/models/volume_price.js',
+        'public/web/id_tree.js',
+        'test/tmp_data/test_ration_calc/ration_calc_base.js',
+        'web/building_saas/main/js/models/cache_tree.js',
+        'web/building_saas/main/js/calc/calc_fees.js',
+        'web/building_saas/main/js/calc/ration_calc.js',
+        'web/building_saas/main/js/calc/bills_calc.js',
+        'public/calc_util.js',
+        'public/web/tree_sheet/tree_sheet_controller.js',
+        'public/web/tree_sheet/tree_sheet_helper.js',
+        'public/web/sheet/sheet_data_helper.js',
+        'web/building_saas/main/js/views/main_tree_col.js',
+        'web/building_saas/main/js/views/project_info.js',
+        'web/building_saas/main/js/views/project_view.js',
+        'web/building_saas/main/js/views/options_view.js',
+        'web/building_saas/main/js/main_ajax.js',
+        'web/building_saas/main/js/main.js',
+        'web/building_saas/main/js/controllers/project_controller.js',
+        'web/building_saas/main/js/views/side_tools.js',
+        'web/building_saas/main/js/views/std_bills_lib.js',
+        'web/building_saas/main/js/views/std_ration_lib.js',
+        'web/building_saas/main/js/models/quantity_detail.js',
+        'web/building_saas/main/js/views/glj_view_contextMenu.js',
+        'web/building_saas/main/js/views/calc_program_view.js',
+        'public/web/treeDataHelper.js',
+        'public/web/ztree_common.js',
+        'public/web/rpt_tpl_def.js',
+        'web/building_saas/main/js/rpt/rpt_main.js',
+        'web/building_saas/main/js/rpt/rpt_cfg_const.js',
+        'web/building_saas/main/js/views/character_content_view.js',
+        'web/building_saas/main/js/views/glj_view.js',
+        'web/building_saas/main/js/views/sub_view.js',
+        'web/building_saas/main/js/views/fee_rate_view.js',
+        'web/building_saas/main/js/views/sub_fee_rate_views.js',
+        'web/building_saas/main/js/views/project_property_labour_coe_view.js'
     ]
-}
+}
+

+ 12 - 3
gulpfile.js

@@ -30,7 +30,7 @@ gulp.task('minify', function (){
     if(taskObject.jspaths){
         return gulp.src(taskObject.jspaths)
             .pipe($.plumber())
-            .pipe(uglify())
+           // .pipe(uglify())
             .pipe($.concat(taskObject.concatName+"."+version+".js"))
             .pipe(gulp.dest(taskObject.scriptsDest));
     }
@@ -44,7 +44,7 @@ gulp.task('copy',function () {
             .pipe(gulp.dest(taskObject.htmlDest));
 })
 
-gulp.task('inject',['copy','minify','css'], function () {
+gulp.task('inject',['minify','css'], function () {
     var target = gulp.src(taskObject.htmlDest+'/'+taskObject.htmlName);
     var sources = gulp.src(taskObject.injectList, {read: false});
 
@@ -131,9 +131,18 @@ gulp.task('main',function () {
         jspaths:main_jspaths,
         pm_csspaths:main_csspaths,
         concatName:'main.all.min',
+        cssDest:'web/dest/css',
+        srcHtml:'web/src/html/main/main.html',
+        htmlDest:'web/building_saas/main/html',
+        htmlName:'main.html',
+        injectList:['web/dest/scripts/main.all.min.'+version+'.js',
+            'web/dest/css/common.all.min.'+version+'.css',
+            'web/dest/css/main.all.min.'+version+'.css']
     }
     task_init(options);
     runSequence('inject','htmlmin');
-
 })
 
+gulp.task('build',['common'],function () {
+    runSequence('header',['login','pm','main']);
+});

+ 10 - 3
modules/glj/controllers/glj_controller.js

@@ -97,6 +97,7 @@ class GLJController extends BaseController {
     async updateData(request, response) {
         let field = request.body.field;
         let value = request.body.value;
+        let extend = request.body.extend;
         value = value === 'true' ? 1 : value;
         value = value === 'false' ? 0 : value;
         let id = request.body.id;
@@ -107,7 +108,8 @@ class GLJController extends BaseController {
         };
         try {
             // 可编辑的字段
-            let editableField = ['is_evaluate', 'unit_price.market_price', 'is_adjust_price', 'mix_ratio.consumption'];
+            let editableField = ['is_evaluate', 'unit_price.market_price', 'is_adjust_price', 'mix_ratio.consumption',
+                'supply'];
             if (editableField.indexOf(field) < 0) {
                 throw '对应字段不能编辑';
             }
@@ -126,13 +128,18 @@ class GLJController extends BaseController {
             let model = null;
             switch (modelString) {
                 case 'glj':
+                    if (extend !== '') {
+                        extend = JSON.parse(extend);
+                        for (let code in extend) {
+                            updateData[code] = extend[code];
+                        }
+                    }
+                    console.log(updateData);
                     model = new GLJListModel();
                     // 更新数据
                     result = await model.updateById(id, updateData);
-
                     break;
                 case 'unit_price':
-                    let extend = request.body.extend;
                     model = new UnitPriceModel();
                     // 更新数据
                     result = await model.updatePrice({id: id}, updateData, extend);

+ 1 - 1
modules/glj/models/glj_list_model.js

@@ -122,7 +122,7 @@ class GLJListModel extends BaseModel {
                 for (let tmp of mixRatioList) {
                     totalComposition[tmp.connect_code] = totalComposition[tmp.connect_code] === undefined ? tmp.consumption :
                         totalComposition[tmp.connect_code] + tmp.consumption;
-                    totalComposition[tmp.connect_code] = Number(totalComposition[tmp.connect_code].toFixed(2));
+                    totalComposition[tmp.connect_code] = Number(totalComposition[tmp.connect_code].toFixed(4));
 
                     if (mixRatioData[tmp.glj_id] !== undefined) {
                         mixRatioData[tmp.glj_id].push(tmp);

+ 2 - 2
modules/glj/models/schemas/glj.js

@@ -34,8 +34,8 @@ let modelSchema = {
     },
     // 供货方式
     supply: {
-        type: String,
-        default: ''
+        type: Number,
+        default: 0
     },
     // 甲供数量
     supply_quantity: {

+ 32 - 9
modules/ration_glj/facade/ration_glj_facade.js

@@ -55,29 +55,52 @@ async function getQuantityByProjectGLJ(condition) {
         ]
     }
 
+    let results = await  ration_glj.find(query,['projectGLJID','quantity','rationID'],{sort: {projectGLJID: 1}});
+    let rationList = _.uniq(_.map(results,'rationID'));
 
-    let results = await   ration_glj.find(query,['projectGLJID','quantity']);
-    return combineQuantity(results);
+    let rationQuery={
+        $and:[
+            {'projectID':condition.projectID},
+            {'ID':{$in:rationList}},
+            {'deleteInfo': null}
+        ]
+    }
+    let rations = await ration.find(rationQuery,['ID','quantity']);
+    //deleteInfo: null
+    console.log("rationList-----");
+    console.log(rationList);
+
+    return combineQuantity(results,rations);
 }
 
-function combineQuantity(results) {
-    var resultMap = {};
+function combineQuantity(results,rations) {
+    let resultList=[];
     _.forEach(results,function (data) {
-        if(resultMap.hasOwnProperty(data.projectGLJID)){
+        let tmp = {
+            projectGLJID:data.projectGLJID,
+            quantity: data.quantity
+        }
+        let ration=_.find(rations,{ID:data.rationID});
+        if(ration){
+            tmp.rationID=ration.ID;
+            tmp.rationQuantity=ration.quantity?Number(ration.quantity):undefined;
+        }
+        resultList.push(tmp);
+      /*  if(resultMap.hasOwnProperty(data.projectGLJID)){
             resultMap[data.projectGLJID] += data.quantity;
         }else {
             resultMap[data.projectGLJID] = data.quantity;
-        }
-    })
+        }*/
+    });
 
-    var resultList =[];
+ /*   var resultList =[];
     for(let key in resultMap){
        let newObject = {
             'projectGLJID':key,
             'quantity':resultMap[key]
         }
         resultList.push(newObject)
-    }
+    }*/
     return resultList;
 }
 

+ 83 - 30
modules/reports/controllers/rpt_tpl_controller.js

@@ -60,29 +60,29 @@ let mExport = {
             }
         });
     },
-    getRptTplTree_org: function(req, res) {
-        let params = JSON.parse(req.body.params),
-            grpType = params.grpType,
-            userId = params.userId,
-            tplType = params.tplType;
-        let filter = {"grpType": grpType, "$or": [{"isDeleted": null}, {"isDeleted": false} ]};
-        if (userId) {
-            filter.userId = userId;
-        }
-        if ((tplType && tplType !== rptTplDef.TplType.ALL)) {
-            filter.tplType = tplType;
-        }
-        TreeNodeModel.find(filter, '-_id', function(err, data){
-            if (err) {
-                callback(req,res, true,"", null);
-            } else {
-                callback(req,res,false,"", data);
-            }
-        });
-        // let obj = test_glj_type_util.getStdGljTypeCacheObj();
-        // console.log(obj.toArray());
-        // console.log(obj.getItemById(1));
-    },
+    // getRptTplTree_org: function(req, res) {
+    //     let params = JSON.parse(req.body.params),
+    //         grpType = params.grpType,
+    //         userId = params.userId,
+    //         tplType = params.tplType;
+    //     let filter = {"grpType": grpType, "$or": [{"isDeleted": null}, {"isDeleted": false} ]};
+    //     if (userId) {
+    //         filter.userId = userId;
+    //     }
+    //     if ((tplType && tplType !== rptTplDef.TplType.ALL)) {
+    //         filter.tplType = tplType;
+    //     }
+    //     TreeNodeModel.find(filter, '-_id', function(err, data){
+    //         if (err) {
+    //             callback(req,res, true,"", null);
+    //         } else {
+    //             callback(req,res,false,"", data);
+    //         }
+    //     });
+    //     // let obj = test_glj_type_util.getStdGljTypeCacheObj();
+    //     // console.log(obj.toArray());
+    //     // console.log(obj.getItemById(1));
+    // },
     updateTreeNodes: function(req, res) {
         let params = JSON.parse(req.body.params),
             nodes = params.nodes;
@@ -148,6 +148,41 @@ let mExport = {
             }
         })
     },
+    updateTopNodeName: function (req, res) {
+        let params = JSON.parse(req.body.params),
+            compilationId = params.compilationId, engineerId = params.engineerId, userId = params.userId,
+            nodeName = params.nodeName
+        ;
+        let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
+        let updateStatement = {"$set": {"name": nodeName}};
+        rttFacade.updateTreeInDetail(filter, updateStatement).then(function (rst) {
+            if (rst) {
+                //success
+                callback(req,res, false, "", rst);
+            } else {
+                //failed
+                callback(req,res, true, "更新失败!", null);
+            }
+        });
+    },
+    updateSubLevelOneNode: function (req, res) {
+        let params = JSON.parse(req.body.params),
+            compilationId = params.compilationId, engineerId = params.engineerId, userId = params.userId,
+            subNode = params.subNode
+        ;
+        let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId, "items.ID": subNode.ID, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
+        let updateStatement = {$set: {"items.$": subNode}};
+        rttFacade.updateTreeInDetail(filter, updateStatement).then(function (rst) {
+            if (rst) {
+                //success
+                callback(req,res, false, "", rst);
+            } else {
+                //failed
+                callback(req,res, true, "更新失败!", null);
+            }
+        });
+    },
+
     removeTreeRootNode: function (req, res) {
         let params = JSON.parse(req.body.params),
             compilationId = params.compilationId,
@@ -201,29 +236,47 @@ let mExport = {
     //         });
     //     });
     // },
+    getNewNodeID: function(req, res) {
+        let params = JSON.parse(req.body.params),
+            scope = params.scope;
+        counter.counterDAO.getIDAfterCount(counter.moduleName.report, scope, function(err, result){
+            callback(req,res, false, "", result.value.sequence_value);
+        });
+    },
     createDftRptTpl: function(req, res) {
         let params = JSON.parse(req.body.params),
             treeNodeId = params.treeNodeId,
-            //grpChars = stringUtil.getPinYinFullChars(params.grpChars),
-            rptDftTplId = params.rptDftTplId;
+            rptDftTplId = params.rptDftTplId,
+            rptName = params.rptName,
+            grpKey = params.grpKey,
+            compilationId = params.compilationId,
+            engineerId = params.engineerId,
+            userId = params.userId,
+            subNode = params.subNode
+        ;
         let filter = {"ID": rptDftTplId};
         RptTplModel.findOne(filter, '-_id').exec().then(function(dftTplRst) {
             if (dftTplRst) {
                 let _doc = dftTplRst["_doc"];
                 _doc["ID"] = treeNodeId;
-                _doc["GROUP_KEY"] = "";
+                _doc["GROUP_KEY"] = grpKey;
                 _doc["ID_KEY"] = "";
+                _doc[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = rptName;
                 let rptTpl = new RptTplModel(_doc);
                 rptTpl.save(function (err, actTplRst) {
                     if (err) {
                         callback(req,res, "报表模板创建错误", "", null);
                     } else {
                         //TreeNodeModel.update();
-                        TreeNodeModel.update({ID: treeNodeId}, {"refId": treeNodeId}, function(err, rst){
-                            if (err) {
-                                callback(req,res, "报表模板创建错误", "", null);
-                            } else {
+                        let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId, "items.ID": subNode.ID, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
+                        let updateStatement = {$set: {"items.$": subNode}};
+                        rttFacade.updateTreeInDetail(filter, updateStatement).then(function (rst) {
+                            if (rst) {
+                                //success
                                 callback(req,res, false, "", actTplRst);
+                            } else {
+                                //failed
+                                callback(req,res, true, "更新失败!", null);
                             }
                         });
                     }

+ 11 - 6
modules/reports/facade/rpt_tpl_tree_node_facade.js

@@ -33,6 +33,10 @@ async function updateTree(compilationId, engineerId, userId, doc) {
     return await rpt_tpl_tree_mdl.update(filter, doc);
 }
 
+async function updateTreeInDetail(filter, updateStatement) {
+    return await rpt_tpl_tree_mdl.update(filter, updateStatement);
+}
+
 async function removeTree(compilationId, engineerId, userId, cb) {
     let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
     return await rpt_tpl_tree_mdl.findAndModify(filter, [], { $set: { "isDeleted": true } }, {'new':true}, cb);
@@ -66,12 +70,13 @@ async function findTplTreeByOid(objectId) {
 
 
 let expObj = {
-    createNewTree:  createNewTree,
-    updateTree:     updateTree,
-    removeTree:     removeTree,
-    removeTreePhycically: removeTreePhycically,
-    findTplTree:    findTplTree,
-    findTplTreeByOid: findTplTreeByOid
+    createNewTree:          createNewTree,
+    updateTree:             updateTree,
+    updateTreeInDetail:     updateTreeInDetail,
+    removeTree:             removeTree,
+    removeTreePhycically:   removeTreePhycically,
+    findTplTree:            findTplTree,
+    findTplTreeByOid:       findTplTreeByOid
 };
 
 export {expObj as default};

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

@@ -20,6 +20,7 @@ let TreeNodeSchema = new Schema({
 
 let TplNodeSchema = new Schema({
     nodeType: Number,   //节点类型:树节点(枝) 或 模板节点(叶)
+    ID: Number,         //template节点ID,只有在nodeType是模板节点有效
     refId: Number,      //引用报表模板id (引用 collection: rpt_templates)
     name: String,       //显示名称
     items: []           //子节点

+ 3 - 0
modules/reports/routes/rpt_tpl_router.js

@@ -17,8 +17,11 @@ module.exports = function (app) {
 
     rptTplRouter.post('/createTreeRootNode', reportTplController.createTreeRootNode);
     rptTplRouter.post('/updateTreeRootNode', reportTplController.updateTreeRootNode);
+    rptTplRouter.post('/updateTopNodeName', reportTplController.updateTopNodeName);
+    rptTplRouter.post('/updateSubLevelOneNode', reportTplController.updateSubLevelOneNode);
     rptTplRouter.post('/removeTreeRootNode', reportTplController.removeTreeRootNode);
     rptTplRouter.post('/getRptTplTree', reportTplController.getRptTplTree);
+    rptTplRouter.post('/getNewNodeID', reportTplController.getNewNodeID);
     rptTplRouter.post('/updateRptTplNodes', reportTplController.updateTreeNodes);
     rptTplRouter.post('/deleteRptTplNodes', reportTplController.deleteRptTplNodes);
     rptTplRouter.post('/createDftRptTpl', reportTplController.createDftRptTpl);

+ 0 - 4
web/building_saas/fee_rates/fee_rate.html

@@ -165,8 +165,4 @@
 
 
 </body>
-
-<script src="/web/building_saas/glj/js/socket.io.slim.js"></script>
-<script src="/public/web/socket/connection.js"></script>
-<script src="/public/web/uuid.js"></script>
 </html>

+ 0 - 5
web/building_saas/glj/html/glj_index.html

@@ -119,8 +119,3 @@
         </div>
     </div>
 </div>
-<script type="text/javascript" src="/web/building_saas/glj/js/project_glj.js"></script>
-<script type="text/javascript" src="/web/building_saas/glj/js/composition.js"></script>
-<script type="text/javascript" src="/web/building_saas/glj/js/common_spread.js"></script>
-<script type="text/javascript" src="/web/building_saas/glj/js/composition_spread.js"></script>
-<script type="text/javascript" src="/web/building_saas/glj/js/project_glj_spread.js"></script>

+ 1 - 1
web/building_saas/glj/js/common_spread.js

@@ -70,7 +70,7 @@ CommonSpreadJs.prototype.getFieldColumn = function(field) {
             break;
         }
     }
-
+    result = parseInt(result);
     return result;
 };
 

+ 4 - 0
web/building_saas/glj/js/project_glj.js

@@ -305,6 +305,10 @@ function successTrigger(field, info) {
             socket.emit('dataNotify', JSON.stringify(info));
             console.log(info);
             break;
+        case 'supply':
+            // 供货方式更改成功后
+            projectGLJSpread.changeSupplyType(info);
+            break;
     }
     // 重新加载数据到缓存
     projectObj.project.projectGLJ.loadData();

+ 79 - 6
web/building_saas/glj/js/project_glj_spread.js

@@ -17,6 +17,9 @@ function ProjectGLJSpread() {
     this.firstMachineRow = -1;
     this.firstMixRatioRow = -1;
     this.successCallback = null;
+    this.supplyType = ['自行采购', '部分甲供', '完全甲供', '甲定乙供'];
+    // 工料机类型是混凝土、砂浆、配合比、机械(不包括机械组成物)时,供货方式列只读。
+    this.supplyReadonlyType = [GLJTypeConst.CONCRETE, GLJTypeConst.MORTAR, GLJTypeConst.MIX_RATIO, GLJTypeConst.GENERAL_MACHINE];
 }
 
 /**
@@ -25,7 +28,17 @@ function ProjectGLJSpread() {
  * @return {object}
  */
 ProjectGLJSpread.prototype.init = function () {
-
+    // 供货方式类型
+    let supplySelect = [];
+    for(let index in this.supplyType) {
+        supplySelect.push({
+            text: this.supplyType[index],
+            value: index
+        });
+    }
+    let selectBox = new GC.Spread.Sheets.CellTypes.ComboBox();
+    selectBox.items(supplySelect);
+    selectBox.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);
     let header = [
         {name: '编码', field: 'code', visible: true},
         {name: '名称', field: 'name', visible: true},
@@ -44,7 +57,7 @@ ProjectGLJSpread.prototype.init = function () {
             cellType: new GC.Spread.Sheets.CellTypes.CheckBox(),
             validator: 'boolean'
         },
-        {name: '供货方式', field: 'supply', visible: true},
+        {name: '供货方式', field: 'supply', visible: true, cellType: selectBox},
         {name: '甲供数量', field: 'supply_quantity', visible: true},
         {name: '交货方式', field: 'delivery', visible: true},
         {name: '送达地点', field: 'delivery_address', visible: true},
@@ -74,6 +87,7 @@ ProjectGLJSpread.prototype.init = function () {
     let basePriceColumn = this.sheetObj.getFieldColumn('unit_price.base_price');
     let adjustPriceColumn = this.sheetObj.getFieldColumn('adjust_price');
     let marketPriceColumn = this.sheetObj.getFieldColumn('unit_price.market_price');
+    let supplyColumn = this.sheetObj.getFieldColumn('supply');
 
     // 居中样式
     let centerStyleSetting = {hAlign: 1};
@@ -92,6 +106,7 @@ ProjectGLJSpread.prototype.init = function () {
     this.sheetObj.setColumnEditable(marketPriceColumn);
     this.sheetObj.setColumnEditable(isEvaluateColumn);
     this.sheetObj.setColumnEditable(isAdjustPriceColumn);
+    this.sheetObj.setColumnEditable(11);
     this.sheetObj.setData(sourceData);
     // 取消正在加载字符提示
     $("#project-glj > p").hide();
@@ -179,6 +194,12 @@ ProjectGLJSpread.prototype.updateProjectGLJField = function(info, callback) {
         }
     }
 
+    // 如果是供货方式则需要处理数据
+    if (field === 'supply') {
+        value = this.supplyType.indexOf(value);
+        extend.supply_quantity = this.getSupplyQuantity(value, activeSheet, info);
+    }
+
     extend = Object.keys(extend).length > 0 ?  JSON.stringify(extend) : '';
     $.ajax({
         url: '/glj/update',
@@ -220,9 +241,9 @@ ProjectGLJSpread.prototype.specialColumn = function (sourceData) {
     // 获取列号
     let isEvaluateColumn = this.sheetObj.getFieldColumn('is_evaluate');
     let marketPriceColumn = this.sheetObj.getFieldColumn('unit_price.market_price');
-
     let connectCodeColumn = this.sheetObj.getFieldColumn('connect_code');
     let consumptionColumn = this.sheetObj.getFieldColumn('consumption');
+    let supplyColumn = this.sheetObj.getFieldColumn('supply');
     let activeSheet = this.sheetObj.getSheet();
 
     for (let data of sourceData) {
@@ -230,20 +251,33 @@ ProjectGLJSpread.prototype.specialColumn = function (sourceData) {
         if (materialIdList.indexOf(data.unit_price.type) < 0) {
             let string = new GC.Spread.Sheets.CellTypes.Text();
             activeSheet.setCellType(rowCounter, isEvaluateColumn, string, GC.Spread.Sheets.SheetArea.viewport);
+
             // 锁定该单元格
-            activeSheet.getRange(rowCounter, isEvaluateColumn, 1, 1).locked(true);
+            activeSheet.getCell(rowCounter, isEvaluateColumn, GC.Spread.Sheets.SheetArea.viewport).locked(true);
             activeSheet.setValue(rowCounter, isEvaluateColumn, '');
         }
 
-        // 如果类型为混凝土、砂浆、配合比、机械,则市场单价不能修改
+        // 供货方式数据
+        let supplyIndex = parseInt(data.supply);
+        supplyIndex = isNaN(supplyIndex) ? 0 : supplyIndex;
+        let supplyText = this.supplyType[supplyIndex] !== undefined ? this.supplyType[supplyIndex] : '自行采购';
+        activeSheet.setValue(rowCounter, supplyColumn, supplyText);
+        if (this.supplyReadonlyType.indexOf(data.unit_price.type) >= 0) {
+            // 锁定该单元格
+            activeSheet.getCell(rowCounter, supplyColumn,  GC.Spread.Sheets.SheetArea.viewport).locked(true);
+        }
+
+        // 如果类型为混凝土、砂浆、配合比、机械,则市场单价和供货方式不能修改
         if (canNotChangeTypeId.indexOf(data.unit_price.type) >= 0) {
             this.firstMixRatioRow = this.firstMixRatioRow === -1 && data.unit_price.type !== GLJTypeConst.GENERAL_MACHINE ?
                 rowCounter : this.firstMixRatioRow;
             this.firstMachineRow = this.firstMachineRow === -1 && data.unit_price.type === GLJTypeConst.GENERAL_MACHINE ?
                 rowCounter : this.firstMachineRow;
             // 锁定该单元格
-            activeSheet.getRange(rowCounter, marketPriceColumn, 1, 1).locked(true);
+            activeSheet.getCell(rowCounter, marketPriceColumn,  GC.Spread.Sheets.SheetArea.viewport).locked(true);
+            activeSheet.getCell(rowCounter, supplyColumn,  GC.Spread.Sheets.SheetArea.viewport).locked(true);
         }
+
         // 处理数据
         if (data.ratio_data !== undefined && data.ratio_data.length > 0) {
             let connectCode = [];
@@ -257,6 +291,7 @@ ProjectGLJSpread.prototype.specialColumn = function (sourceData) {
             activeSheet.setValue(rowCounter, connectCodeColumn, connectCodeString);
             activeSheet.setValue(rowCounter, consumptionColumn, consumptionString);
         }
+
         rowCounter++;
     }
 };
@@ -377,4 +412,42 @@ ProjectGLJSpread.prototype.priceCalculate = function(info) {
             this.compositionParentUpdate(info.parentMarketPrice);
             break;
     }
+};
+
+/**
+ * 更改供货方式
+ *
+ * @param {Object} info
+ * @return {void}
+ */
+ProjectGLJSpread.prototype.changeSupplyType = function(info) {
+    let supply = info.newValue;
+    let supplyNumber = this.supplyType.indexOf(supply) > -1 ? this.supplyType.indexOf(supply) : 0;
+    let supplyQuantityColumn = this.sheetObj.getFieldColumn('supply_quantity');
+    let activeSheet = this.sheetObj.getSheet();
+
+    // 部分甲供时可更改甲供数量数据,其余则只读
+    let locked = supplyNumber === 1 ? false : true;
+    activeSheet.getCell(info.row, supplyQuantityColumn,  GC.Spread.Sheets.SheetArea.viewport).locked(locked);
+
+    let supplyQuantity = this.getSupplyQuantity(supplyNumber, activeSheet, info);
+    activeSheet.setValue(info.row, supplyQuantityColumn, supplyQuantity);
+};
+
+/**
+ * 根据供货方式获取甲供数量
+ *
+ * @param {Number} supplyType
+ * @param {Object} activeSheet
+ * @param {Object} info
+ * @return {Number}
+ */
+ProjectGLJSpread.prototype.getSupplyQuantity = function(supplyType, activeSheet, info) {
+    let quantityColumn = this.sheetObj.getFieldColumn('quantity');
+    // 获取总消耗量
+    let quantity = activeSheet.getValue(info.row, quantityColumn);
+    // 自行采购和甲定乙供则把甲供数量设置为0,其余情况则设置为当前总消耗量
+    let supplyQuantity = supplyType === 0 || supplyType === 3 ? 0 : quantity;
+
+    return supplyQuantity;
 };

+ 0 - 3
web/building_saas/main/html/calc_program_manage.html

@@ -87,8 +87,5 @@
     </div>
 </body>
 
-<script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
-<script type="text/javascript" src="/web/building_saas/main/js/models/calc_program.js"></script>
-<script type="text/javascript" src="/web/building_saas/main/js/views/calc_program_manage.js"></script>
 
 </html>

+ 38 - 19
web/building_saas/main/html/main.html

@@ -6,6 +6,7 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <title>造价书-Smartcost</title>
+    <!-- inject:css -->
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
@@ -16,6 +17,7 @@
     <link rel="stylesheet" href="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.css">
     <!-- jquery.contextmenu -->
     <link rel="stylesheet" href="/lib/jquery-contextmenu/jquery.contextMenu.css" type="text/css">
+    <!-- endinject -->
     <script>
         // 这里的变量供页面调用
         var userAccount = '<%- userAccount %>';
@@ -556,13 +558,40 @@
         </div>
     </div>
     <!-- JS. -->
+    <script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
+    <script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
+    <script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
+
+    <script src="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.min.js" type="text/javascript"></script>
+    <!--<script src="/lib/spreadjs/views/common/gc.spread.common.10.0.0.min.js" type="text/javascript"></script>-->
+    <script src="/lib/spreadjs/views/plugins/gc.spread.views.gridlayout.10.0.0.min.js" type="text/javascript"></script>
+    <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
+    <script>GC.Spread.Views.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
+
+
+
+    <!-- inject:js -->
+
+    <script type="text/javascript" src="/web/building_saas/glj/js/project_glj.js"></script>
+    <script type="text/javascript" src="/web/building_saas/glj/js/composition.js"></script>
+    <script type="text/javascript" src="/web/building_saas/glj/js/common_spread.js"></script>
+    <script type="text/javascript" src="/web/building_saas/glj/js/composition_spread.js"></script>
+    <script type="text/javascript" src="/web/building_saas/glj/js/project_glj_spread.js"></script>
+
+    <script src="/web/building_saas/glj/js/socket.io.slim.js"></script>
+    <script src="/public/web/socket/connection.js"></script>
+    <script src="/public/web/uuid.js"></script>
+
+    <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/models/calc_program.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/views/calc_program_manage.js"></script>
+
+    <!-- JS. -->
     <script src="/lib/jquery/jquery.min.js"></script>
     <script src="/lib/tether/tether.min.js"></script>
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script src="/web/building_saas/js/global.js"></script>
-    <script type="text/javascript">
-        autoFlashHeight();
-    </script>
+
     <!--expression calculate-->
     <script src="/lib/JSExpressionEval_src/Date.js"></script>
     <script src="/lib/JSExpressionEval_src/Stack.js"></script>
@@ -578,15 +607,9 @@
     <script type="text/javascript" src="/public/web/number_util.js"></script>
     <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
     <!--报表 zTree -->
-    <script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
-    <script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
+
     <!-- SpreadJs -->
-    <script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
-    <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
-    <script src="/lib/spreadjs/views/gc.spread.views.dataview.10.0.0.min.js" type="text/javascript"></script>
-    <!--<script src="/lib/spreadjs/views/common/gc.spread.common.10.0.0.min.js" type="text/javascript"></script>-->
-    <script src="/lib/spreadjs/views/plugins/gc.spread.views.gridlayout.10.0.0.min.js" type="text/javascript"></script>
-    <script>GC.Spread.Views.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
+
     <!--<script src="/lib/spreadjs/views/locale/gc.spread.views.dataview.locale.zh-CN.10.0.0.min.js" type="text/javascript"></script>-->
     <!-- Model -->
     <script type="text/javascript" src="/web/building_saas/main/js/models/main_consts.js"></script>
@@ -602,7 +625,7 @@
     <script type="text/javascript" src="/web/building_saas/main/js/models/volume_price.js"></script>
 
     <script type="text/javascript" src="/public/web/id_tree.js"></script>
-	<script type="text/javascript" src="/test/tmp_data/test_ration_calc/ration_calc_base.js"></script>
+    <script type="text/javascript" src="/test/tmp_data/test_ration_calc/ration_calc_base.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/cache_tree.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/calc/calc_fees.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/calc/ration_calc.js"></script>
@@ -639,16 +662,12 @@
     <script type="text/javascript" src="/web/building_saas/main/js/views/fee_rate_view.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/sub_fee_rate_views.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/project_property_labour_coe_view.js"></script>
+    <!-- endinject -->
 
-
-   <!-- <script src="/web/building_saas/fee_rates/fee_rate.js"></script>-->
     <script type="text/javascript">
-        /* autoFlashHeight();
-        loadStdFeeRateLibNames(region);*/
-        //loadProjectFeeRates(feeRateFileID);
+        autoFlashHeight();
     </script>
-
-
+    
     <script src="/public/debug.js"></script>
 
     <SCRIPT type="text/javascript">

+ 1 - 1
web/building_saas/main/js/models/calc_program.js

@@ -3615,6 +3615,6 @@ class CalcProgram {
     calculate(treeNode){
         treeNode.data.gljList = this.project.ration_glj.getGljArrByRation(treeNode.data.ID);
         this.calc.calculate(treeNode);
-        projectObj.mainController.showTreeData();
+        projectObj.mainController.refreshTreeNode([treeNode]);
     };
 }

+ 1 - 11
web/building_saas/main/js/views/calc_program_view.js

@@ -171,17 +171,7 @@ let calcProgramSetting ={
                 "field":"type",
                 "vAlign":1,
                 "hAlign":0,
-                "font":"Arial",
-                "getText": function (record) {
-                    if (record.type) {
-                        for (let ft of feeType) {
-                            if (ft.type === record.type) {
-                                return ft.name;
-                            }
-                        }
-                    }
-                    return '';
-                }
+                "font":"Arial"
             }
         },
         {

+ 4 - 111
web/building_saas/pm/html/project-management.html

@@ -6,11 +6,13 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <title>项目管理-Smartcost</title>
+    <!-- inject:css -->
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
     <!--zTree-->
     <link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
+    <!-- endinject -->
 
     <script>
         // 这里的变量供页面调用
@@ -493,6 +495,7 @@
     </div>
 </div>
 <!-- JS. -->
+<!-- inject:js -->
 <script src="/lib/jquery/jquery.min.js"></script>
 <script src="/lib/tether/tether.min.js"></script>
 <script src="/lib/bootstrap/bootstrap.min.js"></script>
@@ -505,118 +508,8 @@
 <!-- zTree -->
 <script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
 <script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
-<SCRIPT type="text/javascript">
-    <!--
-    var setting = {	};
+<!-- endinject -->
 
-    var zNodes =[
-        { name:"父节点1 - 展开", open:true,
-            children: [
-                { name:"父节点11 - 折叠",
-                    children: [
-                        { name:"叶子节点111"},
-                        { name:"叶子节点112"},
-                        { name:"叶子节点113"},
-                        { name:"叶子节点114"}
-                    ]},
-                { name:"父节点12 - 折叠",
-                    children: [
-                        { name:"叶子节点121"},
-                        { name:"叶子节点122"},
-                        { name:"叶子节点123"},
-                        { name:"叶子节点124"}
-                    ]},
-                { name:"父节点13 - 没有子节点", isParent:true}
-            ]},
-        { name:"父节点2 - 折叠",
-            children: [
-                { name:"父节点21 - 展开", open:true,
-                    children: [
-                        { name:"叶子节点211"},
-                        { name:"叶子节点212"},
-                        { name:"叶子节点213"},
-                        { name:"叶子节点214"}
-                    ]},
-                { name:"父节点22 - 折叠",
-                    children: [
-                        { name:"叶子节点221"},
-                        { name:"叶子节点222"},
-                        { name:"叶子节点223"},
-                        { name:"叶子节点224"}
-                    ]},
-                { name:"父节点23 - 折叠",
-                    children: [
-                        { name:"叶子节点231"},
-                        { name:"叶子节点232"},
-                        { name:"叶子节点233"},
-                        { name:"叶子节点234"}
-                    ]}
-            ]},
-        { name:"父节点3 - 没有子节点", isParent:true}
-
-    ];
-
-    $(document).ready(function(){
-        $.fn.zTree.init($("#treeDemo"), setting, zNodes);
-    });
-    //-->
-</SCRIPT>
-<SCRIPT type="text/javascript">
-    <!--
-    var setting = {	};
-
-    var zNodes =[
-        { name:"父节点1 - 展开", open:true,
-            children: [
-                { name:"父节点11 - 折叠",
-                    children: [
-                        { name:"叶子节点111"},
-                        { name:"叶子节点112"},
-                        { name:"叶子节点113"},
-                        { name:"叶子节点114"}
-                    ]},
-                { name:"父节点12 - 折叠",
-                    children: [
-                        { name:"叶子节点121"},
-                        { name:"叶子节点122"},
-                        { name:"叶子节点123"},
-                        { name:"叶子节点124"}
-                    ]},
-                { name:"父节点13 - 没有子节点", isParent:true}
-            ]},
-        { name:"父节点2 - 折叠",
-            children: [
-                { name:"父节点21 - 展开", open:true,
-                    children: [
-                        { name:"叶子节点211"},
-                        { name:"叶子节点212"},
-                        { name:"叶子节点213"},
-                        { name:"叶子节点214"}
-                    ]},
-                { name:"父节点22 - 折叠",
-                    children: [
-                        { name:"叶子节点221"},
-                        { name:"叶子节点222"},
-                        { name:"叶子节点223"},
-                        { name:"叶子节点224"}
-                    ]},
-                { name:"父节点23 - 折叠",
-                    children: [
-                        { name:"叶子节点231"},
-                        { name:"叶子节点232"},
-                        { name:"叶子节点233"},
-                        { name:"叶子节点234"}
-                    ]}
-            ]},
-        { name:"父节点3 - 没有子节点", isParent:true}
-
-    ];
-
-    $(document).ready(function(){
-        $.fn.zTree.init($("#treeDemo2"), setting, zNodes);
-    });
-    //-->
-</SCRIPT>
 </body>
 <script type="text/javascript">
     autoFlashHeight();

+ 3 - 1
web/common/html/header.html

@@ -57,6 +57,8 @@
         </div>
     </div>
 </div>
+<!-- inject:js -->
 <script src="/lib/jquery/jquery.min.js"></script>
 <script type="text/javascript" src="/web/building_saas/js/moment.min.js"></script>
-<script type="text/javascript" src="/web/building_saas/js/message.js"></script>
+<script type="text/javascript" src="/web/building_saas/js/message.js"></script>
+<!-- endinject -->

+ 6 - 3
web/users/html/login.html

@@ -5,11 +5,11 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <title>用户登录-Smartcost</title>
+    <!-- inject:css -->
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
-    <script src="/lib/jquery/jquery.min.js"></script>
-    <script src="/public/web/url_util.js"></script>
+    <!-- endinject -->
 </head>
 <body>
     <div class="container">
@@ -69,10 +69,13 @@
         </div>
     </div>
     <!-- JS. -->
-
+    <!-- inject:js -->
+    <script src="/lib/jquery/jquery.min.js"></script>
+    <script src="/public/web/url_util.js"></script>
     <script src="/lib/tether/tether.min.js"></script>
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script src="/web/building_saas/js/global.js"></script>
+    <!-- endinject -->
 </body>
 
 </html>