Browse Source

1.前后端共用fixedFlag配置
2.导出接口处理项目清单对应标准清单中的工程专业

vian 5 years ago
parent
commit
e9428b4462

+ 10 - 0
modules/bills_lib/controllers/bills_lib_controllers.js

@@ -245,6 +245,16 @@ module.exports = {
         billsLibDao.getStdBillsByCode(data, function (err, message, data) {
             callback(req, res, err, message, data)
         });
+    },
+    getBillsByQueries: async function (req, res) {
+        try {
+            const { queries, occupancy } = JSON.parse(req.body.data);
+            const data = await billsLibDao.getBillsByQueries(queries, occupancy);
+            callback(req, res, 0, 'success', data);
+        } catch (err) {
+            callback(req, res, 1, String(err), null);
+        }
+        
     }
 }
 

+ 3 - 0
modules/bills_lib/controllers/bills_permissionController.js

@@ -56,6 +56,9 @@ class billsPermContr extends baseController{
     getStdBillsByCode(req, res) {
         billsController.getStdBillsByCode(req, res);
     }
+    getBillsByQueries(req, res) {
+        billsController.getBillsByQueries(req, res);
+    }
 
 }
 

+ 9 - 0
modules/bills_lib/models/bills_lib_interfaces.js

@@ -3215,5 +3215,14 @@ billsLibDao.prototype.getStdBillsByCodet = function (data, callback) {
     });
 };
 
+billsLibDao.prototype.getBillsByQueries = async function (queries, occupancy) {
+    const task = queries.map(query => Bills.find(query, occupancy));
+    const results = await Promise.all(task);
+    const rst = results.reduce((acc, result) => {
+        acc.push(...result);
+        return acc;
+    }, []);
+    return rst;
+}
 
 module.exports = new billsLibDao();

+ 1 - 0
modules/bills_lib/routes/bills_lib_routes.js

@@ -66,6 +66,7 @@ module.exports =function (app) {
     billsRouter.post("/edUpdateItem", itemsContr.init, itemsContr.edUpdateItem);
 
     billsRouter.post('/getStdBillsByCode', billsContr.init, billsContr.getStdBillsByCode);
+    billsRouter.post('/getBillsByQueries', billsContr.init, billsContr.getBillsByQueries);
 
     app.use("/stdBillsEditor", billsRouter);
 

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

@@ -1,82 +0,0 @@
-/**
- * Created by Zhong on 2017/12/18.
- */
-const fixedFlag = {
-    // 分部分项工程
-    SUB_ENGINERRING: 1,
-    // 措施项目
-    MEASURE: 2,
-    // 施工技术措施项目
-    CONSTRUCTION_TECH: 3,
-    // 安全文明施工按实计算费用
-    SAFETY_CONSTRUCTION_ACTUAL: 4,
-    // 施工组织措施专项费用
-    CONSTRUCTION_ORGANIZATION: 5,
-    // 安全文明施工专项费用
-    SAFETY_CONSTRUCTION: 6,
-    // 其他项目
-    OTHER: 7,
-    // 暂列金额
-    PROVISIONAL: 8,
-    // 暂估价
-    ESTIMATE: 9,
-    // 材料(工程设备)暂估价
-    MATERIAL_PROVISIONAL: 10,
-    // 专业工程暂估价
-    ENGINEERING_ESITIMATE: 11,
-    // 计日工
-    DAYWORK: 12,
-    // 总承包服务费
-    TURN_KEY_CONTRACT: 13,
-    // 索赔与现场签证
-    CLAIM_VISA: 14,
-    // 规费
-    CHARGE: 15,
-    // 社会保险费及住房公积金 Social insurance fee and housing accumulation fund
-    SOCIAL_INSURANCE_HOUSING_FUND: 16,
-    // 工程排污费 charges for disposing pollutants
-    POLLUTANTS: 17,
-    // 税金
-    TAX: 18,
-    //工程造价
-    ENGINEERINGCOST: 19,
-    //增值税
-    ADDED_VALUE_TAX: 20,
-    //专项技术措施暂估价
-    SPECIAL_TECH_PROVISIONAL: 21,
-    //专业发包工程管理费
-    LET_CONTRACT_MANAGEMENT: 22,
-    //人工
-    LABOUR: 23,
-    //材料
-    MATERIAL: 24,
-    //施工机械
-    MACHINE: 25,
-    //索赔
-    CLAIM: 26,
-    //现场签证
-    VISA: 27,
-    ADDITIONAL_TAX: 28,
-    //环境保护税
-    ENVIRONMENTAL_PROTECTION_TAX: 29,
-    //建设工程竣工档案编制费
-    PROJECT_COMPLETE_ARCH_FEE:30,
-    //住宅工程质量分户验收费
-    HOUSE_QUALITY_ACCEPT_FEE:31,
-    //组织措施费
-    ORGANIZATION:32,
-    //其他措施费
-    OTHER_MEASURE_FEE:33,
-    // 绿色施工安全防护措施费
-    GREEN_MEASURE_FEE: 34,
-    // 预算包干费
-    BUDGET_INCLUDE_WORK_FEE: 35,
-    // 工程优质费
-    PROJECT_HIGH_QUALITY_FEE: 36,
-    // 概算幅度差
-    BUDGET_ESTIMATE_DIFF: 37,
-    // 其他费用(与其他项目不同,参考广东的用法)
-    OTHER_FEE: 38
-};
-
-export default fixedFlag;

+ 1 - 1
modules/main/controllers/bills_controller.js

@@ -12,7 +12,7 @@ let raiton_facade = require("../facade/ration_facade");
 let stdBillsModel = mongoose.model('std_bills_lib_bills');
 let stdBillJobsModel = mongoose.model('std_bills_lib_jobContent');
 let stdBillCharacterModel = mongoose.model('std_bills_lib_itemCharacter');
-import fixedFlag from  '../../common/const/bills_fixed';
+const { fixedFlag } = require('../../../public/common_constants');
 let LZString = require('lz-string');
 const uuidV1 = require('uuid/v1');
 const billType ={

+ 1 - 1
modules/main/facade/project_facade.js

@@ -41,7 +41,7 @@ let engineerFeatureLib = mongoose.model('std_engineer_feature_lib');
 let engineerInfoLib = mongoose.model('std_engineer_info_lib');
 let mainQuantityLib = mongoose.model('std_main_quantity_lib');
 let materialLib = mongoose.model('std_material_lib');
-import fixedFlag from '../../common/const/bills_fixed';
+const { fixedFlag } = require('../../../public/common_constants');
 const scMathUtil = require('../../../public/scMathUtil').getUtil();
 const billsLibDao = require("../../bills_lib/models/bills_lib_interfaces");
 

+ 1 - 1
modules/main/models/bills.js

@@ -14,7 +14,7 @@ let rationGljModel = mongoose.model('ration_glj');
 let rationCoeModel = mongoose.model('ration_coe');
 let rationInstModel = mongoose.model('ration_installation');
 let quantityDelModel = mongoose.model('quantity_detail');
-const fixedFlag = require('../../common/const/bills_fixed');
+const { fixedFlag } = require('../../../public/common_constants');
 
 let bills = mongoose.model("bills");
 let baseModel = require('./base_model');

+ 11 - 7
modules/pm/controllers/pm_controller.js

@@ -87,13 +87,17 @@ module.exports = {
     },
     updateProjects: async function (req, res) {
         let data = JSON.parse(req.body.data);
-        await ProjectsData.updateUserProjects(req.session.sessionUser.id, req.session.sessionCompilation._id, req.session.sessionCompilation.name, req.session.sessionCompilation.overWriteUrl, data.updateData, function (err, message, data) {
-            if (err === 0) {
-                callback(req, res, err, message, data);
-            } else {
-                callback(req, res, err, message, null);
-            }
-        });
+        try {
+            await ProjectsData.updateUserProjects(req.session.sessionUser.id, req.session.sessionCompilation._id, req.session.sessionCompilation.name, req.session.sessionCompilation.overWriteUrl, data.updateData, function (err, message, data) {
+                if (err === 0) {
+                    callback(req, res, err, message, data);
+                } else {
+                    callback(req, res, 1, message, null);
+                }
+            });
+        } catch (err) {
+            callback(req, res, 1, String(err), null);
+        }
     },
     // CSL, 2017-12-14 该方法用于项目属性:提交保存混合型数据,这些数据来自不同的表,包括projects.property、ration、bills、labour_coes.
     updateMixDatas: async function (req, res) {

+ 26 - 26
modules/pm/facade/pm_facade.js

@@ -105,7 +105,7 @@ import SectionTreeDao from '../../complementary_ration_lib/models/sectionTreeMod
 let sectionTreeDao = new SectionTreeDao();
 import CounterModel from "../../glj/models/counter_model";
 import moment from 'moment-timezone';
-import billsFlags from '../../common/const/bills_fixed';
+const { fixedFlag } = require('../../../public/common_constants');
 const notDeleted = [{deleteInfo: null}, {'deleteInfo.deleted': false}];
 import {
     defaultDecimal,
@@ -1046,13 +1046,13 @@ async function getTendersFeeInfo(tenders) {
     let IDMapping = {};
     //固定清单类别与汇总金额字段映射
     let flagFieldMapping = {};
-    flagFieldMapping[billsFlags.ENGINEERINGCOST] = 'engineeringCost';
-    flagFieldMapping[billsFlags.SUB_ENGINERRING] = 'subEngineering';
-    flagFieldMapping[billsFlags.MEASURE] = 'measure';
-    flagFieldMapping[billsFlags.SAFETY_CONSTRUCTION] = 'safetyConstruction';
-    flagFieldMapping[billsFlags.OTHER] = 'other';
-    flagFieldMapping[billsFlags.CHARGE] = 'charge';
-    flagFieldMapping[billsFlags.TAX] = 'tax';
+    flagFieldMapping[fixedFlag.ENGINEERINGCOST] = 'engineeringCost';
+    flagFieldMapping[fixedFlag.SUB_ENGINERRING] = 'subEngineering';
+    flagFieldMapping[fixedFlag.MEASURE] = 'measure';
+    flagFieldMapping[fixedFlag.SAFETY_CONSTRUCTION] = 'safetyConstruction';
+    flagFieldMapping[fixedFlag.OTHER] = 'other';
+    flagFieldMapping[fixedFlag.CHARGE] = 'charge';
+    flagFieldMapping[fixedFlag.TAX] = 'tax';
     let tenderIDs = [];
     if(tenders.length > 0){
         for(let tender of tenders){
@@ -1061,8 +1061,8 @@ async function getTendersFeeInfo(tenders) {
             IDMapping[tender.ID]['buildingArea'] = '';
         }
         //需要获取的清单固定类别综合合价:工程造价、分部分项、措施项目、安全文明施工专项、规费、其他项目、税金
-        let needFlags = [billsFlags.ENGINEERINGCOST, billsFlags.SUB_ENGINERRING, billsFlags.MEASURE,
-            billsFlags.SAFETY_CONSTRUCTION, billsFlags.CHARGE, billsFlags.OTHER, billsFlags.TAX];
+        let needFlags = [fixedFlag.ENGINEERINGCOST, fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE,
+            fixedFlag.SAFETY_CONSTRUCTION, fixedFlag.CHARGE, fixedFlag.OTHER, fixedFlag.TAX];
         //获取单位工程汇总金额需要用到的所有清单
         let allBills = await billsModel.find({projectID: {$in: tenderIDs}, 'flags.flag': {$in: needFlags}, $or: notDeleted},
             '-_id projectID fees flags');
@@ -1072,7 +1072,7 @@ async function getTendersFeeInfo(tenders) {
             let costField = flagFieldMapping[billsFlag];
             IDMapping[bills.projectID][costField] = getTotalFee(bills, 'common');
             //暂估合价(工程造价暂估合价)
-            if (billsFlag === billsFlags.ENGINEERINGCOST){
+            if (billsFlag === fixedFlag.ENGINEERINGCOST){
                 IDMapping[bills.projectID]['estimate'] = getTotalFee(bills, 'estimate');
             }
         }
@@ -1088,28 +1088,28 @@ async function getTendersFeeInfo(tenders) {
 }
 
 const defaultSummaryField = {
-    [billsFlags.ENGINEERINGCOST]: {
+    [fixedFlag.ENGINEERINGCOST]: {
         items: [
             { name: 'engineeringCost', feeName: 'common' },
             { name: 'estimate', feeName: 'estimate' }
         ]
     },
-    [billsFlags.SUB_ENGINERRING]: {
+    [fixedFlag.SUB_ENGINERRING]: {
         items: [{ name: 'subEngineering', feeName: 'common' }]
     },
-    [billsFlags.MEASURE]: {
+    [fixedFlag.MEASURE]: {
         items: [{ name: 'measure', feeName: 'common' }]
     },
-    [billsFlags.SAFETY_CONSTRUCTION]: {
+    [fixedFlag.SAFETY_CONSTRUCTION]: {
         items: [{ name: 'safetyConstruction', feeName: 'common' }]
     },
-    [billsFlags.OTHER]: {
+    [fixedFlag.OTHER]: {
         items: [{ name: 'other', feeName: 'common' }]
     },
-    [billsFlags.CHARGE]: {
+    [fixedFlag.CHARGE]: {
         items: [{ name: 'charge', feeName: 'common' }]
     },
-    [billsFlags.TAX]: {
+    [fixedFlag.TAX]: {
         items: [{ name: 'tax', feeName: 'common' }]
     }
 };
@@ -1260,13 +1260,13 @@ async function getSummaryInfo(projectIDs, summaryField = defaultSummaryField){
     }
     if (!feeFields) {
         feeFields = [
-            {k: billsFlags.ENGINEERINGCOST, v: 'engineeringCost'},
-            {k: billsFlags.SUB_ENGINERRING, v: 'subEngineering'},
-            {k: billsFlags.MEASURE, v: 'measure'},
-            {k: billsFlags.SAFETY_CONSTRUCTION, v: 'safetyConstruction'},
-            {k: billsFlags.OTHER, v: 'other'},
-            {k: billsFlags.CHARGE, v: 'charge'},
-            {k: billsFlags.TAX, v: 'tax'}
+            {k: fixedFlag.ENGINEERINGCOST, v: 'engineeringCost'},
+            {k: fixedFlag.SUB_ENGINERRING, v: 'subEngineering'},
+            {k: fixedFlag.MEASURE, v: 'measure'},
+            {k: fixedFlag.SAFETY_CONSTRUCTION, v: 'safetyConstruction'},
+            {k: fixedFlag.OTHER, v: 'other'},
+            {k: fixedFlag.CHARGE, v: 'charge'},
+            {k: fixedFlag.TAX, v: 'tax'}
         ];
     }
     // 项目总造价的各个费用,k为汇总的字段,v为工程造价的费用字段
@@ -1336,7 +1336,7 @@ async function getSummaryInfo(projectIDs, summaryField = defaultSummaryField){
             let costField = flagFieldMapping[billsFlag];
             IDMapping[bills.projectID][costField] = getTotalFee(bills, 'common');
             // 工程造价各费用
-            if (billsFlag === billsFlags.ENGINEERINGCOST){
+            if (billsFlag === fixedFlag.ENGINEERINGCOST){
                 engineeringCostFields.forEach(({k, v}) => {
                     IDMapping[bills.projectID][k] = getTotalFee(bills, v);
                 });

+ 56 - 61
modules/pm/models/project_model.js

@@ -32,7 +32,7 @@ import {
     G_FILE_VER
 } from './project_property_template';
 import optionSetting from '../../options/models/optionTypes';
-import fixedFlag from '../../common/const/bills_fixed';
+const { fixedFlag } = require('../../../public/common_constants');
 let FeeRateFiles = mongoose.model('fee_rate_file');
 let counter = require("../../../public/counter/counter.js");
 
@@ -236,75 +236,70 @@ ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId
                 data.updateData['deleteInfo'] = deleteInfo;
                 //Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
                 //update
-                try {
-                    if (data.updateData.projType === projectType.project) {
-                        let engineerings = await Projects.find({userID: userId, ParentID: data.updateData.ID});
-                        let isExist = false;
-                        if (engineerings.length > 0) {
-                            for (let j = 0, jLen = engineerings.length; j < jLen; j++) {
-                                let e_tenders = await Projects.find({userID: userId, ParentID: engineerings[j].ID});
-                                if (e_tenders.length > 0) {
-                                    isExist = true;
-                                    break;
-                                }
+                if (data.updateData.projType === projectType.project) {
+                    let engineerings = await Projects.find({ userID: userId, ParentID: data.updateData.ID });
+                    let isExist = false;
+                    if (engineerings.length > 0) {
+                        for (let j = 0, jLen = engineerings.length; j < jLen; j++) {
+                            let e_tenders = await Projects.find({ userID: userId, ParentID: engineerings[j].ID });
+                            if (e_tenders.length > 0) {
+                                isExist = true;
+                                break;
                             }
                         }
-                        if (isExist) {//fake
-                            await UnitPriceFiles.update({
-                                user_id: userId,
-                                root_project_id: data.updateData.ID
-                            }, {$set: {deleteInfo: deleteInfo}}, {multi: true});
-                            await FeeRateFiles.update({
-                                userID: userId,
-                                rootProjectID: data.updateData.ID
-                            }, {$set: {deleteInfo: deleteInfo}}, {multi: true});
-                            await Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
-                        }
-                        else {//true
-                            await UnitPriceFiles.remove({user_id: userId, root_project_id: data.updateData.ID});
-                            await FeeRateFiles.remove({userID: userId, rootProjectID: data.updateData.ID});
-                            //await Projects.update({userID: userId, NextSiblingID: data.updateData.ID, deleteInfo: null}, {$set: {NextSiblingID: data.NextSiblingID}});
-                            await Projects.remove({userID: userId, ID: data.updateData.ID}, updateAll);
-                        }
                     }
-                    else if (data.updateData.projType === projectType.engineering) {
-                        let tenders = await Projects.find({userID: userId, ParentID: data.updateData.ID});
-                        if (tenders.length > 0) {//fake
-                            await Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
+                    if (isExist) {//fake
+                        await UnitPriceFiles.update({
+                            user_id: userId,
+                            root_project_id: data.updateData.ID
+                        }, { $set: { deleteInfo: deleteInfo } }, { multi: true });
+                        await FeeRateFiles.update({
+                            userID: userId,
+                            rootProjectID: data.updateData.ID
+                        }, { $set: { deleteInfo: deleteInfo } }, { multi: true });
+                        await Projects.update({ userID: userId, ID: data.updateData.ID }, data.updateData, updateAll);
+                    }
+                    else {//true
+                        await UnitPriceFiles.remove({ user_id: userId, root_project_id: data.updateData.ID });
+                        await FeeRateFiles.remove({ userID: userId, rootProjectID: data.updateData.ID });
+                        //await Projects.update({userID: userId, NextSiblingID: data.updateData.ID, deleteInfo: null}, {$set: {NextSiblingID: data.NextSiblingID}});
+                        await Projects.remove({ userID: userId, ID: data.updateData.ID }, updateAll);
+                    }
+                }
+                else if (data.updateData.projType === projectType.engineering) {
+                    let tenders = await Projects.find({ userID: userId, ParentID: data.updateData.ID });
+                    if (tenders.length > 0) {//fake
+                        await Projects.update({ userID: userId, ID: data.updateData.ID }, data.updateData, updateAll);
+                    }
+                    else {//true
+                        //await Projects.update({userID: userId, NextSiblingID: data.updateData.ID, deleteInfo: null}, {$set: {NextSiblingID: data.NextSiblingID}});
+                        await Projects.remove({ userID: userId, ID: data.updateData.ID }, updateAll);
+                    }
+                }
+                else if (data.updateData.projType === projectType.tender) {//fake
+                    let delTender = await Projects.findOne({ userID: userId, ID: data.updateData.ID });
+                    //如果这个单位工程用到的费率文件、单价文件,没有被其他的单位工程使用,则应该一起跟随删除
+                    if (delTender) {
+                        let unitPriceFile = delTender.property.unitPriceFile;
+                        let feeRateFile = delTender.property.feeFile;
+                        let usedUFTenders = await Projects.find(
+                            { userID: userId, $or: [{ deleteInfo: null }, { 'deleteInfo.deleted': false }], 'property.unitPriceFile.id': unitPriceFile.id });
+                        if (usedUFTenders.length === 1) {
+                            await UnitPriceFiles.update({ id: unitPriceFile.id }, { $set: { deleteInfo: deleteInfo } });
                         }
-                        else {//true
-                            //await Projects.update({userID: userId, NextSiblingID: data.updateData.ID, deleteInfo: null}, {$set: {NextSiblingID: data.NextSiblingID}});
-                            await Projects.remove({userID: userId, ID: data.updateData.ID}, updateAll);
+                        let usedFRTenders = await Projects.find(
+                            { userID: userId, $or: [{ deleteInfo: null }, { 'deleteInfo.deleted': false }], 'property.feeFile.id': feeRateFile.id });
+                        if (usedFRTenders.length === 1) {
+                            await FeeRateFiles.update({ ID: feeRateFile.id }, { $set: { deleteInfo: deleteInfo } });
                         }
+                        await Projects.update({ userID: userId, ID: data.updateData.ID }, data.updateData, updateAll);
                     }
-                    else if (data.updateData.projType === projectType.tender) {//fake
-                        let delTender = await Projects.findOne({userID: userId, ID: data.updateData.ID});
-                        //如果这个单位工程用到的费率文件、单价文件,没有被其他的单位工程使用,则应该一起跟随删除
-                        if(delTender){
-                            let unitPriceFile = delTender.property.unitPriceFile;
-                            let feeRateFile = delTender.property.feeFile;
-                            let usedUFTenders = await Projects.find(
-                                {userID: userId, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], 'property.unitPriceFile.id': unitPriceFile.id});
-                            if(usedUFTenders.length === 1){
-                                await UnitPriceFiles.update({id: unitPriceFile.id}, {$set: {deleteInfo: deleteInfo}});
-                            }
-                            let usedFRTenders = await Projects.find(
-                                {userID: userId, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], 'property.feeFile.id': feeRateFile.id});
-                            if(usedFRTenders.length === 1){
-                                await FeeRateFiles.update({ID: feeRateFile.id}, {$set: {deleteInfo: deleteInfo}});
-                            }
-                            await Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
-                        }
 
-                    }
-                    else if (data.updateData.projType === projectType.folder) {//true
-                        await Projects.remove({userID: userId, ID: data.updateData.ID}, updateAll);
-                    }
-                    else throw '未知文件类型,删除失败!';
                 }
-                catch (error) {
-                    callback(1, error, null);
+                else if (data.updateData.projType === projectType.folder) {//true
+                    await Projects.remove({ userID: userId, ID: data.updateData.ID }, updateAll);
                 }
+                else throw '未知文件类型,删除失败!';
             }
             else {
                 hasError = true;

+ 9 - 3
public/common_constants.js

@@ -1,6 +1,12 @@
 // 部分数据从main_consts.js中抽出来,因为除了造价书界面,有一些页面也需要用到其中的变量
 // 但是其他页面直接引入整个main_consts.js不合理,且会报错(main_consts.js正常运行依赖main.html的一些内容)
-const commonConstants = (() => {
+((factory) => {
+    if (typeof module !== 'undefined') {
+        module.exports = factory();
+    } else {
+        window.commonConstants = factory();
+    }
+})(() => {
     // 清单固定行
     const fixedFlag = {
         // 分部分项工程
@@ -142,5 +148,5 @@ const commonConstants = (() => {
         supplyType,
         supplyText,
         SourceType,
-    }
-})();
+    };
+});

+ 46 - 5
web/over_write/js/guangdong_2018_export.js

@@ -1431,9 +1431,10 @@ const XMLStandard = (function () {
             _base.Element.call(this, 'DivisionalWorks', attrs, '分部工程');
         }
         // 清单项目
-        function WorkElement(node, kind, specialty) {
+        function WorkElement(node, kind) {
             const bills = node.data;
             const row = node.serialNo() + 1;
+            const programID = getBillsProgramID(bills);
             const attrs = [
                 // 项目编码
                 { name: 'Number', dName: '项目编码', required: true, value: bills.code || '', minLen: 1, failHint: `第${row}行清单-“项目编码”` },
@@ -1472,7 +1473,7 @@ const XMLStandard = (function () {
                 // 计算方式
                 { name: 'CalcType', dName: '计算方式', type: _type.INT, required: true, value: '1' },
                 // 专业类型
-                { name: 'Specialty', type: _type.INT, value: specialty },
+                { name: 'Specialty', type: _type.INT, value: programID },
                 // 清单标识
                 { name: 'ListingIdentity', value: 'GB50500-2013 1 GD' },
                 // 费用代号
@@ -2265,6 +2266,7 @@ const XMLStandard = (function () {
          * @return {Array}
          * */
         let tenderDetail = null;
+        let usedStdBills = []; // 造价书里使用到的清单库里的标准清单
         async function loadTenders(summaryInfoMap, tenderData, isPlain) {
             const unitWorks = [];
             for (const tData of tenderData) {
@@ -2304,8 +2306,11 @@ const XMLStandard = (function () {
                 // 先计算人材机总消耗量,以供后面需要
                 gljUtil.calcProjectGLJQuantity(tenderDetail.projectGLJ.datas,
                     tenderDetail.ration_glj.datas, tenderDetail.Ration.datas, tenderDetail.Bills.datas, Decimal.GLJ, _, scMathUtil); */
+                
                 // 单位工程费用汇总
                 const unitWorksSummary = loadUnitWorksSummary(tenderDetail);
+                // 获取标准清单编码-取费类别映射表
+                usedStdBills = await getUsedStdBills(tenderDetail.Bills.datas);
                 // 分部分项工程
                 const divisionalElements = loadDivisionalAndElementalWorks();
                 // 措施项目
@@ -2342,6 +2347,43 @@ const XMLStandard = (function () {
             return unitWorks;
         }
 
+        // 获取清单的取费类别,对应的是标准清单的工程专业
+        function getBillsProgramID(bills) {
+            if (bills.programID) {
+                return bills.programID;
+            }
+            const defaultProgramID = 1;
+            const reg = /^\d{12}$/;
+            if (!bills.billsLibId || !reg.test(bills.code)) {
+                return defaultProgramID;
+            } else {
+                const nineCode = bills.code.substr(0, 9);
+                const matched = usedStdBills.find(stdItem => stdItem.code === nineCode && stdItem.billsLibId === bills.billsLibId);
+                return matched && matched.engineering || defaultProgramID;
+            }
+        }
+
+        // 获取造价书中使用到的标准清单
+        async function getUsedStdBills(allBills) {
+            // 标准清单添加到造价书后应该是12位编码
+            const reg = /^\d{12}$/;
+            const map = allBills
+                .filter(bills => !bills.programID && bills.billsLibId && reg.test(bills.code))
+                .reduce((acc, bills) => {
+                    if (!acc[bills.billsLibId]) {
+                        acc[bills.billsLibId] = [];
+                    }
+                    const nineCode = bills.code.substr(0, 9);
+                    acc[bills.billsLibId].push(nineCode);
+                    return acc;
+                }, {});
+            const queries = Object
+                .entries(map)
+                .map(([billsLibId, codes]) => ({ billsLibId, code: { $in: codes } }));
+            const occupancy = 'code engineering billsLibId'
+            return await ajaxPost('/stdBillsEditor/getBillsByQueries', { queries, occupancy });
+        }
+
         // 加载工程特征信息
         // attrList 单位工程的工程特征,来自property.projectFeature
         function loadAttrInfo(attrList) {
@@ -2467,8 +2509,7 @@ const XMLStandard = (function () {
 
         // 加载清单
         function loadBills(node, kind) {
-            const specialty = Specialty[tenderDetail.projectInfo.property.engineeringName]; // 工程专业
-            const workElement = new WorkElement(node, kind, specialty);
+            const workElement = new WorkElement(node, kind);
             // 合计费用
             const summaryCost = new SummaryOfBasicCost(tenderDetail.mainTree.items, node);
             workElement.children.push(summaryCost);
@@ -2537,7 +2578,7 @@ const XMLStandard = (function () {
                     return parsedTotalQuantity;
                 })
                 .map(rGLJ => {
-                    const totalQuantity = gljUtil.getTotalQuantity(rGLJ, node.data, Decimal.QUANTITY, Decimal.GLJ);
+                    //const totalQuantity = gljUtil.getTotalQuantity(rGLJ, node.data, Decimal.QUANTITY, Decimal.GLJ);
                     const noCost = getNoCost(projectGLJCodeMap, rGLJ.code);
                     return new LabourMaterialsEquipmentsMachinesElement(rGLJ, rGLJ.quantity, noCost);
                 });