فهرست منبع

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

chenshilong 5 سال پیش
والد
کامیت
c135378279

+ 22 - 16
modules/fee_rates/facade/fee_rates_facade.js

@@ -232,23 +232,29 @@ function commonCallback(callback,result,err) {
         callback(null,result);
     }
 }
-
 async function getFeeRateStandardsByProjectID(projectID) {
-    logger.info("get feeRate standard, projectID:"+projectID)
-    let feeRateStandards=[];
-    let project =  await projectsModel.findOne({ID:projectID});
-    let temFee = await feeRateFileModel.findOne({ID:project.property.feeFile.id});
-    feeRateStandards.push({ID:temFee.libID,libName:temFee.libName});
-   /* let engineeringLibModel = new EngineeringLibModel();
-    let engineeringInfo = project !== null && project.property.engineering_id !== undefined ?
-        await engineeringLibModel.getEngineering(project.property.engineering_id) : null;
-    if(engineeringInfo!=null){
-        let fee_lib = engineeringInfo.fee_lib;
-        for(let lib of fee_lib){
-            feeRateStandards.push({ID:lib.id,libName:lib.name});
-        }
-    }*/
-    return feeRateStandards;
+  logger.info("get feeRate standard, projectID:" + projectID)
+  let feeRateStandards = [];
+  let project = await projectsModel.findOne({
+    ID: projectID
+  });
+  //let temFee = await feeRateFileModel.findOne({ID:project.property.feeFile.id});
+  //feeRateStandards.push({ID:temFee.libID,libName:temFee.libName});
+  let engineeringLibModel = new EngineeringLibModel();
+  let engineeringInfo = project !== null && project.property.engineering_id !== undefined ?
+    await engineeringLibModel.getEngineering(project.property.engineering_id) : null;
+  if (engineeringInfo != null) {
+    for (let tax of engineeringInfo.tax_group) {
+      if (tax.taxType == project.property.taxType) {
+        let lib = tax.fee_lib;
+        feeRateStandards.push({
+          ID: lib.id,
+          libName: lib.name
+        });
+      }
+    }
+  }
+  return feeRateStandards;
 }
 
 async function changeFeeRateStandard(jdata){

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

@@ -3,6 +3,7 @@
  */
 
 module.exports = {
+  sortChildren,
   markUpdateProject: markUpdateProject,
   removeProjectMark: removeProjectMark,
   updateNodes: updateNodes,

+ 17 - 0
modules/pm/facade/pm_facade.js

@@ -1598,6 +1598,15 @@ async function exportMainData(userID,projectID) {
             if(s.projType =="Tender") tenderIDs.push(s.ID);
         }
     }
+    const tenders = result.projects.filter(item => item.projType === projectType.tender);
+    // 标段兄弟之间树结构兼容性处理(防止导入的ybp源文件树结构是错的)
+    const sortedTenders = project_facade.sortChildren(tenders);
+    // 根据排好的顺序,重设NextSiblingID
+    for (let i = 0; i < sortedTenders.length; i++) {
+        const curTender = sortedTenders[i];
+        const nextTender = sortedTenders[i + 1];
+        curTender.NextSiblingID = nextTender && nextTender.ID || -1;
+    }
     let files = {unitFiles:await exportUnitFiles(projectID),feeRateFiles:await exportFeeRateFiles(projectID)};
     result.files = files;
     result = cipher.aesEncrypt(JSON.stringify(result));
@@ -1803,6 +1812,14 @@ async function importProject(data,req,updateData) {
                 result.msg = `您创建的项目个数超限,请联系我们的客服人员,或者导出建设项目保存到本地备份,删除云上数据。`;
                 return result;
             }
+            // 标段兄弟之间树结构兼容性处理(防止导入的ybp源文件树结构是错的)
+            const sortedTenders = project_facade.sortChildren(tenders);
+            // 根据排好的顺序,重设NextSiblingID
+            for (let i = 0; i < sortedTenders.length; i++) {
+                const curTender = sortedTenders[i];
+                const nextTender = sortedTenders[i + 1];
+                curTender.NextSiblingID = nextTender && nextTender.ID || -1;
+            }
             let [constructionProjectID,projectIDMap,labourCoeFileIDMap,calcProgramFileIDMap] = await handleMainProjectDatas(mainData,updateData,req.session.sessionUser.id);
             result.constructionProjectID = constructionProjectID;
             if(datas.length > 1 ){//生成后统一次插入 2020-05-29

+ 4 - 4
web/building_saas/main/js/models/calc_base.js

@@ -725,7 +725,7 @@ let baseFigureTemplate = {
     },
     //{专项暂定合计}
     // 汇总专项暂定列有值的清单的金额
-        /* 'ZXZDHJ': function (tender) {
+    /* 'ZXZDHJ': function (tender) {
       let rst = 0,
         feeField = 'common',
         subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
@@ -742,9 +742,9 @@ let baseFigureTemplate = {
       }
       return rst.toDecimal(decimalObj.bills.totalPrice);
         }, */
-        // 第100章至700章清单行的暂估合价
-        'ZXZDHJ': function (tender) {
-            return cbTools.getBaseFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, tender, 'estimate');
+    // 第100章至700章清单行的暂估合价
+    'ZXZDHJ': function (tender) {
+      return cbTools.getBaseFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, tender, 'estimate');
     },
     //{100章以外清单合计}
     // 取清单固定清单[第100章至700章清单]的金额,但扣除清单100章下的金额。

+ 13 - 1
web/building_saas/pm/js/pm_newMain.js

@@ -50,7 +50,8 @@ const STATE = {
     addingProject: false,
     addingFolder: false,
     deleting: false,
-    importing: false
+    importing: false,
+    moving: false,
 };
 const projTreeObj = {
     tree: null,
@@ -508,6 +509,7 @@ const projTreeObj = {
             }
             projTreeObj.moveTo(selected, null, parent, next, null, action);
             $.bootstrapLoading.end();
+            STATE.moving = false;
             projTreeObj.emitTreeChange();
         });
     },
@@ -551,10 +553,15 @@ const projTreeObj = {
         this.doAfterTreeOpr({selected, parent, next, projectMap}, 'downLevel');
     },
     upMove: function () {
+        if (STATE.moving) {
+            return;
+        }
+        STATE.moving = true;
         let selected = projTreeObj.tree.selected,
             parent = selected.parent,
             next = selected.preSibling(),
             projectMap = {};
+        //$('#upMove').addClass('disabled');
         //更新前前兄弟
         let prepre = selected.preSibling().preSibling();
         if (prepre) {
@@ -568,10 +575,15 @@ const projTreeObj = {
         this.doAfterTreeOpr({selected, parent, next, projectMap});
     },
     downMove: function () {
+        if (STATE.moving) {
+            return;
+        }
+        STATE.moving = true;
         let selected = projTreeObj.tree.selected,
             parent = selected.parent,
             next = selected.nextSibling.nextSibling,
             projectMap = {};
+        //$('#downMove').addClass('disabled');
         //更新前兄弟
         let pre = selected.preSibling();
         if (pre) {

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 567 - 495
web/building_saas/pm/js/pm_tree.js


+ 249 - 31
web/building_saas/standard_interface/export/guangdong_zhongshan.js

@@ -22,6 +22,7 @@ INTERFACE_EXPORT = (() => {
     施工辅助: "SGFZFFL",
     基本费用: "JBFYFL",
     主副食运费补贴: "ZFSYFBTFL",
+    综合里程: "ZFSYFBTFL",
     职工探亲路费: "ZGTQLFFL",
     职工探亲: "ZGTQLFFL",
     职工取暖补贴: "ZGQNBTFL",
@@ -75,6 +76,27 @@ INTERFACE_EXPORT = (() => {
     'rationCommon': 'DEJAF'
   };
 
+  function getBasePrice(projectGLJID, tenderProject) {
+    let glj = _.find(tenderProject.projectGLJ.datas.gljList, {
+      id: projectGLJID
+    })
+    return glj ? gljUtil.getBasePrice(glj, null, null, null, decimalObj, false, _, scMathUtil) : 0;
+  }
+
+
+
+  function getFeeRate(programID, fieldName, tenderProject) {
+    let rate = 0;
+    let template = tenderProject.calcProgram.compiledTemplates;
+    if (template[programID]) {
+      let item = _.find(template[programID].calcItems, {
+        fieldName: fieldName
+      })
+      if (item) rate = item.feeRate;
+    }
+    return rate
+  }
+
   /**
    *
    * @param {String} areaKey - 地区标识,如:'安徽@马鞍山',有些地区的接口只是取值上有不同,共有一个接口脚本, 需要通过地区标识确定一些特殊处理
@@ -253,8 +275,8 @@ INTERFACE_EXPORT = (() => {
             });
             if (value == -1) value = 0;
           }
-          if (sname == '利润') tenderProject.ProfitRate = value;
-          if (sname == '税金') tenderProject.TaxRate = value;
+          /*     if (sname == '利润') tenderProject.ProfitRate = value;
+              if (sname == '税金') tenderProject.TaxRate = value; */
           RateParams.children.push(new RateParam(feeRateMap[sname], value));
         }
       }
@@ -622,8 +644,8 @@ INTERFACE_EXPORT = (() => {
       let totalItem = null;
       let proItem = null; //暂列金额项
       for (let b of bills) {
-        if (b.flagsIndex.fixed.flag == fixedFlag.TOTAL_COST) totalItem = b;
-        if (b.flagsIndex.fixed.flag == fixedFlag.PROVISIONAL) proItem = b;
+        if (b.flagsIndex && b.flagsIndex.fixed && b.flagsIndex.fixed.flag == fixedFlag.TOTAL_COST) totalItem = b;
+        if (b.flagsIndex && b.flagsIndex.fixed && b.flagsIndex.fixed.flag == fixedFlag.PROVISIONAL) proItem = b;
       }
 
       const attrs = [{
@@ -640,8 +662,104 @@ INTERFACE_EXPORT = (() => {
       this.children.push(new MakeInfo(tenderProject));
       this.children.push(new Params(tenderProject));
       this.children.push(new getBillsItems(tenderProject));
+      this.children.push(new getIndexs(tenderProject));
+      let bidEvaluationMainMaterials = getBidEvaluationMainMaterial(tenderProject);
+      if(bidEvaluationMainMaterials.length > 0) this.children.push(...bidEvaluationMainMaterials);
+    }
+
+    function getBidEvaluationMainMaterial(tenderProject) { 
+      let bidMaterials = [];
+      let i = 1;
+      for (let b of  tenderProject.bidMaterialData) { 
+        bidMaterials.push(new BidEvaluationMainMaterial(b, i));
+        i++
+      }
+      return bidMaterials;
+      function BidEvaluationMainMaterial(b, index) { 
+        const attrs = [{
+          name: "Code",
+          value: index,
+        },
+        {
+          name: "Number",
+          value: b.code
+        },
+        {
+          name: "Name",
+          value: b.name
+        },
+        {
+          name: "Specification",
+          value: b.specs
+        },
+        {
+          name: "Unit",
+          value: b.unit
+        },
+        {
+          name: "Price",
+          value: b.tenderPrice
+        },
+        {
+          name: "LimitedPrice",
+          value: b.tenderPrice
+        },
+        {
+          name: "Quantity",
+          value: b.quantity
+        },
+        {
+          name: "Total",
+          value: b.totalPrice
+        },
+        {
+          name: "Remark",
+          value: b.remark
+        }
+      ];
+      Element.call(this, "BidEvaluationMainMaterial", attrs);
+      }
+
+    }
+
+
+    function getIndexs(tenderProject) {
+      let Indexs = new emptyElement('Indexs');
+      let feature = tenderProject.property.projectFeature ? tenderProject.property.projectFeature : [];
+      for (let f of feature) {
+        if (f.code) Indexs.children.push(new IndexItem(f))
+      }
+      return Indexs;
+
+      function IndexItem(fea) {
+        const attrs = [{
+            name: "Code",
+            value: fea.code,
+          },
+          {
+            name: "Name",
+            value: fea.dispName,
+          },
+          {
+            name: "Unit",
+            value: fea.unit,
+          },
+          {
+            name: "Value",
+            value: fea.value,
+          },
+          {
+            name: "Remark",
+            value: fea.remark,
+          }
+        ]
+        Element.call(this, "IndexItem", attrs);
+      }
+
+
     }
 
+
     function getBillsItems(tenderProject) {
       let items = new emptyElement("Items");
       let rootNodes = tenderProject.mainTree.roots;
@@ -707,7 +825,7 @@ INTERFACE_EXPORT = (() => {
             },
             {
               name: "Price",
-              value: data.feesIndex && data.feesIndex.common ? data.feesIndex.common.unitFee : "",
+              value: data.feesIndex && data.feesIndex.common ? data.feesIndex.common.tenderUnitFee : "",
             },
             {
               name: "Rate",
@@ -715,7 +833,7 @@ INTERFACE_EXPORT = (() => {
             },
             {
               name: "Sum",
-              value: data.feesIndex && data.feesIndex.common ? data.feesIndex.common.totalFee : "",
+              value: data.feesIndex && data.feesIndex.common ? data.feesIndex.common.tenderTotalFee : "",
             },
             {
               name: "ChapterKind",
@@ -787,15 +905,116 @@ INTERFACE_EXPORT = (() => {
               for (let r of bNode.children) {
                 if (r.data.type == rationType.ration) {
                   Norms.push(new Ration(r.data));
+                } else {
+                  Costs.push(new Cost(r.data));
                 }
               }
-
             }
-            return CostComposition;
+            if (Norms.length > 0) CostComposition.children.push(...Norms);
+            if (Costs.length > 0) CostComposition.children.push(...Costs);
+            if (bNode.data.calcBase) CostComposition.children.push(new Formula(bNode.data));
+            return CostComposition.children.length > 0 ? CostComposition : null;
 
 
+            function Formula(bills) {
+              const attrs = [{
+                  name: "Name",
+                  value: bills.name
+                },
+                {
+                  name: "Formulas",
+                  value: bills.calcBase
+                },
+                {
+                  name: "Ratio",
+                  value: 1
+                },
+                {
+                  name: "Sum",
+                  value: bills.feesIndex && bills.feesIndex.common ? bills.feesIndex.common.tenderTotalFee : "",
+                },
+                {
+                  name: "Remarks",
+                  value: bills.remark
+                }
+              ]
+              Element.call(this, "Formula", attrs);
 
+              //               1.Name
+              // 名称/描述。取清单的名称。
+              // 2.Formulas
+              // 计算式。读取计算基数的文本。
+              // 取基数计算窗口内容,基数直接转换为金额?参考标准文档的 7.11 及 7.12 节。
+              // 7.11是定额的费用,7.12是清单累进基数,主要是估概预算中用到,清单里的不同,所以中山的接口直接输出基数文本。
+              // 3.Ratio
+              // 系数。输出为1,非必填。
+              // 4.Sum
+              // 取金额。
+              // 5.Remarks
+            }
 
+            function Cost(item) {
+              let BasePrice = 0;
+              if (item.type == rationType.volumePrice) { // 当插入的是量价时,基价读取单价列。
+                BasePrice = item.feesIndex && item.feesIndex.common ? item.feesIndex.common.tenderUnitFee : 0
+              } else {
+                BasePrice = getBasePrice(item.projectGLJID, tenderProject)
+              }
+              let calcMap = tenderProject.calcProgram.compiledTemplateMaps
+              let CostTypeNo = '';
+              if (feeRateMap[calcMap[item.programID]]) CostTypeNo = feeRateMap[calcMap[item.programID]];
+              const attrs = [{
+                  name: "Code",
+                  value: item.code,
+                }, {
+                  name: 'Name',
+                  value: item.name
+                }, {
+                  name: 'Spec',
+                  value: item.specs
+                }, {
+                  name: 'Unit',
+                  value: item.unit
+                }, {
+                  name: 'Num',
+                  value: item.tenderQuantity
+                }, {
+                  name: 'BasePrice',
+                  value: BasePrice
+                }, {
+                  name: 'Price',
+                  value: item.feesIndex && item.feesIndex.common ? item.feesIndex.common.tenderUnitFee : 0
+                }, {
+                  name: 'IsEquipment',
+                  value: item.subType == gljType.EQUIPMENT ? 1 : 0
+                }, {
+                  name: 'CostTypeNo',
+                  value: CostTypeNo
+                }, {
+                  name: 'ProfitRate',
+                  value: getFeeRate(item.programID, 'profit', tenderProject)
+
+                },
+                {
+                  name: 'TaxRate',
+                  value: getFeeRate(item.programID, 'tax', tenderProject)
+                },
+                {
+                  name: 'MpRatio',
+                  value: item.subType == gljType.LABOUR ? 100 : 0
+                },
+                {
+                  name: 'MaterialRatio',
+                  value: item.subType == gljType.GENERAL_MATERIAL ? 100 : 0
+                },
+                {
+                  name: 'MechRatio',
+                  value: item.subType == gljType.GENERAL_MACHINE ? 100 : 0
+                }
+              ]
+              Element.call(this, "Cost", attrs);
+              this.children.push(CostStructure(item));
+            }
 
 
             function Ration(ration) {
@@ -824,11 +1043,11 @@ INTERFACE_EXPORT = (() => {
                 },
                 {
                   name: 'ProfitRate',
-                  value: tenderProject.ProfitRate
+                  value: getFeeRate(ration.programID, 'profit', tenderProject) //tenderProject.ProfitRate
                 },
                 {
                   name: 'TaxRate',
-                  value: tenderProject.TaxRate
+                  value: getFeeRate(ration.programID, 'tax', tenderProject) //tenderProject.TaxRate
                 },
                 {
                   name: 'FabricationCost',
@@ -840,32 +1059,31 @@ INTERFACE_EXPORT = (() => {
                 }
               ]
               Element.call(this, "Norm", attrs);
-              this.children.push(CostStructure(ration))
+              this.children.push(CostStructure(ration));
+              this.children.push(Consume(ration));
             }
-            // 1.NormLibNo
-            // 定额库编码。根据后台设置读取。
-            // 2.DisplayCode
-            // 定额子目编码。
-            // 3.Name
-            // 定额子目名称。
-            // 4.Unit
-            // 定额子目单位。
-            // 5.Num
-            // 定额的工程量。
-            // 6.CostTypeNo
-            // 取费类别编号。如土方编号为“TF”。
-            // 7.ProfitRate
-            // 取利润率。取费率界面右侧的利润参数值。
-            // 8.TaxRate
-            // 取税率。取费率界面右侧的税率参数值。
-            // 9.FabricationCost
-            // 金额合计。取造价书界面定额的调价后金额。
-            // 10.AdjustStatus
-            // 定额调整状态。输出目前造价书显示的定额调整文本。
           }
 
+          function Consume(ration) {
+            let consume = new emptyElement('Consume');
+            for (let rg of ration.rationGLJList) {
+              consume.children.push(new ConsumeItem(rg));
+            }
+            return consume;
+
+            function ConsumeItem(rg) {
+              const attrs = [{
+                name: "Code",
+                value: rg.code,
+              }, {
+                name: "Consumption",
+                value: rg.tenderQuantity
+              }];
+              Element.call(this, "ConsumeItem", attrs);
 
+            }
 
+          }
 
 
           function CostStructure(item) {

+ 1 - 1
web/over_write/js/shandong_2016.js

@@ -238,7 +238,7 @@ if (typeof baseFigureTemplate !== "undefined") {
 function o_sortRationGLJ(list, std, tm) {
   let lo_sh = typeof _ !== "undefined" ? _ : require("lodash");
   const field = std ? "gljType" : "type";
-  const TypeMap = {
+  let TypeMap = {
     1: 1,
     303: 2,
     202: 3,