Explorar o código

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

zhangweicheng %!s(int64=5) %!d(string=hai) anos
pai
achega
50ae88ca81

+ 1 - 0
config/gulpConfig.js

@@ -44,6 +44,7 @@ module.exports = {
     pm_jspaths:[
         'public/web/syntax-detection.js',
         'public/web/uuid.js',
+        'public/billsUtil.js',
         'public/web/date_util.js',
         'public/web/upload_cdn.js',
         'public/web/id_tree.js',

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

@@ -43,8 +43,8 @@
         let projectReadOnly = JSON.parse('<%- projectReadOnly %>');
         let projectCooperate = JSON.parse('<%- projectCooperate %>');
         let projectOptins =  JSON.parse('<%- options %>');
-        // const G_SHOW_BLOCK_LIB = true;
-        const G_SHOW_BLOCK_LIB = false;
+        const G_SHOW_BLOCK_LIB = true;
+        // const G_SHOW_BLOCK_LIB = false;
         const markReadProjectIDs = JSON.parse('<%- markReadProjectIDs %>');
         const VERSION = '<%- version %>';
         const CUR_BOQ_TYPE = '<%- boqType %>';
@@ -1860,11 +1860,11 @@
                         <div>
                             <div class="form-check form-check-inline">
                                 <input class="form-check-input" type="checkbox" name="inlineRadioOptions1" id="clone_option_code" value="option1" checked>
-                                <label class="form-check-label" for="clone_option_code">项目编码(前9位)</label>
+                                <label class="form-check-label" for="clone_option_code">编号</label>
                             </div>
                             <div class="form-check form-check-inline">
                                 <input class="form-check-input" type="checkbox" name="inlineRadioOptions2" id="clone_option_name" value="option2">
-                                <label class="form-check-label" for="clone_option_name">项目名称</label>
+                                <label class="form-check-label" for="clone_option_name">名称</label>
                             </div>
                             <div class="form-check form-check-inline">
                                 <input class="form-check-input" type="checkbox" name="inlineRadioOptions3" id="clone_option_unit" value="option3" checked>
@@ -1877,11 +1877,11 @@
                         <div>
                             <div class="form-check form-check-inline">
                                 <input class="form-check-input" type="radio" name="rationQuantity" id="clone_option_quantity" value="option1" checked>
-                                <label class="form-check-label" for="clone_option_quantity">根据含量计算定额工程量</label>
+                                <label class="form-check-label" for="clone_option_quantity">根据分解系数计算定额工程量</label>
                             </div>
                             <div class="form-check form-check-inline">
                                 <input class="form-check-input" type="radio" name="rationQuantity" id="clone_option_zeroQuantity" value="option2">
-                                <label class="form-check-label" for="clone_option_zeroQuantity">含量和定额工程量为零</label>
+                                <label class="form-check-label" for="clone_option_zeroQuantity">分解系数和定额工程量为零</label>
                             </div>
                         </div>
                     </div>

+ 44 - 23
web/building_saas/main/js/models/calc_program.js

@@ -1779,7 +1779,7 @@
 
    // 只计算treeNode自身。changedArr: 外部传来的一个数组,专门存储发生变动的节点。
    innerCalc(treeNode, changedArr, tenderType) {
-     if (treeNode.data.lockUnitPrice == true) return;
+     // if (treeNode.data.lockUnitPrice == true) return;
      if (treeNode.sourceType === ModuleNames.ration_glj) return; // 仅用作树节点显示的工料机不能参与计算。
 
      let me = this;
@@ -1851,31 +1851,52 @@
                buf = (btf / bq).toDecimal(decimalObj.process);
                btuf = (bttf / bq).toDecimal(decimalObj.process);
              }
+             else{      // TASK #3409 招投标:清单父项的单价=ROUND(金额/工程量,精度)。如果清单父项的工程量为空或0,则清单父项的单价为空。
+               if (nQ == 0)
+                 buf = 0
+               else
+                 buf = (btf / bq).toDecimal(decimalObj.process);
+
+               if (nTQ == 0)
+                 btuf = 0
+               else
+                 btuf = (bttf / bq).toDecimal(decimalObj.process);
+             }
            };
          };
        } else if ((commonCalcType == 1) || (commonCalcType == 3)) {
-         let sum_rtf = 0,
-           sum_rttf = 0;
-         for (let node of nodes) {
-           let ruf = 0,
-             rtuf = 0,
-             rtf = 0,
-             rttf = 0;
-           if (node.data.feesIndex && node.data.feesIndex[ft.type]) {
-             ruf = parseFloatPlus(node.data.feesIndex[ft.type].unitFee).toDecimal(decimalObj.bills.unitPrice);
-             rtuf = parseFloatPlus(node.data.feesIndex[ft.type].tenderUnitFee).toDecimal(decimalObj.bills.unitPrice);
-             rtf = parseFloatPlus(node.data.feesIndex[ft.type].totalFee).toDecimal(decimalObj.bills.totalPrice);
-             rttf = parseFloatPlus(node.data.feesIndex[ft.type].tenderTotalFee).toDecimal(decimalObj.bills.totalPrice);
-           };
-
-           sum_rtf = (sum_rtf + rtf).toDecimal(decimalObj.process);
-           sum_rttf = (sum_rttf + rttf).toDecimal(decimalObj.process);
-         };
-
-         buf = (sum_rtf / bq).toDecimal(decimalObj.process);
-         btuf = (sum_rttf / btq).toDecimal(decimalObj.process);
-         btf = sum_rtf;
-         bttf = sum_rttf;
+           if (treeNode.data.lockUnitPrice == true){       // 清单单价锁定
+               if (treeNode.data.feesIndex && treeNode.data.feesIndex[ft.type]) {
+                   buf = parseFloatPlus(treeNode.data.feesIndex[ft.type].unitFee).toDecimal(decimalObj.bills.unitPrice);
+                   btuf = parseFloatPlus(treeNode.data.feesIndex[ft.type].tenderUnitFee).toDecimal(decimalObj.bills.unitPrice);
+                   btf = (bq * buf).toDecimal(decimalObj.bills.totalPrice);
+                   bttf = (btq * btuf).toDecimal(decimalObj.bills.totalPrice);
+               }
+           }
+           else{
+               let sum_rtf = 0,
+                   sum_rttf = 0;
+               for (let node of nodes) {
+                   let ruf = 0,
+                       rtuf = 0,
+                       rtf = 0,
+                       rttf = 0;
+                   if (node.data.feesIndex && node.data.feesIndex[ft.type]) {
+                       ruf = parseFloatPlus(node.data.feesIndex[ft.type].unitFee).toDecimal(decimalObj.bills.unitPrice);
+                       rtuf = parseFloatPlus(node.data.feesIndex[ft.type].tenderUnitFee).toDecimal(decimalObj.bills.unitPrice);
+                       rtf = parseFloatPlus(node.data.feesIndex[ft.type].totalFee).toDecimal(decimalObj.bills.totalPrice);
+                       rttf = parseFloatPlus(node.data.feesIndex[ft.type].tenderTotalFee).toDecimal(decimalObj.bills.totalPrice);
+                   };
+
+                   sum_rtf = (sum_rtf + rtf).toDecimal(decimalObj.process);
+                   sum_rttf = (sum_rttf + rttf).toDecimal(decimalObj.process);
+               };
+
+               buf = (sum_rtf / bq).toDecimal(decimalObj.process);
+               btuf = (sum_rttf / btq).toDecimal(decimalObj.process);
+               btf = sum_rtf;
+               bttf = sum_rttf;
+           }
 
          if (calcTools.isBillProject() && (ft.type == 'common' || ft.type == 'rationCommon')) { // 招投标项目, 还要反算
            buf = buf.toDecimal(decimalObj.bills.unitPrice);

+ 5 - 5
web/building_saas/main/js/views/block_lib.js

@@ -44,11 +44,11 @@ var blockLibObj = {
             {headerName: "项目编码", headerWidth: 90, dataCode: "code", dataType: "String", hAlign: "center"},
             {headerName: "项目名称", headerWidth: 100, dataCode: "name", dataType: "String"},
             {headerName: "单位", headerWidth: 40, dataCode: "unit", dataType: "String", hAlign: "center"},
-            {headerName: "综合单价", headerWidth: 70, dataCode: "unitFee", dataType: "Number"},
-            {headerName: "项目特征", headerWidth: 160, dataCode: "itemCharacterText", dataType: "String"}
+            {headerName: "综合单价", headerWidth: 70, dataCode: "unitFee", dataType: "Number"}//,
+        //    {headerName: "项目特征", headerWidth: 160, dataCode: "itemCharacterText", dataType: "String"}
         ],
         view: {
-            lockColumns: [0, 1, 2, 3, 4]
+            lockColumns: [0, 1, 2, 3]
         }
     },
     rationSpread: null,
@@ -58,8 +58,8 @@ var blockLibObj = {
             {headerName: "编码", headerWidth: 45, dataCode: "code", dataType: "String", hAlign: "center"},
             {headerName: "名称", headerWidth: 100, dataCode: "name", dataType: "String"},
             {headerName: "单位", headerWidth: 40, dataCode: "unit", dataType: "String", hAlign: "center"},
-            {headerName: "含量", headerWidth: 40, dataCode: "contain", dataType: "Number"},
-            {headerName: "取费专业", headerWidth: 70, dataCode: "programName", dataType: "String", hAlign: "center"},
+            {headerName: "分解系数", headerWidth: 40, dataCode: "contain", dataType: "Number"},
+            {headerName: "取费类别", headerWidth: 70, dataCode: "programName", dataType: "String", hAlign: "center"},
             {headerName: "综合单价", headerWidth: 70, dataCode: "unitFee", dataType: "Number"},
             {headerName: "子目换算状态", headerWidth: 90, dataCode: "adjustState", dataType: "String"}
         ],

+ 4 - 4
web/building_saas/main/js/views/importBills.js

@@ -24,7 +24,7 @@ const importBills = (function () {
     }
 
     function _deNR(data) {
-        return _isDef(data) ? data.toString().replace(/\r\r/g, '\r') : data;
+        return _isDef(data) ? data.toString().replace(/[\r\n]/g, '') : data;
     }
     //find 返回最后匹配
     function findLast(datas, func) {
@@ -72,7 +72,7 @@ const importBills = (function () {
             //表格中顶层节点
             if (isGCLHead(dataTable[row])) {
                 let rootRow = dataTable[row + 2];
-                let name = rootRow[0].value ? _deESC(rootRow[0].value) : '';
+                let name = rootRow[0].value ? _deNR(rootRow[0].value) : '';
                 let existsRoot = findLast(rst, x => x.name === name && x.depth === 0);
                 if (!existsRoot) {
                     let root = {
@@ -94,7 +94,7 @@ const importBills = (function () {
                 continue;
             }
             let code = dataTable[row][colMapping.code] ? dataTable[row][colMapping.code].value : null,
-                name = dataTable[row][colMapping.name] ? _deESC(dataTable[row][colMapping.name].value) : null,
+                name = dataTable[row][colMapping.name] ? _deNR(dataTable[row][colMapping.name].value) : null,
                 unit = dataTable[row][colMapping.unit] ? dataTable[row][colMapping.unit].value : null,
                 quantity = dataTable[row][colMapping.quantity] ? dataTable[row][colMapping.quantity].value : null;
             if (!code && !name || /合计/.test(code)) {   //过滤掉同时没有编号和名称的、过滤合计行
@@ -175,7 +175,7 @@ const importBills = (function () {
         let curRoot = null;
         for (let row = 0; row < rowCount; row++) {
             let code = dataTable[row][colMapping.code] && dataTable[row][colMapping.code].value ? String(dataTable[row][colMapping.code].value).trim() : null,
-                name = dataTable[row][colMapping.name] ? _deESC(dataTable[row][colMapping.name].value) : null,
+                name = dataTable[row][colMapping.name] ? _deNR(dataTable[row][colMapping.name].value) : null,
                 unit = dataTable[row][colMapping.unit] ? dataTable[row][colMapping.unit].value : null,
                 quantity = dataTable[row][colMapping.quantity] ? dataTable[row][colMapping.quantity].value : null;
             if (!code) {    //没有编号的数据,名称必须为:清单 第xx章,认为新的表根节点

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 638 - 629
web/building_saas/main/js/views/main_tree_col.js


+ 10 - 2
web/building_saas/main/js/views/project_view.js

@@ -3178,8 +3178,16 @@ $(function () {
         }
         s = `<span style='color:red;'>${s}</span>`;
         $('#clone_option_title').html(`快速组价 (${s})`);
-        $('#clone_option_code').prop("checked", true);
-        $('#clone_option_name').prop("checked", false);
+
+        if (calcTools.isBudgetProject()){
+          $('#clone_option_code').prop("checked", false);
+          $('#clone_option_name').prop("checked", true);
+        }
+        else{
+          $('#clone_option_code').prop("checked", true);
+          $('#clone_option_name').prop("checked", false);
+        };
+
         $('#clone_option_unit').prop("checked", true);
         $('#clone_option_quantity').prop("checked", true);
         $('#clone_option_noCover').prop("checked", true);

+ 1 - 0
web/building_saas/pm/html/project-management.html

@@ -758,6 +758,7 @@
 <script type="text/javascript" src="/public/web/syntax-detection.js"></script>
 <script src="/web/building_saas/js/global.js"></script>
 <script src="/public/web/uuid.js"></script>
+<script src="/public/billsUtil.js"></script>
 <script src="/public/web/date_util.js"></script>
 <script src="/public/web/upload_cdn.js"></script>
 <script src="/web/building_saas/pm/js/pm_tree.js"></script>

+ 9 - 6
web/building_saas/standard_interface/export/anhui_maanshan.js

@@ -338,7 +338,8 @@ INTERFACE_EXPORT = (() => {
       const orgFee = getFee(node.data.fees, 'common.tenderTotalFee');
       const fee = isBidInvitation ? '0' : orgFee;
       const flag = node.getFlag();
-      const bm = BillsTitleValue[flag] || curTitleValue++;
+      // 编号:清单编码有值则直接取,无值则写死
+      const bm = node.data.code || BillsTitleValue[flag] || curTitleValue++;
       const titleType = BillsTitleType[flag];
       const calcBase = titleType === '5'
         ? orgFee
@@ -361,12 +362,14 @@ INTERFACE_EXPORT = (() => {
     // 清单明细 (只有100-700章清单标题输出)
     function QdMx(node, allNodes) {
       const row = node.row();
-      // 编码: 清单非章级的,读取清单编码列。章级的清单,写死:“清单第100章总则”输出=100,“清单第200章”输出=200,依次类推。可以判断章级的,取清单名称中的数字。
-      let code = node.data.code || '';
       const name = node.data.name || '';
-      const codeMatched = name.match(/第\s*(\d+)\s*章/);
-      if (codeMatched && codeMatched[1]) {
-        code = codeMatched[1];
+      // 编码: 清单编码有值则取清单编码,无值则:清单非章级的,读取清单编码列。章级的清单,写死:“清单第100章总则”输出=100,“清单第200章”输出=200,依次类推。可以判断章级的,取清单名称中的数字。
+      let code = node.data.code || '';
+      if (!code) {
+        const codeMatched = name.match(/第\s*(\d+)\s*章/);
+        if (codeMatched && codeMatched[1]) {
+          code = codeMatched[1];
+        }
       }
       const iszg = node.data.specialProvisional === '专业工程';
       const calcBaseBeFee = iszg || node.getFlag() === fixedFlag.PROVISIONAL;

+ 3 - 1
web/building_saas/standard_interface/import/base.js

@@ -374,7 +374,9 @@ const INTERFACE_EXPORT_BASE = (() => {
         feeFile: { name: tender.name, id: `newFeeRate@@${taxData.fee_lib.id}` } // 新建费率文件
       };
       delete tender.feature;
-      tender.bills = handleBills(tender.bills, _.cloneDeep(templateData.bills), tender.ID,); // 必须要拷贝一份,否则多单位工程情况下,前单位工程的清单数据会被后单位工程的覆盖
+      const tenderDataBills = _.cloneDeep(templateData.bills);
+      BILLS_UTIL.resetTreeData(tenderDataBills, uuid.v1);
+      tender.bills = handleBills(tender.bills, tenderDataBills, tender.ID,); // 必须要拷贝一份,否则多单位工程情况下,前单位工程的清单数据会被后单位工程的覆盖
       // 给暂估材料和评标材料设置项目数据
       const setGLJRefFunc = glj => {
         glj.ID = uuid.v1();

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

@@ -70,10 +70,11 @@
                     <a class="dropdown-item" href="#">重庆市2008定额说明</a>-->
                     <!--<a class="dropdown-item" href="/web/common/html/pdfViewer.html?type=userGuide" 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/yh_yhsc/yh_yhsc-1bup3dm7iacsg" target="_blank">用户手册</a>
                     <% if (compilationName === '公路造价(2018)') { %>
+                        <a class="dropdown-item" href="http://doc.zhzdwd.com/docs/glyyhsc" target="_blank">用户手册</a>
                         <a class="dropdown-item" href="http://doc.zhzdwd.com/docs/glyun/glyun-1cfge2jui6nh9" target="_blank">升级说明</a>
                     <% } else { %>
+                        <a class="dropdown-item" href="http://doc.zhzdwd.com/docs/yh_yhsc/yh_yhsc-1bup3dm7iacsg" target="_blank">用户手册</a>
                         <a class="dropdown-item" href="http://doc.zhzdwd.com/docs/yanghuUpdate" target="_blank">升级说明</a>
                     <% } %>
                     <a class="dropdown-item" href="https://smartcost.com.cn/" target="_blank">纵横官网</a>