浏览代码

Merge branch 'master' into dev

zhangweicheng 4 年之前
父节点
当前提交
7a779b48f8

+ 2 - 2
logs/online_logs.js

@@ -33,13 +33,13 @@ async function saveOnlineTime(req) {
         let record = await logs_model.findOne(condition);
         if(record){ //如果找到,则累加
             await logs_model.update(condition,{$inc:{'online_times' : online_times }});
-            await user_model.update(userCondition,{$inc:{'online_times' : online_times }});
+            await user_model.update(userCondition,{$inc:{'online_times' : online_times, 'all_online_times' : online_times}});
         }else {//如果没找到,则新增一条记录
             condition["online_times"] = online_times;
             let today = moment(dataString).toDate();
             condition["dateTime"] = +today;
             await logs_model.create(condition);
-            await user_model.update(userCondition,{'online_times' : online_times});
+            await user_model.update(userCondition,{'online_times' : online_times,$inc:{'all_online_times' : online_times }});
         }
     }catch (e){
         console.log("统计登录时间错误,online_times值:"+online_times);

+ 4 - 0
modules/all_models/user.js

@@ -125,6 +125,10 @@ let schema = {
         type: Number,
         default: 0
     }, //最近一天的登录时长累计
+    all_online_times: {//所有登录时长累计
+        type: Number,
+        default: 0
+    },
     is_cld: {
         type: Number,
         default: 0, // 0为普通用户,时间戳代表CLD剔除用户并按时间戳排序

文件差异内容过多而无法显示
+ 3235 - 2682
web/building_saas/main/js/models/calc_program.js


+ 37 - 0
web/building_saas/report/js/jpc_output.js

@@ -245,6 +245,26 @@ let JpcCanvasOutput = {
             }
             ctx.restore();
         }
+        function _splitValues(cell, control, orgValues, ctx2D) {
+            //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
+            if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
+                let vals = [];
+                let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+                for (let val of orgValues) {
+                    let actW = ctx2D.measureText(val).width;
+                    if (actW > validAreaTxtWidth) {
+                        vals = vals.concat(private_splitString(val, validAreaTxtWidth, ctx2D));
+                    } else {
+                        vals.push(val);
+                    }
+                }
+                if (vals.length > orgValues.length) {
+                    for (let idx = 0; idx < vals.length; idx++) {
+                        orgValues[idx] = vals[idx];
+                    }
+                }
+            }
+        }
         function private_drawCellText(cell, fonts, controls) {
             if (cell[JV.PROP_VALUE] !== null && cell[JV.PROP_VALUE] !== undefined) {
                 let values = ("" + cell[JV.PROP_VALUE]).split('|');
@@ -270,6 +290,23 @@ let JpcCanvasOutput = {
                         values = [""];
                     }
                 }
+
+                if (font) {
+                    let dftFontHeight = parseFloat(font[JV.FONT_PROPS[1]]);
+                    let dftOthers = "";
+                    let dftFontBold = font[JV.FONT_PROPS[3]];
+                    if (dftFontBold && dftFontBold === 'T') {
+                        dftOthers = "bold " + dftOthers ;
+                    }
+                    let dftFontItalic = font[JV.FONT_PROPS[4]];
+                    if (dftFontItalic && dftFontItalic === 'T') {
+                        dftOthers = dftOthers + "italic ";
+                    }
+                    dftFontHeight = me.scaleFactor * dftFontHeight;
+                    ctx.font = dftOthers + dftFontHeight + "px " + font[JV.PROP_NAME];
+                }
+                _splitValues(cell, control, values, ctx);
+
                 let height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
                 let area = [cell[JV.PROP_AREA][JV.PROP_LEFT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_TOP] + me.offsetY, cell[JV.PROP_AREA][JV.PROP_RIGHT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_BOTTOM] + me.offsetY];
                 let ah = height;

+ 27 - 0
web/building_saas/report/js/rpt_jspdf.js

@@ -126,6 +126,27 @@ let JpcJsPDFHelper = {
             }
         }
 
+        function _splitValues(cell, control, orgValues, doc) {
+            //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
+            if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
+                let vals = [];
+                let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+                for (let val of orgValues) {
+                    let actW = doc.getTextWidth(val);
+                    if (actW > validAreaTxtWidth) {
+                        vals = vals.concat(private_splitString(val, validAreaTxtWidth, doc));
+                    } else {
+                        vals.push(val);
+                    }
+                }
+                if (vals.length > orgValues.length) {
+                    for (let idx = 0; idx < vals.length; idx++) {
+                        orgValues[idx] = vals[idx];
+                    }
+                }
+            }
+        }
+
         function private_drawCellText(doc, ctx, cell, fonts, controls) {
             if (cell[JV.PROP_VALUE] !== undefined && cell[JV.PROP_VALUE] !== null) {
                 let values = ("" + cell[JV.PROP_VALUE]).split('|');
@@ -149,6 +170,12 @@ let JpcJsPDFHelper = {
                 } else {
                     control = cell[JV.PROP_CONTROL];
                 }
+                
+                if (font) {
+                    doc.setFontSize(1 * font[JV.FONT_PROPS[1]]);
+                }
+                _splitValues(cell, control, values, doc);
+
                 let height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
                 let area = [cell[JV.PROP_AREA][JV.PROP_LEFT] + offsetX, cell[JV.PROP_AREA][JV.PROP_TOP] + offsetY, cell[JV.PROP_AREA][JV.PROP_RIGHT] + offsetX, cell[JV.PROP_AREA][JV.PROP_BOTTOM] + offsetY];
                 let ah = height;

+ 23 - 0
web/building_saas/report/js/rpt_print.js

@@ -176,6 +176,27 @@ function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBo
     return rst.join("");
 }
 
+function _splitValues(cell, control, orgValues, ctx2D) {
+    //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
+    if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
+        let vals = [];
+        let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+        for (let val of orgValues) {
+            let actW = ctx2D.measureText(val).width;
+            if (actW > validAreaTxtWidth) {
+                vals = vals.concat(private_splitString(val, validAreaTxtWidth, ctx2D));
+            } else {
+                vals.push(val);
+            }
+        }
+        if (vals.length > orgValues.length) {
+            for (let idx = 0; idx < vals.length; idx++) {
+                orgValues[idx] = vals[idx];
+            }
+        }
+    }
+}
+
 function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV, HtoVStr) {
     let orgFontHeight = parseInt(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]]);
     let fontWeight = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold":"normal";
@@ -219,6 +240,8 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
     area[JV.IDX_RIGHT] = right;
     let height = bottom - top;
     let ctx = canvas.getContext("2d");
+    ctx.font = ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold ":"") + ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"") + orgFontHeight + "px " + font[JV.PROP_NAME];
+    _splitValues(cell, control, values, ctx);
     let inner_draw_text = function (textValue) {
         let dftFontHeight = orgFontHeight;
         ctx.font = ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold ":"") + ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"") + dftFontHeight + "px " + font[JV.PROP_NAME];

+ 16 - 6
web/building_saas/standard_interface/export/anhui_chizhou.js

@@ -428,6 +428,14 @@ INTERFACE_EXPORT = (() => {
         }
 
         function createZaoJHZB(Bid, ZaoJHZB) {
+            const flagToLB = {
+                [fixedFlag.ONE_SEVEN_BILLS]: '1',
+                [fixedFlag.PROVISIONAL_TOTAL]: '2',
+                [fixedFlag.BILLS_TOTAL_WT_PROV]: '3',
+                [fixedFlag.DAYWORK_LABOR]: '4',
+                [fixedFlag.PROVISIONAL]: '5',
+                [fixedFlag.TOTAL_COST]: '6',
+            };
             const map_ZC_LB = [
                 {reg: /(第?100章?至第?700章?)/, zc: '', lb: '1'},
                 {reg: /已包含在清单合计中的材料/, zc: '', lb: '2'},
@@ -444,10 +452,13 @@ INTERFACE_EXPORT = (() => {
                 {reg: /第700章/, zc: '700', lb: '17'}
             ]
 
-            function getZCLB(name, kind){
-                let rst = '';
+            function getZCLB(flag, name, kind){
+                let rst = kind === 2 ? flagToLB[flag] || '' : '';
+                if (rst) {
+                    return rst;
+                }
+                const trimName = (name || '').replace(/\s/g, '');
                 for (let i = 0; i < map_ZC_LB.length; i++){
-                    const trimName = (name || '').replace(/\s/g, '');
                     if (map_ZC_LB[i].reg.test(trimName)){
                         if (kind == 1)
                             rst = map_ZC_LB[i].zc
@@ -465,7 +476,6 @@ INTERFACE_EXPORT = (() => {
                 else
                     return (node.data.feesIndex && node.data.feesIndex.common ? node.data.feesIndex.common.tenderTotalFee : 0);
             }
-            debugger;
             let nodes = [vTree.roots[0], ...vTree.roots[0].children, ...vTree.roots.slice(1)];
 
             let hzmxNo = 0;
@@ -474,10 +484,10 @@ INTERFACE_EXPORT = (() => {
                 hzmxNo++;
                 let attrs = [
                     { name: '序号', value: hzmxNo },
-                    { name: '章次', value: getZCLB(node.data.name, 1) },
+                    { name: '章次', value: getZCLB(node.getFlag(), node.data.name, 1) },
                     { name: '名称', value: node.data.name },
                     { name: '金额', value: getJE(node) },
-                    { name: '类别', value: getZCLB(node.data.name, 2) },
+                    { name: '类别', value: getZCLB(node.getFlag(), node.data.name, 2) },
                     { name: '备注', value: node.data.remark }
                 ];
                 const zaoJHZMX = new CreateNode('造价汇总明细', attrs);

+ 3 - 2
web/building_saas/standard_interface/import/anhui_chizhou.js

@@ -83,13 +83,14 @@ INTERFACE_IMPORT = (() => {
         .filter(item => !getValue(item, ['_章次']))
         .map(item => ({
           name: getValue(item, ['_名称']),
-          remark: getValue(item, ['_备注'])
+          remark: getValue(item, ['_备注']),
+          titleType: getValue(item, ['_类别'])
         }));
       let oneSevenBills;
       let dayWorkBills;
       roots.forEach(item => {
         const simpleName = item.name ? item.name.replace(/\s/g, '') : '';
-        if (/100章至第700章|100章至700章/.test(simpleName)) {
+        if (item.titleType === '1' || /100章至第700章|100章至700章/.test(simpleName)) {
           oneSevenBills = item;
         } else if (/计日工合计/.test(simpleName)) {
           dayWorkBills = item;

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

@@ -184,7 +184,9 @@ INTERFACE_IMPORT = (() => {
         if (curField === qdbt) {
           item.code = getValue(src, ['_Bm']);
           item.rowCode = getValue(src, ['_Code']); // 注意:行号标记,用于后续(通用处理)清单基数进行转换(行引用转换为ID引用) 
-          if (getValue(src, ['_Lb']) === '5') { // 暂列金额才导入计算基数
+          const titleType = getValue(src, ['_Lb']);
+          item.titleType = titleType;
+          if (titleType === '5') { // 暂列金额才导入计算基数
             item.calcBase = getValue(src, ['_Jsgs']);
           }
         } else if (curField === qdmx) {

+ 24 - 7
web/building_saas/standard_interface/import/base.js

@@ -228,6 +228,16 @@ const INTERFACE_EXPORT_BASE = (() => {
 
   const { fixedFlag, BillType } = window.commonConstants;
 
+  // 标题类别 - flag 映射
+  const titleTypeToFlag = {
+    1: fixedFlag.ONE_SEVEN_BILLS,
+    2: fixedFlag.PROVISIONAL_TOTAL,
+    3: fixedFlag.BILLS_TOTAL_WT_PROV,
+    4: fixedFlag.DAYWORK_LABOR,
+    5: fixedFlag.PROVISIONAL,
+    6: fixedFlag.TOTAL_COST,
+  }
+
   /**
    * 将提取出来的清单合并进清单模板
    * @param {Array} source - 从xml提取出来的清单
@@ -236,21 +246,26 @@ const INTERFACE_EXPORT_BASE = (() => {
    * @return {void}
    */
   function mergeBills(source, target, parent) {
-    source.forEach(bills => {
+    source.forEach((bills, index) => {
+      // 为了大项费用排序
+      if (!parent) {
+        bills.seq = index;
+      }
       const simpleName = bills.name ? bills.name.replace(/\s/g, '') : '';
+      const titleType = bills.titleType || '0';
       let matched;
       if (!parent) {
-        if (/100章.*700章|100章.*900章/.test(simpleName)) {
+        if (titleTypeToFlag[titleType] === fixedFlag.ONE_SEVEN_BILLS || /100章.*700章|100章.*900章/.test(simpleName)) {
           matched = target.find(bills => getFlag(bills) === fixedFlag.ONE_SEVEN_BILLS);
-        } else if (/包含在清单合计中的材料、工程设备、专业工程暂估/.test(simpleName)) {
+        } else if (titleTypeToFlag[titleType] === fixedFlag.PROVISIONAL_TOTAL || /包含在清单合计中的材料、工程设备、专业工程暂估/.test(simpleName)) {
           matched = target.find(bills => getFlag(bills) === fixedFlag.PROVISIONAL_TOTAL);
-        } else if (/清单合计减去材料、工程设备、专业工程暂估价/.test(simpleName)) {
+        } else if (titleTypeToFlag[titleType] === fixedFlag.BILLS_TOTAL_WT_PROV || /清单合计减去材料、工程设备、专业工程暂估价/.test(simpleName)) {
           matched = target.find(bills => getFlag(bills) === fixedFlag.BILLS_TOTAL_WT_PROV);
-        } else if (/计日工合计/.test(simpleName)) {
+        } else if (titleTypeToFlag[titleType] === fixedFlag.DAYWORK_LABOR || /计日工合计/.test(simpleName)) {
           matched = target.find(bills => getFlag(bills) === fixedFlag.DAYWORK_LABOR);
-        } else if (/暂列金额[((]不含/.test(simpleName)) {
+        } else if (titleTypeToFlag[titleType] === fixedFlag.PROVISIONAL || /暂列金额[((]不含/.test(simpleName)) {
           matched = target.find(bills => getFlag(bills) === fixedFlag.PROVISIONAL);
-        } else if (/报价/.test(simpleName)) {
+        } else if (titleTypeToFlag[titleType] === fixedFlag.TOTAL_COST || /报价/.test(simpleName)) {
           matched = target.find(bills => getFlag(bills) === fixedFlag.TOTAL_COST);
         }
       } else {
@@ -288,6 +303,8 @@ const INTERFACE_EXPORT_BASE = (() => {
     const rst = [];
     // 将提取的清单数据合并进清单模板数据
     mergeBills(tenderBills, billsTarget, null);
+    // 大项费用按照清单标题排序
+    billsTarget.sort((a, b) => a.seq - b.seq);
     // 给清单设置数据
     const rowCodeData = []; // 行号数据,用于转换行引用
     const toBeTransformBills = []; // 待转换的清单