Browse Source

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

TonyKang 5 years ago
parent
commit
1f4f8edfce
32 changed files with 1057 additions and 784 deletions
  1. 6 2
      modules/all_models/import_logs.js
  2. 9 2
      modules/all_models/welcome_setting.js
  3. 5 0
      modules/complementary_ration_lib/models/sectionTreeModel.js
  4. 5 1
      modules/import/controllers/import_controller.js
  5. 1 0
      modules/import/routes/import_route.js
  6. 11 4
      modules/pm/controllers/pm_controller.js
  7. 161 33
      modules/pm/facade/pm_facade.js
  8. 0 15
      modules/pm/models/project_model.js
  9. 5 3
      public/web/PerfectLoad.js
  10. 4 4
      public/web/common_ajax.js
  11. 5 2
      public/web/gljUtil.js
  12. 6 2
      web/building_saas/complementary_ration_lib/js/global.js
  13. 10 0
      web/building_saas/css/custom.css
  14. 415 415
      web/building_saas/css/main.css
  15. BIN
      web/building_saas/img/vip.png
  16. 4 4
      web/building_saas/main/html/main.html
  17. 4 27
      web/building_saas/main/html/tender_price.html
  18. 12 5
      web/building_saas/main/js/controllers/material_controller.js
  19. 2 0
      web/building_saas/main/js/main.js
  20. 37 33
      web/building_saas/main/js/models/calc_base.js
  21. 65 38
      web/building_saas/main/js/models/calc_program.js
  22. 2 2
      web/building_saas/main/js/views/project_glj_view.js
  23. 16 14
      web/building_saas/main/js/views/sub_view.js
  24. 28 15
      web/building_saas/main/js/views/tender_price_view.js
  25. 6 8
      web/building_saas/pm/js/pm_import.js
  26. 114 88
      web/building_saas/pm/js/pm_newMain.js
  27. 17 16
      web/building_saas/pm/js/pm_share.js
  28. 21 15
      web/common/html/header.html
  29. 2 2
      web/over_write/js/chongqing_2018.js
  30. 30 15
      web/over_write/js/guangdong_2018_export.js
  31. 49 17
      web/over_write/js/guangdong_2018_import.js
  32. 5 2
      web/users/html/user-buy.html

+ 6 - 2
modules/all_models/import_logs.js

@@ -9,9 +9,13 @@ let collectionName = 'import_logs';
 let modelSchema = {
 let modelSchema = {
     // 日志类型
     // 日志类型
     key: {type: String, index: true},
     key: {type: String, index: true},
-    // 日志内容
-    userID: String,
+    // 日志简单内容
+    content: String,
     // 关联用户id
     // 关联用户id
+    userID: String,
+    // 费用定额Id
+    compilationID: String,
+    // 状态
     status:String,
     status:String,
     // 建设项目ID
     // 建设项目ID
     projectID: Number,
     projectID: Number,

+ 9 - 2
modules/all_models/welcome_setting.js

@@ -13,7 +13,14 @@ let modelSchema = {
         index: true
         index: true
     },
     },
     compilationId: String,
     compilationId: String,
-    showType:{type:Number,default:0},// 1 每天一次 2 每次登录显示,0 关闭
-    context:String
+    normal:{
+      showType:{type:Number,default:0},// 1 每天一次 2 每次登录显示,0 关闭
+      context:String
+    },
+    // 专业用户
+    professional: {
+       showType:{type:Number,default:0},// 1 每天一次 2 每次登录显示,0 关闭
+       context:String
+    }
 };
 };
 mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));
 mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));

+ 5 - 0
modules/complementary_ration_lib/models/sectionTreeModel.js

@@ -13,6 +13,11 @@ const sectionTemplateModel = mongoose.model('complementary_ration_section_templa
 class SectionTreeDao {
 class SectionTreeDao {
     //从补充定额章节树模板中拷贝数据到用户的补充定额章节树中
     //从补充定额章节树模板中拷贝数据到用户的补充定额章节树中
     async copyDataFromTemplate(userId, compilationId){
     async copyDataFromTemplate(userId, compilationId){
+        // 如果已经有数据则不再生成
+        const count = await compleRationSectionTreeModel.count({userId, compilationId});
+        if (count) {
+            return;
+        }
         let templateData = await sectionTemplateModel.find({compilationId: compilationId});
         let templateData = await sectionTemplateModel.find({compilationId: compilationId});
         if (templateData.length > 0) {
         if (templateData.length > 0) {
             let insertDatas = [],
             let insertDatas = [],

+ 5 - 1
modules/import/controllers/import_controller.js

@@ -17,6 +17,10 @@ let controller = {
         let data = req.body;
         let data = req.body;
         return await pm_facade.importChongqingProject(data);
         return await pm_facade.importChongqingProject(data);
     },
     },
+    prepareInitialData: async function(req) {
+        const data = req.body;
+        return await pm_facade.prepareInitialData(data.userID, data.compilationID, data.example);
+    },
     exportProject:async function(req){
     exportProject:async function(req){
         let result={
         let result={
             error:0
             error:0
@@ -30,7 +34,7 @@ let controller = {
             error:0
             error:0
         };
         };
         let data = JSON.parse(req.body.dataString);
         let data = JSON.parse(req.body.dataString);
-        result.data = await pm_facade.copyProject(req.body.userID,req.body.compilationID,data);
+        result.data = await pm_facade.accessToCopyProject(req.body.userID,req.body.compilationID,data);
         return result
         return result
     },
     },
     async importInterface (req) {
     async importInterface (req) {

+ 1 - 0
modules/import/routes/import_route.js

@@ -13,6 +13,7 @@ module.exports = function (app) {
     importRouter.post('/getDataForInterface',importController.action);
     importRouter.post('/getDataForInterface',importController.action);
     importRouter.post('/loadSEIProjectData',importController.action);
     importRouter.post('/loadSEIProjectData',importController.action);
     importRouter.post('/importChongqingProject',importController.action);
     importRouter.post('/importChongqingProject',importController.action);
+    importRouter.post('/prepareInitialData',importController.action);
     importRouter.get('/test',function (req,res) {
     importRouter.get('/test',function (req,res) {
         res.json("hello word");
         res.json("hello word");
     })
     })

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

@@ -332,7 +332,7 @@ module.exports = {
         let absoluteUrl = compilationData.overWriteUrl ? request.app.locals.rootDir + compilationData.overWriteUrl : request.app.locals.rootDir;
         let absoluteUrl = compilationData.overWriteUrl ? request.app.locals.rootDir + compilationData.overWriteUrl : request.app.locals.rootDir;
         let overWriteUrl = fs.existsSync(absoluteUrl) && fs.statSync(absoluteUrl).isFile()? compilationData.overWriteUrl : null;
         let overWriteUrl = fs.existsSync(absoluteUrl) && fs.statSync(absoluteUrl).isFile()? compilationData.overWriteUrl : null;
         //欢迎页显示控制
         //欢迎页显示控制
-        let [isShow,context] = await pm_facade.getWelcomeInfo(sessionCompilation._id,request.session.sessionUser);
+        let [isShow,context] = await pm_facade.getWelcomeInfo(sessionCompilation._id,request.session.sessionUser,request.session.compilationVersion.includes('免费'));
         let renderData = {
         let renderData = {
             isFirst: isFirst,
             isFirst: isFirst,
             isShow:isShow,
             isShow:isShow,
@@ -354,11 +354,16 @@ module.exports = {
     //第一次进入该费用定额时准备的初始数据
     //第一次进入该费用定额时准备的初始数据
     prepareInitialData: async function(request, response) {
     prepareInitialData: async function(request, response) {
         try {
         try {
-            let sessionCompilation = request.session.sessionCompilation;
-            await pm_facade.prepareInitialData(request.session.sessionUser.id, sessionCompilation._id, sessionCompilation.example);
+            const data = {
+                userID: request.session.sessionUser.id,
+                compilationID: request.session.sessionCompilation._id,
+                example: request.session.sessionCompilation.example
+            };
+            await redirectToImportServer(data, 'prepareInitialData', request);
             callback(request, response, 0, 'success', null);
             callback(request, response, 0, 'success', null);
         } catch(err) {
         } catch(err) {
-            callback(request, response, 1, err, null);
+            console.log(err);
+            callback(request, response, 1, err.toString(), null);
         }
         }
     },
     },
     // 获取单价文件列表
     // 获取单价文件列表
@@ -836,6 +841,8 @@ module.exports = {
         };
         };
         try{
         try{
             let data = JSON.parse(req.body.data);
             let data = JSON.parse(req.body.data);
+            data.userID = req.session.sessionUser.id;
+            data.compilationID = req.session.sessionCompilation._id;
             result.data = await pm_facade.importProcessChecking(data);
             result.data = await pm_facade.importProcessChecking(data);
         } catch (err){
         } catch (err){
             console.log(err);
             console.log(err);

+ 161 - 33
modules/pm/facade/pm_facade.js

@@ -17,6 +17,7 @@ module.exports={
     getShareInfoMap,
     getShareInfoMap,
     getRecentShareList,
     getRecentShareList,
     moveProject:moveProject,
     moveProject:moveProject,
+    accessToCopyProject,
     copyProject:copyProject,
     copyProject:copyProject,
     copyExample: copyExample,
     copyExample: copyExample,
     setupSummaryFields: setupSummaryFields,
     setupSummaryFields: setupSummaryFields,
@@ -303,6 +304,7 @@ async function copyExample(userID, compilation, projIDs){
     //设置新的树结构数据
     //设置新的树结构数据
     let newDate = new Date(),
     let newDate = new Date(),
         parentBulks = [];
         parentBulks = [];
+    const projectMaps = [];
     for (let data of allProjs) {
     for (let data of allProjs) {
         let orgID = data.ID;
         let orgID = data.ID;
         data.ID = IDMapping[data.ID];
         data.ID = IDMapping[data.ID];
@@ -326,7 +328,8 @@ async function copyExample(userID, compilation, projIDs){
                                 compilation: compilation, fileVer: data.fileVer, projType: data.projType, property: {rootProjectID: rootProjectID}}
                                 compilation: compilation, fileVer: data.fileVer, projType: data.projType, property: {rootProjectID: rootProjectID}}
                 }
                 }
             };
             };
-            await copyProject(userID, compilation, {projectMap}, data.ID);
+            await copyProject(userID, compilation, {projectMap}, data.ID, true);
+            projectMaps.push(projectMap);
         }
         }
     }
     }
     //最末顶层项目(兼容测试时已存在有项目,正常用户第一次进费用定额,该费用定额不存在项目)
     //最末顶层项目(兼容测试时已存在有项目,正常用户第一次进费用定额,该费用定额不存在项目)
@@ -334,12 +337,40 @@ async function copyExample(userID, compilation, projIDs){
     if (lastProj) {
     if (lastProj) {
         parentBulks.push({updateOne: {filter: {ID: lastProj.ID}, update: {$set: {NextSiblingID: parentExample[0].ID}}}});
         parentBulks.push({updateOne: {filter: {ID: lastProj.ID}, update: {$set: {NextSiblingID: parentExample[0].ID}}}});
     }
     }
-    //拷贝父级文件
-    await projectModel.bulkWrite(parentBulks);
+    // 处理项目数据
+    const projectTasks = [projectModel.bulkWrite(parentBulks), createProject(projectMaps)];
+    await Promise.all(projectTasks);
     return true;
     return true;
 }
 }
 
 
-async function copyProject(userID, compilationID,data,newProjectID = null) {
+async function accessToCopyProject(userID, compilationID, data, newProjectID) {
+    const logData = {
+        key: uuidV1(),
+        content: '正在拷贝项目,请稍候……',
+        userID,
+        compilationID,
+        status: 'start',
+        create_time: +new Date()
+    };
+    await importLogsModel.create(logData);
+    handleCopyProject(logData.key, userID, compilationID,data,newProjectID);
+    return 'copying project';
+}
+
+async function handleCopyProject(key, userID, compilationID, data, newProjectID) {
+    const doc = { status: 'finish' };
+    try {
+        const projectMap = await copyProject(userID, compilationID, data, newProjectID);
+        doc.projectID = projectMap.copy.document.ID;
+    } catch (err) {
+        doc.status = 'error';
+        doc.errorMsg = String(err);
+    } finally {
+        await importLogsModel.update({ key }, doc);
+    }
+}
+
+async function copyProject(userID, compilationID,data,newProjectID = null, delayProjectTask = false) {
     let projectMap = data.projectMap;
     let projectMap = data.projectMap;
     let originalID = projectMap['copy'].document.ID;
     let originalID = projectMap['copy'].document.ID;
     if (!newProjectID) {
     if (!newProjectID) {
@@ -400,7 +431,6 @@ async function copyProject(userID, compilationID,data,newProjectID = null) {
     let [billMap,rationMap,projectGLJMap] = await Promise.all(IDtasks);
     let [billMap,rationMap,projectGLJMap] = await Promise.all(IDtasks);
     //所有复制任务异步处理,提升效率  复制清单,定额,4个文件,项目工料机, 定额工料机,人工系数,工程量明细,定额安装增加费,安装增加费
     //所有复制任务异步处理,提升效率  复制清单,定额,4个文件,项目工料机, 定额工料机,人工系数,工程量明细,定额安装增加费,安装增加费
     let copyTasks = [
     let copyTasks = [
-        createProject(projectMap),
         copyProjectSetting(originalID,newProjectID),
         copyProjectSetting(originalID,newProjectID),
         copyBills(newProjectID,billMap),
         copyBills(newProjectID,billMap),
         copyRations(newProjectID,billMap.uuidMaping,rationMap,projectGLJMap.IDMap),
         copyRations(newProjectID,billMap.uuidMaping,rationMap,projectGLJMap.IDMap),
@@ -427,8 +457,15 @@ async function copyProject(userID, compilationID,data,newProjectID = null) {
     if(originalProperty.unitPriceFile){
     if(originalProperty.unitPriceFile){
         copyTasks.push(copyUnitPriceFile(newProjectID,originalProperty.rootProjectID,userID,originalProperty.unitPriceFile.id,unitPriceFileID,newUnitName));
         copyTasks.push(copyUnitPriceFile(newProjectID,originalProperty.rootProjectID,userID,originalProperty.unitPriceFile.id,unitPriceFileID,newUnitName));
     }
     }
-    let p = await Promise.all(copyTasks);
-    return p[0];
+    await Promise.all(copyTasks);
+    // 最后再处理项目数据
+    // 可能会有最后再在外层方法插入项目数据的需求,如拷贝例题,暂时先不在这里插入项目数据
+    if (delayProjectTask) {
+        return [projectMap];
+    } else {
+        const projectMaps = await createProject([projectMap]);
+        return projectMaps[0];
+    }
 }
 }
 
 
 async function createIDsAndReturn(originalID,model) {
 async function createIDsAndReturn(originalID,model) {
@@ -461,14 +498,16 @@ async function getProjectGLJIDAndReturn(originalID,newProjectID) {
     return{IDMap:IDMap,datas:datas};
     return{IDMap:IDMap,datas:datas};
 }
 }
 
 
-async function createProject(projectMap) {//复制项目
+async function createProject(projectMaps) {//复制项目
     let tasks = [];
     let tasks = [];
-    if(projectMap['update']){//如果复制后存在前一个节点,则更新其NextSiblingID
-        tasks.push({updateOne:{filter : projectMap['update'].query, update : {NextSiblingID:projectMap['copy'].document.ID}}});
+    for (const projectMap of projectMaps) {
+        if(projectMap['update']){//如果复制后存在前一个节点,则更新其NextSiblingID
+            tasks.push({updateOne:{filter : projectMap['update'].query, update : {NextSiblingID:projectMap['copy'].document.ID}}});
+        }
+        tasks.push({insertOne: {document: projectMap['copy'].document}});//复制任务
     }
     }
-    tasks.push({insertOne: {document: projectMap['copy'].document}});//复制任务
     await projectModel.bulkWrite(tasks);
     await projectModel.bulkWrite(tasks);
-    return projectMap;
+    return projectMaps;
 }
 }
 
 
 async function copyProjectSetting(originalID,newProjectID) {
 async function copyProjectSetting(originalID,newProjectID) {
@@ -1446,7 +1485,9 @@ async function importChongqingProject(data) {
 
 
     let log_data = {
     let log_data = {
         key:data.key,
         key:data.key,
+        content: '正在导入例题,请稍候……',
         userID:data.user_id,
         userID:data.user_id,
+        compilationID: data.session.sessionCompilation._id,
         status:"start",
         status:"start",
         create_time:+new Date()
         create_time:+new Date()
     };
     };
@@ -1473,21 +1514,44 @@ async function importChongqingProject(data) {
     }
     }
 }
 }
 
 
-
+function testTimeout(time) {
+    return new Promise(resolve => setTimeout(resolve, time));
+}
 
 
 //用户第一次进入费用定额的数据准备
 //用户第一次进入费用定额的数据准备
 async function prepareInitialData(userId, compilation, example) {
 async function prepareInitialData(userId, compilation, example) {
     let first = await isFirst(userId, compilation);
     let first = await isFirst(userId, compilation);
     if (first) {
     if (first) {
         await updateUsedList(userId, compilation);
         await updateUsedList(userId, compilation);
-        let prepareTask = [
-            copyCompleRationSection(userId, compilation),
-            copyCompleGljSection(userId, compilation)
-        ];
-        if (example && example.length > 0) {
-            prepareTask.push(copyExample(userId, compilation, example));
+        const logData = {
+            key: uuidV1(),
+            content: '正在加载例题,请稍候……',
+            userID: userId,
+            compilationID: compilation,
+            status: 'start',
+            create_time: +new Date()
+        };
+        await importLogsModel.create(logData);
+        initData(logData.key, userId, compilation, example);
+        return 'start prepareInitialData';
+    }
+    async function initData(key, userId, compilation, example) {
+        const doc = { status: 'finish' };
+        try {
+            let prepareTask = [
+                copyCompleRationSection(userId, compilation),
+                copyCompleGljSection(userId, compilation)
+            ];
+            if (example && example.length > 0) {
+                prepareTask.push(copyExample(userId, compilation, example));
+            }
+            await Promise.all(prepareTask);
+        } catch (error) {
+            doc.errorMsg = '加载例题失败,请检查例题项目是否存在!';
+            doc.status = 'error';
+        } finally {
+            await importLogsModel.update({ key }, doc);
         }
         }
-        await Promise.all(prepareTask);
     }
     }
 }
 }
 
 
@@ -1502,6 +1566,11 @@ async function copyCompleRationSection(userId, compilationId) {
 
 
 //拷贝补充人材机分类树
 //拷贝补充人材机分类树
 async function copyCompleGljSection(userId, compilationId) {
 async function copyCompleGljSection(userId, compilationId) {
+    // 如果已有数据则不再生成
+    const count = await compleGljSectionModel.count({userId, compilationId});
+    if (count) {
+        return;
+    }
     let templateData = await compleGljSectionTModel.find({compilationId: compilationId});
     let templateData = await compleGljSectionTModel.find({compilationId: compilationId});
     if (templateData.length > 0) {
     if (templateData.length > 0) {
         let insertDatas = [],
         let insertDatas = [],
@@ -1566,9 +1635,9 @@ async function getBasicInfo(compilationID, fileKind = null) {
     //提取文件类型中需要的数据 (投标项目可能不需要招标的一些信息)
     //提取文件类型中需要的数据 (投标项目可能不需要招标的一些信息)
     if (fileKind && infoLib && infoLib.info && infoLib.info.length) {
     if (fileKind && infoLib && infoLib.info && infoLib.info.length) {
         let strMap = {
         let strMap = {
-            1: 'tender',    //投标
-            2: 'bid',       //招标
-            3: 'control'    //控制价
+            1: '投标',    //投标
+            2: '招标',       //招标
+            3: '控制价'    //控制价
         };
         };
         let needfulData = infoLib.info.filter(data => !data.fileKind || data.fileKind === strMap[fileKind]);
         let needfulData = infoLib.info.filter(data => !data.fileKind || data.fileKind === strMap[fileKind]);
         needfulData.forEach(nData => {
         needfulData.forEach(nData => {
@@ -1700,6 +1769,8 @@ async function importProject(importObj, userID, compilationID) {
     if (bulks.length > 0) {
     if (bulks.length > 0) {
         await projectModel.bulkWrite(bulks);
         await projectModel.bulkWrite(bulks);
     }
     }
+    return importObj.ID; // 返回建设项目ID
+    // TODO 删除
     let summaryInfo = await getSummaryInfo([importObj.ID]);
     let summaryInfo = await getSummaryInfo([importObj.ID]);
     //设置汇总字段
     //设置汇总字段
     for(let proj of toInsertProjects){
     for(let proj of toInsertProjects){
@@ -2100,7 +2171,9 @@ async function downLoadProjectFile(info) {
     console.log(privateDownloadUrl);
     console.log(privateDownloadUrl);
     let data = {
     let data = {
         key:info.key,
         key:info.key,
+        content: '正在导入建设项目,请稍候……',
         userID:info.session.sessionUser.id,
         userID:info.session.sessionUser.id,
+        compilationID: info.session.sessionCompilation._id,
         status:"start",
         status:"start",
         create_time:+new Date()
         create_time:+new Date()
     };
     };
@@ -2135,28 +2208,31 @@ async function doDownLoadAndImport(privateDownloadUrl,info) {
 
 
 async function importProcessChecking(data){
 async function importProcessChecking(data){
     let result = {error:0};
     let result = {error:0};
-    let log = await importLogsModel.findOne({key:data.key});
+    const query = data.key ? { key: data.key } : { userID: data.userID, compilationID: data.compilationID };
+    let log = await importLogsModel.findOne(query);
     if(log){
     if(log){
         if(log.status == "finish"){
         if(log.status == "finish"){
             result.status = "complete";
             result.status = "complete";
-            await importLogsModel.remove({key:data.key});
+            await importLogsModel.remove(query);
             // 获取导入的项目数据
             // 获取导入的项目数据
             if (log.projectID) {
             if (log.projectID) {
                 const projects = await getPosterityProjects([log.projectID], true);
                 const projects = await getPosterityProjects([log.projectID], true);
-                const summaryInfo = await getSummaryInfo([log.projectID]);
-                setupSummaryFields(summaryInfo, projects);
+                if (!(projects.length === 1 && projects[0].projType === projectType.tender)) { // 处理的是建设项目数据
+                    const summaryInfo = await getSummaryInfo([log.projectID]);
+                    setupSummaryFields(summaryInfo, projects);
+                }
                 result.data = projects;
                 result.data = projects;
             }
             }
         }else if(log.status == "start"){
         }else if(log.status == "start"){
             result.status = "processing";
             result.status = "processing";
+            result.content = log.content;
         }else if(log.status == "error"){
         }else if(log.status == "error"){
             result.error = 1;
             result.error = 1;
             result.msg = log.errorMsg;
             result.msg = log.errorMsg;
-            await importLogsModel.remove({key:data.key});
+            await importLogsModel.remove(query);
         }
         }
     }else {
     }else {
-        result.error = 1;
-        result.msg = `导入过程中发生错误!`;
+        result.status = "complete";
     }
     }
     return result;
     return result;
 
 
@@ -2187,6 +2263,53 @@ async function downloadFileSync(key) {
 
 
 // 导入接口
 // 导入接口
 async function importInterface(key, session) {
 async function importInterface(key, session) {
+    const logData = {
+        key: key,
+        content: '正在导入接口文件,请稍候……',
+        userID: session.sessionUser.id,
+        compilationID: session.sessionCompilation._id,
+        status: 'start',
+        create_time: +new Date()
+    };
+    await importLogsModel.create(logData);
+    handleImportInterface(key, session);
+    return 'importing interface';
+}
+
+async function handleImportInterface(key, session) {
+    const doc = { status: 'finish' };
+    // 源文件内容文本
+    let downloadFilePath = '';
+    try {
+        const { path, srcData } = await downloadFileSync(key);
+        downloadFilePath = path;
+        if (!srcData) {
+            throw '无有效数据';
+        }
+        const userID = session.sessionUser.id;
+        const compilationID = session.sessionCompilation._id;
+        const importData = JSON.parse(srcData);
+        let tenderCount = 0;
+        importData.engs.forEach(eng => {
+            eng.tenders.forEach(() => {
+                tenderCount += 1;
+            });
+        });
+        if (await isTenderOverrun(tenderCount, session)) {
+            throw '您创建的项目个数超限,请联系我们的客服人员,或者导出建设项目保存到本地备份,删除云上数据。';
+        }
+        const projectID = await importProject(importData, userID, compilationID);
+        doc.projectID = projectID;
+    } catch (err) {
+        doc.errorMsg = typeof err === 'string' ? err : '导入接口失败,请检查接口文件!';
+        doc.status = 'error';
+    } finally {
+        await importLogsModel.update({ key }, doc);
+        fs.unlinkSync(downloadFilePath);
+    }
+}
+
+/* async function importInterface(key, session) {
     // 源文件内容文本
     // 源文件内容文本
     let downloadFilePath = '';
     let downloadFilePath = '';
     try {
     try {
@@ -2214,7 +2337,7 @@ async function importInterface(key, session) {
     } finally {
     } finally {
         fs.unlinkSync(downloadFilePath);
         fs.unlinkSync(downloadFilePath);
     }
     }
-}
+} */
 
 
 async function importProjects(data,req,updateData) {
 async function importProjects(data,req,updateData) {
     let result = {error:0};
     let result = {error:0};
@@ -2536,10 +2659,15 @@ async function isTenderOverrun(tenderCount, session) {
     return tenderCount + curTenderCount > limit;
     return tenderCount + curTenderCount > limit;
 }
 }
 
 
-async function getWelcomeInfo(compilationId,sessionUser) {
-    let setting = await welcomeModel.findOne({compilationId:compilationId});
+async function getWelcomeInfo(compilationId,sessionUser,isFree=true) {
+    let welcom_setting = await welcomeModel.findOne({compilationId:compilationId});
     let isShow = false;
     let isShow = false;
     let context = "";
     let context = "";
+    let setting = null
+    if(welcom_setting){
+      setting = isFree? welcom_setting.normal:welcom_setting.professional;//区分专业版和免费版
+    }
+
     if(setting){
     if(setting){
         if(setting.showType == 0) return [false,""];//关闭
         if(setting.showType == 0) return [false,""];//关闭
         context = setting.context;
         context = setting.context;

+ 0 - 15
modules/pm/models/project_model.js

@@ -84,21 +84,6 @@ ProjectsDAO.prototype.getUserProjects = async function (userId, compilation, cal
         // 设置汇总字段
         // 设置汇总字段
         let summaryInfo = await pmFacade.getSummaryInfo(projIDs);
         let summaryInfo = await pmFacade.getSummaryInfo(projIDs);
         pmFacade.setupSummaryFields(summaryInfo, projects);
         pmFacade.setupSummaryFields(summaryInfo, projects);
-        /* for(let proj of projects){
-            let summaryProj = summaryInfo[proj.ID];
-            if(summaryProj){
-                proj.engineeringCost = summaryProj.engineeringCost;
-                proj.subEngineering = summaryProj.subEngineering;
-                proj.measure = summaryProj.measure;
-                proj.safetyConstruction = summaryProj.safetyConstruction;
-                proj.other = summaryProj.other;
-                proj.charge = summaryProj.charge;
-                proj.tax = summaryProj.tax;
-                proj.rate = summaryProj.rate;
-                proj.buildingArea = summaryProj.buildingArea;
-                proj.perCost = summaryProj.perCost;
-            }
-        } */
         callback(0, '', projects);
         callback(0, '', projects);
     }
     }
     catch (err) {
     catch (err) {

+ 5 - 3
public/web/PerfectLoad.js

@@ -122,9 +122,11 @@ jQuery.bootstrapLoading = {
         }
         }
     },
     },
     progressEnd:function () {
     progressEnd:function () {
-        $("#progress_modal_bar").css('width','100%');
-        $.bootstrapLoading.progressStop = true;
-        $("#progressModal").modal('hide');
+        if ($('#progressModal').is(':visible')) {
+            $("#progress_modal_bar").css('width','100%');
+            $.bootstrapLoading.progressStop = true;
+            $("#progressModal").modal('hide');
+        }
     }
     }
 }
 }
 
 

+ 4 - 4
public/web/common_ajax.js

@@ -163,7 +163,7 @@ $.ajaxSetup({
 
 
 
 
 
 
-async function ajaxPost(url, data, isPlainData = false) {
+async function ajaxPost(url, data, isPlainData = false, timeout = 200000) {
     return new Promise(function (resolve, reject) {
     return new Promise(function (resolve, reject) {
         $.ajax({
         $.ajax({
             type:"POST",
             type:"POST",
@@ -171,7 +171,7 @@ async function ajaxPost(url, data, isPlainData = false) {
             data: isPlainData ? data : {'data': JSON.stringify(data)},
             data: isPlainData ? data : {'data': JSON.stringify(data)},
             dataType: 'json',
             dataType: 'json',
             cache: false,
             cache: false,
-            timeout: 200000,
+            timeout,
             success: function(result){
             success: function(result){
                 if (!result.error ||  commonUtil.isDef(result.err) && !result.err) {
                 if (!result.error ||  commonUtil.isDef(result.err) && !result.err) {
                     resolve(result.data);
                     resolve(result.data);
@@ -182,7 +182,7 @@ async function ajaxPost(url, data, isPlainData = false) {
                 }
                 }
             },
             },
             error: function(jqXHR, textStatus, errorThrown){
             error: function(jqXHR, textStatus, errorThrown){
-                ajaxErrorInfo(jqXHR, textStatus, errorThrown);
+                ajaxErrorInfo(url, jqXHR, textStatus, errorThrown);
                 reject("请求错误");
                 reject("请求错误");
             }
             }
         });
         });
@@ -216,7 +216,7 @@ function getTopWindow() {
     return p;
     return p;
 }
 }
 
 
-function ajaxErrorInfo(jqXHR, textStatus, errorThrown) {
+function ajaxErrorInfo(url, jqXHR, textStatus, errorThrown) {
     if(textStatus == 'timeout'){
     if(textStatus == 'timeout'){
         alert('网络连接超时,请刷新您的网页。');
         alert('网络连接超时,请刷新您的网页。');
     }else {
     }else {

+ 5 - 2
public/web/gljUtil.js

@@ -206,6 +206,7 @@ let gljUtil = {
         let process_decimal = decimalObj.process;
         let process_decimal = decimalObj.process;
         let priceCoe = this.isDef(tenderCoe)?tenderCoe:1;
         let priceCoe = this.isDef(tenderCoe)?tenderCoe:1;
         if (priceCoe == '0' || priceCoe == 0) priceCoe = 1;   // 这里加个保护
         if (priceCoe == '0' || priceCoe == 0) priceCoe = 1;   // 这里加个保护
+        if (['GLF', 'LR', 'FXF'].includes(glj.code)) priceCoe = 1; // 类型是“企业管理费”、“利润”、“一般风险费”的,不应调整单价。
         if (this.notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班等有组成物的材料,价格需根据组成物计算得出。
         if (this.notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班等有组成物的材料,价格需根据组成物计算得出。
             let p =0;
             let p =0;
             for(let ratio of glj.ratio_data){
             for(let ratio of glj.ratio_data){
@@ -215,8 +216,10 @@ let gljUtil = {
                 });
                 });
                 if(tem){
                 if(tem){
                     let tem_marketPrice = this.getMarketPrice(tem,projectGLJDatas,calcOptions,decimalObj,true,_,scMathUtil);  //let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
                     let tem_marketPrice = this.getMarketPrice(tem,projectGLJDatas,calcOptions,decimalObj,true,_,scMathUtil);  //let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
-                    let temP = scMathUtil.roundForObj(tem_marketPrice * priceCoe * scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
-                    p = scMathUtil.roundForObj(temP + p,process_decimal);
+                    let temP = scMathUtil.roundForObj(
+                        scMathUtil.roundForObj(tem_marketPrice * priceCoe, price_decimal) *
+                        scMathUtil.roundForObj(ratio.consumption,quantity_decimal), process_decimal);
+                    p = scMathUtil.roundForObj(temP + p, process_decimal);
                 }
                 }
             }
             }
             return scMathUtil.roundForObj(p,price_hasM_decimal);
             return scMathUtil.roundForObj(p,price_hasM_decimal);

+ 6 - 2
web/building_saas/complementary_ration_lib/js/global.js

@@ -75,8 +75,12 @@ function setLocalCache(key, value) {
     if (!storage || key === '' || value === '') {
     if (!storage || key === '' || value === '') {
         return;
         return;
     }
     }
-
-    storage.setItem(key, value);
+    try {
+        storage.setItem(key, value);
+    } catch (err) {
+        storage.clear();
+        storage.setItem(key, value);
+    }
 }
 }
 
 
 /**
 /**

+ 10 - 0
web/building_saas/css/custom.css

@@ -462,4 +462,14 @@ input.text-right{
     .middle-modal-height {
     .middle-modal-height {
         height: 350px;
         height: 350px;
     }
     }
+}
+.textarea-inherit {
+    width: 100%;
+    overflow: auto;
+    word-break: break-all;
+}
+/* 初始样式,防止projspread初始化完后背景从白突然变灰 */
+.poj-list {
+    height: 1000px; 
+    background: #f7f7f9;
 }
 }

File diff suppressed because it is too large
+ 415 - 415
web/building_saas/css/main.css


BIN
web/building_saas/img/vip.png


+ 4 - 4
web/building_saas/main/html/main.html

@@ -485,10 +485,10 @@
                                               <div class="tab-content">
                                               <div class="tab-content">
                                                   <div class="tab-pane" id="xmtz_tab" style="padding:10px">
                                                   <div class="tab-pane" id="xmtz_tab" style="padding:10px">
                                                      <input id="xmtz_billID" type="hidden">
                                                      <input id="xmtz_billID" type="hidden">
-                                                     <!-- <textarea class="form-control" name="" id="" style="width: 90% ; height:90%;"></textarea> -->
-                                                      <div class="main-data-bottom" tabindex="0"  hidefocus="true"  contenteditable="true" id="tzCharacterText" >
-                                                          项目特征 内容
-                                                      </div>
+                                                     <textarea v-model="body" :placeholder="placeholder" class="textarea-inherit" id="tzCharacterText" autoHeight="true"></textarea>
+                                                      <!-- <div class="main-data-bottom" tabindex="0"  hidefocus="true"  contenteditable="plaintext-only" id="tzCharacterText" >
+                                                          项目特征 内容  这种方式谷歌不兼容
+                                                      </div> -->
                                                   </div>
                                                   </div>
                                               </div>
                                               </div>
                                           </div>
                                           </div>

+ 4 - 27
web/building_saas/main/html/tender_price.html

@@ -1,45 +1,22 @@
 
 
 <div class="toolsbar px-1">
 <div class="toolsbar px-1">
     <div class="btn-toolbar py-1">
     <div class="btn-toolbar py-1">
-        <!--<div class="input-group input-group-sm mr-2" style="margin-left:10px; margin-top:4px;">-->
         <div class="input-group input-group-sm mr-2">
         <div class="input-group input-group-sm mr-2">
             <select class="form-control form-control-sm" style="width: auto; font-size: .875rem" id="calcPriceOption">
             <select class="form-control form-control-sm" style="width: auto; font-size: .875rem" id="calcPriceOption">
                 <option value="coeBase">按调价系数计算</option>
                 <option value="coeBase">按调价系数计算</option>
                 <option value="priceBase_RCJ" >按目标价调整人材机消耗</option>
                 <option value="priceBase_RCJ" >按目标价调整人材机消耗</option>
                 <option value="priceBase_ZM" >按目标价调整子目工程量</option>
                 <option value="priceBase_ZM" >按目标价调整子目工程量</option>
             </select>
             </select>
-<!--            <div class="form-check">
-                <label class="form-check-label">
-                    <input class="form-check-input" name="tenderCalcType" id="tenderCalcByXS" value="0" type="radio">
-                    按调价系数正算 
-                </label>
-            </div>
-            <div class="form-check">
-                <label class="form-check-label">
-                    <input class="form-check-input" name="tenderCalcType" id="tenderCalcByTargetRCJ" value="1" type="radio">
-                    按目标价反算人材机消耗 
-                </label>
-            </div>
-            <div class="form-check">
-                <label class="form-check-label">
-                    <input class="form-check-input" name="tenderCalcType" id="tenderCalcByTargetZM" value="2" type="radio">
-                    按目标价反算子目工程量 
-                </label>
-            </div>-->
         </div>
         </div>
-        <div class="input-group input-group-sm mr-2" style="width:200px">
+
+        <div class="input-group input-group-sm mr-2" style="width:230px">
             <div class="input-group-prepend">
             <div class="input-group-prepend">
                 <span class="input-group-text" id="inputGroup-sizing-sm">人材机单价调整系数</span>
                 <span class="input-group-text" id="inputGroup-sizing-sm">人材机单价调整系数</span>
             </div>
             </div>
             <input id = 'gljPriceTenderCoe' type="number" step="0.1" class="form-control" placeholder="请输入系数" value="1">
             <input id = 'gljPriceTenderCoe' type="number" step="0.1" class="form-control" placeholder="请输入系数" value="1">
         </div>
         </div>
-        <!--<div class="btn-group mr-2">-->
-            <!--<button type="button" class="btn btn-outline-primary btn-sm" id = "tenderGLJQuantity">调整人材机消耗</button>-->
-            <!--<button type="button" class="btn btn-outline-primary btn-sm" id = "tenderRationQuantity">调整子目工程量</button>-->
-           <!--&lt;!&ndash; <button type="button" class="btn btn-outline-primary btn-sm">反调单价</button>&ndash;&gt;-->
-            <!--<button type="button" class="btn btn-outline-primary btn-sm" id = "tenderPrice">调价计算2</button>-->
-        <!--</div>-->
-        <button type="button" class="btn btn-outline-primary btn-sm" id = "tenderPrice">调价计算</button>
+
+        <button type="button" class="btn btn-outline-primary btn-sm" id = "calcTender">调价计算</button>
         <span>&nbsp</span>
         <span>&nbsp</span>
         <button type="button" class="btn btn-outline-danger btn-sm" id = "cleanTender">清空调价</button>
         <button type="button" class="btn btn-outline-danger btn-sm" id = "cleanTender">清空调价</button>
         <div class="form-check" style="margin-left:40px; margin-top:4px;">
         <div class="form-check" style="margin-left:40px; margin-top:4px;">

+ 12 - 5
web/building_saas/main/js/controllers/material_controller.js

@@ -223,10 +223,17 @@ let MaterialController = {
             parent = selected
             parent = selected
             $("#xmtz_billID").val(selected.data.ID);
             $("#xmtz_billID").val(selected.data.ID);
         }
         }
-        if(selected&&parent){
-            text = parent.data.itemCharacterText?parent.data.itemCharacterText.replace(/\n/g,"<br>"):"";
-            text = text.replace(/\s/g,"&nbsp;");
-        }
+        if(selected&&parent) text = parent.data.itemCharacterText;
+        
+        if(eleID != 'itemCharacterText'){
+          $("#"+eleID).val(text);
+        }else{
+          text = parent.data.itemCharacterText?parent.data.itemCharacterText.replace(/\n/g,"<br>"):"";
+          text = text.replace(/\s/g,"&nbsp;");
+          $("#"+eleID).html(text);
+        }  
+      
+
        /* if(text == "") {//为空的时候不显示
        /* if(text == "") {//为空的时候不显示
             $("#replaceM").hide();
             $("#replaceM").hide();
             $("#subSpread").removeClass("ration_glj_spread");
             $("#subSpread").removeClass("ration_glj_spread");
@@ -235,7 +242,7 @@ let MaterialController = {
         }*/
         }*/
         //$('#replaceM').css('margin-top',0);
         //$('#replaceM').css('margin-top',0);
         //this.toggleItemInit();
         //this.toggleItemInit();
-        $("#"+eleID).html(text);
+       
     },
     },
     //初始化人材机和项目特征文本两个区域的宽度,改变窗口大小时调用此方法,实时刷新
     //初始化人材机和项目特征文本两个区域的宽度,改变窗口大小时调用此方法,实时刷新
     initItemWidth: function () {
     initItemWidth: function () {

+ 2 - 0
web/building_saas/main/js/main.js

@@ -36,6 +36,7 @@ $(function () {
         projectObj.mainSpread.refresh();
         projectObj.mainSpread.refresh();
         refreshSubSpread();
         refreshSubSpread();
         $('#comments').find('textarea').height($('#comments').height() - 25);
         $('#comments').find('textarea').height($('#comments').height() - 25);
+        $("#tzCharacterText").height($("#tzSubDiv").height()-30);
     });
     });
     const projectId = scUrlUtil.GetQueryString('project');
     const projectId = scUrlUtil.GetQueryString('project');
     // 绑定点击事件
     // 绑定点击事件
@@ -80,6 +81,7 @@ function loadMainSize() {//加载造价书页面各高度
     SlideResize.loadVerticalHeight(mainResizeEles.eleObj.module, mainResizeEles.eleObj, mainResizeEles.limit, function () {
     SlideResize.loadVerticalHeight(mainResizeEles.eleObj.module, mainResizeEles.eleObj, mainResizeEles.limit, function () {
         refreshSubSpread();
         refreshSubSpread();
         zmhs_obj.refresh();
         zmhs_obj.refresh();
+        $("#tzCharacterText").height($("#tzSubDiv").height()-30);
     });
     });
 }
 }
 
 

+ 37 - 33
web/building_saas/main/js/models/calc_base.js

@@ -566,7 +566,7 @@ let baseFigureTemplate = {
                 //调整价
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 //价差
-                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
@@ -582,7 +582,7 @@ let baseFigureTemplate = {
                 //调整价
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 //价差
-                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
@@ -598,7 +598,7 @@ let baseFigureTemplate = {
                 //调整价
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 //价差
-                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
@@ -617,7 +617,7 @@ let baseFigureTemplate = {
                 //调整价
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 //价差
-                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
@@ -633,7 +633,7 @@ let baseFigureTemplate = {
                 //调整价
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 //价差
-                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
@@ -649,7 +649,7 @@ let baseFigureTemplate = {
                 //调整价
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 //价差
-                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
@@ -668,7 +668,7 @@ let baseFigureTemplate = {
                 //调整价
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 //价差
-                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
@@ -684,7 +684,7 @@ let baseFigureTemplate = {
                 //调整价
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 //价差
-                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
@@ -700,89 +700,93 @@ let baseFigureTemplate = {
                 //调整价
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 //价差
-                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
                 rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
         return rst;
         return rst;
     },
     },
-    'JGDEJJRGF': function () {//甲供定额基价人工费
+    'JGDEJJRGF': function (tender) {//甲供定额基价人工费
         let rst = 0;
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(glj.type === gljType.LABOUR){
             if(glj.type === gljType.LABOUR){
-                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj) * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj, tender) * calcBase.project.projectGLJ.getBasePrice(glj)).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
         return rst;
         return rst;
     },
     },
-    'JGDEJJCLF': function () {//甲供定额基价材料费
+    'JGDEJJCLF': function (tender) {//甲供定额基价材料费
         let rst = 0;
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0){
             if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0){
-                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj) * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj, tender) * calcBase.project.projectGLJ.getBasePrice(glj)).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
         return rst;
         return rst;
     },
     },
-    'JGDEJJJXF': function () {//甲供定额基价机械费
+    'JGDEJJJXF': function (tender) {//甲供定额基价机械费
         let rst = 0;
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0){
             if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0){
-                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj) * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj, tender) * calcBase.project.projectGLJ.getBasePrice(glj)).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
         return rst;
         return rst;
     },
     },
-    'JGRGF': function () {//甲供人工费
+    'JGRGF': function (tender) {//甲供人工费
         let rst = 0;
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(glj.type === gljType.LABOUR){
             if(glj.type === gljType.LABOUR){
-                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj) * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                const marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
+                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj, tender) * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
         return rst;
         return rst;
     },
     },
-    'JGCLF': function () {//甲供材料费
+    'JGCLF': function (tender) {//甲供材料费
         let rst = 0;
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0){
             if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0){
-                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj) * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                const marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
+                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj, tender) * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
         return rst;
         return rst;
     },
     },
-    'JGJXF': function () {//甲供机械费
+    'JGJXF': function (tender) {//甲供机械费
         let rst = 0;
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0){
             if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0){
-                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj) * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                const marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
+                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj, tender) * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
         return rst;
         return rst;
     },
     },
-    'JGZCF': function () {//甲供主材费
+    'JGZCF': function (tender) {//甲供主材费
         let rst = 0;
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(glj.type === gljType.MAIN_MATERIAL && glj.ratio_data.length === 0){
             if(glj.type === gljType.MAIN_MATERIAL && glj.ratio_data.length === 0){
-                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj) * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj, tender) * calcBase.project.projectGLJ.getBasePrice(glj)).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
         return rst;
         return rst;
     },
     },
-    'JGSBF': function () {//甲供设备费
+    'JGSBF': function (tender) {//甲供设备费
         let rst = 0;
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(glj.type === gljType.EQUIPMENT){
             if(glj.type === gljType.EQUIPMENT){
-                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj) * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                const marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
+                rst = (rst + parseFloat(projectGljObject.getSupplyQuantityByGlj(glj, tender) * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
         return rst;
         return rst;
@@ -793,7 +797,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(glj.type === gljType.LABOUR && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
             if(glj.type === gljType.LABOUR && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                rst = (rst + parseFloat(glj[quantityType] * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                rst = (rst + parseFloat(glj[quantityType] * calcBase.project.projectGLJ.getBasePrice(glj)).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
         return rst;
         return rst;
@@ -804,7 +808,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
             if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                rst = (rst + parseFloat(glj[quantityType] * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                rst = (rst + parseFloat(glj[quantityType] * calcBase.project.projectGLJ.getBasePrice(glj)).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
         return rst;
         return rst;
@@ -815,7 +819,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
             if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                rst = (rst + parseFloat(glj[quantityType] * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                rst = (rst + parseFloat(glj[quantityType] * calcBase.project.projectGLJ.getBasePrice(glj)).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
         return rst;
         return rst;
@@ -826,7 +830,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(glj.type === gljType.LABOUR && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
             if(glj.type === gljType.LABOUR && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
                 rst = (rst + parseFloat(glj[quantityType] * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
                 rst = (rst + parseFloat(glj[quantityType] * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
@@ -838,7 +842,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
             if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
                 rst = (rst + parseFloat(glj[quantityType] * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
                 rst = (rst + parseFloat(glj[quantityType] * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
@@ -850,7 +854,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
             if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
                 rst = (rst + parseFloat(glj[quantityType] * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
                 rst = (rst + parseFloat(glj[quantityType] * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
@@ -862,7 +866,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(glj.type === gljType.MAIN_MATERIAL && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
             if(glj.type === gljType.MAIN_MATERIAL && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                rst = (rst + parseFloat(glj[quantityType] * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                rst = (rst + parseFloat(glj[quantityType] * calcBase.project.projectGLJ.getBasePrice(glj)).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }
         return rst;
         return rst;
@@ -873,7 +877,7 @@ let baseFigureTemplate = {
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
         for(let glj of projGljs){
             if(glj.type === gljType.EQUIPMENT && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
             if(glj.type === gljType.EQUIPMENT && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : calcBase.project.projectGLJ.getMarketPrice(glj);
                 rst = (rst + parseFloat(glj[quantityType] * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
                 rst = (rst + parseFloat(glj[quantityType] * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
             }
         }
         }

+ 65 - 38
web/building_saas/main/js/models/calc_program.js

@@ -156,6 +156,10 @@ let calcTools = {
     isGljRation: function (treeNode) {
     isGljRation: function (treeNode) {
         return this.isRationCategory(treeNode) && treeNode.data.type === rationType.gljRation;
         return this.isRationCategory(treeNode) && treeNode.data.type === rationType.gljRation;
     },
     },
+    isVP_or_GLJR: function (treeNode) {       // 是量价或工料机类型的定额
+        return this.isRationCategory(treeNode) &&
+            (treeNode.data.type == rationType.volumePrice || treeNode.data.type == rationType.gljRation);
+    },
     isSameTypeNode: function (node1, node2) {
     isSameTypeNode: function (node1, node2) {
         if (node1.parent && node2.parent && (node1.parent === node2.parent) && (node1.sourceType === node1.sourceType)
         if (node1.parent && node2.parent && (node1.parent === node2.parent) && (node1.sourceType === node1.sourceType)
             && (node1.data && node2.data && node1.data.type === node2.data.type)){
             && (node1.data && node2.data && node1.data.type === node2.data.type)){
@@ -203,7 +207,7 @@ let calcTools = {
     getGLJList: function (treeNode, needOneBill) {
     getGLJList: function (treeNode, needOneBill) {
         delete treeNode.data.gljList;
         delete treeNode.data.gljList;
         if (this.isRationCategory(treeNode)) {
         if (this.isRationCategory(treeNode)) {
-            if (treeNode.data.type != rationType.volumePrice) {
+            if (!calcTools.isVP_or_GLJR(treeNode)){
                 treeNode.data.gljList = projectObj.project.calcProgram.getGljArrByRation(treeNode.data);
                 treeNode.data.gljList = projectObj.project.calcProgram.getGljArrByRation(treeNode.data);
             }
             }
         }
         }
@@ -211,7 +215,7 @@ let calcTools = {
             let nodeQ = this.uiNodeQty(treeNode);
             let nodeQ = this.uiNodeQty(treeNode);
             let q = nodeQ ? nodeQ : 1;
             let q = nodeQ ? nodeQ : 1;
             let allNodes = projectObj.project.Ration.getRationNodes(treeNode);
             let allNodes = projectObj.project.Ration.getRationNodes(treeNode);
-            let rNodes = allNodes.filter(function (node) {return node.data.type != rationType.volumePrice});
+            let rNodes = allNodes.filter(function (node) {return calcTools.isRationItem(node)});
             let rations = rNodes.map(function (node) {return node.data});
             let rations = rNodes.map(function (node) {return node.data});
             treeNode.data.gljList = projectObj.project.ration_glj.getGatherGljArrByRations(rations, needOneBill, q);
             treeNode.data.gljList = projectObj.project.ration_glj.getGatherGljArrByRations(rations, needOneBill, q);
         };
         };
@@ -662,7 +666,7 @@ let calcTools = {
             'tenderUnitFee': sumTU, 'tenderTotalFee': sumTT});
             'tenderUnitFee': sumTU, 'tenderTotalFee': sumTT});
     },
     },
     marketPriceToBase: function (treeNode, baseName, isTender) {
     marketPriceToBase: function (treeNode, baseName, isTender) {
-        if (treeNode.data.type != rationType.volumePrice && treeNode.data.type != rationType.gljRation) return;
+        if (!calcTools.isVP_or_GLJR(treeNode)) return;
         let result = 0, me = this;
         let result = 0, me = this;
 
 
         function isRCJZC(treeNode, baseName) {         // 基数名称中是否包含人材机主设,且树结点类型要匹配一致
         function isRCJZC(treeNode, baseName) {         // 基数名称中是否包含人材机主设,且树结点类型要匹配一致
@@ -701,7 +705,7 @@ let calcTools = {
         }
         }
         else {
         else {
             if (isRCJZC(treeNode, baseName)) {
             if (isRCJZC(treeNode, baseName)) {
-                if (treeNode.data.type == rationType.volumePrice){
+                if (calcTools.isVolumePrice(treeNode)){
                     if (isTender){
                     if (isTender){
                         let coe = this.tenderCoe_GLJPrice();
                         let coe = this.tenderCoe_GLJPrice();
                         if (treeNode.data.marketUnitFee)
                         if (treeNode.data.marketUnitFee)
@@ -712,7 +716,7 @@ let calcTools = {
                     else
                     else
                         result = treeNode.data.marketUnitFee ? parseFloat(treeNode.data.marketUnitFee).toDecimal(decimalObj.ration.unitPrice) : 0
                         result = treeNode.data.marketUnitFee ? parseFloat(treeNode.data.marketUnitFee).toDecimal(decimalObj.ration.unitPrice) : 0
                 }
                 }
-                else if (treeNode.data.type == rationType.gljRation)
+                else if (calcTools.isGljRation(treeNode))
                 // result = treeNode.data.basePrice ? parseFloat(treeNode.data.basePrice).toDecimal(decimalObj.ration.unitPrice) : 0;
                 // result = treeNode.data.basePrice ? parseFloat(treeNode.data.basePrice).toDecimal(decimalObj.ration.unitPrice) : 0;
                 // 这里因为是算基数所以要取基价,但不能直接取basePrice,受限于项目属性的三个选项。
                 // 这里因为是算基数所以要取基价,但不能直接取basePrice,受限于项目属性的三个选项。
                     result = gljOprObj.getBasePrice(treeNode);
                     result = gljOprObj.getBasePrice(treeNode);
@@ -720,7 +724,7 @@ let calcTools = {
         };
         };
         return result;
         return result;
     },
     },
-    partASupplyFee: function (treeNode, baseName, isTender, isRationPirce = true) {
+    partASupplyFee: function (treeNode, baseName, isTender, isRationPirce = true) {     // isRationPirce 为true时表示取定额价。如:甲供定额材料费
         if (!treeNode.data.gljList) return 0;
         if (!treeNode.data.gljList) return 0;
         let projectGLJ = projectObj.project.projectGLJ;
         let projectGLJ = projectObj.project.projectGLJ;
 
 
@@ -774,7 +778,6 @@ let calcTools = {
         let sum = 0;
         let sum = 0;
         for (let glj of treeNode.data.gljList){
         for (let glj of treeNode.data.gljList){
             let gljQ = isTender ? glj.tenderQuantity : glj.quantity;
             let gljQ = isTender ? glj.tenderQuantity : glj.quantity;
-            gljP = isRationPirce ? glj.basePrice : glj.marketPrice;
 
 
             let X = 1;    // 部分甲供系数(默认1,即完全甲供)
             let X = 1;    // 部分甲供系数(默认1,即完全甲供)
             let tempSGLJ = supplyGLJsIdx[glj.projectGLJID];
             let tempSGLJ = supplyGLJsIdx[glj.projectGLJID];
@@ -782,15 +785,17 @@ let calcTools = {
             if (tempSGLJ) {
             if (tempSGLJ) {
                 // 处理部分甲供
                 // 处理部分甲供
                 if (baseName.includes('甲供') && (tempSGLJ.supply == supplyType.BFJG)){
                 if (baseName.includes('甲供') && (tempSGLJ.supply == supplyType.BFJG)){
-                    // let Q =  isTender ? tempSGLJ.tenderQuantity : tempSGLJ.quantity;
-                    let Q = tempSGLJ.quantity;
+                    let Q =  isTender ? tempSGLJ.tenderQuantity : tempSGLJ.quantity;
+                    // let Q = tempSGLJ.quantity;
                     Q = Q ? Q : 1;
                     Q = Q ? Q : 1;
                     X = tempSGLJ.supply_quantity / Q;
                     X = tempSGLJ.supply_quantity / Q;
-                }
+                };
+                let gljP = isRationPirce ? glj.basePrice : (isTender ? projectGLJ.getTenderMarketPrice(calcTools.getProjectGLJ(glj)) : glj.marketPrice);
                 sum = (sum + gljP * gljQ * X).toDecimal(decimalObj.process);
                 sum = (sum + gljP * gljQ * X).toDecimal(decimalObj.process);
             }
             }
             else{   // 当前材料不是甲供材料
             else{   // 当前材料不是甲供材料
-                if (compT.includes(glj.type)) {   // 混凝土等。组成物的母体,母体如果有组成物,则母体无法作为甲供材料,无法设置,此时要看其组成物是否是甲供材料;母体如果没有组成物,则母体有可能成为甲供材料。
+                // 混凝土等。组成物的母体,母体如果有组成物,则母体无法作为甲供材料,无法设置,此时要看其组成物是否是甲供材料;母体如果没有组成物,则母体有可能成为甲供材料。
+                if (compT.includes(glj.type)) {
                     let pGLJ = projectGLJ.getDataByID(glj.projectGLJID);
                     let pGLJ = projectGLJ.getDataByID(glj.projectGLJID);
                     let compositions = pGLJ.ratio_data;    // 组成物明细
                     let compositions = pGLJ.ratio_data;    // 组成物明细
                     if (compositions.length > 0){
                     if (compositions.length > 0){
@@ -800,7 +805,7 @@ let calcTools = {
                                 if (baseName.includes('甲供') && (c.supply == supplyType.BFJG)){
                                 if (baseName.includes('甲供') && (c.supply == supplyType.BFJG)){
                                     X = c.supplyX;
                                     X = c.supplyX;
                                 };
                                 };
-                                let cP = isRationPirce ? c.basePrice : c.marketPrice;
+                                let cP = isRationPirce ? c.basePrice : (isTender ? projectGLJ.getTenderMarketPrice(calcTools.getProjectGLJ(c)) : c.marketPrice);
                                 sum = (sum + cP * c.consumption * gljQ * X).toDecimal(decimalObj.process);
                                 sum = (sum + cP * c.consumption * gljQ * X).toDecimal(decimalObj.process);
                             }
                             }
                         }
                         }
@@ -949,17 +954,21 @@ let calcTools = {
             let qCoe = 1;
             let qCoe = 1;
             /* 量价、工料机类型的定额,在反向调价之调整人材机消耗量系数时,因为他们没有工料机可调,调价结果没变,影响汇总后的父结点金额。
             /* 量价、工料机类型的定额,在反向调价之调整人材机消耗量系数时,因为他们没有工料机可调,调价结果没变,影响汇总后的父结点金额。
             所以要特殊处理:此种情况下仍然要调量价的消耗量,即还是要像"子目工程量调整系数"方式那样调,但系数又不能在"子目工程量调整系数"
             所以要特殊处理:此种情况下仍然要调量价的消耗量,即还是要像"子目工程量调整系数"方式那样调,但系数又不能在"子目工程量调整系数"
-            中显示出来,所以可以改变tenderQuantity达到同样的效果以瞒天过海。所以在取系数时,无论什么系数,只要能取到就算正确。 */
-            if (treeNode.data.type == rationType.volumePrice || treeNode.data.type == rationType.gljRation){
-                if (treeNode.data.rationQuantityCoe)
-                    qCoe = treeNode.data.rationQuantityCoe
-                else if (treeNode.data.quantityCoe && treeNode.data.quantityCoe.labour)
-                    qCoe = treeNode.data.quantityCoe.labour;
-            }
-            else {
+            中显示出来(明明是调工料机,你却调到树结点上,这比较搞笑啊),所以可以改变tenderQuantity达到同样的效果以瞒天过海。所以在取系数时,
+            无论什么系数,只要能取到就算正确。
+            2020-04-05 注: 以上是老黄历。新思路是量价只作为定额调整,不作为工料机调整。两种反调模式下,统一都只调子目消耗量系数。
+            为避免歧义,量价的工料机调整系数不允许输入。
+            */
+            // if (calcTools.isVP_or_GLJR(treeNode)){
+            //     if (treeNode.data.rationQuantityCoe)
+            //         qCoe = treeNode.data.rationQuantityCoe
+            //     else if (treeNode.data.quantityCoe && treeNode.data.quantityCoe.labour)
+            //         qCoe = treeNode.data.quantityCoe.labour;
+            // }
+            // else {
                 if (treeNode.data.rationQuantityCoe)
                 if (treeNode.data.rationQuantityCoe)
                     qCoe = treeNode.data.rationQuantityCoe;
                     qCoe = treeNode.data.rationQuantityCoe;
-            };
+            // };
             if (qCoe == '0' || qCoe == 0) qCoe = 1;
             if (qCoe == '0' || qCoe == 0) qCoe = 1;
             treeNode.data.tenderQuantity = (this.uiNodeQty(treeNode) * qCoe).toDecimal(decimalObj.decimal("quantity", treeNode));
             treeNode.data.tenderQuantity = (this.uiNodeQty(treeNode) * qCoe).toDecimal(decimalObj.decimal("quantity", treeNode));
             return treeNode.data.tenderQuantity;
             return treeNode.data.tenderQuantity;
@@ -1151,34 +1160,34 @@ let rationCalcBases = {
         return calcTools.labourDays(node, isTender);
         return calcTools.labourDays(node, isTender);
     },
     },
     '甲供定额基价人工费': function (node, isTender) {
     '甲供定额基价人工费': function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲供定额基价人工费', isTender);
+        return calcTools.partASupplyFee(node, '甲供定额基价人工费', isTender, true);
     },
     },
     '甲供定额基价材料费': function (node, isTender) {
     '甲供定额基价材料费': function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲供定额基价材料费', isTender);
+        return calcTools.partASupplyFee(node, '甲供定额基价材料费', isTender, true);
     },
     },
     '甲供定额基价机械费': function (node, isTender) {
     '甲供定额基价机械费': function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲供定额基价机械费', isTender);
+        return calcTools.partASupplyFee(node, '甲供定额基价机械费', isTender, true);
     },
     },
     '甲供主材费': function (node, isTender) {
     '甲供主材费': function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲供主材费', isTender);
+        return calcTools.partASupplyFee(node, '甲供主材费', isTender, false);
     },
     },
     '甲供设备费': function (node, isTender) {
     '甲供设备费': function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲供设备费', isTender);
+        return calcTools.partASupplyFee(node, '甲供设备费', isTender, false);
     },
     },
     '甲定定额基价人工费': function (node, isTender) {
     '甲定定额基价人工费': function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲定定额基价人工费', isTender);
+        return calcTools.partASupplyFee(node, '甲定定额基价人工费', isTender, true);
     },
     },
     '甲定定额基价材料费': function (node, isTender) {
     '甲定定额基价材料费': function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲定定额基价材料费', isTender);
+        return calcTools.partASupplyFee(node, '甲定定额基价材料费', isTender, true);
     },
     },
     '甲定定额基价机械费': function (node, isTender) {
     '甲定定额基价机械费': function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲定定额基价机械费', isTender);
+        return calcTools.partASupplyFee(node, '甲定定额基价机械费', isTender, true);
     },
     },
     '甲定主材费': function (node, isTender) {
     '甲定主材费': function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲定主材费', isTender);
+        return calcTools.partASupplyFee(node, '甲定主材费', isTender, false);
     },
     },
     '甲定设备费': function (node, isTender) {
     '甲定设备费': function (node, isTender) {
-        return calcTools.partASupplyFee(node, '甲定设备费', isTender);
+        return calcTools.partASupplyFee(node, '甲定设备费', isTender, false);
     },
     },
     '暂估材料费': function (node, isTender) {
     '暂估材料费': function (node, isTender) {
         return calcTools.estimateFee(node, true, isTender);
         return calcTools.estimateFee(node, true, isTender);
@@ -1562,7 +1571,7 @@ let executeObj = {
         let me = executeObj;
         let me = executeObj;
 
 
         // 量价、工料机形式的定额, 要把自己的市场单价用于计算程序中的基数。
         // 量价、工料机形式的定额, 要把自己的市场单价用于计算程序中的基数。
-        if (calcTools.isVolumePrice(me.treeNode) || calcTools.isGljRation(me.treeNode))
+        if (calcTools.isVP_or_GLJR(me.treeNode))
             return calcTools.marketPriceToBase(me.treeNode, baseName, isTender)
             return calcTools.marketPriceToBase(me.treeNode, baseName, isTender)
         else{
         else{
             if (!rationCalcBases[baseName]){
             if (!rationCalcBases[baseName]){
@@ -1799,6 +1808,16 @@ class CalcProgram {
             return ['labour', 'material', 'machine', 'mainMaterial', 'equipment'].indexOf(type) > -1;
             return ['labour', 'material', 'machine', 'mainMaterial', 'equipment'].indexOf(type) > -1;
         };
         };
 
 
+        // 不能直接删除该属性,否则无法冲掉库中已存储的值。下同。
+        function deleteProperties (treeNode, propNamesArr){
+            for (let pn of propNamesArr){
+                if (treeNode.data[pn]){
+                    treeNode.data[pn] = null;
+                    treeNode.changed = true;
+                }
+            };
+        };
+
         /*删掉多余的费用。例如:从其它计算方式(有很多费)切换到公式计算方式(只需要common费),多出来的费要删除。
         /*删掉多余的费用。例如:从其它计算方式(有很多费)切换到公式计算方式(只需要common费),多出来的费要删除。
         fieldNameArr 值取自:遍历treeNode的计算规则,取有绑定的字段名。这些字段名以外的fee是因旧计算多出来的,需要删除。 */
         fieldNameArr 值取自:遍历treeNode的计算规则,取有绑定的字段名。这些字段名以外的fee是因旧计算多出来的,需要删除。 */
         function deleteUselessFees(treeNode, fieldNameArr){
         function deleteUselessFees(treeNode, fieldNameArr){
@@ -1908,9 +1927,10 @@ class CalcProgram {
         // 叶子清单无子结点、无公式计算(啥都没有时)
         // 叶子清单无子结点、无公式计算(啥都没有时)
         else if (treeNode.calcType == treeNodeCalcType.ctNull){
         else if (treeNode.calcType == treeNodeCalcType.ctNull){
             delete treeNode.data.gljList;
             delete treeNode.data.gljList;
-
+            deleteProperties(treeNode, ['calcBase', 'calcBaseValue', 'tenderCalcBaseValue', 'programID']);
+            deleteUselessFees(treeNode, ['common', 'rationCommon']);
             // 不能直接删除该属性,否则无法冲掉库中已存储的值。下同。
             // 不能直接删除该属性,否则无法冲掉库中已存储的值。下同。
-            if (treeNode.data.calcBase){
+/*            if (treeNode.data.calcBase){
                 treeNode.data.calcBase = null;
                 treeNode.data.calcBase = null;
                 treeNode.changed = true;
                 treeNode.changed = true;
             }
             }
@@ -1928,7 +1948,7 @@ class CalcProgram {
             if (treeNode.data.programID) {
             if (treeNode.data.programID) {
                 treeNode.data.programID = null;
                 treeNode.data.programID = null;
                 treeNode.changed = true;
                 treeNode.changed = true;
-            };
+            };*/
 
 
             // 第1、2部分以外的叶子清单在没有公式的情况下可以手工修改综合单价并参与计算。
             // 第1、2部分以外的叶子清单在没有公式的情况下可以手工修改综合单价并参与计算。
             // 2017-09-27 需求改了,除了第 1 、 2.2部分以外,都可以手工修改综合单价、综合合价并参与计算
             // 2017-09-27 需求改了,除了第 1 、 2.2部分以外,都可以手工修改综合单价、综合合价并参与计算
@@ -1996,7 +2016,7 @@ class CalcProgram {
 
 
             if (treeNode.calcType == treeNodeCalcType.ctRationCalcProgram) {
             if (treeNode.calcType == treeNodeCalcType.ctRationCalcProgram) {
                 // 量价、工料机类型的定额要求市场合价
                 // 量价、工料机类型的定额要求市场合价
-                if (treeNode.data.type == rationType.volumePrice || treeNode.data.type == rationType.gljRation){
+                if (calcTools.isVP_or_GLJR(treeNode)){
                     let muf = treeNode.data.marketUnitFee ? treeNode.data.marketUnitFee : 0;
                     let muf = treeNode.data.marketUnitFee ? treeNode.data.marketUnitFee : 0;
                     let mtf = (muf * nQ).toDecimal(decimalObj.ration.totalPrice);
                     let mtf = (muf * nQ).toDecimal(decimalObj.ration.totalPrice);
                     if (treeNode.data.marketTotalFee != mtf){
                     if (treeNode.data.marketTotalFee != mtf){
@@ -2330,20 +2350,27 @@ class CalcProgram {
         if (treeNode.data.feesIndex.common.totalFee != 0)
         if (treeNode.data.feesIndex.common.totalFee != 0)
             coe = (treeNode.data.targetUnitFee / treeNode.data.feesIndex.common.unitFee).toDecimal(decimalObj.process);
             coe = (treeNode.data.targetUnitFee / treeNode.data.feesIndex.common.unitFee).toDecimal(decimalObj.process);
 
 
-        if (tender == tenderTypes.ttReverseRation){
+        // 调价情况之————量价反调工料机(量价无工料机可调,还是按定额来调,即直接调树结点的消耗量)
+        let isVP_RevGLJ =(tender == tenderTypes.ttReverseGLJ) && calcTools.isVP_or_GLJR(treeNode);
+
+        if ((tender == tenderTypes.ttReverseRation) || isVP_RevGLJ){
             treeNode.data.tenderQuantity = (treeNode.data.quantity * coe).toDecimal(decimalObj.decimal("quantity", treeNode));
             treeNode.data.tenderQuantity = (treeNode.data.quantity * coe).toDecimal(decimalObj.decimal("quantity", treeNode));
             if (treeNode.data.rationQuantityCoe != coe){
             if (treeNode.data.rationQuantityCoe != coe){
                 treeNode.data.rationQuantityCoe = coe;
                 treeNode.data.rationQuantityCoe = coe;
                 treeNode.changed = true;
                 treeNode.changed = true;
             };
             };
 
 
+            if (isVP_RevGLJ){
+                treeNode.data.quantityCoe = {labour: 0, material: 0, machine: 0, main: 0, equipment: 0};
+                treeNode.changed = true;
+            };
+
             let ttf = (treeNode.data.tenderQuantity * treeNode.data.feesIndex.common.tenderUnitFee).toDecimal(decimalObj.decimal('totalPrice', treeNode));
             let ttf = (treeNode.data.tenderQuantity * treeNode.data.feesIndex.common.tenderUnitFee).toDecimal(decimalObj.decimal('totalPrice', treeNode));
             if (treeNode.data.feesIndex.common.tenderTotalFee != ttf){
             if (treeNode.data.feesIndex.common.tenderTotalFee != ttf){
                 treeNode.data.feesIndex.common.tenderTotalFee = ttf;
                 treeNode.data.feesIndex.common.tenderTotalFee = ttf;
                 treeNode.changed = true;
                 treeNode.changed = true;
             };
             };
         }else if (tender == tenderTypes.ttReverseGLJ){
         }else if (tender == tenderTypes.ttReverseGLJ){
-            //     treeNode.data.tenderQuantity = treeNode.data.quantity;   // 这句好像多余,因为调用calculate()时里面会重新计算tenderQuantity,有问题再放开AAAAA
             let qcObj = treeNode.data.quantityCoe;
             let qcObj = treeNode.data.quantityCoe;
             if (!qcObj || calcTools.isEmptyObject(qcObj)){
             if (!qcObj || calcTools.isEmptyObject(qcObj)){
                 treeNode.data.quantityCoe = {labour: coe, material: coe, machine: coe, main: coe, equipment: coe};
                 treeNode.data.quantityCoe = {labour: coe, material: coe, machine: coe, main: coe, equipment: coe};

+ 2 - 2
web/building_saas/main/js/views/project_glj_view.js

@@ -1015,7 +1015,7 @@ let projectGljObject={
         supplyQuantity = parseFloat(supplyQuantity);
         supplyQuantity = parseFloat(supplyQuantity);
         return supplyQuantity;
         return supplyQuantity;
     },
     },
-    getSupplyQuantityByGlj:function (glj) {
+    getSupplyQuantityByGlj:function (glj, tender) {
         //{"自行采购":0,"部分甲供":1,"完全甲供":2,"甲定乙供":3};
         //{"自行采购":0,"部分甲供":1,"完全甲供":2,"甲定乙供":3};
         let supply_quantity = glj.supply_quantity;
         let supply_quantity = glj.supply_quantity;
         switch (glj.supply){
         switch (glj.supply){
@@ -1025,7 +1025,7 @@ let projectGljObject={
             case 1:
             case 1:
                 break;
                 break;
             case 2:
             case 2:
-                supply_quantity = glj.quantity;
+                supply_quantity = tender ? glj.tenderQuantity : glj.quantity;
                 break;
                 break;
             case 3:
             case 3:
                 supply_quantity = 0;
                 supply_quantity = 0;

+ 16 - 14
web/building_saas/main/js/views/sub_view.js

@@ -142,6 +142,7 @@ let subObj = {
         let tabID = "";
         let tabID = "";
         if($('#qdzy').is(':visible')) tabID = "qdzy";
         if($('#qdzy').is(':visible')) tabID = "qdzy";
         if($('#qdjl').is(':visible')) tabID = "qdjl";
         if($('#qdjl').is(':visible')) tabID = "qdjl";
+        if(tabID == "") return;
         //总宽度
         //总宽度
         let totalWidth = $('#subItems').width();
         let totalWidth = $('#subItems').width();
         //人材机和项目特征文本比例
         //人材机和项目特征文本比例
@@ -910,20 +911,21 @@ $('.gljSubTab ul li a').on('shown.bs.tab', function () {
 //显示格式
 //显示格式
 $('#tzCharacterText').blur(async function () {
 $('#tzCharacterText').blur(async function () {
   let billID = $("#xmtz_billID").val();
   let billID = $("#xmtz_billID").val();
-  let htmlString = $(this).html();
-  let value = htmlString.replace(/&nbsp;/g," ");
-  if(value.indexOf("<div>")!= -1){
-      let preString = value.substring(0,value.indexOf("<div>"));
-      let arrayText =[];
-      let divArray = value.match(/<div>(.*?)<\/div>/g);
-      for(let d of divArray){
-          t = d.match(/<div>(\S*)<\/div>/)[1];
-          if(t == "<br>") t="";
-          arrayText.push(t)
-      }
-      value = preString +"\n"+ arrayText.join("\n");
-  }
-  value = value.replace(/<br>/g,"\n");
+  let value = $(this).val();
+  //let htmlString = $(this).html();
+  // let value = htmlString.replace(/&nbsp;/g," ");
+  // if(value.indexOf("<div>")!= -1){
+  //     let preString = value.substring(0,value.indexOf("<div>"));
+  //     let arrayText =[];
+  //     let divArray = value.match(/<div>(.*?)<\/div>/g);
+  //     for(let d of divArray){
+  //         t = d.match(/<div>(\S*)<\/div>/)[1];
+  //         if(t == "<br>") t="";
+  //         arrayText.push(t)
+  //     }
+  //     value = preString +"\n"+ arrayText.join("\n");
+  // } 
+  // value = value.replace(/<br>/g,"\n");
 
 
   let billNode = projectObj.project.mainTree.getNodeByID(billID);
   let billNode = projectObj.project.mainTree.getNodeByID(billID);
   if(billNode && value == billNode.data.itemCharacterText) return;
   if(billNode && value == billNode.data.itemCharacterText) return;

+ 28 - 15
web/building_saas/main/js/views/tender_price_view.js

@@ -15,12 +15,12 @@ let tender_obj={
             {headerName: "计量\n单位", headerWidth: 60, dataCode: "unit", hAlign: "center", dataType: "String",spanRows: [2]},
             {headerName: "计量\n单位", headerWidth: 60, dataCode: "unit", hAlign: "center", dataType: "String",spanRows: [2]},
             {headerName: "工程量", headerWidth: 70, dataCode: "quantity", hAlign: "right", dataType: "Number",validator:"number",spanRows: [2],getText:'getText.quantity'},
             {headerName: "工程量", headerWidth: 70, dataCode: "quantity", hAlign: "right", dataType: "Number",validator:"number",spanRows: [2],getText:'getText.quantity'},
             // {headerName: "不调价", headerWidth: 55, dataCode: "is_adjust_price", hAlign: "center", cellType : "checkBox",dataType: "Number",spanRows: [2]},
             // {headerName: "不调价", headerWidth: 55, dataCode: "is_adjust_price", hAlign: "center", cellType : "checkBox",dataType: "Number",spanRows: [2]},
-            {headerName: ["初始报价","综合单价"], headerWidth: 80, dataCode: "feesIndex.common.unitFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [2,1]},
-            {headerName: ["","综合合价"], headerWidth: 80, dataCode: "feesIndex.common.totalFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
-            {headerName: ["目标造价","综合单价"], headerWidth: 80, dataCode: "targetUnitFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [2,1]},
-            {headerName: ["","综合合价"], headerWidth: 80, dataCode: "targetTotalFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
-            {headerName: ["调整后报价","综合单价"], headerWidth: 80, dataCode: "feesIndex.common.tenderUnitFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [2,1]},
-            {headerName: ["","综合合价"], headerWidth: 80, dataCode: "feesIndex.common.tenderTotalFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
+            {headerName: ["初始报价","综合单价"], headerWidth: 100, dataCode: "feesIndex.common.unitFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [2,1]},
+            {headerName: ["","综合合价"], headerWidth: 100, dataCode: "feesIndex.common.totalFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
+            {headerName: ["目标造价","综合单价"], headerWidth: 100, dataCode: "targetUnitFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [2,1]},
+            {headerName: ["","综合合价"], headerWidth: 100, dataCode: "targetTotalFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
+            {headerName: ["调整后报价","综合单价"], headerWidth: 100, dataCode: "feesIndex.common.tenderUnitFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [2,1]},
+            {headerName: ["","综合合价"], headerWidth: 100, dataCode: "feesIndex.common.tenderTotalFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
             {headerName: ["消耗量调整系数","人工"], headerWidth: 80, dataCode: "quantityCoe.labour", hAlign: "right", dataType: "Number",validator:"number",spanCols : [5,1]},
             {headerName: ["消耗量调整系数","人工"], headerWidth: 80, dataCode: "quantityCoe.labour", hAlign: "right", dataType: "Number",validator:"number",spanCols : [5,1]},
             {headerName: ["","材料"], headerWidth: 80, dataCode: "quantityCoe.material", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
             {headerName: ["","材料"], headerWidth: 80, dataCode: "quantityCoe.material", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
             {headerName: ["","机械"], headerWidth: 80, dataCode: "quantityCoe.machine", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
             {headerName: ["","机械"], headerWidth: 80, dataCode: "quantityCoe.machine", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
@@ -215,19 +215,22 @@ let tender_obj={
     onEnterCell : function (sender,args) {
     onEnterCell : function (sender,args) {
         let me = tender_obj, row = args.row, col = args.col;
         let me = tender_obj, row = args.row, col = args.col;
         if ([7, 8].includes(col)){                                  // 目标单价、目标合价
         if ([7, 8].includes(col)){                                  // 目标单价、目标合价
-            let node = me.tenderTree.items[row];
-            if (calcTools.isCalcBaseBill(node)){                    // 公式结点只读
+            let treeNode = me.tenderTree.items[row];
+            if (calcTools.isCalcBaseBill(treeNode)){                    // 公式结点只读
                 me.tenderSheet.getCell(row, col).locked(true);
                 me.tenderSheet.getCell(row, col).locked(true);
-            }
+            };
         }
         }
     },
     },
     updateChildrenValue:function (node,dataCode,value,datas,nodes) {
     updateChildrenValue:function (node,dataCode,value,datas,nodes) {
          if(node.children.length > 0){
          if(node.children.length > 0){
             for(let c of node.children){
             for(let c of node.children){
-                this.updateChildrenValue(c,dataCode,value,datas,nodes);
+                let v = value;
+                if ((dataCode.indexOf("quantityCoe.") != -1) && (calcTools.isVolumePrice(c) || calcTools.isGljRation(c)))
+                    v = 0;
+                this.updateChildrenValue(c,dataCode,v,datas,nodes);
                 let updateData = {type:c.sourceType,data:{'ID' : c.data.ID}};
                 let updateData = {type:c.sourceType,data:{'ID' : c.data.ID}};
-                updateData.data[dataCode] = value;
-                if(dataCode == 'is_adjust_price' && value == 1){
+                updateData.data[dataCode] = v;
+                if(dataCode == 'is_adjust_price' && v == 1){
                     updateData = this.cleanTenderCoe(updateData,c);
                     updateData = this.cleanTenderCoe(updateData,c);
                 }else if(dataCode.indexOf("Coe")!= -1 && c.data.is_adjust_price == 1){//更新调整系数时忽略不调价的行
                 }else if(dataCode.indexOf("Coe")!= -1 && c.data.is_adjust_price == 1){//更新调整系数时忽略不调价的行
                     continue;
                     continue;
@@ -359,8 +362,7 @@ let tender_obj={
         let me = tender_obj, row = args.row, col = args.col;
         let me = tender_obj, row = args.row, col = args.col;
         if(me.editChecking(row,col) == false){
         if(me.editChecking(row,col) == false){
             args.cancel = true;
             args.cancel = true;
-        }
-
+        };
     },
     },
     editChecking:function (row,col,isPaste = false) {//return false表示不能编辑
     editChecking:function (row,col,isPaste = false) {//return false表示不能编辑
         let me = tender_obj;
         let me = tender_obj;
@@ -390,6 +392,12 @@ let tender_obj={
                 return false;
                 return false;
             }
             }
         }
         }
+        // 量价类,工料机消耗量调整系数不允许输入
+        let treeNode = me.tenderTree.items[row];
+        if (calcTools.isVolumePrice(treeNode) || calcTools.isGljRation(treeNode)){
+            if ([11,12,13,14,15].includes(col))
+                return false;
+        };
         return true;
         return true;
     },
     },
     initPageContent: function () {
     initPageContent: function () {
@@ -456,12 +464,17 @@ $(function () {
 
 
     $('#calcPriceOption').change(function(){
     $('#calcPriceOption').change(function(){
         let me = tender_obj;
         let me = tender_obj;
+
         let newVal = $(this).val();
         let newVal = $(this).val();
         let datas = me.calcOptionsChecking(newVal);
         let datas = me.calcOptionsChecking(newVal);
         let updateData = {type:ModuleNames.project,data:{'ID' : projectObj.project.ID(),'property.tenderSetting.calcPriceOption':newVal}};
         let updateData = {type:ModuleNames.project,data:{'ID' : projectObj.project.ID(),'property.tenderSetting.calcPriceOption':newVal}};
         datas.push(updateData);
         datas.push(updateData);
         me.updateTenderData(datas,function () {
         me.updateTenderData(datas,function () {
             me.refreshTenderTreeByDatas(datas);
             me.refreshTenderTreeByDatas(datas);
+            // 反向调价时,一切换,就先把单价系数显示成1。这里仅表皮显示变了,满足客户的好奇心,后台没有同步。真正干活的是在点了调价按钮之时。
+            let tenderType = $('#calcPriceOption').val();
+            if(tenderType == 'priceBase_RCJ' || tenderType == 'priceBase_ZM')
+                $('#gljPriceTenderCoe').val(1);
         });
         });
     });
     });
 
 
@@ -477,7 +490,7 @@ $(function () {
         });
         });
     });
     });
 
 
-    $('#tenderPrice').on('click', function () {
+    $('#calcTender').on('click', function () {
         let callback = function () {
         let callback = function () {
             // projectObj.project.saveProperty('hasTender', true);  // 一定调价,这个属性已失去意义
             // projectObj.project.saveProperty('hasTender', true);  // 一定调价,这个属性已失去意义
             if (projectObj.project.property.needRestoreGgljPriceTenderCoe){         // 入库存储,清理标记,刷新UI显示
             if (projectObj.project.property.needRestoreGgljPriceTenderCoe){         // 入库存储,清理标记,刷新UI显示

+ 6 - 8
web/building_saas/pm/js/pm_import.js

@@ -446,7 +446,9 @@ const importView = (() => {
                     xmlObj.name += `(${moment(Date.now()).format('YYYY-MM-DD HH:mm:ss')})`;
                     xmlObj.name += `(${moment(Date.now()).format('YYYY-MM-DD HH:mm:ss')})`;
                 }
                 }
                 $('#importInterface').modal('hide');
                 $('#importInterface').modal('hide');
-                pr.start('导入文件', '正在生成文件,请稍候……');
+                //pr.start('导入文件', '正在生成文件,请稍候……');
+                $.bootstrapLoading.progressStart('导入文件', true);
+                $("#progress_modal_body").text('正在导入接口文件,请稍候……');
                 let importData = await importXML.transformData(xmlObj);
                 let importData = await importXML.transformData(xmlObj);
                 console.log(importData);
                 console.log(importData);
                 let blob = new Blob([JSON.stringify(importData)], { type: 'text/plain;charset=utf-8' });
                 let blob = new Blob([JSON.stringify(importData)], { type: 'text/plain;charset=utf-8' });
@@ -454,15 +456,11 @@ const importView = (() => {
                 const key = `${uuid.v1()}.json`;
                 const key = `${uuid.v1()}.json`;
                 const file = new File([blob], key);
                 const file = new File([blob], key);
                 // 上传文件
                 // 上传文件
-                console.time();
                 await projTreeObj.getUploadToken();
                 await projTreeObj.getUploadToken();
                 await UPLOAD_CDN.uploadSync(file, key, projTreeObj.uptoken);
                 await UPLOAD_CDN.uploadSync(file, key, projTreeObj.uptoken);
                 // 下载并处理文件
                 // 下载并处理文件
-                const rstData = await ajaxPost('/pm/import/importInterface', { key });
-                console.timeEnd();
-                if (Array.isArray(rstData)) {
-                    doAfterImport(rstData);
-                }
+                await ajaxPost('/pm/import/importInterface', { key });
+                await importProcessChecking(key, null, (projectData) => handleProjectAfterChecking(projectData));
             } catch (err) {
             } catch (err) {
                 console.log(err);
                 console.log(err);
                 alert(err);
                 alert(err);
@@ -471,7 +469,7 @@ const importView = (() => {
                 setTimeout(function () {
                 setTimeout(function () {
                     STATE.importing = false;
                     STATE.importing = false;
                 }, 500);
                 }, 500);
-                pr.end();
+                //pr.end();
             }
             }
         });
         });
         // 导入窗口激活
         // 导入窗口激活

+ 114 - 88
web/building_saas/pm/js/pm_newMain.js

@@ -386,8 +386,8 @@ const projTreeObj = {
             name: '导入招投标接口文件',
             name: '导入招投标接口文件',
             icon: 'fa-cloud-upload',
             icon: 'fa-cloud-upload',
             visible: function () {
             visible: function () {
-                //return compilationData && compilationData.name === '重庆定额(2018)';
-                return true;
+                const names = ['重庆定额(2018)', '广东定额(2018)'];
+                return compilationData && names.includes(compilationData.name);
             },
             },
             callback: function () {
             callback: function () {
                 $('#importInterface').modal('show');
                 $('#importInterface').modal('show');
@@ -951,7 +951,9 @@ const projTreeObj = {
             const nodeIndent = node ? (node.depth() + 1) * indent +  node.depth() * levelIndent + imgWidth + 5 : 0;
             const nodeIndent = node ? (node.depth() + 1) * indent +  node.depth() * levelIndent + imgWidth + 5 : 0;
             const cellWidth = context.sheet.getCell(-1, context.col).width();
             const cellWidth = context.sheet.getCell(-1, context.col).width();
             const textLength = this.getAutoFitWidth(...arguments);
             const textLength = this.getAutoFitWidth(...arguments);
-            const lineNum = Math.ceil(textLength / (cellWidth - nodeIndent));
+            const tempNum = textLength / (cellWidth - nodeIndent);
+            const lineNum = tempNum % 1 > 0.92 ? Math.ceil(tempNum + 1) : Math.ceil(tempNum); // 不这么处理的话有些行高算出来不对
+            //const lineNum = Math.ceil(textLength / (cellWidth - nodeIndent));
             return lineNum * defaultHeight;
             return lineNum * defaultHeight;
         };
         };
         TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
         TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
@@ -2705,44 +2707,45 @@ $(document).ready(function() {
         });
         });
     });
     });
     // 复制到操作
     // 复制到操作
-    $("#copy-to-confirm").click(function() {
-        let originalNode = projTreeObj.tree.selected;
-        let toNode = projTreeObj.copySelected;
-        let projectNode;    //建设项目节点
+    $("#copy-to-confirm").click(async function() {
+        try {
+            let originalNode = projTreeObj.tree.selected;
+            let toNode = projTreeObj.copySelected;
+            let projectNode;    //建设项目节点
         let parent = null,next = null,projectMap={};
         let parent = null,next = null,projectMap={};
-        if(toNode.data.projType == projectType.engineering){//复制为目标的子节点
-            projectNode = toNode.parent;
-            parent = toNode;
-            next = toNode.firstChild();
-        }else if(toNode.data.projType == projectType.tender){//复制为目标的后兄弟
-            projectNode = toNode.parent.parent;
-            parent = toNode.parent;
-            next = toNode.nextSibling;
-            projectMap['update'] = {query:{ID:toNode.id()}};//前一节点的下一个节点更新;
-        }
-        //目标建设项目的计税方法与单位工程的一致时,才可复制到,否则提示“当前单位工程计税方法与目标建设项目不一致,不可复制。 确定”。
-        if (projectNode.data.property.taxType != originalNode.data.property.taxType) {
-            alert('当前单位工程计税方法与目标建设项目不一致,不可复制。');
-            return false;
+            if(toNode.data.projType == projectType.engineering){//复制为目标的子节点
+                projectNode = toNode.parent;
+                parent = toNode;
+                next = toNode.firstChild();
+            }else if(toNode.data.projType == projectType.tender){//复制为目标的后兄弟
+                projectNode = toNode.parent.parent;
+                parent = toNode.parent;
+                next = toNode.nextSibling;
+                projectMap['update'] = {query:{ID:toNode.id()}};//前一节点的下一个节点更新;
+            }
+            //目标建设项目的计税方法与单位工程的一致时,才可复制到,否则提示“当前单位工程计税方法与目标建设项目不一致,不可复制。 确定”。
+            if (projectNode.data.property.taxType != originalNode.data.property.taxType) {
+                alert('当前单位工程计税方法与目标建设项目不一致,不可复制。');
+                return false;
+            }
+            let nextID = next?next.id():-1;
+            let projectData = _.cloneDeep(originalNode.data);
+            projectData['ParentID'] = parent.id();
+            projectData['NextSiblingID'] = nextID;
+            projectData['property'] ={};
+            projectData['property']['rootProjectID'] = parent.pid();
+            projectData['shareInfo'] = [];
+            let rename = projTreeObj.projectNameChecking(parent,originalNode,"复制");//重名检查
+            rename? projectData['name'] = rename:'';
+            projectMap['copy'] = {document:projectData};
+            $("#copy-to-dialog").modal('hide');
+            $.bootstrapLoading.progressStart('拷贝项目', true);
+            $("#progress_modal_body").text('正在拷贝项目,请稍候……');
+            await ajaxPost('/pm/api/copyProjects', {projectMap:projectMap,user_id: userID, tenderCount: 1});
+            await importProcessChecking(null, null, (newProjectData) => handleTenderAfterChecking(newProjectData, projectData));
+        } catch (err) {
+            alert(err);
         }
         }
-        let nextID = next?next.id():-1;
-        let projectData = _.cloneDeep(originalNode.data);
-        projectData['ParentID'] = parent.id();
-        projectData['NextSiblingID'] = nextID;
-        projectData['property'] ={};
-        projectData['property']['rootProjectID'] = parent.pid();
-        projectData['shareInfo'] = [];
-        let rename = projTreeObj.projectNameChecking(parent,originalNode,"复制");//重名检查
-        rename? projectData['name'] = rename:'';
-        projectMap['copy'] = {document:projectData};
-        $("#copy-to-dialog").modal('hide');
-        $.bootstrapLoading.start();
-        CommonAjax.post('/pm/api/copyProjects',{projectMap:projectMap,user_id: userID, tenderCount: 1},function (result) {
-            let newNode = projTreeObj.insert(result['copy'].document,parent,next);
-            let refreshNodes = projTreeObj.calEngineeringCost(newNode);
-            projTreeObj.refreshNodeData(refreshNodes);
-            $.bootstrapLoading.end();
-        }, null, 1000 * 60 * 5);
 
 
     });
     });
     $('#selectSameTypeProject').click(function(){
     $('#selectSameTypeProject').click(function(){
@@ -2988,17 +2991,6 @@ function initProjects(callback) {
             projTreeObj.tree = pmTree.createNew(projTreeObj.setting, datas);
             projTreeObj.tree = pmTree.createNew(projTreeObj.setting, datas);
             projTreeObj.tree.selected = projTreeObj.tree.items[0];
             projTreeObj.tree.selected = projTreeObj.tree.items[0];
             projTreeObj.workBook = projTreeObj.buildSheet(projTreeObj.workBook,'projSpread',projTreeObj.setting);
             projTreeObj.workBook = projTreeObj.buildSheet(projTreeObj.workBook,'projSpread',projTreeObj.setting);
-            // 调整列后自适应行高
-            /* projTreeObj.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.ColumnWidthChanged, function (e, info) {
-                info.sheet.suspendPaint();
-                info.sheet.suspendEvent();
-                const rowCount = info.sheet.getRowCount();
-                for (let i = 0; i < rowCount; i++) {
-                    info.sheet.autoFitRow(i);
-                }
-                info.sheet.resumePaint();
-                info.sheet.resumeEvent();
-            }); */
             const sheet = projTreeObj.workBook.getSheet(0);
             const sheet = projTreeObj.workBook.getSheet(0);
             sheet.options.frozenlineColor = '#ababab';
             sheet.options.frozenlineColor = '#ababab';
             sheet.frozenColumnCount(2);
             sheet.frozenColumnCount(2);
@@ -3024,28 +3016,33 @@ function initProjects(callback) {
 
 
 /**
 /**
  * 初始化数据
  * 初始化数据
- *
- * @return {void}
  */
  */
-function init(refresh = false) {
+async function init(refresh = false) {
+    console.log('init');
     //init spread and pmTree
     //init spread and pmTree
-    if(refresh == false) socketObject.connect('pm');//socket 连接;
-    if (isFirst) {
-        isFirst = false;
-        let pr = new SCComponent.InitProgressBar();
-        pr.start('欢迎使用大司空计价', '首次加载例题,请稍候……');
-        CommonAjax.post('/pm/api/prepareInitialData', {user_id: userID}, function () {
-            initProjects(function () {
-                pr.end();
-            });
-        });
-    } else {
-        $.bootstrapLoading.start();
-        initProjects(function () {
-            $.bootstrapLoading.end();
-        })
+    try {
+        if(refresh == false) socketObject.connect('pm');//socket 连接;
+        if (isFirst) {
+            isFirst = false;
+            $.bootstrapLoading.progressStart('欢迎使用大司空计价', true);
+            $("#progress_modal_body").text('首次加载例题,请稍候……');
+            await ajaxPost('/pm/api/prepareInitialData', {user_id: userID});
+            await importProcessChecking(null, null, () => {
+                initProjects(() => $.bootstrapLoading.progressEnd());
+            }, true);
+        } else {
+            await importProcessChecking(null, ({ content }) => {
+                $.bootstrapLoading.progressStart('欢迎使用大司空计价', true);
+                $("#progress_modal_body").text(content);
+            }, () => {
+                $.bootstrapLoading.start();
+                initProjects(() => $.bootstrapLoading.end());
+            }, true);
+        }
+        engineering = engineeringList !== null && engineeringList !== undefined ? JSON.parse(engineeringList) : [];
+    } catch (error) {
+        alert(error)
     }
     }
-    engineering = engineeringList !== null && engineeringList !== undefined ? JSON.parse(engineeringList) : [];
 }
 }
 
 
 function refreshAllPage(){
 function refreshAllPage(){
@@ -4886,7 +4883,7 @@ $("#confirm-import").click(function() {
     async function  startImportProject(key) {
     async function  startImportProject(key) {
         try {
         try {
             let result = await ajaxPost("/pm/api/importProject",{key:key,updateData:projTreeObj.getImportProjectDate()});
             let result = await ajaxPost("/pm/api/importProject",{key:key,updateData:projTreeObj.getImportProjectDate()});
-            importProcessChecking(key);
+            importProcessChecking(key, null, (projectData) => handleProjectAfterChecking(projectData));
         }catch (error){
         }catch (error){
             alert(error);
             alert(error);
         }finally {
         }finally {
@@ -4921,6 +4918,7 @@ $('#import').on('show.bs.modal', function(){
 //设置分享给界面数据
 //设置分享给界面数据
 //@param {Object}selected @return {void}
 //@param {Object}selected @return {void}
 function setShareToModal(selected){
 function setShareToModal(selected){
+    $.bootstrapLoading.start();
     const perHeight = 30; //每条分享给数据的高度
     const perHeight = 30; //每条分享给数据的高度
     $('#shareToInfo').empty();
     $('#shareToInfo').empty();
     if(!selected){
     if(!selected){
@@ -4974,6 +4972,7 @@ function setShareToModal(selected){
         let infoHtml = infoArr.join('');
         let infoHtml = infoArr.join('');
         $('#shareToInfo').html(infoHtml);
         $('#shareToInfo').html(infoHtml);
         bindCancelShareCheck(selected);
         bindCancelShareCheck(selected);
+        $.bootstrapLoading.end();
     });
     });
 }
 }
 //取消分享的勾选操作
 //取消分享的勾选操作
@@ -5091,7 +5090,7 @@ $(function () {
             $.bootstrapLoading.progressStart("欢迎使用大司空云计价",true);
             $.bootstrapLoading.progressStart("欢迎使用大司空云计价",true);
             $("#progress_modal_body").text("正在导入测评项目,请稍候……");
             $("#progress_modal_body").text("正在导入测评项目,请稍候……");
             let result = await ajaxPost("/pm/api/importChongqingProject",{user_id: userID,key:key});
             let result = await ajaxPost("/pm/api/importChongqingProject",{user_id: userID,key:key});
-            importProcessChecking(key);
+            importProcessChecking(key, null, (projectData) => handleProjectAfterChecking(projectData));
         }catch (error){
         }catch (error){
             alert(error);
             alert(error);
         }finally {
         }finally {
@@ -5100,30 +5099,57 @@ $(function () {
     })
     })
 });
 });
 
 
-async function importProcessChecking(key) {
-    setTimeout(checking,2000)
+// 导入检查完成时,对新增建设项目的处理
+function handleProjectAfterChecking(projectData) {
+    if (!projectData) {
+        return;
+    }
+    const rootData = projectData.find(item => item.projType === projectType.project);
+    const sorted = commonUtil.getSortedTreeData(rootData.ParentID, projectData);
+    importView.doAfterImport(sorted);
+}
+// 导入检查完成时,对新增单位工程的处理
+function handleTenderAfterChecking(projectData, orgTender) {
+    if (!projectData) {
+        return;
+    }
+    const tenderData = {...orgTender, ...projectData[0]};
+    const parent = projTreeObj.tree.findNode(tenderData.ParentID);
+    const next = projTreeObj.tree.findNode(tenderData.NextSiblingID);
+    const newNode = projTreeObj.insert(tenderData, parent, next);
+    const refreshNodes = projTreeObj.calEngineeringCost(newNode);
+    projTreeObj.refreshNodeData(refreshNodes);
+}
+
+async function importProcessChecking(key, processingFunc = null, completeFunc = null, immediately = false) {
+    let count = 0;
+    immediately ? checking() : setTimeout(checking, 2000);
     async function checking() {
     async function checking() {
-        let result = await ajaxPost("/pm/api/importProcessChecking",{key:key,user_id:userID});
-        if(result.error == 1){
-            let message = result.msg?result.msg:result.message;
+        let result = await ajaxPost("/pm/api/importProcessChecking", { key: key, user_id: userID });
+        if (result.error == 1) {
+            let message = result.msg ? result.msg : result.message;
             setTimeout(function () {
             setTimeout(function () {
                 $.bootstrapLoading.progressEnd();//不做这个的话太快,页面不会自动关闭
                 $.bootstrapLoading.progressEnd();//不做这个的话太快,页面不会自动关闭
-            },500);
-            alert(message)
-        }else if(result.error == 0){
-            if(result.status == "processing"){
-                setTimeout(checking,2000);
-            }else if(result.status == "complete"){
-                if (Array.isArray(result.data)) {
-                    const rootData = result.data.find(item => item.projType === projectType.project);
-                    const sorted = commonUtil.getSortedTreeData(rootData.ParentID, result.data);
-                    importView.doAfterImport(sorted);
+            }, 500);
+            alert(message);
+            if (completeFunc) {
+                completeFunc(result.data);
+            }
+        } else if (result.error == 0) {
+            if (result.status == "processing") {
+                // 只调用一次
+                if (processingFunc && count === 0) {
+                    processingFunc(result);
+                }
+                count++;
+                setTimeout(checking, 2000);
+            } else if (result.status == "complete") {
+                if (completeFunc) {
+                    completeFunc(result.data);
                 }
                 }
                 $.bootstrapLoading.progressEnd();
                 $.bootstrapLoading.progressEnd();
                 //refreshAllPage();
                 //refreshAllPage();
             }
             }
         }
         }
     }
     }
-
-
 }
 }

+ 17 - 16
web/building_saas/pm/js/pm_share.js

@@ -897,15 +897,16 @@ const pmShare = (function () {
     }
     }
     //拷贝分享的工程
     //拷贝分享的工程
     //@param {Object}selected {Number}parentID @return {void}
     //@param {Object}selected {Number}parentID @return {void}
-    function copyShareProject(selected, projID, engID){
-        if(!engID || !selected){
-            return;
-        }
-        let copyMap = {copy: null, update: null};
-        let newName = getCopyName(selected);
-        //获取单项工程的单位工程
-        let tenderQuery = {$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], userID: userID, ParentID: engID};
-        CommonAjax.post('/pm/api/getProjectsByQuery', {user_id: userID, query: tenderQuery, options: '-_id -property'}, function (rstData) {
+    async function copyShareProject(selected, projID, engID){
+        try {
+            if(!engID || !selected){
+                return;
+            }
+            let copyMap = {copy: null, update: null};
+            let newName = getCopyName(selected);
+            //获取单项工程的单位工程
+            let tenderQuery = {$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], userID: userID, ParentID: engID};
+            const rstData = await ajaxPost('/pm/api/getProjectsByQuery', {user_id: userID, query: tenderQuery, options: '-_id -property'}, false, 10000);
             let updateTender = null;
             let updateTender = null;
             for(let tender of rstData){
             for(let tender of rstData){
                 if(tender.name === newName){
                 if(tender.name === newName){
@@ -940,13 +941,13 @@ const pmShare = (function () {
             copyData.property.rootProjectID = projID;
             copyData.property.rootProjectID = projID;
             copyMap.copy = {document: copyData};
             copyMap.copy = {document: copyData};
             $('#copyShare').modal('hide');
             $('#copyShare').modal('hide');
-            $.bootstrapLoading.start();
-            CommonAjax.post('/pm/api/copyProjects', {projectMap: copyMap, user_id: userID, tenderCount: 1}, function (rstData) {
-                $.bootstrapLoading.end();
-            }, function () {
-                $.bootstrapLoading.end();
-            }, 1000 * 60 * 5);
-        });
+            $.bootstrapLoading.progressStart('拷贝项目', true);
+            $("#progress_modal_body").text('正在拷贝项目,请稍候……');
+            await ajaxPost('/pm/api/copyProjects', {projectMap: copyMap, user_id: userID, tenderCount: 1});
+            importProcessChecking();
+        } catch (err) {
+            alert(err);
+        }
 
 
     }
     }
     //获取拷贝后的名称
     //获取拷贝后的名称

+ 21 - 15
web/common/html/header.html

@@ -17,21 +17,21 @@
     <div class="navbar-text p-0 navbar-expand-sm">
     <div class="navbar-text p-0 navbar-expand-sm">
         <!--大屏菜单-->
         <!--大屏菜单-->
         <ul class="nav navbar-nav" id="fluid-menu">
         <ul class="nav navbar-nav" id="fluid-menu">
-            <li class="nav-item" >
-                <a class="nav-link" href="#send2friends" data-toggle="modal" data-target="#send2friends" ><i class="fa fa-share-alt"></i> 推荐给朋友</a>
-            </li>
-            <li class="nav-item dropdown" id="showqqgroup" >
-                <a class="nav-link" href="#"><i class="fa fa-qq" ></i> 群</a>
-                <div class="dropdown-menu p-3 dropdown-menu-right" id="qqgroup" style="width: 200px;top:36px">
-                    <p class="text-center">
-                        <a href="https://jq.qq.com/?_wv=1027&k=5XivMJY" target="_blank" class="btn btn-sm btn-outline-primary">点击加入QQ交流群</a>
-                    </p>
-                    <p class="mb-0 text-center text-muted">
-                        <img src="/web/building_saas/img/qqgroupqrcode.png">
-                        扫码加QQ交流群
-                    </p>
-                </div>
-            </li>
+            <!--<li class="nav-item" >-->
+                <!--<a class="nav-link" href="#send2friends" data-toggle="modal" data-target="#send2friends" ><i class="fa fa-share-alt"></i> 推荐给朋友</a>-->
+            <!--</li>-->
+            <!--<li class="nav-item dropdown" id="showqqgroup" >-->
+                <!--<a class="nav-link" href="#"><i class="fa fa-qq" ></i> 群</a>-->
+                <!--<div class="dropdown-menu p-3 dropdown-menu-right" id="qqgroup" style="width: 200px;top:36px">-->
+                    <!--<p class="text-center">-->
+                        <!--<a href="https://jq.qq.com/?_wv=1027&k=5XivMJY" target="_blank" class="btn btn-sm btn-outline-primary">点击加入QQ交流群</a>-->
+                    <!--</p>-->
+                    <!--<p class="mb-0 text-center text-muted">-->
+                        <!--<img src="/web/building_saas/img/qqgroupqrcode.png">-->
+                        <!--扫码加QQ交流群-->
+                    <!--</p>-->
+                <!--</div>-->
+            <!--</li>-->
             <li class="nav-item dropdown">
             <li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" id="link_userName"><%= (sessionUser.company && sessionUser.real_name) ? (sessionUser.company + '(' + sessionUser.real_name + ')') : sessionUser.company ? sessionUser.company : sessionUser.real_name ? sessionUser.real_name : sessionUser.mobile %></a>
                 <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" id="link_userName"><%= (sessionUser.company && sessionUser.real_name) ? (sessionUser.company + '(' + sessionUser.real_name + ')') : sessionUser.company ? sessionUser.company : sessionUser.real_name ? sessionUser.real_name : sessionUser.mobile %></a>
                 <div class="dropdown-menu dropdown-menu-right">
                 <div class="dropdown-menu dropdown-menu-right">
@@ -43,6 +43,11 @@
                     <a class="dropdown-item" href="/logout">退出登录</a>
                     <a class="dropdown-item" href="/logout">退出登录</a>
                 </div>
                 </div>
             </li>
             </li>
+            <% if (!versionName.includes('免费')) {%>
+              <li class="nav-item">
+                <a href="user/buy" target="_blank"><img src="/web/building_saas/img/vip.png" data-toggle="tooltip" data-placement="bottom" data-original-title="专业版用户"></a>
+              </li> 
+             <% } %> 
             <% if (action === 'index' && controller === 'main') {%>
             <% if (action === 'index' && controller === 'main') {%>
             <li class="nav-item dropdown">
             <li class="nav-item dropdown">
                 <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-wrench" data-placement="bottom"></i> 工具</a>
                 <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-wrench" data-placement="bottom"></i> 工具</a>
@@ -62,6 +67,7 @@
                     <a class="dropdown-item" href="/web/common/html/pdfViewer.html?type=upgradeGuide" target="_blank">升级说明</a>-->
                     <a class="dropdown-item" href="/web/common/html/pdfViewer.html?type=upgradeGuide" target="_blank">升级说明</a>-->
                     <a class="dropdown-item" href="http://doc.zhzdwd.com/docs/dsk_yhsc" target="_blank">用户手册</a>
                     <a class="dropdown-item" href="http://doc.zhzdwd.com/docs/dsk_yhsc" target="_blank">用户手册</a>
                     <a class="dropdown-item" href="/public/share/upgradeGuide/upgradeGuide.pdf" target="_blank">升级说明</a>
                     <a class="dropdown-item" href="/public/share/upgradeGuide/upgradeGuide.pdf" target="_blank">升级说明</a>
+                    <a class="dropdown-item" href="http://zhzdwk.com/special/detail/36" target="_blank">计价依据</a>
                     <a class="dropdown-item" href="https://smartcost.com.cn/" target="_blank">纵横官网</a>
                     <a class="dropdown-item" href="https://smartcost.com.cn/" target="_blank">纵横官网</a>
                     <!--  <a class="dropdown-item" href="#">动画教程</a>-->
                     <!--  <a class="dropdown-item" href="#">动画教程</a>-->
                     <a id="customerService" class="dropdown-item" href="javascript:void(0);">联系客服</a>
                     <a id="customerService" class="dropdown-item" href="javascript:void(0);">联系客服</a>

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

@@ -155,7 +155,7 @@ function overwriteRationCalcBases (taxType){
             return calcTools.partASupplyFee(node, '甲供定额施工机具费', isTender);
             return calcTools.partASupplyFee(node, '甲供定额施工机具费', isTender);
         };
         };
         rationCalcBases['甲供主材费'] = function (node, isTender) {
         rationCalcBases['甲供主材费'] = function (node, isTender) {
-            return calcTools.partASupplyFee(node, '甲供主材费', isTender);
+            return calcTools.partASupplyFee(node, '甲供主材费', isTender, false);
         };
         };
         rationCalcBases['甲定定额人工费'] = function (node, isTender) {
         rationCalcBases['甲定定额人工费'] = function (node, isTender) {
             return calcTools.partASupplyFee(node, '甲定定额人工费', isTender);
             return calcTools.partASupplyFee(node, '甲定定额人工费', isTender);
@@ -167,7 +167,7 @@ function overwriteRationCalcBases (taxType){
             return calcTools.partASupplyFee(node, '甲定定额施工机具费', isTender);
             return calcTools.partASupplyFee(node, '甲定定额施工机具费', isTender);
         };
         };
         rationCalcBases['甲定主材费'] = function (node, isTender) {
         rationCalcBases['甲定主材费'] = function (node, isTender) {
-            return calcTools.partASupplyFee(node, '甲定主材费', isTender);
+            return calcTools.partASupplyFee(node, '甲定主材费', isTender, false);
         };
         };
         rationCalcBases['暂估材料费'] = function (node, isTender) {
         rationCalcBases['暂估材料费'] = function (node, isTender) {
             return calcTools.estimateFee(node, true, isTender);
             return calcTools.estimateFee(node, true, isTender);

+ 30 - 15
web/over_write/js/guangdong_2018_export.js

@@ -1094,9 +1094,9 @@ const XMLStandard = (function () {
                     name: 'TaxModel', dName: '计税模式', type: _type.INT, required: true,
                     name: 'TaxModel', dName: '计税模式', type: _type.INT, required: true,
                     value: tenderData.property.taxType
                     value: tenderData.property.taxType
                 },
                 },
-                // 地区类别 取建设项目-基本信息-地区类别
+                // 地区类别 取建设项目-基本信息-地区类别,基本信息那已经自检一次,这里不自检 //type: _type.INT, required: true, enumeration: Object.values(AreaKind), enumerationHint: Object.keys(AreaKind)
                 {
                 {
-                    name: 'AreaKind', dName: '地区类别', type: _type.INT, required: true, enumeration: Object.values(AreaKind), enumerationHint: Object.keys(AreaKind),
+                    name: 'AreaKind', dName: '地区类别', 
                     value: AreaKind[_util.getValueByKey(basicInformation, 'regionalCategories')]
                     value: AreaKind[_util.getValueByKey(basicInformation, 'regionalCategories')]
                 },
                 },
                 // 金额
                 // 金额
@@ -1261,7 +1261,7 @@ const XMLStandard = (function () {
                 // 费率
                 // 费率
                 {
                 {
                     name: 'Rate', type: _type.DECIMAL,
                     name: 'Rate', type: _type.DECIMAL,
-                    value: commonUtil.isDef(bills.feeRate) ? bills.feeRate : '100'
+                    value: !commonUtil.isEmptyVal(bills.feeRate) ? bills.feeRate : '100'
                 },
                 },
                 {
                 {
                     name: 'Total', type: _type.DECIMAL,
                     name: 'Total', type: _type.DECIMAL,
@@ -1447,7 +1447,7 @@ const XMLStandard = (function () {
                 // 工程量
                 // 工程量
                 { name: 'Quantity', type: _type.DECIMAL, value: bills.quantity },
                 { name: 'Quantity', type: _type.DECIMAL, value: bills.quantity },
                 // 计算基数
                 // 计算基数
-                { name: 'QtyFormula', type: _type.DECIMAL, value: getQtyFormula(node) },
+                { name: 'QtyFormula', value: getQtyFormula(node) },
                 // 单价(元)
                 // 单价(元)
                 { name: 'Price', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.unitFee') },
                 { name: 'Price', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.unitFee') },
                 // 设备单价(元)指清单项目所采用设备的综合单价
                 // 设备单价(元)指清单项目所采用设备的综合单价
@@ -1457,7 +1457,7 @@ const XMLStandard = (function () {
                 // 最高限价(元)
                 // 最高限价(元)
                 { name: 'PriceHigh', type: _type.DECIMAL, value: bills.maxPrice },
                 { name: 'PriceHigh', type: _type.DECIMAL, value: bills.maxPrice },
                 // 费率(%)
                 // 费率(%)
-                { name: 'Rate', type: _type.DECIMAL, value: bills.feeRate },
+                { name: 'Rate', type: _type.DECIMAL, value: !commonUtil.isEmptyVal(bills.feeRate) ? bills.feeRate : '100' },
                 // 合价(元)
                 // 合价(元)
                 { name: 'Total', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.totalFee') },
                 { name: 'Total', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.totalFee') },
                 // 主要清单
                 // 主要清单
@@ -1590,7 +1590,7 @@ const XMLStandard = (function () {
         }
         }
         //子目单价计算
         //子目单价计算
         function UnitPriceCalculationOfItem(calcItem) {
         function UnitPriceCalculationOfItem(calcItem) {
-            const feeRate = commonUtil.isDef(calcItem.feeRate) ? calcItem.feeRate : '100';
+            const feeRate = !commonUtil.isEmptyVal(calcItem.feeRate) ? calcItem.feeRate : '100';
             const attrs = [
             const attrs = [
                 // 费用名称
                 // 费用名称
                 { name: 'Name', dName: '费用名称', required: true, value: calcItem.name },
                 { name: 'Name', dName: '费用名称', required: true, value: calcItem.name },
@@ -1661,7 +1661,7 @@ const XMLStandard = (function () {
                 // 单价
                 // 单价
                 { name: 'Price', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.unitFee') },
                 { name: 'Price', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.unitFee') },
                 // 费率
                 // 费率
-                { name: 'Rate', type: _type.DECIMAL, value: bills.feeRate },
+                { name: 'Rate', type: _type.DECIMAL, value: !commonUtil.isEmptyVal(bills.feeRate) ? bills.feeRate : '100' },
                 // 金额
                 // 金额
                 { name: 'Total', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.totalFee') },
                 { name: 'Total', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.totalFee') },
                 // 费用代号
                 // 费用代号
@@ -1703,7 +1703,7 @@ const XMLStandard = (function () {
                 // 单价
                 // 单价
                 { name: 'Price', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.unitFee') },
                 { name: 'Price', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.unitFee') },
                 // 费率
                 // 费率
-                { name: 'Rate', type: _type.DECIMAL, value: bills.feeRate },
+                { name: 'Rate', type: _type.DECIMAL, value: !commonUtil.isEmptyVal(bills.feeRate) ? bills.feeRate : '100' },
                 // 金额
                 // 金额
                 { name: 'Total', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.totalFee') },
                 { name: 'Total', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.totalFee') },
                 // 汇总类型
                 // 汇总类型
@@ -1770,7 +1770,7 @@ const XMLStandard = (function () {
                 // 单价
                 // 单价
                 { name: 'Price', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.unitFee') },
                 { name: 'Price', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.unitFee') },
                 // 费率
                 // 费率
-                { name: 'Rate', type: _type.DECIMAL, value: bills.feeRate },
+                { name: 'Rate', type: _type.DECIMAL, value: !commonUtil.isEmptyVal(bills.feeRate) ? bills.feeRate : '100' },
                 // 金额
                 // 金额
                 { name: 'Total', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.totalFee') },
                 { name: 'Total', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.totalFee') },
                 // 汇总类型
                 // 汇总类型
@@ -1846,7 +1846,7 @@ const XMLStandard = (function () {
                 // 计算基数
                 // 计算基数
                 { name: 'QtyFormula', value: getQtyFormula(node) },
                 { name: 'QtyFormula', value: getQtyFormula(node) },
                 // 费率
                 // 费率
-                { name: 'Rate', type: _type.DECIMAL, value: bills.feeRate },
+                { name: 'Rate', type: _type.DECIMAL, value: !commonUtil.isEmptyVal(bills.feeRate) ? bills.feeRate : '100' },
                 // 金额
                 // 金额
                 { name: 'Total', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.totalFee') },
                 { name: 'Total', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.totalFee') },
                 // 汇总类型
                 // 汇总类型
@@ -1886,7 +1886,7 @@ const XMLStandard = (function () {
                 // 单价
                 // 单价
                 { name: 'Price', value: _util.getFee(bills.fees, 'common.unitFee') },
                 { name: 'Price', value: _util.getFee(bills.fees, 'common.unitFee') },
                 // 费率
                 // 费率
-                { name: 'Rate', type: _type.DECIMAL, value: bills.feeRate },
+                { name: 'Rate', type: _type.DECIMAL, value: !commonUtil.isEmptyVal(bills.feeRate) ? bills.feeRate : '100' },
                 // 金额
                 // 金额
                 { name: 'Total', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.totalFee') },
                 { name: 'Total', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.totalFee') },
                 // 依据
                 // 依据
@@ -1917,7 +1917,7 @@ const XMLStandard = (function () {
                 // 计算基数
                 // 计算基数
                 { name: 'QtyFormula', value: getQtyFormula(node) },
                 { name: 'QtyFormula', value: getQtyFormula(node) },
                 // 费率
                 // 费率
-                { name: 'Rate', type: _type.DECIMAL, value: bills.feeRate },
+                { name: 'Rate', type: _type.DECIMAL, value: !commonUtil.isEmptyVal(bills.feeRate) ? bills.feeRate : '100' },
                 // 金额
                 // 金额
                 { name: 'Total', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.totalFee') },
                 { name: 'Total', type: _type.DECIMAL, value: _util.getFee(bills.fees, 'common.totalFee') },
                 // 费用代号
                 // 费用代号
@@ -2209,6 +2209,14 @@ const XMLStandard = (function () {
             return sectionalWorks;
             return sectionalWorks;
         }
         }
 
 
+        // 项目人材机code-data映射,减少循环次数,方便组成物定额人材机等数据可通过编码获取完整数据
+        let projectGLJCodeMap;
+        function setupprojectGLJCodeMap(projectGLJList) {
+            const map = {};
+            projectGLJList.forEach(glj => map[glj.code] = glj);
+            return map;
+        }
+
         /*
         /*
          * 加载所有单位工程元素
          * 加载所有单位工程元素
          * @param  {Object}summaryInfoMap 总的汇总价格映射表(与项目ID映射)
          * @param  {Object}summaryInfoMap 总的汇总价格映射表(与项目ID映射)
@@ -2240,6 +2248,7 @@ const XMLStandard = (function () {
                     unitWorks.push(unitWork);
                     unitWorks.push(unitWork);
                     continue;
                     continue;
                 }
                 }
+                projectGLJCodeMap = setupprojectGLJCodeMap(tenderDetail.projectGLJ.datas.gljList);
                 // 不是简单结构,继续添加各种子元素
                 // 不是简单结构,继续添加各种子元素
                 // 方便用户看错误来自哪个单位工程
                 // 方便用户看错误来自哪个单位工程
                 _failList.push(`<span style="font-weight: bold">单位工程“${tData.name}”下:</span>`);
                 _failList.push(`<span style="font-weight: bold">单位工程“${tData.name}”下:</span>`);
@@ -2456,6 +2465,12 @@ const XMLStandard = (function () {
             const theLib = rationLibs.find(lib => lib.id === ration.libID);
             const theLib = rationLibs.find(lib => lib.id === ration.libID);
             return theLib ? theLib.libCode : '';
             return theLib ? theLib.libCode : '';
         }
         }
+        // 获取NoCost 如果类型是主材或者设备,输出=“true”,否则为"false"。
+        function getNoCost(projectGLJCodeMap, code) {
+            const noCostType = [4, 5];
+            const glj = projectGLJCodeMap[code];
+            return glj && noCostType.includes(glj.type) ? 'true' : 'false';
+        }
         // 加载定额
         // 加载定额
         function loadRation(node, kind) {
         function loadRation(node, kind) {
             // 定额
             // 定额
@@ -2483,7 +2498,7 @@ const XMLStandard = (function () {
                 })
                 })
                 .map(rGLJ => {
                 .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 = !+totalQuantity; // 总消耗量为0即为不计价材料
+                    const noCost = getNoCost(projectGLJCodeMap, rGLJ.code);
                     return new LabourMaterialsEquipmentsMachinesElement(rGLJ, rGLJ.quantity, noCost);
                     return new LabourMaterialsEquipmentsMachinesElement(rGLJ, rGLJ.quantity, noCost);
                 });
                 });
             norm.children.push(...rationGLJElements);
             norm.children.push(...rationGLJElements);
@@ -2653,7 +2668,7 @@ const XMLStandard = (function () {
                 .map(gljSummaryItem => {
                 .map(gljSummaryItem => {
                     const gljEle = new LabourMaterialsEquipmentsMachinesSummary(gljSummaryItem);
                     const gljEle = new LabourMaterialsEquipmentsMachinesSummary(gljSummaryItem);
                     gljEle.children = gljSummaryItem.ratios.map(ratio => {
                     gljEle.children = gljSummaryItem.ratios.map(ratio => {
-                        const noCost = !+ratio.consumption;
+                        const noCost = getNoCost(projectGLJCodeMap, ratio.code);
                         return new LabourMaterialsEquipmentsMachinesElement(ratio, ratio.consumption, noCost);
                         return new LabourMaterialsEquipmentsMachinesElement(ratio, ratio.consumption, noCost);
                     });
                     });
                     return gljEle;
                     return gljEle;
@@ -2689,7 +2704,7 @@ const XMLStandard = (function () {
                     const ratios = tenderDetail.projectGLJ.datas.mixRatioMap[connectKey] || [];
                     const ratios = tenderDetail.projectGLJ.datas.mixRatioMap[connectKey] || [];
                     gljSummaryItem.ratios = ratios;
                     gljSummaryItem.ratios = ratios;
                     gljEle.children = ratios.map(ratio => {
                     gljEle.children = ratios.map(ratio => {
-                        const noCost = !+ratio.consumption;
+                        const noCost = getNoCost(projectGLJCodeMap, ratio.code);
                         return new LabourMaterialsEquipmentsMachinesElement(ratio, ratio.consumption, noCost);
                         return new LabourMaterialsEquipmentsMachinesElement(ratio, ratio.consumption, noCost);
                     });
                     });
                     mergeGLJSummary(gljSummaryItem); // 合并人材机消耗量,为输出建设项目表下的人材机汇总做准备
                     mergeGLJSummary(gljSummaryItem); // 合并人材机消耗量,为输出建设项目表下的人材机汇总做准备

+ 49 - 17
web/over_write/js/guangdong_2018_import.js

@@ -28,7 +28,7 @@ const importXML = (() => {
     //导入的文件类型,界面选的文件类型是生成项目的文件类型,这里的文件类型指的是,要导入文件的类型,
     //导入的文件类型,界面选的文件类型是生成项目的文件类型,这里的文件类型指的是,要导入文件的类型,
     //导入文件类型不同,导入数据不同
     //导入文件类型不同,导入数据不同
     let importFileKind = '';
     let importFileKind = '';
-    //文件类型
+    // 文件类型
     const FileKind = {
     const FileKind = {
         '6': 1, // 投标
         '6': 1, // 投标
         'tender': 1,
         'tender': 1,
@@ -37,6 +37,13 @@ const importXML = (() => {
         '5': 3, // 控制价
         '5': 3, // 控制价
         'control': 3,
         'control': 3,
     };
     };
+    // 地区类别
+    const AreaKind = {
+        '1': '一类地区',
+        '2': '二类地区',
+        '3': '三类地区',
+        '4': '四类地区',
+    }
     // 一些数据是需要从后端获取自增数字后赋值的,这里是记录,用完会在extractProject清空
     // 一些数据是需要从后端获取自增数字后赋值的,这里是记录,用完会在extractProject清空
     const countData = {
     const countData = {
         projectCount: 0,    //项目数量
         projectCount: 0,    //项目数量
@@ -55,6 +62,8 @@ const importXML = (() => {
         FEE: 2,
         FEE: 2,
         // 费率、指数、比例(%)类小数精度
         // 费率、指数、比例(%)类小数精度
         RATE: 3,
         RATE: 3,
+        // 默认、中间过程
+        PROCESS: 6
     };
     };
     // 根据上方精度要求得到的项目属性,小数位数的值
     // 根据上方精度要求得到的项目属性,小数位数的值
     const tenderPropertyDecimal = {
     const tenderPropertyDecimal = {
@@ -108,14 +117,14 @@ const importXML = (() => {
     }
     }
     // 从xml对象中提取基本信息相关
     // 从xml对象中提取基本信息相关
     function extractBasicInfo(projectSrc) {
     function extractBasicInfo(projectSrc) {
-        const projectInfo = getValue(projectSrc, ['ProjectInfo']); // 估概预算信息
-        const tendereeInfo = getValue(projectSrc, ['TendereeInfo']); // 招标信息
-        const bidderInfo = getValue(projectSrc, ['BidderInfo']); // 投标信息
+        const projectInfo = getValue(projectSrc, ['ConstructionInfo', 'ProjectInfo']); // 估概预算信息
+        const tendereeInfo = getValue(projectSrc, ['ConstructionInfo', 'TendereeInfo']); // 招标信息
+        const bidderInfo = getValue(projectSrc, ['ConstructionInfo', 'BidderInfo']); // 投标信息
         return [
         return [
             { key: 'projNum', value: getValue(projectSrc, ['_Number']) }, // 编码
             { key: 'projNum', value: getValue(projectSrc, ['_Number']) }, // 编码
             { key: 'projectCategory', value: getValue(projectSrc, ['_ProjectCategory']) }, // 工程类别
             { key: 'projectCategory', value: getValue(projectSrc, ['_ProjectCategory']) }, // 工程类别
             { key: 'constructionType', value: getValue(projectSrc, ['_ConstructionType']) }, // 建设性质
             { key: 'constructionType', value: getValue(projectSrc, ['_ConstructionType']) }, // 建设性质
-            { key: 'regionalCategories', value: getValue(projectSrc, ['_AreaKind']) }, // 地区类被
+            { key: 'regionalCategories', value: AreaKind[getValue(projectSrc, ['_AreaKind'])] }, // 地区类被
             { key: 'projLocation', value: getValue(projectSrc, ['_ProjectSite']) }, // 工程地点
             { key: 'projLocation', value: getValue(projectSrc, ['_ProjectSite']) }, // 工程地点
             { key: 'constructingUnits', value: getValue(projectSrc, ['_BulidUnit']) }, // 建设单位
             { key: 'constructingUnits', value: getValue(projectSrc, ['_BulidUnit']) }, // 建设单位
             { key: 'constructingUnitsPerson', value: getValue(projectSrc, ['_BulidAuthorizer']) }, // 建设单位法定代表人或其授权人
             { key: 'constructingUnitsPerson', value: getValue(projectSrc, ['_BulidAuthorizer']) }, // 建设单位法定代表人或其授权人
@@ -255,7 +264,8 @@ const importXML = (() => {
             };
             };
             if (curField[0] === fields[1][0]) {
             if (curField[0] === fields[1][0]) {
                 item.calcBase = getValue(src, ['_QtyFormula']);
                 item.calcBase = getValue(src, ['_QtyFormula']);
-                item.feeRate = getValue(src, ['_Rate']);
+                const feeRate = getValue(src, ['_Rate']);
+                item.feeRate = +feeRate !== 100 && feeRate || undefined;
             }
             }
             if (importFileKind !== FileKind.tender) {
             if (importFileKind !== FileKind.tender) {
                 delete item.feeRate
                 delete item.feeRate
@@ -339,9 +349,7 @@ const importXML = (() => {
             // 分项不需要基数、费率
             // 分项不需要基数、费率
             bills.calcBase = getValue(workElementSrc, ['_QtyFormula']);
             bills.calcBase = getValue(workElementSrc, ['_QtyFormula']);
             const feeRate = getValue(workElementSrc, ['_Rate']);
             const feeRate = getValue(workElementSrc, ['_Rate']);
-            if (+feeRate) {
-                bills.feeRate = feeRate;
-            }
+            bills.feeRate = +feeRate !== 100 && feeRate || undefined;
         }
         }
         // 投标和控制价,需要导入最高限价
         // 投标和控制价,需要导入最高限价
         if ([FileKind.tender, FileKind.control].includes(importFileKind)) {
         if ([FileKind.tender, FileKind.control].includes(importFileKind)) {
@@ -512,7 +520,7 @@ const importXML = (() => {
         }
         }
     }
     }
     // 提取措施项目
     // 提取措施项目
-    function extractCSXM(tenderSrc) {
+    /* function extractCSXM(tenderSrc) {
         const csxmSrc = getValue(tenderSrc, ['Preliminaries']);
         const csxmSrc = getValue(tenderSrc, ['Preliminaries']);
         const fields = [['DivisionalWorks'], ['WorkElement']];
         const fields = [['DivisionalWorks'], ['WorkElement']];
         const fees = getFeesFromBasicCost(csxmSrc); // 措施项目的汇总价
         const fees = getFeesFromBasicCost(csxmSrc); // 措施项目的汇总价
@@ -527,6 +535,22 @@ const importXML = (() => {
             fees,
             fees,
             items
             items
         };
         };
+    } */
+    function extractCSXM(tenderSrc) {
+        const csxmSrc = getValue(tenderSrc, ['Preliminaries']);
+        const fields = [['DivisionalWorks'], ['WorkElement']];
+        const fees = getFeesFromBasicCost(csxmSrc); // 措施项目的汇总价
+        const items = extractItemsRecur(csxmSrc, fields, (itemSrc, curField) => {
+            if (curField[0] === fields[0][0]) {
+                return extractDivisionalWorks(itemSrc, billType.BILL);
+            } else {
+                return extractWorkElement(itemSrc, billType.BILL);
+            }
+        });
+        return {
+            fees,
+            items
+        };
     }
     }
     // 提取其他项目
     // 提取其他项目
     function extractOther(tenderSrc) {
     function extractOther(tenderSrc) {
@@ -549,9 +573,9 @@ const importXML = (() => {
             specialty: extractData(sundry, 'SpecialtyProvisionalPrice', [['SpecialtyProvisionalPriceGroup'], ['SpecialtyProvisionalPriceItem']],
             specialty: extractData(sundry, 'SpecialtyProvisionalPrice', [['SpecialtyProvisionalPriceGroup'], ['SpecialtyProvisionalPriceItem']],
                 { engineeringContent: ['_Content'] }, { engineeringContent: ['_Content'] }),
                 { engineeringContent: ['_Content'] }, { engineeringContent: ['_Content'] }),
             dayWork: extractData(sundry, 'DayWorkRate', [['DayWorkRateGroup'], ['DayWorkRateItem']]),
             dayWork: extractData(sundry, 'DayWorkRate', [['DayWorkRateGroup'], ['DayWorkRateItem']]),
-            mainContractor: extractData(sundry, 'MainContractorAttendance', [['MainContractorAttendanceGroup'], ['MainContractorAttendanceItem']], { serviceContent: ['_Content'] }),
-            claim: extractData(sundry, 'ClaimsCost', [['ClaimsCostGroup'], ['ClaimsCostItem']]),
-            visa: extractData(sundry, 'SiteInstructionCost', [['SiteInstructionCostGroup'], ['SiteInstructionCostItem']]),
+            mainContractor: extractData(sundry, 'MainContractorAttendance', [['MainContractorAttendanceGroup'], ['MainContractorAttendanceItem']], { serviceContent: ['_Content'] }, { serviceContent: ['_Content'] }),
+            claim: extractData(sundry, 'ClaimsCost', [['ClaimsCostGroup'], ['ClaimsCostItem']], { claimVisa: ['_Reason'] }, { claimVisa: ['_Reason'] }),
+            visa: extractData(sundry, 'SiteInstructionCost', [['SiteInstructionCostGroup'], ['SiteInstructionCostItem']], { claimVisa: ['_Reason'] }, { claimVisa: ['_Reason'] }),
         };
         };
         // 提取标题和明细
         // 提取标题和明细
         function extractGroupOrItem(itemSrc, isGroup = true, extendAttrs = null, field) {
         function extractGroupOrItem(itemSrc, isGroup = true, extendAttrs = null, field) {
@@ -564,11 +588,12 @@ const importXML = (() => {
                     remark: getValue(itemSrc, ['_Remark'])
                     remark: getValue(itemSrc, ['_Remark'])
                 };
                 };
             } else {
             } else {
+                const feeRate = getValue(itemSrc, ['_Rate']);
                 source = {
                 source = {
                     name: getValue(itemSrc, ['_Name']),
                     name: getValue(itemSrc, ['_Name']),
                     unit: getValue(itemSrc, ['_Unit']),
                     unit: getValue(itemSrc, ['_Unit']),
                     calcBase: getValue(itemSrc, ['_QtyFormula']),
                     calcBase: getValue(itemSrc, ['_QtyFormula']),
-                    feeRate: getValue(itemSrc, ['_Rate']),
+                    feeRate: +feeRate !== 100 && feeRate || undefined,
                     fees: importFileKind === FileKind.tender ? [{ fieldName: 'common', unitFee: getValue(itemSrc, ['_Price']), totalFee: getValue(itemSrc, ['_Total']) }] : [],
                     fees: importFileKind === FileKind.tender ? [{ fieldName: 'common', unitFee: getValue(itemSrc, ['_Price']), totalFee: getValue(itemSrc, ['_Total']) }] : [],
                     feeCode: getValue(itemSrc, ['_Code']),
                     feeCode: getValue(itemSrc, ['_Code']),
                     remark: getValue(itemSrc, ['_Remark'])
                     remark: getValue(itemSrc, ['_Remark'])
@@ -614,10 +639,11 @@ const importXML = (() => {
             items: itemsSrc.map(extractTaxItem)
             items: itemsSrc.map(extractTaxItem)
         };
         };
         function extractTaxItem(src) {
         function extractTaxItem(src) {
+            const feeRate = getValue(src, ['_Rate']);
             return {
             return {
                 name: getValue(src, ['_Name']),
                 name: getValue(src, ['_Name']),
                 calcBase: getValue(src, ['_QtyFormula']),
                 calcBase: getValue(src, ['_QtyFormula']),
-                feeRate: getValue(src, ['_Rate']),
+                feeRate: +feeRate !== 100 && feeRate || undefined,
                 fees: importFileKind === FileKind.tender ? [{ fieldName: 'common', totalFee: getValue(src, ['_Total']) }] : [],
                 fees: importFileKind === FileKind.tender ? [{ fieldName: 'common', totalFee: getValue(src, ['_Total']) }] : [],
                 feeCode: getValue(src, ['_Code']),
                 feeCode: getValue(src, ['_Code']),
                 remark: getValue(src, ['_Remark'])
                 remark: getValue(src, ['_Remark'])
@@ -667,8 +693,15 @@ const importXML = (() => {
             }
             }
             const type = getValue(gljSrc, ['_Kind']);
             const type = getValue(gljSrc, ['_Kind']);
             switch (type) {
             switch (type) {
+                case '1':
+                    return { type: 1, shorName: '人' };
+                case '4':
+                    return { type: 4, shortName: '主' };
+                case '5':
+                    return { type: 5, shortName: '设' }
                 case '6':
                 case '6':
                     return { type: 202, shorName: '砼' };
                     return { type: 202, shorName: '砼' };
+                case '3':
                 case '7':
                 case '7':
                     return { type: 301, shorName: '机' };
                     return { type: 301, shorName: '机' };
                 case '15':
                 case '15':
@@ -981,7 +1014,6 @@ const importXML = (() => {
         // 合并大项费用
         // 合并大项费用
         function mergeWorkSummary(workSummary) {
         function mergeWorkSummary(workSummary) {
             // 首层数据与清单模板根据费用字典进行匹配,匹配到的则赋值一些属性,匹配不到则将其及其所有子数据插入到模板最末大项费用
             // 首层数据与清单模板根据费用字典进行匹配,匹配到的则赋值一些属性,匹配不到则将其及其所有子数据插入到模板最末大项费用
-            debugger;
             workSummary.forEach(summaryBills => {
             workSummary.forEach(summaryBills => {
                 const matched = roots.find(root => FlagFeeCodeMap[getFlag(root)] === summaryBills.feeCode);
                 const matched = roots.find(root => FlagFeeCodeMap[getFlag(root)] === summaryBills.feeCode);
                 if (matched) {
                 if (matched) {
@@ -1374,7 +1406,7 @@ const importXML = (() => {
                 return '0';
                 return '0';
             } else {
             } else {
                 const tempQuantity = ration.quantity / bills.quantity;
                 const tempQuantity = ration.quantity / bills.quantity;
-                return isFinite(tempQuantity) ? scMathUtil.roundForObj(tempQuantity, Decimal.QUANTITY) : '0';
+                return isFinite(tempQuantity) ? scMathUtil.roundForObj(tempQuantity, Decimal.PROCESS) : '0';
             }
             }
         }
         }
         // 转换定额人材机
         // 转换定额人材机

+ 5 - 2
web/users/html/user-buy.html

@@ -51,7 +51,7 @@
                             <div class="col-sm-4 mb-5">
                             <div class="col-sm-4 mb-5">
                                 <div class="card free-version">
                                 <div class="card free-version">
                                   <div class=" card-body">
                                   <div class=" card-body">
-                                    <h3 class="card-title text-white">免费版 </h3>
+                                    <h3 class="card-title">免费版 </h3>
                                       <p class="card-text">
                                       <p class="card-text">
                                     <!--  <ul class="pl-3">
                                     <!--  <ul class="pl-3">
                                           <li>只可创建 50 个单位工程</li>
                                           <li>只可创建 50 个单位工程</li>
@@ -76,7 +76,10 @@
                             <div class="col-sm-4 mb-5">
                             <div class="col-sm-4 mb-5">
                                 <div class="card pro-version">
                                 <div class="card pro-version">
                                   <div class=" card-body">
                                   <div class=" card-body">
-                                    <h3 class="card-title text-white">专业版</h3>
+                                    <h3 class="card-title text-white">
+                                      <img src="/web/building_saas/img/vip.png">
+                                      专业版
+                                    </h3>
                                       <p class="card-text">
                                       <p class="card-text">
                                       <!--<ul class="pl-3">
                                       <!--<ul class="pl-3">
                                           <li>创建单位工程无限制</li>
                                           <li>创建单位工程无限制</li>