Browse Source

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

TonyKang 5 years ago
parent
commit
daa954becb
100 changed files with 26028 additions and 3374 deletions
  1. 28 0
      config/config.js
  2. 5 0
      config/gulpConfig.js
  3. 288 0
      lib/jquery/jquery.sticky.js
  4. 372 0
      lib/pinyinjs/pinyinUtil.js
  5. 8 0
      lib/pinyinjs/pinyin_dict_firstletter.js
  6. 2 0
      modules/all_models/compilation.js
  7. 2 1
      modules/all_models/project_glj.js
  8. 2 1
      modules/all_models/user.js
  9. 19 0
      modules/all_models/welcome_setting.js
  10. 4 0
      modules/import/controllers/import_controller.js
  11. 1 0
      modules/import/routes/import_route.js
  12. 4 4
      modules/main/controllers/ration_controller.js
  13. 11 6
      modules/main/facade/bill_facade.js
  14. 74 64
      modules/main/facade/project_facade.js
  15. 14 7
      modules/main/facade/ration_facade.js
  16. 5 0
      modules/main/routes/main_route.js
  17. 24 1
      modules/pm/controllers/pm_controller.js
  18. 102 65
      modules/pm/facade/pm_facade.js
  19. 1 0
      modules/pm/routes/pm_route.js
  20. 27 6
      modules/ration_glj/facade/glj_calculate_facade.js
  21. 13 8
      modules/ration_glj/facade/ration_glj_facade.js
  22. 142 2
      modules/users/controllers/cld_controller.js
  23. 6 0
      modules/users/controllers/login_controller.js
  24. 62 0
      modules/users/facade/online_facade.js
  25. 14 0
      modules/users/models/compilation_model.js
  26. 106 0
      modules/users/models/user_model.js
  27. 6 0
      modules/users/routes/cld_route.js
  28. 2 2
      modules/users/routes/login_route.js
  29. 112 0
      public/common_constants.js
  30. 2 2
      public/gljUtil.js
  31. 17 8
      public/web/gljUtil.js
  32. 14 10
      public/web/sheet/sheet_common.js
  33. 11 1
      public/web/tree_sheet/tree_sheet_controller.js
  34. 1 1
      public/web/tree_sheet/tree_sheet_helper.js
  35. 1 1
      server.js
  36. 4463 0
      web/building_saas/css/all.css
  37. 580 0
      web/building_saas/css/style.css
  38. 4463 0
      web/building_saas/css/webfonts/all.css
  39. BIN
      web/building_saas/css/webfonts/fa-brands-400.eot
  40. 3570 0
      web/building_saas/css/webfonts/fa-brands-400.svg
  41. BIN
      web/building_saas/css/webfonts/fa-brands-400.ttf
  42. BIN
      web/building_saas/css/webfonts/fa-brands-400.woff
  43. BIN
      web/building_saas/css/webfonts/fa-brands-400.woff2
  44. BIN
      web/building_saas/css/webfonts/fa-regular-400.eot
  45. 803 0
      web/building_saas/css/webfonts/fa-regular-400.svg
  46. BIN
      web/building_saas/css/webfonts/fa-regular-400.ttf
  47. BIN
      web/building_saas/css/webfonts/fa-regular-400.woff
  48. BIN
      web/building_saas/css/webfonts/fa-regular-400.woff2
  49. BIN
      web/building_saas/css/webfonts/fa-solid-900.eot
  50. 4700 0
      web/building_saas/css/webfonts/fa-solid-900.svg
  51. BIN
      web/building_saas/css/webfonts/fa-solid-900.ttf
  52. BIN
      web/building_saas/css/webfonts/fa-solid-900.woff
  53. BIN
      web/building_saas/css/webfonts/fa-solid-900.woff2
  54. 87 11
      web/building_saas/main/html/main.html
  55. 31 9
      web/building_saas/main/html/tender_price.html
  56. 6 5
      web/building_saas/main/js/controllers/block_controller.js
  57. 3 2
      web/building_saas/main/js/controllers/material_controller.js
  58. 13 2
      web/building_saas/main/js/models/bills.js
  59. 45 2
      web/building_saas/main/js/models/calc_program.js
  60. 115 35
      web/building_saas/main/js/models/exportStdInterfaceBase.js
  61. 0 1035
      web/building_saas/main/js/models/exportStdInterface_gd18.js
  62. 1457 1628
      web/building_saas/main/js/models/importStandardInterface.js
  63. 65 32
      web/building_saas/main/js/models/importStdInterfaceBase.js
  64. 6 6
      web/building_saas/main/js/models/installation_fee.js
  65. 3 92
      web/building_saas/main/js/models/main_consts.js
  66. 2 2
      web/building_saas/main/js/models/overHeight.js
  67. 73 5
      web/building_saas/main/js/models/project.js
  68. 15 7
      web/building_saas/main/js/models/project_glj.js
  69. 6 4
      web/building_saas/main/js/models/quantity_detail.js
  70. 38 35
      web/building_saas/main/js/models/ration.js
  71. 22 20
      web/building_saas/main/js/models/ration_glj.js
  72. 16 9
      web/building_saas/main/js/views/area_increase_fee_view.js
  73. 5 1
      web/building_saas/main/js/views/calc_program_view.js
  74. 42 38
      web/building_saas/main/js/views/export_view.js
  75. 44 36
      web/building_saas/main/js/views/glj_view.js
  76. 8 7
      web/building_saas/main/js/views/index_view.js
  77. 409 16
      web/building_saas/main/js/views/item_increase_fee_view.js
  78. 7 2
      web/building_saas/main/js/views/main_tree_col.js
  79. 11 11
      web/building_saas/main/js/views/mbzm_view.js
  80. 5 3
      web/building_saas/main/js/views/project_glj_view.js
  81. 11 4
      web/building_saas/main/js/views/project_view.js
  82. 4 0
      web/building_saas/main/js/views/sub_view.js
  83. 24 54
      web/building_saas/main/js/views/tender_price_view.js
  84. 2 2
      web/building_saas/main/js/views/zlfb_view.js
  85. 2 2
      web/building_saas/main/js/views/zmhs_view.js
  86. 27 4
      web/building_saas/pm/html/project-management.html
  87. 11 6
      web/building_saas/pm/js/pm_import.js
  88. 51 23
      web/building_saas/pm/js/pm_newMain.js
  89. 1 0
      web/building_saas/pm/js/pm_share.js
  90. 1 1
      web/common/html/header.html
  91. 1 0
      web/over_write/js/chongqing_2018.js
  92. 22 0
      web/building_saas/main/js/models/exportStandardInterface.js
  93. 102 32
      web/building_saas/main/js/models/exportSEIInterface.js
  94. 2 0
      web/over_write/js/guangdong_2018.js
  95. 2691 0
      web/over_write/js/guangdong_2018_export.js
  96. 0 0
      web/over_write/js/guangdong_2018_export_sei.js
  97. 93 0
      web/over_write/js/guangdong_2018_import.js
  98. 367 0
      web/users/html/index.html
  99. 1 1
      web/users/html/user-info.html
  100. 0 0
      web/users/images/bg_01.png

+ 28 - 0
config/config.js

@@ -16,6 +16,20 @@ module.exports = {
         },
         importURL:"192.168.1.184:6050"
     },
+    qa_outer: {
+        server: "smartcost.in.8866.org",
+        port: "26904",
+        options:{
+            user:'smartcost',
+            pass:'smartcost3850888',
+            auth: {
+                "authdb": "admin"
+            },
+            connectTimeoutMS: 100000,
+            useMongoClient: true
+        },
+        importURL:"192.168.1.184:6050"
+    },
     test_auth: {
         server: "120.78.150.216",
         port: "27017",
@@ -42,6 +56,20 @@ module.exports = {
         },
         importURL:"172.18.111.231:6050"
     },
+    uat: {
+        server: "112.74.42.187",
+        port: "27017",
+        options:{
+            user:'smartcost',
+            pass:'SmartCost3850888',
+            auth: {
+                "authdb": "admin"
+            },
+            connectTimeoutMS: 100000,
+            useMongoClient: true
+        },
+        importURL:"192.168.1.184:6050"
+    },
     prod_s:{  server: "112.74.42.187",
         port: "28066",
         options:{

+ 5 - 0
config/gulpConfig.js

@@ -52,6 +52,8 @@ module.exports = {
         'web/building_saas/glj/js/socket.io.slim.js',
         'public/web/socket/connection.js',
         'public/billsUtil.js',
+        'public/common_constants.js',
+        'web/building_saas/main/js/models/importStdInterfaceBase.js',
         'web/building_saas/main/js/models/importStandardInterface.js',
         'web/building_saas/pm/js/**/*.js',
         'lib/ztree/*.js',
@@ -71,6 +73,9 @@ module.exports = {
         'lib/jquery-contextmenu/!*.js',*/
         //'lib/lodash/lodash.js',
         // 'test/tmp_data/test_ration_calc/ration_calc_base.js',
+        'lib/pinyinjs/pinyin_dict_firstletter.js',
+        'lib/pinyinjs/pinyinUtil.js',
+        'public/common_constants.js',
         'web/building_saas/main/js/models/main_consts.js',
         'web/over_write/config/compilation_config.js',
         'public/web/common_util.js',

+ 288 - 0
lib/jquery/jquery.sticky.js

@@ -0,0 +1,288 @@
+// Sticky Plugin v1.0.4 for jQuery
+// =============
+// Author: Anthony Garand
+// Improvements by German M. Bravo (Kronuz) and Ruud Kamphuis (ruudk)
+// Improvements by Leonardo C. Daronco (daronco)
+// Created: 02/14/2011
+// Date: 07/20/2015
+// Website: http://stickyjs.com/
+// Description: Makes an element on the page stick on the screen as you scroll
+//              It will only set the 'top' and 'position' of your element, you
+//              might need to adjust the width in some cases.
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        // AMD. Register as an anonymous module.
+        define(['jquery'], factory);
+    } else if (typeof module === 'object' && module.exports) {
+        // Node/CommonJS
+        module.exports = factory(require('jquery'));
+    } else {
+        // Browser globals
+        factory(jQuery);
+    }
+}(function ($) {
+    var slice = Array.prototype.slice; // save ref to original slice()
+    var splice = Array.prototype.splice; // save ref to original slice()
+
+  var defaults = {
+      topSpacing: 0,
+      bottomSpacing: 0,
+      className: 'is-sticky',
+      wrapperClassName: 'sticky-wrapper',
+      center: false,
+      getWidthFrom: '',
+      widthFromWrapper: true, // works only when .getWidthFrom is empty
+      responsiveWidth: false,
+      zIndex: 'inherit'
+    },
+    $window = $(window),
+    $document = $(document),
+    sticked = [],
+    windowHeight = $window.height(),
+    scroller = function() {
+      var scrollTop = $window.scrollTop(),
+        documentHeight = $document.height(),
+        dwh = documentHeight - windowHeight,
+        extra = (scrollTop > dwh) ? dwh - scrollTop : 0;
+
+      for (var i = 0, l = sticked.length; i < l; i++) {
+        var s = sticked[i],
+          elementTop = s.stickyWrapper.offset().top,
+          etse = elementTop - s.topSpacing - extra;
+
+        //update height in case of dynamic content
+        s.stickyWrapper.css('height', s.stickyElement.outerHeight());
+
+        if (scrollTop <= etse) {
+          if (s.currentTop !== null) {
+            s.stickyElement
+              .css({
+                'width': '',
+                'position': '',
+                'top': '',
+                'z-index': ''
+              });
+            s.stickyElement.parent().removeClass(s.className);
+            s.stickyElement.trigger('sticky-end', [s]);
+            s.currentTop = null;
+          }
+        }
+        else {
+          var newTop = documentHeight - s.stickyElement.outerHeight()
+            - s.topSpacing - s.bottomSpacing - scrollTop - extra;
+          if (newTop < 0) {
+            newTop = newTop + s.topSpacing;
+          } else {
+            newTop = s.topSpacing;
+          }
+          if (s.currentTop !== newTop) {
+            var newWidth;
+            if (s.getWidthFrom) {
+                padding =  s.stickyElement.innerWidth() - s.stickyElement.width();
+                newWidth = $(s.getWidthFrom).width() - padding || null;
+            } else if (s.widthFromWrapper) {
+                newWidth = s.stickyWrapper.width();
+            }
+            if (newWidth == null) {
+                newWidth = s.stickyElement.width();
+            }
+            s.stickyElement
+              .css('width', newWidth)
+              .css('position', 'fixed')
+              .css('top', newTop)
+              .css('z-index', s.zIndex);
+
+            s.stickyElement.parent().addClass(s.className);
+
+            if (s.currentTop === null) {
+              s.stickyElement.trigger('sticky-start', [s]);
+            } else {
+              // sticky is started but it have to be repositioned
+              s.stickyElement.trigger('sticky-update', [s]);
+            }
+
+            if (s.currentTop === s.topSpacing && s.currentTop > newTop || s.currentTop === null && newTop < s.topSpacing) {
+              // just reached bottom || just started to stick but bottom is already reached
+              s.stickyElement.trigger('sticky-bottom-reached', [s]);
+            } else if(s.currentTop !== null && newTop === s.topSpacing && s.currentTop < newTop) {
+              // sticky is started && sticked at topSpacing && overflowing from top just finished
+              s.stickyElement.trigger('sticky-bottom-unreached', [s]);
+            }
+
+            s.currentTop = newTop;
+          }
+
+          // Check if sticky has reached end of container and stop sticking
+          var stickyWrapperContainer = s.stickyWrapper.parent();
+          var unstick = (s.stickyElement.offset().top + s.stickyElement.outerHeight() >= stickyWrapperContainer.offset().top + stickyWrapperContainer.outerHeight()) && (s.stickyElement.offset().top <= s.topSpacing);
+
+          if( unstick ) {
+            s.stickyElement
+              .css('position', 'absolute')
+              .css('top', '')
+              .css('bottom', 0)
+              .css('z-index', '');
+          } else {
+            s.stickyElement
+              .css('position', 'fixed')
+              .css('top', newTop)
+              .css('bottom', '')
+              .css('z-index', s.zIndex);
+          }
+        }
+      }
+    },
+    resizer = function() {
+      windowHeight = $window.height();
+
+      for (var i = 0, l = sticked.length; i < l; i++) {
+        var s = sticked[i];
+        var newWidth = null;
+        if (s.getWidthFrom) {
+            if (s.responsiveWidth) {
+                newWidth = $(s.getWidthFrom).width();
+            }
+        } else if(s.widthFromWrapper) {
+            newWidth = s.stickyWrapper.width();
+        }
+        if (newWidth != null) {
+            s.stickyElement.css('width', newWidth);
+        }
+      }
+    },
+    methods = {
+      init: function(options) {
+        return this.each(function() {
+          var o = $.extend({}, defaults, options);
+          var stickyElement = $(this);
+
+          var stickyId = stickyElement.attr('id');
+          var wrapperId = stickyId ? stickyId + '-' + defaults.wrapperClassName : defaults.wrapperClassName;
+          var wrapper = $('<div></div>')
+            .attr('id', wrapperId)
+            .addClass(o.wrapperClassName);
+
+          stickyElement.wrapAll(function() {
+            if ($(this).parent("#" + wrapperId).length == 0) {
+                    return wrapper;
+            }
+});
+
+          var stickyWrapper = stickyElement.parent();
+
+          if (o.center) {
+            stickyWrapper.css({width:stickyElement.outerWidth(),marginLeft:"auto",marginRight:"auto"});
+          }
+
+          if (stickyElement.css("float") === "right") {
+            stickyElement.css({"float":"none"}).parent().css({"float":"right"});
+          }
+
+          o.stickyElement = stickyElement;
+          o.stickyWrapper = stickyWrapper;
+          o.currentTop    = null;
+
+          sticked.push(o);
+
+          methods.setWrapperHeight(this);
+          methods.setupChangeListeners(this);
+        });
+      },
+
+      setWrapperHeight: function(stickyElement) {
+        var element = $(stickyElement);
+        var stickyWrapper = element.parent();
+        if (stickyWrapper) {
+          stickyWrapper.css('height', element.outerHeight());
+        }
+      },
+
+      setupChangeListeners: function(stickyElement) {
+        if (window.MutationObserver) {
+          var mutationObserver = new window.MutationObserver(function(mutations) {
+            if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) {
+              methods.setWrapperHeight(stickyElement);
+            }
+          });
+          mutationObserver.observe(stickyElement, {subtree: true, childList: true});
+        } else {
+          if (window.addEventListener) {
+            stickyElement.addEventListener('DOMNodeInserted', function() {
+              methods.setWrapperHeight(stickyElement);
+            }, false);
+            stickyElement.addEventListener('DOMNodeRemoved', function() {
+              methods.setWrapperHeight(stickyElement);
+            }, false);
+          } else if (window.attachEvent) {
+            stickyElement.attachEvent('onDOMNodeInserted', function() {
+              methods.setWrapperHeight(stickyElement);
+            });
+            stickyElement.attachEvent('onDOMNodeRemoved', function() {
+              methods.setWrapperHeight(stickyElement);
+            });
+          }
+        }
+      },
+      update: scroller,
+      unstick: function(options) {
+        return this.each(function() {
+          var that = this;
+          var unstickyElement = $(that);
+
+          var removeIdx = -1;
+          var i = sticked.length;
+          while (i-- > 0) {
+            if (sticked[i].stickyElement.get(0) === that) {
+                splice.call(sticked,i,1);
+                removeIdx = i;
+            }
+          }
+          if(removeIdx !== -1) {
+            unstickyElement.unwrap();
+            unstickyElement
+              .css({
+                'width': '',
+                'position': '',
+                'top': '',
+                'float': '',
+                'z-index': ''
+              })
+            ;
+          }
+        });
+      }
+    };
+
+  // should be more efficient than using $window.scroll(scroller) and $window.resize(resizer):
+  if (window.addEventListener) {
+    window.addEventListener('scroll', scroller, false);
+    window.addEventListener('resize', resizer, false);
+  } else if (window.attachEvent) {
+    window.attachEvent('onscroll', scroller);
+    window.attachEvent('onresize', resizer);
+  }
+
+  $.fn.sticky = function(method) {
+    if (methods[method]) {
+      return methods[method].apply(this, slice.call(arguments, 1));
+    } else if (typeof method === 'object' || !method ) {
+      return methods.init.apply( this, arguments );
+    } else {
+      $.error('Method ' + method + ' does not exist on jQuery.sticky');
+    }
+  };
+
+  $.fn.unstick = function(method) {
+    if (methods[method]) {
+      return methods[method].apply(this, slice.call(arguments, 1));
+    } else if (typeof method === 'object' || !method ) {
+      return methods.unstick.apply( this, arguments );
+    } else {
+      $.error('Method ' + method + ' does not exist on jQuery.sticky');
+    }
+  };
+  $(function() {
+    setTimeout(scroller, 0);
+  });
+}));

+ 372 - 0
lib/pinyinjs/pinyinUtil.js

@@ -0,0 +1,372 @@
+
+/**
+ * 汉字与拼音互转工具,根据导入的字典文件的不同支持不同
+ * 对于多音字目前只是将所有可能的组合输出,准确识别多音字需要完善的词库,而词库文件往往比字库还要大,所以不太适合web环境。
+ * @start 2016-09-26
+ * @last 2016-09-29
+ */
+;(function(global, factory) {
+	if (typeof module === "object" && typeof module.exports === "object") {
+		module.exports = factory(global);
+	} else {
+		factory(global);
+	}
+})(typeof window !== "undefined" ? window : this, function(window) {
+
+	var toneMap = 
+	{
+		"ā": "a1",
+		"á": "a2",
+		"ǎ": "a3",
+		"à": "a4",
+		"ō": "o1",
+		"ó": "o2",
+		"ǒ": "o3",
+		"ò": "o4",
+		"ē": "e1",
+		"é": "e2",
+		"ě": "e3",
+		"è": "e4",
+		"ī": "i1",
+		"í": "i2",
+		"ǐ": "i3",
+		"ì": "i4",
+		"ū": "u1",
+		"ú": "u2",
+		"ǔ": "u3",
+		"ù": "u4",
+		"ü": "v0",
+		"ǖ": "v1",
+		"ǘ": "v2",
+		"ǚ": "v3",
+		"ǜ": "v4",
+		"ń": "n2",
+		"ň": "n3",
+		"": "m2"
+	};
+
+	var dict = {}; // 存储所有字典数据
+	var pinyinUtil =
+	{
+		/**
+		 * 解析各种字典文件,所需的字典文件必须在本JS之前导入
+		 */
+		parseDict: function()
+		{
+			// 如果导入了 pinyin_dict_firstletter.js
+			if(window.pinyin_dict_firstletter)
+			{
+				dict.firstletter = pinyin_dict_firstletter;
+			}
+			// 如果导入了 pinyin_dict_notone.js
+			if(window.pinyin_dict_notone)
+			{
+				dict.notone = {};
+				dict.py2hz = pinyin_dict_notone; // 拼音转汉字
+				for(var i in pinyin_dict_notone)
+				{
+					var temp = pinyin_dict_notone[i];
+					for(var j=0, len=temp.length; j<len; j++)
+					{
+						if(!dict.notone[temp[j]]) dict.notone[temp[j]] = i; // 不考虑多音字
+					}
+				}
+			}
+			// 如果导入了 pinyin_dict_withtone.js
+			if(window.pinyin_dict_withtone)
+			{
+				dict.withtone = {}; // 汉字与拼音映射,多音字用空格分开,类似这种结构:{'大': 'da tai'}
+				var temp = pinyin_dict_withtone.split(',');
+				for(var i=0, len = temp.length; i<len; i++)
+				{
+					// 这段代码耗时28毫秒左右,对性能影响不大,所以一次性处理完毕
+					dict.withtone[String.fromCharCode(i + 19968)] = temp[i]; // 这里先不进行split(' '),因为一次性循环2万次split比较消耗性能
+				}
+
+				// 拼音 -> 汉字
+				if(window.pinyin_dict_notone)
+				{
+					// 对于拼音转汉字,我们优先使用pinyin_dict_notone字典文件
+					// 因为这个字典文件不包含生僻字,且已按照汉字使用频率排序
+					dict.py2hz = pinyin_dict_notone; // 拼音转汉字
+				}
+				else
+				{
+					// 将字典文件解析成拼音->汉字的结构
+					// 与先分割后逐个去掉声调相比,先一次性全部去掉声调然后再分割速度至少快了3倍,前者大约需要120毫秒,后者大约只需要30毫秒(Chrome下)
+					var notone = pinyinUtil.removeTone(pinyin_dict_withtone).split(',');
+					var py2hz = {}, py, hz;
+					for(var i=0, len = notone.length; i<len; i++)
+					{
+						hz = String.fromCharCode(i + 19968); // 汉字
+						py = notone[i].split(' '); // 去掉了声调的拼音数组
+						for(var j=0; j<py.length; j++)
+						{
+							py2hz[py[j]] = (py2hz[py[j]] || '') + hz;
+						}
+					}
+					dict.py2hz = py2hz;
+				}
+			}
+		},
+		/**
+		 * 根据汉字获取拼音,如果不是汉字直接返回原字符
+		 * @param chinese 要转换的汉字
+		 * @param splitter 分隔字符,默认用空格分隔
+		 * @param withtone 返回结果是否包含声调,默认是
+		 * @param polyphone 是否支持多音字,默认否
+		 */
+		getPinyin: function(chinese, splitter, withtone, polyphone)
+		{
+			if(!chinese || /^ +$/g.test(chinese)) return '';
+			splitter = splitter == undefined ? ' ' : splitter;
+			withtone = withtone == undefined ? true : withtone;
+			polyphone = polyphone == undefined ? false : polyphone;
+			var result = [];
+			if(dict.withtone) // 优先使用带声调的字典文件
+			{
+				var noChinese = '';
+				for (var i=0, len = chinese.length; i < len; i++)
+				{
+					var pinyin = dict.withtone[chinese[i]];
+					if(pinyin)
+					{
+						// 如果不需要多音字,默认返回第一个拼音,后面的直接忽略
+						// 所以这对数据字典有一定要求,常见字的拼音必须放在最前面
+						if(!polyphone) pinyin = pinyin.replace(/ .*$/g, '');
+						if(!withtone) pinyin = this.removeTone(pinyin); // 如果不需要声调
+						//空格,把noChinese作为一个词插入
+						noChinese && ( result.push( noChinese), noChinese = '' );
+						result.push( pinyin ); 
+					}
+					else if ( !chinese[i] || /^ +$/g.test(chinese[i]) ){
+						//空格,把noChinese作为一个词插入
+						noChinese && ( result.push( noChinese), noChinese = '' );
+					}
+					else{
+						noChinese += chinese[i];
+					}
+				}
+				if ( noChinese ){
+					result.push( noChinese);
+					noChinese = '';
+				}
+			}
+			else if(dict.notone) // 使用没有声调的字典文件
+			{
+				if(withtone) console.warn('pinyin_dict_notone 字典文件不支持声调!');
+				if(polyphone) console.warn('pinyin_dict_notone 字典文件不支持多音字!');
+				var noChinese = '';
+				for (var i=0, len = chinese.length; i < len; i++)
+				{
+					var temp = chinese.charAt(i),
+						pinyin = dict.notone[temp];
+					if ( pinyin ){ //插入拼音
+						//空格,把noChinese作为一个词插入
+						noChinese && ( result.push( noChinese), noChinese = '' );
+						result.push( pinyin );
+					}
+					else if ( !temp || /^ +$/g.test(temp) ){
+						//空格,插入之前的非中文字符
+						noChinese && ( result.push( noChinese), noChinese = '' );
+					}
+					else {
+						//非空格,关联到noChinese中
+						noChinese += temp;
+					}
+				}
+
+				if ( noChinese ){
+					result.push( noChinese );
+					noChinese = '';
+				}
+			}
+			else
+			{
+				throw '抱歉,未找到合适的拼音字典文件!';
+			}
+			if(!polyphone) return result.join(splitter);
+			else
+			{
+				if(window.pinyin_dict_polyphone) return parsePolyphone(chinese, result, splitter, withtone);
+				else return handlePolyphone(result, ' ', splitter);
+			}
+		},
+		/**
+		 * 获取汉字的拼音首字母
+		 * @param str 汉字字符串,如果遇到非汉字则原样返回
+		 * @param polyphone 是否支持多音字,默认false,如果为true,会返回所有可能的组合数组
+		 */
+		getFirstLetter: function(str, polyphone)
+		{
+			polyphone = polyphone == undefined ? false : polyphone;
+			if(!str || /^ +$/g.test(str)) return '';
+			if(dict.firstletter) // 使用首字母字典文件
+			{
+				var result = [];
+				for(var i=0; i<str.length; i++)
+				{
+					var unicode = str.charCodeAt(i);
+					var ch = str.charAt(i);
+					if(unicode >= 19968 && unicode <= 40869)
+					{
+						ch = dict.firstletter.all.charAt(unicode-19968);
+						if(polyphone) ch = dict.firstletter.polyphone[unicode] || ch;
+					}
+					result.push(ch);
+				}
+				if(!polyphone) return result.join(''); // 如果不用管多音字,直接将数组拼接成字符串
+				else return handlePolyphone(result, '', ''); // 处理多音字,此时的result类似于:['D', 'ZC', 'F']
+			}
+			else
+			{
+				var py = this.getPinyin(str, ' ', false, polyphone);
+				py = py instanceof Array ? py : [py];
+				var result = [];
+				for(var i=0; i<py.length; i++)
+				{
+					result.push(py[i].replace(/(^| )(\w)\w*/g, function(m,$1,$2){return $2.toUpperCase();}));
+				}
+				if(!polyphone) return result[0];
+				else return simpleUnique(result);
+			}
+		},
+		/**
+		 * 拼音转汉字,只支持单个汉字,返回所有匹配的汉字组合
+		 * @param pinyin 单个汉字的拼音,可以包含声调
+		 */
+		getHanzi: function(pinyin)
+		{
+			if(!dict.py2hz)
+			{
+				throw '抱歉,未找到合适的拼音字典文件!';
+			}
+			return dict.py2hz[this.removeTone(pinyin)] || '';
+		},
+		/**
+		 * 获取某个汉字的同音字,本方法暂时有问题,待完善
+		 * @param hz 单个汉字
+		 * @param sameTone 是否获取同音同声调的汉字,必须传进来的拼音带声调才支持,默认false
+		 */
+		getSameVoiceWord: function(hz, sameTone)
+		{
+			sameTone = sameTone || false
+			return this.getHanzi(this.getPinyin(hz, ' ', false))
+		},
+		/**
+		 * 去除拼音中的声调,比如将 xiǎo míng tóng xué 转换成 xiao ming tong xue
+		 * @param pinyin 需要转换的拼音
+		 */
+		removeTone: function(pinyin)
+		{
+			return pinyin.replace(/[āáǎàōóǒòēéěèīíǐìūúǔùüǖǘǚǜńň]/g, function(m){ return toneMap[m][0]; });
+		},
+		/**
+		 * 将数组拼音转换成真正的带标点的拼音
+		 * @param pinyinWithoutTone 类似 xu2e这样的带数字的拼音
+		 */
+		getTone: function(pinyinWithoutTone)
+		{
+			var newToneMap = {};
+			for(var i in toneMap) newToneMap[toneMap[i]] = i;
+			return (pinyinWithoutTone || '').replace(/[a-z]\d/g, function(m) {
+				return newToneMap[m] || m;
+			});
+		}
+	};
+
+
+	/**
+	 * 处理多音字,将类似['D', 'ZC', 'F']转换成['DZF', 'DCF']
+	 * 或者将 ['chang zhang', 'cheng'] 转换成 ['chang cheng', 'zhang cheng']
+	 */
+	function handlePolyphone(array, splitter, joinChar)
+	{
+		splitter = splitter || '';
+		var result = [''], temp = [];
+		for(var i=0; i<array.length; i++)
+		{
+			temp = [];
+			var t = array[i].split(splitter);
+			for(var j=0; j<t.length; j++)
+			{
+				for(var k=0; k<result.length; k++)
+					temp.push(result[k] + (result[k]?joinChar:'') + t[j]);
+			}
+			result = temp;
+		}
+		return simpleUnique(result);
+	}
+
+	/**
+	 * 根据词库找出多音字正确的读音
+	 * 这里只是非常简单的实现,效率和效果都有一些问题
+	 * 推荐使用第三方分词工具先对句子进行分词,然后再匹配多音字
+	 * @param chinese 需要转换的汉字
+	 * @param result 初步匹配出来的包含多个发音的拼音结果
+	 * @param splitter 返回结果拼接字符
+	 */
+	function parsePolyphone(chinese, result, splitter, withtone)
+	{
+		var poly = window.pinyin_dict_polyphone;
+		var max = 7; // 最多只考虑7个汉字的多音字词,虽然词库里面有10个字的,但是数量非常少,为了整体效率暂时忽略之
+		var temp = poly[chinese];
+		if(temp) // 如果直接找到了结果
+		{
+			temp = temp.split(' ');
+			for(var i=0; i<temp.length; i++)
+			{
+				result[i] = temp[i] || result[i];
+				if(!withtone) result[i] = pinyinUtil.removeTone(result[i]);
+			}
+			return result.join(splitter);
+		}
+		for(var i=0; i<chinese.length; i++)
+		{
+			temp = '';
+			for(var j=0; j<max && (i+j)<chinese.length; j++)
+			{
+				if(!/^[\u2E80-\u9FFF]+$/.test(chinese[i+j])) break; // 如果碰到非汉字直接停止本次查找
+				temp += chinese[i+j];
+				var res = poly[temp];
+				if(res) // 如果找到了多音字词语
+				{
+					res = res.split(' ');
+					for(var k=0; k<=j; k++)
+					{
+						if(res[k]) result[i+k] = withtone ? res[k] : pinyinUtil.removeTone(res[k]);
+					}
+					break;
+				}
+			}
+		}
+		// 最后这一步是为了防止出现词库里面也没有包含的多音字词语
+		for(var i=0; i<result.length; i++)
+		{
+			result[i] = result[i].replace(/ .*$/g, '');
+		}
+		return result.join(splitter);
+	}
+
+	// 简单数组去重
+	function simpleUnique(array)
+	{
+		var result = [];
+		var hash = {};
+		for(var i=0; i<array.length; i++)
+		{
+			var key = (typeof array[i]) + array[i];
+			if(!hash[key])
+			{
+				result.push(array[i]);
+				hash[key] = true;
+			}
+		}
+		return result;
+	}
+
+	pinyinUtil.parseDict();
+	pinyinUtil.dict = dict;
+	window.pinyinUtil = pinyinUtil;
+
+});

File diff suppressed because it is too large
+ 8 - 0
lib/pinyinjs/pinyin_dict_firstletter.js


+ 2 - 0
modules/all_models/compilation.js

@@ -51,6 +51,8 @@ let modelSchema = {
     description: String,
     //例题
     example: [],
+    //导入欢迎页项目
+    adProjects:[],
     //代码覆盖路径
     overWriteUrl:String,
     // 创建时间

+ 2 - 1
modules/all_models/project_glj.js

@@ -130,7 +130,8 @@ let modelSchema = {
     originPlace:String,//产地
     vender:String, //厂家
     qualityGrace:String,//质量等级
-    brand:String//品牌
+    brand:String,//品牌
+    subList:[Schema.Types.Mixed]
 };
 mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false}));
 

+ 2 - 1
modules/all_models/user.js

@@ -104,7 +104,8 @@ let schema = {
     isLoginValid: {
         type: Number,
         default: 0
-    }
+    },
+    welcomeShowTime:String
 
 };
 mongoose.model(collectionName, new Schema(schema, {versionKey: false}));

+ 19 - 0
modules/all_models/welcome_setting.js

@@ -0,0 +1,19 @@
+/**
+ * Created by zhang on 2020/2/14.
+ */
+
+let mongoose = require("mongoose");
+
+let Schema = mongoose.Schema;
+let collectionName = 'welcome_setting';
+let modelSchema = {
+    // ID
+    ID: {
+        type: String,
+        index: true
+    },
+    compilationId: String,
+    showType:{type:Number,default:0},// 1 每天一次 2 每次登录显示,0 关闭
+    context:String
+};
+mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));

+ 4 - 0
modules/import/controllers/import_controller.js

@@ -13,6 +13,10 @@ let controller = {
         let data = req.body;
         return await pm_facade.downLoadProjectFile(data);
     },
+    importChongqingProject:async function(req){
+        let data = req.body;
+        return await pm_facade.importChongqingProject(data);
+    },
     exportProject:async function(req){
         let result={
             error:0

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

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

+ 4 - 4
modules/main/controllers/ration_controller.js

@@ -29,9 +29,9 @@ let controller = {
         data = JSON.parse(data);
         let result = await ration_facade.addNewRation(data,req.session.sessionCompilation);
         //合并取项目工料机数据的情求,用于刷新项目工料机数据,当有添加、替换项目工料机的情况,才需要刷新
-        if(result.ration_gljs && result.ration_gljs.length > 0 && data.newData){
+       /* if(result.ration_gljs && result.ration_gljs.length > 0 && data.newData){
             result.projectGLJDatas =  await getProjectGLJData(data.newData.projectID);
-        }
+        }*/
         return result;
     },
     addMultiRation: async function (req) {
@@ -87,9 +87,9 @@ let controller = {
         data = JSON.parse(data);
         let result = await ration_facade.updateCoeAdjust(data,req.session.sessionCompilation);
         //合并取项目工料机数据的情求,用于刷新项目工料机数据,当有添加、替换项目工料机的情况,才需要刷新
-        if(result.add.length > 0 || result.replace.length > 0){
+     /*   if(result.add.length > 0 || result.replace.length > 0){
             result.projectGLJDatas =  await getProjectGLJData(data.projectID);
-        }
+        }*/
         return result;
     }
 };

+ 11 - 6
modules/main/facade/bill_facade.js

@@ -80,10 +80,11 @@ module.exports={
         let [rationsAndRationGLJ,resultMap] = await Promise.all(pasteTasks);
 
         let gljController = new GLJController();
-        let projectGLJ = await gljController.getProjectGLJsByProjectID(data.projectID);
+       // let projectGLJ = await gljController.getProjectGLJsByProjectID(data.projectID);
         resultMap.rations = rationsAndRationGLJ.rations;
         resultMap.ration_gljs = rationsAndRationGLJ.new_ration_gljs;
-        resultMap.gljData = projectGLJ.data;
+        resultMap.projectGLJList = rationsAndRationGLJ.projectGLJList;
+       // resultMap.gljData = projectGLJ.data;
         return resultMap;
     },
     createNewBills:async function(newDatas){
@@ -150,7 +151,7 @@ async function pasteOtherData(data) {
 
 async function pasteRationsAndRationGLJ (rations,ration_gljs,compilation) {
     let projectGljModel = new GLJListModel();
-    let gljMap = {}, new_ration_gljs=[],projectID=null;
+    let gljMap = {}, new_ration_gljs=[],projectID=null,projectGLJList =[];
     if(rations.length > 0) projectID = rations[0].projectID;
     if(projectID==null && ration_gljs.length > 0) projectID = ration_gljs[0].projectID;
     if(projectID == null) return {rations:rations,new_ration_gljs:new_ration_gljs};
@@ -158,22 +159,24 @@ async function pasteRationsAndRationGLJ (rations,ration_gljs,compilation) {
     //先根据定额类型的工料机,插入到项目工料机中
     for(let r of rations){
         if(r.type == rationType.gljRation){
-            await getProjectGLJ(r,rationKeyArray,gljMap,unitFileId,ext);
+            let projectGLJ  = await getProjectGLJ(r,rationKeyArray,gljMap,unitFileId,ext);
+            projectGLJList.push(projectGLJ);
         }
     }
 
     for(let rg of ration_gljs){
-        await getProjectGLJ(rg,gljKeyArray,gljMap,unitFileId,ext);
+        let projectGLJ =  await getProjectGLJ(rg,gljKeyArray,gljMap,unitFileId,ext);
         let temRecord = ration_glj_facade.createNewRecord(rg);
         rg.rcode?temRecord.rcode = rg.rcode:'';
         rg.hasOwnProperty("customQuantity")?temRecord.customQuantity = rg.customQuantity:'';
         new_ration_gljs.push(temRecord);
+        projectGLJList.push(projectGLJ);
     }
 
     rations.length>0?await insertMany(rations,ration_Model):'';
     new_ration_gljs.length>0?await insertMany(new_ration_gljs,ration_glj_Model):'';
 
-    return {rations:rations,new_ration_gljs:new_ration_gljs};
+    return {rations:rations,new_ration_gljs:new_ration_gljs,projectGLJList:projectGLJList};
 
     async function getProjectGLJ (glj,keyArray,gljMap,unitFileId,ext) {
         let keyIndex = projectGljModel.getIndex(glj,keyArray);
@@ -186,6 +189,7 @@ async function pasteRationsAndRationGLJ (rations,ration_gljs,compilation) {
             gljMap[keyIndex] = pgljResult;
         }
         setResult(glj,pgljResult);
+        return pgljResult
     }
 
 
@@ -264,6 +268,7 @@ function generateBillTasks(data) {
 
 async function insertMany(datas,model) {
     let tem = [];
+    console.log(datas);
     while (datas.length>1000){//因为mongoose限制了批量插入的条数为1000.所以超出限制后需要分批插入
         let newList = datas.splice(0,1000);//一次插入1000条
         await model.insertMany(newList);

+ 74 - 64
modules/main/facade/project_facade.js

@@ -47,6 +47,7 @@ const billsLibDao = require("../../bills_lib/models/bills_lib_interfaces");
 
 async function calcInstallationFee(data) {
     let result={};
+    let projectGLJList = [];
     let billTasks  = generateTasks(data.bills,data.useID);
     let rationTasks = generateTasks(data.ration,data.useID);
     if(billTasks.length>0){
@@ -93,6 +94,7 @@ async function calcInstallationFee(data) {
             for(let tkey in nr.glj){
                 let [newRecode,projectGLJ] = await createRationGLJData(nr.glj[tkey])
                 newGljList.push(newRecode);
+                projectGLJList.push(projectGLJ);
             }
         }
     }
@@ -101,6 +103,7 @@ async function calcInstallationFee(data) {
     }
     result.update = updateList;
     result.add = newGljList;
+    result.projectGLJList = projectGLJList;
     return result;
 }
 
@@ -270,79 +273,83 @@ async function calcOverHeightFee(data) {
 
 async function updateNodes(datas){
     let nodeGroups = _.groupBy(datas,'type');
-    let rationTasks = [];
-    let billTasks = [];
-    let rationGLJTasks = [];
-    let projectGLJTasks = [];
-    let projectTasks = [];
-    let rationTemplateTasks = [];
     let asyncTasks = [];
+    let deleteRationIDs=[];
+    let taskMap = {};
+    taskMap[projectConsts.BILLS] = {tasks:[],model:bill_model.model};
+    taskMap[projectConsts.RATION] = {tasks:[],model:ration_model.model};
+    taskMap[projectConsts.RATION_GLJ] = {tasks:[],model:ration_glj_model};
+    taskMap[projectConsts.PROJECTGLJ] = {tasks:[],model:project_glj_model};
+    taskMap[projectConsts.PROJECT] = {tasks:[],model:projectsModel};
+    taskMap[projectConsts.RATION_TEMPLATE] = {tasks:[],model:rationTemplateModel};
+
     for(let type in nodeGroups){
         for(let node of nodeGroups[type]){
-            if(type == projectConsts.BILLS){
-                billTasks.push(getTask(node));
-            }else if(type == projectConsts.RATION){
-                //处理面积增加费的数据
-                if(node.data.hasOwnProperty("areaIncreaseFee")){
-                    let areaSetting = null;
-                    if(nodeGroups[projectConsts.PROJECT]){
-                        for(let pn of nodeGroups[projectConsts.PROJECT]){
-                            if(pn.data['property.areaSetting']) areaSetting = pn.data['property.areaSetting'];
+            if(taskMap[type]){
+                if(type == projectConsts.RATION){
+                    //处理面积增加费的数据
+                    if(node.data.hasOwnProperty("areaIncreaseFee")){
+                        let areaSetting = null;
+                        if(nodeGroups[projectConsts.PROJECT]){
+                            for(let pn of nodeGroups[projectConsts.PROJECT]){
+                                if(pn.data['property.areaSetting']) areaSetting = pn.data['property.areaSetting'];
+                            }
+                        }
+                        let t = await glj_calculate_facade.calculateQuantity({rationID:node.data.ID},null,false,node.data.areaIncreaseFee,areaSetting);
+                        if(t.glj_result && t.glj_result.length > 0){//这里要更新工料机的消耗量,修改数据库的操作已经在上一步中完成了,现在只需刷新前端即可
+                           for(let gr of t.glj_result){
+                               let tdata = gr.doc;
+                               tdata.ID = gr.query.ID;
+                               datas.push({type:projectConsts.RATION_GLJ,data:tdata});
+                           }
                         }
+                        node.data.adjustState = t.adjustState;
                     }
-                    let t = await glj_calculate_facade.calculateQuantity({rationID:node.data.ID},true,false,node.data.areaIncreaseFee,areaSetting);
-                    node.data.adjustState = t.adjustState;
+                    if(node.action == "delete") deleteRationIDs.push(node.data.ID);
                 }
-                rationTasks.push(getTask(node));
-            }else if(type == projectConsts.RATION_GLJ){
-                rationGLJTasks.push(getTask(node));
-            }else if(type == projectConsts.PROJECTGLJ){
-                projectGLJTasks.push(getTask(node,'id'));
-            }else if(type == projectConsts.PROJECT){
-                projectTasks.push(getTask(node));
-            }else if(type == projectConsts.RATION_TEMPLATE){
-                rationTemplateTasks.push(getTask(node))
+                if(type == projectConsts.RATION_GLJ){
+                    if(node.action == "add"){//添加定額工料机的時候,要先走项目工料机的逻辑
+                        let [newRecode,projectGLJ] = await createRationGLJData(node.data);
+                        node.data =newRecode;
+                        node.projectGLJ = projectGLJ;
+                    }
+                }
+                taskMap[type].tasks.push(getTask(node));
             }
-
         }
     }
-    //test------------------------
-    if (billTasks.length) {
-        console.log(`billTasks===============================`);
-        billTasks.forEach(task => {
-            if (task.updateOne.update.name === '分部分项工程') {
-                console.log(`task.updateOne.filter`);
-                console.log(task.updateOne.filter);
-                console.log(`task.updateOne.update`);
-                console.log(task.updateOne.update);
-            }
-            /*console.log(`task.updateOne.filter`);
-            console.log(task.updateOne.filter);
-            console.log(`task.updateOne.update`);
-            console.log(task.updateOne.update);*/
-        });
+
+    for(let key in taskMap){
+        if(taskMap[key].tasks.length> 0) asyncTasks.push(taskMap[key].model.bulkWrite(taskMap[key].tasks))
     }
-    //test------------------------
-    rationTasks.length>0?asyncTasks.push(ration_model.model.bulkWrite(rationTasks)):'';
-    billTasks.length>0?asyncTasks.push(bill_model.model.bulkWrite(billTasks)):"";
-    rationGLJTasks.length>0?asyncTasks.push(ration_glj_model.bulkWrite(rationGLJTasks)):"";
-    projectGLJTasks.length>0?asyncTasks.push(project_glj_model.bulkWrite(projectGLJTasks)):"";
-    projectTasks.length>0?asyncTasks.push(projectsModel.bulkWrite(projectTasks)):"";
-    rationTemplateTasks.length>0?asyncTasks.push(rationTemplateModel.bulkWrite(rationTemplateTasks)):"";
-    asyncTasks.length>0?await Promise.all(asyncTasks):"";
+
+    if(asyncTasks.length>0) await Promise.all(asyncTasks);
+    if(deleteRationIDs.length > 0) await ration_glj_model.deleteMany({rationID: {$in: deleteRationIDs}});
+
+
     return datas;
 
 
     function getTask(node,idFiled = 'ID') {
-
-        let task={
-            updateOne:{
+        let task={};
+        if(node.action == "add"){
+            task.insertOne ={
+                document:node.data
+            }
+        }else if(node.action =="delete"){
+            task.deleteOne ={
+                filter:{}
+            };
+            task.deleteOne.filter[idFiled] = node.data[idFiled];
+        }else {
+            task.updateOne = {
                 filter:{},
                 update :_.cloneDeep(node.data)
-            }
-        };
-        task.updateOne.filter[idFiled] = node.data[idFiled];//现在复制项目也重新生成一个新的ID了,所以ID是唯一的
-        delete task.updateOne.update[idFiled];//防止误操作
+            };
+            task.updateOne.filter[idFiled] = node.data[idFiled];//现在复制项目也重新生成一个新的ID了,所以ID是唯一的
+            delete task.updateOne.update[idFiled];//防止误操作
+        }
+
         return task;
     }
 }
@@ -557,12 +564,15 @@ async function setSEILibData(property){
 }
 
 function setDefaultItemIncrease(property) {
-    property.itemIncreaseSetting = [
-        {"name":"在生产车间边生产边施工","base":"人工费","coe":10,"scope":{}},
-        {"name":"在有害身体健康的场所内施工","base":"人工费","coe":10,"scope":{}},
-        {"name":"在洞内、地下室内、库内或暗室内进行施工","base":"人工费","coe":40,"scope":{}},
-        {"name":"在洞内、地下室内、库内或暗室内进行施工(模板拆除)","base":"人工费","coe":10,"scope":{}}
-    ]
+    property.itemIncreaseSetting = {
+        isCalc : false,
+        setting:[
+            {"name":"在生产车间边生产边施工","base":"人工费","coe":10,"scope":{}},
+            {"name":"在有害身体健康的场所内施工","base":"人工费","coe":10,"scope":{}},
+            {"name":"在洞内、地下室内、库内或暗室内进行施工","base":"人工费","coe":40,"scope":{}},
+            {"name":"在洞内、地下室内、库内或暗室内进行施工(模板拆除)","base":"人工费","coe":10,"scope":{}}
+        ]
+    }
 }
 
 async function getIndexReportData(projectID,keyArr) {
@@ -655,7 +665,7 @@ async function getMainMaterialDatas(projectID,property) {
     let [gljList, mixRatioConnectData,mixRatioMap,unitPriceMap] = await gljListModel.getListByProjectId(projectID, property.unitPriceFile?property.unitPriceFile.id:null);
     gljList = JSON.parse(JSON.stringify(gljList));
     await calcProjectGLJQuantity(projectID,{gljList:gljList,mixRatioMap:mixRatioMap},property);
-    return gljUtil.getMainMaterialDatas(property.engineerFeatures,property.materials,{gljList:gljList},property.calcOptions,property.decimal,false,_,scMathUtil)
+    return gljUtil.getMainMaterialDatas(property,property.engineerFeatures,property.materials,{gljList:gljList},property.calcOptions,property.decimal,false,_,scMathUtil)
 
 }
 

+ 14 - 7
modules/main/facade/ration_facade.js

@@ -212,7 +212,7 @@ async function replaceRation(nodeInfo,stdRation,defaultLibID,projectID,calQuanti
 
 async function addRationSubList(stdRation,newRation,needInstall,compilation,cleanzmhs=false) {
     let startTime = +new Date();
-    let ration_gljs = await addRationGLJ(stdRation,newRation,compilation);
+    let [ration_gljs,projectGLJList] = await addRationGLJ(stdRation,newRation,compilation);
     let addRationGLJTime = +new Date();
     console.log("添加定额工料机时间-----"+(addRationGLJTime - startTime));
     let ration_coes = await addRationCoe(stdRation,newRation,compilation);
@@ -232,7 +232,7 @@ async function addRationSubList(stdRation,newRation,needInstall,compilation,clea
         let t = await glj_calculate_facade.calculateQuantity({rationID:newRation.ID},true);
         newRation.adjustState = t.adjustState;
     }
-    return {ration:newRation,ration_gljs:ration_gljs,ration_coes:ration_coes,ration_installations:ration_installations,ration_templates:ration_template?[ration_template]:[]};
+    return {ration:newRation,ration_gljs:ration_gljs,ration_coes:ration_coes,ration_installations:ration_installations,ration_templates:ration_template?[ration_template]:[],projectGLJList:projectGLJList};
 }
 
 async function addRationInstallFee(std,newRation) {
@@ -399,6 +399,7 @@ function getExtendData(property,compilation) {
 async function addRationGLJ(std,newRation,compilation) {
     let newRationGLJList = [];
     let rationGLJShowList = [];
+    let projectGLJList = [];
     let unitPriceFileId = 0;
     let property = await projectDao.getProjectProperty(newRation.projectID);
     if(property){
@@ -468,6 +469,7 @@ async function addRationGLJ(std,newRation,compilation) {
                 newGLJ = ration_glj_facade.createNewRecord(info);
                 newRationGLJList.push(newGLJ);
                 rationGLJShowList.push(info);
+                projectGLJList.push(projectGLJ)
             }
             //let InfoFromProjectGLJ = +new Date();
             //console.log("找到项目工料机时间-------------------------------"+(InfoFromProjectGLJ - std_gljTime));
@@ -481,7 +483,7 @@ async function addRationGLJ(std,newRation,compilation) {
     let after = +new Date();
     console.log("实际插入时间为-------------------------------"+(after-before));
     console.log("总操作时间为-------------------------------"+(after-first));
-    return rationGLJShowList;
+    return [rationGLJShowList,projectGLJList]
 }
 
 async function deleRationSubRecode(projectID,rationID,cleanzmhs=false) {//删除挂在定额下的数据,如工程量明细,定额工料机等
@@ -503,16 +505,21 @@ async function deleteSubListByQuery(delete_query,cleanzmhs=false) {
 }
 
 async function updateCoeAdjust(data,compilation) {
-    let replace = [];
+    let replace = [],projectGLJList=[];
     await ration_coe.update({ID:data.ID},data.doc);
     //添加单个工料机的情况
-    if (data.add.length > 0)   await ration_glj_facade.insertAddTypeGLJ(data.add,compilation);
+    if (data.add.length > 0){
+      let [tg,pl] =  await ration_glj_facade.insertAddTypeGLJ(data.add,compilation);
+      if(pl.length > 0) projectGLJList = projectGLJList.concat(pl);
+    }
     if(data.delete.length > 0) await ration_glj_facade.deleteGLJ(data.delete);
 
     //替换工料机的情况
     if (data.replace.length > 0){
         for(let r of data.replace){
-            replace.push(await  ration_glj_facade.replaceGLJByData(r,compilation)) ;
+            let [rg,pg] = await  ration_glj_facade.replaceGLJByData(r,compilation);
+            replace.push(rg) ;
+            projectGLJList.push(pg);
         }
     }
 
@@ -530,7 +537,7 @@ async function updateCoeAdjust(data,compilation) {
         adjustState:cal_result.adjustState,
         name:cal_result.rationName
     };
-    return {coe:coe,ration_glj:ration_glj,ration:ration,add:data.add,delete:data.delete,replace:replace}
+    return {coe:coe,ration_glj:ration_glj,ration:ration,add:data.add,delete:data.delete,replace:replace,projectGLJList:projectGLJList}
 
 }
 

+ 5 - 0
modules/main/routes/main_route.js

@@ -9,6 +9,10 @@ const pmFacade = require('../../pm/facade/pm_facade');
 let config = require("../../../config/config.js");
 import OptionsDao from '../../options/models/optionsModel';
 import optionSetting from '../../options/models/optionTypes';
+const regionMap = {
+    '重庆定额(2018)': '重庆市',
+    '广东定额(2018)': '广东省'
+};
 module.exports =function (app) {
     const baseController = new BaseController();
     app.get('/main', baseController.init, function(req, res) {
@@ -41,6 +45,7 @@ module.exports =function (app) {
                         userID: req.session.sessionUser.id,
                         projectData: projectData,
                         compilationName: req.session.sessionCompilation.name,
+                        region: regionMap[req.session.sessionCompilation.name] || '',
                         versionName: req.session.compilationVersion,
                         projectReadOnly: projectReadOnly,
                         projectCooperate: projectCooperate,

+ 24 - 1
modules/pm/controllers/pm_controller.js

@@ -237,6 +237,8 @@ module.exports = {
             }
             //读取建设项目的项目属性
             let constructionProperty = await ProjectsData.getConstructionProperty(projectID);
+            // 文件类型(招/投标)
+            projInfo.property.fileKind = constructionProperty && constructionProperty.fileKind || 1;
             //基本信息
             projInfo.property.basicInformation = constructionProperty && constructionProperty.basicInformation ? constructionProperty.basicInformation : [];
             //编制说明
@@ -329,8 +331,12 @@ module.exports = {
         rationValuation = await engineeringLibModel.getLib(rationValuation);
         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 [isShow,context] = await pm_facade.getWelcomeInfo(sessionCompilation._id,request.session.sessionUser);
         let renderData = {
             isFirst: isFirst,
+            isShow:isShow,
+            context:context,
             userAccount: request.session.userAccount,
             userID: request.session.sessionUser.id,
             compilationData: JSON.stringify(sessionCompilation),
@@ -809,6 +815,21 @@ module.exports = {
         }
         res.json(result);
     },
+    importChongqingProject:async function(req,res){
+        let data = JSON.parse(req.body.data);
+        let result={
+            error:0
+        };
+        try {
+            data.session = req.session;
+            result = await redirectToImportServer(data,"importChongqingProject",req);
+        }catch (err){
+            console.log(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        res.json(result);
+    },
     importProcessChecking:async function (req,res) {
         let result={
             error:0
@@ -868,7 +889,9 @@ module.exports = {
     getProjectByGranularity: async function(req, res) {
         try {
             let data = JSON.parse(req.body.data);
-            let projData = await pm_facade.getProjectByGranularity(data.tenderID, data.granularity, req.session.sessionUser.id, req.session.compilationVersion);
+            const userID = req.session.sessionUser.id;
+            const version = req.session.compilationVersion;
+            let projData = await pm_facade.getProjectByGranularity(data.tenderID, data.granularity, data.summaryObj, userID, version);
             callback(req, res, 0, 'success', projData);
         } catch (err) {
             callback(req, res, 1, err, null);

+ 102 - 65
modules/pm/facade/pm_facade.js

@@ -42,9 +42,11 @@ module.exports={
     initOverHeightItems: initOverHeightItems,
     uploadToken:uploadToken,
     downLoadProjectFile:downLoadProjectFile,
+    importChongqingProject:importChongqingProject,
     importProcessChecking:importProcessChecking,
     importInterface,
-    isTenderOverrun
+    isTenderOverrun,
+    getWelcomeInfo:getWelcomeInfo
 };
 
 
@@ -92,6 +94,8 @@ let featureLibModel =  mongoose.model("std_project_feature_lib");
 let importLogsModel = mongoose.model("import_logs");
 const overHeightLibModel = mongoose.model('std_over_height_lib');
 const shareListModel = mongoose.model('share_list');
+let welcomeModel = mongoose.model("welcome_setting");
+
 let scMathUtil = require('../../../public/scMathUtil').getUtil();
 let counter = require('../../../public/counter/counter');
 import SectionTreeDao from '../../complementary_ration_lib/models/sectionTreeModel';
@@ -866,14 +870,6 @@ function summarizeToParent(parent, child, fields = null) {
     for (let field of fields) {
         parent[field] = scMathUtil.roundTo(parseFloat(parent[field]) + parseFloat(child[field]), decimal);
     }
-   /* const decimal = -2;
-    parent.engineeringCost = scMathUtil.roundTo(parseFloat(parent.engineeringCost) + parseFloat(child.engineeringCost), decimal);
-    parent.subEngineering = scMathUtil.roundTo(parseFloat(parent.subEngineering) + parseFloat(child.subEngineering), decimal);
-    parent.measure = scMathUtil.roundTo(parseFloat(parent.measure) + parseFloat(child.measure), decimal);
-    parent.safetyConstruction = scMathUtil.roundTo(parseFloat(parent.safetyConstruction) + parseFloat(child.safetyConstruction), decimal);
-    parent.other = scMathUtil.roundTo(parseFloat(parent.other) + parseFloat(child.other), decimal);
-    parent.charge = scMathUtil.roundTo(parseFloat(parent.charge) + parseFloat(child.charge), decimal);
-    parent.tax = scMathUtil.roundTo(parseFloat(parent.tax) + parseFloat(child.tax), decimal);*/
 }
 
 function getBuildingArea(projFeature){
@@ -1025,11 +1021,14 @@ async function getTendersFeeInfo(tenders) {
     return IDMapping;
 }
 
-async function getSummaryInfo(projectIDs, feeFields = null){
-    function initFees(obj, feeFields) {
+async function getSummaryInfo(projectIDs, feeFields = null, engineeringCostFields = null){
+    function initFees(obj, feeFields, engineeringCostFields) {
         for (let data of feeFields) {
             obj[data.v] = 0;
         }
+        for (let data of engineeringCostFields) {
+            obj[data.k] = 0; 
+        }
     }
     if (!feeFields) {
         feeFields = [
@@ -1042,6 +1041,10 @@ async function getSummaryInfo(projectIDs, feeFields = null){
             {k: billsFlags.TAX, v: 'tax'}
         ];
     }
+    // 项目总造价的各个费用,k为汇总的字段,v为工程造价的费用字段
+    if (!engineeringCostFields) {
+        engineeringCostFields = [{ k: 'estimate', v: 'estimate' }];
+    }
     //ID与汇总信息映射
     let IDMapping = {};
     //固定清单类别与汇总金额字段映射
@@ -1049,13 +1052,6 @@ async function getSummaryInfo(projectIDs, feeFields = null){
     for (let data of feeFields) {
         flagFieldMapping[data.k] = data.v;
     }
-    /*flagFieldMapping[billsFlags.ENGINEERINGCOST] = 'engineeringCost';
-    flagFieldMapping[billsFlags.SUB_ENGINERRING] = 'subEngineering';
-    flagFieldMapping[billsFlags.MEASURE] = 'measure';
-    flagFieldMapping[billsFlags.SAFETY_CONSTRUCTION] = 'safetyConstruction';
-    flagFieldMapping[billsFlags.OTHER] = 'other';
-    flagFieldMapping[billsFlags.CHARGE] = 'charge';
-    flagFieldMapping[billsFlags.TAX] = 'tax';*/
     let projects = await projectModel.find({ID: {$in : projectIDs}, projType: projectType.project, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]});
     //设置建设项目的总建筑面积
     for(let project of projects){
@@ -1071,23 +1067,21 @@ async function getSummaryInfo(projectIDs, feeFields = null){
                 }
             }
         }
-        //IDMapping[project.ID] = {engineeringCost: 0, subEngineering: 0, measure: 0, safetyConstruction: 0, other: 0, charge: 0, tax: 0, estimate: 0, rate: 0, buildingArea: grossArea, perCost: ''};
-        IDMapping[project.ID] = {estimate: 0, rate: 0, buildingArea: grossArea, perCost: ''};
-        initFees(IDMapping[project.ID], feeFields);
+        IDMapping[project.ID] = {rate: 0, buildingArea: grossArea, perCost: ''};
+        initFees(IDMapping[project.ID], feeFields, engineeringCostFields);
         console.log(IDMapping[project.ID]);
     }
 
     //单项工程
     let engineerings = await projectModel.find({ParentID: {$in : projectIDs}, projType: projectType.engineering, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]});
-    //单位工程
     let tenders = [];
     let engIDs = [];
     for(let eng of engineerings){
         engIDs.push(eng.ID);
-        //IDMapping[eng.ID] = {engineeringCost: 0, subEngineering: 0, measure: 0, safetyConstruction: 0, other: 0, charge: 0, tax: 0, estimate: 0, rate: 0, buildingArea: '', perCost: ''};
-        IDMapping[eng.ID] = {estimate: 0, rate: 0, buildingArea: '', perCost: ''};
-        initFees(IDMapping[eng.ID], feeFields);
+        IDMapping[eng.ID] = {rate: 0, buildingArea: '', perCost: ''};
+        initFees(IDMapping[eng.ID], feeFields, engineeringCostFields);
     }
+    //单位工程
     if(engIDs.length > 0){
         tenders = await projectModel.find({ParentID: {$in : engIDs}, projType: projectType.tender, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]});
     }
@@ -1095,18 +1089,14 @@ async function getSummaryInfo(projectIDs, feeFields = null){
     if(tenders.length > 0){
         for(let tender of tenders){
             tenderIDs.push(tender.ID);
-            /*IDMapping[tender.ID] = {engineeringCost: 0, subEngineering: 0, measure: 0, safetyConstruction: 0, other: 0, charge: 0, tax: 0, rate: 0, estimate: 0,
-                buildingArea: '', perCost: '',changeMark:tender.changeMark,property:tender.property};*/
-            IDMapping[tender.ID] = {rate: 0, estimate: 0, buildingArea: '', perCost: '', changeMark:tender.changeMark,property:tender.property};
-            initFees(IDMapping[tender.ID], feeFields);
+            IDMapping[tender.ID] = {rate: 0, buildingArea: '', perCost: '', changeMark:tender.changeMark,property:tender.property};
+            initFees(IDMapping[tender.ID], feeFields, engineeringCostFields);
             let buildingArea = getBuildingArea(tender.property.projectFeature);
             if(buildingArea){
                 IDMapping[tender.ID]['buildingArea'] = buildingArea;
             }
         }
         //需要获取的清单固定类别综合合价:工程造价、分部分项、措施项目、安全文明施工专项、规费、其他项目、税金...
-        /*let needFlags = [billsFlags.ENGINEERINGCOST, billsFlags.SUB_ENGINERRING, billsFlags.MEASURE,
-            billsFlags.SAFETY_CONSTRUCTION, billsFlags.CHARGE, billsFlags.OTHER, billsFlags.TAX];*/
         let needFlags = feeFields.map(data => data.k);
         //获取单位工程汇总金额需要用到的所有清单
         let allBills = await billsModel.find({projectID: {$in: tenderIDs}, 'flags.flag': {$in: needFlags}, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]},
@@ -1116,13 +1106,14 @@ async function getSummaryInfo(projectIDs, feeFields = null){
             let billsFlag = bills.flags[0]['flag'];
             let costField = flagFieldMapping[billsFlag];
             IDMapping[bills.projectID][costField] = getTotalFee(bills, 'common');
-            //暂估合价(工程造价暂估合价)
+            // 工程造价各费用
             if (billsFlag === billsFlags.ENGINEERINGCOST){
-                IDMapping[bills.projectID]['estimate'] = getTotalFee(bills, 'estimate');
+                engineeringCostFields.forEach(({k, v}) => {
+                    IDMapping[bills.projectID][k] = getTotalFee(bills, v);
+                });
             }
         }
-        let summaryFields = feeFields.map(data => data.v);
-        summaryFields.push('estimate');
+        let summaryFields = [...feeFields, ...engineeringCostFields].map(data => data.v);
         //进行单项工程级别的汇总
         for(let tender of tenders){
             summarizeToParent(IDMapping[tender.ParentID], IDMapping[tender.ID], summaryFields);
@@ -1139,8 +1130,9 @@ async function getSummaryInfo(projectIDs, feeFields = null){
             let engInfo = IDMapping[tender.ParentID];
             tenderInfo.rate = engInfo.engineeringCost == 0 ? 0 : scMathUtil.roundTo(tenderInfo.engineeringCost * 100 / engInfo.engineeringCost, rateDecimal);
             //单方造价
-            tenderInfo.perCost = tenderInfo.buildingArea.toString().trim() === '' || tenderInfo.buildingArea == 0 ?
-                                 tenderInfo.buildingArea.toString().trim() : scMathUtil.roundTo(tenderInfo.engineeringCost / tenderInfo.buildingArea, perCostDecimal);
+            tenderInfo.perCost = tenderInfo.buildingArea.toString().trim() === '' || tenderInfo.buildingArea == 0 
+                ? tenderInfo.buildingArea.toString().trim() 
+                : scMathUtil.roundTo(tenderInfo.engineeringCost / tenderInfo.buildingArea, perCostDecimal);
         }
         for(let eng of engineerings){
             let engInfo = IDMapping[eng.ID];
@@ -1151,8 +1143,9 @@ async function getSummaryInfo(projectIDs, feeFields = null){
         for(let project of projects){
             let projectInfo = IDMapping[project.ID];
             projectInfo.rate = 100;
-            projectInfo.perCost = projectInfo.buildingArea.toString().trim() === '' || projectInfo.buildingArea == 0 ?
-                                  projectInfo.buildingArea.toString().trim() : scMathUtil.roundTo(projectInfo.engineeringCost / projectInfo.buildingArea, perCostDecimal);
+            projectInfo.perCost = projectInfo.buildingArea.toString().trim() === '' || projectInfo.buildingArea == 0 
+            ? projectInfo.buildingArea.toString().trim() 
+            : scMathUtil.roundTo(projectInfo.engineeringCost / projectInfo.buildingArea, perCostDecimal);
         }
     }
     return IDMapping;
@@ -1275,6 +1268,39 @@ async function isFirst(userId, compilationId) {
     return first;
 }
 
+async function importChongqingProject(data) {
+
+    let log_data = {
+        key:data.key,
+        userID:data.user_id,
+        status:"start",
+        create_time:+new Date()
+    };
+    await importLogsModel.create(log_data);
+    doImport(data.user_id,data.session.sessionCompilation._id,data.session.sessionCompilation.adProjects,data.key);
+
+     return "start importing";
+
+    async function doImport(user_id,compilationId,projectIDs,key) {
+        let doc = {status:"finish"};
+        try {
+           let r = await copyExample(user_id,compilationId,projectIDs);
+           if(r == false){
+               doc.errorMsg = "导入失败,请检查项目是否存在!";
+               doc.status = "error";
+           }
+        }catch (error){
+            console.log(error);
+            doc.errorMsg = "导入失败,请检查项目是否存在!";
+            doc.status = "error";
+        }finally {
+            await importLogsModel.update({key:key},doc);
+        }
+    }
+}
+
+
+
 //用户第一次进入费用定额的数据准备
 async function prepareInitialData(userId, compilation, example) {
     let first = await isFirst(userId, compilation);
@@ -1391,61 +1417,47 @@ async function getProjectFeature(valuationID, engineeringName, feeName) {
 
 //根据单位工程,获取建设项目-单项工程-单位工程,不包含无单位工程的单项工程
 //@param {Number}tenderID(单位工程ID) {Number}granularity(颗粒度 1:建设项目 2:单项工程 3:单位工程)
-async function getProjectByGranularity(tenderID, granularity, userID, versionName) {
+async function getProjectByGranularity(tenderID, granularity, summaryObj, userID, versionName) {
     const GRANULARITY = {
         PROJECT: 1,
         ENGINEERING: 2,
         TENDER: 3
     };
-    let theTender = await projectModel.findOne({userID: userID, ID: tenderID}); //加上session的userID,防止tenderID被篡改过
+    let theTender = await projectModel.findOne({userID: userID, ID: tenderID}).lean(); //加上session的userID,防止tenderID被篡改过
     if (!theTender) {
         return null;
     }
-    let theEngineering = await projectModel.findOne({ID: theTender.ParentID});
+    let theEngineering = await projectModel.findOne({ID: theTender.ParentID}).lean();
     if (!theEngineering) {
         return null;
     }
-    let constructionProject = await projectModel.findOne({ID: theEngineering.ParentID});
+    let constructionProject = await projectModel.findOne({ID: theEngineering.ParentID}).lean();
     if (!constructionProject) {
         return null;
     }
     let engineerings;
     if (granularity === GRANULARITY.PROJECT) {
-        engineerings = await projectModel.find({ParentID: constructionProject.ID, $or: notDeleted});
+        engineerings = await projectModel.find({ParentID: constructionProject.ID, $or: notDeleted}).lean();
         for (let eng of engineerings) {
-            eng._doc.children = await projectModel.find({ParentID: eng.ID, $or: notDeleted});
+            eng.children = await projectModel.find({ParentID: eng.ID, $or: notDeleted}).lean();
         }
     } else {
         engineerings = [theEngineering];
         if (granularity === GRANULARITY.ENGINEERING) {
-            theEngineering._doc.children = await projectModel.find({ParentID: theEngineering.ID, $or: notDeleted});
+            theEngineering.children = await projectModel.find({ParentID: theEngineering.ID, $or: notDeleted}).lean();
         } else {
-            theEngineering._doc.children = [theTender];
+            theEngineering.children = [theTender];
         }
     }
-    constructionProject._doc.children = engineerings;
+    constructionProject.children = engineerings;
     //获取汇总信息
-    let feeFields = [
-        {k: billsFlags.ENGINEERINGCOST, v: 'engineeringCost'},
-        {k: billsFlags.SUB_ENGINERRING, v: 'subEngineering'},
-        {k: billsFlags.MEASURE, v: 'measure'},
-        {k: billsFlags.SAFETY_CONSTRUCTION, v: 'safetyConstruction'},
-        {k: billsFlags.OTHER, v: 'other'},
-        {k: billsFlags.CHARGE, v: 'charge'},
-        {k: billsFlags.PROVISIONAL, v: 'provisional'},
-        {k: billsFlags.MATERIAL_PROVISIONAL, v: 'materialProvisional'},
-        {k: billsFlags.ENGINEERING_ESITIMATE, v: 'engineeringEstimate'},
-        {k: billsFlags.DAYWORK, v: 'daywork'},
-        {k: billsFlags.TURN_KEY_CONTRACT, v: 'turnKeyContract'},
-        {k: billsFlags.CLAIM_VISA, v: 'claimVisa'},
-        {k: billsFlags.TAX, v: 'tax'}
-    ];
-    constructionProject._doc.summaryInfo = await getSummaryInfo([constructionProject.ID], feeFields);
+    const { feeFields, engineeringCostFields } = summaryObj;
+    constructionProject.summaryInfo = await getSummaryInfo([constructionProject.ID], feeFields, engineeringCostFields);
     //获取编制软件信息: 软件公司;软件名;版本号;授权信息; base64
     let product = await productModel.findOne({});
     let company = product.company || '珠海纵横创新软件有限公司',
         version = product.version || '';
-    constructionProject._doc.softInfo = `${company};${versionName};${version};${userID}`;
+    constructionProject.softInfo = `${company};${versionName};${version};${userID}`;
     return constructionProject;
 }
 
@@ -2317,4 +2329,29 @@ async function isTenderOverrun(tenderCount, session) {
     const limit = systemSetting[type].project;
     const curTenderCount = await projectModel.count({userID, compilation, projType: 'Tender', '$or':[{deleteInfo: null}, {'deleteInfo.completeDeleted': false}]});
     return tenderCount + curTenderCount > limit;
+}
+
+async function getWelcomeInfo(compilationId,sessionUser) {
+    let setting = await welcomeModel.findOne({compilationId:compilationId});
+    let isShow = false;
+    let context = "";
+    if(setting){
+        if(setting.showType == 0) return [false,""];//关闭
+        context = setting.context;
+        if(setting.showType == 1){//每天一次
+            let dataString =moment(Date.now()).tz("Asia/Shanghai").format('YYYY-MM-DD');//今天的日期字符串
+            let userInfo =await userModel.findOne({_id: mongoose.Types.ObjectId(sessionUser.id)});
+            if (dataString != userInfo.welcomeShowTime){//今天没登录过
+                isShow = true;
+                await userModel.update({_id: mongoose.Types.ObjectId(sessionUser.id)},{welcomeShowTime:dataString})
+            }
+        }else if(setting.showType == 2){//每次登录显示
+            isShow = sessionUser.newLogin?true:false;
+            sessionUser.newLogin = false
+        }
+
+    }
+
+    return [isShow,context]
+
 }

+ 1 - 0
modules/pm/routes/pm_route.js

@@ -65,6 +65,7 @@ module.exports = function (app) {
     pmRouter.post('/changeFile', pmController.changeFile);
     pmRouter.post('/exportProject', pmController.exportProject);
     pmRouter.post('/importProject', pmController.importProject);
+    pmRouter.post('/importChongqingProject', pmController.importChongqingProject);
     pmRouter.post('/importProcessChecking', pmController.importProcessChecking);
     pmRouter.post('/getBasicInfo', pmController.getBasicInfo);
     pmRouter.post('/getProjectFeature', pmController.getProjectFeature);

+ 27 - 6
modules/ration_glj/facade/glj_calculate_facade.js

@@ -41,6 +41,11 @@ let coeTypeMap = {
     "设备":5
 };
 
+let areaIncreaseMap = {
+    1:"labour",
+    2:"material",
+    3:"machine"
+};
 
 async function calculateQuantity(query,noNeedCal,refreshRationName = false,areaIncreaseFee,areaSetting){
     try {
@@ -58,6 +63,10 @@ async function calculateQuantity(query,noNeedCal,refreshRationName = false,areaI
              return null;
          }
         if(areaIncreaseFee !== null && areaIncreaseFee !== undefined) impactRation.areaIncreaseFee = areaIncreaseFee;
+        if(impactRation.areaIncreaseFee == true && !areaSetting){
+            let project =  await project_model.findOne({ID:impactRation.projectID},'property.areaSetting');
+            areaSetting = project.property.areaSetting;
+        }
          if(impactRation._doc.hasOwnProperty("rationAssList")&&impactRation.rationAssList.length>0){
              let temTimes = [];
              let thirdRationCodes=[];
@@ -85,7 +94,7 @@ async function calculateQuantity(query,noNeedCal,refreshRationName = false,areaI
          }
          gljList = sortRationGLJ(gljList);
          for(let i =0;i<gljList.length;i++ ){
-             let r = await calculateQuantityPerGLJ(gljList[i],gljList,coeList,assList,adjustState,noNeedCal);
+             let r = await calculateQuantityPerGLJ(gljList[i],gljList,coeList,assList,adjustState,noNeedCal,impactRation.areaIncreaseFee,areaSetting);
              if(quantityUpdateCheck(gljList[i],r) == true) result.glj_result.push(r);
          }
 
@@ -114,10 +123,6 @@ async function calculateQuantity(query,noNeedCal,refreshRationName = false,areaI
 }
 
 async function setAreaAdjustState(projectID,adjustState,areaSetting){
-    if(!areaSetting){
-        let project =  await project_model.findOne({ID:projectID},'property.areaSetting');
-        areaSetting = project.property.areaSetting;
-    }
     if(areaSetting){
         let stringArr = [];
         let labour = getStr(areaSetting.labour);
@@ -207,7 +212,7 @@ function sortRationGLJ(list) {
     return list;
 }
 
-async function calculateQuantityPerGLJ(glj,gljList,coeList,assList,adjustState,noNeedCal) {
+async function calculateQuantityPerGLJ(glj,gljList,coeList,assList,adjustState,noNeedCal,areaIncreaseFee,areaSetting) {
     let decimalObject =await decimal_facade.getProjectDecimal(glj.projectID);
     let decimal = (decimalObject&&decimalObject.glj&&decimalObject.glj.quantity)?decimalObject.glj.quantity:3;
     let quantity =  scMathUtil.roundTo(parseFloat(glj.quantity),-decimal);
@@ -235,6 +240,9 @@ async function calculateQuantityPerGLJ(glj,gljList,coeList,assList,adjustState,n
                 quantity = scMathUtil.roundToString(quantity,decimal);
                 quantity = calculateQuantityByCustomerCoes(quantity,customerCoe,glj,decimal);
             }
+            //计算面积增加费
+            if(areaIncreaseFee == true) quantity = calclateAreaIncrease(quantity,glj,areaSetting,decimal);
+
             result.doc.quantity =scMathUtil.roundToString(quantity,decimal);
             //2019-01-03 需求修改中间过程的价格不参与计算
             //glj.quantity = quantity;//这里保存中间过程计算出来的消耗量,后面处理“+*”操作符时要用到
@@ -246,6 +254,19 @@ async function calculateQuantityPerGLJ(glj,gljList,coeList,assList,adjustState,n
     }
 }
 
+function calclateAreaIncrease(quantity,glj,areaSetting,decimal){
+    if(areaSetting){
+        let atype = areaIncreaseMap[getRootGLJType(glj.type).ID];
+        if(atype && areaSetting[atype]){
+            quantity =  scMathUtil.roundForObj(quantity,decimal);
+            quantity = scMathUtil.roundToString(quantity * (1 + areaSetting[atype]/100 ),decimal)
+        }
+    }
+    return quantity
+}
+
+
+
 async function calculateAss(quantity,assList,glj) {
     for(let i=0;i<assList.length;i++){
         if(assList[i].assRation){

+ 13 - 8
modules/ration_glj/facade/ration_glj_facade.js

@@ -141,7 +141,7 @@ function get_lib_glj_info(ration_glj) {
                 ration_glj.repositoryId = glj.repositoryId;
                 ration_glj.adjCoe = glj.adjCoe;
                 getInfoFromProjectGLJ(ration_glj).then(function (info) {
-                    if (info) {
+                    if (info &&info.length>0) {
                         let tem = {};
                         tem.newRecode = createNewRecord(info[0]);
                         tem.showData = info[0];
@@ -635,13 +635,14 @@ async function prepareExtData(projectID,compilation) {
 
 async function addGLJ(rgList,compilation) {
     if (rgList.length <= 0) return {};
-    let newRecodes = await insertAddTypeGLJ(rgList,compilation);
+    let [newRecodes,projectGLJList] = await insertAddTypeGLJ(rgList,compilation);
     let stateResult = await glj_calculate_facade.calculateQuantity({
         projectID: rgList[0].projectID,
         rationID: rgList[0].rationID
     });
     let result = {
         newRecodes: newRecodes,
+        projectGLJList:projectGLJList,
         showData: rgList,
         adjustState: stateResult.adjustState
     };
@@ -650,6 +651,7 @@ async function addGLJ(rgList,compilation) {
 
 async function insertAddTypeGLJ(rgList,compilation) {
     let newRecodes = [];
+    let projectGLJList = [];
     let [unitFileId,ext] = await  prepareExtData(rgList[0].projectID,compilation);
     for (let g of rgList) {
         let projectGljModel = new GLJListModel();
@@ -668,9 +670,10 @@ async function insertAddTypeGLJ(rgList,compilation) {
             g.subList = getMixRatioShowDatas(result.subList);
         }
         newRecodes.push(createNewRecord(g));
+        projectGLJList.push(result);
     }
     await ration_glj.insertMany(newRecodes);
-    return newRecodes;
+    return [newRecodes,projectGLJList];
 }
 
 
@@ -693,20 +696,21 @@ async  function replaceGLJByData(data,compilation) {
     if (result.hasOwnProperty('subList') && result.subList.length > 0) {
         data.subList = getMixRatioShowDatas(result.subList);
     }
-    return data;
+    return [data,result];
 }
 
 
 async function replaceGLJ(data,compilation) {
     let rdata = {};
-    data = await  replaceGLJByData(data,compilation);
+    let [tdata,projectGLJ] = await  replaceGLJByData(data,compilation);
     let stateResult = await glj_calculate_facade.calculateQuantity({
-        projectID: data.projectID,
-        rationID: data.rationID
+        projectID: tdata.projectID,
+        rationID: tdata.rationID
     }, true,true);
-    rdata.data = data;
+    rdata.data = tdata;
     rdata.adjustState = stateResult.adjustState;
     rdata.name = stateResult.rationName;
+    rdata.projectGLJ = projectGLJ;
     return rdata;
 }
 async function mReplaceGLJ(data,compilation) {
@@ -739,6 +743,7 @@ async function mReplaceGLJ(data,compilation) {
     data.doc = newDoc;
     mresult.data = data;
     mresult.stateList = stateList;
+    mresult.projectGLJ = result;
     return mresult
 }
 

+ 142 - 2
modules/users/controllers/cld_controller.js

@@ -11,6 +11,7 @@
 import CLDModel from "../models/cld_model";
 import UserModel from "../models/user_model"
 import CompilationModel from "../models/compilation_model";
+let online_facade = require('../facade/online_facade')
 
 class CLDController {
 
@@ -62,10 +63,12 @@ class CLDController {
             if (userData === null || userData === '') {
                 throw '不存在该建筑用户';
             }
+            let userList = [userData];
+            await online_facade.setOnlineTimes(userList, {});
             userData = JSON.parse(JSON.stringify(userData));
 
-            userData.company_scale = userData.company_scale === null || userData.company_scale === undefined ? '' : userModel.companyScale[userData.company_scale] + '人';
-            userData.company_type = userData.company_type === null || userData.company_type === undefined ? '' : userModel.companyType[userData.company_type];
+            userData.company_scale = userData.company_scale === null || userData.company_scale === undefined || userData.company_scale === -1 ? '' : userModel.companyScale[userData.company_scale] + '人';
+            userData.company_type = userData.company_type === null || userData.company_type === undefined || userData.company_type === -1 ? '' : userModel.companyType[userData.company_type];
             userData.province = userModel.province[userData.province];
 
             let date = new Date(userData.create_time);
@@ -161,6 +164,143 @@ class CLDController {
         const compilationList = await compilationModel.getList();
         response.json({error: 0, msg: 'success', data: compilationList});
     }
+
+    /**
+     * 获取个人和已使用编办信息
+     * @param request
+     * @param response
+     * @returns {Promise<void>}
+     */
+    async getUsersInfo(request, response) {
+        let ssoID = request.query.ssoID;
+        try {
+            //获取用户信息
+            if (ssoID === undefined) {
+                throw '传参有误';
+            }
+            let userModel = new UserModel();
+            let userData = await userModel.findDataBySsoId(ssoID);
+            if (userData === null || userData === '') {
+                throw '不存在该建筑用户';
+            }
+            userData = JSON.parse(JSON.stringify(userData));
+
+            userData.company_scale = userData.company_scale === null || userData.company_scale === undefined ? '' : userModel.companyScale[userData.company_scale] + '人';
+            userData.company_type = userData.company_type === null || userData.company_type === undefined ? '' : userModel.companyType[userData.company_type];
+            userData.province = userModel.province[userData.province];
+
+            let date = new Date(userData.create_time);
+            userData.create_time = date.getFullYear() + '年' +
+                (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '月' +
+                (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + '日';
+
+            //获取编办列表
+            let compilationModel = new CompilationModel();
+            let compilationList = JSON.parse(JSON.stringify(await compilationModel.getList()));
+            if (userData.upgrade_list !== undefined) {
+                let userUpgradeList = userData.upgrade_list;
+                for (let i in userUpgradeList) {
+                    let oneCompilationIndex = await compilationList.findIndex(function (item) {
+                        return item._id === userUpgradeList[i].compilationID;
+                    });
+                    if (oneCompilationIndex !== -1) {
+                        // compilationList[oneCompilationIndex].isUpgrade = userUpgradeList[i].isUpgrade;
+                        userData.upgrade_list[i].name = compilationList[oneCompilationIndex].name;
+                        userData.upgrade_list[i].description = compilationList[oneCompilationIndex].description;
+                        userData.upgrade_list[i].categoryID = compilationList[oneCompilationIndex].categoryID;
+                    }
+                }
+            }
+            response.json({error: 0, msg: 'success', data: { userInfo: userData }});
+        } catch (err) {
+            response.json({error: 1, msg: err});
+        }
+    }
+
+    /**
+     * 获取用户列表分页
+     * @param request
+     * @param response
+     * @returns {Promise<void>}
+     */
+    async getUserList(request, response) {
+        let userModel = new UserModel();
+        let total = 0;
+        let pageSize = 12;
+        let pageData = {};
+        let userList = [];
+        let compilationList =[];
+        let filter = request.query;
+        try {
+            //获取编办列表
+            let  compilationModel = new CompilationModel();
+            compilationList = await compilationModel.getCompilationList({_id: 1, name: 1, is_release: 1});
+            let condition = userModel.getFilterCondition(request);
+            //设置搜索普通用户:
+            condition.user_type = 'normal';
+
+            //获取注册时间
+            let regtime = request.query.regtime;
+            if(regtime !== '' && regtime !== undefined){
+                filter.regtimeMsg = userModel.getDayMsg(regtime);
+            }
+
+            //获取注册时间
+            let loginTime = request.query.loginTime;
+            if(loginTime !== '' && loginTime !== undefined){
+                filter.loginMsg = userModel.getDayMsg(loginTime);
+            }
+
+            // 排序方式
+            let sortType = request.query.sortType !== '' && request.query.sortType !== undefined ? request.query.sortType : -1;
+
+            // 排序条件
+            let sortField = request.query.sortField;
+            let sort = sortField !== '' && sortField !== undefined && sortField === 'latest_login' ? {latest_login: sortType}: {_id: sortType};
+
+            // 获取用户总数
+            total = await userModel.count(condition);
+
+            // 分页数据
+            let page = request.query.page === undefined ? 1 : request.query.page;
+            pageSize = request.query.pageSize === undefined ? 12 : parseInt(request.query.pageSize);
+            pageData = {
+                current: page,
+                total: total,
+                queryData: response.locals.urlQuery
+            };
+            // console.log("取用户信息=========================");
+            // console.log(condition);
+            // 获取用户列表
+            userList = await userModel.getList(condition, page, pageSize, sort);
+            await online_facade.setOnlineTimes(userList,condition);
+            response.json({error: 0, msg: 'success', data: {
+                    userInfo: userList,
+                    pageData: pageData,
+                    compilationList:compilationList,
+                }});
+        } catch (error) {
+            response.json({error: 1, msg: error});
+        }
+    }
+
+    async getUserOnlineInfo(request, response){
+        let filter = JSON.parse(request.body.data);
+        let responseData = {
+            error: 0,
+            msg: '',
+            data: null
+        };
+        try{
+            let info = await online_facade.getOnlineInfo(filter);
+            responseData.data = info;
+        } catch (error) {
+            console.log(error);
+            responseData.error = error.code;
+            responseData.msg = error.err;
+        }
+        response.json(responseData);
+    }
 }
 
 export default CLDController;

+ 6 - 0
modules/users/controllers/login_controller.js

@@ -21,6 +21,11 @@ let systemSettingModel = mongoose.model("system_setting");
 
 class LoginController {
 
+
+    async firstPage(request,response){
+        response.render('users/html/index', {});
+    }
+
     /**
      * 登录页面
      *
@@ -255,6 +260,7 @@ class LoginController {
                 mobile: userData.mobile,
                 qq: userData.qq,
                 isUserActive: userData.isUserActive,
+                newLogin:true
             };
 
             request.session.sessionUser = sessionUser;

+ 62 - 0
modules/users/facade/online_facade.js

@@ -0,0 +1,62 @@
+/**
+ * Created by zhang on 2019/4/16.
+ */
+
+module.exports = {
+    setOnlineTimes:setOnlineTimes,
+    getOnlineInfo:getOnlineInfo
+};
+
+let mongoose = require("mongoose");
+let logs_model = mongoose.model("online_logs");
+
+async function getOnlineInfo(filter) {
+    let datas = [];
+    let logs = await logs_model.find(filter);
+    let less = 0;
+    for(let l of logs){
+        let d = getTimeString(l.online_times);
+        let online_times = d.s;
+        less += d.less;
+        if(online_times!=""){
+            datas.push({dateString:l.dateString,dateTime:l.online_times,online_times:online_times})
+        }
+    }
+    if(datas.length>1){//大于2个才把不够1分钟的累积到最后一条记录
+        let last =  datas[datas.length - 1];
+        last.online_times = getTimeString(last.dateTime + less).s;
+    }
+
+    return datas;
+}
+
+
+async function setOnlineTimes(userList,condition){
+    for(let u of userList){
+        let filter = {'userID':u._id.toString()};
+        if(u.latest_used) filter["compilationID"] = u.latest_used;
+        if(condition.latest_login && condition.latest_login == ""){
+            let startTime = condition.latest_login['$gte']; //- 24*60*60*1000 //往前推一天  {'$gte': startTime, '$lt': endTime}latest_login
+            filter['dateTime'] = {'$gte': startTime, '$lt':  condition.latest_login['$lt']}
+        }
+
+        let result =  await logs_model.aggregate([
+            {$match: filter},
+            {$group: {_id: "$userID", total: {$sum: "$online_times"}}}
+        ]);
+        u._doc.filter = JSON.stringify(filter);
+        if(result.length > 0)  u._doc.online_times = getTimeString(result[0].total).s;
+        u._doc.online_list = await this.getOnlineInfo(filter);
+    }
+}
+
+
+function getTimeString(times) {
+    let s = "",perHour = 1000 * 60 * 60,perMin = 1000 * 60;
+    let hour = parseInt(times/perHour);
+    let min = parseInt((times % perHour)/perMin);
+    let less =  (times % perHour)%perMin;//不够一分钟的时间
+    if(hour > 0) s = s+`${hour}小时`;
+    if(min > 0)  s= s+`${min}分钟`;
+    return {s:s,less:less}
+}

+ 14 - 0
modules/users/models/compilation_model.js

@@ -26,6 +26,20 @@ class CompilationModel extends BaseModel {
      *
      * @return {Promise}
      */
+    async getCompilationList(fields = null) {
+        // 筛选字段
+        let field = fields == null ?{_id: 1, name: 1, is_release: 1, categoryID: 1, description: 1,overWriteUrl: 1,example: 1, "ration_valuation.id": 1, "ration_valuation.name": 1, "ration_valuation.enable": 1,
+            "bill_valuation.id": 1, "bill_valuation.name": 1, "bill_valuation.enable": 1}:fields;
+        let compilationData = await this.findDataByCondition({name: {$ne: ''}}, field, false);
+
+        return compilationData === null ? [] : compilationData;
+    }
+
+    /**
+     * 获取编办列表
+     *
+     * @return {Promise}
+     */
     async getList() {
         // 筛选字段
         let field = {_id: 1, name: 1, is_release: 1, description: 1, categoryID: 1};

+ 106 - 0
modules/users/models/user_model.js

@@ -36,6 +36,13 @@ class UserModel extends BaseModel {
      */
     companyScale = ['1-50', '50-100', '100-500', '500+'];
 
+    /**
+     * 最近天数
+     *
+     * @var
+     */
+    dayMsg = ['所有', '最近24小时', '最近3天', '最近7天', '最近30天'];
+
 
     /**
      * 构造函数
@@ -279,6 +286,7 @@ class UserModel extends BaseModel {
             username: userData.username,
             email: userData.email,
             mobile: userData.mobile,
+            qq: userData.qq,
             create_time: new Date().getTime(),
             latest_login: new Date().getTime(),
             isUserActive: userData.isUserActive,
@@ -387,6 +395,104 @@ class UserModel extends BaseModel {
         const users = await this.model.find({_id: {$in: userIDList}}, 'real_name mobile company');
         return users;
     }
+
+    /**
+     * 获取列表
+     *
+     * @param {object} condition
+     * @param {number} page
+     * @param {Number} pageSize
+     * @return {promise}
+     */
+    async getList(condition = null, page = 1, pageSize = 30, sort = {_id:-1}) {
+        page = parseInt(page);
+        page = page <= 1 ? 1 : page;
+        let option = {pageSize: pageSize, offset: parseInt((page - 1) * pageSize), sort: sort};
+
+        let userList = await this.db.find(condition, null, option);
+        userList = userList.length > 0 ? userList : [];
+
+        return userList;
+    }
+
+    /**
+     * 获取过滤条件
+     *
+     * @return {Object}
+     */
+    getFilterCondition(request) {
+        let condition = {};
+        let regtime = request.query.regtime;
+        regtime = regtime !== '' && regtime !== undefined ? parseInt(regtime) : 0;
+        if (regtime !== 0) {
+            condition.create_time = this.getTimestamp(regtime);
+        }
+
+        //最近登录时间
+        let loginTime = request.query.loginTime;
+        loginTime = loginTime !== '' && loginTime !== undefined ? parseInt(loginTime) : 0;
+        if (loginTime !== 0) {
+            condition.latest_login = this.getTimestamp(loginTime);
+        }
+
+        let version = request.query.version;
+        if(version !== '' && version !== undefined) {
+            condition.version = version;
+        }
+        // 已升级费用定额
+        let upGrade = request.query.upGrade;
+        if(upGrade !== '' && upGrade !== undefined){
+            condition.upgrade_list = {"$elemMatch":{"compilationID":upGrade,"isUpgrade":true}};
+        }
+
+        // 最近使用费用定额
+        let latestUsed = request.query.latestUsed;
+        if(latestUsed !== '' && latestUsed !== undefined){
+            condition.latest_used = latestUsed;
+        }
+
+        let keyword = request.query.keyword;
+        if (keyword !== '' && keyword !== undefined) {
+            condition.$or = [{real_name : {$regex: keyword}},{email : {$regex: keyword}},{mobile : {$regex: keyword}},{company : {$regex: keyword}}];
+        }
+
+        return condition;
+    }
+
+    /**
+     * 获取时间戳区间
+     *
+     * @return {Object}
+     */
+    getTimestamp(type) {
+        let startTime = '';
+        switch (type) {
+            case 1 :
+                startTime = Date.parse(new Date())-86400*1000;
+                break;
+            case 2 :
+                startTime = Date.parse(new Date())-86400*1000*3;
+                break;
+            case 3 :
+                startTime = Date.parse(new Date())-86400*1000*7;
+                break;
+            case 4 :
+                startTime = Date.parse(new Date())-86400*1000*30;
+                break;
+            default :
+                break;
+        }
+        let endTime =  Date.parse(new Date());
+        return startTime === '' ? '' : {'$gte': startTime, '$lt': endTime};
+    }
+
+    /**
+     * 获取daymsg
+     *
+     */
+    getDayMsg(index){
+        return this.dayMsg[index];
+    }
 }
 
 export default UserModel;

+ 6 - 0
modules/users/routes/cld_route.js

@@ -24,5 +24,11 @@ module.exports = function (app) {
 
     router.post('/setUserUpgrade', cldController.setUsersUpgrade);
 
+    router.get('/getUsersInfo', cldController.getUsersInfo);
+
+    router.get('/getUserList', cldController.getUserList);
+
+    router.post('/getUserOnlineInfo', cldController.getUserOnlineInfo);
+
     app.use('/cld',router)
 };

+ 2 - 2
modules/users/routes/login_route.js

@@ -14,7 +14,7 @@ module.exports = function (app) {
     let loginController = new LoginController();
     // 登录页面action
     router.get('/login', loginController.index);
-    router.get('/', loginController.index);
+    router.get('/', loginController.firstPage);
 
 // 登录操作
     router.post('/login', loginController.login);
@@ -27,7 +27,7 @@ module.exports = function (app) {
     router.get("/logout", function (req, res) {
         delete req.session.sessionUser;
         delete req.session.sessionCompilation;
-        res.redirect("/");
+        res.redirect("/login");
     });
     app.use('/',router)
 };

+ 112 - 0
public/common_constants.js

@@ -0,0 +1,112 @@
+// 部分数据从main_consts.js中抽出来,因为除了造价书界面,有一些页面也需要用到其中的变量
+// 但是其他页面直接引入整个main_consts.js不合理,且会报错(main_consts.js正常运行依赖main.html的一些内容)
+const commonConstants = (() => {
+    // 清单固定行
+    const fixedFlag = {
+        // 分部分项工程
+        SUB_ENGINERRING: 1,
+        // 措施项目
+        MEASURE: 2,
+        // 施工技术措施项目
+        CONSTRUCTION_TECH: 3,
+        // 安全文明施工按实计算费用
+        SAFETY_CONSTRUCTION_ACTUAL: 4,
+        // 施工组织措施专项费用
+        CONSTRUCTION_ORGANIZATION: 5,
+        // 安全文明施工专项费用
+        SAFETY_CONSTRUCTION: 6,
+        // 其他项目
+        OTHER: 7,
+        // 暂列金额
+        PROVISIONAL: 8,
+        // 暂估价
+        ESTIMATE: 9,
+        // 材料(工程设备)暂估价
+        MATERIAL_PROVISIONAL: 10,
+        // 专业工程暂估价
+        ENGINEERING_ESITIMATE: 11,
+        // 计日工
+        DAYWORK: 12,
+        // 总承包服务费
+        TURN_KEY_CONTRACT: 13,
+        // 索赔与现场签证
+        CLAIM_VISA: 14,
+        // 规费
+        CHARGE: 15,
+        // 社会保险费及住房公积金 Social insurance fee and housing accumulation fund
+        SOCIAL_INSURANCE_HOUSING_FUND: 16,
+        // 工程排污费 charges for disposing pollutants
+        POLLUTANTS: 17,
+        // 税金
+        TAX: 18,
+        //工程造价
+        ENGINEERINGCOST: 19,
+        //增值税
+        ADDED_VALUE_TAX: 20,
+        //专项技术措施暂估价
+        SPECIAL_TECH_PROVISIONAL: 21,
+        //专业发包工程管理费
+        LET_CONTRACT_MANAGEMENT: 22,
+        //人工
+        LABOUR: 23,
+        //材料
+        MATERIAL: 24,
+        //施工机械
+        MACHINE: 25,
+        //索赔
+        CLAIM: 26,
+        //现场签证
+        VISA: 27,
+        //附加税
+        ADDITIONAL_TAX: 28,
+        //环境保护税
+        ENVIRONMENTAL_PROTECTION_TAX: 29,
+        //建设工程竣工档案编制费
+        PROJECT_COMPLETE_ARCH_FEE: 30,
+        //住宅工程质量分户验收费
+        HOUSE_QUALITY_ACCEPT_FEE: 31,
+        //组织措施费
+        ORGANIZATION: 32,
+        //其他措施费
+        OTHER_MEASURE_FEE: 33,
+        // 绿色施工安全防护措施费
+        GREEN_MEASURE_FEE: 34,
+        // 预算包干费
+        BUDGET_INCLUDE_WORK_FEE: 35,
+        // 工程优质费
+        PROJECT_HIGH_QUALITY_FEE: 36,
+        // 概算幅度差
+        BUDGET_ESTIMATE_DIFF: 37,
+        // 其他费用(与其他项目不同,参考广东的用法)
+        OTHER_FEE: 38
+    };
+    // 清单类型
+    const billType = {
+        DXFY: 1,//大项费用
+        FB: 2,//分部
+        FX: 3,//分项
+        BILL: 4,//清单
+        BX: 5//补项
+    };
+    // 定额类型
+    const rationType = {
+        ration: 1,
+        volumePrice: 2,
+        gljRation: 3,
+        install: 4,
+        overHeight: 5, // 超高子目
+        itemIncrease: 6//子目增加
+    };
+    //项目类型
+    const projectType = {
+        Project: 'Project',
+        Engineering: 'Engineering',
+        Tender: 'Tender'
+    };
+    return {
+        fixedFlag,
+        billType,
+        rationType,
+        projectType,
+    }
+})();

+ 2 - 2
public/gljUtil.js

@@ -64,8 +64,8 @@ function getEconomicDatas(engineerFeatures,economics,bills,fixedFlag,_,scMathUti
     return gljNodeUtil.getEconomicDatas(engineerFeatures,economics,bills,fixedFlag,_,scMathUtil,decimal);
 }
 
-function getMainMaterialDatas(engineerFeatures,materials,projectGLJData,calcOptions,decimalObj,isRadio,_,scMathUtil) {
-    return gljNodeUtil.getMainMaterialDatas(engineerFeatures,materials,projectGLJData,calcOptions,decimalObj,isRadio,_,scMathUtil);
+function getMainMaterialDatas(projectProperty,engineerFeatures,materials,projectGLJData,calcOptions,decimalObj,isRadio,_,scMathUtil) {
+    return gljNodeUtil.getMainMaterialDatas(projectProperty,engineerFeatures,materials,projectGLJData,calcOptions,decimalObj,isRadio,_,scMathUtil);
 }
 
 function getQuantityDatas(engineerFeatures,mainQuantities,billsList,fixedFlag,_,scMathUtil,decimal) {

+ 17 - 8
public/web/gljUtil.js

@@ -401,7 +401,7 @@ let gljUtil = {
         if(b.fees && b.fees.length > 0){
             for(let f of b.fees){
                 if(f.fieldName == "common"){
-                    total = scMathUtil.roundForObj(f.totalFee,decimal?decimal.bills.totalPrice:getDecimal("bills.totalPrice"));
+                    total = scMathUtil.roundForObj(f.tenderTotalFee,decimal?decimal.bills.totalPrice:getDecimal("bills.totalPrice"));
                 }
             }
         }
@@ -447,7 +447,7 @@ let gljUtil = {
                 i.totalFee =  scMathUtil.roundForObj(i.totalFee,priceDe);
                 cost = scMathUtil.roundForObj(cost + i.totalFee,decimal?decimal.process:getDecimal("process"))//getDecimal("process");
             }
-            data.cost = scMathUtil.roundForObj(cost,priceDe,_);
+            data.cost = scMathUtil.roundForObj(cost,priceDe);
             data.unitCost = gljUtil.calUnitWidthCoe(data.cost,true,engineerFeatures,_,scMathUtil);//noNeedCoe = true 这里不需要乘以系数
             data.per = engineerCost?scMathUtil.roundForObj(data.cost/engineerCost * 100,2):0;
         }
@@ -508,7 +508,7 @@ let gljUtil = {
             }
         }
     },
-    getMainMaterialDatas:function (engineerFeatures,materials,projectGLJData,calcOptions,decimalObj,isRadio,_,scMathUtil) {
+    getMainMaterialDatas:function (projectProperty,engineerFeatures,materials,projectGLJData,calcOptions,decimalObj,isRadio,_,scMathUtil) {
         let datas = [];
         let materialGroup = _.groupBy(projectGLJData.gljList,'materialIndexType');
         if(!materials) return datas;
@@ -528,12 +528,13 @@ let gljUtil = {
         function setMainMaterial(gljs,data) {
             let quantity = 0 ,unitPrice=0;
             for(let g of gljs){
-                if(!g.quantity || g.quantity=="") continue;
-                let marketPrice = gljUtil.getMarketPrice(g,projectGLJData,calcOptions,decimalObj,false,_,scMathUtil); // gljOprObj.setGLJPrice(tem,g);
+                if(!g.tenderQuantity || g.tenderQuantity=="") continue;
+                let tenderCoe = gljUtil.getTenderPriceCoe(g,projectProperty);
+                let marketPrice = gljUtil.getMarketPrice(g,projectGLJData,calcOptions,decimalObj,false,_,scMathUtil,tenderCoe); // gljOprObj.setGLJPrice(tem,g);
                 let materialIndexCoe = g.materialIndexCoe?scMathUtil.roundForObj(g.materialIndexCoe,decimalObj.process):0;
-                let t_quantity = scMathUtil.roundForObj(g.quantity * materialIndexCoe,decimalObj.process);
+                let t_quantity = scMathUtil.roundForObj(g.tenderQuantity * materialIndexCoe,decimalObj.process);
                 quantity = scMathUtil.roundForObj(t_quantity + quantity,decimalObj.process);
-                let temPrice = scMathUtil.roundForObj(g.quantity * marketPrice,decimalObj.process);
+                let temPrice = scMathUtil.roundForObj(g.tenderQuantity * marketPrice,decimalObj.process);
                 unitPrice = scMathUtil.roundForObj(temPrice + unitPrice,decimalObj.process);
             }
             data.quantity = scMathUtil.roundForObj(quantity,2);
@@ -584,7 +585,15 @@ let gljUtil = {
             return v !== undefined && v !== null;
         }
     },
-
+    setProperty:function(Obj,updateData) {
+        for(let ukey in updateData){
+            if(_.isObject(updateData[ukey]) && _.isObject(Obj[ukey])){
+                setProperty(Obj[ukey],updateData[ukey]);
+            }else {
+                Obj[ukey] = updateData[ukey];
+            }
+        }
+    },
     fixedFlag : {
         // 分部分项工程
         SUB_ENGINERRING: 1,

+ 14 - 10
public/web/sheet/sheet_common.js

@@ -179,7 +179,6 @@ var sheetCommonObj = {
             if(setting.header[col].cellType === "comboBox"){
                 this.setComboBox(-1,col,sheet,setting.header[col].options,setting.header[col].editorValueType,setting.header[col].editable,setting.header[col].maxDropDownItems);
             }
-
             for (let row = 0; row < data.length; row++) {
                 if(data[row].cellType === 'comboBox'){
                     let options = data[row].options ? data[row].options.split("@") : [];
@@ -197,6 +196,9 @@ var sheetCommonObj = {
                         val =scMathUtil.roundToString(val,2);
                     }
                 }
+                if(val!=null && setting.header[col].cellType == "checkBox"){
+                    this.setCheckBoxCell(row,col,sheet,val);
+                }
                 sheet.setValue(row, col, val, ch);
                 if(col==0){
                     let treeType = sheetCommonObj.getTreeNodeCellType(data,row,parentMap);
@@ -334,6 +336,11 @@ var sheetCommonObj = {
         for (var col = 0; col < setting.header.length; col++) {
             //var cell = sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport);
             var val = data[row][setting.header[col].dataCode];
+            let style = null;
+            if(data[row].foreColor && data[row].styleCol == col){
+                style = {foreColor: data[row].foreColor};
+                sheet.setStyle(row, col, {foreColor: data[row].foreColor});
+            }
             if(val&&setting.header[col].dataType === "Number"){
                 if(setting.header[col].hasOwnProperty('tofix')){
                     val =scMathUtil.roundToString(val,setting.header[col].tofix);
@@ -359,7 +366,7 @@ var sheetCommonObj = {
                 this.setReplaceButton(row,col,sheet,setting.header[col]);
             }
             if(setting.header[col].cellType === "cusButton"){
-                this.setCusButton(row,col,sheet,setting);
+                this.setCusButton(row,col,sheet,setting,style);
             }
             if(setting.header[col].cellType === "tipsCell"){
                 this.setTipsCell(row,col,sheet,setting.header[col]);
@@ -378,9 +385,6 @@ var sheetCommonObj = {
                 val = setting.getText[setting.header[col].getText](data[row],val)
             }
             sheet.setValue(row, col, val, ch);
-            if(data[row].foreColor && data[row].styleCol == col){
-                sheet.setStyle(row, col, {foreColor: data[row].foreColor});
-            }
         }
         this.setRowStyle(row,sheet,data[row].bgColour);
         if(setting.autoFit==true){//设置自动行高
@@ -666,25 +670,24 @@ var sheetCommonObj = {
         sheet.setCellType(row, col,this.getSelectButton(header.headerWidth),GC.Spread.Sheets.SheetArea.viewport);
     },
 
-    setCusButton:function (row,col,sheet,setting) {
+    setCusButton:function (row,col,sheet,setting,style) {
         let functionName = setting.header[col].callback;
-        let readOnly = setting.disable[setting.header[col].disable];
+        let readOnly = setting.disable?setting.disable[setting.header[col].disable]:false;
         if(typeof(readOnly) == 'function' ){
             readOnly = readOnly(row,col);
         }
         if(functionName){
-            sheet.setCellType(row, col,this.getCusButtonCellType(setting.callback[functionName],readOnly));
+            sheet.setCellType(row, col,this.getCusButtonCellType(setting.callback[functionName],readOnly,style));
         }
         //sheet.setCellType(row, col,this.getSelectButton(header.headerWidth),GC.Spread.Sheets.SheetArea.viewport);
     },
 
-    getCusButtonCellType:function (callback,readOnly=false) {
+    getCusButtonCellType:function (callback,readOnly=false,ostyle) {
         var ns = GC.Spread.Sheets;
         function CusButtonCellType() {
         }
         CusButtonCellType.prototype = new ns.CellTypes.Text();
         CusButtonCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
-
             if(!readOnly){
                 if(options.sheet.getActiveRowIndex()==options.row&&options.sheet.getActiveColumnIndex()==options.col){
                     var image = document.getElementById('f_btn'),imageMagin = 3;
@@ -718,6 +721,7 @@ var sheetCommonObj = {
                     }
                 }
             }
+            if(ostyle)  gljUtil.setProperty(style,ostyle);
             GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
         };
         CusButtonCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {

+ 11 - 1
public/web/tree_sheet/tree_sheet_controller.js

@@ -207,8 +207,18 @@ var TREE_SHEET_CONTROLLER = {
             TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
                 TREE_SHEET_HELPER.refreshTreeNodeData(that.setting, that.sheet, nodes, recursive)
             })
-        }
+        };
 
+        controller.prototype.setTreeSelection = function (oldSelect) {
+            let controller = this;
+            let sel = controller.sheet.getSelections()[0];
+            if(controller.tree.getNodeByID(oldSelect.getID())){//如果旧选中节点还存在
+                controller.sheet.setSelection(oldSelect.serialNo(),sel.col,sel.rowCount,sel.colCount);
+                controller.setTreeSelected(oldSelect)
+            }else {//选中节点已被删除,自动选中新的节点
+                controller.setTreeSelected(controller.tree.items[sel.row]);
+            }
+        };
         controller.prototype.setTreeSelected = function (node) {
             if (this.event.beforeTreeSelectedChange) {
                 this.event.beforeTreeSelectedChange(this.tree.selected);

+ 1 - 1
public/web/tree_sheet/tree_sheet_helper.js

@@ -183,7 +183,7 @@ var TREE_SHEET_HELPER = {
                     cell.value(getFieldText2());
                 }
                 if (colSetting.data.cellType && Object.prototype.toString.apply(colSetting.data.cellType) !== "[object String]") {
-                    cell.cellType(colSetting.data.cellType(node,setting));
+                    cell.cellType(colSetting.data.cellType(node,setting,colSetting.data.field));
                 }
                 //树节点显示列
                 if(iCol == setting.treeCol) cell.cellType(TREE_SHEET_HELPER.getTreeNodeCellType(setting, sheet, node.tree,node));

+ 1 - 1
server.js

@@ -59,7 +59,7 @@ app.use(session({
 app.use(async function (req, res, next) {
     let url = req.originalUrl;
     // if (/^\/login/.test(url) || /\.map|\.ico$/.test(url) || /^\/sms/.test(url) || /^\/cld/.test(url) || /^\/captcha/.test(url)  || /^\/accountIsPro/.test(url)) {
-    if (/^\/login/.test(url) || /\.map|\.ico$/.test(url) || /^\/sms/.test(url) || /^\/cld/.test(url) || /^\/captcha/.test(url)) {
+    if (url=="\/"|| /^\/login/.test(url) || /\.map|\.ico$/.test(url) || /^\/sms/.test(url) || /^\/cld/.test(url) || /^\/captcha/.test(url)) {
         // 如果是登录页面或短信接口或cld接口则忽略判断数据
         next();
     } else {

File diff suppressed because it is too large
+ 4463 - 0
web/building_saas/css/all.css


+ 580 - 0
web/building_saas/css/style.css

@@ -0,0 +1,580 @@
+/***** Google fonts import ************/
+@import url("https://fonts.googleapis.com/css?family=Gothic+A1:300,400,500,600,700,900");
+/*------------------------------------------------------------------
+[Layout]
+* body
++ Global styles
++ Header / .header
++ hero / benner
++ Start Call Action
++ What people say
++ price
++ Our Team
++ newsletter
++ Form
++ Footer / #footer
++ Responsive
+/*
+============================================
+Global styles
+============================================
+*/
+/*
+01 -  Global styles
+*/
+html,
+body {
+height: 100%;
+}
+body {
+font-family: Helvetica Neue,Hiragino Sans GB,stheiti,Microsoft Yahei,微软雅黑,tahoma,sans-serif;
+background: #fff;
+font-weight: 400;
+font-size: 15px;
+line-height: 1.8;
+-webkit-text-size-adjust: 100%;
+-moz-osx-font-smoothing: grayscale;
+-webkit-font-smoothing: antialiased;
+color: #333;
+}
+a,
+button {
+-moz-transition: all 0.3s;
+-o-transition: all 0.3s;
+-webkit-transition: all 0.3s;
+transition: all 0.3s;
+text-decoration: none;
+}
+a,
+a:hover,
+a:focus,
+button:hover,
+button:focus {
+outline: 0 !important;
+text-decoration: none;
+}
+.font-weight-900{
+font-weight: 900;
+}
+.f-50{
+font-size: 50px;
+}
+.btn {
+border-radius: 0px;
+text-transform: uppercase;
+padding: 12px 30px;
+}
+.section {
+padding: 100px 0px;
+position: relative;
+}
+.pb-70 {
+padding-bottom: 70px;
+}
+.pb-50 {
+padding-bottom: 50px;
+}
+.mb-100{
+margin-bottom: 100px;
+}
+.mb-50{
+margin-bottom: 50px;
+}
+.mb-30{
+margin-bottom: 30px;
+}
+.mt-30{
+margin-top: 30px;
+}
+.space-40 {
+height: 40px;
+width: 100%
+}
+.space-50 {
+height: 50px;
+width: 100%
+}
+.text-primary {
+color: #627aec !important;
+}
+.btn-primary {
+color: #fff;
+background-color: #627aec;
+border-color: #627aec;
+}
+.btn-dark:hover {
+color: #fff;
+background-color: #627aec;
+border-color: #627aec;
+}
+.btn.btn-round{ border-radius: 50px; }
+.bg-dark {
+background-color: #22232f !important;
+}
+.btn-outline-primary {
+color: #627aec;
+border-color: #627aec;
+}
+.bg-section {
+background-color: #f5f5f5;
+}
+.srction_title p {
+color: #000000;
+font-size: 18px;
+}
+/*02 Header*/
+div#header-sticky-wrapper {
+position: absolute;
+width: 100%;
+left: 0px;
+top: 0px;
+z-index: 999;
+}
+.navbar{
+padding: 0px 15px;
+}
+.is-sticky header {
+background-color: #22232f;
+}
+.bg-light.navbar-transparent {
+background-color: transparent !important;
+}
+.navbar-light .navbar-nav .active>.nav-link, .navbar-light .navbar-nav .nav-link.active, .navbar-light .navbar-nav .nav-link.show, .navbar-light .navbar-nav .show>.nav-link {
+color: #627aec;
+}
+.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {
+color: rgb(98, 122, 236);
+}
+.navbar-light .navbar-nav .nav-link {
+color: #fff;
+padding: 0 20px;
+text-transform: uppercase;
+}
+header .navbar-nav  > li > a:not(.btn){ position: relative; line-height: 75px; }
+header .navbar-nav  > li >  a:not(.btn):before {
+content: "";
+position: absolute;
+right: 0;
+bottom: 0;
+width: 0px;
+height: 2px;
+background-color: #627aec;
+transition: 0.3s;
+}
+header .navbar-nav  > li >  a:not(.btn):hover:before,header .navbar-nav  > li > a.active:not(.btn-round ):before {
+width: 100%;
+left: 0;
+right: auto;
+}
+.navbar-light .navbar-toggler {
+color: rgba(0,0,0,.5);
+border-color: rgba(0,0,0,.1);
+background-color: #fff;
+}
+
+
+/*hero*/
+
+
+.hero.section {
+padding-top: 200px;
+max-height: 800px; min-height: 800px;
+margin-bottom: 100px;
+}
+.home-desk {
+margin-bottom: -200px;
+}
+/*Box card*/
+.bos.bg-bos { padding: 30px 30px; }
+.bos h2{
+font-weight: 450;
+color: #000000; margin-bottom: 20px;
+}
+.bos.bg-bos img {
+height:207px;
+margin: 0 auto;
+display: block;
+text-align: center;
+margin-bottom:20px;
+}
+.bos .media h3 {
+margin-bottom: 10px;
+}
+/*Box card*/
+.bg-box {
+background-color: #f5f5f5;
+}
+.box.bg-box { padding: 30px 30px; }
+.box h3{
+font-size: 24px;
+font-weight: bold;
+color: #000000; margin-bottom: 20px;
+}
+.box.bg-box .icon {
+font-size: 36px;
+width: 80px;
+height: 80px;
+margin: 0 auto;
+border: 1px solid;
+display: block;
+line-height: 80px;
+margin-bottom: 20px;
+border-radius: 100%;
+text-align: center;
+}
+.box .media h3 {
+margin-bottom: 10px;
+}
+.box.bg-box:hover{
+background-color: #627aec;
+}
+.box.bg-box:hover .icon{
+background-color: #fff;
+color: #fff;
+}
+.box.bg-box:hover h3,.box.bg-box:hover p{
+color: #fff;
+}
+/*-- ==== Start Call Action  ==== */
+.call_action .icon {
+width: 120px;
+height: 120px;
+background-color: #fff;
+border-radius: 100%;
+line-height: 125px;
+font-size: 40px;
+text-align: center;
+color: #627aec;
+margin: 0 auto 40px;
+}
+/*What people say*/
+span.blockquote_icon {
+position: absolute;
+right: 0;
+font-size: 150px;
+display: block;
+bottom: 84px;
+line-height: 0;
+color: #f0f0f0;
+transform: rotate(-180deg);
+pointer-events: none;
+}
+.what_say_sldier .media {
+position: relative;
+}
+.owl-dots .owl-dot {
+width: 10px;
+height: 10px;
+background: #ddd;
+border-radius: 100%;
+margin: 0 5px;
+}
+.owl-dots {
+display: flex;
+justify-content: center; margin-top: 30px;
+}
+.owl-dots .owl-dot.active {
+background-color: #000;
+}
+/*price*/
+section.section.pricing {
+position: relative;
+}
+section.section.pricing .bg_box {
+position: absolute;
+width: 100%;
+height: 450px;
+top: 0;
+background-repeat: no-repeat;
+background-size: cover;
+}
+section.section.pricing .container {
+position: relative;
+z-index: 10;
+}
+.card.price_box {
+box-shadow: 2.5px 4.33px 20px rgba(0,0,0,0.2);
+background-color: transparent;
+text-align: center;
+padding: 30px;
+}
+.card.price_box h2 {
+font-size: 15px;
+line-height: 40px;
+font-weight: 700;
+}
+.card.price_box h3 {
+font-size: 48px;
+line-height: 40px;
+font-weight: 900;
+text-align: center;
+}
+.card.price_box h3 sub{
+font-size: 24px; bottom: 0px; margin: 0 5px;
+}
+.card.price_box ul li{
+font-size: 16px;
+line-height: 45px;
+color: #939499;
+font-weight: 400;
+text-align: center;
+}
+.card.price_box.active {
+border: 2px solid rgba(255,255,255,0.04);
+}
+.pricing_slider .item {
+padding: 20px;
+}
+/*Our Team */
+.team_img {
+width: 255px;
+height: 256px;
+border-radius: 128px;
+background-color: #ffffff;
+border: 6px solid #a9aaae;
+text-align: center;
+padding: 30px; margin: 0 auto;
+}
+.team_img img{
+border-radius: 100%;
+}
+.social li a {
+background-color: transparent;
+border-radius: 100%;
+color: #828282; border:1px solid #828282;
+float: left;
+font-size: 14px;
+height: 36px;
+line-height: 36px;
+margin: 0;
+padding: 0;
+text-align: center;
+width: 36px;
+position: relative;
+}
+.social li a:hover {
+background-color: #627aec;
+color: #fff; border:1px solid #627aec;
+}
+.team-box:hover .team_img{  border: 6px solid #627aec;  }
+/*newsletter*/
+.newsletter_input input.form-control {
+height: 60px;
+border-radius: 60px;
+}
+.newsletter_input {
+position: relative;
+}
+.newsletter_input .btn {
+position: absolute;
+right: 12px;
+top: 7px;
+min-width: 140px;
+}
+.newsletter_input .btn i{
+margin-left: 5px;
+}
+/*Form*/
+.form-control {
+border: 1px solid #ebebeb;
+width: 100%;
+max-width: 100%;
+color: #989ca2;
+background: 0 0;
+min-height: 60px;
+padding: 10px 15px;
+box-shadow: none;
+outline: none;
+}
+.form-control:focus{
+box-shadow: none;
+outline: none;
+}
+/*Footer*/
+.footer_menu a {
+font-weight: 300;
+padding: 0 15px;
+border-right: 1px solid #757575; color: #000; text-transform: uppercase; }
+.footer_menu a:hover{
+color: #627aec;
+}
+.footer_menu ul li {
+display: inline-block; }
+.footer_menu ul li:last-child a {
+border-right: none; }
+.footer_copywrite_area {
+display: block;
+padding: 30px 0 100px 0; }
+.footer_social_area {
+margin-bottom: 30px; }
+.footer_social_area a {
+border-radius: 50%;
+height: 40px;
+text-align: center;
+width: 40px; color: #000;
+display: inline-block;
+background-color: #ffffff;
+line-height: 40px;
+box-shadow: none;
+margin: 0 5px; }
+.footer_social_area a i {
+line-height: 36px; }
+.footer_social_area a:hover, .footer_social_area a:focus {
+color: #ffffff;    background-color: #627aec;
+border-color: #627aec; }
+.footer_bottom_area {
+display: block;
+position: relative;
+text-align: center; }
+.footer_bottom_area .item {
+margin-bottom: 50px; }
+.footer_bottom p {
+margin: 0;
+font-size: 14px; }
+.contact_location h3 {
+font-size: 26px;
+font-weight: 900;
+padding-bottom: 10px;
+}
+.contact_location p {
+line-height: 40px;
+font-size: 20px;
+color: #677294;
+}
+.contact_location ul{
+margin-bottom: 0px;
+}
+.contact_location .location_info li {
+font-size: 20px;
+color: #677294;
+margin-bottom: 15px;
+}
+.contact_location .location_info li:last-child{
+margin-bottom: 0px;
+}
+.contact_location .location_info li a{
+font-size: 20px;
+color: #677294;
+
+}
+.contact_location a:hover,.contact_location .location_info li a:hover{
+color: #627aec;
+}
+.contact_location .location_info li i {
+margin-right: 15px; color: #627aec;
+}
+p.help-block ul {
+font-size: 13px;
+margin: 0px;
+padding: 0px;
+list-style: none;
+}
+p.help-block {
+margin: 0px;
+position: absolute;
+left: 0;
+}
+.form-group {
+position: relative;
+margin-bottom: 23px;
+}
+/*Responsive */
+@media(max-width: 991px){
+header#header{
+padding: 15px 0px;
+}
+.f-50 {
+font-size: 36px;
+}
+.lead {
+font-size: 1rem;}
+.home-desk,.hero.section {
+margin-bottom: 0;
+}
+.box.bg-box .icon {
+font-size: 20px;
+width: 50px;
+height: 50px;
+line-height: 50px;
+
+}
+.h1, h1 {
+font-size: 1.7rem;
+}
+.box.bg-box {
+padding: 30px 15px;
+}
+.box h3 {
+font-size: 20px;}
+.call_action .icon {
+width: 70px;
+height: 70px;
+
+border-radius: 100%;
+line-height: 70px;
+
+}
+.srction_title p {
+color: #000000;
+font-size: 14px;
+}
+.card.price_box h3 {
+font-size: 32px;}
+section.section.pricing .bg_box {
+position: absolute;
+width: 100%;
+height: 490px;}
+.team_img {
+width: 206px;
+height: 206px;
+border-radius: 128px;
+border-width: 4px;
+padding: 10px;
+margin: 0 auto;
+}
+header .navbar-nav > li > a:not(.btn) {
+    position: relative;
+    line-height: 45px;
+}
+.btn {
+  
+    padding: 12px 20px;
+    
+}
+}
+@media(max-width: 640px){
+.f-50 {
+font-size:30px;
+}
+}
+
+
+
+/*loader*/
+
+.loader_pre{
+    position: fixed;width: 100%;left: 0px; height: 100%; top: 0; background-color: #000; z-index: 100000;
+}
+#loader {
+  position: absolute;
+  left: 50%;
+  margin-left: -50px;
+  top: 50%;
+  margin-top: -50px;
+  border: 20px #ddd double;
+  border-top: 20px double #627aec;
+  border-radius: 100%;
+  box-shadow: 0px 0px 5px inset #ccc;
+  width: 100px;
+  height: 100px;
+  animation: spin 2s linear infinite;
+}
+
+@keyframes spin {
+  0% {
+    transform: rotate(0deg);
+  }
+  100% {
+    transform: rotate(360deg);
+  }
+}

File diff suppressed because it is too large
+ 4463 - 0
web/building_saas/css/webfonts/all.css


BIN
web/building_saas/css/webfonts/fa-brands-400.eot


File diff suppressed because it is too large
+ 3570 - 0
web/building_saas/css/webfonts/fa-brands-400.svg


BIN
web/building_saas/css/webfonts/fa-brands-400.ttf


BIN
web/building_saas/css/webfonts/fa-brands-400.woff


BIN
web/building_saas/css/webfonts/fa-brands-400.woff2


BIN
web/building_saas/css/webfonts/fa-regular-400.eot


+ 803 - 0
web/building_saas/css/webfonts/fa-regular-400.svg

@@ -0,0 +1,803 @@
+<?xml version="1.0" standalone="no"?>
+<!--
+Font Awesome Free 5.12.1 by @fontawesome - https://fontawesome.com
+License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+-->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
+<metadata>
+Created by FontForge 20190801 at Tue Feb  4 18:05:39 2020
+ By Robert Madole
+Copyright (c) Font Awesome
+</metadata>
+<defs>
+<font id="FontAwesome5Free-Regular" horiz-adv-x="512" >
+  <font-face 
+    font-family="Font Awesome 5 Free Regular"
+    font-weight="400"
+    font-stretch="normal"
+    units-per-em="512"
+    panose-1="2 0 5 3 0 0 0 0 0 0"
+    ascent="448"
+    descent="-64"
+    bbox="-0.0663408 -64.0662 640.01 448.1"
+    underline-thickness="25"
+    underline-position="-50"
+    unicode-range="U+0020-F5C8"
+  />
+    <missing-glyph />
+    <glyph glyph-name="heart" unicode="&#xf004;" 
+d="M458.4 383.7c75.2998 -63.4004 64.0996 -166.601 10.5996 -221.3l-175.4 -178.7c-10 -10.2002 -23.2998 -15.7998 -37.5996 -15.7998c-14.2002 0 -27.5996 5.69922 -37.5996 15.8994l-175.4 178.7c-53.5996 54.7002 -64.5996 157.9 10.5996 221.2
+c57.8008 48.7002 147.101 41.2998 202.4 -15c55.2998 56.2998 144.6 63.5996 202.4 15zM434.8 196.2c36.2002 36.8994 43.7998 107.7 -7.2998 150.8c-38.7002 32.5996 -98.7002 27.9004 -136.5 -10.5996l-35 -35.7002l-35 35.7002
+c-37.5996 38.2998 -97.5996 43.1992 -136.5 10.5c-51.2002 -43.1006 -43.7998 -113.5 -7.2998 -150.7l175.399 -178.7c2.40039 -2.40039 4.40039 -2.40039 6.80078 0z" />
+    <glyph glyph-name="star" unicode="&#xf005;" horiz-adv-x="576" 
+d="M528.1 276.5c26.2002 -3.7998 36.7002 -36.0996 17.7002 -54.5996l-105.7 -103l25 -145.5c4.5 -26.3008 -23.1992 -45.9004 -46.3994 -33.7002l-130.7 68.7002l-130.7 -68.7002c-23.2002 -12.2998 -50.8994 7.39941 -46.3994 33.7002l25 145.5l-105.7 103
+c-19 18.5 -8.5 50.7998 17.7002 54.5996l146.1 21.2998l65.2998 132.4c11.7998 23.8994 45.7002 23.5996 57.4004 0l65.2998 -132.4zM388.6 135.7l100.601 98l-139 20.2002l-62.2002 126l-62.2002 -126l-139 -20.2002l100.601 -98l-23.7002 -138.4l124.3 65.2998
+l124.3 -65.2998z" />
+    <glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="448" 
+d="M313.6 144c74.2002 0 134.4 -60.2002 134.4 -134.4v-25.5996c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v25.5996c0 74.2002 60.2002 134.4 134.4 134.4c28.7998 0 42.5 -16 89.5996 -16s60.9004 16 89.5996 16zM400 -16v25.5996
+c0 47.6006 -38.7998 86.4004 -86.4004 86.4004c-14.6992 0 -37.8994 -16 -89.5996 -16c-51.2998 0 -75 16 -89.5996 16c-47.6006 0 -86.4004 -38.7998 -86.4004 -86.4004v-25.5996h352zM224 160c-79.5 0 -144 64.5 -144 144s64.5 144 144 144s144 -64.5 144 -144
+s-64.5 -144 -144 -144zM224 400c-52.9004 0 -96 -43.0996 -96 -96s43.0996 -96 96 -96s96 43.0996 96 96s-43.0996 96 -96 96z" />
+    <glyph glyph-name="clock" unicode="&#xf017;" 
+d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200zM317.8 96.4004l-84.8994 61.6992
+c-3.10059 2.30078 -4.90039 5.90039 -4.90039 9.7002v164.2c0 6.59961 5.40039 12 12 12h32c6.59961 0 12 -5.40039 12 -12v-141.7l66.7998 -48.5996c5.40039 -3.90039 6.5 -11.4004 2.60059 -16.7998l-18.8008 -25.9004c-3.89941 -5.2998 -11.3994 -6.5 -16.7998 -2.59961z
+" />
+    <glyph glyph-name="list-alt" unicode="&#xf022;" 
+d="M464 416c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h416zM458 16c3.31152 0 6 2.68848 6 6v340c0 3.31152 -2.68848 6 -6 6h-404c-3.31152 0 -6 -2.68848 -6 -6v-340
+c0 -3.31152 2.68848 -6 6 -6h404zM416 108v-24c0 -6.62695 -5.37305 -12 -12 -12h-200c-6.62695 0 -12 5.37305 -12 12v24c0 6.62695 5.37305 12 12 12h200c6.62695 0 12 -5.37305 12 -12zM416 204v-24c0 -6.62695 -5.37305 -12 -12 -12h-200c-6.62695 0 -12 5.37305 -12 12
+v24c0 6.62695 5.37305 12 12 12h200c6.62695 0 12 -5.37305 12 -12zM416 300v-24c0 -6.62695 -5.37305 -12 -12 -12h-200c-6.62695 0 -12 5.37305 -12 12v24c0 6.62695 5.37305 12 12 12h200c6.62695 0 12 -5.37305 12 -12zM164 288c0 -19.8818 -16.1182 -36 -36 -36
+s-36 16.1182 -36 36s16.1182 36 36 36s36 -16.1182 36 -36zM164 192c0 -19.8818 -16.1182 -36 -36 -36s-36 16.1182 -36 36s16.1182 36 36 36s36 -16.1182 36 -36zM164 96c0 -19.8818 -16.1182 -36 -36 -36s-36 16.1182 -36 36s16.1182 36 36 36s36 -16.1182 36 -36z" />
+    <glyph glyph-name="flag" unicode="&#xf024;" 
+d="M336.174 368c35.4668 0 73.0195 12.6914 108.922 28.1797c31.6406 13.6514 66.9043 -9.65723 66.9043 -44.1162v-239.919c0 -16.1953 -8.1543 -31.3057 -21.7129 -40.1631c-26.5762 -17.3643 -70.0693 -39.9814 -128.548 -39.9814c-68.6084 0 -112.781 32 -161.913 32
+c-56.5674 0 -89.957 -11.2803 -127.826 -28.5566v-83.4434c0 -8.83691 -7.16309 -16 -16 -16h-16c-8.83691 0 -16 7.16309 -16 16v406.438c-14.3428 8.2998 -24 23.7979 -24 41.5615c0 27.5693 23.2422 49.71 51.2012 47.8965
+c22.9658 -1.49023 41.8662 -19.4717 44.4805 -42.3379c0.177734 -1.52441 0.321289 -4.00781 0.321289 -5.54199c0 -4.30176 -1.10352 -11.1035 -2.46289 -15.1846c22.418 8.68555 49.4199 15.168 80.7207 15.168c68.6084 0 112.781 -32 161.913 -32zM464 112v240
+c-31.5059 -14.6338 -84.5547 -32 -127.826 -32c-59.9111 0 -101.968 32 -161.913 32c-41.4365 0 -80.4766 -16.5879 -102.261 -32v-232c31.4473 14.5967 84.4648 24 127.826 24c59.9111 0 101.968 -32 161.913 -32c41.4365 0 80.4775 16.5879 102.261 32z" />
+    <glyph glyph-name="bookmark" unicode="&#xf02e;" horiz-adv-x="384" 
+d="M336 448c26.5098 0 48 -21.4902 48 -48v-464l-192 112l-192 -112v464c0 26.5098 21.4902 48 48 48h288zM336 19.5703v374.434c0 3.31348 -2.68555 5.99609 -6 5.99609h-276c-3.31152 0 -6 -2.68848 -6 -6v-374.43l144 84z" />
+    <glyph glyph-name="image" unicode="&#xf03e;" 
+d="M464 384c26.5098 0 48 -21.4902 48 -48v-288c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h416zM458 48c3.31152 0 6 2.68848 6 6v276c0 3.31152 -2.68848 6 -6 6h-404c-3.31152 0 -6 -2.68848 -6 -6v-276
+c0 -3.31152 2.68848 -6 6 -6h404zM128 296c22.0908 0 40 -17.9092 40 -40s-17.9092 -40 -40 -40s-40 17.9092 -40 40s17.9092 40 40 40zM96 96v48l39.5137 39.5146c4.6875 4.68652 12.2852 4.68652 16.9717 0l39.5146 -39.5146l119.514 119.515
+c4.6875 4.68652 12.2852 4.68652 16.9717 0l87.5146 -87.5146v-80h-320z" />
+    <glyph glyph-name="edit" unicode="&#xf044;" horiz-adv-x="576" 
+d="M402.3 103.1l32 32c5 5 13.7002 1.5 13.7002 -5.69922v-145.4c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h273.5c7.09961 0 10.7002 -8.59961 5.7002 -13.7002l-32 -32c-1.5 -1.5 -3.5 -2.2998 -5.7002 -2.2998h-241.5v-352h352
+v113.5c0 2.09961 0.799805 4.09961 2.2998 5.59961zM558.9 304.9l-262.601 -262.601l-90.3994 -10c-26.2002 -2.89941 -48.5 19.2002 -45.6006 45.6006l10 90.3994l262.601 262.601c22.8994 22.8994 59.8994 22.8994 82.6992 0l43.2002 -43.2002
+c22.9004 -22.9004 22.9004 -60 0.100586 -82.7998zM460.1 274l-58.0996 58.0996l-185.8 -185.899l-7.2998 -65.2998l65.2998 7.2998zM524.9 353.7l-43.2002 43.2002c-4.10059 4.09961 -10.7998 4.09961 -14.7998 0l-30.9004 -30.9004l58.0996 -58.0996l30.9004 30.8994
+c4 4.2002 4 10.7998 -0.0996094 14.9004z" />
+    <glyph glyph-name="times-circle" unicode="&#xf057;" 
+d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200zM357.8 254.2l-62.2002 -62.2002l62.2002 -62.2002
+c4.7002 -4.7002 4.7002 -12.2998 0 -17l-22.5996 -22.5996c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-62.2002 62.2002l-62.2002 -62.2002c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-22.5996 22.5996c-4.7002 4.7002 -4.7002 12.2998 0 17l62.2002 62.2002l-62.2002 62.2002
+c-4.7002 4.7002 -4.7002 12.2998 0 17l22.5996 22.5996c4.7002 4.7002 12.2998 4.7002 17 0l62.2002 -62.2002l62.2002 62.2002c4.7002 4.7002 12.2998 4.7002 17 0l22.5996 -22.5996c4.7002 -4.7002 4.7002 -12.2998 0 -17z" />
+    <glyph glyph-name="check-circle" unicode="&#xf058;" 
+d="M256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248zM256 392c-110.549 0 -200 -89.4678 -200 -200c0 -110.549 89.4678 -200 200 -200c110.549 0 200 89.4678 200 200c0 110.549 -89.4678 200 -200 200z
+M396.204 261.733c4.66699 -4.70508 4.63672 -12.3037 -0.0673828 -16.9717l-172.589 -171.204c-4.70508 -4.66797 -12.3027 -4.63672 -16.9697 0.0683594l-90.7812 91.5156c-4.66797 4.70605 -4.63672 12.3047 0.0683594 16.9717l22.7188 22.5361
+c4.70508 4.66699 12.3027 4.63574 16.9697 -0.0693359l59.792 -60.2773l141.353 140.216c4.70508 4.66797 12.3027 4.6377 16.9697 -0.0673828z" />
+    <glyph glyph-name="question-circle" unicode="&#xf059;" 
+d="M256 440c136.957 0 248 -111.083 248 -248c0 -136.997 -111.043 -248 -248 -248s-248 111.003 -248 248c0 136.917 111.043 248 248 248zM256 -8c110.569 0 200 89.4697 200 200c0 110.529 -89.5088 200 -200 200c-110.528 0 -200 -89.5049 -200 -200
+c0 -110.569 89.4678 -200 200 -200zM363.244 247.2c0 -67.0518 -72.4209 -68.084 -72.4209 -92.8633v-6.33691c0 -6.62695 -5.37305 -12 -12 -12h-45.6475c-6.62695 0 -12 5.37305 -12 12v8.65918c0 35.7451 27.1006 50.0342 47.5791 61.5156
+c17.5615 9.84473 28.3242 16.541 28.3242 29.5791c0 17.2461 -21.999 28.6934 -39.7842 28.6934c-23.1885 0 -33.8936 -10.9775 -48.9424 -29.9697c-4.05664 -5.11914 -11.46 -6.07031 -16.666 -2.12402l-27.8232 21.0986
+c-5.10742 3.87207 -6.25098 11.0654 -2.64453 16.3633c23.627 34.6934 53.7217 54.1846 100.575 54.1846c49.0713 0 101.45 -38.3037 101.45 -88.7998zM298 80c0 -23.1592 -18.8408 -42 -42 -42s-42 18.8408 -42 42s18.8408 42 42 42s42 -18.8408 42 -42z" />
+    <glyph glyph-name="eye" unicode="&#xf06e;" horiz-adv-x="576" 
+d="M288 304c0.0927734 0 0.244141 0.000976562 0.336914 0.000976562c61.6641 0 111.71 -50.0469 111.71 -111.711c0 -61.6631 -50.0459 -111.71 -111.71 -111.71s-111.71 50.0469 -111.71 111.71c0 8.71289 1.95898 22.5781 4.37305 30.9502
+c6.93066 -3.94141 19.0273 -7.18457 27 -7.24023c30.9121 0 56 25.0879 56 56c-0.0556641 7.97266 -3.29883 20.0693 -7.24023 27c8.42383 2.62207 22.4189 4.8623 31.2402 5zM572.52 206.6c1.9209 -3.79883 3.47949 -10.3379 3.47949 -14.5947
+s-1.55859 -10.7959 -3.47949 -14.5947c-54.1992 -105.771 -161.59 -177.41 -284.52 -177.41s-230.29 71.5898 -284.52 177.4c-1.9209 3.79883 -3.47949 10.3379 -3.47949 14.5947s1.55859 10.7959 3.47949 14.5947c54.1992 105.771 161.59 177.41 284.52 177.41
+s230.29 -71.5898 284.52 -177.4zM288 48c98.6602 0 189.1 55 237.93 144c-48.8398 89 -139.27 144 -237.93 144s-189.09 -55 -237.93 -144c48.8398 -89 139.279 -144 237.93 -144z" />
+    <glyph glyph-name="eye-slash" unicode="&#xf070;" horiz-adv-x="640" 
+d="M634 -23c3.31738 -2.65137 6.00977 -8.25098 6.00977 -12.498c0 -3.10449 -1.57715 -7.58984 -3.51953 -10.0117l-10 -12.4902c-2.65234 -3.31152 -8.24707 -6 -12.4902 -6c-3.09961 0 -7.58008 1.57227 -10 3.50977l-598 467.49
+c-3.31738 2.65137 -6.00977 8.25098 -6.00977 12.498c0 3.10449 1.57715 7.58984 3.51953 10.0117l10 12.4902c2.65234 3.31152 8.24707 6 12.4902 6c3.09961 0 7.58008 -1.57227 10 -3.50977zM296.79 301.53c6.33496 1.35059 16.7324 2.45801 23.21 2.46973
+c60.4805 0 109.36 -47.9102 111.58 -107.85zM343.21 82.46c-6.33496 -1.34375 -16.7334 -2.44629 -23.21 -2.45996c-60.4697 0 -109.35 47.9102 -111.58 107.84zM320 336c-19.8799 0 -39.2803 -2.7998 -58.2197 -7.09961l-46.4102 36.29
+c32.9199 11.8096 67.9297 18.8096 104.63 18.8096c122.93 0 230.29 -71.5898 284.57 -177.4c1.91992 -3.79883 3.47949 -10.3379 3.47949 -14.5947s-1.55957 -10.7959 -3.47949 -14.5947c-11.7197 -22.7598 -35.4189 -56.4092 -52.9004 -75.1104l-37.7402 29.5
+c14.333 15.0156 34.0449 41.9854 44 60.2002c-48.8398 89 -139.279 144 -237.93 144zM320 48c19.8896 0 39.2803 2.7998 58.2197 7.08984l46.4102 -36.2803c-32.9199 -11.7598 -67.9297 -18.8096 -104.63 -18.8096c-122.92 0 -230.28 71.5898 -284.51 177.4
+c-1.9209 3.79883 -3.47949 10.3379 -3.47949 14.5947s1.55859 10.7959 3.47949 14.5947c11.7168 22.7568 35.4111 56.4014 52.8896 75.1006l37.7402 -29.5c-14.3467 -15.0107 -34.0811 -41.9756 -44.0498 -60.1904c48.8496 -89 139.279 -144 237.93 -144z" />
+    <glyph glyph-name="calendar-alt" unicode="&#xf073;" horiz-adv-x="448" 
+d="M148 160h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12zM256 172c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40
+c6.59961 0 12 -5.40039 12 -12v-40zM352 172c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM256 76c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40
+c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM160 76c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM352 76c0 -6.59961 -5.40039 -12 -12 -12h-40
+c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM448 336v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40
+c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48zM400 -10v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
+    <glyph glyph-name="comment" unicode="&#xf075;" 
+d="M256 416c141.4 0 256 -93.0996 256 -208s-114.6 -208 -256 -208c-32.7998 0 -64 5.2002 -92.9004 14.2998c-29.0996 -20.5996 -77.5996 -46.2998 -139.1 -46.2998c-9.59961 0 -18.2998 5.7002 -22.0996 14.5c-3.80078 8.7998 -2 19 4.59961 26
+c0.5 0.400391 31.5 33.7998 46.4004 73.2002c-33 35.0996 -52.9004 78.7002 -52.9004 126.3c0 114.9 114.6 208 256 208zM256 48c114.7 0 208 71.7998 208 160s-93.2998 160 -208 160s-208 -71.7998 -208 -160c0 -42.2002 21.7002 -74.0996 39.7998 -93.4004
+l20.6006 -21.7998l-10.6006 -28.0996c-5.5 -14.5 -12.5996 -28.1006 -19.8994 -40.2002c23.5996 7.59961 43.1992 18.9004 57.5 29l19.5 13.7998l22.6992 -7.2002c25.3008 -8 51.7002 -12.0996 78.4004 -12.0996z" />
+    <glyph glyph-name="folder" unicode="&#xf07b;" 
+d="M464 320c26.5098 0 48 -21.4902 48 -48v-224c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h146.74c8.49023 0 16.6299 -3.37012 22.6299 -9.37012l54.6299 -54.6299h192zM464 48v224h-198.62
+c-8.49023 0 -16.6299 3.37012 -22.6299 9.37012l-54.6299 54.6299h-140.12v-288h416z" />
+    <glyph glyph-name="folder-open" unicode="&#xf07c;" horiz-adv-x="576" 
+d="M527.9 224c37.6992 0 60.6992 -41.5 40.6992 -73.4004l-79.8994 -128c-8.7998 -14.0996 -24.2002 -22.5996 -40.7002 -22.5996h-400c-26.5 0 -48 21.5 -48 48v288c0 26.5 21.5 48 48 48h160l64 -64h160c26.5 0 48 -21.5 48 -48v-48h47.9004zM48 330v-233.4l62.9004 104.2
+c8.69922 14.4004 24.2998 23.2002 41.0996 23.2002h280v42c0 3.2998 -2.7002 6 -6 6h-173.9l-64 64h-134.1c-3.2998 0 -6 -2.7002 -6 -6zM448 48l80 128h-378.8l-77.2002 -128h376z" />
+    <glyph glyph-name="chart-bar" unicode="&#xf080;" 
+d="M396.8 96c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v230.4c0 6.39941 6.40039 12.7998 12.7998 12.7998h22.4004c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-230.4c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-22.4004zM204.8 96
+c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v198.4c0 6.39941 6.40039 12.7998 12.7998 12.7998h22.4004c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-198.4c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-22.4004zM300.8 96
+c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v134.4c0 6.39941 6.40039 12.7998 12.7998 12.7998h22.4004c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-134.4c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-22.4004zM496 48c8.83984 0 16 -7.16016 16 -16v-16
+c0 -8.83984 -7.16016 -16 -16 -16h-464c-17.6699 0 -32 14.3301 -32 32v336c0 8.83984 7.16016 16 16 16h16c8.83984 0 16 -7.16016 16 -16v-320h448zM108.8 96c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v70.4004c0 6.39941 6.40039 12.7998 12.7998 12.7998h22.4004
+c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-70.4004c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-22.4004z" />
+    <glyph glyph-name="comments" unicode="&#xf086;" horiz-adv-x="576" 
+d="M532 61.7998c15.2998 -30.7002 37.4004 -54.5 37.7998 -54.7998c6.2998 -6.7002 8 -16.5 4.40039 -25c-3.7002 -8.5 -12 -14 -21.2002 -14c-53.5996 0 -96.7002 20.2998 -125.2 38.7998c-19 -4.39941 -39 -6.7998 -59.7998 -6.7998
+c-86.2002 0 -159.9 40.4004 -191.3 97.7998c-9.7002 1.2002 -19.2002 2.7998 -28.4004 4.90039c-28.5 -18.6006 -71.7002 -38.7998 -125.2 -38.7998c-9.19922 0 -17.5996 5.5 -21.1992 14c-3.7002 8.5 -1.90039 18.2998 4.39941 25
+c0.400391 0.399414 22.4004 24.1992 37.7002 54.8994c-27.5 27.2002 -44 61.2002 -44 98.2002c0 88.4004 93.0996 160 208 160c86.2998 0 160.3 -40.5 191.8 -98.0996c99.7002 -11.8008 176.2 -77.9004 176.2 -157.9c0 -37.0996 -16.5 -71.0996 -44 -98.2002zM139.2 154.1
+l19.7998 -4.5c16 -3.69922 32.5 -5.59961 49 -5.59961c86.7002 0 160 51.2998 160 112s-73.2998 112 -160 112s-160 -51.2998 -160 -112c0 -28.7002 16.2002 -50.5996 29.7002 -64l24.7998 -24.5l-15.5 -31.0996c-2.59961 -5.10059 -5.2998 -10.1006 -8 -14.8008
+c14.5996 5.10059 29 12.3008 43.0996 21.4004zM498.3 96c13.5 13.4004 29.7002 35.2998 29.7002 64c0 49.2002 -48.2998 91.5 -112.7 106c0.299805 -3.2998 0.700195 -6.59961 0.700195 -10c0 -80.9004 -78 -147.5 -179.3 -158.3
+c29.0996 -29.6006 77.2998 -49.7002 131.3 -49.7002c16.5 0 33 1.90039 49 5.59961l19.9004 4.60059l17.0996 -11.1006c14.0996 -9.09961 28.5 -16.2998 43.0996 -21.3994c-2.69922 4.7002 -5.39941 9.7002 -8 14.7998l-15.5 31.0996z" />
+    <glyph glyph-name="star-half" unicode="&#xf089;" horiz-adv-x="576" 
+d="M288 62.7002v-54.2998l-130.7 -68.6006c-23.3994 -12.2998 -50.8994 7.60059 -46.3994 33.7002l25 145.5l-105.7 103c-19 18.5 -8.5 50.7998 17.7002 54.5996l146.1 21.2002l65.2998 132.4c5.90039 11.8994 17.2998 17.7998 28.7002 17.7998v-68.0996l-62.2002 -126
+l-139 -20.2002l100.601 -98l-23.7002 -138.4z" />
+    <glyph glyph-name="lemon" unicode="&#xf094;" 
+d="M484.112 420.111c28.1221 -28.123 35.9434 -68.0039 19.0215 -97.0547c-23.0576 -39.584 50.1436 -163.384 -82.3311 -295.86c-132.301 -132.298 -256.435 -59.3594 -295.857 -82.3291c-29.0459 -16.917 -68.9219 -9.11426 -97.0576 19.0205
+c-28.1221 28.1221 -35.9434 68.0029 -19.0215 97.0547c23.0566 39.5859 -50.1436 163.386 82.3301 295.86c132.308 132.309 256.407 59.3496 295.862 82.332c29.0498 16.9219 68.9307 9.09863 97.0537 -19.0234zM461.707 347.217
+c13.5166 23.2031 -27.7578 63.7314 -50.4883 50.4912c-66.6025 -38.7939 -165.646 45.5898 -286.081 -74.8457c-120.444 -120.445 -36.0449 -219.472 -74.8447 -286.08c-13.542 -23.2471 27.8145 -63.6953 50.4932 -50.4883
+c66.6006 38.7949 165.636 -45.5996 286.076 74.8428c120.444 120.445 36.0449 219.472 74.8447 286.08zM291.846 338.481c1.37012 -10.96 -6.40332 -20.957 -17.3643 -22.3271c-54.8467 -6.85547 -135.779 -87.7871 -142.636 -142.636
+c-1.37305 -10.9883 -11.3984 -18.7334 -22.3262 -17.3643c-10.9609 1.37012 -18.7344 11.3652 -17.3643 22.3262c9.16211 73.2852 104.167 168.215 177.364 177.364c10.9531 1.36816 20.9561 -6.40234 22.3262 -17.3633z" />
+    <glyph glyph-name="credit-card" unicode="&#xf09d;" horiz-adv-x="576" 
+d="M527.9 416c26.5996 0 48.0996 -21.5 48.0996 -48v-352c0 -26.5 -21.5 -48 -48.0996 -48h-479.801c-26.5996 0 -48.0996 21.5 -48.0996 48v352c0 26.5 21.5 48 48.0996 48h479.801zM54.0996 368c-3.2998 0 -6 -2.7002 -6 -6v-42h479.801v42c0 3.2998 -2.7002 6 -6 6
+h-467.801zM521.9 16c3.2998 0 6 2.7002 6 6v170h-479.801v-170c0 -3.2998 2.7002 -6 6 -6h467.801zM192 116v-40c0 -6.59961 -5.40039 -12 -12 -12h-72c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h72c6.59961 0 12 -5.40039 12 -12zM384 116v-40
+c0 -6.59961 -5.40039 -12 -12 -12h-136c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h136c6.59961 0 12 -5.40039 12 -12z" />
+    <glyph glyph-name="hdd" unicode="&#xf0a0;" horiz-adv-x="576" 
+d="M567.403 212.358c5.59668 -8.04688 8.59668 -17.6113 8.59668 -27.4121v-136.946c0 -26.5098 -21.4902 -48 -48 -48h-480c-26.5098 0 -48 21.4902 -48 48v136.946c0 8.30957 3.85156 20.5898 8.59668 27.4121l105.08 151.053
+c7.90625 11.3652 25.5596 20.5889 39.4033 20.5889h0.000976562h269.838h0.000976562c13.8438 0 31.4971 -9.22363 39.4033 -20.5889zM153.081 336l-77.9131 -112h425.664l-77.9131 112h-269.838zM528 48v128h-480v-128h480zM496 112c0 -17.6729 -14.3271 -32 -32 -32
+s-32 14.3271 -32 32s14.3271 32 32 32s32 -14.3271 32 -32zM400 112c0 -17.6729 -14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32s32 -14.3271 32 -32z" />
+    <glyph glyph-name="hand-point-right" unicode="&#xf0a4;" 
+d="M428.8 310.4c45.0996 0 83.2002 -38.1016 83.2002 -83.2002c0 -45.6162 -37.7646 -83.2002 -83.2002 -83.2002h-35.6475c-1.41602 -6.36719 -4.96875 -16.252 -7.92969 -22.0645c2.50586 -22.0059 -3.50293 -44.9775 -15.9844 -62.791
+c-1.14062 -52.4863 -37.3984 -91.1445 -99.9404 -91.1445h-21.2988c-60.0635 0 -98.5117 40 -127.2 40h-2.67871c-5.74707 -4.95215 -13.5361 -8 -22.1201 -8h-64c-17.6729 0 -32 12.8936 -32 28.7998v230.4c0 15.9062 14.3271 28.7998 32 28.7998h64.001
+c8.58398 0 16.373 -3.04785 22.1201 -8h2.67871c6.96387 0 14.8623 6.19336 30.1816 23.6689l0.128906 0.148438l0.130859 0.145508c8.85645 9.93652 18.1162 20.8398 25.8506 33.2529c18.7051 30.2471 30.3936 78.7842 75.707 78.7842c56.9277 0 92 -35.2861 92 -83.2002
+v-0.0839844c0 -6.21777 -0.974609 -16.2148 -2.17578 -22.3154h86.1768zM428.8 192c18.9756 0 35.2002 16.2246 35.2002 35.2002c0 18.7002 -16.7754 35.2002 -35.2002 35.2002h-158.399c0 17.3242 26.3994 35.1992 26.3994 70.3994c0 26.4004 -20.625 35.2002 -44 35.2002
+c-8.79395 0 -20.4443 -32.7119 -34.9258 -56.0996c-9.07422 -14.5752 -19.5244 -27.2256 -30.7988 -39.875c-16.1094 -18.374 -33.8359 -36.6328 -59.0752 -39.5967v-176.753c42.79 -3.7627 74.5088 -39.6758 120 -39.6758h21.2988
+c40.5244 0 57.124 22.1973 50.6006 61.3252c14.6113 8.00098 24.1514 33.9785 12.9248 53.625c19.3652 18.2246 17.7871 46.3809 4.9502 61.0498h91.0254zM88 64c0 13.2549 -10.7451 24 -24 24s-24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24z" />
+    <glyph glyph-name="hand-point-left" unicode="&#xf0a5;" 
+d="M0 227.2c0 45.0986 38.1006 83.2002 83.2002 83.2002h86.1758c-1.3623 6.91016 -2.17578 14.374 -2.17578 22.3994c0 47.9141 35.0723 83.2002 92 83.2002c45.3135 0 57.002 -48.5371 75.7061 -78.7852c7.73438 -12.4121 16.9951 -23.3154 25.8506 -33.2529
+l0.130859 -0.145508l0.128906 -0.148438c15.3213 -17.4746 23.2197 -23.668 30.1836 -23.668h2.67871c5.74707 4.95215 13.5361 8 22.1201 8h64c17.6729 0 32 -12.8936 32 -28.7998v-230.4c0 -15.9062 -14.3271 -28.7998 -32 -28.7998h-64
+c-8.58398 0 -16.373 3.04785 -22.1201 8h-2.67871c-28.6885 0 -67.1367 -40 -127.2 -40h-21.2988c-62.542 0 -98.8008 38.6582 -99.9404 91.1445c-12.4814 17.8135 -18.4922 40.7852 -15.9844 62.791c-2.96094 5.8125 -6.51367 15.6973 -7.92969 22.0645h-35.6465
+c-45.4355 0 -83.2002 37.584 -83.2002 83.2002zM48 227.2c0 -18.9756 16.2246 -35.2002 35.2002 -35.2002h91.0244c-12.8369 -14.6689 -14.415 -42.8252 4.9502 -61.0498c-11.2256 -19.6465 -1.68652 -45.624 12.9248 -53.625
+c-6.52246 -39.1279 10.0771 -61.3252 50.6016 -61.3252h21.2988c45.4912 0 77.21 35.9131 120 39.6768v176.752c-25.2393 2.96289 -42.9658 21.2227 -59.0752 39.5967c-11.2744 12.6494 -21.7246 25.2998 -30.7988 39.875
+c-14.4814 23.3877 -26.1318 56.0996 -34.9258 56.0996c-23.375 0 -44 -8.7998 -44 -35.2002c0 -35.2002 26.3994 -53.0752 26.3994 -70.3994h-158.399c-18.4248 0 -35.2002 -16.5 -35.2002 -35.2002zM448 88c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24
+s24 10.7451 24 24s-10.7451 24 -24 24z" />
+    <glyph glyph-name="hand-point-up" unicode="&#xf0a6;" horiz-adv-x="448" 
+d="M105.6 364.8c0 45.0996 38.1016 83.2002 83.2002 83.2002c45.6162 0 83.2002 -37.7646 83.2002 -83.2002v-35.6465c6.36719 -1.41602 16.252 -4.96875 22.0645 -7.92969c22.0059 2.50684 44.9775 -3.50293 62.791 -15.9844
+c52.4863 -1.14062 91.1445 -37.3984 91.1445 -99.9404v-21.2988c0 -60.0635 -40 -98.5117 -40 -127.2v-2.67871c4.95215 -5.74707 8 -13.5361 8 -22.1201v-64c0 -17.6729 -12.8936 -32 -28.7998 -32h-230.4c-15.9062 0 -28.7998 14.3271 -28.7998 32v64
+c0 8.58398 3.04785 16.373 8 22.1201v2.67871c0 6.96387 -6.19336 14.8623 -23.6689 30.1816l-0.148438 0.128906l-0.145508 0.130859c-9.93652 8.85645 -20.8398 18.1162 -33.2529 25.8506c-30.2471 18.7051 -78.7842 30.3936 -78.7842 75.707
+c0 56.9277 35.2861 92 83.2002 92h0.0839844c6.21777 0 16.2148 -0.974609 22.3154 -2.17578v86.1768zM224 364.8c0 18.9756 -16.2246 35.2002 -35.2002 35.2002c-18.7002 0 -35.2002 -16.7754 -35.2002 -35.2002v-158.399c-17.3242 0 -35.1992 26.3994 -70.3994 26.3994
+c-26.4004 0 -35.2002 -20.625 -35.2002 -44c0 -8.79395 32.7119 -20.4443 56.0996 -34.9258c14.5752 -9.07422 27.2256 -19.5244 39.875 -30.7988c18.374 -16.1094 36.6328 -33.8359 39.5967 -59.0752h176.753c3.7627 42.79 39.6758 74.5088 39.6758 120v21.2988
+c0 40.5244 -22.1973 57.124 -61.3252 50.6006c-8.00098 14.6113 -33.9785 24.1514 -53.625 12.9248c-18.2246 19.3652 -46.3809 17.7871 -61.0498 4.9502v91.0254zM352 24c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24z" />
+    <glyph glyph-name="hand-point-down" unicode="&#xf0a7;" horiz-adv-x="448" 
+d="M188.8 -64c-45.0986 0 -83.2002 38.1006 -83.2002 83.2002v86.1758c-6.91016 -1.3623 -14.374 -2.17578 -22.3994 -2.17578c-47.9141 0 -83.2002 35.0723 -83.2002 92c0 45.3135 48.5371 57.002 78.7852 75.707c12.4121 7.73438 23.3154 16.9951 33.2529 25.8506
+l0.145508 0.130859l0.148438 0.128906c17.4746 15.3213 23.668 23.2197 23.668 30.1836v2.67871c-4.95215 5.74707 -8 13.5361 -8 22.1201v64c0 17.6729 12.8936 32 28.7998 32h230.4c15.9062 0 28.7998 -14.3271 28.7998 -32v-64.001
+c0 -8.58398 -3.04785 -16.373 -8 -22.1201v-2.67871c0 -28.6885 40 -67.1367 40 -127.2v-21.2988c0 -62.542 -38.6582 -98.8008 -91.1445 -99.9404c-17.8135 -12.4814 -40.7852 -18.4922 -62.791 -15.9844c-5.8125 -2.96094 -15.6973 -6.51367 -22.0645 -7.92969v-35.6465
+c0 -45.4355 -37.584 -83.2002 -83.2002 -83.2002zM188.8 -16c18.9756 0 35.2002 16.2246 35.2002 35.2002v91.0244c14.6689 -12.8369 42.8252 -14.415 61.0498 4.9502c19.6465 -11.2256 45.624 -1.68652 53.625 12.9248c39.1279 -6.52246 61.3252 10.0771 61.3252 50.6016
+v21.2988c0 45.4912 -35.9131 77.21 -39.6768 120h-176.752c-2.96289 -25.2393 -21.2227 -42.9658 -39.5967 -59.0752c-12.6494 -11.2744 -25.2998 -21.7246 -39.875 -30.7988c-23.3877 -14.4814 -56.0996 -26.1318 -56.0996 -34.9258c0 -23.375 8.7998 -44 35.2002 -44
+c35.2002 0 53.0752 26.3994 70.3994 26.3994v-158.399c0 -18.4248 16.5 -35.2002 35.2002 -35.2002zM328 384c0 -13.2549 10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24s-24 -10.7451 -24 -24z" />
+    <glyph glyph-name="copy" unicode="&#xf0c5;" horiz-adv-x="448" 
+d="M433.941 382.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-268.118c0 -26.5098 -21.4902 -48 -48 -48h-80v-48c0 -26.5098 -21.4902 -48 -48 -48h-224c-26.5098 0 -48 21.4902 -48 48v320c0 26.5098 21.4902 48 48 48h80v48c0 26.5098 21.4902 48 48 48
+h172.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM266 -16c3.31152 0 6 2.68848 6 6v42h-96c-26.5098 0 -48 21.4902 -48 48v224h-74c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h212zM394 80c3.31152 0 6 2.68848 6 6v202h-88
+c-13.2549 0 -24 10.7451 -24 24v88h-106c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h212zM400 336v9.63184v0.000976562c0 1.37207 -0.787109 3.27246 -1.75684 4.24219l-48.3682 48.3682c-1.12598 1.125 -2.65234 1.75684 -4.24316 1.75684h-9.63184
+v-64h64z" />
+    <glyph glyph-name="save" unicode="&#xf0c7;" horiz-adv-x="448" 
+d="M433.941 318.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-268.118c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h268.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM272 368h-128v-80h128v80
+zM394 16c3.31152 0 6 2.68848 6 6v259.632v0.000976562c0 1.37207 -0.787109 3.27246 -1.75684 4.24219l-78.2432 78.2432v-100.118c0 -13.2549 -10.7451 -24 -24 -24h-176c-13.2549 0 -24 10.7451 -24 24v104h-42c-3.31152 0 -6 -2.68848 -6 -6v-340
+c0 -3.31152 2.68848 -6 6 -6h340zM224 216c48.5234 0 88 -39.4766 88 -88s-39.4766 -88 -88 -88s-88 39.4766 -88 88s39.4766 88 88 88zM224 88c22.0557 0 40 17.9443 40 40s-17.9443 40 -40 40s-40 -17.9443 -40 -40s17.9443 -40 40 -40z" />
+    <glyph glyph-name="square" unicode="&#xf0c8;" horiz-adv-x="448" 
+d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM394 16c3.2998 0 6 2.7002 6 6v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340z" />
+    <glyph glyph-name="envelope" unicode="&#xf0e0;" 
+d="M464 384c26.5098 0 48 -21.4902 48 -48v-288c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h416zM464 336h-416v-40.8047c22.4248 -18.2627 58.1797 -46.6602 134.587 -106.49
+c16.834 -13.2422 50.2051 -45.0762 73.4131 -44.7012c23.2119 -0.371094 56.5723 31.4541 73.4131 44.7012c76.4189 59.8389 112.165 88.2305 134.587 106.49v40.8047zM48 48h416v185.601c-22.915 -18.252 -55.4189 -43.8691 -104.947 -82.6523
+c-22.5439 -17.748 -60.3359 -55.1787 -103.053 -54.9473c-42.9277 -0.231445 -81.2051 37.75 -103.062 54.9551c-49.5293 38.7842 -82.0244 64.3945 -104.938 82.6455v-185.602z" />
+    <glyph glyph-name="lightbulb" unicode="&#xf0eb;" horiz-adv-x="352" 
+d="M176 368c8.83984 0 16 -7.16016 16 -16s-7.16016 -16 -16 -16c-35.2803 0 -64 -28.7002 -64 -64c0 -8.83984 -7.16016 -16 -16 -16s-16 7.16016 -16 16c0 52.9404 43.0596 96 96 96zM96.0596 -11.1699l-0.0400391 43.1797h159.961l-0.0507812 -43.1797
+c-0.00976562 -3.13965 -0.939453 -6.21973 -2.67969 -8.83984l-24.5098 -36.8398c-2.95996 -4.45996 -7.95996 -7.14062 -13.3203 -7.14062h-78.8496c-5.35059 0 -10.3506 2.68066 -13.3203 7.14062l-24.5098 36.8398c-1.75 2.62012 -2.68066 5.68945 -2.68066 8.83984z
+M176 448c97.2002 0 176 -78.7998 176 -176c0 -44.3701 -16.4502 -84.8496 -43.5498 -115.79c-16.6406 -18.9795 -42.7402 -58.79 -52.4199 -92.1602v-0.0498047h-48v0.0996094c0.00390625 4.04199 0.999023 10.4482 2.21973 14.3008
+c5.67969 17.9893 22.9902 64.8496 62.0996 109.46c20.4102 23.29 31.6504 53.1699 31.6504 84.1396c0 70.5801 -57.4199 128 -128 128c-68.2803 0 -128.15 -54.3604 -127.95 -128c0.0898438 -30.9902 11.0703 -60.71 31.6104 -84.1396
+c39.3496 -44.9004 56.5801 -91.8604 62.1699 -109.67c1.42969 -4.56055 2.13965 -9.30078 2.15039 -14.0703v-0.120117h-48v0.0595703c-9.68066 33.3604 -35.7803 73.1709 -52.4209 92.1602c-27.1094 30.9307 -43.5596 71.4102 -43.5596 115.78
+c0 93.0303 73.7197 176 176 176z" />
+    <glyph glyph-name="bell" unicode="&#xf0f3;" horiz-adv-x="448" 
+d="M439.39 85.71c6 -6.44043 8.66016 -14.1602 8.61035 -21.71c-0.0996094 -16.4004 -12.9805 -32 -32.0996 -32h-383.801c-19.1191 0 -31.9893 15.5996 -32.0996 32c-0.0498047 7.5498 2.61035 15.2598 8.61035 21.71c19.3193 20.7598 55.4697 51.9902 55.4697 154.29
+c0 77.7002 54.4795 139.9 127.939 155.16v20.8398c0 17.6699 14.3203 32 31.9805 32s31.9805 -14.3301 31.9805 -32v-20.8398c73.46 -15.2598 127.939 -77.46 127.939 -155.16c0 -102.3 36.1504 -133.53 55.4697 -154.29zM67.5303 80h312.939
+c-21.2197 27.96 -44.4199 74.3203 -44.5293 159.42c0 0.200195 0.0595703 0.379883 0.0595703 0.580078c0 61.8604 -50.1396 112 -112 112s-112 -50.1396 -112 -112c0 -0.200195 0.0595703 -0.379883 0.0595703 -0.580078
+c-0.109375 -85.0898 -23.3096 -131.45 -44.5293 -159.42zM224 -64c-35.3203 0 -63.9697 28.6504 -63.9697 64h127.939c0 -35.3496 -28.6494 -64 -63.9697 -64z" />
+    <glyph glyph-name="hospital" unicode="&#xf0f8;" horiz-adv-x="448" 
+d="M128 204v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12zM268 192c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40
+c0 -6.62695 -5.37305 -12 -12 -12h-40zM192 108c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40zM268 96c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40
+c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-40zM448 -28v-36h-448v36c0 6.62695 5.37305 12 12 12h19.5v378.965c0 11.6172 10.7451 21.0352 24 21.0352h88.5v40c0 13.2549 10.7451 24 24 24h112c13.2549 0 24 -10.7451 24 -24v-40h88.5
+c13.2549 0 24 -9.41797 24 -21.0352v-378.965h19.5c6.62695 0 12 -5.37305 12 -12zM79.5 -15h112.5v67c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-67h112.5v351h-64.5v-24c0 -13.2549 -10.7451 -24 -24 -24h-112c-13.2549 0 -24 10.7451 -24 24v24
+h-64.5v-351zM266 384h-26v26c0 3.31152 -2.68848 6 -6 6h-20c-3.31152 0 -6 -2.68848 -6 -6v-26h-26c-3.31152 0 -6 -2.68848 -6 -6v-20c0 -3.31152 2.68848 -6 6 -6h26v-26c0 -3.31152 2.68848 -6 6 -6h20c3.31152 0 6 2.68848 6 6v26h26c3.31152 0 6 2.68848 6 6v20
+c0 3.31152 -2.68848 6 -6 6z" />
+    <glyph glyph-name="plus-square" unicode="&#xf0fe;" horiz-adv-x="448" 
+d="M352 208v-32c0 -6.59961 -5.40039 -12 -12 -12h-88v-88c0 -6.59961 -5.40039 -12 -12 -12h-32c-6.59961 0 -12 5.40039 -12 12v88h-88c-6.59961 0 -12 5.40039 -12 12v32c0 6.59961 5.40039 12 12 12h88v88c0 6.59961 5.40039 12 12 12h32c6.59961 0 12 -5.40039 12 -12
+v-88h88c6.59961 0 12 -5.40039 12 -12zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340
+c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
+    <glyph glyph-name="circle" unicode="&#xf111;" 
+d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200z" />
+    <glyph glyph-name="smile" unicode="&#xf118;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
+s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM332 135.4c8.5 10.1992 23.7002 11.5 33.7998 3.09961c10.2002 -8.5 11.6006 -23.5996 3.10059 -33.7998
+c-30 -36 -74.1006 -56.6006 -120.9 -56.6006s-90.9004 20.6006 -120.9 56.6006c-8.39941 10.2002 -7.09961 25.2998 3.10059 33.7998c10.0996 8.40039 25.2998 7.09961 33.7998 -3.09961c20.7998 -25.1006 51.5 -39.4004 84 -39.4004s63.2002 14.4004 84 39.4004z" />
+    <glyph glyph-name="frown" unicode="&#xf119;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
+s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM248 144c40.2002 0 78 -17.7002 103.8 -48.5996c8.40039 -10.2002 7.10059 -25.3008 -3.09961 -33.8008
+c-10.7002 -8.7998 -25.7002 -6.59961 -33.7998 3.10059c-16.6006 20 -41 31.3994 -66.9004 31.3994s-50.2998 -11.5 -66.9004 -31.3994c-8.5 -10.2002 -23.5996 -11.5 -33.7998 -3.10059c-10.2002 8.5 -11.5996 23.6006 -3.09961 33.8008
+c25.7998 30.8994 63.5996 48.5996 103.8 48.5996z" />
+    <glyph glyph-name="meh" unicode="&#xf11a;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
+s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM336 128c13.2002 0 24 -10.7998 24 -24s-10.7998 -24 -24 -24h-176c-13.2002 0 -24 10.7998 -24 24s10.7998 24 24 24h176z
+" />
+    <glyph glyph-name="keyboard" unicode="&#xf11c;" horiz-adv-x="576" 
+d="M528 384c26.5098 0 48 -21.4902 48 -48v-288c0 -26.5098 -21.4902 -48 -48 -48h-480c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h480zM536 48v288c0 4.41113 -3.58887 8 -8 8h-480c-4.41113 0 -8 -3.58887 -8 -8v-288c0 -4.41113 3.58887 -8 8 -8
+h480c4.41113 0 8 3.58887 8 8zM170 178c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM266 178c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28
+c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM362 178c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM458 178c0 -6.62695 -5.37305 -12 -12 -12h-28
+c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM122 96c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM506 96
+c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM122 260c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28
+c6.62695 0 12 -5.37305 12 -12v-28zM218 260c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM314 260c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28
+c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM410 260c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM506 260c0 -6.62695 -5.37305 -12 -12 -12h-28
+c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM408 102c0 -6.62695 -5.37305 -12 -12 -12h-216c-6.62695 0 -12 5.37305 -12 12v16c0 6.62695 5.37305 12 12 12h216c6.62695 0 12 -5.37305 12 -12v-16z" />
+    <glyph glyph-name="calendar" unicode="&#xf133;" horiz-adv-x="448" 
+d="M400 384c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12
+v-52h48zM394 -16c3.2998 0 6 2.7002 6 6v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340z" />
+    <glyph glyph-name="play-circle" unicode="&#xf144;" 
+d="M371.7 210c16.3994 -9.2002 16.3994 -32.9004 0 -42l-176 -101c-15.9004 -8.7998 -35.7002 2.59961 -35.7002 21v208c0 18.5 19.9004 29.7998 35.7002 21zM504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM56 192
+c0 -110.5 89.5 -200 200 -200s200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200z" />
+    <glyph glyph-name="minus-square" unicode="&#xf146;" horiz-adv-x="448" 
+d="M108 164c-6.59961 0 -12 5.40039 -12 12v32c0 6.59961 5.40039 12 12 12h232c6.59961 0 12 -5.40039 12 -12v-32c0 -6.59961 -5.40039 -12 -12 -12h-232zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352
+c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
+    <glyph glyph-name="check-square" unicode="&#xf14a;" horiz-adv-x="448" 
+d="M400 416c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h352zM400 16v352h-352v-352h352zM364.136 257.724l-172.589 -171.204
+c-4.70508 -4.66699 -12.3027 -4.63672 -16.9697 0.0683594l-90.7812 91.5156c-4.66699 4.70508 -4.63672 12.3037 0.0693359 16.9717l22.7188 22.5361c4.70508 4.66699 12.3027 4.63672 16.9697 -0.0693359l59.792 -60.2773l141.353 140.217
+c4.70508 4.66699 12.3027 4.63672 16.9697 -0.0683594l22.5361 -22.7178c4.66699 -4.70605 4.63672 -12.3047 -0.0683594 -16.9717z" />
+    <glyph glyph-name="share-square" unicode="&#xf14d;" horiz-adv-x="576" 
+d="M561.938 289.94c18.75 -18.7402 18.75 -49.1406 0 -67.8809l-143.998 -144c-29.9727 -29.9727 -81.9404 -9.05273 -81.9404 33.9404v53.7998c-101.266 -7.83691 -99.625 -31.6406 -84.1104 -78.7598c14.2285 -43.0889 -33.4736 -79.248 -71.0195 -55.7402
+c-51.6924 32.3057 -84.8701 83.0635 -84.8701 144.76c0 39.3408 12.2197 72.7402 36.3301 99.3008c19.8398 21.8398 47.7402 38.4697 82.9102 49.4199c36.7295 11.4395 78.3096 16.1094 120.76 17.9893v57.1982c0 42.9355 51.9258 63.9541 81.9404 33.9404zM384 112l144 144
+l-144 144v-104.09c-110.86 -0.90332 -240 -10.5166 -240 -119.851c0 -52.1396 32.79 -85.6094 62.3096 -104.06c-39.8174 120.65 48.999 141.918 177.69 143.84v-103.84zM408.74 27.5068c6.14844 1.75684 15.5449 5.92383 20.9736 9.30273
+c7.97656 4.95215 18.2861 -0.825195 18.2861 -10.2139v-42.5957c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h132c6.62695 0 12 -5.37305 12 -12v-4.48633c0 -4.91699 -2.9873 -9.36914 -7.56934 -11.1514
+c-13.7021 -5.33105 -26.3955 -11.5371 -38.0498 -18.585c-1.59668 -0.974609 -4.41016 -1.77051 -6.28027 -1.77734h-86.1006c-3.31152 0 -6 -2.68848 -6 -6v-340c0 -3.31152 2.68848 -6 6 -6h340c3.31152 0 6 2.68848 6 6v25.9658c0 5.37012 3.5791 10.0596 8.74023 11.541
+z" />
+    <glyph glyph-name="compass" unicode="&#xf14e;" horiz-adv-x="496" 
+d="M347.94 318.14c16.6592 7.61035 33.8096 -9.54004 26.1992 -26.1992l-65.9697 -144.341c-2.73047 -5.97363 -9.7959 -13.0391 -15.7695 -15.7695l-144.341 -65.9697c-16.6592 -7.61035 -33.8096 9.5498 -26.1992 26.1992l65.9697 144.341
+c2.73047 5.97363 9.7959 13.0391 15.7695 15.7695zM270.58 169.42c12.4697 12.4697 12.4697 32.6904 0 45.1602s-32.6904 12.4697 -45.1602 0s-12.4697 -32.6904 0 -45.1602s32.6904 -12.4697 45.1602 0zM248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248
+s-248 111.03 -248 248s111.03 248 248 248zM248 -8c110.28 0 200 89.7197 200 200s-89.7197 200 -200 200s-200 -89.7197 -200 -200s89.7197 -200 200 -200z" />
+    <glyph glyph-name="caret-square-down" unicode="&#xf150;" horiz-adv-x="448" 
+d="M125.1 240h197.801c10.6992 0 16.0996 -13 8.5 -20.5l-98.9004 -98.2998c-4.7002 -4.7002 -12.2002 -4.7002 -16.9004 0l-98.8994 98.2998c-7.7002 7.5 -2.2998 20.5 8.39941 20.5zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352
+c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
+    <glyph glyph-name="caret-square-up" unicode="&#xf151;" horiz-adv-x="448" 
+d="M322.9 144h-197.801c-10.6992 0 -16.0996 13 -8.5 20.5l98.9004 98.2998c4.7002 4.7002 12.2002 4.7002 16.9004 0l98.8994 -98.2998c7.7002 -7.5 2.2998 -20.5 -8.39941 -20.5zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352
+c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
+    <glyph glyph-name="caret-square-right" unicode="&#xf152;" horiz-adv-x="448" 
+d="M176 93.0996v197.801c0 10.6992 13 16.0996 20.5 8.5l98.2998 -98.9004c4.7002 -4.7002 4.7002 -12.2002 0 -16.9004l-98.2998 -98.8994c-7.5 -7.7002 -20.5 -2.2998 -20.5 8.39941zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352
+c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
+    <glyph glyph-name="file" unicode="&#xf15b;" horiz-adv-x="384" 
+d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
+h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416z" />
+    <glyph glyph-name="file-alt" unicode="&#xf15c;" horiz-adv-x="384" 
+d="M288 200v-28c0 -6.59961 -5.40039 -12 -12 -12h-168c-6.59961 0 -12 5.40039 -12 12v28c0 6.59961 5.40039 12 12 12h168c6.59961 0 12 -5.40039 12 -12zM276 128c6.59961 0 12 -5.40039 12 -12v-28c0 -6.59961 -5.40039 -12 -12 -12h-168c-6.59961 0 -12 5.40039 -12 12
+v28c0 6.59961 5.40039 12 12 12h168zM384 316.1v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996l83.9004 -83.9004c9 -8.90039 14.0996 -21.2002 14.0996 -33.9004z
+M256 396.1v-76.0996h76.0996zM336 -16v288h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416h288z" />
+    <glyph glyph-name="thumbs-up" unicode="&#xf164;" 
+d="M466.27 161.31c4.6748 -22.6465 0.864258 -44.5371 -8.98926 -62.9893c2.95898 -23.8682 -4.02148 -48.5654 -17.3398 -66.9902c-0.954102 -55.9072 -35.8232 -95.3301 -112.94 -95.3301c-7 0 -15 0.00976562 -22.2197 0.00976562
+c-102.742 0 -133.293 38.9395 -177.803 39.9404c-3.56934 -13.7764 -16.085 -23.9502 -30.9775 -23.9502h-64c-17.6729 0 -32 14.3271 -32 32v240c0 17.6729 14.3271 32 32 32h98.7598c19.1455 16.9531 46.0137 60.6533 68.7598 83.4004
+c13.667 13.667 10.1533 108.6 71.7607 108.6c57.5801 0 95.2695 -31.9355 95.2695 -104.73c0 -18.4092 -3.92969 -33.7295 -8.84961 -46.5391h36.4795c48.6025 0 85.8203 -41.5654 85.8203 -85.5801c0 -19.1504 -4.95996 -34.9902 -13.7305 -49.8408zM404.52 107.48
+c21.5811 20.3838 18.6992 51.0645 5.21094 65.6191c9.44922 0 22.3594 18.9102 22.2695 37.8105c-0.0898438 18.9102 -16.71 37.8203 -37.8203 37.8203h-103.989c0 37.8193 28.3594 55.3691 28.3594 94.5391c0 23.75 0 56.7305 -47.2695 56.7305
+c-18.9102 -18.9102 -9.45996 -66.1797 -37.8203 -94.54c-26.5596 -26.5703 -66.1797 -97.46 -94.54 -97.46h-10.9199v-186.17c53.6113 0 100.001 -37.8203 171.64 -37.8203h37.8203c35.5117 0 60.8203 17.1201 53.1201 65.9004
+c15.2002 8.16016 26.5 36.4395 13.9395 57.5703zM88 16c0 13.2549 -10.7451 24 -24 24s-24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24z" />
+    <glyph glyph-name="thumbs-down" unicode="&#xf165;" 
+d="M466.27 222.69c8.77051 -14.8506 13.7305 -30.6904 13.7305 -49.8408c0 -44.0146 -37.2178 -85.5801 -85.8203 -85.5801h-36.4795c4.91992 -12.8096 8.84961 -28.1299 8.84961 -46.5391c0 -72.7949 -37.6895 -104.73 -95.2695 -104.73
+c-61.6074 0 -58.0938 94.9326 -71.7607 108.6c-22.7461 22.7471 -49.6133 66.4473 -68.7598 83.4004h-7.05176c-5.5332 -9.56152 -15.8662 -16 -27.708 -16h-64c-17.6729 0 -32 14.3271 -32 32v240c0 17.6729 14.3271 32 32 32h64c8.11328 0 15.5146 -3.02539 21.1553 -8
+h10.8447c40.9971 0 73.1953 39.9902 176.78 39.9902c7.21973 0 15.2197 0.00976562 22.2197 0.00976562c77.1172 0 111.986 -39.4229 112.94 -95.3301c13.3184 -18.4248 20.2979 -43.1221 17.3398 -66.9902c9.85352 -18.4521 13.6641 -40.3428 8.98926 -62.9893zM64 152
+c13.2549 0 24 10.7451 24 24s-10.7451 24 -24 24s-24 -10.7451 -24 -24s10.7451 -24 24 -24zM394.18 135.27c21.1104 0 37.7305 18.9102 37.8203 37.8203c0.0898438 18.9004 -12.8203 37.8105 -22.2695 37.8105c13.4883 14.5547 16.3701 45.2354 -5.21094 65.6191
+c12.5605 21.1309 1.26074 49.4102 -13.9395 57.5703c7.7002 48.7803 -17.6084 65.9004 -53.1201 65.9004h-37.8203c-71.6387 0 -118.028 -37.8203 -171.64 -37.8203v-186.17h10.9199c28.3604 0 67.9805 -70.8896 94.54 -97.46
+c28.3604 -28.3604 18.9102 -75.6299 37.8203 -94.54c47.2695 0 47.2695 32.9805 47.2695 56.7305c0 39.1699 -28.3594 56.7197 -28.3594 94.5391h103.989z" />
+    <glyph glyph-name="sun" unicode="&#xf185;" 
+d="M494.2 226.1c11.2002 -7.59961 17.7998 -20.0996 17.8994 -33.6992c0 -13.4004 -6.69922 -26 -17.7998 -33.5l-59.7998 -40.5l13.7002 -71c2.5 -13.2002 -1.60059 -26.8008 -11.1006 -36.3008s-22.8994 -13.7998 -36.2998 -11.0996l-70.8994 13.7002l-40.4004 -59.9004
+c-7.5 -11.0996 -20.0996 -17.7998 -33.5 -17.7998s-26 6.7002 -33.5 17.9004l-40.4004 59.8994l-70.7998 -13.7002c-13.3994 -2.59961 -26.7998 1.60059 -36.2998 11.1006s-13.7002 23.0996 -11.0996 36.2998l13.6992 71l-59.7998 40.5
+c-11.0996 7.5 -17.7998 20 -17.7998 33.5s6.59961 26 17.7998 33.5996l59.7998 40.5l-13.6992 71c-2.60059 13.2002 1.59961 26.7002 11.0996 36.3008c9.5 9.59961 23 13.6992 36.2998 11.1992l70.7998 -13.6992l40.4004 59.8994c15.0996 22.2998 51.9004 22.2998 67 0
+l40.4004 -59.8994l70.8994 13.6992c13 2.60059 26.6006 -1.59961 36.2002 -11.0996c9.5 -9.59961 13.7002 -23.2002 11.0996 -36.4004l-13.6992 -71zM381.3 140.5l76.7998 52.0996l-76.7998 52l17.6006 91.1006l-91 -17.6006l-51.9004 76.9004l-51.7998 -76.7998
+l-91 17.5996l17.5996 -91.2002l-76.7998 -52l76.7998 -52l-17.5996 -91.1992l90.8994 17.5996l51.9004 -77l51.9004 76.9004l91 -17.6006zM256 296c57.2998 0 104 -46.7002 104 -104s-46.7002 -104 -104 -104s-104 46.7002 -104 104s46.7002 104 104 104zM256 136
+c30.9004 0 56 25.0996 56 56s-25.0996 56 -56 56s-56 -25.0996 -56 -56s25.0996 -56 56 -56z" />
+    <glyph glyph-name="moon" unicode="&#xf186;" 
+d="M279.135 -64c-141.424 0 -256 114.64 -256 256c0 141.425 114.641 256 256 256c13.0068 -0.00195312 33.9443 -1.91797 46.7354 -4.27734c44.0205 -8.13086 53.7666 -66.8691 15.0215 -88.9189c-41.374 -23.5439 -67.4336 -67.4121 -67.4336 -115.836
+c0 -83.5234 75.9238 -146.475 158.272 -130.792c43.6904 8.32129 74.5186 -42.5693 46.248 -77.4004c-47.8613 -58.9717 -120.088 -94.7754 -198.844 -94.7754zM279.135 400c-114.875 0 -208 -93.125 -208 -208s93.125 -208 208 -208
+c65.2314 0 123.439 30.0361 161.575 77.0244c-111.611 -21.2568 -215.252 64.0957 -215.252 177.943c0 67.5127 36.9326 126.392 91.6934 157.555c-12.3271 2.27637 -25.0312 3.47754 -38.0166 3.47754z" />
+    <glyph glyph-name="caret-square-left" unicode="&#xf191;" horiz-adv-x="448" 
+d="M272 290.9v-197.801c0 -10.6992 -13 -16.0996 -20.5 -8.5l-98.2998 98.9004c-4.7002 4.7002 -4.7002 12.2002 0 16.9004l98.2998 98.8994c7.5 7.7002 20.5 2.2998 20.5 -8.39941zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352
+c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
+    <glyph glyph-name="dot-circle" unicode="&#xf192;" 
+d="M256 392c-110.549 0 -200 -89.4678 -200 -200c0 -110.549 89.4678 -200 200 -200c110.549 0 200 89.4678 200 200c0 110.549 -89.4678 200 -200 200zM256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248z
+M256 272c44.1826 0 80 -35.8174 80 -80s-35.8174 -80 -80 -80s-80 35.8174 -80 80s35.8174 80 80 80z" />
+    <glyph glyph-name="building" unicode="&#xf1ad;" horiz-adv-x="448" 
+d="M128 300v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12zM268 288c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40
+c0 -6.59961 -5.40039 -12 -12 -12h-40zM140 192c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-40zM268 192c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40
+c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-40zM192 108c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM268 96c-6.59961 0 -12 5.40039 -12 12v40
+c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-40zM448 -28v-36h-448v36c0 6.59961 5.40039 12 12 12h19.5v440c0 13.2998 10.7002 24 24 24h337c13.2998 0 24 -10.7002 24 -24v-440h19.5
+c6.59961 0 12 -5.40039 12 -12zM79.5 -15h112.5v67c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-67h112.5v414l-288.5 1z" />
+    <glyph glyph-name="file-pdf" unicode="&#xf1c1;" horiz-adv-x="384" 
+d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
+h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM298.2 127.7c10.5 -10.5 8 -38.7002 -17.5 -38.7002c-14.7998 0 -36.9004 6.7998 -55.7998 17c-21.6006 -3.59961 -46 -12.7002 -68.4004 -20.0996c-50.0996 -86.4004 -79.4004 -47 -76.0996 -31.2002
+c4 20 31 35.8994 51 46.2002c10.5 18.3994 25.3994 50.5 35.3994 74.3994c-7.39941 28.6006 -11.3994 51 -7 67.1006c4.7998 17.6992 38.4004 20.2998 42.6006 -5.90039c4.69922 -15.4004 -1.5 -39.9004 -5.40039 -56c8.09961 -21.2998 19.5996 -35.7998 36.7998 -46.2998
+c17.4004 2.2002 52.2002 5.5 64.4004 -6.5zM100.1 49.9004c0 -0.700195 11.4004 4.69922 30.4004 35c-5.90039 -5.5 -25.2998 -21.3008 -30.4004 -35zM181.7 240.5c-2.5 0 -2.60059 -26.9004 1.7998 -40.7998c4.90039 8.7002 5.59961 40.7998 -1.7998 40.7998zM157.3 103.9
+c15.9004 6.09961 34 14.8994 54.7998 19.1992c-11.1992 8.30078 -21.7998 20.4004 -30.0996 35.5c-6.7002 -17.6992 -15 -37.7998 -24.7002 -54.6992zM288.9 108.9c3.59961 2.39941 -2.2002 10.3994 -37.3008 7.7998c32.3008 -13.7998 37.3008 -7.7998 37.3008 -7.7998z" />
+    <glyph glyph-name="file-word" unicode="&#xf1c2;" horiz-adv-x="384" 
+d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
+h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM268.1 192v0.200195h15.8008c7.7998 0 13.5 -7.2998 11.5996 -14.9004c-4.2998 -17 -13.7002 -54.0996 -34.5 -136c-1.2998 -5.39941 -6.09961 -9.09961 -11.5996 -9.09961h-24.7002
+c-5.5 0 -10.2998 3.7998 -11.6006 9.09961c-5.2998 20.9004 -17.7998 71 -17.8994 71.4004l-2.90039 17.2998c-0.5 -5.2998 -1.5 -11.0996 -3 -17.2998l-17.8994 -71.4004c-1.30078 -5.39941 -6.10059 -9.09961 -11.6006 -9.09961h-25.2002
+c-5.59961 0 -10.3994 3.7002 -11.6992 9.09961c-6.5 26.5 -25.2002 103.4 -33.2002 136c-1.7998 7.5 3.89941 14.7998 11.7002 14.7998h16.7998c5.7998 0 10.7002 -4.09961 11.7998 -9.69922c5 -25.7002 18.4004 -93.8008 19.0996 -99
+c0.300781 -1.7002 0.400391 -3.10059 0.5 -4.2002c0.800781 7.5 0.400391 4.7002 24.8008 103.7c1.39941 5.2998 6.19922 9.09961 11.6992 9.09961h13.3008c5.59961 0 10.3994 -3.7998 11.6992 -9.2002c23.9004 -99.7002 22.8008 -94.3994 23.6006 -99.5
+c0.299805 -1.7002 0.5 -3.09961 0.700195 -4.2998c0.599609 8.09961 0.399414 5.7998 21 103.5c1.09961 5.5 6 9.5 11.6992 9.5z" />
+    <glyph glyph-name="file-excel" unicode="&#xf1c3;" horiz-adv-x="384" 
+d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
+h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM260 224c9.2002 0 15 -10 10.2998 -18c-16 -27.5 -45.5996 -76.9004 -46.2998 -78l46.4004 -78c4.59961 -8 -1.10059 -18 -10.4004 -18h-28.7998c-4.40039 0 -8.5 2.40039 -10.6006 6.2998
+c-22.6992 41.7998 -13.6992 27.5 -28.5996 57.7002c-5.59961 -12.7002 -6.90039 -17.7002 -28.5996 -57.7002c-2.10059 -3.89941 -6.10059 -6.2998 -10.5 -6.2998h-28.9004c-9.2998 0 -15.0996 10 -10.4004 18l46.3008 78l-46.3008 78c-4.59961 8 1.10059 18 10.4004 18
+h28.9004c4.39941 0 8.5 -2.40039 10.5996 -6.2998c21.7002 -40.4004 14.7002 -28.6006 28.5996 -57.7002c6.40039 15.2998 10.6006 24.5996 28.6006 57.7002c2.09961 3.89941 6.09961 6.2998 10.5 6.2998h28.7998z" />
+    <glyph glyph-name="file-powerpoint" unicode="&#xf1c4;" horiz-adv-x="384" 
+d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
+h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM120 44v168c0 6.59961 5.40039 12 12 12h69.2002c36.7002 0 62.7998 -27 62.7998 -66.2998c0 -74.2998 -68.7002 -66.5 -95.5 -66.5v-47.2002c0 -6.59961 -5.40039 -12 -12 -12h-24.5c-6.59961 0 -12 5.40039 -12 12z
+M168.5 131.4h23c7.90039 0 13.9004 2.39941 18.0996 7.19922c8.5 9.80078 8.40039 28.5 0.100586 37.8008c-4.10059 4.59961 -9.90039 7 -17.4004 7h-23.8994v-52h0.0996094z" />
+    <glyph glyph-name="file-image" unicode="&#xf1c5;" horiz-adv-x="384" 
+d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
+h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM80 32v64l39.5 39.5c4.7002 4.7002 12.2998 4.7002 17 0l39.5 -39.5l87.5 87.5c4.7002 4.7002 12.2998 4.7002 17 0l23.5 -23.5v-128h-224zM128 272c26.5 0 48 -21.5 48 -48s-21.5 -48 -48 -48s-48 21.5 -48 48
+s21.5 48 48 48z" />
+    <glyph glyph-name="file-archive" unicode="&#xf1c6;" horiz-adv-x="384" 
+d="M128.3 288h32v-32h-32v32zM192.3 384v-32h-32v32h32zM128.3 352h32v-32h-32v32zM192.3 320v-32h-32v32h32zM369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1
+c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM256 396.1v-76.0996h76.0996zM336 -16v288h-104c-13.2998 0 -24 10.7002 -24 24v104h-48.2998v-16h-32v16h-79.7002v-416h288zM194.2 182.3l17.2998 -87.7002c6.40039 -32.3994 -18.4004 -62.5996 -51.5 -62.5996
+c-33.2002 0 -58 30.4004 -51.4004 62.9004l19.7002 97.0996v32h32v-32h22.1006c5.7998 0 10.6992 -4.09961 11.7998 -9.7002zM160.3 57.9004c17.9004 0 32.4004 12.0996 32.4004 27c0 14.8994 -14.5 27 -32.4004 27c-17.8994 0 -32.3994 -12.1006 -32.3994 -27
+c0 -14.9004 14.5 -27 32.3994 -27zM192.3 256v-32h-32v32h32z" />
+    <glyph glyph-name="file-audio" unicode="&#xf1c7;" horiz-adv-x="384" 
+d="M369.941 350.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-332.118c0 -26.5098 -21.4902 -48 -48 -48h-288c-26.5098 0 -48 21.4902 -48 48v416c0 26.5098 21.4902 48 48 48h204.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM332.118 320
+l-76.1182 76.1182v-76.1182h76.1182zM48 -16h288v288h-104c-13.2549 0 -24 10.7451 -24 24v104h-160v-416zM192 60.0244c0 -10.6914 -12.9258 -16.0459 -20.4854 -8.48535l-35.5146 35.9746h-28c-6.62695 0 -12 5.37305 -12 12v56c0 6.62695 5.37305 12 12 12h28
+l35.5146 36.9473c7.56055 7.56055 20.4854 2.20605 20.4854 -8.48535v-135.951zM233.201 107.154c9.05078 9.29688 9.05957 24.1328 0.000976562 33.4385c-22.1494 22.752 12.2344 56.2461 34.3945 33.4814c27.1982 -27.9404 27.2119 -72.4443 0.000976562 -100.401
+c-21.793 -22.3857 -56.9463 10.3154 -34.3965 33.4814z" />
+    <glyph glyph-name="file-video" unicode="&#xf1c8;" horiz-adv-x="384" 
+d="M369.941 350.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-332.118c0 -26.5098 -21.4902 -48 -48 -48h-288c-26.5098 0 -48 21.4902 -48 48v416c0 26.5098 21.4902 48 48 48h204.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM332.118 320
+l-76.1182 76.1182v-76.1182h76.1182zM48 -16h288v288h-104c-13.2549 0 -24 10.7451 -24 24v104h-160v-416zM276.687 195.303c10.0049 10.0049 27.3135 2.99707 27.3135 -11.3135v-111.976c0 -14.2939 -17.2959 -21.332 -27.3135 -11.3135l-52.6865 52.6738v-37.374
+c0 -11.0459 -8.9541 -20 -20 -20h-104c-11.0459 0 -20 8.9541 -20 20v104c0 11.0459 8.9541 20 20 20h104c11.0459 0 20 -8.9541 20 -20v-37.374z" />
+    <glyph glyph-name="file-code" unicode="&#xf1c9;" horiz-adv-x="384" 
+d="M149.9 98.9004c3.5 -3.30078 3.69922 -8.90039 0.399414 -12.4004l-17.3994 -18.5996c-1.60059 -1.80078 -4 -2.80078 -6.40039 -2.80078c-2.2002 0 -4.40039 0.900391 -6 2.40039l-57.7002 54.0996c-3.7002 3.40039 -3.7002 9.30078 0 12.8008l57.7002 54.0996
+c3.40039 3.2998 9 3.2002 12.4004 -0.400391l17.3994 -18.5996l0.200195 -0.200195c3.2002 -3.59961 2.7998 -9.2002 -0.799805 -12.3994l-32.7998 -28.9004l32.7998 -28.9004zM369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288
+c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM256 396.1v-76.0996h76.0996zM336 -16v288h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416h288zM209.6 234l24.4004 -7
+c4.7002 -1.2998 7.40039 -6.2002 6 -10.9004l-54.7002 -188.199c-1.2998 -4.60059 -6.2002 -7.40039 -10.8994 -6l-24.4004 7.09961c-4.7002 1.2998 -7.40039 6.2002 -6 10.9004l54.7002 188.1c1.39941 4.7002 6.2002 7.40039 10.8994 6zM234.1 157.1
+c-3.5 3.30078 -3.69922 8.90039 -0.399414 12.4004l17.3994 18.5996c3.30078 3.60059 8.90039 3.7002 12.4004 0.400391l57.7002 -54.0996c3.7002 -3.40039 3.7002 -9.30078 0 -12.8008l-57.7002 -54.0996c-3.5 -3.2998 -9.09961 -3.09961 -12.4004 0.400391
+l-17.3994 18.5996l-0.200195 0.200195c-3.2002 3.59961 -2.7998 9.2002 0.799805 12.3994l32.7998 28.9004l-32.7998 28.9004z" />
+    <glyph glyph-name="life-ring" unicode="&#xf1cd;" 
+d="M256 -56c-136.967 0 -248 111.033 -248 248s111.033 248 248 248s248 -111.033 248 -248s-111.033 -248 -248 -248zM152.602 20.7197c63.2178 -38.3184 143.579 -38.3184 206.797 0l-53.4111 53.4111c-31.8467 -13.5215 -68.168 -13.5059 -99.9746 0zM336 192
+c0 44.1123 -35.8877 80 -80 80s-80 -35.8877 -80 -80s35.8877 -80 80 -80s80 35.8877 80 80zM427.28 88.6016c38.3184 63.2178 38.3184 143.579 0 206.797l-53.4111 -53.4111c13.5215 -31.8467 13.5049 -68.168 0 -99.9746zM359.397 363.28
+c-63.2168 38.3184 -143.578 38.3184 -206.796 0l53.4111 -53.4111c31.8457 13.5215 68.167 13.5049 99.9736 0zM84.7197 295.398c-38.3184 -63.2178 -38.3184 -143.579 0 -206.797l53.4111 53.4111c-13.5215 31.8467 -13.5059 68.168 0 99.9746z" />
+    <glyph glyph-name="paper-plane" unicode="&#xf1d8;" 
+d="M440 441.5c34.5996 19.9004 77.5996 -8.7998 71.5 -48.9004l-59.4004 -387.199c-2.2998 -14.5 -11.0996 -27.3008 -23.8994 -34.5c-7.2998 -4.10059 -15.4004 -6.2002 -23.6006 -6.2002c-6.19922 0 -12.3994 1.2002 -18.2998 3.59961l-111.899 46.2002l-43.8008 -59.0996
+c-27.3994 -36.9004 -86.5996 -17.8008 -86.5996 28.5996v84.4004l-114.3 47.2998c-36.7998 15.0996 -40.1006 66 -5.7002 85.8994zM192 -16l36.5996 49.5l-36.5996 15.0996v-64.5996zM404.6 12.7002l59.4004 387.3l-416 -240l107.8 -44.5996l211.5 184.3
+c14.2002 12.2998 34.4004 -5.7002 23.7002 -21.2002l-140.2 -202.3z" />
+    <glyph glyph-name="futbol" unicode="&#xf1e3;" horiz-adv-x="496" 
+d="M483.8 268.6c42.2998 -130.199 -29 -270.1 -159.2 -312.399c-25.5 -8.2998 -51.2998 -12.2002 -76.6992 -12.2002c-104.5 0 -201.7 66.5996 -235.7 171.4c-42.2998 130.199 29 270.1 159.2 312.399c25.5 8.2998 51.2998 12.2002 76.6992 12.2002
+c104.5 0 201.7 -66.5996 235.7 -171.4zM409.3 74.9004c6.10059 8.39941 12.1006 16.8994 16.7998 26.1992c14.3008 28.1006 21.5 58.5 21.7002 89.2002l-38.8994 36.4004l-71.1006 -22.1006l-24.3994 -75.1992l43.6992 -60.9004zM409.3 310.3
+c-24.5 33.4004 -58.7002 58.4004 -97.8994 71.4004l-47.4004 -26.2002v-73.7998l64.2002 -46.5l70.7002 22zM184.9 381.6c-39.9004 -13.2998 -73.5 -38.5 -97.8008 -71.8994l10.1006 -52.5l70.5996 -22l64.2002 46.5v73.7998zM139 68.5l43.5 61.7002l-24.2998 74.2998
+l-71.1006 22.2002l-39 -36.4004c0.5 -55.7002 23.4004 -95.2002 37.8008 -115.3zM187.2 1.5c64.0996 -20.4004 115.5 -1.7998 121.7 0l22.3994 48.0996l-44.2998 61.7002h-78.5996l-43.6006 -61.7002z" />
+    <glyph glyph-name="newspaper" unicode="&#xf1ea;" horiz-adv-x="576" 
+d="M552 384c13.2549 0 24 -10.7451 24 -24v-336c0 -13.2549 -10.7451 -24 -24 -24h-496c-30.9277 0 -56 25.0723 -56 56v272c0 13.2549 10.7451 24 24 24h42.752c6.60547 18.623 24.3896 32 45.248 32h440zM48 56c0 -4.41113 3.58887 -8 8 -8s8 3.58887 8 8v248h-16v-248z
+M528 48v288h-416v-280c0 -2.7168 -0.204102 -5.38574 -0.578125 -8h416.578zM172 168c-6.62695 0 -12 5.37305 -12 12v96c0 6.62695 5.37305 12 12 12h136c6.62695 0 12 -5.37305 12 -12v-96c0 -6.62695 -5.37305 -12 -12 -12h-136zM200 248v-40h80v40h-80zM160 108v24
+c0 6.62695 5.37305 12 12 12h136c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-136c-6.62695 0 -12 5.37305 -12 12zM352 108v24c0 6.62695 5.37305 12 12 12h104c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-104
+c-6.62695 0 -12 5.37305 -12 12zM352 252v24c0 6.62695 5.37305 12 12 12h104c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-104c-6.62695 0 -12 5.37305 -12 12zM352 180v24c0 6.62695 5.37305 12 12 12h104c6.62695 0 12 -5.37305 12 -12v-24
+c0 -6.62695 -5.37305 -12 -12 -12h-104c-6.62695 0 -12 5.37305 -12 12z" />
+    <glyph glyph-name="bell-slash" unicode="&#xf1f6;" horiz-adv-x="640" 
+d="M633.99 -23.0195c6.91016 -5.52051 8.01953 -15.5908 2.5 -22.4902l-10 -12.4902c-5.53027 -6.88965 -15.5898 -8.00977 -22.4902 -2.49023l-598 467.51c-6.90039 5.52051 -8.01953 15.5908 -2.49023 22.4902l10 12.4902
+c5.52051 6.90039 15.5898 8.00977 22.4902 2.49023zM163.53 80h182.84l61.3994 -48h-279.659c-19.1201 0 -31.9902 15.5996 -32.1006 32c-0.0498047 7.5498 2.61035 15.2598 8.61035 21.71c18.3701 19.7402 51.5703 49.6904 54.8398 140.42l45.4697 -35.5498
+c-6.91992 -54.7803 -24.6895 -88.5498 -41.3994 -110.58zM320 352c-23.3496 0 -45 -7.17969 -62.9404 -19.4004l-38.1699 29.8408c19.6807 15.7793 43.1104 27.3096 69.1299 32.7197v20.8398c0 17.6699 14.3203 32 31.9805 32s31.9805 -14.3301 31.9805 -32v-20.8398
+c73.46 -15.2598 127.939 -77.46 127.939 -155.16c0 -41.3604 6.03027 -70.7197 14.3398 -92.8496l-59.5293 46.54c-1.63086 13.96 -2.77051 28.8896 -2.79004 45.7295c0 0.200195 0.0595703 0.379883 0.0595703 0.580078c0 61.8604 -50.1396 112 -112 112zM320 -64
+c-35.3203 0 -63.9697 28.6504 -63.9697 64h127.939c0 -35.3496 -28.6494 -64 -63.9697 -64z" />
+    <glyph glyph-name="copyright" unicode="&#xf1f9;" 
+d="M256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248zM256 -8c110.549 0 200 89.4678 200 200c0 110.549 -89.4678 200 -200 200c-110.549 0 -200 -89.4688 -200 -200c0 -110.549 89.4678 -200 200 -200z
+M363.351 93.0645c-9.61328 -9.71289 -45.5293 -41.3965 -104.064 -41.3965c-82.4297 0 -140.484 61.4248 -140.484 141.567c0 79.1514 60.2754 139.4 139.763 139.4c55.5303 0 88.7373 -26.6201 97.5928 -34.7783c2.13379 -1.96289 3.86523 -5.9082 3.86523 -8.80762
+c0 -1.95508 -0.864258 -4.87402 -1.92969 -6.51465l-18.1543 -28.1133c-3.8418 -5.9502 -11.9668 -7.28223 -17.499 -2.9209c-8.5957 6.77637 -31.8145 22.5381 -61.708 22.5381c-48.3037 0 -77.916 -35.3301 -77.916 -80.082c0 -41.5889 26.8877 -83.6924 78.2764 -83.6924
+c32.6572 0 56.8428 19.0391 65.7266 27.2256c5.26953 4.85645 13.5957 4.03906 17.8193 -1.73828l19.8652 -27.1699c1.28613 -1.74512 2.33008 -4.91992 2.33008 -7.08789c0 -2.72363 -1.56055 -6.5 -3.48242 -8.42969z" />
+    <glyph glyph-name="closed-captioning" unicode="&#xf20a;" 
+d="M464 384c26.5 0 48 -21.5 48 -48v-288c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v288c0 26.5 21.5 48 48 48h416zM458 48c3.2998 0 6 2.7002 6 6v276c0 3.2998 -2.7002 6 -6 6h-404c-3.2998 0 -6 -2.7002 -6 -6v-276c0 -3.2998 2.7002 -6 6 -6h404z
+M246.9 133.7c1.69922 -2.40039 1.5 -5.60059 -0.5 -7.7002c-53.6006 -56.7998 -172.801 -32.0996 -172.801 67.9004c0 97.2998 121.7 119.5 172.5 70.0996c2.10059 -2 2.5 -3.2002 1 -5.7002l-17.5 -30.5c-1.89941 -3.09961 -6.19922 -4 -9.09961 -1.7002
+c-40.7998 32 -94.5996 14.9004 -94.5996 -31.1992c0 -48 51 -70.5 92.1992 -32.6006c2.80078 2.5 7.10059 2.10059 9.2002 -0.899414zM437.3 133.7c1.7002 -2.40039 1.5 -5.60059 -0.5 -7.7002c-53.5996 -56.9004 -172.8 -32.0996 -172.8 67.9004
+c0 97.2998 121.7 119.5 172.5 70.0996c2.09961 -2 2.5 -3.2002 1 -5.7002l-17.5 -30.5c-1.90039 -3.09961 -6.2002 -4 -9.09961 -1.7002c-40.8008 32 -94.6006 14.9004 -94.6006 -31.1992c0 -48 51 -70.5 92.2002 -32.6006c2.7998 2.5 7.09961 2.10059 9.2002 -0.899414z
+" />
+    <glyph glyph-name="object-group" unicode="&#xf247;" 
+d="M500 320h-12v-256h12c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v12h-320v-12c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h12v256h-12
+c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h72c6.62695 0 12 -5.37305 12 -12v-12h320v12c0 6.62695 5.37305 12 12 12h72c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12zM448 384v-32h32v32h-32zM32 384v-32h32v32h-32zM64 0v32
+h-32v-32h32zM480 0v32h-32v-32h32zM440 64v256h-12c-6.62695 0 -12 5.37305 -12 12v12h-320v-12c0 -6.62695 -5.37305 -12 -12 -12h-12v-256h12c6.62695 0 12 -5.37305 12 -12v-12h320v12c0 6.62695 5.37305 12 12 12h12zM404 256c6.62695 0 12 -5.37207 12 -12v-168
+c0 -6.62793 -5.37305 -12 -12 -12h-200c-6.62695 0 -12 5.37207 -12 12v52h-84c-6.62695 0 -12 5.37207 -12 12v168c0 6.62793 5.37305 12 12 12h200c6.62695 0 12 -5.37207 12 -12v-52h84zM136 280v-112h144v112h-144zM376 104v112h-56v-76
+c0 -6.62793 -5.37305 -12 -12 -12h-76v-24h144z" />
+    <glyph glyph-name="object-ungroup" unicode="&#xf248;" horiz-adv-x="576" 
+d="M564 224h-12v-160h12c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v12h-224v-12c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h12v24h-88v-12
+c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h12v160h-12c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h72c6.62695 0 12 -5.37305 12 -12v-12h224v12c0 6.62695 5.37305 12 12 12h72
+c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12h-12v-24h88v12c0 6.62695 5.37305 12 12 12h72c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12zM352 384v-32h32v32h-32zM352 128v-32h32v32h-32zM64 96v32h-32v-32h32zM64 352v32
+h-32v-32h32zM96 136h224v12c0 6.62695 5.37305 12 12 12h12v160h-12c-6.62695 0 -12 5.37305 -12 12v12h-224v-12c0 -6.62695 -5.37305 -12 -12 -12h-12v-160h12c6.62695 0 12 -5.37305 12 -12v-12zM224 0v32h-32v-32h32zM504 64v160h-12c-6.62695 0 -12 5.37305 -12 12v12
+h-88v-88h12c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v12h-88v-24h12c6.62695 0 12 -5.37305 12 -12v-12h224v12c0 6.62695 5.37305 12 12 12h12zM544 0v32h-32v-32h32zM544 256v32h-32v-32h32z" />
+    <glyph glyph-name="sticky-note" unicode="&#xf249;" horiz-adv-x="448" 
+d="M448 99.8936c0 -10.9746 -6.29883 -26.1797 -14.0586 -33.9404l-83.8828 -83.8818c-7.75977 -7.76074 -22.9658 -14.0596 -33.9404 -14.0596h-268.118c-26.5098 0 -48 21.4902 -48 48v351.988c0 26.5098 21.4902 48 48 48h352c26.5098 0 48 -21.4902 48 -48v-268.106z
+M320 19.8936l76.1182 76.1182h-76.1182v-76.1182zM400 368h-352v-351.988h224v104c0 13.2549 10.7451 24 24 24h104v223.988z" />
+    <glyph glyph-name="clone" unicode="&#xf24d;" 
+d="M464 448c26.5098 0 48 -21.4902 48 -48v-320c0 -26.5098 -21.4902 -48 -48 -48h-48v-48c0 -26.5098 -21.4902 -48 -48 -48h-320c-26.5098 0 -48 21.4902 -48 48v320c0 26.5098 21.4902 48 48 48h48v48c0 26.5098 21.4902 48 48 48h320zM362 -16c3.31152 0 6 2.68848 6 6
+v42h-224c-26.5098 0 -48 21.4902 -48 48v224h-42c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h308zM458 80c3.31152 0 6 2.68848 6 6v308c0 3.31152 -2.68848 6 -6 6h-308c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h308z" />
+    <glyph glyph-name="hourglass" unicode="&#xf254;" horiz-adv-x="384" 
+d="M368 400c0 -80.0996 -31.8984 -165.619 -97.1797 -208c64.9912 -42.1934 97.1797 -127.436 97.1797 -208h4c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-360c-6.62695 0 -12 5.37305 -12 12v24c0 6.62695 5.37305 12 12 12h4
+c0 80.0996 31.8994 165.619 97.1797 208c-64.9912 42.1934 -97.1797 127.436 -97.1797 208h-4c-6.62695 0 -12 5.37305 -12 12v24c0 6.62695 5.37305 12 12 12h360c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-4zM64 400
+c0 -101.621 57.3066 -184 128 -184s128 82.3799 128 184h-256zM320 -16c0 101.62 -57.3076 184 -128 184s-128 -82.3799 -128 -184h256z" />
+    <glyph glyph-name="hand-rock" unicode="&#xf255;" 
+d="M408.864 368.948c48.8213 20.751 103.136 -15.0723 103.136 -67.9111v-114.443c0 -15.3955 -3.08887 -30.3906 -9.18262 -44.5674l-42.835 -99.6562c-4.99707 -11.625 -3.98242 -18.8574 -3.98242 -42.3701c0 -17.6729 -14.3271 -32 -32 -32h-252
+c-17.6729 0 -32 14.3271 -32 32c0 27.3301 1.1416 29.2012 -3.11035 32.9033l-97.71 85.0811c-24.8994 21.6797 -39.1797 52.8926 -39.1797 85.6338v56.9531c0 47.4277 44.8457 82.0215 91.0459 71.1807c1.96094 55.751 63.5107 87.8262 110.671 60.8057
+c29.1895 31.0713 78.8604 31.4473 108.334 -0.0214844c32.7051 18.6846 76.4121 10.3096 98.8135 -23.5879zM464 186.594v114.445c0 34.29 -52 33.8232 -52 0.676758c0 -8.83594 -7.16309 -16 -16 -16h-7c-8.83691 0 -16 7.16406 -16 16v26.751
+c0 34.457 -52 33.707 -52 0.676758v-27.4287c0 -8.83594 -7.16309 -16 -16 -16h-7c-8.83691 0 -16 7.16406 -16 16v40.4658c0 34.3525 -52 33.8115 -52 0.677734v-41.1436c0 -8.83594 -7.16406 -16 -16 -16h-7c-8.83594 0 -16 7.16406 -16 16v26.751
+c0 34.4023 -52 33.7744 -52 0.676758v-116.571c0 -8.83203 -7.16797 -16 -16 -16c-3.30664 0 -8.01367 1.7627 -10.5068 3.93359l-7 6.09473c-3.03223 2.64062 -5.49316 8.04688 -5.49316 12.0674v0v41.2275c0 34.2148 -52 33.8857 -52 0.677734v-56.9531
+c0 -18.8555 8.27441 -36.874 22.7002 -49.4365l97.71 -85.0801c12.4502 -10.8398 19.5898 -26.4463 19.5898 -42.8164v-10.2861h220v7.07617c0 13.21 2.65332 26.0791 7.88281 38.25l42.835 99.6553c2.91602 6.75391 5.28223 18.207 5.28223 25.5635v0.0488281z" />
+    <glyph glyph-name="hand-paper" unicode="&#xf256;" horiz-adv-x="448" 
+d="M372.57 335.359c39.9062 5.63281 75.4297 -25.7393 75.4297 -66.3594v-131.564c-0.00195312 -12.7666 -2.33008 -33.2246 -5.19531 -45.666l-30.1836 -130.958c-3.34668 -14.5234 -16.2783 -24.8125 -31.1816 -24.8125h-222.897
+c-9.10352 0 -20.7793 6.01758 -26.0615 13.4316l-119.97 168.415c-21.2441 29.8203 -14.8047 71.3574 14.5498 93.1533c18.7754 13.9395 42.1309 16.2979 62.083 8.87109v126.13c0 44.0547 41.125 75.5439 82.4053 64.9834c23.8926 48.1963 92.3535 50.2471 117.982 0.74707
+c42.5186 11.1445 83.0391 -21.9346 83.0391 -65.5469v-10.8242zM399.997 137.437l-0.00195312 131.563c0 24.9492 -36.5703 25.5508 -36.5703 -0.691406v-76.3086c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16v154.184
+c0 25.501 -36.5703 26.3633 -36.5703 0.691406v-154.875c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16v188.309c0 25.501 -36.5703 26.3545 -36.5703 0.691406v-189c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16
+v153.309c0 25.501 -36.5713 26.3359 -36.5713 0.691406v-206.494c0 -15.5703 -20.0352 -21.9092 -29.0303 -9.2832l-27.1279 38.0791c-14.3711 20.1709 -43.833 -2.33496 -29.3945 -22.6045l115.196 -161.697h201.92l27.3252 118.551
+c2.63086 11.417 3.96484 23.1553 3.96484 34.8857z" />
+    <glyph glyph-name="hand-scissors" unicode="&#xf257;" 
+d="M256 -32c-44.9561 0 -77.3428 43.2627 -64.0244 85.8535c-21.6484 13.71 -34.0156 38.7617 -30.3408 65.0068h-87.6348c-40.8037 0 -74 32.8105 -74 73.1406c0 40.3291 33.1963 73.1396 74 73.1396l94 -9.14062l-78.8496 18.6787
+c-38.3076 14.7422 -57.04 57.4707 -41.9424 95.1123c15.0303 37.4736 57.7549 55.7803 95.6416 41.2012l144.929 -55.7568c24.9551 30.5566 57.8086 43.9932 92.2178 24.7324l97.999 -54.8525c20.9746 -11.7393 34.0049 -33.8457 34.0049 -57.6904v-205.702
+c0 -30.7422 -21.4404 -57.5576 -51.7979 -64.5537l-118.999 -27.4268c-4.97168 -1.14648 -10.0889 -1.72949 -15.2031 -1.72949zM256 16.0127l70 -0.000976562c1.23633 0 3.21777 0.225586 4.42285 0.501953l119.001 27.4277
+c8.58203 1.97754 14.5762 9.29102 14.5762 17.7812v205.701c0 6.4873 -3.62109 12.542 -9.44922 15.8047l-98 54.8545c-8.13965 4.55566 -18.668 2.61914 -24.4873 -4.50781l-21.7646 -26.6475c-2.65039 -3.24512 -8.20215 -5.87891 -12.3926 -5.87891
+c-1.64062 0 -4.21484 0.477539 -5.74609 1.06738l-166.549 64.0908c-32.6543 12.5664 -50.7744 -34.5771 -19.2227 -46.7168l155.357 -59.7852c5.66016 -2.17773 10.2539 -8.86816 10.2539 -14.9326v0v-11.6328c0 -8.83691 -7.16309 -16 -16 -16h-182
+c-34.375 0 -34.4297 -50.2803 0 -50.2803h182c8.83691 0 16 -7.16309 16 -16v-6.85645c0 -8.83691 -7.16309 -16 -16 -16h-28c-25.1221 0 -25.1592 -36.5674 0 -36.5674h28c8.83691 0 16 -7.16211 16 -16v-6.85547c0 -8.83691 -7.16309 -16 -16 -16
+c-25.1201 0 -25.1602 -36.5674 0 -36.5674z" />
+    <glyph glyph-name="hand-lizard" unicode="&#xf258;" horiz-adv-x="576" 
+d="M556.686 157.458c12.6357 -19.4863 19.3145 -42.0615 19.3145 -65.2871v-124.171h-224v71.582l-99.751 38.7871c-2.7832 1.08203 -5.70996 1.63086 -8.69727 1.63086h-131.552c-30.8789 0 -56 25.1211 -56 56c0 48.5234 39.4766 88 88 88h113.709l18.333 48h-196.042
+c-44.1123 0 -80 35.8877 -80 80v8c0 30.8779 25.1211 56 56 56h293.917c24.5 0 47.084 -12.2725 60.4111 -32.8291zM528 16v76.1709v0.0478516c0 11.7461 -5.19141 29.2734 -11.5879 39.124l-146.358 225.715c-4.44336 6.85254 -11.9707 10.9424 -20.1367 10.9424h-293.917
+c-4.41113 0 -8 -3.58887 -8 -8v-8c0 -17.6445 14.3555 -32 32 -32h213.471c25.2021 0 42.626 -25.293 33.6299 -48.8457l-24.5518 -64.2812c-7.05371 -18.4658 -25.0732 -30.873 -44.8398 -30.873h-113.709c-22.0557 0 -40 -17.9443 -40 -40c0 -4.41113 3.58887 -8 8 -8
+h131.552h0.0517578c7.44141 0 19.1074 -2.19238 26.041 -4.89355l99.752 -38.7881c18.5898 -7.22852 30.6035 -24.7881 30.6035 -44.7363v-23.582h128z" />
+    <glyph glyph-name="hand-spock" unicode="&#xf259;" 
+d="M501.03 331.824c6.05762 -9.77832 10.9746 -27.0498 10.9746 -38.5518c0 -4.80664 -0.915039 -12.499 -2.04297 -17.1709l-57.623 -241.963c-12.748 -54.1729 -68.2627 -98.1387 -123.915 -98.1387h-0.345703h-107.455h-0.224609
+c-33.8135 0 -81.2148 18.834 -105.807 42.041l-91.3652 85.9766c-12.8213 12.0469 -23.2266 36.1016 -23.2266 53.6943c0 16.1299 8.97266 38.7529 20.0273 50.499c5.31836 5.66406 29.875 29.3926 68.1152 21.8477l-24.3594 82.1973
+c-1.68164 5.66406 -3.0459 15.0576 -3.0459 20.9668c0 37.5938 30.417 70.502 67.8955 73.4551c-0.204102 2.03125 -0.369141 5.33691 -0.369141 7.37891c0 31.627 24.8594 63.6895 55.4902 71.5684c43.248 10.9785 80.5645 -17.7012 89.6602 -53.0723l13.6836 -53.207
+l4.64648 22.6602c6.76074 32.417 39.123 58.8115 72.2373 58.916c8.73438 0 56.625 -3.26953 70.7383 -54.0801c15.0664 0.710938 46.9199 -3.50977 66.3105 -35.0176zM463.271 287.219c7.86914 32.9844 -42.1211 45.2695 -50.0859 11.9219l-24.8008 -104.146
+c-4.38867 -18.4141 -31.7783 -11.8926 -28.0557 6.2168l28.5479 139.166c7.39844 36.0703 -43.3076 45.0703 -50.1182 11.9629l-31.791 -154.971c-3.54883 -17.3086 -28.2832 -18.0469 -32.7109 -0.804688l-47.3262 184.035
+c-8.43359 32.8105 -58.3691 20.2676 -49.8652 -12.8359l42.4414 -165.039c4.81641 -18.7207 -23.3711 -26.9121 -28.9648 -8.00781l-31.3438 105.779c-9.6875 32.6465 -59.1191 18.2578 -49.3867 -14.625l36.0137 -121.539
+c5.61816 -18.9521 10.1777 -50.377 10.1777 -70.1436v-0.00878906c0 -6.54297 -8.05664 -10.9355 -13.4824 -5.82617l-51.123 48.1074c-24.7852 23.4082 -60.0527 -14.1875 -35.2793 -37.4902l91.3691 -85.9805c16.9629 -16.0068 49.6592 -28.998 72.9824 -28.998h0.154297
+h107.455h0.216797c34.7402 0 69.3936 27.4443 77.3525 61.2598z" />
+    <glyph glyph-name="hand-pointer" unicode="&#xf25a;" horiz-adv-x="448" 
+d="M358.182 268.639c43.1934 16.6348 89.8184 -15.7949 89.8184 -62.6387v-84c-0.000976562 -4.25 -0.775391 -11.0615 -1.72754 -15.2041l-27.4297 -118.999c-6.98242 -30.2969 -33.7549 -51.7969 -64.5566 -51.7969h-178.286c-21.2588 0 -41.3682 10.4102 -53.791 27.8457
+l-109.699 154.001c-21.2432 29.8193 -14.8047 71.3574 14.5498 93.1523c18.8115 13.9658 42.1748 16.2822 62.083 8.87207v161.129c0 36.9443 29.7363 67 66.2861 67s66.2861 -30.0557 66.2861 -67v-73.6338c20.4131 2.85742 41.4678 -3.94238 56.5947 -19.6289
+c27.1934 12.8467 60.3799 5.66992 79.8721 -19.0986zM80.9854 168.303c-14.4004 20.2119 -43.8008 -2.38281 -29.3945 -22.6055l109.712 -154c3.43457 -4.81934 8.92871 -7.69727 14.6973 -7.69727h178.285c8.49219 0 15.8037 5.99414 17.7822 14.5762l27.4297 119.001
+c0.333008 1.44629 0.501953 2.93457 0.501953 4.42285v84c0 25.1602 -36.5713 25.1211 -36.5713 0c0 -8.83594 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16406 -16 16v21c0 25.1602 -36.5713 25.1201 -36.5713 0v-21c0 -8.83594 -7.16309 -16 -16 -16h-6.85938
+c-8.83691 0 -16 7.16406 -16 16v35c0 25.1602 -36.5703 25.1201 -36.5703 0v-35c0 -8.83594 -7.16309 -16 -16 -16h-6.85742c-8.83691 0 -16 7.16406 -16 16v175c0 25.1602 -36.5713 25.1201 -36.5713 0v-241.493c0 -15.5703 -20.0352 -21.9092 -29.0303 -9.2832z
+M176.143 48v96c0 8.83691 6.26855 16 14 16h6c7.73242 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26758 -16 -14 -16h-6c-7.73242 0 -14 7.16309 -14 16zM251.571 48v96c0 8.83691 6.26758 16 14 16h6c7.73145 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26855 -16 -14 -16h-6
+c-7.73242 0 -14 7.16309 -14 16zM327 48v96c0 8.83691 6.26758 16 14 16h6c7.73242 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26758 -16 -14 -16h-6c-7.73242 0 -14 7.16309 -14 16z" />
+    <glyph glyph-name="hand-peace" unicode="&#xf25b;" horiz-adv-x="448" 
+d="M362.146 256.024c42.5908 13.3184 85.8535 -19.0684 85.8535 -64.0244l-0.0117188 -70.001c-0.000976562 -4.25 -0.775391 -11.0615 -1.72949 -15.2031l-27.4268 -118.999c-6.99707 -30.3564 -33.8105 -51.7969 -64.5547 -51.7969h-205.702
+c-23.8447 0 -45.9502 13.0303 -57.6904 34.0059l-54.8525 97.999c-19.2607 34.4092 -5.82422 67.2617 24.7324 92.2178l-55.7568 144.928c-14.5791 37.8867 3.72754 80.6113 41.2012 95.6416c37.6406 15.0977 80.3691 -3.63477 95.1123 -41.9424l18.6787 -78.8496
+l-9.14062 94c0 40.8037 32.8096 74 73.1396 74s73.1406 -33.1963 73.1406 -74v-87.6348c26.2451 3.6748 51.2959 -8.69238 65.0068 -30.3408zM399.987 122l-0.000976562 70c0 25.1602 -36.5674 25.1201 -36.5674 0c0 -8.83691 -7.16309 -16 -16 -16h-6.85547
+c-8.83789 0 -16 7.16309 -16 16v28c0 25.1592 -36.5674 25.1221 -36.5674 0v-28c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16v182c0 34.4297 -50.2803 34.375 -50.2803 0v-182c0 -8.83691 -7.16309 -16 -16 -16h-11.6328v0
+c-6.06445 0 -12.7549 4.59375 -14.9326 10.2539l-59.7842 155.357c-12.1396 31.5518 -59.2842 13.4326 -46.7168 -19.2227l64.0898 -166.549c0.589844 -1.53125 1.06738 -4.10547 1.06738 -5.74609c0 -4.19043 -2.63379 -9.74219 -5.87891 -12.3926l-26.6475 -21.7646
+c-7.12695 -5.81934 -9.06445 -16.3467 -4.50781 -24.4873l54.8535 -98c3.26367 -5.82812 9.31934 -9.44922 15.8057 -9.44922h205.701c8.49121 0 15.8037 5.99414 17.7812 14.5762l27.4277 119.001c0.333008 1.44629 0.501953 2.93457 0.501953 4.42285z" />
+    <glyph glyph-name="registered" unicode="&#xf25d;" 
+d="M256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248zM256 -8c110.549 0 200 89.4678 200 200c0 110.549 -89.4678 200 -200 200c-110.549 0 -200 -89.4688 -200 -200c0 -110.549 89.4678 -200 200 -200z
+M366.442 73.791c4.40332 -7.99219 -1.37012 -17.791 -10.5107 -17.791h-42.8096h-0.0126953c-3.97559 0 -8.71582 2.84961 -10.5801 6.36035l-47.5156 89.3027h-31.958v-83.6631c0 -6.61719 -5.38281 -12 -12 -12h-38.5674c-6.61719 0 -12 5.38281 -12 12v248.304
+c0 6.61719 5.38281 12 12 12h78.667c71.251 0 101.498 -32.749 101.498 -85.252c0 -31.6123 -15.2148 -59.2969 -39.4824 -73.1758c3.02148 -4.61719 0.225586 0.199219 53.2715 -96.085zM256.933 208.094c20.9131 0 32.4307 11.5186 32.4316 32.4316
+c0 19.5752 -6.5127 31.709 -38.9297 31.709h-27.377v-64.1406h33.875z" />
+    <glyph glyph-name="calendar-plus" unicode="&#xf271;" horiz-adv-x="448" 
+d="M336 156v-24c0 -6.59961 -5.40039 -12 -12 -12h-76v-76c0 -6.59961 -5.40039 -12 -12 -12h-24c-6.59961 0 -12 5.40039 -12 12v76h-76c-6.59961 0 -12 5.40039 -12 12v24c0 6.59961 5.40039 12 12 12h76v76c0 6.59961 5.40039 12 12 12h24c6.59961 0 12 -5.40039 12 -12
+v-76h76c6.59961 0 12 -5.40039 12 -12zM448 336v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40
+c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48zM400 -10v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
+    <glyph glyph-name="calendar-minus" unicode="&#xf272;" horiz-adv-x="448" 
+d="M124 120c-6.59961 0 -12 5.40039 -12 12v24c0 6.59961 5.40039 12 12 12h200c6.59961 0 12 -5.40039 12 -12v-24c0 -6.59961 -5.40039 -12 -12 -12h-200zM448 336v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52
+c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48zM400 -10v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
+    <glyph glyph-name="calendar-times" unicode="&#xf273;" horiz-adv-x="448" 
+d="M311.7 73.2998l-17 -17c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-53.7002 53.7998l-53.7002 -53.6992c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-17 17c-4.7002 4.69922 -4.7002 12.2998 0 17l53.7002 53.6992l-53.7002 53.7002c-4.7002 4.7002 -4.7002 12.2998 0 17
+l17 17c4.7002 4.7002 12.2998 4.7002 17 0l53.7002 -53.7002l53.7002 53.7002c4.7002 4.7002 12.2998 4.7002 17 0l17 -17c4.7002 -4.7002 4.7002 -12.2998 0 -17l-53.7998 -53.7998l53.6992 -53.7002c4.80078 -4.7002 4.80078 -12.2998 0.100586 -17zM448 336v-352
+c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48zM400 -10
+v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
+    <glyph glyph-name="calendar-check" unicode="&#xf274;" horiz-adv-x="448" 
+d="M400 384c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h48v52c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-52h128v52c0 6.62695 5.37305 12 12 12h40
+c6.62695 0 12 -5.37305 12 -12v-52h48zM394 -16c3.31152 0 6 2.68848 6 6v298h-352v-298c0 -3.31152 2.68848 -6 6 -6h340zM341.151 184.65l-142.31 -141.169c-4.70508 -4.66699 -12.3027 -4.6377 -16.9707 0.0673828l-75.0908 75.6992
+c-4.66699 4.70508 -4.6377 12.3027 0.0673828 16.9707l22.7197 22.5361c4.70508 4.66699 12.3027 4.63672 16.9697 -0.0693359l44.1035 -44.4609l111.072 110.182c4.70508 4.66699 12.3027 4.63672 16.9707 -0.0683594l22.5361 -22.7178
+c4.66699 -4.70508 4.63672 -12.3027 -0.0683594 -16.9697z" />
+    <glyph glyph-name="map" unicode="&#xf279;" horiz-adv-x="576" 
+d="M560.02 416c8.4502 0 15.9805 -6.83008 15.9805 -16.0195v-346.32c0 -11.9609 -9.01367 -25.2705 -20.1201 -29.71l-151.83 -52.8105c-5.32617 -1.7334 -14.1953 -3.13965 -19.7969 -3.13965c-5.7373 0 -14.8105 1.47363 -20.2529 3.29004l-172 60.71l-170.05 -62.8398
+c-1.99023 -0.790039 -4 -1.16016 -5.95996 -1.16016c-8.45996 0 -15.9902 6.83008 -15.9902 16.0195v346.32c0.00292969 11.959 9.0166 25.2686 20.1201 29.71l151.83 52.8105c6.43945 2.08984 13.1201 3.13965 19.8096 3.13965
+c5.73242 -0.00195312 14.8008 -1.47168 20.2402 -3.28027l172 -60.7197h0.00976562l170.05 62.8398c1.98047 0.790039 4 1.16016 5.95996 1.16016zM224 357.58v-285.97l128 -45.1904v285.97zM48 29.9502l127.36 47.0801l0.639648 0.229492v286.2l-128 -44.5303v-288.979z
+M528 65.0801v288.97l-127.36 -47.0693l-0.639648 -0.240234v-286.19z" />
+    <glyph glyph-name="comment-alt" unicode="&#xf27a;" 
+d="M448 448c35.2998 0 64 -28.7002 64 -64v-288c0 -35.2998 -28.7002 -64 -64 -64h-144l-124.9 -93.5996c-2.19922 -1.7002 -4.69922 -2.40039 -7.09961 -2.40039c-6.2002 0 -12 4.90039 -12 12v84h-96c-35.2998 0 -64 28.7002 -64 64v288c0 35.2998 28.7002 64 64 64h384z
+M464 96v288c0 8.7998 -7.2002 16 -16 16h-384c-8.7998 0 -16 -7.2002 -16 -16v-288c0 -8.7998 7.2002 -16 16 -16h144v-60l67.2002 50.4004l12.7998 9.59961h160c8.7998 0 16 7.2002 16 16z" />
+    <glyph glyph-name="pause-circle" unicode="&#xf28b;" 
+d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200zM352 272v-160c0 -8.7998 -7.2002 -16 -16 -16h-48
+c-8.7998 0 -16 7.2002 -16 16v160c0 8.7998 7.2002 16 16 16h48c8.7998 0 16 -7.2002 16 -16zM240 272v-160c0 -8.7998 -7.2002 -16 -16 -16h-48c-8.7998 0 -16 7.2002 -16 16v160c0 8.7998 7.2002 16 16 16h48c8.7998 0 16 -7.2002 16 -16z" />
+    <glyph glyph-name="stop-circle" unicode="&#xf28d;" 
+d="M504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM56 192c0 -110.5 89.5 -200 200 -200s200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200zM352 272v-160c0 -8.7998 -7.2002 -16 -16 -16h-160
+c-8.7998 0 -16 7.2002 -16 16v160c0 8.7998 7.2002 16 16 16h160c8.7998 0 16 -7.2002 16 -16z" />
+    <glyph glyph-name="handshake" unicode="&#xf2b5;" horiz-adv-x="640" 
+d="M519.2 320.1h120.8v-255.699h-64c-17.5 0 -31.7998 14.1992 -31.9004 31.6992h-57.8994c-1.7998 -8.19922 -5.2998 -16.0996 -10.9004 -23l-26.2002 -32.2998c-15.7998 -19.3994 -41.8994 -25.5 -64 -16.7998c-13.5 -16.5996 -30.5996 -24 -48.7998 -24
+c-15.0996 0 -28.5996 5.09961 -41.0996 15.9004c-31.7998 -21.9004 -74.7002 -21.3008 -105.601 3.7998l-84.5996 76.3994h-9.09961c-0.100586 -17.5 -14.3008 -31.6992 -31.9004 -31.6992h-64v255.699h118l47.5996 47.6006c10.5 10.3994 24.8008 16.2998 39.6006 16.2998
+h226.8v0c12.7812 0 30.5225 -7.30273 39.5996 -16.2998zM48 96.4004c8.7998 0 16 7.09961 16 16c0 8.7998 -7.2002 16 -16 16s-16 -7.2002 -16 -16c0 -8.80078 7.2002 -16 16 -16zM438 103.3c2.7002 3.40039 2.2002 8.5 -1.2002 11.2998l-108.2 87.8008l-8.19922 -7.5
+c-40.3008 -36.8008 -86.7002 -11.8008 -101.5 4.39941c-26.7002 29 -25 74.4004 4.39941 101.3l38.7002 35.5h-56.7002c-2 -0.799805 -3.7002 -1.5 -5.7002 -2.2998l-61.6992 -61.5996h-41.9004v-128.101h27.7002l97.2998 -88
+c16.0996 -13.0996 41.4004 -10.5 55.2998 6.60059l15.6006 19.2002l36.7998 -31.5c3 -2.40039 12 -4.90039 18 2.39941l30 36.5l23.8994 -19.3994c3.5 -2.80078 8.5 -2.2002 11.3008 1.19922zM544 144.1v128h-44.7002l-61.7002 61.6006
+c-1.39941 1.5 -3.39941 2.2998 -5.5 2.2998l-83.6992 -0.200195c-10 0 -19.6006 -3.7002 -27 -10.5l-65.6006 -60.0996c-9.7002 -8.7998 -10.5 -24 -1.2002 -33.9004c8.90039 -9.39941 25.1006 -8.7002 34.6006 0l55.2002 50.6006c6.5 5.89941 16.5996 5.5 22.5996 -1
+l10.9004 -11.7002c6 -6.5 5.5 -16.6006 -1 -22.6006l-12.5 -11.3994l102.699 -83.4004c2.80078 -2.2998 5.40039 -4.89941 7.7002 -7.7002h69.2002zM592 96.4004c8.7998 0 16 7.09961 16 16c0 8.7998 -7.2002 16 -16 16s-16 -7.2002 -16 -16c0 -8.80078 7.2002 -16 16 -16z
+" />
+    <glyph glyph-name="envelope-open" unicode="&#xf2b6;" 
+d="M494.586 283.484c9.6123 -7.94824 17.4141 -24.5205 17.4141 -36.9932v-262.491c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v262.515c0 12.5166 7.84668 29.1279 17.5146 37.0771c4.08008 3.35449 110.688 89.0996 135.15 108.549
+c22.6992 18.1426 60.1299 55.8594 103.335 55.8594c43.4365 0 81.2314 -38.1914 103.335 -55.8594c23.5283 -18.707 130.554 -104.773 135.251 -108.656zM464 -10v253.632v0.00488281c0 1.5791 -0.996094 3.66602 -2.22363 4.6582
+c-15.8633 12.8232 -108.793 87.5752 -132.366 106.316c-17.5527 14.0195 -49.7168 45.3887 -73.4102 45.3887c-23.6016 0 -55.2451 -30.8799 -73.4102 -45.3887c-23.5713 -18.7393 -116.494 -93.4795 -132.364 -106.293
+c-1.40918 -1.13965 -2.22559 -2.85254 -2.22559 -4.66504v-253.653c0 -3.31152 2.68848 -6 6 -6h404c3.31152 0 6 2.68848 6 6zM432.009 177.704c4.24902 -5.15918 3.46484 -12.7949 -1.74512 -16.9814c-28.9746 -23.2822 -59.2734 -47.5967 -70.9287 -56.8623
+c-22.6992 -18.1436 -60.1299 -55.8604 -103.335 -55.8604c-43.4521 0 -81.2871 38.2373 -103.335 55.8604c-11.2793 8.9668 -41.7441 33.4131 -70.9268 56.8643c-5.20996 4.1875 -5.99316 11.8223 -1.74512 16.9814l15.2578 18.5283
+c4.17773 5.07227 11.6572 5.84277 16.7793 1.72559c28.6182 -23.001 58.5654 -47.0352 70.5596 -56.5713c17.5527 -14.0195 49.7168 -45.3887 73.4102 -45.3887c23.6016 0 55.2461 30.8799 73.4102 45.3887c11.9941 9.53516 41.9434 33.5703 70.5625 56.5684
+c5.12207 4.11621 12.6016 3.3457 16.7783 -1.72656z" />
+    <glyph glyph-name="address-book" unicode="&#xf2b9;" horiz-adv-x="448" 
+d="M436 288h-20v-64h20c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-20v-64h20c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-20v-48c0 -26.5 -21.5 -48 -48 -48h-320c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48
+h320c26.5 0 48 -21.5 48 -48v-48h20c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12zM368 -16v416h-320v-416h320zM208 192c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64zM118.4 64
+c-12.4004 0 -22.4004 8.59961 -22.4004 19.2002v19.2002c0 31.7998 30.0996 57.5996 67.2002 57.5996c11.3994 0 17.8994 -8 44.7998 -8c26.0996 0 34 8 44.7998 8c37.1006 0 67.2002 -25.7998 67.2002 -57.5996v-19.2002c0 -10.6006 -10 -19.2002 -22.4004 -19.2002
+h-179.199z" />
+    <glyph glyph-name="address-card" unicode="&#xf2bb;" horiz-adv-x="576" 
+d="M528 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480zM528 16v352h-480v-352h480zM208 192c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64z
+M118.4 64c-12.4004 0 -22.4004 8.59961 -22.4004 19.2002v19.2002c0 31.7998 30.0996 57.5996 67.2002 57.5996c11.3994 0 17.8994 -8 44.7998 -8c26.0996 0 34 8 44.7998 8c37.1006 0 67.2002 -25.7998 67.2002 -57.5996v-19.2002
+c0 -10.6006 -10 -19.2002 -22.4004 -19.2002h-179.199zM360 128c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112zM360 192c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112
+c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112zM360 256c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112z" />
+    <glyph glyph-name="user-circle" unicode="&#xf2bd;" horiz-adv-x="496" 
+d="M248 344c53 0 96 -43 96 -96s-43 -96 -96 -96s-96 43 -96 96s43 96 96 96zM248 200c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8
+c49.7002 0 95.0996 18.2998 130.1 48.4004c-14.8994 23 -40.3994 38.5 -69.5996 39.5c-20.7998 -6.5 -40.5996 -9.60059 -60.5 -9.60059s-39.7002 3.2002 -60.5 9.60059c-29.2002 -0.900391 -54.7002 -16.5 -69.5996 -39.5c35 -30.1006 80.3994 -48.4004 130.1 -48.4004z
+M410.7 76.0996c23.3994 32.7002 37.2998 72.7002 37.2998 115.9c0 110.3 -89.7002 200 -200 200s-200 -89.7002 -200 -200c0 -43.2002 13.9004 -83.2002 37.2998 -115.9c24.5 31.4004 62.2002 51.9004 105.101 51.9004c10.1992 0 26.0996 -9.59961 57.5996 -9.59961
+c31.5996 0 47.4004 9.59961 57.5996 9.59961c43 0 80.7002 -20.5 105.101 -51.9004z" />
+    <glyph glyph-name="id-badge" unicode="&#xf2c1;" horiz-adv-x="384" 
+d="M336 448c26.5 0 48 -21.5 48 -48v-416c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48h288zM336 -16v416h-288v-416h288zM144 336c-8.7998 0 -16 7.2002 -16 16s7.2002 16 16 16h96c8.7998 0 16 -7.2002 16 -16s-7.2002 -16 -16 -16
+h-96zM192 160c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64zM102.4 32c-12.4004 0 -22.4004 8.59961 -22.4004 19.2002v19.2002c0 31.7998 30.0996 57.5996 67.2002 57.5996c11.3994 0 17.8994 -8 44.7998 -8
+c26.0996 0 34 8 44.7998 8c37.1006 0 67.2002 -25.7998 67.2002 -57.5996v-19.2002c0 -10.6006 -10 -19.2002 -22.4004 -19.2002h-179.199z" />
+    <glyph glyph-name="id-card" unicode="&#xf2c2;" horiz-adv-x="576" 
+d="M528 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480zM528 16v288h-480v-288h32.7998c-1 4.5 -0.799805 -3.59961 -0.799805 22.4004c0 31.7998 30.0996 57.5996 67.2002 57.5996
+c11.3994 0 17.8994 -8 44.7998 -8c26.0996 0 34 8 44.7998 8c37.1006 0 67.2002 -25.7998 67.2002 -57.5996c0 -26 0.0996094 -17.9004 -0.799805 -22.4004h224.8zM360 96c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112c4.40039 0 8 -3.59961 8 -8v-16
+c0 -4.40039 -3.59961 -8 -8 -8h-112zM360 160c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112zM360 224c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112
+c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112zM192 128c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64z" />
+    <glyph glyph-name="window-maximize" unicode="&#xf2d0;" 
+d="M464 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h416zM464 22v234h-416v-234c0 -3.2998 2.7002 -6 6 -6h404c3.2998 0 6 2.7002 6 6z" />
+    <glyph glyph-name="window-minimize" unicode="&#xf2d1;" 
+d="M480 -32h-448c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32h448c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32z" />
+    <glyph glyph-name="window-restore" unicode="&#xf2d2;" 
+d="M464 448c26.5 0 48 -21.5 48 -48v-320c0 -26.5 -21.5 -48 -48 -48h-48v-48c0 -26.5 -21.5 -48 -48 -48h-320c-26.5 0 -48 21.5 -48 48v320c0 26.5 21.5 48 48 48h48v48c0 26.5 21.5 48 48 48h320zM368 -16v208h-320v-208h320zM464 80v320h-320v-48h224
+c26.5 0 48 -21.5 48 -48v-224h48z" />
+    <glyph glyph-name="snowflake" unicode="&#xf2dc;" horiz-adv-x="448" 
+d="M440.1 92.7998c7.60059 -4.39941 10.1006 -14.2002 5.5 -21.7002l-7.89941 -13.8994c-4.40039 -7.7002 -14 -10.2998 -21.5 -5.90039l-39.2002 23l9.09961 -34.7002c2.30078 -8.5 -2.69922 -17.2998 -11.0996 -19.5996l-15.2002 -4.09961
+c-8.39941 -2.30078 -17.0996 2.7998 -19.2998 11.2998l-21.2998 81l-71.9004 42.2002v-84.5l58.2998 -59.3008c6.10059 -6.19922 6.10059 -16.3994 0 -22.5996l-11.0996 -11.2998c-6.09961 -6.2002 -16.0996 -6.2002 -22.2002 0l-24.8994 25.3994v-46.0996
+c0 -8.7998 -7 -16 -15.7002 -16h-15.7002c-8.7002 0 -15.7002 7.2002 -15.7002 16v45.9004l-24.8994 -25.4004c-6.10059 -6.2002 -16.1006 -6.2002 -22.2002 0l-11.1006 11.2998c-6.09961 6.2002 -6.09961 16.4004 0 22.6006l58.3008 59.2998v84.5l-71.9004 -42.2002
+l-21.2998 -81c-2.2998 -8.5 -10.9004 -13.5996 -19.2998 -11.2998l-15.2002 4.09961c-8.40039 2.2998 -13.2998 11.1006 -11.1006 19.6006l9.10059 34.6992l-39.2002 -23c-7.5 -4.39941 -17.2002 -1.7998 -21.5 5.90039l-7.90039 13.9004
+c-4.2998 7.69922 -1.69922 17.5 5.80078 21.8994l39.1992 23l-34.0996 9.2998c-8.40039 2.30078 -13.2998 11.1006 -11.0996 19.6006l4.09961 15.5c2.2998 8.5 10.9004 13.5996 19.2998 11.2998l79.7002 -21.7002l71.9004 42.2002l-71.9004 42.2002l-79.7002 -21.7002
+c-8.39941 -2.2998 -17.0996 2.7998 -19.2998 11.2998l-4.09961 15.5c-2.30078 8.5 2.69922 17.2998 11.0996 19.6006l34.0996 9.09961l-39.1992 23c-7.60059 4.5 -10.1006 14.2002 -5.80078 21.9004l7.90039 13.8994c4.40039 7.7002 14 10.2998 21.5 5.90039l39.2002 -23
+l-9.10059 34.7002c-2.2998 8.5 2.7002 17.2998 11.1006 19.5996l15.2002 4.09961c8.39941 2.30078 17.0996 -2.7998 19.2998 -11.2998l21.2998 -81l71.9004 -42.2002v84.5l-58.3008 59.3008c-6.09961 6.19922 -6.09961 16.3994 0 22.5996l11.5 11.2998
+c6.10059 6.2002 16.1006 6.2002 22.2002 0l24.9004 -25.3994v46.0996c0 8.7998 7 16 15.7002 16h15.6992c8.7002 0 15.7002 -7.2002 15.7002 -16v-45.9004l24.9004 25.4004c6.09961 6.2002 16.0996 6.2002 22.2002 0l11.0996 -11.2998
+c6.09961 -6.2002 6.09961 -16.4004 0 -22.6006l-58.2998 -59.2998v-84.5l71.8994 42.2002l21.3008 81c2.2998 8.5 10.8994 13.5996 19.2998 11.2998l15.2002 -4.09961c8.39941 -2.2998 13.2998 -11.1006 11.0996 -19.6006l-9.09961 -34.6992l39.1992 23
+c7.5 4.39941 17.2002 1.7998 21.5 -5.90039l7.90039 -13.9004c4.2998 -7.69922 1.7002 -17.5 -5.7998 -21.8994l-39.2002 -23l34.0996 -9.2998c8.40039 -2.30078 13.3008 -11.1006 11.1006 -19.6006l-4.10059 -15.5c-2.2998 -8.5 -10.8994 -13.5996 -19.2998 -11.2998
+l-79.7002 21.7002l-71.8994 -42.2002l71.7998 -42.2002l79.7002 21.7002c8.39941 2.2998 17.0996 -2.7998 19.2998 -11.2998l4.09961 -15.5c2.30078 -8.5 -2.69922 -17.2998 -11.0996 -19.6006l-34.0996 -9.2998z" />
+    <glyph glyph-name="trash-alt" unicode="&#xf2ed;" horiz-adv-x="448" 
+d="M268 32c-6.62402 0 -12 5.37598 -12 12v216c0 6.62402 5.37598 12 12 12h24c6.62402 0 12 -5.37598 12 -12v-216c0 -6.62402 -5.37598 -12 -12 -12h-24zM432 368c8.83203 0 16 -7.16797 16 -16v-16c0 -8.83203 -7.16797 -16 -16 -16h-16v-336
+c0 -26.4961 -21.5039 -48 -48 -48h-288c-26.4961 0 -48 21.5039 -48 48v336h-16c-8.83203 0 -16 7.16797 -16 16v16c0 8.83203 7.16797 16 16 16h82.4102l34.0195 56.7002c7.71875 12.8613 26.1572 23.2998 41.1572 23.2998h0.00292969h100.82h0.0224609
+c15 0 33.4385 -10.4385 41.1572 -23.2998l34 -56.7002h82.4102zM171.84 397.09l-17.4502 -29.0898h139.221l-17.46 29.0898c-0.96582 1.60645 -3.26953 2.91016 -5.14355 2.91016h-0.00683594h-94h-0.0166016c-1.87402 0 -4.17871 -1.30371 -5.14355 -2.91016zM368 -16v336
+h-288v-336h288zM156 32c-6.62402 0 -12 5.37598 -12 12v216c0 6.62402 5.37598 12 12 12h24c6.62402 0 12 -5.37598 12 -12v-216c0 -6.62402 -5.37598 -12 -12 -12h-24z" />
+    <glyph glyph-name="images" unicode="&#xf302;" horiz-adv-x="576" 
+d="M480 32v-16c0 -26.5098 -21.4902 -48 -48 -48h-384c-26.5098 0 -48 21.4902 -48 48v256c0 26.5098 21.4902 48 48 48h16v-48h-10c-3.31152 0 -6 -2.68848 -6 -6v-244c0 -3.31152 2.68848 -6 6 -6h372c3.31152 0 6 2.68848 6 6v10h48zM522 368h-372
+c-3.31152 0 -6 -2.68848 -6 -6v-244c0 -3.31152 2.68848 -6 6 -6h372c3.31152 0 6 2.68848 6 6v244c0 3.31152 -2.68848 6 -6 6zM528 416c26.5098 0 48 -21.4902 48 -48v-256c0 -26.5098 -21.4902 -48 -48 -48h-384c-26.5098 0 -48 21.4902 -48 48v256
+c0 26.5098 21.4902 48 48 48h384zM264 304c0 -22.0908 -17.9092 -40 -40 -40s-40 17.9092 -40 40s17.9092 40 40 40s40 -17.9092 40 -40zM192 208l39.5146 39.5146c4.68652 4.68652 12.2842 4.68652 16.9717 0l39.5137 -39.5146l103.515 103.515
+c4.68652 4.68652 12.2842 4.68652 16.9717 0l71.5137 -71.5146v-80h-288v48z" />
+    <glyph glyph-name="clipboard" unicode="&#xf328;" horiz-adv-x="384" 
+d="M336 384c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h80c0 35.2998 28.7002 64 64 64s64 -28.7002 64 -64h80zM192 408c-13.2998 0 -24 -10.7002 -24 -24s10.7002 -24 24 -24s24 10.7002 24 24
+s-10.7002 24 -24 24zM336 -10v340c0 3.2998 -2.7002 6 -6 6h-42v-36c0 -6.59961 -5.40039 -12 -12 -12h-168c-6.59961 0 -12 5.40039 -12 12v36h-42c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h276c3.2998 0 6 2.7002 6 6z" />
+    <glyph glyph-name="arrow-alt-circle-down" unicode="&#xf358;" 
+d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200zM224 308c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-116
+h67c10.7002 0 16.0996 -12.9004 8.5 -20.5l-99 -99c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-99 99c-7.5 7.59961 -2.2002 20.5 8.5 20.5h67v116z" />
+    <glyph glyph-name="arrow-alt-circle-left" unicode="&#xf359;" 
+d="M8 192c0 137 111 248 248 248s248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248zM456 192c0 110.5 -89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200s200 89.5 200 200zM384 212v-40c0 -6.59961 -5.40039 -12 -12 -12h-116v-67
+c0 -10.7002 -12.9004 -16 -20.5 -8.5l-99 99c-4.7002 4.7002 -4.7002 12.2998 0 17l99 99c7.59961 7.59961 20.5 2.2002 20.5 -8.5v-67h116c6.59961 0 12 -5.40039 12 -12z" />
+    <glyph glyph-name="arrow-alt-circle-right" unicode="&#xf35a;" 
+d="M504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM56 192c0 -110.5 89.5 -200 200 -200s200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200zM128 172v40c0 6.59961 5.40039 12 12 12h116v67
+c0 10.7002 12.9004 16 20.5 8.5l99 -99c4.7002 -4.7002 4.7002 -12.2998 0 -17l-99 -99c-7.59961 -7.59961 -20.5 -2.2002 -20.5 8.5v67h-116c-6.59961 0 -12 5.40039 -12 12z" />
+    <glyph glyph-name="arrow-alt-circle-up" unicode="&#xf35b;" 
+d="M256 -56c-137 0 -248 111 -248 248s111 248 248 248s248 -111 248 -248s-111 -248 -248 -248zM256 392c-110.5 0 -200 -89.5 -200 -200s89.5 -200 200 -200s200 89.5 200 200s-89.5 200 -200 200zM276 64h-40c-6.59961 0 -12 5.40039 -12 12v116h-67
+c-10.7002 0 -16 12.9004 -8.5 20.5l99 99c4.7002 4.7002 12.2998 4.7002 17 0l99 -99c7.59961 -7.59961 2.2002 -20.5 -8.5 -20.5h-67v-116c0 -6.59961 -5.40039 -12 -12 -12z" />
+    <glyph glyph-name="gem" unicode="&#xf3a5;" horiz-adv-x="576" 
+d="M464 448c4.09961 0 7.7998 -2 10.0996 -5.40039l99.9004 -147.199c2.90039 -4.40039 2.59961 -10.1006 -0.700195 -14.2002l-276 -340.8c-4.7998 -5.90039 -13.7998 -5.90039 -18.5996 0l-276 340.8c-3.2998 4 -3.60059 9.7998 -0.700195 14.2002l100 147.199
+c2.2002 3.40039 6 5.40039 10 5.40039h352zM444.7 400h-56.7998l51.6992 -96h68.4004zM242.6 400l-51.5996 -96h194l-51.7002 96h-90.7002zM131.3 400l-63.2998 -96h68.4004l51.6992 96h-56.7998zM88.2998 256l119.7 -160l-68.2998 160h-51.4004zM191.2 256l96.7998 -243.3
+l96.7998 243.3h-193.6zM368 96l119.6 160h-51.3994z" />
+    <glyph glyph-name="money-bill-alt" unicode="&#xf3d1;" horiz-adv-x="640" 
+d="M320 304c53.0195 0 96 -50.1396 96 -112c0 -61.8701 -43 -112 -96 -112c-53.0195 0 -96 50.1504 -96 112c0 61.8604 42.9805 112 96 112zM360 136v16c0 4.41992 -3.58008 8 -8 8h-16v88c0 4.41992 -3.58008 8 -8 8h-13.5801h-0.000976562
+c-4.01074 0 -9.97266 -1.80566 -13.3086 -4.03027l-15.3301 -10.2197c-1.96777 -1.30957 -3.56445 -4.29004 -3.56445 -6.65332c0 -1.33691 0.601562 -3.32422 1.34375 -4.43652l8.88086 -13.3105c1.30859 -1.9668 4.29004 -3.56445 6.65332 -3.56445
+c1.33691 0 3.32422 0.602539 4.43652 1.34473l0.469727 0.310547v-55.4404h-16c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h64c4.41992 0 8 3.58008 8 8zM608 384c17.6699 0 32 -14.3301 32 -32v-320c0 -17.6699 -14.3301 -32 -32 -32h-576
+c-17.6699 0 -32 14.3301 -32 32v320c0 17.6699 14.3301 32 32 32h576zM592 112v160c-35.3496 0 -64 28.6504 -64 64h-416c0 -35.3496 -28.6504 -64 -64 -64v-160c35.3496 0 64 -28.6504 64 -64h416c0 35.3496 28.6504 64 64 64z" />
+    <glyph glyph-name="window-close" unicode="&#xf410;" 
+d="M464 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h416zM464 22v340c0 3.2998 -2.7002 6 -6 6h-404c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h404c3.2998 0 6 2.7002 6 6z
+M356.5 253.4l-61.4004 -61.4004l61.4004 -61.4004c4.59961 -4.59961 4.59961 -12.0996 0 -16.7998l-22.2998 -22.2998c-4.60059 -4.59961 -12.1006 -4.59961 -16.7998 0l-61.4004 61.4004l-61.4004 -61.4004c-4.59961 -4.59961 -12.0996 -4.59961 -16.7998 0
+l-22.2998 22.2998c-4.59961 4.60059 -4.59961 12.1006 0 16.7998l61.4004 61.4004l-61.4004 61.4004c-4.59961 4.59961 -4.59961 12.0996 0 16.7998l22.2998 22.2998c4.60059 4.59961 12.1006 4.59961 16.7998 0l61.4004 -61.4004l61.4004 61.4004
+c4.59961 4.59961 12.0996 4.59961 16.7998 0l22.2998 -22.2998c4.7002 -4.60059 4.7002 -12.1006 0 -16.7998z" />
+    <glyph glyph-name="comment-dots" unicode="&#xf4ad;" 
+d="M144 240c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM256 240c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM368 240c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32
+s-32 14.2998 -32 32s14.2998 32 32 32zM256 416c141.4 0 256 -93.0996 256 -208s-114.6 -208 -256 -208c-32.7998 0 -64 5.2002 -92.9004 14.2998c-29.0996 -20.5996 -77.5996 -46.2998 -139.1 -46.2998c-9.59961 0 -18.2998 5.7002 -22.0996 14.5
+c-3.80078 8.7998 -2 19 4.59961 26c0.5 0.400391 31.5 33.7998 46.4004 73.2002c-33 35.0996 -52.9004 78.7002 -52.9004 126.3c0 114.9 114.6 208 256 208zM256 48c114.7 0 208 71.7998 208 160s-93.2998 160 -208 160s-208 -71.7998 -208 -160
+c0 -42.2002 21.7002 -74.0996 39.7998 -93.4004l20.6006 -21.7998l-10.6006 -28.0996c-5.5 -14.5 -12.5996 -28.1006 -19.8994 -40.2002c23.5996 7.59961 43.1992 18.9004 57.5 29l19.5 13.7998l22.6992 -7.2002c25.3008 -8 51.7002 -12.0996 78.4004 -12.0996z" />
+    <glyph glyph-name="smile-wink" unicode="&#xf4da;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM365.8 138.4c10.2002 -8.5 11.6006 -23.6006 3.10059 -33.8008
+c-30 -36 -74.1006 -56.5996 -120.9 -56.5996s-90.9004 20.5996 -120.9 56.5996c-8.39941 10.2002 -7.09961 25.3008 3.10059 33.8008c10.0996 8.39941 25.2998 7.09961 33.7998 -3.10059c20.7998 -25.0996 51.5 -39.3994 84 -39.3994s63.2002 14.3994 84 39.3994
+c8.5 10.2002 23.5996 11.6006 33.7998 3.10059zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 268c25.7002 0 55.9004 -16.9004 59.7002 -42.0996c1.7998 -11.1006 -11.2998 -18.2002 -19.7998 -10.8008l-9.5 8.5
+c-14.8008 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5c-8.30078 -7.39941 -21.5 -0.399414 -19.8008 10.8008c4 25.1992 34.2002 42.0996 59.9004 42.0996z" />
+    <glyph glyph-name="angry" unicode="&#xf556;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM248 136c33.5996 0 65.2002 -14.7998 86.7998 -40.5996
+c8.40039 -10.2002 7.10059 -25.3008 -3.09961 -33.8008c-10.6006 -8.89941 -25.7002 -6.69922 -33.7998 3c-24.8008 29.7002 -75 29.7002 -99.8008 0c-8.5 -10.1992 -23.5996 -11.5 -33.7998 -3s-11.5996 23.6006 -3.09961 33.8008
+c21.5996 25.7998 53.2002 40.5996 86.7998 40.5996zM200 208c0 -17.7002 -14.2998 -32.0996 -32 -32.0996s-32 14.2998 -32 32c0 6.19922 2.2002 11.6992 5.2998 16.5996l-28.2002 8.5c-12.6992 3.7998 -19.8994 17.2002 -16.0996 29.9004
+c3.7998 12.6992 17.0996 20 29.9004 16.0996l80 -24c12.6992 -3.7998 19.8994 -17.2002 16.0996 -29.9004c-3.09961 -10.3994 -12.7002 -17.0996 -23 -17.0996zM399 262.9c3.7998 -12.7002 -3.40039 -26.1006 -16.0996 -29.8008l-28.2002 -8.5
+c3.09961 -4.89941 5.2998 -10.3994 5.2998 -16.5996c0 -17.7002 -14.2998 -32 -32 -32s-32 14.2998 -32 32c-10.2998 0 -19.9004 6.7002 -23 17.0996c-3.7998 12.7002 3.40039 26.1006 16.0996 29.9004l80 24c12.8008 3.7998 26.1006 -3.40039 29.9004 -16.0996z" />
+    <glyph glyph-name="dizzy" unicode="&#xf567;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM214.2 209.9
+c-7.90039 -7.90039 -20.5 -7.90039 -28.4004 -0.200195l-17.7998 17.7998l-17.7998 -17.7998c-7.7998 -7.7998 -20.5 -7.7998 -28.2998 0c-7.80078 7.7998 -7.80078 20.5 0 28.2998l17.8994 17.9004l-17.8994 17.8994c-7.80078 7.7998 -7.80078 20.5 0 28.2998
+c7.7998 7.80078 20.5 7.80078 28.2998 0l17.7998 -17.7998l17.9004 17.9004c7.7998 7.7998 20.5 7.7998 28.2998 0s7.7998 -20.5 0 -28.2998l-17.9004 -17.9004l17.9004 -17.7998c7.7998 -7.7998 7.7998 -20.5 0 -28.2998zM374.2 302.1
+c7.7002 -7.7998 7.7002 -20.3994 0 -28.1992l-17.9004 -17.9004l17.7998 -18c7.80078 -7.7998 7.80078 -20.5 0 -28.2998c-7.7998 -7.7998 -20.5 -7.7998 -28.2998 0l-17.7998 17.7998l-17.7998 -17.7998c-7.7998 -7.7998 -20.5 -7.7998 -28.2998 0
+c-7.80078 7.7998 -7.80078 20.5 0 28.2998l17.8994 17.9004l-17.8994 17.8994c-7.80078 7.7998 -7.80078 20.5 0 28.2998c7.7998 7.80078 20.5 7.80078 28.2998 0l17.7998 -17.7998l17.9004 17.7998c7.7998 7.80078 20.5 7.80078 28.2998 0zM248 176
+c35.2998 0 64 -28.7002 64 -64s-28.7002 -64 -64 -64s-64 28.7002 -64 64s28.7002 64 64 64z" />
+    <glyph glyph-name="flushed" unicode="&#xf579;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM344 304c44.2002 0 80 -35.7998 80 -80s-35.7998 -80 -80 -80
+s-80 35.7998 -80 80s35.7998 80 80 80zM344 176c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM344 248c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM232 224c0 -44.2002 -35.7998 -80 -80 -80
+s-80 35.7998 -80 80s35.7998 80 80 80s80 -35.7998 80 -80zM152 176c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM152 248c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM312 104
+c13.2002 0 24 -10.7998 24 -24s-10.7998 -24 -24 -24h-128c-13.2002 0 -24 10.7998 -24 24s10.7998 24 24 24h128z" />
+    <glyph glyph-name="frown-open" unicode="&#xf57a;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM200 240c0 -17.7002 -14.2998 -32 -32 -32s-32 14.2998 -32 32
+s14.2998 32 32 32s32 -14.2998 32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM248 160c35.5996 0 88.7998 -21.2998 95.7998 -61.2002c2 -11.7998 -9.09961 -21.5996 -20.5 -18.0996
+c-31.2002 9.59961 -59.3994 15.2998 -75.2998 15.2998s-44.0996 -5.7002 -75.2998 -15.2998c-11.5 -3.40039 -22.5 6.2998 -20.5 18.0996c7 39.9004 60.2002 61.2002 95.7998 61.2002z" />
+    <glyph glyph-name="grimace" unicode="&#xf57f;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
+s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM344 192c26.5 0 48 -21.5 48 -48v-32c0 -26.5 -21.5 -48 -48 -48h-192c-26.5 0 -48 21.5 -48 48v32c0 26.5 21.5 48 48 48
+h192zM176 96v24h-40v-8c0 -8.7998 7.2002 -16 16 -16h24zM176 136v24h-24c-8.7998 0 -16 -7.2002 -16 -16v-8h40zM240 96v24h-48v-24h48zM240 136v24h-48v-24h48zM304 96v24h-48v-24h48zM304 136v24h-48v-24h48zM360 112v8h-40v-24h24c8.7998 0 16 7.2002 16 16zM360 136v8
+c0 8.7998 -7.2002 16 -16 16h-24v-24h40z" />
+    <glyph glyph-name="grin" unicode="&#xf580;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008
+c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.9004 -123.3 80c-1.7002 9.90039 7.7998 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
+s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32z" />
+    <glyph glyph-name="grin-alt" unicode="&#xf581;" horiz-adv-x="496" 
+d="M200.3 200c-7.5 -11.4004 -24.5996 -12 -32.7002 0c-12.3994 18.7002 -15.1992 37.2998 -15.6992 56c0.599609 18.7002 3.2998 37.2998 15.6992 56c7.60059 11.4004 24.7002 12 32.7002 0c12.4004 -18.7002 15.2002 -37.2998 15.7002 -56
+c-0.599609 -18.7002 -3.2998 -37.2998 -15.7002 -56zM328.3 200c-7.5 -11.4004 -24.5996 -12 -32.7002 0c-12.3994 18.7002 -15.1992 37.2998 -15.6992 56c0.599609 18.7002 3.2998 37.2998 15.6992 56c7.60059 11.4004 24.7002 12 32.7002 0
+c12.4004 -18.7002 15.2002 -37.2998 15.7002 -56c-0.599609 -18.7002 -3.2998 -37.2998 -15.7002 -56zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200
+s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.8008 -123.3 80c-1.7002 10 7.7998 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006
+s79.7002 4.7998 105.6 13.1006z" />
+    <glyph glyph-name="grin-beam" unicode="&#xf582;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008
+c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.9004 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM117.7 216.3c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998
+c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996
+l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002zM277.7 216.3c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998
+c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002z" />
+    <glyph glyph-name="grin-beam-sweat" unicode="&#xf583;" horiz-adv-x="496" 
+d="M440 288c-29.5 0 -53.2998 26.2998 -53.2998 58.7002c0 25 31.7002 75.5 46.2002 97.2998c3.5 5.2998 10.5996 5.2998 14.1992 0c14.5 -21.7998 46.2002 -72.2998 46.2002 -97.2998c0 -32.4004 -23.7998 -58.7002 -53.2998 -58.7002zM248 48
+c-51.9004 0 -115.3 32.9004 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996s79.7002 4.7998 105.6 13.0996c10 3.2002 19.4004 -5.39941 17.7002 -15.2998c-8 -47.0996 -71.3994 -80 -123.3 -80zM378.3 216.3
+c-3.09961 -0.899414 -7.2002 0.100586 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998
+c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998zM483.6 269.2c8 -24.2998 12.4004 -50.2002 12.4004 -77.2002c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248
+c45.7002 0 88.4004 -12.5996 125.2 -34.2002c-10.9004 -21.5996 -15.5 -36.2002 -17.2002 -45.7002c-31.2002 20.1006 -68.2002 31.9004 -108 31.9004c-110.3 0 -200 -89.7002 -200 -200s89.7002 -200 200 -200s200 89.7002 200 200
+c0 22.5 -3.90039 44.0996 -10.7998 64.2998c0.399414 0 21.7998 -2.7998 46.3994 12.9004zM168 258.6c-12.2998 0 -23.7998 -7.7998 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998
+c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996z" />
+    <glyph glyph-name="grin-hearts" unicode="&#xf584;" horiz-adv-x="496" 
+d="M353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.8008 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM200.8 192.3
+l-70.2002 18.1006c-20.3994 5.2998 -31.8994 27 -24.1992 47.1992c6.69922 17.7002 26.6992 26.7002 44.8994 22l7.10059 -1.89941l2 7.09961c5.09961 18.1006 22.8994 30.9004 41.5 27.9004c21.3994 -3.40039 34.3994 -24.2002 28.7998 -44.5l-19.4004 -69.9004
+c-1.2998 -4.5 -6 -7.2002 -10.5 -6zM389.6 257.6c7.7002 -20.1992 -3.7998 -41.7998 -24.1992 -47.0996l-70.2002 -18.2002c-4.60059 -1.2002 -9.2998 1.5 -10.5 6l-19.4004 69.9004c-5.59961 20.2998 7.40039 41.0996 28.7998 44.5c18.7002 3 36.5 -9.7998 41.5 -27.9004
+l2 -7.09961l7.10059 1.89941c18.2002 4.7002 38.2002 -4.39941 44.8994 -22zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200
+s89.7002 -200 200 -200z" />
+    <glyph glyph-name="grin-squint" unicode="&#xf585;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008
+c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.9004 -123.3 80c-1.7002 9.90039 7.7998 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM118.9 184.2c-3.80078 4.39941 -3.90039 11 -0.100586 15.5l33.6006 40.2998
+l-33.6006 40.2998c-3.7002 4.5 -3.7002 11 0.100586 15.5c3.89941 4.40039 10.1992 5.5 15.2998 2.5l80 -48c3.59961 -2.2002 5.7998 -6.09961 5.7998 -10.2998s-2.2002 -8.09961 -5.7998 -10.2998l-80 -48c-5.40039 -3.2002 -11.7002 -1.7002 -15.2998 2.5zM361.8 181.7
+l-80 48c-3.59961 2.2002 -5.7998 6.09961 -5.7998 10.2998s2.2002 8.09961 5.7998 10.2998l80 48c5.10059 2.90039 11.5 1.90039 15.2998 -2.5c3.80078 -4.5 3.90039 -11 0.100586 -15.5l-33.6006 -40.2998l33.6006 -40.2998c3.7002 -4.5 3.7002 -11 -0.100586 -15.5
+c-3.59961 -4.2002 -9.89941 -5.7002 -15.2998 -2.5z" />
+    <glyph glyph-name="grin-squint-tears" unicode="&#xf586;" 
+d="M117.1 63.9004c6.30078 0.899414 11.7002 -4.5 10.9004 -10.9004c-3.7002 -25.7998 -13.7002 -84 -30.5996 -100.9c-22 -21.8994 -57.9004 -21.5 -80.3008 0.900391c-22.3994 22.4004 -22.7998 58.4004 -0.899414 80.2998
+c16.8994 16.9004 75.0996 26.9004 100.899 30.6006zM75.9004 105.6c-19.6006 -3.89941 -35.1006 -8.09961 -47.3008 -12.1992c-39.2998 90.5996 -22.0996 199.899 52 274c48.5 48.3994 111.9 72.5996 175.4 72.5996c38.9004 0 77.7998 -9.2002 113.2 -27.4004
+c-4 -12.1992 -8.2002 -28 -12 -48.2998c-30.4004 17.9004 -65 27.7002 -101.2 27.7002c-53.4004 0 -103.6 -20.7998 -141.4 -58.5996c-61.5996 -61.5 -74.2998 -153.4 -38.6992 -227.801zM428.2 293.2c20.2998 3.89941 36.2002 8 48.5 12
+c47.8994 -93.2002 32.8994 -210.5 -45.2002 -288.601c-48.5 -48.3994 -111.9 -72.5996 -175.4 -72.5996c-33.6992 0 -67.2998 7 -98.6992 20.5996c4.19922 12.2002 8.2998 27.7002 12.1992 47.2002c26.6006 -12.7998 55.9004 -19.7998 86.4004 -19.7998
+c53.4004 0 103.6 20.7998 141.4 58.5996c65.6992 65.7002 75.7998 166 30.7998 242.601zM394.9 320.1c-6.30078 -0.899414 -11.7002 4.5 -10.9004 10.9004c3.7002 25.7998 13.7002 84 30.5996 100.9c22 21.8994 57.9004 21.5 80.3008 -0.900391
+c22.3994 -22.4004 22.7998 -58.4004 0.899414 -80.2998c-16.8994 -16.9004 -75.0996 -26.9004 -100.899 -30.6006zM207.9 211.8c3 -3 4.19922 -7.2998 3.19922 -11.5l-22.5996 -90.5c-1.40039 -5.39941 -6.2002 -9.09961 -11.7002 -9.09961h-0.899414
+c-5.80078 0.5 -10.5 5.09961 -11 10.8994l-4.80078 52.3008l-52.2998 4.7998c-5.7998 0.5 -10.3994 5.2002 -10.8994 11c-0.400391 5.89941 3.39941 11.2002 9.09961 12.5996l90.5 22.7002c4.2002 1 8.40039 -0.200195 11.4004 -3.2002zM247.6 236.9
+c-0.0996094 0 -6.39941 -1.80078 -11.3994 3.19922c-3 3 -4.2002 7.30078 -3.2002 11.4004l22.5996 90.5c1.40039 5.7002 7 9.2002 12.6006 9.09961c5.7998 -0.5 10.5 -5.09961 11 -10.8994l4.7998 -52.2998l52.2998 -4.80078c5.7998 -0.5 10.4004 -5.19922 10.9004 -11
+c0.399414 -5.89941 -3.40039 -11.1992 -9.10059 -12.5996zM299.6 148.4c29.1006 29.0996 53 59.5996 65.3008 83.7998c4.89941 9.2998 17.5996 9.89941 23.3994 1.7002c27.7002 -38.9004 6.10059 -106.9 -30.5996 -143.7s-104.8 -58.2998 -143.7 -30.6006
+c-8.2998 5.90039 -7.5 18.6006 1.7002 23.4004c24.2002 12.5 54.7998 36.2998 83.8994 65.4004z" />
+    <glyph glyph-name="grin-stars" unicode="&#xf587;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008
+c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.8008 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM125.7 200.9l6.09961 34.8994l-25.3994 24.6006
+c-4.60059 4.59961 -1.90039 12.2998 4.2998 13.1992l34.8994 5l15.5 31.6006c2.90039 5.7998 11 5.7998 13.9004 0l15.5 -31.6006l34.9004 -5c6.19922 -1 8.7998 -8.69922 4.2998 -13.1992l-25.4004 -24.6006l6 -34.8994c1 -6.2002 -5.39941 -11 -11 -7.90039
+l-31.2998 16.2998l-31.2998 -16.2998c-5.60059 -3.09961 -12 1.7002 -11 7.90039zM385.4 273.6c6.19922 -1 8.89941 -8.59961 4.39941 -13.1992l-25.3994 -24.6006l6 -34.8994c1 -6.2002 -5.40039 -11 -11 -7.90039l-31.3008 16.2998l-31.2998 -16.2998
+c-5.59961 -3.09961 -12 1.7002 -11 7.90039l6 34.8994l-25.3994 24.6006c-4.60059 4.59961 -1.90039 12.2998 4.2998 13.1992l34.8994 5l15.5 31.6006c2.90039 5.7998 11 5.7998 13.9004 0l15.5 -31.6006z" />
+    <glyph glyph-name="grin-tears" unicode="&#xf588;" horiz-adv-x="640" 
+d="M117.1 191.9c6.30078 0.899414 11.7002 -4.5 10.9004 -10.9004c-3.7002 -25.7998 -13.7002 -84 -30.5996 -100.9c-22 -21.8994 -57.9004 -21.5 -80.3008 0.900391c-22.3994 22.4004 -22.7998 58.4004 -0.899414 80.2998c16.8994 16.9004 75.0996 26.9004 100.899 30.6006
+zM623.8 161.3c21.9004 -21.8994 21.5 -57.8994 -0.799805 -80.2002c-22.4004 -22.3994 -58.4004 -22.7998 -80.2998 -0.899414c-16.9004 16.8994 -26.9004 75.0996 -30.6006 100.899c-0.899414 6.30078 4.5 11.7002 10.8008 10.8008
+c25.7998 -3.7002 84 -13.7002 100.899 -30.6006zM497.2 99.5996c12.3994 -37.2998 25.0996 -43.7998 28.2998 -46.5c-44.5996 -65.7998 -120 -109.1 -205.5 -109.1s-160.9 43.2998 -205.5 109.1c3.09961 2.60059 15.7998 9.10059 28.2998 46.5
+c33.4004 -63.8994 100.3 -107.6 177.2 -107.6s143.8 43.7002 177.2 107.6zM122.7 223.5c-2.40039 0.299805 -5 2.5 -49.5 -6.90039c12.3994 125.4 118.1 223.4 246.8 223.4s234.4 -98 246.8 -223.5c-44.2998 9.40039 -47.3994 7.2002 -49.5 7
+c-15.2002 95.2998 -97.7998 168.5 -197.3 168.5s-182.1 -73.2002 -197.3 -168.5zM320 48c-51.9004 0 -115.3 32.9004 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996s79.7002 4.7998 105.6 13.0996
+c10 3.2002 19.4004 -5.39941 17.7002 -15.2998c-8 -47.0996 -71.3994 -80 -123.3 -80zM450.3 216.3c-3.09961 -0.899414 -7.2002 0.100586 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996l-9.5 -17
+c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998zM240 258.6
+c-12.2998 0 -23.7998 -7.7998 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004
+c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996z" />
+    <glyph glyph-name="grin-tongue" unicode="&#xf589;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM312 40h0.0996094v43.7998l-17.6992 8.7998c-15.1006 7.60059 -31.5 -1.69922 -34.9004 -16.5l-2.7998 -12.0996c-2.10059 -9.2002 -15.2002 -9.2002 -17.2998 0
+l-2.80078 12.0996c-3.39941 14.8008 -19.8994 24 -34.8994 16.5l-17.7002 -8.7998v-42.7998c0 -35.2002 28 -64.5 63.0996 -65c35.8008 -0.5 64.9004 28.4004 64.9004 64zM340.2 14.7002c64 33.3994 107.8 100.3 107.8 177.3c0 110.3 -89.7002 200 -200 200
+s-200 -89.7002 -200 -200c0 -77 43.7998 -143.9 107.8 -177.3c-2.2002 8.09961 -3.7998 16.5 -3.7998 25.2998v43.5c-14.2002 12.4004 -24.4004 27.5 -27.2998 44.5c-1.7002 10 7.7998 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996
+s79.7002 4.7998 105.6 13.0996c10 3.2002 19.4004 -5.39941 17.7002 -15.2998c-2.89941 -17 -13.0996 -32.0996 -27.2998 -44.5v-43.5c0 -8.7998 -1.59961 -17.2002 -3.7998 -25.2998zM168 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32
+s14.2998 32 32 32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32z" />
+    <glyph glyph-name="grin-tongue-squint" unicode="&#xf58a;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM312 40h0.0996094v43.7998l-17.6992 8.7998c-15.1006 7.60059 -31.5 -1.69922 -34.9004 -16.5l-2.7998 -12.0996c-2.10059 -9.2002 -15.2002 -9.2002 -17.2998 0
+l-2.80078 12.0996c-3.39941 14.8008 -19.8994 24 -34.8994 16.5l-17.7002 -8.7998v-42.7998c0 -35.2002 28 -64.5 63.0996 -65c35.8008 -0.5 64.9004 28.4004 64.9004 64zM340.2 14.7002c64 33.3994 107.8 100.3 107.8 177.3c0 110.3 -89.7002 200 -200 200
+s-200 -89.7002 -200 -200c0 -77 43.7998 -143.9 107.8 -177.3c-2.2002 8.09961 -3.7998 16.5 -3.7998 25.2998v43.5c-14.2002 12.4004 -24.4004 27.5 -27.2998 44.5c-1.7002 10 7.7998 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996
+s79.7002 4.7998 105.6 13.0996c10 3.2002 19.4004 -5.39941 17.7002 -15.2998c-2.89941 -17 -13.0996 -32.0996 -27.2998 -44.5v-43.5c0 -8.7998 -1.59961 -17.2002 -3.7998 -25.2998zM377.1 295.8c3.80078 -4.39941 3.90039 -11 0.100586 -15.5l-33.6006 -40.2998
+l33.6006 -40.2998c3.7002 -4.5 3.7002 -11 -0.100586 -15.5c-3.59961 -4.2002 -9.89941 -5.7002 -15.2998 -2.5l-80 48c-3.59961 2.2002 -5.7998 6.09961 -5.7998 10.2998s2.2002 8.09961 5.7998 10.2998l80 48c5 3 11.5 1.90039 15.2998 -2.5zM214.2 250.3
+c3.59961 -2.2002 5.7998 -6.09961 5.7998 -10.2998s-2.2002 -8.09961 -5.7998 -10.2998l-80 -48c-5.40039 -3.2002 -11.7002 -1.7002 -15.2998 2.5c-3.80078 4.5 -3.90039 11 -0.100586 15.5l33.6006 40.2998l-33.6006 40.2998c-3.7002 4.5 -3.7002 11 0.100586 15.5
+c3.89941 4.5 10.2998 5.5 15.2998 2.5z" />
+    <glyph glyph-name="grin-tongue-wink" unicode="&#xf58b;" horiz-adv-x="496" 
+d="M152 268c25.7002 0 55.9004 -16.9004 59.7998 -42.0996c0.799805 -5 -1.7002 -10 -6.09961 -12.4004c-5.7002 -3.09961 -11.2002 -0.599609 -13.7002 1.59961l-9.5 8.5c-14.7998 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5
+c-3.7998 -3.39941 -9.2998 -4 -13.7002 -1.59961c-4.39941 2.40039 -6.89941 7.40039 -6.09961 12.4004c3.89941 25.1992 34.0996 42.0996 59.7998 42.0996zM328 320c44.2002 0 80 -35.7998 80 -80s-35.7998 -80 -80 -80s-80 35.7998 -80 80s35.7998 80 80 80zM328 192
+c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM328 264c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248z
+M312 40h0.0996094v43.7998l-17.6992 8.7998c-15.1006 7.60059 -31.5 -1.69922 -34.9004 -16.5l-2.7998 -12.0996c-2.10059 -9.2002 -15.2002 -9.2002 -17.2998 0l-2.80078 12.0996c-3.39941 14.8008 -19.8994 24 -34.8994 16.5l-17.7002 -8.7998v-42.7998
+c0 -35.2002 28 -64.5 63.0996 -65c35.8008 -0.5 64.9004 28.4004 64.9004 64zM340.2 14.7002c64 33.3994 107.8 100.3 107.8 177.3c0 110.3 -89.7002 200 -200 200s-200 -89.7002 -200 -200c0 -77 43.7998 -143.9 107.8 -177.3
+c-2.2002 8.09961 -3.7998 16.5 -3.7998 25.2998v43.5c-14.2002 12.4004 -24.4004 27.5 -27.2998 44.5c-1.7002 10 7.7998 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996s79.7002 4.7998 105.6 13.0996c10 3.2002 19.4004 -5.39941 17.7002 -15.2998
+c-2.89941 -17 -13.0996 -32.0996 -27.2998 -44.5v-43.5c0 -8.7998 -1.59961 -17.2002 -3.7998 -25.2998z" />
+    <glyph glyph-name="grin-wink" unicode="&#xf58c;" horiz-adv-x="496" 
+d="M328 268c25.6904 0 55.8799 -16.9199 59.8701 -42.1201c1.72949 -11.0898 -11.3506 -18.2695 -19.8301 -10.8398l-9.5498 8.47949c-14.8105 13.1904 -46.1602 13.1904 -60.9707 0l-9.5498 -8.47949c-8.33008 -7.40039 -21.5801 -0.379883 -19.8301 10.8398
+c3.98047 25.2002 34.1699 42.1201 59.8604 42.1201zM168 208c-17.6699 0 -32 14.3301 -32 32s14.3301 32 32 32s32 -14.3301 32 -32s-14.3301 -32 -32 -32zM353.55 143.36c10.04 3.13965 19.3906 -5.4502 17.71 -15.3408
+c-7.92969 -47.1494 -71.3193 -80.0195 -123.26 -80.0195s-115.33 32.8701 -123.26 80.0195c-1.69043 9.9707 7.76953 18.4707 17.71 15.3408c25.9297 -8.31055 64.3994 -13.0605 105.55 -13.0605s79.6201 4.75977 105.55 13.0605zM248 440c136.97 0 248 -111.03 248 -248
+s-111.03 -248 -248 -248s-248 111.03 -248 248s111.03 248 248 248zM248 -8c110.28 0 200 89.7197 200 200s-89.7197 200 -200 200s-200 -89.7197 -200 -200s89.7197 -200 200 -200z" />
+    <glyph glyph-name="kiss" unicode="&#xf596;" horiz-adv-x="496" 
+d="M168 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM304 140c0 -13 -13.4004 -27.2998 -35.0996 -36.4004c21.7998 -8.69922 35.1992 -23 35.1992 -36c0 -19.1992 -28.6992 -41.5 -71.5 -44h-0.5
+c-3.69922 0 -7 2.60059 -7.7998 6.2002c-0.899414 3.7998 1.10059 7.7002 4.7002 9.2002l17 7.2002c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.2002c-6 2.59961 -5.7002 12.3994 0 14.7998l17 7.2002
+c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.19922c-3.59961 1.5 -5.59961 5.40039 -4.7002 9.2002c0.799805 3.7998 4.40039 6.60059 8.2002 6.2002c42.7002 -2.5 71.5 -24.7998 71.5 -44zM248 440c137 0 248 -111 248 -248
+s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32z
+" />
+    <glyph glyph-name="kiss-beam" unicode="&#xf597;" horiz-adv-x="496" 
+d="M168 296c23.7998 0 52.7002 -29.2998 55.7998 -71.4004c0.299805 -3.7998 -2 -7.19922 -5.59961 -8.2998c-3.10059 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996c-12.3008 0 -23.8008 -7.89941 -31.5 -21.5996l-9.5 -17
+c-1.80078 -3.2002 -5.80078 -4.7002 -9.30078 -3.7002c-3.59961 1.10059 -5.89941 4.60059 -5.59961 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8
+c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM304 140c0 -13 -13.4004 -27.2998 -35.0996 -36.4004c21.7998 -8.69922 35.1992 -23 35.1992 -36c0 -19.1992 -28.6992 -41.5 -71.5 -44h-0.5
+c-3.69922 0 -7 2.60059 -7.7998 6.2002c-0.899414 3.7998 1.10059 7.7002 4.7002 9.2002l17 7.2002c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.2002c-6 2.59961 -5.7002 12.3994 0 14.7998l17 7.2002
+c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.19922c-3.59961 1.5 -5.59961 5.40039 -4.7002 9.2002c0.799805 3.7998 4.40039 6.60059 8.2002 6.2002c42.7002 -2.5 71.5 -24.7998 71.5 -44zM328 296
+c23.7998 0 52.7002 -29.2998 55.7998 -71.4004c0.299805 -3.7998 -2 -7.19922 -5.59961 -8.2998c-3.10059 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996c-12.3008 0 -23.8008 -7.89941 -31.5 -21.5996l-9.5 -17
+c-1.80078 -3.2002 -5.80078 -4.7002 -9.30078 -3.7002c-3.59961 1.10059 -5.89941 4.60059 -5.59961 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004z" />
+    <glyph glyph-name="kiss-wink-heart" unicode="&#xf598;" horiz-adv-x="504" 
+d="M304 139.5c0 -13 -13.4004 -27.2998 -35.0996 -36.4004c21.7998 -8.69922 35.1992 -23 35.1992 -36c0 -19.1992 -28.6992 -41.5 -71.5 -44h-0.5c-3.69922 0 -7 2.60059 -7.7998 6.2002c-0.899414 3.7998 1.10059 7.7002 4.7002 9.2002l17 7.2002
+c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.2002c-6 2.59961 -5.7002 12.3994 0 14.7998l17 7.2002c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.19922c-3.59961 1.5 -5.59961 5.40039 -4.7002 9.2002
+c0.799805 3.7998 4.40039 6.60059 8.2002 6.2002c42.7002 -2.5 71.5 -24.7998 71.5 -44zM374.5 223c-14.7998 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5c-2.5 -2.2998 -7.90039 -4.7002 -13.7002 -1.59961c-4.39941 2.39941 -6.89941 7.39941 -6.09961 12.3994
+c3.89941 25.2002 34.2002 42.1006 59.7998 42.1006s55.7998 -16.9004 59.7998 -42.1006c0.799805 -5 -1.7002 -10 -6.09961 -12.3994c-4.40039 -2.40039 -9.90039 -1.7002 -13.7002 1.59961zM136 239.5c0 17.7002 14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32
+s-32 14.2998 -32 32zM501.1 45.5c9.2002 -23.9004 -4.39941 -49.4004 -28.5 -55.7002l-83 -21.5c-5.39941 -1.39941 -10.8994 1.7998 -12.3994 7.10059l-22.9004 82.5996c-6.59961 24 8.7998 48.5996 34 52.5996c22 3.5 43.1006 -11.5996 49 -33l2.2998 -8.39941
+l8.40039 2.2002c21.5996 5.59961 45.0996 -5.10059 53.0996 -25.9004zM334 11.7002c17.7002 -64 10.9004 -39.5 13.4004 -46.7998c-30.5 -13.4004 -64 -20.9004 -99.4004 -20.9004c-137 0 -248 111 -248 248s111 248 248 248s248 -111 247.9 -248
+c0 -31.7998 -6.2002 -62.0996 -17.1006 -90c-6 1.5 -12.2002 2.7998 -18.5996 2.90039c-5.60059 9.69922 -13.6006 17.5 -22.6006 23.8994c6.7002 19.9004 10.4004 41.1006 10.4004 63.2002c0 110.3 -89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200
+c30.7998 0 59.9004 7.2002 86 19.7002z" />
+    <glyph glyph-name="laugh" unicode="&#xf599;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM389.4 50.5996c37.7998 37.8008 58.5996 88 58.5996 141.4s-20.7998 103.6 -58.5996 141.4c-37.8008 37.7998 -88 58.5996 -141.4 58.5996s-103.6 -20.7998 -141.4 -58.5996
+c-37.7998 -37.8008 -58.5996 -88 -58.5996 -141.4s20.7998 -103.6 58.5996 -141.4c37.8008 -37.7998 88 -58.5996 141.4 -58.5996s103.6 20.7998 141.4 58.5996zM328 224c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM168 224
+c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM362.4 160c8.19922 0 14.5 -7 13.5 -15c-7.5 -59.2002 -58.9004 -105 -121.101 -105h-13.5996c-62.2002 0 -113.601 45.7998 -121.101 105c-1 8 5.30078 15 13.5 15h228.801z" />
+    <glyph glyph-name="laugh-beam" unicode="&#xf59a;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM389.4 50.5996c37.7998 37.8008 58.5996 88 58.5996 141.4s-20.7998 103.6 -58.5996 141.4c-37.8008 37.7998 -88 58.5996 -141.4 58.5996s-103.6 -20.7998 -141.4 -58.5996
+c-37.7998 -37.8008 -58.5996 -88 -58.5996 -141.4s20.7998 -103.6 58.5996 -141.4c37.8008 -37.7998 88 -58.5996 141.4 -58.5996s103.6 20.7998 141.4 58.5996zM328 296c23.7998 0 52.7002 -29.2998 55.7998 -71.4004c0.700195 -8.5 -10.7998 -11.8994 -14.8994 -4.5
+l-9.5 17c-7.7002 13.7002 -19.2002 21.6006 -31.5 21.6006c-12.3008 0 -23.8008 -7.90039 -31.5 -21.6006l-9.5 -17c-4.10059 -7.39941 -15.6006 -4.09961 -14.9004 4.5c3.2998 42.1006 32.2002 71.4004 56 71.4004zM127 220.1c-4.2002 -7.39941 -15.7002 -4 -15.0996 4.5
+c3.2998 42.1006 32.1992 71.4004 56 71.4004c23.7998 0 52.6992 -29.2998 56 -71.4004c0.699219 -8.5 -10.8008 -11.8994 -14.9004 -4.5l-9.5 17c-7.7002 13.7002 -19.2002 21.6006 -31.5 21.6006s-23.7998 -7.90039 -31.5 -21.6006zM362.4 160c8.19922 0 14.5 -7 13.5 -15
+c-7.5 -59.2002 -58.9004 -105 -121.101 -105h-13.5996c-62.2002 0 -113.601 45.7998 -121.101 105c-1 8 5.30078 15 13.5 15h228.801z" />
+    <glyph glyph-name="laugh-squint" unicode="&#xf59b;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM389.4 50.5996c37.7998 37.8008 58.5996 88 58.5996 141.4s-20.7998 103.6 -58.5996 141.4c-37.8008 37.7998 -88 58.5996 -141.4 58.5996s-103.6 -20.7998 -141.4 -58.5996
+c-37.7998 -37.8008 -58.5996 -88 -58.5996 -141.4s20.7998 -103.6 58.5996 -141.4c37.8008 -37.7998 88 -58.5996 141.4 -58.5996s103.6 20.7998 141.4 58.5996zM343.6 252l33.6006 -40.2998c8.59961 -10.4004 -3.90039 -24.7998 -15.4004 -18l-80 48
+c-7.7998 4.7002 -7.7998 15.8994 0 20.5996l80 48c11.6006 6.7998 24 -7.7002 15.4004 -18zM134.2 193.7c-11.6006 -6.7998 -24.1006 7.59961 -15.4004 18l33.6006 40.2998l-33.6006 40.2998c-8.59961 10.2998 3.7998 24.9004 15.4004 18l80 -48
+c7.7998 -4.7002 7.7998 -15.8994 0 -20.5996zM362.4 160c8.19922 0 14.5 -7 13.5 -15c-7.5 -59.2002 -58.9004 -105 -121.101 -105h-13.5996c-62.2002 0 -113.601 45.7998 -121.101 105c-1 8 5.30078 15 13.5 15h228.801z" />
+    <glyph glyph-name="laugh-wink" unicode="&#xf59c;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM389.4 50.5996c37.7998 37.8008 58.5996 88 58.5996 141.4s-20.7998 103.6 -58.5996 141.4c-37.8008 37.7998 -88 58.5996 -141.4 58.5996s-103.6 -20.7998 -141.4 -58.5996
+c-37.7998 -37.8008 -58.5996 -88 -58.5996 -141.4s20.7998 -103.6 58.5996 -141.4c37.8008 -37.7998 88 -58.5996 141.4 -58.5996s103.6 20.7998 141.4 58.5996zM328 284c25.7002 0 55.9004 -16.9004 59.7002 -42.0996c1.7998 -11.1006 -11.2998 -18.2002 -19.7998 -10.8008
+l-9.5 8.5c-14.8008 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5c-8.30078 -7.39941 -21.5 -0.399414 -19.8008 10.8008c4 25.1992 34.2002 42.0996 59.9004 42.0996zM168 224c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32z
+M362.4 160c8.19922 0 14.5 -7 13.5 -15c-7.5 -59.2002 -58.9004 -105 -121.101 -105h-13.5996c-62.2002 0 -113.601 45.7998 -121.101 105c-1 8 5.30078 15 13.5 15h228.801z" />
+    <glyph glyph-name="meh-blank" unicode="&#xf5a4;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32
+s-32 14.2998 -32 32s14.2998 32 32 32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32z" />
+    <glyph glyph-name="meh-rolling-eyes" unicode="&#xf5a5;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM336 296c39.7998 0 72 -32.2002 72 -72s-32.2002 -72 -72 -72
+s-72 32.2002 -72 72s32.2002 72 72 72zM336 184c22.0996 0 40 17.9004 40 40c0 13.5996 -7.2998 25.0996 -17.7002 32.2998c1 -2.59961 1.7002 -5.39941 1.7002 -8.2998c0 -13.2998 -10.7002 -24 -24 -24s-24 10.7002 -24 24c0 3 0.700195 5.7002 1.7002 8.2998
+c-10.4004 -7.2002 -17.7002 -18.7002 -17.7002 -32.2998c0 -22.0996 17.9004 -40 40 -40zM232 224c0 -39.7998 -32.2002 -72 -72 -72s-72 32.2002 -72 72s32.2002 72 72 72s72 -32.2002 72 -72zM120 224c0 -22.0996 17.9004 -40 40 -40s40 17.9004 40 40
+c0 13.5996 -7.2998 25.0996 -17.7002 32.2998c1 -2.59961 1.7002 -5.39941 1.7002 -8.2998c0 -13.2998 -10.7002 -24 -24 -24s-24 10.7002 -24 24c0 3 0.700195 5.7002 1.7002 8.2998c-10.4004 -7.2002 -17.7002 -18.7002 -17.7002 -32.2998zM312 96
+c13.2002 0 24 -10.7998 24 -24s-10.7998 -24 -24 -24h-128c-13.2002 0 -24 10.7998 -24 24s10.7998 24 24 24h128z" />
+    <glyph glyph-name="sad-cry" unicode="&#xf5b3;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM392 53.5996c34.5996 35.9004 56 84.7002 56 138.4c0 110.3 -89.7002 200 -200 200s-200 -89.7002 -200 -200c0 -53.7002 21.4004 -102.4 56 -138.4v114.4
+c0 13.2002 10.7998 24 24 24s24 -10.7998 24 -24v-151.4c28.5 -15.5996 61.2002 -24.5996 96 -24.5996s67.5 9 96 24.5996v151.4c0 13.2002 10.7998 24 24 24s24 -10.7998 24 -24v-114.4zM205.8 213.5c-5.7998 -3.2002 -11.2002 -0.700195 -13.7002 1.59961l-9.5 8.5
+c-14.7998 13.2002 -46.1992 13.2002 -61 0l-9.5 -8.5c-3.7998 -3.39941 -9.2998 -4 -13.6992 -1.59961c-4.40039 2.40039 -6.90039 7.40039 -6.10059 12.4004c3.90039 25.1992 34.2002 42.0996 59.7998 42.0996c25.6006 0 55.8008 -16.9004 59.8008 -42.0996
+c0.799805 -5 -1.7002 -10 -6.10059 -12.4004zM344 268c25.7002 0 55.9004 -16.9004 59.7998 -42.0996c0.799805 -5 -1.7002 -10 -6.09961 -12.4004c-5.7002 -3.09961 -11.2002 -0.599609 -13.7002 1.59961l-9.5 8.5c-14.7998 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5
+c-3.7998 -3.39941 -9.2002 -4 -13.7002 -1.59961c-4.39941 2.40039 -6.89941 7.40039 -6.09961 12.4004c3.89941 25.1992 34.0996 42.0996 59.7998 42.0996zM248 176c30.9004 0 56 -28.7002 56 -64s-25.0996 -64 -56 -64s-56 28.7002 -56 64s25.0996 64 56 64z" />
+    <glyph glyph-name="sad-tear" unicode="&#xf5b4;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM256 144c38.0996 0 74 -16.7998 98.5 -46.0996
+c8.5 -10.2002 7.09961 -25.3008 -3.09961 -33.8008c-10.6006 -8.7998 -25.7002 -6.69922 -33.8008 3.10059c-15.2998 18.2998 -37.7998 28.7998 -61.5996 28.7998c-13.2002 0 -24 10.7998 -24 24s10.7998 24 24 24zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
+s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM162.4 173.2c2.7998 3.7002 8.39941 3.7002 11.1992 0c11.4004 -15.2998 36.4004 -50.6006 36.4004 -68.1006
+c0 -22.6992 -18.7998 -41.0996 -42 -41.0996s-42 18.4004 -42 41.0996c0 17.5 25 52.8008 36.4004 68.1006z" />
+    <glyph glyph-name="smile-beam" unicode="&#xf5b8;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM332 135.4c8.5 10.1992 23.5996 11.5 33.7998 3.09961
+c10.2002 -8.5 11.6006 -23.5996 3.10059 -33.7998c-30 -36 -74.1006 -56.6006 -120.9 -56.6006s-90.9004 20.6006 -120.9 56.6006c-8.39941 10.2002 -7.09961 25.2998 3.10059 33.7998c10.2002 8.40039 25.2998 7.09961 33.7998 -3.09961
+c20.7998 -25.1006 51.5 -39.4004 84 -39.4004s63.2002 14.4004 84 39.4004zM136.5 237l-9.5 -17c-1.90039 -3.2002 -5.90039 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004
+c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996zM328 296c23.7998 0 52.7002 -29.2998 56 -71.4004
+c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002
+c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004z" />
+    <glyph glyph-name="surprise" unicode="&#xf5c2;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM248 168c35.2998 0 64 -28.7002 64 -64s-28.7002 -64 -64 -64
+s-64 28.7002 -64 64s28.7002 64 64 64zM200 240c0 -17.7002 -14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32z" />
+    <glyph glyph-name="tired" unicode="&#xf5c8;" horiz-adv-x="496" 
+d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM377.1 295.8c3.80078 -4.39941 3.90039 -11 0.100586 -15.5
+l-33.6006 -40.2998l33.6006 -40.2998c3.7998 -4.5 3.7002 -11 -0.100586 -15.5c-3.5 -4.10059 -9.89941 -5.7002 -15.2998 -2.5l-80 48c-3.59961 2.2002 -5.7998 6.09961 -5.7998 10.2998s2.2002 8.09961 5.7998 10.2998l80 48c5 2.90039 11.5 1.90039 15.2998 -2.5z
+M220 240c0 -4.2002 -2.2002 -8.09961 -5.7998 -10.2998l-80 -48c-5.40039 -3.2002 -11.7998 -1.60059 -15.2998 2.5c-3.80078 4.5 -3.90039 11 -0.100586 15.5l33.6006 40.2998l-33.6006 40.2998c-3.7998 4.5 -3.7002 11 0.100586 15.5
+c3.7998 4.40039 10.2998 5.5 15.2998 2.5l80 -48c3.59961 -2.2002 5.7998 -6.09961 5.7998 -10.2998zM248 176c45.4004 0 100.9 -38.2998 107.8 -93.2998c1.5 -11.9004 -7 -21.6006 -15.5 -17.9004c-22.7002 9.7002 -56.2998 15.2002 -92.2998 15.2002
+s-69.5996 -5.5 -92.2998 -15.2002c-8.60059 -3.7002 -17 6.10059 -15.5 17.9004c6.89941 55 62.3994 93.2998 107.8 93.2998z" />
+  </font>
+</defs></svg>

BIN
web/building_saas/css/webfonts/fa-regular-400.ttf


BIN
web/building_saas/css/webfonts/fa-regular-400.woff


BIN
web/building_saas/css/webfonts/fa-regular-400.woff2


BIN
web/building_saas/css/webfonts/fa-solid-900.eot


File diff suppressed because it is too large
+ 4700 - 0
web/building_saas/css/webfonts/fa-solid-900.svg


BIN
web/building_saas/css/webfonts/fa-solid-900.ttf


BIN
web/building_saas/css/webfonts/fa-solid-900.woff


BIN
web/building_saas/css/webfonts/fa-solid-900.woff2


+ 87 - 11
web/building_saas/main/html/main.html

@@ -100,16 +100,16 @@
                             <a id="uploadGld" class="dropdown-item" href="#import" data-toggle="modal" data-target="#import">导入广联达算量Excel清单</a>
                         </div>
                     </span>
-                      <% if (compilationName === '重庆定额(2018)') { %>
+                      <% if (region === '重庆市' || region === '广东省') { %>
                       <span id="exportSpan" class="btn btn-light btn-sm" data-toggle="tooltip" data-original-title="数据接口" data-placement="bottom">
                     <a class="dropdown-toggle" href="#" data-toggle="dropdown"><i class="fa  fa-code-fork"></i></a>
                     <div class="dropdown-menu" id="exportMenu">
-                        <a class="dropdown-item" href="#export" data-toggle="modal" data-target="#export">导出重庆市电子招投标数据文件</a>
-                        <a class="dropdown-item" href="javascript:void(0)" id="SEIMenu"  >导出重庆市指标成果文件</a>
+                        <a class="dropdown-item" href="#export" data-toggle="modal" data-target="#export">导出<%= region %>电子招投标数据文件</a>
+                        <a class="dropdown-item" href="#exportIndex"  data-toggle="modal" data-target="#exportIndex" >导出<%= region %>指标成果文件</a>
                     </div>
                 </span>
                       <% } %>
-                    <a href="javascript:void(0)" class="btn btn-light btn-sm" id="insertRation" data-toggle="tooltip" data-placement="bottom" data-original-title="插入定额"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
+                    <!--<a href="javascript:void(0)" class="btn btn-light btn-sm" id="insertRation" data-toggle="tooltip" data-placement="bottom" data-original-title="插入定额"><i class="fa fa-sign-in" aria-hidden="true"></i></a>-->
                     <!--2018-11-15 隐藏删除按钮   <a href="javascript:void(0)" class="btn btn-light btn-sm" id="delete" data-toggle="tooltip" data-placement="bottom" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>-->
                     <a href="javascript:void(0)" class="btn btn-light btn-sm" id="upLevel" data-toggle="tooltip" data-placement="bottom" data-original-title="升级"><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)"  class="btn btn-light btn-sm" id="downLevel" data-toggle="tooltip" data-placement="bottom" data-original-title="降级"><i class="fa fa-arrow-right" aria-hidden="true"></i></a>
@@ -137,7 +137,7 @@
                               <% } %>
                               <a id="switchTznr" href="javascript:void(0);"  class="dropdown-item"><i class="fa fa-eye" aria-hidden="true"></i> 显示特征</a>
                               <a id = "menu_calc_program_manage"  href="javascript:void(0);" class="dropdown-item"><i class="fa fa-calculator" aria-hidden="true"></i> 总计算程序</a>
-                              <a id = "menu_index_info"  href="javascript:void(0);" class="dropdown-item"><i class="fa fa-database" aria-hidden="true"></i> 指标信息</a>
+                              <a id = "menu_index_info"  href="javascript:void(0);" style="display: none" class="dropdown-item"><i class="fa fa-database" aria-hidden="true"></i> 指标信息</a>
                           </div>
                       </div>
                  <!--   <span class="btn btn-light btn-sm">
@@ -2083,7 +2083,7 @@
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title">重庆市电子招投标数据接口<!-- 重庆其他电子招投标数据接口 --></h5>
+                <h5 class="modal-title"><%= region %>电子招投标数据接口<!-- 重庆其他电子招投标数据接口 --></h5>
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                 </button>
@@ -2092,7 +2092,7 @@
                 <!--检测提醒-->
                 <div class="card">
                     <div class="card-body">
-                        <h5 class="card-title">导出重庆市电子招投标数据接口文件</h5>
+                        <h5 class="card-title">导出<%= region %>电子招投标数据接口文件</h5>
                         <p class="card-text">导出之前,建议您执行项目自检功能,避免出现错误。</p>
                         <a id="export-check" href="javascript:void(0);" class="btn btn-primary">自检</a>
                     </div>
@@ -2142,6 +2142,37 @@
         </div>
     </div>
 </div>
+
+<!--弹出 数据接口导出-->
+<div class="modal fade" id="exportIndex" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title"><%= region %>指标成果文件接口<!-- 重庆其他电子招投标数据接口 --></h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <!--检测提醒-->
+                <div class="card">
+                    <div class="card-body">
+                        <h5 class="card-title">导出<%= region %>电子招投标数据接口文件</h5>
+                        <p class="card-text">导出之前,建议您执行项目自检功能,避免出现错误。</p>
+                        <a id="export-index-check" href="javascript:void(0);" class="btn btn-primary">自检</a>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <a id="export-index-confirm" href="javascript:void(0);" class="btn btn-primary">确定导出</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+
 <!--设置导出工程编号-->
 <div class="modal fade" id="exportCode" data-backdrop="static">
     <div class="modal-dialog" role="document">
@@ -2156,6 +2187,27 @@
                 <div class="modal-auto-height" style="overflow: hidden" id="exportSpread">
                 </div>
                 <p>*工程编号作为单项、单位工程的标识,要求在建设项目下唯一。</p>
+
+
+                <div class="form-group" style="">
+                    <div class="form-check ml-4">
+                        <input class="form-check-input" type="checkbox"  id="sei1" checked>
+                        <label class="form-check-label" for="sei1">
+                            投标文件
+                        </label>
+                        <small class="form-text text-muted">投标工程数据文件</small>
+                        <input class="form-check-input" type="checkbox"  id="sei2" checked>
+                        <label class="form-check-label" for="sei2">
+                            投标文件
+                        </label>
+                        <small class="form-text text-muted">投标工程数据文件</small>
+                        <input class="form-check-input" type="checkbox"  id="sei3" checked>
+                        <label class="form-check-label" for="sei3">
+                            投标文件
+                        </label>
+                        <small class="form-text text-muted">投标工程数据文件</small>
+                    </div>
+                </div>
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-primary" id="exportCode-confirm">确定</button>
@@ -2324,7 +2376,7 @@
                 </button>
             </div>
             <div class="modal-body" style="height: 200px;padding: 0px">
-                <div class="ovf-hidden full-h" id="itemIncreaseFee_sheet"></div>
+                <div class="ovf-hidden full-h" id="itemIncreaseFee_sheet" style="height: 100%"></div>
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-primary" data-dismiss="modal" id="itemIncreaseFeeConfirm">确定</button>
@@ -2334,7 +2386,28 @@
     </div>
 </div>
 
-
+<!--弹出 子目增加费范围选择树-->
+<div class="modal fade" id="item_increase_scope" data-backdrop="static" style="z-index: 1060">
+    <div class="modal-dialog modal-lg"  role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">指定范围</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body" style="padding: 0px">
+                <div class="row" style="height:400px"><!--sjs id设置在这个div-->
+                    <div class="col-12" style="height: 100%;overflow: hidden" id="scopeSheet"></div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button class="btn btn-primary" data-dismiss="modal", id="select_scope_confirm">确定</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
 
     <img src="/web/dest/css/img/folder_open.png" id="folder_open_pic" style="display: none">
     <img src="/web/dest/css/img/folder_close.png" id="folder_close_pic" style="display: none">
@@ -2367,6 +2440,9 @@
     <script type="text/javascript" src="/lib/jspdf/jspdf.min.js"></script>
     <!-- inject:js -->
     <!--<script type="text/javascript" src="/test/tmp_data/test_ration_calc/ration_calc_base.js"></script>-->
+    <script src="/lib/pinyinjs/pinyin_dict_firstletter.js"></script>
+    <script src="/lib/pinyinjs/pinyinUtil.js"></script>
+    <script src="/public/common_constants.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/main_consts.js"></script>
     <script type="text/javascript" src="/web/over_write/config/compilation_config.js"></script>
     <script type="text/javascript" src="/public/web/common_util.js"></script>
@@ -2428,8 +2504,6 @@
     <script type="text/javascript" src="/web/building_saas/main/js/models/cache_tree.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/calc/calc_fees.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/exportStdInterfaceBase.js"></script>
-    <script type="text/javascript" src="/web/building_saas/main/js/models/exportStandardInterface.js"></script>
-    <script type="text/javascript" src="/web/building_saas/main/js/models/exportSEIInterface.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/overHeight.js"></script>
     <!--<script type="text/javascript" src="/web/building_saas/main/js/calc/ration_calc.js"></script>-->
     <!--<script type="text/javascript" src="/web/building_saas/main/js/calc/bills_calc.js"></script>-->
@@ -2504,6 +2578,8 @@
 
     <% if (overWriteUrl != undefined) { %>
          <script type="text/javascript" src="<%= overWriteUrl%>"></script>
+         <script type="text/javascript" src="<%= overWriteUrl.slice(0, -3) + '_export.js' %>"></script>
+         <script type="text/javascript" src="<%= overWriteUrl.slice(0, -3) + '_export_sei.js' %>"></script>
     <% } %>
 
 

+ 31 - 9
web/building_saas/main/html/tender_price.html

@@ -1,26 +1,48 @@
 
 <div class="toolsbar px-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">
             <select class="form-control form-control-sm" style="width: auto; font-size: .875rem" id="calcPriceOption">
                 <option value="coeBase">按调价系数计算</option>
-                <option value="priceBase" >按目标价计算</option>
+                <option value="priceBase_RCJ" >按目标价调整人材机消耗</option>
+                <option value="priceBase_ZM" >按目标价调整子目工程量</option>
             </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 class="input-group input-group-sm mr-2" style="width:240px">
+        <div class="input-group input-group-sm mr-2" style="width:200px">
             <div class="input-group-prepend">
                 <span class="input-group-text" id="inputGroup-sizing-sm">人材机单价调整系数</span>
             </div>
             <input id = 'gljPriceTenderCoe' type="number" step="0.1" class="form-control" placeholder="请输入系数" value="1">
         </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>
-           <!-- <button type="button" class="btn btn-outline-primary btn-sm">反调单价</button>-->
-            <button type="button" class="btn btn-outline-primary btn-sm" id = "tenderPrice">调价计算</button>
-        </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>
+        <span>&nbsp</span>
         <button type="button" class="btn btn-outline-danger btn-sm" id = "cleanTender">清空调价</button>
-        <div class="form-check" style="margin-left:40px; margin-top:5px;">
+        <div class="form-check" style="margin-left:40px; margin-top:4px;">
             <label class="form-check-label">
                 <input class="form-check-input" name="cbShowTenderFields" id="cbShowTenderFields" value="true" type="checkbox">
                 <span data-toggle="tooltip" data-original-title="造价书界面定额人材机的调价、人材机汇总界面的调价">显示调价后数据</span>

+ 6 - 5
web/building_saas/main/js/controllers/block_controller.js

@@ -333,9 +333,10 @@ let BlockController = {
              //主材设备工料机插入主树
              project.ration_glj.addToMainTree(result.ration_gljs);
              //更新计算程序模板,并进行重新计算
-             project.calcProgram.calcNodesAndSave(rationNodes,function () {
+             project.calcProgram.calcNodesAndSave(rationNodes,async function () {
                  installationFeeObj.calcInstallationFee();
-                 OVER_HEIGHT.reCalcOverHeightFee();
+                await OVER_HEIGHT.reCalcOverHeightFee();
+                 await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(rationNodes);
              });
         })
 
@@ -360,9 +361,9 @@ let BlockController = {
                 }
             }
         }
-        //更新项目工料机模块信息-计算消耗量
-        project.projectGLJ.datas = result.gljData;
-        project.projectGLJ.calcQuantity();
+        //更新项目工料机模块信息-计算消耗量 ---修改了加载方式
+      //  project.projectGLJ.datas = result.gljData;
+      //  project.projectGLJ.calcQuantity();
         for(let r of result.rations){
             if(r.type == rationType.gljRation){//对于工料机类型的定额,要重新设置下市场单价
                 gljOprObj.setGLJPrice(r);

+ 3 - 2
web/building_saas/main/js/controllers/material_controller.js

@@ -63,9 +63,10 @@ let MaterialController = {
         }
         if(nodes.length >0){
             projectObj.project.projectGLJ.loadData(function () {
-                projectObj.project.calcProgram.calcNodesAndSave(nodes,function(){
+                projectObj.project.calcProgram.calcNodesAndSave(nodes,async function(){
                     installationFeeObj.calcInstallationFee();
-                    OVER_HEIGHT.reCalcOverHeightFee();
+                    await OVER_HEIGHT.reCalcOverHeightFee();
+                    await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(nodes);
                 });
                 gljOprObj.refreshView();
             })

+ 13 - 2
web/building_saas/main/js/models/bills.js

@@ -818,13 +818,14 @@ var Bills = {
             updateData.projectID = selected.data.projectID;
             updateData.user_id = userID;
             $.bootstrapLoading.start();
-            CommonAjax.post("/bills/multiDelete", updateData, function () {
+            CommonAjax.post("/bills/multiDelete", updateData, async function () {
                 // 回收删除节点
                 BlockController.recycleBlock(selection);
                 let quantity_detail_datas = project.quantity_detail.datas;
                 let ration_datas = project.Ration.datas;
                 let nodes = controller.tree.nodes;
                 let prefix = controller.tree.prefix;
+                let deleteParentBillIDs = [];
                 //更新缓存
                 if(updateData['bills']){//更新bills
                     for(let b_key in updateData['bills']){
@@ -842,6 +843,8 @@ var Bills = {
                     for(let r_key in updateData['ration']){//定额只有删除,没有更新
                         _.remove(ration_datas,{'ID':r_key});
                         project.Ration.deleteSubListOfRation({ID:r_key});
+                        let tnode = projectObj.project.mainTree.getNodeByID(r_key);
+                        if(tnode) deleteParentBillIDs.push(tnode.data.billsItemID);
                     }
                 }
                 for(let r of refNodes){
@@ -858,7 +861,15 @@ var Bills = {
                     }
                     gljOprObj.refreshView();
                 });
-                OVER_HEIGHT.reCalcOverHeightFee();
+               await OVER_HEIGHT.reCalcOverHeightFee();
+               //计算子目增加费
+                let tbns = [];
+                for(let bID of deleteParentBillIDs){
+                    let bnode = projectObj.project.mainTree.getNodeByID(bID);
+                    if(bnode) tbns.push(bnode);
+                }
+                await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(tbns);
+
                 //添加内容为定额子目时,根据特征及内容添加规则刷新清单
                 if(updateData['ration']){
                     let addRuleSetting = getAddRuleSetting();

+ 45 - 2
web/building_saas/main/js/models/calc_program.js

@@ -409,7 +409,7 @@ let calcTools = {
                         if (priceType == priceTypes.ptBasePrice){ price = me.uiGLJPrice(glj["basePrice"], glj);}
                         else if (priceType == priceTypes.ptAdjustPrice){price = aprice;}
                         else if (priceType == priceTypes.ptMarketPrice){price = mprice;}
-                        if (projectObj.project.property.areaSetting && treeNode.data.areaIncreaseFee){
+                        /*if (projectObj.project.property.areaSetting && treeNode.data.areaIncreaseFee){
                             let p;
                             if ([gljType.LABOUR].includes(glj.type))
                                 p = projectObj.project.property.areaSetting.labour
@@ -418,7 +418,7 @@ let calcTools = {
                             else if ([gljType.GENERAL_MACHINE].includes(glj.type))
                                 p = projectObj.project.property.areaSetting.machine;
                             qty = qty * (1 + p * 0.01).toDecimal(decimalObj.process);
-                        }
+                        }*/
 
                         temp = (qty * price).toDecimal(decimalObj.process);
                         result = (result + temp).toDecimal(decimalObj.process);
@@ -1043,6 +1043,12 @@ let calcTools = {
             return false;
         }
         return totalFee > maxPrice;
+    },
+    getTenderCalcType: function () {
+        let tenderSetting = projectObj.project.property.tenderSetting;
+        let ct = tenderSetting && tenderSetting.calcPriceOption? tenderSetting.calcPriceOption : "coeBase";
+        if (ct == 'priceBase') ct = 'priceBase_RCJ';   // 兼容旧项目
+        return ct;
     }
 };
 
@@ -2207,6 +2213,26 @@ class CalcProgram {
         return me.getTotalFee(baseNodes, excludeNodes, tender);
     };
 
+    // 反向调价需初始化调价树、缓存数据等
+    initReverseTenderDatas (){
+        for(let node of tender_obj.tenderTree.items){
+            if (node.data.rationQuantityCoe) node.data.rationQuantityCoe = null;
+            let qcObj = node.data.quantityCoe;
+            if (qcObj){
+                for (let pn in qcObj){
+                    qcObj[pn] = null;
+                };
+            };
+            this.clearTenderCache(node);
+        };
+        // 反向调价时人材机单价调整系数要归1:因为既可以调量又可以调价,以哪个为基准进行反调?过于复杂,仅以通用的调量逻辑为基准即可满足需求。
+        if (projectObj.project.property.tenderSetting && projectObj.project.property.tenderSetting.gljPriceTenderCoe
+            && (projectObj.project.property.tenderSetting.gljPriceTenderCoe != 1)){
+            projectObj.project.property.tenderSetting.gljPriceTenderCoe = 1;    // 修改缓存值,用于计算
+            projectObj.project.property.needRestoreGgljPriceTenderCoe = true;   // 做个标记,告诉回调函数
+        }
+    };
+
     // 反向调价
     calcTenderReverse(treeNode, tender){
         if (tender == tenderTypes.ttReverseRation) {
@@ -2420,6 +2446,23 @@ class CalcProgram {
             return result;
         }
     };
+
+    doTenderCalc(callback){
+        let sOption = calcTools.getTenderCalcType();
+        let tender;
+        if (sOption =='coeBase')
+            tender = tenderTypes.ttCalc
+        else if (sOption =='priceBase_RCJ')
+            tender = tenderTypes.ttReverseGLJ
+        else if (sOption =='priceBase_ZM')
+            tender = tenderTypes.ttReverseRation;
+        if (tender == tenderTypes.ttReverseGLJ || tender == tenderTypes.ttReverseRation){
+            this.initReverseTenderDatas();
+            this.prepareForDistribute(tender_obj.tenderTree.roots[0]);
+            this.distributeTargetTotalFee(tender_obj.tenderTree.roots[0]);
+        };
+        this.calcAllNodesAndSave(calcAllType.catAll, callback, tender);
+    };
 };
 
 // export default analyzer;

+ 115 - 35
web/building_saas/main/js/models/exportStdInterfaceBase.js

@@ -54,6 +54,11 @@ const XML_EXPORT_BASE = (() => {
         Bid: 2,     //招标
         Control: 3  //控制价
     };
+    const EXPORT_KIND_NAME = {
+        1: '投标',
+        2: '招标',
+        3: '控制价'
+    };
     // 配置项
     const CONFIG = Object.freeze({
         HINT_START,
@@ -63,7 +68,8 @@ const XML_EXPORT_BASE = (() => {
         ADJUST_TYPE,
         TIMEOUT_TIME,
         GRANULARITY,
-        EXPORT_KIND
+        EXPORT_KIND,
+        EXPORT_KIND_NAME
     });
 
     // 缓存项 不需要的时候需要清空
@@ -108,12 +114,13 @@ const XML_EXPORT_BASE = (() => {
      * 一个节点对应一个构造方法,方便调整配置、方便其他版本开发、接手的人看起来更直观
      * @param  {String}name 节点名
      *         {Array}attrs 节点属性数据
-     *         {Array}failList 失败列表
+     *         {String}alias 别名,有些节点名称是英文,但是提示的时候需要显示中文的时候用
      * @return {void}
      * */
-    function Element(name, attrs) {
+    function Element(name, attrs, alias) {
         this.name = name;
-        let checkData = check(name, attrs);
+        const hintName = alias || name;
+        const checkData = check(hintName, attrs);
         this.fail = checkData.failHints;
         this.attrs = checkData.filterAttrs;
         handleXMLEntity(this.attrs);
@@ -165,8 +172,13 @@ const XML_EXPORT_BASE = (() => {
         let rst = { failHints: [], filterAttrs: [] };
         let dateReg = /([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))/;
         for (let data of datas) {
-            // 值统一转换成String
-            data.value = !hasValue(data.value)
+            const isHasValue = hasValue(data.value);
+            // 某属性是非必须的,并且设置了mustHasValue,意味着必须要有值才输出该属性
+            if (!data.required && data.mustHasValue && !isHasValue) {
+                continue;
+            }
+            // 值统一转换成String,并且处理各类型属性空值时的默认取值
+            data.value = !isHasValue
                 ? DEFAULT_VALUE[data.type]
                     ? DEFAULT_VALUE[data.type]
                     : ''
@@ -184,12 +196,12 @@ const XML_EXPORT_BASE = (() => {
                 isFail = true;
                 tempFail = data.failHint
                     ? `${data.failHint}字符数不可小于${data.minLen}个。`
-                    : `${eleName}-“${data.name}”字符数不可小于${data.minLen}个。`;
+                    : `${eleName}-“${name}”字符数不可小于${data.minLen}个。`;
             } else if (data.maxLen && data.value.length > data.maxLen) {
                 isFail = true;
                 tempFail = data.failHint
                     ? `${data.failHint}字符数不可大于${data.maxLen}个。`
-                    : `${eleName}-“${data.name}”字符数不可大于${data.maxLen}个。`;
+                    : `${eleName}-“${name}”字符数不可大于${data.maxLen}个。`;
             } else if (data.enumeration && !data.enumeration.includes(data.value)) {
                 isFail = true;
                 let enumerationHint = data.enumerationHint
@@ -197,29 +209,29 @@ const XML_EXPORT_BASE = (() => {
                     : data.enumeration.join(';');
                 tempFail = data.failHint
                     ? `${data.failHint}只能从“${enumerationHint}”中选择。`
-                    : `${eleName}-“${data.name}”只能从“${enumerationHint}”中选择。`;
+                    : `${eleName}-“${name}”只能从“${enumerationHint}”中选择。`;
             } else if (data.type && data.type === TYPE.DATE && !dateReg.test(data.value)) {
                 isFail = true;
                 tempFail = data.failHint
                     ? `${data.failHint}日期格式必须是YYYY-MM-DD。`
-                    : `${eleName}-“${data.name}”日期格式必须是YYYY-MM-DD。`;
+                    : `${eleName}-“${name}”日期格式必须是YYYY-MM-DD。`;
             } else if (data.type && data.type === TYPE.INT && !Number.isInteger(parseFloat(data.value))) {
                 isFail = true;
                 tempFail = data.failHint
                     ? `${data.failHint}必须为整数。`
-                    : `${eleName}-“${data.name}”必须为整数。`;
+                    : `${eleName}-“${name}”必须为整数。`;
             } else if (data.type && data.type === TYPE.DECIMAL && isNaN(parseFloat(data.value))) {
                 isFail = true;
                 tempFail = data.failHint
                     ? `${data.failHint}必须为数值。`
-                    : `${eleName}-“${data.name}”必须为数值。`;
+                    : `${eleName}-“${name}”必须为数值。`;
             } else if (data.type && data.type === TYPE.NUM2) {
                 let v = parseFloat(data.value);
                 if (isNaN(v)) {
                     isFail = true;
                     tempFail = data.failHint
                         ? `${data.failHint}必须为数值。`
-                        : `${eleName}-“${data.name}”必须为数值。`;
+                        : `${eleName}-“${name}”必须为数值。`;
                 } else if (!data.value.length || (data.value.split('.').length > 1 && data.value.split('.')[1].length > 2)) {
                     isFail = true;
                 }
@@ -227,7 +239,7 @@ const XML_EXPORT_BASE = (() => {
                 isFail = true;
                 tempFail = data.failHint
                     ? `${data.failHint}必须为true或false。`
-                    : `${eleName}-“${data.name}”必须为true或false。`;
+                    : `${eleName}-“${name}”必须为true或false。`;
             }
             if (!isFail || data.required) {
                 rst.filterAttrs.push(data);
@@ -339,6 +351,19 @@ const XML_EXPORT_BASE = (() => {
         }
         return fee[fields[1]] || 0;
     }
+    // 获取节点的汇总价格
+    function getAggregateFee(nodes) {
+        let total = nodes.reduce((acc, node) => {
+            const price = getFee(node.data.fees, 'common.totalFee');
+            return acc += price;
+        }, 0);
+        return scMathUtil.roundTo(total, -2);
+    }
+    // 获取固定类别行的费用
+    function getFeeByFlag(items, flag, feeFields) {
+        const node = items.find(node => node.getFlag() === flag);
+        return node ? getFee(node.data.fees, feeFields) : '0';
+    }
     /*
      * 根据key获取对应的基本信息、工程特征数据
      * @param  {Array}data
@@ -491,22 +516,23 @@ const XML_EXPORT_BASE = (() => {
     /*
      * 根据粒度获取项目(不包含详细数据)数据
      * @param  {Number}granularity 导出粒度
+     *         {Object}summaryObj 汇总字段
      *         {Number}tenderID 单位工程ID
      *         {String}userID 用户ID
      * @return {Object} 返回的数据结构:{children: [{children: []}]} 最外层为建设项目,中间为单项工程,最底层为单位工程
      * */
-    async function getProjectByGranularity(granularity, tenderID, userID) {
+    async function getProjectByGranularity(granularity, summaryObj, tenderID, userID) {
         let projectData = _cache.projectData;
         // 没有数据,需要拉取
         if (!Object.keys(projectData).length) {
-            projectData = await ajaxPost('/pm/api/getProjectByGranularity', { user_id: userID, tenderID: tenderID, granularity: granularity });
+            projectData = await ajaxPost('/pm/api/getProjectByGranularity', { user_id: userID, tenderID, granularity, summaryObj});
             _cache.projectData = projectData;
         }
         return projectData;
     }
 
     /*
-     * 通过getData接口获取单位工程详细数据
+     * 通过getData接口获取单位工程详细数据(带缓存功能)
      * @param  {Number}tenderID 单位工程ID
      *         {String}userID 用户ID
      * @return {Object} 跟projectObj.project的数据结构一致
@@ -534,7 +560,7 @@ const XML_EXPORT_BASE = (() => {
      *         {String}userID 用户ID
      * @return {Array} 数据结构为:[{data: Object, exportKind: Number, fileName: String}]
      * */
-    async function extractExportData(entryFunc, granularity, exportKind, tenderID, userID) {
+    async function extractExportData(entryFunc, granularity, summaryObj, exportKind, tenderID, userID) {
         // 默认导出建设项目
         if (!granularity || ![1, 2, 3].includes(granularity)) {
             granularity = GRANULARITY.PROJECT;
@@ -544,7 +570,7 @@ const XML_EXPORT_BASE = (() => {
             exportKind = EXPORT_KIND.Tender;
         }
         // 拉取标段数据:建设项目、单项工程、单位工程数据
-        let projectData = await getProjectByGranularity(granularity, tenderID, userID);
+        let projectData = await getProjectByGranularity(granularity, summaryObj, tenderID, userID);
         if (!projectData) {
             throw '获取项目数据错误';
         }
@@ -557,6 +583,19 @@ const XML_EXPORT_BASE = (() => {
         return await entryFunc(userID, exportKind, projectData);
     }
 
+    //获取普通基数: {xxx}
+    function getNormalBase(str) {
+        let reg = /{.+?}/g,
+            matchs = str.match(reg);
+        return matchs || [];
+    }
+    //获取id引用基数: @xxx-xxx-xx
+    function getIDBase(str) {
+        let reg = /@.{36}/g,
+            matchs = str.match(reg);
+        return matchs || [];
+    }
+
     // 转换基数表达式
     // 1.有子项,则取固定清单对应基数
     // 2.无子项,有基数,a.优先转换为行代号(不可自身) b.不能转换为行代号则找对应字典
@@ -569,8 +608,8 @@ const XML_EXPORT_BASE = (() => {
         }
         if (expr) {
             let illegal = false;
-            let normalBase = _getNormalBase(expr),
-                idBase = _getIDBase(expr);
+            let normalBase = getNormalBase(expr),
+                idBase = getIDBase(expr);
             //普通基数转基数字典
             normalBase.forEach(base => {
                 let replaceStr = CalcBaseMap[base];
@@ -616,18 +655,6 @@ const XML_EXPORT_BASE = (() => {
             }
             return expr;
         }
-        //获取普通基数: {xxx}
-        function _getNormalBase(str) {
-            let reg = /{.+?}/g,
-                matchs = str.match(reg);
-            return matchs || [];
-        }
-        //获取id引用基数: @xxx-xxx-xx
-        function _getIDBase(str) {
-            let reg = /@.{36}/g,
-                matchs = str.match(reg);
-            return matchs || [];
-        }
     }
     // 转换基数说明,根据转换后的基数处理
     //1.行引用转换为对应行的名称
@@ -703,6 +730,17 @@ const XML_EXPORT_BASE = (() => {
             };
         }
     }
+    // 获取节点的某属性
+    function getAttr(ele, name) {
+        return (ele.attrs.find(attr => attr.name === name) || {}).value;
+    }
+    // 设置节点的某属性
+    function setAttr(ele, name, value) {
+        const attr = ele.attrs.find(attr => attr.name === name);
+        if (attr) {
+            attr.value = value;
+        }
+    }
     // 从srcEle节点中获取元素名为eleName的元素
     function getElementFromSrc(srcEle, eleName) {
         if (!srcEle || !srcEle.children || !srcEle.children.length) {
@@ -770,13 +808,14 @@ const XML_EXPORT_BASE = (() => {
         return infos;
     }
     
-
     const UTIL = Object.freeze({
         deWeightHints,
         isDef,
         hasValue,
         setTimeoutSync,
         getFee,
+        getAggregateFee,
+        getFeeByFlag,
         getPlainAttrs,
         getValueByKey,
         getRelGLJ,
@@ -787,10 +826,14 @@ const XML_EXPORT_BASE = (() => {
         sortByNext,
         getTenderDetail,
         getProjectByGranularity,
+        getNormalBase,
+        getIDBase,
         transformCalcBase,
         transformCalcBaseState,
         getCodeSheetData,
         getElementFromSrc,
+        getAttr,
+        setAttr,
         getParsedData,
         setupCode,
         softCheck
@@ -815,6 +858,9 @@ const XML_EXPORT_BASE = (() => {
         for (let ele of eles) {
             rst += _startTag(ele);
             if (ele.children.length > 0) {
+                if (ele.children.some(c => !c)) {
+                    debugger;
+                }
                 rst += _toXMLStr(ele.children);
                 rst += _endTag(ele);
             }
@@ -888,16 +934,50 @@ const XML_EXPORT_BASE = (() => {
                 fileName: extractObj.fileName
             };
         });
+        if (!saveAsFunc) {
+            return fileData;
+        }
         // 导出
         await saveAsFunc(fileData);
     }
 
+    // 提取xml数据,中间数据(目前为导出指标压缩包用)
+    async function getExtractData() {
+        const fileKind = projectObj.project.projectInfo.property.fileKind;
+        const projectID = projectObj.project.ID();
+        const extractData = await extractExportData(XMLStandard.entry, GRANULARITY.PROJECT, 
+            XMLStandard.summaryObj, fileKind, projectID, userID);
+        // projects表数据
+        const projectData = _.cloneDeep(_cache.projectData);
+        // 错误提示
+        const failList = deWeightHints(_.cloneDeep(_cache.failList));
+        // 清空缓存
+        clear();
+        return {
+            extractData,
+            projectData,
+            failList
+        }
+    }
+
+    /**
+     * 提取qtf文件数据(目前为导出指标压缩包用)
+     * @param {Array} codes - 设置工程编号窗口获取到的编号数据 
+     * @param {Array} extractData - 提取的导出中间数据
+     * @return {Array} 
+     */
+    async function getExtractFile(codes, extractData) {
+        return await exportFile(codes, extractData, XMLStandard.resetContentCode);
+    }
+
     return {
         CONFIG,
         CACHE,
         UTIL,
         Element,
         extractExportData,
-        exportFile
+        exportFile,
+        getExtractData,
+        getExtractFile,
     };
 })();

File diff suppressed because it is too large
+ 0 - 1035
web/building_saas/main/js/models/exportStdInterface_gd18.js


File diff suppressed because it is too large
+ 1457 - 1628
web/building_saas/main/js/models/importStandardInterface.js


+ 65 - 32
web/building_saas/main/js/models/importStdInterfaceBase.js

@@ -8,33 +8,48 @@
  * @version
  */
 
-const XML_IMPORT_BASE = (() => {
-    // 清单类型
-    const BILLS_TYPE ={
-        DXFY: 1, //大项费用
-        FB: 2,   //分部
-        FX: 3,   //分项
-        BILLS: 4, //清单
-        BX: 5    //补项
+const importXMLBase = (() => {
+    //人材机调整法
+    const AdjustType = {
+        info: 'priceInfo',  //造价信息差额调整法
+        coe: 'priceCoe'     //价格指数调整法
     };
-    // 项目类型
-    const PROJECT_TYPE = {
-        PROJECT: 'Project',
-        ENGINEERING: 'Engineering',
-        TENDER: 'Tender'
-    };
-    // 人材机调整法
-    const ADJUST_TYPE = {
-        INFO: 'priceInfo',  //造价信息差额调整法
-        COE: 'priceCoe'     //价格指数调整法
-    };
-
     const CONFIG = Object.freeze({
-        BILLS_TYPE,
-        PROJECT_TYPE,
-        ADJUST_TYPE
+        AdjustType
     });
 
+    // xml字符实体
+    const XMLEntity = {
+        '&#x0020;': 'escape{space}',
+        '&#x20;': 'escape{simpleSpace}',
+        '&#x0009;': 'escape{tab}',
+        '&#x9;': 'escape{simpleTab}',
+        '&#x000D;': 'escape{return}',
+        '&#xD;': 'escape{simpleReturn}',
+        '&#000A;': 'escape{newLine}',
+        '&#xA;': 'escape{simpleNewLine}',
+        '&lt;': 'escape{less}',
+        '&gt;': 'escape{greater}',
+        '&amp;': 'escape{and}',
+        '&quot;': 'escape{quot}',
+        '&apos;': 'escape{apos}'
+    };
+
+    // 避免字符实体进行转义。原文本中含有xml字符实体,转换为其他字符。
+    function escapeXMLEntity(str) {
+        for (const [key, value] of Object.entries(XMLEntity)) {
+            str = str.replace(new RegExp(key, 'g'), value);
+        }
+        return str;
+    }
+    // 将文本还原为字符实体
+    function restoreXMLEntity(str) {
+        for (const [key, value] of Object.entries(XMLEntity)) {
+            str = str.replace(new RegExp(value, 'g'), key);
+        }
+        return str;
+    }
+
     /*
     * 读取文件转换为utf-8编码的字符串
     * @param {Blob}file
@@ -42,7 +57,7 @@ const XML_IMPORT_BASE = (() => {
     * */
     function readAsTextSync(file) {
         return new Promise((resolve, reject) => {
-            let fr = new FileReader();
+            const fr = new FileReader();
             fr.readAsText(file);    // 默认utf-8,如果出现乱码,得看导入文件是什么编码
             fr.onload = function () {
                 resolve(this.result);
@@ -62,7 +77,7 @@ const XML_IMPORT_BASE = (() => {
      * */
     function getValue(source, fields) {
         let cur = source;
-        for (let field of fields) {
+        for (const field of fields) {
             if (!cur[field]) {
                 return '';
             }
@@ -95,7 +110,7 @@ const XML_IMPORT_BASE = (() => {
         if (!Array.isArray(fees) || !fees.length) {
             return '0';
         }
-        let feeData = fees.find(fee => fee.fieldName === fields[0]);
+        const feeData = fees.find(fee => fee.fieldName === fields[0]);
         return feeData[fields[1]] || '0';
     }
     // 获取固定ID
@@ -110,9 +125,9 @@ const XML_IMPORT_BASE = (() => {
      * @return {Array}
      * */
     function getItemsRecur(src, fields, extractFuc) {
-        let itemsSrc = [],
-            curField = [''];
-        for (let field of fields) {
+        let itemsSrc = [];
+        let curField = [''];
+        for (const field of fields) {
             itemsSrc = arrayValue(src, field);
             if (itemsSrc.length) {
                 curField = field;
@@ -120,7 +135,7 @@ const XML_IMPORT_BASE = (() => {
             }
         }
         return itemsSrc.map(itemSrc => {
-            let obj = extractFuc(itemSrc, curField);
+            const obj = extractFuc(itemSrc, curField);
             obj.items = getItemsRecur(itemSrc, fields, extractFuc);
             return obj;
         });
@@ -194,14 +209,32 @@ const XML_IMPORT_BASE = (() => {
     // 获取必要的清单模板
     async function getNeedfulTemplate(templateLibID) {
         return await ajaxPost('/template/bills/api/getNeedfulTemplate',
-            {templateLibID});
+            { templateLibID });
     }
 
 
     const UTIL = Object.freeze({
+        escapeXMLEntity,
+        restoreXMLEntity,
         getValue,
         arrayValue,
         getFee,
-        transformCalcBase
+        getFlag,
+        getItemsRecur,
+        readAsTextSync,
     });
+
+    // 获取接受上传的文件类型正则表达式
+    function getAcceptReg(accepts) {
+        const acceptsExp = accepts.reduce((acc, cur, index) => {
+            return acc + `${index ? '|' : ''}\\${cur}`;
+        }, '');
+        return new RegExp(`(${acceptsExp})`, 'i');
+    }
+
+    return {
+        CONFIG,
+        UTIL,
+        getAcceptReg,
+    }
 })();

+ 6 - 6
web/building_saas/main/js/models/installation_fee.js

@@ -345,13 +345,13 @@ var installation_fee = {
                     setTreeSelection(selectedNode);
                     let endTime =  +new Date();
                     console.log(`计算安装增加费时间——${endTime - startTime}`);
-                    projectObj.project.projectGLJ.loadData(function () {
-                        cbTools.refreshFormulaNodes();
-                        if(callback){
-                            callback(true,calRations);
-                        }
+                    projectObj.project.projectGLJ.loadNewProjectGLJToCaches(data.projectGLJList,true);
+                    cbTools.refreshFormulaNodes();
+                    if(callback){
+                        callback(true,calRations);
+                    }
                         $.bootstrapLoading.end();
-                    });
+
                 });
             }else {
                 if(callback) callback(false);

+ 3 - 92
web/building_saas/main/js/models/main_consts.js

@@ -133,13 +133,7 @@ const volumePriceMaps = {
     4: "量主",
     5: "量设"
 };
-const rationType = {
-    ration: 1,
-    volumePrice: 2,
-    gljRation: 3,
-    install:4,
-    overHeight: 5 // 超高子目
-};
+const rationType = commonConstants.rationType;
 const rationPrefix = { //定额前缀,补/借
     none: '',
     complementary: '补',
@@ -210,84 +204,7 @@ const materialTypeMap = {
 }
 
 //清单固定行
-const fixedFlag = {
-    // 分部分项工程
-    SUB_ENGINERRING: 1,
-    // 措施项目
-    MEASURE: 2,
-    // 施工技术措施项目
-    CONSTRUCTION_TECH: 3,
-    // 安全文明施工按实计算费用
-    SAFETY_CONSTRUCTION_ACTUAL: 4,
-    // 施工组织措施专项费用
-    CONSTRUCTION_ORGANIZATION: 5,
-    // 安全文明施工专项费用
-    SAFETY_CONSTRUCTION: 6,
-    // 其他项目
-    OTHER: 7,
-    // 暂列金额
-    PROVISIONAL: 8,
-    // 暂估价
-    ESTIMATE: 9,
-    // 材料(工程设备)暂估价
-    MATERIAL_PROVISIONAL: 10,
-    // 专业工程暂估价
-    ENGINEERING_ESITIMATE: 11,
-    // 计日工
-    DAYWORK: 12,
-    // 总承包服务费
-    TURN_KEY_CONTRACT: 13,
-    // 索赔与现场签证
-    CLAIM_VISA: 14,
-    // 规费
-    CHARGE: 15,
-    // 社会保险费及住房公积金 Social insurance fee and housing accumulation fund
-    SOCIAL_INSURANCE_HOUSING_FUND: 16,
-    // 工程排污费 charges for disposing pollutants
-    POLLUTANTS: 17,
-    // 税金
-    TAX: 18,
-    //工程造价
-    ENGINEERINGCOST: 19,
-    //增值税
-    ADDED_VALUE_TAX: 20,
-    //专项技术措施暂估价
-    SPECIAL_TECH_PROVISIONAL: 21,
-    //专业发包工程管理费
-    LET_CONTRACT_MANAGEMENT: 22,
-    //人工
-    LABOUR: 23,
-    //材料
-    MATERIAL: 24,
-    //施工机械
-    MACHINE: 25,
-    //索赔
-    CLAIM: 26,
-    //现场签证
-    VISA: 27,
-    //附加税
-    ADDITIONAL_TAX: 28,
-    //环境保护税
-    ENVIRONMENTAL_PROTECTION_TAX: 29,
-    //建设工程竣工档案编制费
-    PROJECT_COMPLETE_ARCH_FEE:30,
-    //住宅工程质量分户验收费
-    HOUSE_QUALITY_ACCEPT_FEE:31,
-    //组织措施费
-    ORGANIZATION:32,
-    //其他措施费
-    OTHER_MEASURE_FEE:33,
-    // 绿色施工安全防护措施费
-    GREEN_MEASURE_FEE: 34,
-    // 预算包干费
-    BUDGET_INCLUDE_WORK_FEE: 35,
-    // 工程优质费
-    PROJECT_HIGH_QUALITY_FEE: 36,
-    // 概算幅度差
-    BUDGET_ESTIMATE_DIFF: 37,
-    // 其他费用(与其他项目不同,参考广东的用法)
-    OTHER_FEE: 38
-};
+const fixedFlag = commonConstants.fixedFlag;
 // 只读的固定类别(工程量、单价、综合合价只读,相当于是标题)
 const titleFlags = [
     fixedFlag.PROVISIONAL,
@@ -305,13 +222,7 @@ const titleFlags = [
 const gljKeyArray =['code','name','specs','unit','type'];
 const rationKeyArray =['code','name','specs','unit','subType'];
 const gljLibKeyArray =['code', 'name', 'specs', 'unit', 'gljType'];
-const billType ={
-    DXFY:1,//大项费用
-    FB:2,//分部
-    FX:3,//分项
-    BILL:4,//清单
-    BX:5//补项
-};
+const billType = commonConstants.billType;
 const billText = {
     1:'费用',
     2:'分部',

+ 2 - 2
web/building_saas/main/js/models/overHeight.js

@@ -1072,7 +1072,7 @@ const OVER_HEIGHT = (() => {
      * 为了降低复杂度和保证逻辑统一性,重新计取为重新走(删除新增逻辑)
      * 需要尽可能地降低操作的触发率
      */
-    function reCalcOverHeightFee() {
+    async function reCalcOverHeightFee() {
         const project = projectObj.project;
         // 如果项目没有超高降效数据,项目不可用超高降效,返回
         if (!project.isOverHeightProject()) {
@@ -1094,7 +1094,7 @@ const OVER_HEIGHT = (() => {
             return;
         }
         // 存在不同,重算
-        handleConfirmed();
+       await handleConfirmed();
     }
 
     // 事件监听

+ 73 - 5
web/building_saas/main/js/models/project.js

@@ -539,17 +539,38 @@ var PROJECT = {
 
         project.prototype.updateNodesCache =function (datas) {
             let refreshNode = [];
+            let reclacQuantity = false;
+            let deleteNode=[],addNodeDatas=[];
             for(let d of datas){
                 let temObj = null;
                 if(d.type == ModuleNames.bills || d.type == ModuleNames.ration){//如果是树节点类型,直接取树节点更新
-                    let temNode = this.mainTree.getNodeByID(d.data.ID);
-                    if(temNode){
-                        temObj = temNode.data;
-                        refreshNode.push(temNode);
+                    if(d.action =="add"){
+                        if(d.type == ModuleNames.ration) this.Ration.datas.push(d.data);
+                        reclacQuantity = true;
+                        addNodeDatas.push(d);
+                    }else {
+                        let temNode = this.mainTree.getNodeByID(d.data.ID);
+                        if(temNode){
+                            if(d.action =="delete"){
+                                if(d.type == ModuleNames.ration){
+                                    _.remove(this.Ration.datas,{'ID':d.data.ID});
+                                    this.Ration.deleteSubListOfRation({ID:d.data.ID});
+                                    reclacQuantity = true;
+                                }
+                                deleteNode.push(temNode);//对于删除节点,统一不加入refreshNode中,由外部加入,避免重复
+                            }else {
+                                temObj = temNode.data;
+                                if(gljUtil.isDef(d.data.quantity))reclacQuantity = true;
+                                refreshNode.push(temNode);
+                            }
+                        }
                     }
                 }else if(d.type == ModuleNames.project){
                     temObj = this;
-                }else {//其它类型,更新datas
+                }else if (d.type == ModuleNames.ration_glj && d.action == "add"){
+                    this[d.type].datas.push(d.data);
+                    if(d.projectGLJ) this.projectGLJ.loadNewProjectGLJToCache(d.projectGLJ);
+                } else {//其它类型,更新datas
                     temObj = _.find(this[d.type].datas,{"ID":d.data.ID});
                 }
                 if(temObj){
@@ -561,7 +582,54 @@ var PROJECT = {
                     }
                 }
             }
+
+            //对树节点的操作并删除、添加清单、删除添加定额、删除对应的定额工料机缓存
+            TREE_SHEET_HELPER.massOperationSheet(projectObj.mainController.sheet, function () {
+                deleteTreeNodes(deleteNode);
+                addNewNodes(addNodeDatas,refreshNode);
+            });
+
+
+            if(reclacQuantity) this.projectGLJ.calcQuantity();
             return refreshNode;
+
+
+
+
+            function deleteTreeNodes(deleteNodes) {
+                let controller = projectObj.mainController, project = projectObj.project;
+                let Bill = project.Bills, Ration = project.Ration;
+                for(let rd of deleteNodes){
+                    controller.sheet.deleteRows(rd.serialNo(),1);
+                    controller.tree.delete(rd);
+                    if(rd.sourceType == Bill.getSourceType()) Bill.tree.delete(rd.source);
+                }
+            }
+            function addNewNodes(newDatas,refreshNode) {
+                let controller = projectObj.mainController;
+                let Bill = projectObj.project.Bills;
+                let newAddNode = [];
+                for(let nr of newDatas){
+                    let nextID = -1;
+                    let preNode = projectObj.project.mainTree.getNodeByID(nr.preSiblingID);
+                    if(preNode) nextID = preNode.getNextSiblingID();
+                    let newNode = projectObj.project.mainTree.insert(nr.parentID, nextID, nr.data.ID);
+                    if(nr.type == ModuleNames.bills){
+                        let newSource = Bill.tree.insertByData(nr.data, nr.ParentID, nextID, true);
+                        newNode.source = newSource;
+                    }else {
+                        newNode.source = nr.data;
+                    }
+                    newNode.sourceType = nr.type;
+                    newNode.data = nr.data;
+                    controller.sheet.addRows(newNode.serialNo(), 1);
+                    controller.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center);
+                    newAddNode.push(newNode);
+                    refreshNode.push(newNode);
+                }
+                TREE_SHEET_HELPER.refreshTreeNodeData(controller.setting, controller.sheet, newAddNode, false);
+            }
+
         };
         project.prototype.setValue=function (obj,key,value) {
             let keyArray = key.split('.');

+ 15 - 7
web/building_saas/main/js/models/project_glj.js

@@ -316,8 +316,9 @@ ProjectGLJ.prototype.updatePrice = function (recode, updateField, newval,from,cb
             me.refreshTreeNodePriceIfNeed(glj);//刷新造价书中主树上的定额工料机;
             gljs.push(glj);
             let nodes = me.getImpactRationNodes(gljs);//取到因为改变工料机价格而受影响的定额
-            projectObj.project.calcProgram.calcNodesAndSave(nodes, function () {
-                OVER_HEIGHT.reCalcOverHeightFee();
+            projectObj.project.calcProgram.calcNodesAndSave(nodes, async function () {
+                await OVER_HEIGHT.reCalcOverHeightFee();
+                await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(nodes);
             });//触发计算程序
             projectGljObject.onUnitFileChange(data);
             if(cb){
@@ -923,18 +924,23 @@ ProjectGLJ.prototype.calcTenderQuantity  = function (){
     gljUtil.calcProjectGLJQuantity(this.datas,rationGLJDatas,rationDatas,billsDatas,getDecimal("glj.quantity"),_,scMathUtil,true);
 };
 
-ProjectGLJ.prototype.loadNewProjectGLJToCaches = function (datas) {
+ProjectGLJ.prototype.loadNewProjectGLJToCaches = function (datas,calquantity = false) {
+    if(!datas) return;
+    let gljIDMap = {};
     for (let d of datas){
-        this.loadNewProjectGLJToCache(d);
+       if(d) this.loadNewProjectGLJToCache(d,gljIDMap);
     }
+    if(datas.length > 0 &&  calquantity)  this.calcQuantity();
 };
 
-ProjectGLJ.prototype.loadNewProjectGLJToCache = function (data) {//把新插入的项目工料机数据增加至缓存中
+ProjectGLJ.prototype.loadNewProjectGLJToCache = function (data,tIDMap) {//把新插入的项目工料机数据增加至缓存中
+    if(!data) return;
     let project_gljs = this.datas.gljList;
     let unitPriceMap = this.datas.unitPriceMap;
     let mixRatioMap = this.datas.mixRatioMap;
     let mixRatioConnectData = this.datas.mixRatioConnectData;
-    let tem =  _.find(project_gljs,{'id':data.id});
+    let IDMap = !_.isEmpty(tIDMap)?tIDMap:_.indexBy(project_gljs,'id');
+    let tem =  IDMap[data.id];
     if(tem) return; //判断该工料机是否已经存在,是的话不用再次添加
     //查看是否有组成物,有组成物的话先添加组成物信息
     data.ratio_data=[];
@@ -945,7 +951,7 @@ ProjectGLJ.prototype.loadNewProjectGLJToCache = function (data) {//把新插入
             mixRatioMap[ratio.connect_key]?mixRatioMap[ratio.connect_key].push(ratio):mixRatioMap[ratio.connect_key] = [ratio];
             let rIndex = gljUtil.getIndex(ratio);
             mixRatioConnectData[rIndex]?mixRatioConnectData[rIndex].push(ratio.connect_key):mixRatioConnectData[rIndex] = [ratio.connect_key];
-            this.loadNewProjectGLJToCache(s);
+            this.loadNewProjectGLJToCache(s,IDMap);
         }
         delete data.subList;
     }
@@ -953,6 +959,8 @@ ProjectGLJ.prototype.loadNewProjectGLJToCache = function (data) {//把新插入
     let uIndex = gljUtil.getIndex(data.unit_price);
     if(!unitPriceMap[uIndex])  unitPriceMap[uIndex] = data.unit_price;
     this.datas.gljList.push(data);
+    IDMap[data.id] = data;
+    return data;
 };
 
 class EvaluateList {

+ 6 - 4
web/building_saas/main/js/models/quantity_detail.js

@@ -771,9 +771,10 @@ var quantity_detail = {
                 /*project.calcProgram.calcNodesAndSave(needUpdateChildren, function () {
                     project.projectGLJ.loadData();
                 });*/
-                project.calcProgram.calcNodesAndSave(needUpdateChildren, function () {
+                project.calcProgram.calcNodesAndSave(needUpdateChildren,async function () {
                     project.projectGLJ.calcQuantity();
-                    OVER_HEIGHT.reCalcOverHeightFee();
+                    await OVER_HEIGHT.reCalcOverHeightFee();
+                    await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(needUpdateChildren);
                     if(project.Bills.isFBFX(node)) { //判断是否属于分部分项工程 ,是的话才需要做计取安装费计算
                         project.installation_fee.calcInstallationFee(function (isChange,rations) {
                             if(isChange){
@@ -816,7 +817,7 @@ var quantity_detail = {
             node.changed = true;
             let rationNodes = mbzm_obj.updateReferenceRationNodeQuantity(node);
             rationNodes.push(node);
-            project.calcProgram.calcNodesAndSave(rationNodes, function () {
+            project.calcProgram.calcNodesAndSave(rationNodes, async function () {
                 project.projectGLJ.calcQuantity();
                 let calcInstall = false;
                 for(let t of rationNodes){
@@ -832,7 +833,8 @@ var quantity_detail = {
                         }
                     });
                 }
-                OVER_HEIGHT.reCalcOverHeightFee();
+                await OVER_HEIGHT.reCalcOverHeightFee();
+                await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(rationNodes);
             });
             let childrenNodes = [];
             for(let r of rationNodes){

+ 38 - 35
web/building_saas/main/js/models/ration.js

@@ -431,22 +431,19 @@ var Ration = {
                        project.ration_glj.removeNodeByRation(recode.ration,projectObj.mainController);
                        project.Ration.deleteSubListOfRation(recode.ration,cleanzmhs);//删除旧定额下的相关记录
                        //添加新的记录
-                       project.Ration.addSubListOfRation(recode);
-
-
+                       project.Ration.addSubListOfRation(recode,false);
                        project.ration_glj.addToMainTree(recode.ration_gljs);
                    }
                 }
-                project.projectGLJ.loadData(function () {
-                    mbzm_obj.nodeChanged = true;//子目模板关联刷新
-                    gljOprObj.showDataIfRationSelect(projectObj.project.mainTree.selected,"-111111111");//这里第二个参数是为了使改前和改后selectedID不一样,删除了的话下方的定额工料机不会刷新
-                    project.calcProgram.calcNodesAndSave(refershNodes, function () {
-                        OVER_HEIGHT.reCalcOverHeightFee();
-                    });
-                    projectObj.mainController.refreshTreeNode(refershNodes, true);
-                    $.bootstrapLoading.end();
+                project.projectGLJ.calcQuantity();
+                mbzm_obj.nodeChanged = true;//子目模板关联刷新
+                gljOprObj.showDataIfRationSelect(projectObj.project.mainTree.selected,"-111111111");//这里第二个参数是为了使改前和改后selectedID不一样,删除了的话下方的定额工料机不会刷新
+                project.calcProgram.calcNodesAndSave(refershNodes, async function () {
+                    await OVER_HEIGHT.reCalcOverHeightFee();
+                    await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(refershNodes);
                 });
-
+                projectObj.mainController.refreshTreeNode(refershNodes, true);
+                $.bootstrapLoading.end();
                 if(data.length < nodeInfo.length && nodeInfo[data.length].newCode!=null){//说明有部分定额编号没找到记录
                     alert('当前库中找不到定额"' + nodeInfo[data.length].newCode + '"');
                 }
@@ -521,7 +518,7 @@ var Ration = {
                     //更新缓存
                     for(let data of rstData){
                         me.datas.push(data.ration);
-                        me.addSubListOfRation(data);
+                        me.addSubListOfRation(data,false);
                         //插入树节点
                         newSource = data.ration;
                         newNode = project.mainTree.insert(billItemID, nextID, newSource.ID);
@@ -532,30 +529,34 @@ var Ration = {
                         newNode.data = newSource;
                         ProjectController.syncDisplayNewNode(sheetController, newNode);
                     }
-                    project.projectGLJ.loadData(function () {
-                        for(let data of rstData){
-                            project.ration_glj.addToMainTree(data.ration_gljs);
-                        }
-                        projectObj.mainController.refreshTreeNode(newNodes, false);
-                        if(project.Bills.isFBFX(newNodes[0])) { //判断是否属于分部分项工程 ,是的话才需要做计取安装费计算
-                            project.installation_fee.calcInstallationFee(function (isChange,rations) {
-                                if(isChange){
-                                    rations = rations.concat(newNodes);
-                                    project.calcProgram.calcNodesAndSave(rations);
-                                }else {
-                                    project.calcProgram.calcNodesAndSave(newNodes);
-                                }
-                            });
-                        }else {
-                            project.calcProgram.calcNodesAndSave(newNodes);
-                        }
-                        updateBillsOprRation();
+                    project.projectGLJ.calcQuantity();
+                    for(let data of rstData){
+                        project.ration_glj.addToMainTree(data.ration_gljs);
+                    }
+                    projectObj.mainController.refreshTreeNode(newNodes, false);
+                    if(project.Bills.isFBFX(newNodes[0])) { //判断是否属于分部分项工程 ,是的话才需要做计取安装费计算
+                        project.installation_fee.calcInstallationFee(function (isChange,rations) {
+                            if(isChange){
+                                rations = rations.concat(newNodes);
+                                project.calcProgram.calcNodesAndSave(rations);
+                                itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(rations);
+                            }else {
+                                project.calcProgram.calcNodesAndSave(newNodes);
+                                itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(newNodes);
+                            }
+                        });
+                    }else {
+                        project.calcProgram.calcNodesAndSave(newNodes);
+                        itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(newNodes);
+                    }
+                    updateBillsOprRation();
+
                         if(callback){
                             callback();
                         }
                         showLoding = false;
                         $.bootstrapLoading.end();
-                    });
+
                 })
             }
         };
@@ -648,9 +649,10 @@ var Ration = {
                         syncNodeOper(data);
                         if(callback) callback(newNode);
                     }else {
-                        if(data.projectGLJDatas) projectObj.project.projectGLJ.refreshByDatas(data.projectGLJDatas);
+                        //if(data.projectGLJDatas) projectObj.project.projectGLJ.refreshByDatas(data.projectGLJDatas);
                         syncNodeOper(data);
-                        project.calcProgram.calcAndSave(newNode,function () {
+                        project.calcProgram.calcAndSave(newNode,async function () {
+                            await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes([newNode]);
                             if(project.Bills.isFBFX(newNode)) { //判断是否属于分部分项工程 ,是的话才需要做计取安装费计算
                                 installationFeeObj.calcInstallationFee();
                             }
@@ -754,12 +756,13 @@ var Ration = {
             }
 
         };
-        ration.prototype.addSubListOfRation = function (data) {
+        ration.prototype.addSubListOfRation = function (data,calquantity = true) {
              project.ration_glj.addDatasToList(data.ration_gljs);
              project.ration_coe.addDatasToList(data.ration_coes);
              project.ration_installation.addDatasToList(data.ration_installations);
              project.ration_template.addDatasToList(data.ration_templates);
              project.quantity_detail.addDatasToList(data.quantity_details);
+             if(data.projectGLJList ) projectObj.project.projectGLJ.loadNewProjectGLJToCaches(data.projectGLJList,calquantity);
         };
 
         ration.prototype.replaceRation = function (ration, std) {

+ 22 - 20
web/building_saas/main/js/models/ration_glj.js

@@ -283,9 +283,10 @@ let ration_glj = {
                     projectObj.mainController.deleteNode(node, next);
                 }
             }
-            project.calcProgram.calcAndSave(rationNode,function () {
+            project.calcProgram.calcAndSave(rationNode,async function () {
                 installationFeeObj.calcInstallationFee();
-                OVER_HEIGHT.reCalcOverHeightFee();
+                await OVER_HEIGHT.reCalcOverHeightFee();
+                await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes([rationNode.parent]);
             });
         };
         // CSL,2017.05.09
@@ -773,23 +774,23 @@ let ration_glj = {
                     let rationNode = projectObj.project.mainTree.findNode(data.rationID);
                     let nodes =  [rationNode];
                     glj_list[list_index] = data;
-                    project.projectGLJ.loadData(function () {//加载完项目工料机再计算
-                        gljOprObj.refreshView();
-                        if (project.ration_glj.needShowToTree(data)) {//当替换的是主材或设备时,刷新对应的树节点
-                            let node = project.ration_glj.findGLJNodeByID(data.ID);
-                            if (node) {
-                                project.ration_glj.transferToNodeData(data);
-                                node.source = data;
-                                node.data = data;
-                            }
-                            node ? nodes.push(node) : "";
+                    project.projectGLJ.loadNewProjectGLJToCaches([result.projectGLJ],true);
+                    gljOprObj.refreshView();
+                    if (project.ration_glj.needShowToTree(data)) {//当替换的是主材或设备时,刷新对应的树节点
+                        let node = project.ration_glj.findGLJNodeByID(data.ID);
+                        if (node) {
+                            project.ration_glj.transferToNodeData(data);
+                            node.source = data;
+                            node.data = data;
                         }
-                        rationNode.data.adjustState = result.adjustState;
-                        rationNode.data.name = result.name;
-                        projectObj.mainController.refreshTreeNode(nodes);
-                        project.calcProgram.calcAndSave(rationNode);
-                        $.bootstrapLoading.end();
-                    });
+                        node ? nodes.push(node) : "";
+                    }
+                    rationNode.data.adjustState = result.adjustState;
+                    rationNode.data.name = result.name;
+                    projectObj.mainController.refreshTreeNode(nodes);
+                    project.calcProgram.calcAndSave(rationNode);
+                    $.bootstrapLoading.end();
+
                 }
             }, function () {
                 $.bootstrapLoading.end();
@@ -1016,8 +1017,9 @@ let ration_glj = {
             let node = this.findRationNodeByID(ration_glj.rationID);
             if (node) {
                 node.changed = true;
-                project.calcProgram.calcAndSave(node, function () {
-                    OVER_HEIGHT.reCalcOverHeightFee();
+                project.calcProgram.calcAndSave(node, async function () {
+                    await OVER_HEIGHT.reCalcOverHeightFee();
+                    await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes([node.parent]);
                 });
             }
         };

+ 16 - 9
web/building_saas/main/js/views/area_increase_fee_view.js

@@ -22,11 +22,7 @@ let areaIncreaseFeeObj = {
         setData(data.data,newval,fieldName);
         datas.push(data);
         setChildren(node,newval,datas);//同步设置所有子项
-        let nodes = await projectObj.project.syncUpdateNodesAndRefresh(datas);
-        projectObj.project.calcProgram.calcNodesAndSave(nodes,function () {
-            OVER_HEIGHT.reCalcOverHeightFee();
-        });
-
+        this.updateAndRefresh(datas);
 
         function setChildren(pnode,newValue,datas) {//同步设置所有子项
             if(pnode.children.length > 0 && (pnode.children[0].sourceType == ModuleNames.bills || pnode.children[0].sourceType == ModuleNames.ration)){//设置子项
@@ -35,6 +31,7 @@ let areaIncreaseFeeObj = {
                         type:c.sourceType,
                         data:{ID:c.data.ID}
                     };
+                    if(c.data.calcBase&&c.data.calcBase!="") continue;
                     setData(data.data,newval,fieldName);
                     datas.push(data);
                     setChildren(c,newValue,datas)
@@ -46,6 +43,16 @@ let areaIncreaseFeeObj = {
             if(fieldName == "outPutMaxPrice") data.maxPrice = null;
         }
     },
+    updateAndRefresh:async function(datas){
+        let nodes = await projectObj.project.syncUpdateNodesAndRefresh(datas);
+        projectObj.project.calcProgram.calcNodesAndSave(nodes,async function () {
+            await OVER_HEIGHT.reCalcOverHeightFee();
+            await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(nodes);
+        });
+        projectObj.project.projectGLJ.calcQuantity();
+        gljOprObj.refreshView();
+    },
+
     confirmAreaIncreaseFeeSetting:async function () {
         let labour = $("#areaIncreaseFee_labour").val();
         let material = $("#areaIncreaseFee_material").val();
@@ -74,8 +81,7 @@ let areaIncreaseFeeObj = {
         if(needUpdate){
             let datas = this.getAreaIncreaseDatas();
             datas.push(tem);
-            let nodes = await projectObj.project.syncUpdateNodesAndRefresh(datas);
-            projectObj.project.calcProgram.calcNodesAndSave(nodes);
+           this.updateAndRefresh(datas);
         }
 
         function settingNumCheck(value,type) {
@@ -115,8 +121,9 @@ let areaIncreaseFeeObj = {
             d.data.areaIncreaseFee = false;
         }
         let nodes = await projectObj.project.syncUpdateNodesAndRefresh(datas);
-        projectObj.project.calcProgram.calcNodesAndSave(nodes,function () {
-            OVER_HEIGHT.reCalcOverHeightFee();
+        projectObj.project.calcProgram.calcNodesAndSave(nodes,async function () {
+            await OVER_HEIGHT.reCalcOverHeightFee();
+            await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(nodes);
         });
     }
     

+ 5 - 1
web/building_saas/main/js/views/calc_program_view.js

@@ -41,7 +41,7 @@ let calcProgramObj = {
 
     // 刷新显示当前选中树结点的计算程序。
     // treeNode:末指定时默认是造价书当前选中树结点
-    // refreshKind: 1 仅刷新 2 计算并刷新但无需保存 3 计算保存并刷新
+    // refreshKind: 1 仅刷新 2 计算并刷新但无需保存 3 计算保存并刷新 4 仅计算无需保存和刷新
     refreshCalcProgram: function (treeNode, refreshKind = 1) {
         var me = this;
         me.treeNode = treeNode;
@@ -51,6 +51,7 @@ let calcProgramObj = {
                 // doNothing
                 break;
             case 2:
+            case 4:
                 projectObj.project.calcProgram.innerCalc(treeNode, []);
                 projectObj.project.calcProgram.rationMap = null;
                 delete treeNode.changed;
@@ -61,6 +62,9 @@ let calcProgramObj = {
         }
 
         me.datas = treeNode.data.calcTemplate ? treeNode.data.calcTemplate.calcItems : [];
+        if (refreshKind === 4) {
+            return;
+        } 
         sheetCommonObj.initSheet(me.sheet, me.setting, me.datas.length);
         sheetCommonObj.showData(me.sheet, me.setting, me.datas);
         customRowHeader(me.sheet, me.datas.length);

+ 42 - 38
web/building_saas/main/js/views/export_view.js

@@ -75,6 +75,43 @@ const ExportView = (() => {
             $('#exportCode').modal('show');
         }
     }
+    // 确定导出
+    async function handleExportConfirm() {
+        if (!spread || !_exportCache || !_exportCache.length) {
+            return false;
+        }
+        if (STATE.confirming) {
+            return;
+        }
+        STATE.confirming = true;
+        let pr = new SCComponent.InitProgressBar();
+        try {
+            // 工程编号
+            let codes = getCodeFromSheet(spread.getSheet(0));
+            if (codes.includes('')) {
+                alert('单项、单位工程工程编号不可为空。');
+                STATE.confirming = false;
+                return false;
+            }
+            if ([...new Set(codes)].length !== codes.length) {
+                alert('单项、单位工程工程编号必须唯一。');
+                STATE.confirming = false;
+                return false;
+            }
+            pr.start('导出数据接口', '正在导出文件,请稍候……');
+            // 导出文件
+            await _base.exportFile(codes, _exportCache, XMLStandard.resetContentCode, XMLStandard.saveAsFile);
+        } catch (err) {
+            console.log(err);
+            alert(err);
+        }
+        pr.end();
+        $('#exportCode').modal('hide');
+        $('#export').modal('hide');
+        setTimeout(() => {
+            STATE.confirming = false;
+        }, 300);
+    }
     //事件监听
     function exportListener() {
         //导出接口-项目自检
@@ -95,7 +132,7 @@ const ExportView = (() => {
                     for (let checkedData of checkedDatas) {
                         let fileKind = parseInt($(checkedData).val());
                         let exportData = await _base.extractExportData(XMLStandard.entry, _base.CONFIG.GRANULARITY.PROJECT,
-                                fileKind, projectObj.project.ID(), userID);
+                            XMLStandard.summaryObj, fileKind, projectObj.project.ID(), userID);
                         _exportCache.push(...exportData);
                     }
                 }
@@ -113,6 +150,7 @@ const ExportView = (() => {
                 }
                 throw '自检完成,未检测到错误数据。'
             } catch (err) {
+                console.log(err);
                 alert(err);
             }
             pr.end();
@@ -140,8 +178,8 @@ const ExportView = (() => {
                     pr.start('导出数据接口', '正在导出文件,请稍候……');
                     for (let checkedData of checkedDatas) {
                         let fileKind = parseInt($(checkedData).val());
-                        let exportData = await _base.extractExportData(XMLStandard.entry, _base.CONFIG.GRANULARITY.PROJECT,
-                            fileKind, projectObj.project.ID(), userID);
+                        let exportData = await _base.extractExportData(XMLStandard.entry, _base.CONFIG.GRANULARITY.PROJECT, 
+                            XMLStandard.summaryObj, fileKind, projectObj.project.ID(), userID);
                         _exportCache.push(...exportData);
                     }
                     pr.end();
@@ -188,41 +226,7 @@ const ExportView = (() => {
         });
         //设置完工程编号后,导出数据。如果选中多个文件,导出压缩包
         $('#exportCode-confirm').click(async function () {
-            if (!spread || !_exportCache || !_exportCache.length) {
-                return false;
-            }
-            if (STATE.confirming) {
-                return;
-            }
-            STATE.confirming = true;
-            let pr = new SCComponent.InitProgressBar();
-            try {
-                // 工程编号
-                let codes = getCodeFromSheet(spread.getSheet(0));
-                if (codes.includes('')) {
-                    alert('单项、单位工程工程编号不可为空。');
-                    STATE.confirming = false;
-                    return false;
-                }
-                if ([...new Set(codes)].length !== codes.length) {
-                    alert('单项、单位工程工程编号必须唯一。');
-                    STATE.confirming = false;
-                    return false;
-                }
-                pr.start('导出数据接口', '正在导出文件,请稍候……');
-                // 导出文件
-                await _base.exportFile(codes, _exportCache, XMLStandard.resetContentCode, XMLStandard.saveAsFile);
-            } catch (err) {
-                console.log(err);
-                alert(err);
-            }
-            pr.end();
-            $('#exportCode').modal('hide');
-            $('#export').modal('hide');
-            setTimeout(() => {
-                STATE.confirming = false;
-            }, 300);
-
+            await handleExportConfirm();
         });
         //导出窗口--------
         $('#export').on('hide.bs.modal', function() {

+ 44 - 36
web/building_saas/main/js/views/glj_view.js

@@ -251,7 +251,7 @@ var gljOprObj = {
         let selected = projectObj.project.mainTree.selected;
         if($.bootstrapLoading.isLoading())  args.cancel = true;
         if(selected){
-            if(me.isInstallationNode(selected)==true || OVER_HEIGHT.isOverHeight(selected)){
+            if(me.isInstallationNode(selected)==true || me.isItemIncreaseNode(selected)==true|| OVER_HEIGHT.isOverHeight(selected)){
                 args.cancel = true;
             }else {
                 if(args.sheetName == 'quantity_detail'){//工程量明细表
@@ -277,6 +277,12 @@ var gljOprObj = {
         }
         return false
     },
+    isItemIncreaseNode:function(node){//子目增加费节点
+        if(node.sourceType == ModuleNames.ration&&node.data.type == rationType.itemIncrease){//是定额安装费类型时只读,原先是补项的时候也是控制只读的||(node.sourceType == ModuleNames.bills&&node.data.type==billType.BX)){//是定额安装费类型或者补项
+            return true;
+        }
+        return false
+    },
     onEditEnded: function (sender, args) {
         var me = gljOprObj;
         if (args.sheetName == 'ration_glj') {
@@ -1275,13 +1281,13 @@ var gljOprObj = {
                     //project.ration_glj.datas = project.ration_glj.datas.concat(result.newRecodes);//显示和缓存统一,这样的话就不用更新两个位置了
                     project.ration_glj.datas = project.ration_glj.datas.concat(result.showData);
                     gljOprObj.sheetData = gljOprObj.sheetData.concat(result.showData);
-                    project.projectGLJ.loadData(function () {
-                        project.ration_glj.addToMainTree(result.showData);
-                        gljOprObj.showRationGLJSheetData();
-                        project.calcProgram.calcAndSave(selected);
-                        projectObj.mainController.refreshTreeNode([selected]);
-                        $.bootstrapLoading.end();
-                    });
+                    project.projectGLJ.loadNewProjectGLJToCaches(result.projectGLJList,true);
+                    project.ration_glj.addToMainTree(result.showData);
+                    gljOprObj.showRationGLJSheetData();
+                    project.calcProgram.calcAndSave(selected);
+                    projectObj.mainController.refreshTreeNode([selected]);
+                    $.bootstrapLoading.end();
+
                 }
             });//doc.rationID=selected.data.ID;
         }
@@ -1302,28 +1308,29 @@ var gljOprObj = {
                 let nodes = [selected];
                 gljOprObj.sheetData[index] = data;
                 glj_list[list_index] = data;
-                project.projectGLJ.loadData(function () {//加载完项目工料机再计算
-                    gljOprObj.showRationGLJSheetData();
-                    let node = project.ration_glj.updateGLJNodeAfterReplace(data);
-                    if(node) nodes.push(node);
-                    /*if (project.ration_glj.needShowToTree(data)) {//当替换的是主材或设备时,刷新对应的树节点
-                        var node = project.ration_glj.findGLJNodeByID(data.ID);
-                        if (node) {
-                            project.ration_glj.transferToNodeData(data);
-                            node.source = data;
-                            node.data = data;
-                        }
-                        node ? nodes.push(node) : "";
-                    }*/
-                    //project.ration_glj.addToMainTree(data);
-                    selected.data.adjustState = result.adjustState;
-                    selected.data.name = result.name;
-                    projectObj.mainController.refreshTreeNode(nodes);
-                    project.calcProgram.calcAndSave(selected, function () {
-                        OVER_HEIGHT.reCalcOverHeightFee();
-                    });
-                    $.bootstrapLoading.end();
+                project.projectGLJ.loadNewProjectGLJToCaches([result.projectGLJ],true);
+                gljOprObj.showRationGLJSheetData();
+                let node = project.ration_glj.updateGLJNodeAfterReplace(data);
+                if(node) nodes.push(node);
+                /*if (project.ration_glj.needShowToTree(data)) {//当替换的是主材或设备时,刷新对应的树节点
+                    var node = project.ration_glj.findGLJNodeByID(data.ID);
+                    if (node) {
+                        project.ration_glj.transferToNodeData(data);
+                        node.source = data;
+                        node.data = data;
+                    }
+                    node ? nodes.push(node) : "";
+                }*/
+                //project.ration_glj.addToMainTree(data);
+                selected.data.adjustState = result.adjustState;
+                selected.data.name = result.name;
+                projectObj.mainController.refreshTreeNode(nodes);
+                project.calcProgram.calcAndSave(selected, async function () {
+                   await OVER_HEIGHT.reCalcOverHeightFee();
+                    await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes([selected]);
                 });
+                $.bootstrapLoading.end();
+
             }
         })
     },
@@ -1352,14 +1359,15 @@ var gljOprObj = {
                     }
                 }
             })
-            project.projectGLJ.loadData(function () {
-                me.showRationGLJSheetData();
-                var rationNodes = me.refreshStateAfterMreplace(stateList, nodes);
-                project.calcProgram.calcNodesAndSave(rationNodes, function () {
-                    OVER_HEIGHT.reCalcOverHeightFee();
-                });
-                $.bootstrapLoading.end();
+            project.projectGLJ.loadNewProjectGLJToCaches([result.projectGLJ],true);
+            me.showRationGLJSheetData();
+            var rationNodes = me.refreshStateAfterMreplace(stateList, nodes);
+            project.calcProgram.calcNodesAndSave(rationNodes, async function () {
+                await OVER_HEIGHT.reCalcOverHeightFee();
+                await  await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(rationNodes);
             });
+            $.bootstrapLoading.end();
+
         })
     },
     updateProperty: function (obj, doc) {

+ 8 - 7
web/building_saas/main/js/views/index_view.js

@@ -273,7 +273,7 @@ let indexObj= {
         this.spread.setActiveSheetIndex(3);
         let property = projectObj.project.property;
         let sheet = this.spread.getActiveSheet();
-        let mainDatas = this.getMainMaterialDatas(property.materials,projectObj.project.projectGLJ.datas,property.calcOptions,property.decimal,false,_,scMathUtil);
+        let mainDatas = this.getMainMaterialDatas(property,property.materials,projectObj.project.projectGLJ.datas,property.calcOptions,property.decimal,false,_,scMathUtil);
         sheetCommonObj.showData(sheet, this.mainMaterialSetting,mainDatas);
         sheet.setRowCount(mainDatas.length);
     },
@@ -324,8 +324,8 @@ let indexObj= {
         return gljUtil.getEconomicDatas(projectObj.project.property.engineerFeatures,economics,billsList,fixedFlag,_,scMathUtil);
     },
 
-    getMainMaterialDatas:function (materials,projectGLJData,calcOptions,decimalObj,isRadio,_,scMathUtil) {
-        return gljUtil.getMainMaterialDatas(projectObj.project.property.engineerFeatures,materials,projectGLJData,calcOptions,decimalObj,isRadio,_,scMathUtil);
+    getMainMaterialDatas:function (property,materials,projectGLJData,calcOptions,decimalObj,isRadio,_,scMathUtil) {
+        return gljUtil.getMainMaterialDatas(property,projectObj.project.property.engineerFeatures,materials,projectGLJData,calcOptions,decimalObj,isRadio,_,scMathUtil);
     },
     showEcoQuantity:function () {
         let parentMap = {};
@@ -368,8 +368,8 @@ let indexObj= {
                 name:d.name,
                 unit:d.unit,
                 quantity:d.quantity,
-                totalFee:d.feesIndex && d.feesIndex.common && d.feesIndex.common.totalFee?d.feesIndex.common.totalFee:0,
-                unitFee:d.feesIndex && d.feesIndex.common && d.feesIndex.common.unitFee?d.feesIndex.common.unitFee:0,
+                totalFee:d.feesIndex && d.feesIndex.common && d.feesIndex.common.tenderTotalFee?d.feesIndex.common.tenderTotalFee:0,
+                unitFee:d.feesIndex && d.feesIndex.common && d.feesIndex.common.tenderUnitFee?d.feesIndex.common.tenderUnitFee:0,
                 economicType:d.economicType,
                 quantityIndexType:d.quantityIndexType,
                 quantityIndexUnit:d.quantityIndexUnit,
@@ -415,13 +415,14 @@ let indexObj= {
                     specs:glj.specs,
                     unit:glj.unit,
                     type:glj.type,
-                    quantity:glj.quantity,
+                    quantity:glj.tenderQuantity,
                     materialIndexType:glj.materialIndexType,
                     materialIndexUnit:glj.materialIndexUnit,
                     materialIndexCoe:glj.materialIndexCoe
                 };
                 gljOprObj.setGLJPrice(tem,glj);
-                tem.totalPrice = scMathUtil.roundForObj(tem.marketPrice * glj.quantity,getDecimal("glj.unitPrice"))
+                tem.marketPrice =tem.tenderPrice;
+                tem.totalPrice = scMathUtil.roundForObj(tem.tenderPrice * glj.tenderQuantity,getDecimal("glj.unitPrice"))
                 datas.push(tem);
             }
             return datas;

+ 409 - 16
web/building_saas/main/js/views/item_increase_fee_view.js

@@ -7,19 +7,39 @@ let itemIncreaseFeeObj = {
     itemSetting:{
         header:[
             {headerName: "名称", headerWidth: 270, dataCode: "name", dataType: "String"},
-            {headerName: "范围", headerWidth: 70, dataCode: "displayScope",hAlign: "center",dataType: "String"},
+            {headerName: "范围", headerWidth: 70, dataCode: "displayScope",hAlign: "center",dataType: "String",cellType:'cusButton',callback:'selectScope'},
             {headerName: "取费基数", headerWidth: 150, dataCode: "base",  hAlign: "center", dataType: "String",cellType:'comboBox',options:itemBaseOptions},
             {headerName: "系数(%)", headerWidth: 55, dataCode: "coe", hAlign: "center", dataType: "Number",validator:"number"}
         ],
         view: {
-            lockColumns: ["code","specs"],
+            lockColumns: ["name","displayScope"],
             rowHeaderWidth:25,
             colHeaderHeight:36
         },
         autoFit:true,
-        fitRow:['name']
+        fitRow:['name'],
+        callback:{
+            selectScope:function (hitinfo) {
+                $("#item_increase_scope").modal('show');
+            }
+        }
     },
     settingDatas:[],
+    scopeSpread:null,
+    scopeSetting:{
+        header:[
+            {headerName: "编码", headerWidth: 250, dataCode: "code", dataType: "String"},
+            {headerName: "类别", headerWidth: 100, dataCode: "type",hAlign: "center",dataType: "String"},
+            {headerName: "名称", headerWidth: 300, dataCode: "name", dataType: "String"},
+            {headerName: "计取", headerWidth: 100, dataCode: "selected", hAlign: "center", dataType: "String",cellType:'checkBox'}
+        ],
+        view: {
+            lockColumns: ["name","code","type","selected"],
+            rowHeaderWidth:25,
+            colHeaderHeight:36
+        }
+    },
+    scopeDatas:[],
     initSpread:function () {
         if(this.settingSpread) return this.settingSpread.refresh();
         this.settingSpread = SheetDataHelper.createNewSpread($("#itemIncreaseFee_sheet")[0]);
@@ -28,16 +48,89 @@ let itemIncreaseFeeObj = {
         sheetCommonObj.initSheet(this.settingSheet, this.itemSetting, 4);
         this.settingSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onItemSelectionChange);
         this.settingSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onItemValueChange);
-    /*   ;
-
-        this.settingSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onElectrovalenceEditStarting);*/
-        /*
-         ;*/
         this.settingSheet.name('itemIncreaseFee_sheet');
         if(projectReadOnly){
             disableSpread(this.settingSpread);
         }
     },
+    initScopeSpread:function () {
+        if(this.scopeSpread) return this.scopeSpread.refresh();
+        this.scopeSpread = SheetDataHelper.createNewSpread($("#scopeSheet")[0]);
+        sheetCommonObj.spreadDefaultStyle(this.scopeSpread);
+        this.scopeSheet = this.scopeSpread.getSheet(0);
+        sheetCommonObj.initSheet(this.scopeSheet, this.scopeSetting, 0);
+        this.scopeSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, this.onScopeCheckBoxClick);
+        this.scopeSheet.name('scopeSheet');
+        if(projectReadOnly){
+            disableSpread(this.scopeSpread);
+        }
+    },
+    getSelectedItem:function () {
+        let selectedItem = null;
+        let sel = this.settingSheet.getSelections()[0];
+        if(sel.row != -1 && this.settingDatas.length>sel.row){
+            selectedItem = this.settingDatas[sel.row];
+        }
+        return selectedItem;
+    },
+    showScopeDatas:function () {
+        let controller = projectObj.mainController, project = projectObj.project;
+        let allNodes=[];
+        this.scopeDatas=[];
+        let selectedItem = this.getSelectedItem();
+        let fbfcNode = project.Bills.getFBFXNode(controller).source;//分部分项节点
+        if(fbfcNode){
+            allNodes.push(fbfcNode);
+            controller.tree.getAllSubNode(project.Bills.getFBFXNode(controller).source,allNodes);
+        }
+        let meaNode = project.Bills.getMeasureNode(controller).source;//措施项目节点
+        if(meaNode){
+            allNodes.push(meaNode);
+            controller.tree.getAllSubNode(project.Bills.getMeasureNode(controller).source,allNodes);
+        }
+        for(let row=0;row<allNodes.length;row++){
+            let node = allNodes[row];
+            let tem = {
+                ID:node.data.ID,
+                ParentID:node.data.ParentID,
+                code:node.data.code,
+                name:node.data.name,
+                type:billText[node.data.type],
+                selected:0,
+                collapsed:false,
+                row:row
+            };
+            if(selectedItem && selectedItem.scope&&selectedItem.scope[tem.ID]) tem.selected = 1;
+            if(node.data.calcBase&&node.data.calcBase!="") delete tem.selected;//有基数计算的不可选
+            this.scopeDatas.push(tem);
+        }
+        this.scopeSheet.setRowCount(this.scopeDatas.length);
+        sheetCommonObj.showTreeData(this.scopeSheet, this.scopeSetting,this.scopeDatas);
+    },
+    onScopeCheckBoxClick:function (sender,args) {
+        let me = itemIncreaseFeeObj;
+        let checkboxValue = args.sheet.getCell(args.row, args.col).value();
+        let newval = 0;
+        checkboxValue?newval=0:newval=1;
+        let record = me.scopeDatas[args.row];
+        let dataMap= _.groupBy(me.scopeDatas,"ParentID");
+        args.sheet.suspendPaint();
+        args.sheet.suspendEvent();
+        cascadeSelected(record,newval);
+        args.sheet.resumeEvent();
+        args.sheet.resumePaint();
+        function cascadeSelected(parent,val) {
+            if(gljUtil.isDef(parent.selected)){
+                args.sheet.getCell(parent.row, args.col).value(val);
+                parent.selected = val;
+                if(dataMap[parent.ID]){
+                    for(let c of dataMap[parent.ID]){
+                        cascadeSelected(c,val);
+                    }
+                }
+            }
+        }
+    },
     onItemSelectionChange:function (sender,args) {
         args.sheet.repaint();
     },
@@ -46,20 +139,29 @@ let itemIncreaseFeeObj = {
         let oldData = sel.row<this.settingDatas.length?this.settingDatas[sel.row]:"";
         this.settingSheet.setRowCount(0);
         this.settingDatas = datas?datas:this.getItemSettingDatas();
+        this.setItemForeStyle(this.settingDatas);
         sheetCommonObj.showData(this.settingSheet, this.itemSetting,this.settingDatas);
         this.settingSheet.setRowCount(this.settingDatas.length);
         sel.row =  oldData?_.findIndex(this.settingDatas,{'name':oldData.name}):sel.row ;
         this.settingSheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
     },
+    setItemForeStyle:function (datas) {
+        for(let d of datas){
+            if(_.isEmpty(d.scope)){
+                d.foreColor = "#ff2a23";
+                d.styleCol = 1;
+            }else {
+                delete  d.foreColor;
+                delete  d.styleCol;
+            }
+        }
+    },
+
     getItemSettingDatas:function () {
         let datas = [];
         if(projectObj.project.property.itemIncreaseSetting){
-            for(let i of projectObj.project.property.itemIncreaseSetting){
+            for(let i of projectObj.project.property.itemIncreaseSetting.setting){
                 let d = {name:i.name,displayScope:"范围",scope:i.scope,base:i.base,coe:i.coe};
-                if(_.isEmpty(d.scope)){
-                    d.foreColor = "#ff2a23";
-                    d.styleCol = 1;
-                }
                 datas.push(d);
             }
         }
@@ -79,6 +181,285 @@ let itemIncreaseFeeObj = {
         }
         tem[dataCode] = value;
         me.showDatas(me.settingDatas);
+        me.itemChange = true;
+    },
+    confirmScope:function(){
+        let selectedItem = this.getSelectedItem();
+        let scope = {};
+        for(let n of this.scopeDatas){
+            if(n.selected == 1) scope[n.ID] = true;
+        }
+        if(JSON.stringify(scope) != JSON.stringify(selectedItem.scope)) this.itemChange = true;//有改变的情况下才更新
+        selectedItem.scope=scope;
+        this.showDatas(this.settingDatas);
+    },
+    confirmItemIncreaseSetting:async function () {
+        if(this.itemChange == true || projectObj.project.property.itemIncreaseSetting.isCalc == false){
+            let datas = [];
+            let itemIncreaseSetting = {
+                isCalc : true,
+                setting :[]
+            };
+            for(let d of this.settingDatas){
+                itemIncreaseSetting.setting.push({name:d.name,scope:d.scope,base:d.base,coe:d.coe});
+            }
+            let tem ={
+                type:'project',
+                data:{ID:projectObj.project.ID(),"property.itemIncreaseSetting":itemIncreaseSetting}
+            };
+            datas.push(tem);
+            let changeNodes = this.calcAllItemIncreaseFee(itemIncreaseSetting,datas);
+            console.log(datas);
+            let selectedNode = projectObj.project.mainTree.selected;
+            //刷新缓存和树节点的插入删除
+            let nodes = await projectObj.project.syncUpdateNodesAndRefresh(datas);
+            //重新计算
+            cbTools.refreshFormulaNodes();
+            projectObj.project.calcProgram.calcNodesAndSave(changeNodes.concat(nodes));
+            projectObj.mainController.setTreeSelection(selectedNode);
+
+        }
+    },
+
+
+    calcItemIncreaseFeeByNodes:async function (nodes) {
+        let itemIncreaseSetting = projectObj.project.property.itemIncreaseSetting;
+        let datas = [];
+        let refreshNodes=[];
+        let rationGLJMap ={};
+        let uniqMap={};
+        if(!itemIncreaseSetting) return;
+        if(itemIncreaseSetting.isCalc == false) return;
+        for (n of nodes){
+            if(n.sourceType == ModuleNames.ration) n = n.parent;
+            if(uniqMap[n.data.ID]) continue;//去重复
+            let newRefreshNodes = this.calcItemIncreasePerNode(n,itemIncreaseSetting,rationGLJMap,datas);
+            if(newRefreshNodes.length > 0) refreshNodes = refreshNodes.concat(newRefreshNodes);
+            uniqMap[n.data.ID] = true;
+        }
+        if(datas.length >0 || refreshNodes.length > 0){
+            let nodes = await projectObj.project.syncUpdateNodesAndRefresh(datas);
+            //重新计算
+            cbTools.refreshFormulaNodes();
+            projectObj.project.calcProgram.calcNodesAndSave(refreshNodes.concat(nodes));
+
+        }
+
+    },
+    cancelItemIncreaseFee:async function () {
+        let itemIncreaseSetting = projectObj.project.property.itemIncreaseSetting;
+        let datas = [];
+        let refreshNodes = [];
+        if(itemIncreaseSetting && itemIncreaseSetting.isCalc == true){
+            itemIncreaseSetting.isCalc = false;
+            let billNodeMap = {};
+            let tem ={
+                type:'project',
+                data:{ID:projectObj.project.ID(),"property.itemIncreaseSetting":itemIncreaseSetting}
+            };
+            datas.push(tem);
+            for(let s of itemIncreaseSetting.setting){
+                if(!_.isEmpty(s.scope)){
+                    for (let ID in s.scope){
+                        billNodeMap[ID] = true;//为了去重复
+                    }
+                }
+            }
+            for(let cancelID in billNodeMap){
+                let tnode = projectObj.project.mainTree.getNodeByID(cancelID);
+                if(tnode){
+                    let cNode = this.cancelBillNode(tnode,datas);
+                    if(cNode) refreshNodes.push(cNode);
+                }
+            }
+            let selectedNode = projectObj.project.mainTree.selected;
+            //刷新缓存和树节点的插入删除
+            await projectObj.project.syncUpdateNodesAndRefresh(datas);
+            if(refreshNodes.length > 0){
+                //重新计算
+                cbTools.refreshFormulaNodes();
+                projectObj.project.calcProgram.calcNodesAndSave(refreshNodes);
+                projectObj.mainController.setTreeSelection(selectedNode);
+            }
+        }
+    },
+    getAllBillsIDMap:function () {
+        let map = {};
+        let itemIncreaseSetting = projectObj.project.property.itemIncreaseSetting;
+        if(itemIncreaseSetting.isCalc == true){
+            for(let s of itemIncreaseSetting.setting){
+                if(!_.isEmpty(s.scope)){
+                    for (let ID in s.scope){
+                        map[ID] = true;
+                    }
+                }
+            }
+        }
+        return map;
+    },
+
+    calcAllItemIncreaseFee : function(setting,datas){
+        let refreshNodes = [];
+        let itemIncreaseSetting = setting?setting:projectObj.project.property.itemIncreaseSetting;
+        let billNodeMap = {},rationGLJMap={};
+        let cancelBillsIDMap = this.getAllBillsIDMap();
+        if(itemIncreaseSetting && itemIncreaseSetting.isCalc == true){
+            //为了不用循环所有节点,先挑出所有受影响的节点
+            for(let s of itemIncreaseSetting.setting){
+                if(!_.isEmpty(s.scope)){
+                    for (let ID in s.scope){
+                        billNodeMap[ID] = true;//为了去重复
+                        delete cancelBillsIDMap[ID];
+                    }
+                }
+            }
+            for(let billsID in billNodeMap){
+                let node = projectObj.project.mainTree.getNodeByID(billsID);
+                let newRefreshNodes = this.calcItemIncreasePerNode(node,itemIncreaseSetting,rationGLJMap,datas);
+                if(newRefreshNodes.length > 0) refreshNodes = refreshNodes.concat(newRefreshNodes);
+            }
+            //删除取消范围的清单下的子目定额
+            for(let cancelID in cancelBillsIDMap){
+                let tnode = projectObj.project.mainTree.getNodeByID(cancelID);
+                let cNode = this.cancelBillNode(tnode,datas);
+                if(cNode) refreshNodes.push(cNode);
+            }
+        }
+        return refreshNodes;
+    },
+    cancelBillNode:function (node,datas) {
+        if (node.children.length <= 0) return null;//如果没子项,不用计算
+        if (node.source.children.length > 0) return null;//如果不是清单叶子节点,不用计算
+        let isDelete = false;
+        for(let rationNode of node.children){
+            if(rationNode.data.code.indexOf("ZMZJF")!= -1){
+                datas.push({type:ModuleNames.ration,data:{ID:rationNode.data.ID},action:"delete"});
+                isDelete = true;
+            }
+        }
+        return isDelete == true?node:null;
+    },
+
+
+    calcItemIncreasePerNode:function (node,setting,rationGLJMap,datas) {
+        let itemIncreaseSetting = setting ? setting : projectObj.project.property.itemIncreaseSetting;
+        let refreshNodes = [],rationCodeMap={},FeeMap={},updateDataIDMap={};
+        if (node.children.length <= 0) return [];//如果没子项,不用计算
+        if (node.source.children.length > 0) return [];//如果不是清单叶子节点,不用计算
+        let labourTotal = 0,materialTotal=0,machineTotal=0;
+        let process = getDecimal("process");
+        let td = getDecimal("ration.totalPrice");
+        let gd = getDecimal('glj.quantity');
+        let preID="",serialNo=1;
+        for(let rationNode of node.children){
+            rationCodeMap[rationNode.data.code] = rationNode;
+            if(rationNode.data.type == rationType.ration || rationNode.data.type == rationType.volumePrice ){//先只汇总定额和量价类型,不考虑自动生成的
+                //计算人工费,材料费,机械费
+                if(rationNode.data.feesIndex){
+                    let labour = rationNode.data.feesIndex.labour && rationNode.data.feesIndex.labour.totalFee?parseFloat(rationNode.data.feesIndex.labour.totalFee):0;
+                    let material = rationNode.data.feesIndex.material && rationNode.data.feesIndex.material.totalFee?parseFloat(rationNode.data.feesIndex.material.totalFee):0;
+                    let machine = rationNode.data.feesIndex.machine && rationNode.data.feesIndex.machine.totalFee?parseFloat(rationNode.data.feesIndex.machine.totalFee):0;
+                    labourTotal = scMathUtil.roundForObj(labourTotal + labour,getDecimal("process"));
+                    materialTotal = scMathUtil.roundForObj(materialTotal + material,getDecimal("process"));
+                    machineTotal = scMathUtil.roundForObj(machineTotal + machine,getDecimal("process"));
+                }
+            }
+            if(rationNode.data.type != rationType.itemIncrease ){//计录除了子目增加节点外最后的节点ID,和nexeID
+                preID = rationNode.data.ID;
+                serialNo = rationNode.data.serialNo;
+            }
+        }
+        FeeMap['人工费'] = labourTotal;
+        FeeMap['材料费'] = materialTotal;
+        FeeMap['机械费'] = machineTotal;
+        //ZMZJF_1
+        let s_in = 0;//序列号增长
+        for(let i = 0; i < itemIncreaseSetting.setting.length;i++){
+            let s = itemIncreaseSetting.setting[i];
+            if(s.scope&&s.scope[node.data.ID]){
+                let feeIndexArry = s.base.split("+");
+                let total = 0;
+                for(let index of feeIndexArry){
+                    total = scMathUtil.roundForObj(total + FeeMap[index],process);
+                }
+                total = scMathUtil.roundForObj(total,td);
+                if(s.coe){
+                    let t = scMathUtil.roundForObj(total * s.coe/100,process);
+                    total =  t;//scMathUtil.roundForObj(total + t,gd);
+                }
+                let seq = i+1;
+                let code = "ZMZJF_"+seq;
+                let ZMZJFnode = rationCodeMap[code];
+                if(total > 0) {
+                    if(ZMZJFnode){//存在的话更新其它人工费消耗量
+                        this.updateItemNode(ZMZJFnode,total,rationGLJMap,datas);
+                        if(s_in>0){
+                            datas.push({type:ModuleNames.ration,data:{ID:ZMZJFnode.data.ID,serialNo:ZMZJFnode.data.serialNo +1}});
+                        } else {//如果s_in>0时,ZMZJFnode会因为有更新而刷新,不用push到refreshNodes里
+                            refreshNodes.push(ZMZJFnode);
+                        }
+                        preID = ZMZJFnode.data.ID;
+                        serialNo = ZMZJFnode.data.serialNo;
+                    }else {//不存在的话插入新的节点
+                        s_in = s_in +1;
+                        serialNo = serialNo+1;
+                        let newRationData = this.inserNewItemNodes(node.data.ID,node.data.quantity,preID,serialNo,code,s.name,total,datas);
+                        preID = newRationData.ID;
+                    }
+                }else { //如果total小于0,但又存在的话,删除定额(同时后端处理时记得要删除定额工料机)
+                    if(ZMZJFnode){
+                        datas.push({type:ModuleNames.ration,data:{ID:ZMZJFnode.data.ID},action:"delete"});
+                        if(refreshNodes.length == 0) refreshNodes.push(node);//删除时,如果清单下没有定额更新,则刷新清单节点就行
+                    }
+                }
+            }
+        }
+        return refreshNodes;
+    },
+    updateItemNode:function (node,total,rationGLJMap,datas) {
+        if(_.isEmpty(rationGLJMap)) this.setRationGLJMap(rationGLJMap);
+        if(rationGLJMap[node.data.ID] && rationGLJMap[node.data.ID].quantity != total){
+            datas.push({type:ModuleNames.ration_glj,data:{ID:rationGLJMap[node.data.ID].ID,quantity:total}})
+        }
+    },
+    setRationGLJMap:function (rationGLJMap) {
+        let gljList =  projectObj.project.ration_glj.datas;
+        for (let g of gljList){
+            if(g.code == 'QTRGF') rationGLJMap[g.rationID] = g;
+        }
+    },
+    inserNewItemNodes:function (billsItemID,billsQuantity,preID,serialNo,code,name,total,datas) {
+        let Ration = projectObj.project.Ration;
+        let newRationData = Ration.getTempRationData(Ration.getNewRationID(), billsItemID, serialNo, rationType.itemIncrease);
+        newRationData.code = code;
+        newRationData.name=name;
+        newRationData.unit = '元';
+        newRationData.quantity = "1";
+        if(billsQuantity) newRationData.contain = scMathUtil.roundForObj(1/parseFloat(billsQuantity),getDecimal("process"))+"";
+        newRationData.quantityEXP = '1';
+        datas.push({type:ModuleNames.ration,data:newRationData,preSiblingID:preID,action:"add",parentID:billsItemID});
+        let newRationGLJ = {
+            rationID:newRationData.ID,
+            billsItemID:billsItemID,
+            shortName:projectObj.project.projectGLJ.getShortNameByID(gljType.LABOUR),
+            GLJID:-1,
+            projectID:newRationData.projectID,
+            code:'QTRGF',
+            original_code:'QTRGF',
+            name:'其它人工费',
+            specs:'',
+            unit:'元',
+            type:gljType.LABOUR,
+            basePrice:1,
+            marketPrice:1,
+            adjCoe:null,
+            from:'std',
+            repositoryId:-1,
+            quantity:total+"",
+            rationItemQuantity:total+""
+        };
+        datas.push({type:ModuleNames.ration_glj,data:newRationGLJ,action:"add"});
+        return newRationData;
     }
 };
 
@@ -88,12 +469,24 @@ let itemIncreaseFeeObj = {
 
 
 $(function () {
-   /* $("#areaIncreaseFeeConfirm").on("click",async function(e){
-        areaIncreaseFeeObj.confirmAreaIncreaseFeeSetting();
-    });*/
+
 
     $('#itemIncreaseFeeDiv').on('shown.bs.modal', function (e) {
+        itemIncreaseFeeObj.itemChange = false;
         itemIncreaseFeeObj.initSpread();
         itemIncreaseFeeObj.showDatas();
     });
+
+    $('#item_increase_scope').on('shown.bs.modal', function (e) {
+        itemIncreaseFeeObj.initScopeSpread();
+        itemIncreaseFeeObj.showScopeDatas();
+    });
+    
+    $("#select_scope_confirm").click(function () {
+        itemIncreaseFeeObj.confirmScope();
+    })
+
+    $("#itemIncreaseFeeConfirm").click(function () {
+        itemIncreaseFeeObj.confirmItemIncreaseSetting();
+    })
 });

+ 7 - 2
web/building_saas/main/js/views/main_tree_col.js

@@ -418,9 +418,14 @@ let MainTreeCol = {
         mainBills:function (node) {
             if(MainTreeCol.mainBillsEnable(node)) return sheetCommonObj.getCheckBox(true);
         },
-        mainNodeCheckBox:function (node) {//分部分项、措施项目下的清单、定额
+        mainNodeCheckBox:function (node,setting,field) {//分部分项、措施项目下的清单、定额
             let Bills = projectObj.project.Bills;
-            if((Bills.isFBFX(node)||Bills.isMeasure(node)) && node.sourceType != ModuleNames.ration_glj) return sheetCommonObj.getCheckBox(false);
+            if((Bills.isFBFX(node)||Bills.isMeasure(node)) && node.sourceType != ModuleNames.ration_glj){
+                //有基数计算时面积增加费不可勾选
+                if(field == 'areaIncreaseFee' && node.data.calcBase && node.data.calcBase!="") return;
+                return sheetCommonObj.getCheckBox(false);
+            }
+
         },
         outPutMaxPrice:function (node) {
             if(MainTreeCol.mainBillsEnable(node)) {

+ 11 - 11
web/building_saas/main/js/views/mbzm_view.js

@@ -186,7 +186,7 @@ let mbzm_obj={
             if(result.rationResult){
                 for(let rr of result.rationResult){
                     nodeDatas.ration.add.push(rr.ration);//定额datas数据的push在addNodes里面做
-                    projectObj.project.Ration.addSubListOfRation(rr);//添加定额子项缓存
+                    projectObj.project.Ration.addSubListOfRation(rr,false);//添加定额子项缓存
                 }
             }
             //对于新插入的清单:
@@ -203,17 +203,17 @@ let mbzm_obj={
                 }
                 projectObj.mainController.refreshTreeNode(refreshNodes, false);
             }
-            projectObj.project.projectGLJ.loadData(function () {
-                $.bootstrapLoading.end();
-                cbTools.refreshFormulaNodes();
-                //更新计算程序模板,并进行重新计算
-                if(parentsNodes.length > 0) calRations = calRations.concat(parentsNodes);//计算被删除的子目关联定额的父节点
-                projectObj.project.calcProgram.calcNodesAndSave(calRations,function () {
-                    installationFeeObj.calcInstallationFee();
-                    OVER_HEIGHT.reCalcOverHeightFee();
-                });
-                mbzm_obj.showApplySuccess();
+            projectObj.project.projectGLJ.calcQuantity();
+            $.bootstrapLoading.end();
+            cbTools.refreshFormulaNodes();
+            //更新计算程序模板,并进行重新计算
+            if(parentsNodes.length > 0) calRations = calRations.concat(parentsNodes);//计算被删除的子目关联定额的父节点
+            projectObj.project.calcProgram.calcNodesAndSave(calRations,async function () {
+                installationFeeObj.calcInstallationFee();
+                await OVER_HEIGHT.reCalcOverHeightFee();
+                await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(calRations);
             });
+            mbzm_obj.showApplySuccess();
         })
     },
     showApplySuccess:function () {

+ 5 - 3
web/building_saas/main/js/views/project_glj_view.js

@@ -75,12 +75,13 @@ let projectGljObject={
     },
     initProjectGljSheet:function () {
         this.projectGljSheet = this.projectGljSpread .getSheet(0);
-
         this.initSheet(this.projectGljSheet,this.projectGljSetting);
         this.projectGljSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onProjectGljSelectionChange);
         this.projectGljSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onProjectGljEditStarting);
         this.projectGljSheet.name('projectGljSheet');
         //this.projectGljSheet.setRowHeight(0, 36, 1);
+        this.projectGljSheet.options.frozenlineColor = '#ababab';
+        this.projectGljSheet.frozenColumnCount(this.projectGljSetting.frozenCols);
     },
     initMixRatio:function () {
         let me = projectGljObject;
@@ -864,10 +865,11 @@ let projectGljObject={
             updateNodes = updateNodes.concat(subRations);
         }
         if(updateNodes.length>0){
-            projectObj.project.calcProgram.calcNodesAndSave(updateNodes,function () {
+            projectObj.project.calcProgram.calcNodesAndSave(updateNodes,async function () {
                 projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots);
                 installationFeeObj.calcInstallationFee();//计算安装增加费
-                OVER_HEIGHT.reCalcOverHeightFee();
+               await OVER_HEIGHT.reCalcOverHeightFee();
+                await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(updateNodes);
             });
         }
         gljOprObj.refreshView();

+ 11 - 4
web/building_saas/main/js/views/project_view.js

@@ -893,6 +893,7 @@ var projectObj = {
             this.mainSpread.getActiveSheet().selectionPolicy(GC.Spread.Sheets.SelectionPolicy.muliRange);
             this.mainSpread.getActiveSheet().name('mainSheet');
             this.mainSpread.getActiveSheet().options.isProtected = true;
+            this.mainSpread.getActiveSheet().options.frozenlineColor = '#ababab';
         }
     },
     refreshMainSpread: function () {
@@ -1024,6 +1025,14 @@ var projectObj = {
                 if(projectReadOnly){
                     disableSpread(that.mainSpread);
                 }
+
+                // 检查旧项目是否有调价数据,没有则自动生成
+                let node = projectObj.project.mainTree.firstNode();
+                if (node.data.feesIndex && node.data.feesIndex.common && node.data.feesIndex.common.totalFee
+                    && node.data.feesIndex.common.totalFee != 0){
+                    if (node.data.feesIndex.common.tenderTotalFee == undefined || node.data.feesIndex.common.tenderTotalFee == 0)
+                        projectObj.project.calcProgram.doTenderCalc();
+                };
                 $.bootstrapLoading.end();
             }
             else {
@@ -1556,9 +1565,7 @@ var projectObj = {
                             name:"取消子目增加费",
                             icon: 'fa-sign-in',
                             callback:function(){
-                                /*colSettingObj.setVisible('areaIncreaseFee', false);
-                                colSettingObj.updateColSetting(true);
-                                areaIncreaseFeeObj.cancelAreaIncreaseFee();*/
+                                itemIncreaseFeeObj.cancelItemIncreaseFee();
                             }
                         }
                     }
@@ -3413,7 +3420,7 @@ function disableTools(){
     $('#gljPriceTenderCoe').prop('disabled', 'disabled');
     $('#tenderGLJQuantity').prop('disabled', 'disabled');
     $('#tenderRationQuantity').prop('disabled', 'disabled');
-    $('#tenderPrice').prop('disabled', 'disabled');
+    // $('#tenderPrice').prop('disabled', 'disabled');
     $('#cleanTender').prop('disabled', 'disabled');
 }
 //项目只读,表格只读

+ 4 - 0
web/building_saas/main/js/views/sub_view.js

@@ -785,6 +785,10 @@ $('#linkGLJ').on('shown.bs.tab', function () {
 
 $('#linkQDJL').on('shown.bs.tab', function () {
     subObj.showQDSubTabData();
+    if(!subObj.inited) {
+        $("#tz_toogle").click();
+        subObj.inited = true;
+    }
 });
 
 $('#linkZMHS').on('shown.bs.tab', function (e) {

+ 24 - 54
web/building_saas/main/js/views/tender_price_view.js

@@ -272,7 +272,7 @@ let tender_obj={
             let tem_updateData = {type:node.sourceType,data:{}};
             if(option == 'coeBase') {                           // 正向:当值为“根据调整系数计算报价”时,清空目标报价。
                 me.cleanTargetPrice(tem_updateData,node);
-            }else if(option == 'priceBase'){                    // 反向:当值为“根据报价计算调整系数”时,清空调整系数。
+            }else if(option == 'priceBase_RCJ' || option == 'priceBase_ZM'){                    // 反向:当值为“根据报价计算调整系数”时,清空调整系数。
                 me.cleanTenderCoe(tem_updateData,node);
             }
             if(!_.isEmpty(tem_updateData.data)){//如果需要更新
@@ -384,7 +384,7 @@ let tender_obj={
             }
         }
         if(dataCode.indexOf('Coe') != -1){//如果是调整系数列
-            if($('#calcPriceOption').val() =='priceBase'){//下拉按钮显示为“根据报价计算调整系数”时,只读。
+            if($('#calcPriceOption').val() =='priceBase_RCJ' || $('#calcPriceOption').val() =='priceBase_ZM'){//下拉按钮显示为“根据报价计算调整系数”时,只读。
                 return false;
             }else if(me.tenderTree.items[row].data.is_adjust_price === 1){//打勾了不调价,只读。
                 return false;
@@ -392,11 +392,11 @@ let tender_obj={
         }
         return true;
     },
-    initPageContent : function () {
+    initPageContent: function () {
         let tenderSetting = projectObj.project.property.tenderSetting;
-        let calcPriceOption = tenderSetting && tenderSetting.calcPriceOption? tenderSetting.calcPriceOption :"coeBase";
         let gljPriceTenderCoe = tenderSetting && tenderSetting.gljPriceTenderCoe?tenderSetting.gljPriceTenderCoe:1;
         let showTenderFields = tenderSetting && tenderSetting.showTenderFields?tenderSetting.showTenderFields:false;
+        let calcPriceOption = calcTools.getTenderCalcType();
         $('#calcPriceOption').val(calcPriceOption);
         $('#gljPriceTenderCoe').val(gljPriceTenderCoe);
         if(calcPriceOption == 'coeBase'){
@@ -410,49 +410,9 @@ let tender_obj={
             $('#gljPriceTenderCoe').attr("disabled",true);
             $('#tenderGLJQuantity').removeAttr("disabled");
             $('#tenderRationQuantity').removeAttr("disabled");
-            $('#tenderPrice').attr("disabled",true);
+            // $('#tenderPrice').attr("disabled",true);
         };
         $('#cbShowTenderFields').prop("checked", showTenderFields);
-    },
-    doTenderCalc: function(tender){
-        function initReverseTenderDatas (){
-            for(let node of tender_obj.tenderTree.items){
-                if (node.data.rationQuantityCoe) node.data.rationQuantityCoe = null;
-                let qcObj = node.data.quantityCoe;
-                if (qcObj){
-                    for (let pn in qcObj){
-                        qcObj[pn] = null;
-                    };
-                };
-                projectObj.project.calcProgram.clearTenderCache(node);
-            };
-            // 反向调价时人材机单价调整系数要归1:因为既可以调量又可以调价,以哪个为基准进行反调?过于复杂,仅以通用的调量逻辑为基准即可满足需求。
-            if (projectObj.project.property.tenderSetting && projectObj.project.property.tenderSetting.gljPriceTenderCoe
-                && (projectObj.project.property.tenderSetting.gljPriceTenderCoe != 1)){
-                projectObj.project.property.tenderSetting.gljPriceTenderCoe = 1;    // 修改缓存值,用于计算
-                projectObj.project.property.needRestoreGgljPriceTenderCoe = true;   // 标记:需保存入库
-            }
-
-        };
-
-        if (tender != tenderTypes.ttCalc) initReverseTenderDatas();
-        let callback = function () {
-            projectObj.project.saveProperty('hasTender', true);
-            if (projectObj.project.property.needRestoreGgljPriceTenderCoe){         // 入库存储,清理标记,刷新UI显示
-                projectObj.project.saveProperty('tenderSetting.gljPriceTenderCoe', 1);
-                delete projectObj.project.property.needRestoreGgljPriceTenderCoe;
-                $('#gljPriceTenderCoe').val(1);
-            }
-
-            tender_obj.showTenderData();
-            projectObj.project.projectGLJ.calcQuantity();
-            // projectGljObject.refreshViewsData();
-        };
-        if (tender == tenderTypes.ttReverseGLJ || tender == tenderTypes.ttReverseRation){
-            projectObj.project.calcProgram.prepareForDistribute(tender_obj.tenderTree.roots[0]);
-            projectObj.project.calcProgram.distributeTargetTotalFee(tender_obj.tenderTree.roots[0]);
-        };
-        projectObj.project.calcProgram.calcAllNodesAndSave(calcAllType.catAll, callback, tender);
     }
 };
 
@@ -488,7 +448,7 @@ $(function () {
             }
         }
         datas.push({type:ModuleNames.project,data:{'ID' : projectObj.project.ID(),'property.tenderSetting.gljPriceTenderCoe':1}});//恢复人材机单价调整系数为1。
-        datas.push({type:ModuleNames.project,data:{'ID' : projectObj.project.ID(),'property.hasTender': false}});
+        // datas.push({type:ModuleNames.project,data:{'ID' : projectObj.project.ID(),'property.hasTender': false}});
         me.updateTenderData(datas,function () {
             me.refreshTenderTreeByDatas(datas);
         });
@@ -517,16 +477,26 @@ $(function () {
     });
 
     $('#tenderPrice').on('click', function () {
-        tender_obj.doTenderCalc(tenderTypes.ttCalc);
-    });
-
-    $('#tenderGLJQuantity').on('click', function () {
-        tender_obj.doTenderCalc(tenderTypes.ttReverseGLJ);
+        let callback = function () {
+            // projectObj.project.saveProperty('hasTender', true);  // 一定调价,这个属性已失去意义
+            if (projectObj.project.property.needRestoreGgljPriceTenderCoe){         // 入库存储,清理标记,刷新UI显示
+                projectObj.project.saveProperty('tenderSetting.gljPriceTenderCoe', 1);
+                delete projectObj.project.property.needRestoreGgljPriceTenderCoe;
+                $('#gljPriceTenderCoe').val(1);
+            }
+            tender_obj.showTenderData();
+            projectObj.project.projectGLJ.calcQuantity();
+        };
+        projectObj.project.calcProgram.doTenderCalc(callback);
     });
 
-    $('#tenderRationQuantity').on('click', function () {
-        tender_obj.doTenderCalc(tenderTypes.ttReverseRation);
-    });
+    // $('#tenderGLJQuantity').on('click', function () {
+    //     tender_obj.doTenderCalc(tenderTypes.ttReverseGLJ);
+    // });
+    //
+    // $('#tenderRationQuantity').on('click', function () {
+    //     tender_obj.doTenderCalc(tenderTypes.ttReverseRation);
+    // });
 
     $('#cbShowTenderFields').on('click', function () {
         let showFields = $('#cbShowTenderFields').prop("checked");

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

@@ -241,7 +241,7 @@ let zlfb_object={
         updateData.projectID = FBFX.data.projectID;
         updateData.user_id = userID;
         $.bootstrapLoading.start();
-        CommonAjax.post('/bills/reorganizeFBFX',updateData,function (data) {
+        CommonAjax.post('/bills/reorganizeFBFX',updateData,async function (data) {
             $.bootstrapLoading.end();
             //更新前端缓存
             let billDatas = projectObj.project.Bills.datas;
@@ -291,7 +291,7 @@ let zlfb_object={
                 projectObj.project.Bills.getEngineeringCostNode(controller).changed = true;
                 projectObj.project.calcProgram.calcAllNodesAndSave();
             });
-            OVER_HEIGHT.reCalcOverHeightFee();
+            await OVER_HEIGHT.reCalcOverHeightFee();
         },function () {
             //errorCallback
         });

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

@@ -224,8 +224,8 @@ let zmhs_obj = {
 
         let rationID = result.ration.ID;
         ration_glj.updateCacheAfterAdjust(result.ration_glj);
-        if(result.projectGLJDatas){//有添加、替换、工料机等需重新加载的情况
-            projectObj.project.projectGLJ.refreshByDatas(result.projectGLJDatas);
+        if(result.projectGLJList && result.projectGLJList.length > 0){//有添加、替换、工料机等需重新加载的情况
+            projectObj.project.projectGLJ.loadNewProjectGLJToCaches(result.projectGLJList,true);
             if(result.add && result.add.length > 0) ration_glj.addToMainTree(result.add);//这个方法有再去项目工料机那里取价格,所以要在回调里调用,不像替换工料的情况
             ration_glj.reCalcWhenGLJChange({rationID:rationID});
             if(result.delete && result.delete.length > 0 && calcInstall) installationFeeObj.calcInstallationFee();//如果是删除节点的话,

+ 27 - 4
web/building_saas/pm/html/project-management.html

@@ -22,6 +22,8 @@
         var userAccount = '<%- userAccount %>';
         var userID = '<%- userID %>';
         let isFirst = JSON.parse('<%- isFirst %>');
+        let isShow = JSON.parse('<%- isShow %>');
+
     </script>
     <style type="text/css">
         .hidden-area{
@@ -280,7 +282,7 @@
                     <span class="form-text text-danger" id="taxType-info" style="display: none;">请选择计税方法</span>
                 </form>
                 <form id="projInfoStep" class="hidden-area"></form>
-                <p id="project-required-warn" class="text-muted hidden-area"><i class="fa fa-warning text-warning"></i> 注:为响应重庆地区指标采集标准数据要求,以上工程信息及特征必填项为必填项,请正确填写。</p>
+                <p id="project-required-warn" class="text-muted hidden-area"><i class="fa fa-warning text-warning"></i> 注:为响应重庆地区指标采集标准数据要求,以上工程信息及特征为必填项,请正确填写。</p>
             </div>
             <div class="modal-footer">
                 <a href="javascript:void(0);" class="btn btn-primary hidden-area" id="add-proj-prev">上一步</a>
@@ -486,7 +488,7 @@
                 </form>
                 <form id="infoStep" style="display: none"></form>
                 <form id="featureStep" style="display: none"></form>
-                <p id="tender-required-warn" class="text-muted hidden-area"><i class="fa fa-warning text-warning"></i> 注:为响应重庆地区指标采集标准数据要求,以上工程信息及特征必填项为必填项,请正确填写。</p>
+                <p id="tender-required-warn" class="text-muted hidden-area"><i class="fa fa-warning text-warning"></i> 注:为响应重庆地区指标采集标准数据要求,以上工程信息及特征为必填项,请正确填写。</p>
             </div>
             <div class="modal-footer">
                 <a href="javascript:void(0);" class="btn btn-primary" id="add-tender-prev" style="display: none">上一步</a>
@@ -667,7 +669,7 @@
                                 <select class="form-control" id="otherFileOptions">
                                     <option>10.9建筑例题内测单价文件</option><!--建设项目下单价文件-->
                                 </select>
-                                <span class="form-text text-muted">您选择的文件将复制一份至当前项目,不会影响原建设项目的文件。</span>
+                                <span class="form-text text-muted">您选择的文件将复制一份至当前项目,不会影响原建设项目的文件。</span>
                             </div>
                         </div>
 
@@ -822,7 +824,7 @@
                         <label for="staticEmail" class="col-auto col-form-label col-form-label-sm">选择文件</label>
                         <div class="col">
                             <div class="custom-file custom-file-sm">
-                                <input type="file" class="custom-file-input" id="customFile" accept=".xml,.qtf,.QTF" lang="zh">
+                                <input type="file" class="custom-file-input" id="customFile" accept=".xml,.qtf" lang="zh">
                                 <label class="custom-file-label" for="customFile" style="white-space: nowrap; overflow: hidden;">请选择导入文件</label>
                             </div>
                             <div class="alert alert-success mt-3" id="uploadAlert" role="alert" style="display: none;"></div>
@@ -964,6 +966,24 @@
     </div>
 </div>
 
+<!--弹出信息-->
+<div class="modal fade" id="welcomePage" data-backdrop="static">
+    <div class="modal-dialog modal-lg" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">欢迎使用大司空云计价</h5>
+                <button type="button" class="close text-danger" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body" id="welcomeBody">
+                <div style="max-height:465px">
+                    <%- context %>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
 
 <!-- JS. -->
 <script src = "/lib/spreadjs/sheets/gc.spread.sheets.all.11.1.2.min.js"></script>
@@ -971,6 +991,7 @@
 <script src="/lib/qiniu/qiniu.min.js"></script>
 <script>GC.Spread.Sheets.LicenseKey = '<%- LicenseKey %>';</script>
 <script src="/lib/x2js/xml2json.min.js"></script>
+<script src="/lib/js-zip/jszip.min.js"></script>
 <script type="text/javascript" src="/lib/jquery-ui/jquery-ui-datepickerCN.js"></script>
 <script type="text/javascript">
     let billValuation = JSON.parse('<%- billValuation %>');
@@ -995,6 +1016,8 @@
 <script src="/web/building_saas/glj/js/socket.io.slim.js"></script>
 <script src="/public/web/socket/connection.js"></script>
 <script src="/public/billsUtil.js"></script>
+<script src="/public/common_constants.js"></script>
+<script src="/web/building_saas/main/js/models/importStdInterfaceBase.js"></script>
 <script src="/web/building_saas/main/js/models/importStandardInterface.js"></script>
 <script src="/web/building_saas/pm/js/pm_ajax.js"></script>
 <script src="/web/building_saas/pm/js/pm_newMain.js"></script>

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

@@ -9,7 +9,6 @@
  */
 //操作接口为eventListen
 const importView = (() => {
-    let importXML = null;
     let xmlObj = null;  //导入xml转化后的对象
     let tbcObj = null;  //待确认对象
     //显示、隐藏提示上传文件窗口相关提示信息
@@ -286,18 +285,20 @@ const importView = (() => {
             $('.selFile').hide();
             hideTBCInfo();
             if (file) {
-                let reg = /(xml|XML|qtf|QTF)$/;
+                const reg = importXMLBase.getAcceptReg(importXML.accept);
                 if (file.name && !reg.test(file.name)) {
                     $('.selFile').hide();
-                    showUploadAlert(false, '请选择xml或qtf文件。');
+                    const acceptAlert = importXML.accept.join('、');
+                    showUploadAlert(false, `请选择${acceptAlert}文件。`);
                     return;
                 }
                 $.bootstrapLoading.start();
                 $('#loadingPage').css('z-index', '2000');
-                //转换数据
-                importXML = new ImportXML();
                 try {
+                    //转换数据
                     xmlObj = await importXML.extractData(file, false);
+                    console.log(xmlObj);
+                    debugger;
                     $('.selFile input:eq(0)').val(xmlObj && xmlObj.name ? xmlObj.name : '');
                     $('.selFile input[name="fileKind-import"]:eq(0)').prop('checked', true);    //文件类型恢复成投标
                     $('#import-taxType').val('1');  //计税方法显示回默认的一般计税法
@@ -312,6 +313,7 @@ const importView = (() => {
         });
         //下一步
         $('#import-next').click(function () {
+            debugger;
             let file = $('#customFile')[0].files[0];
             if (!file) {
                 showUploadAlert(false, '请选择导入文件。');
@@ -447,6 +449,8 @@ const importView = (() => {
                 $('#importInterface').modal('hide');
                 pr.start('导入文件', '正在生成文件,请稍候……');
                 let importData = await importXML.transformData(xmlObj);
+                debugger;
+                console.log(importData);
                 let blob = new Blob([JSON.stringify(importData)], { type: 'text/plain;charset=utf-8' });
                 // 转换成File实例
                 const key = `${uuid.v1()}.json`;
@@ -474,12 +478,13 @@ const importView = (() => {
         });
         // 导入窗口激活
         $('#importInterface').on('show.bs.modal', function () {
+            // 设置上传文件输入框accept属性
+            $('#customFile').attr('accept', importXML.accept.join(','));
             // 恢复计价规则下拉
             setValuationSels($('#import-valuation'), billValuation);
         });
         //导入窗口消失后
         $('#importInterface').on('hidden.bs.modal', function () {
-            importXML = null;
             xmlObj = null;  //重置数据
             tbcObj = null;
             $('#importInterface .modal-content:eq(0)').show();  //显示第一步内容

+ 51 - 23
web/building_saas/pm/js/pm_newMain.js

@@ -386,7 +386,7 @@ const projTreeObj = {
             name: '导入招投标接口文件',
             icon: 'fa-cloud-upload',
             visible: function () {
-               return compilationData && compilationData.name === '重庆定额(2018)';
+                return compilationData && compilationData.name === '重庆定额(2018)';
             },
             callback: function () {
                 $('#importInterface').modal('show');
@@ -1690,7 +1690,7 @@ const projTreeObj = {
 // 新建项目必填项提示框设置“ 比如:注:为响应重庆地区指标采集标准数据要求,以上工程信息及特征必填项为必填项,请正确填写。”
 function setupRequiredWarn(compilation) {
     let map = {
-            '重庆定额(2018)': '<i class="fa fa-warning text-warning"></i> 注:为响应重庆地区指标采集标准数据要求,以上工程信息及特征必填项为必填项,请正确填写。'
+            '重庆定额(2018)': '<i class="fa fa-warning text-warning"></i> 注:为响应重庆地区指标采集标准数据要求,以上工程信息及特征为必填项,请正确填写。'
         },
         $warns = [
             $('#project-required-warn'),
@@ -2944,6 +2944,7 @@ function initProjects(callback) {
             projTreeObj.tree.selected = projTreeObj.tree.items[0];
             projTreeObj.workBook = projTreeObj.buildSheet(projTreeObj.workBook,'projSpread',projTreeObj.setting);
             const sheet = projTreeObj.workBook.getSheet(0);
+            sheet.options.frozenlineColor = '#ababab';
             sheet.frozenColumnCount(2);
             sheet.name('projectSheet');
             sheetCommonObj.spreadDefaultStyle(projTreeObj.workBook);
@@ -4828,34 +4829,14 @@ $("#confirm-import").click(function() {
 
     async function  startImportProject(key) {
         try {
-            console.log("start Import");
             let result = await ajaxPost("/pm/api/importProject",{key:key,updateData:projTreeObj.getImportProjectDate()});
-            setTimeout(importProcessChecking,2000);
+            importProcessChecking(key);
         }catch (error){
             alert(error);
-            $.bootstrapLoading.end();
         }finally {
             STATE.importing = false;
         }
     }
-
-    async function importProcessChecking() {
-        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 () {
-                $.bootstrapLoading.progressEnd();//不做这个的话太快,页面不会自动关闭
-            },500);
-            alert(message)
-        }else if(result.error == 0){
-            if(result.status == "processing"){
-                setTimeout(importProcessChecking,2000);
-            }else if(result.status == "complete"){
-                $.bootstrapLoading.progressEnd();
-                refreshAllPage();
-            }
-        }
-    }
 });
 
 $("#import_project_data").change(function(){
@@ -5038,3 +5019,50 @@ function refreshProjSummary(project, summaryInfo) {
     }
     projTreeObj.refreshNodeData(refreshNodes);
 }
+
+
+
+$(function () {
+    if(isShow)  $('#welcomePage').modal('show');//是否显示欢迎页
+    $('#importChongqing').click(async function () {
+        if (STATE.importing) {
+            return;
+        }
+        STATE.importing = true;
+        $('#welcomePage').modal('hide');
+        try {
+            let key = uuid.v1();
+            $.bootstrapLoading.progressStart("欢迎使用大司空云计价",true);
+            $("#progress_modal_body").text("正在导入测评项目,请稍候……");
+            let result = await ajaxPost("/pm/api/importChongqingProject",{user_id: userID,key:key});
+            importProcessChecking(key);
+        }catch (error){
+            alert(error);
+        }finally {
+            STATE.importing = false;
+        }
+    })
+});
+
+async function importProcessChecking(key) {
+    setTimeout(checking,2000)
+    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;
+            setTimeout(function () {
+                $.bootstrapLoading.progressEnd();//不做这个的话太快,页面不会自动关闭
+            },500);
+            alert(message)
+        }else if(result.error == 0){
+            if(result.status == "processing"){
+                setTimeout(checking,2000);
+            }else if(result.status == "complete"){
+                $.bootstrapLoading.progressEnd();
+                refreshAllPage();
+            }
+        }
+    }
+
+
+}

+ 1 - 0
web/building_saas/pm/js/pm_share.js

@@ -56,6 +56,7 @@ const pmShare = (function () {
         },
         sheet: {
             isProtected: true,
+            frozenlineColor : '#ababab',
             protectionOptions: {allowResizeRows: true, allowResizeColumns: true},
             clipBoardOptions: GC.Spread.Sheets.ClipboardPasteOptions.values
         }

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

@@ -57,7 +57,7 @@
                     <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="/public/share/userGuide/userGuide.pdf" target="_blank">用户手册</a>
+                    <a class="dropdown-item" href="http://h.zhzdwd.com/gitbook/yun" target="_blank">用户手册</a>
                     <a class="dropdown-item" href="/public/share/upgradeGuide/upgradeGuide.pdf" target="_blank">升级说明</a>
                     <a class="dropdown-item" href="https://smartcost.com.cn/" target="_blank">纵横官网</a>
                     <!--  <a class="dropdown-item" href="#">动画教程</a>-->

+ 1 - 0
web/over_write/js/chongqing_2018.js

@@ -9,6 +9,7 @@ if(typeof projectGljObject !== 'undefined'){
         {ID:'GENERAL_MACHINE',text:'施工机具'},//重庆2018定额中去掉了主材,机械的显示改为了施工机具
         {ID:'MAIN_MATERIAL',text:'主材'}
     ];
+    $('#menu_index_info').show();
 }
 if(typeof gljUtil !== 'undefined'){
     gljUtil.hasCompMachine = [301,304];//有组成物的机械

+ 22 - 0
web/building_saas/main/js/models/exportStandardInterface.js

@@ -137,6 +137,27 @@ const XMLStandard = (function () {
         'FBSBF': '分包设备费',
         'FBGR': '分包人工工日',
     };
+
+    // 项目汇总字段
+    const summaryObj = {
+        feeFields: [
+            {k: fixedFlag.ENGINEERINGCOST, v: 'engineeringCost'},
+            {k: fixedFlag.SUB_ENGINERRING, v: 'subEngineering'},
+            {k: fixedFlag.MEASURE, v: 'measure'},
+            {k: fixedFlag.SAFETY_CONSTRUCTION, v: 'safetyConstruction'},
+            {k: fixedFlag.OTHER, v: 'other'},
+            {k: fixedFlag.CHARGE, v: 'charge'},
+            {k: fixedFlag.PROVISIONAL, v: 'provisional'},
+            {k: fixedFlag.MATERIAL_PROVISIONAL, v: 'materialProvisional'},
+            {k: fixedFlag.ENGINEERING_ESITIMATE, v: 'engineeringEstimate'},
+            {k: fixedFlag.DAYWORK, v: 'daywork'},
+            {k: fixedFlag.TURN_KEY_CONTRACT, v: 'turnKeyContract'},
+            {k: fixedFlag.CLAIM_VISA, v: 'claimVisa'},
+            {k: fixedFlag.TAX, v: 'tax'}
+        ],
+        engineeringCostFields: null
+    };
+
     // 通用设置和工具
     let _base = XML_EXPORT_BASE,
         _config = _base.CONFIG,
@@ -2133,6 +2154,7 @@ const XMLStandard = (function () {
     }
 
     return {
+        summaryObj,
         entry,
         resetContentCode,
         saveAsFile

+ 102 - 32
web/building_saas/main/js/models/exportSEIInterface.js

@@ -26,40 +26,92 @@ let exportUtil = {
     }
 };
 
-async function exportSEI(projectID) {
+let SEIObject = {};
 
-    let tenderProjects = [];
-    let errorMap = {};
-    let result = await ajaxPost("/project/getSEIProjects",{projectID:projectID});
+async function selfChecking(projectID,exprotCall=false) {//自检和正式导出共用接口
     let pr = new SCComponent.InitProgressBar();
-    pr.start('导出数据接口', '正在导出文件,请稍候……');
-    let project = getProject(result);
-    await prepareTenderDatas(tenderProjects,project);
+   if(!exprotCall) pr.start('导出数据接口', '正在自检,请稍候……');
 
-    if(!_.isEmpty(errorMap)){
-        showError(errorMap);
-        return pr.end();
+    //先检查招投标数据  - todo
+
+    //检查重庆指标接口数量
+    if(_.isEmpty(SEIObject.errorMap)){
+        let [errorMap,SEIFile] = await getSEIIndexFile(projectID);
+        if(errorMap) {
+            SEIObject.errorMap = errorMap;
+        }else {
+            SEIObject.fileCache.push(SEIFile);
+        }
     }
+    _.isEmpty(SEIObject.errorMap)?alert("自检完成,未检测到错误数据。"): showExportError(SEIObject.errorMap);
+    SEIObject.selfChecked = true;
+    if(!exprotCall) pr.end();
+}
 
-    toXml(project);
 
-    pr.end();
+async function exportSEI(projectID){
+    if(!_.isEmpty(SEIObject.errorMap)) return showExportError(SEIObject.errorMap);//如果自检的时候已经有错误,直接提示;
+    let pr = new SCComponent.InitProgressBar();
+    pr.start('导出数据接口', '正在导出文件,请稍候……');
+    SEIObject.exporting = true;
+    try {
+        if(!SEIObject.selfChecked){//没有经过自检,则从招投标接口开始取数据
+            await selfChecking(projectID,true);
+            if(!_.isEmpty(SEIObject.errorMap)) return  pr.end();
+        }
+        //导出建设项目数据
+        //导出压缩包
+       // saveZBFX(SEIObject.fileCache);
+
+    }catch (e){
+        console.log(e);
+    }finally {
+        pr.end();
+        $('#exportCode').modal('show');
+        //SEIObject.exporting = false;
+    }
 
-    
-    function showError(errorMap) {
-        let infoList = [];
-        for(let name in errorMap){
-            infoList.push(`<span style="font-weight: bold">单位工程“${name}”下:</span>`);
-            for(let err of errorMap[name]){
-                infoList.push(err);
-            }
+
+    async function saveZBFX(fileData) {
+        let zip = new JSZip();
+        for (let file of fileData) {
+            zip.file(file.fileName, file.blob, {binary: true});
         }
-        if(infoList.length > 20){
-            $('#hintBox_caption').addClass('export-check');
+        let zipFile = await zip.generateAsync({type: 'blob'});
+        saveAs(zipFile, '经济指标.ZBFX');
+    }
+
+}
+
+function showExportError(errorMap) {
+    let infoList = [];
+    for(let name in errorMap){
+        infoList.push(`<span style="font-weight: bold">单位工程“${name}”下:</span>`);
+        for(let err of errorMap[name]){
+            infoList.push(err);
         }
-        let msg = infoList.join(`<br>`);
-        alert(msg);
     }
+    if(infoList.length > 20){
+        $('#hintBox_caption').addClass('export-check');
+    }
+    let msg = infoList.join(`<br>`);
+    alert(msg);
+}
+
+async function getSEIIndexFile(projectID) {
+
+    let tenderProjects = [];
+    let errorMap = {};
+    let result = await ajaxPost("/project/getSEIProjects",{projectID:projectID});
+    let project = getProject(result);
+    await prepareTenderDatas(tenderProjects,project);
+
+    if(!_.isEmpty(errorMap)){
+        return [errorMap,null];
+    }
+    let file = toXml(project);
+
+    return [null,file];
 
     function getProject(orignal) {//取建设项目信息
         let basicInformation = getBaseInfo(orignal);
@@ -158,7 +210,7 @@ async function exportSEI(projectID) {
                 children:[]
             };
             if(projectData) gljUtil.calcProjectGLJQuantity(projectData.projectGLJs,projectData.ration_gljs,projectData.rations,projectData.bills,getDecimal("glj.quantity"),_,scMathUtil);
-            let materials = indexObj.getMainMaterialDatas(tender.property.materials,projectData.projectGLJs,tender.property.calcOptions,tender.property.decimal,false,_,scMathUtil);
+            let materials = indexObj.getMainMaterialDatas(tender.property,tender.property.materials,projectData.projectGLJs,tender.property.calcOptions,tender.property.decimal,false,_,scMathUtil);
             for(let m of materials){
                 if(m.name == "其他材料") continue;//2020-01-08  其他材料 不输出字段(不管是否有值)。
                 mainIndex.children.push(getMaterial(m))
@@ -262,11 +314,12 @@ async function exportSEI(projectID) {
 
     function setGLJDetail(projectData,property,gljs) {
         if(projectData){
-            gljUtil.calcProjectGLJQuantity(projectData.projectGLJs,projectData.ration_gljs,projectData.rations,projectData.bills,getDecimal("glj.quantity"),_,scMathUtil);
+            gljUtil.calcProjectGLJQuantity(projectData.projectGLJs,projectData.ration_gljs,projectData.rations,projectData.bills,getDecimal("glj.quantity"),_,scMathUtil,true);
         }
         for(let g of projectData.projectGLJs.gljList) {
             if (!g.quantity || g.quantity == "") continue;
-            g.marketPrice = gljUtil.getMarketPrice(g,projectData.projectGLJs,property.calcOptions,property.decimal,false,_,scMathUtil);
+            let tenderCoe = gljUtil.getTenderPriceCoe(g,property);
+            g.marketPrice = gljUtil.getMarketPrice(g,projectData.projectGLJs,property.calcOptions,property.decimal,false,_,scMathUtil,tenderCoe);
             gljs.children.push(setEachGLJ(g));
         }
     }
@@ -514,15 +567,32 @@ async function exportSEI(projectID) {
          //格式化
          xmlStr = formatXml(xmlStr);
          let blob = new Blob([xmlStr], {type: 'text/plain;charset=utf-8'});
-         saveAs(blob, '经济指标.ZBF');
+         return {
+             blob: blob,
+             fileName: "经济指标.ZBF"
+         };
+         //saveAs(blob, '经济指标.ZBF');
      }
 
 }
 
 $(function () {
-   $("#SEIMenu").click(async function () {
-       await exportSEI(projectObj.project.property.rootProjectID);
-       $("#exportMenu").removeClass("show");
-   })
+
+    $("#export-index-check").click( function (){
+        selfChecking(projectObj.project.property.rootProjectID);
+    });
+    $("#export-index-confirm").click(async function (){
+        await  exportSEI(projectObj.project.property.rootProjectID);
+       // $("#exportIndex").modal("hide");
+    });
+
+    $('#exportIndex').on('hide.bs.modal', function() {
+        SEIObject = {
+            exporting:false,
+            fileCache:[],
+            errorMap:{},
+            selfChecked:false
+        }
+    })
 
 });

+ 2 - 0
web/over_write/js/guangdong_2018.js

@@ -83,8 +83,10 @@ function overwriteRationCalcBases (){
         {type: 'mainMaterial', name: '主材费'},
         {type: 'equipment', name: '设备费'},
         {type: 'direct', name: '直接费'},
+        {type: 'measure', name: '措施项目费'},
         {type: 'manage', name: '管理费'},
         {type: 'profit', name: '利润'},
+        {type: 'tax', name: '税金'},
         {type: 'common', name: '工程造价'}
     ];
 })();

File diff suppressed because it is too large
+ 2691 - 0
web/over_write/js/guangdong_2018_export.js


+ 0 - 0
web/over_write/js/guangdong_2018_export_sei.js


+ 93 - 0
web/over_write/js/guangdong_2018_import.js

@@ -0,0 +1,93 @@
+'use strict';
+
+const importXML = (() => {
+    // 通用设置和工具
+    const config = importXMLBase.CONFIG;
+    const util = importXMLBase.UTIL;
+    const {
+        fixedFlag,
+        billType,
+        rationType,
+        projectType
+    } = commonConstants;
+    const { AdjustType } = config;
+    const {
+        getValue,
+        arrayValue,
+        getFee,
+        getFlag,
+        getItemsRecur,
+    } = util;
+
+    //导入的文件类型,界面选的文件类型是生成项目的文件类型,这里的文件类型指的是,要导入文件的类型,
+    //导入文件类型不同,导入数据不同
+    let importFileKind = '';
+
+    const countData = {
+        projectCount: 0,    //项目数量
+        projectGLJCount: 0,  //项目人材机数量
+        ratioCount: 0,      //组成物数量
+        unitPriceCount: 0,   //单价数量
+        unitPriceFileCount: 0,  //单价文件数量
+    };
+
+    // 建设项目
+    function loadProject(xmlObj) {
+
+    }
+
+    /**
+     * 解压cos、zip文件
+     * @param {File} file - 上传的文件 
+     * @return {Object} 解压出来的xml文件名称与xml文件文本内容映射 
+     */
+    async function unzipFile(file) {
+        const jsZip = new JSZip();
+        const zip = await jsZip.loadAsync(file);
+        const map = {};
+        for (const fileName in zip.files) {
+            // 将二进制数据转换成字符串
+            map[fileName] = await jsZip.file(fileName).async('string');
+        }
+        return map;
+    }
+
+    //从xml文件中提取数据
+    async function extractData(file, escape = false) {
+        const fileMap = await unzipFile(file);
+        const projectXML = fileMap['Project.xml'];
+        if (!projectXML) {
+            throw '无有效数据';
+        }
+        const xmlObjMap = {};
+        for (const fileName in fileMap) {
+            const xmlStr = escape ? util.escapeXMLEntity(fileMap[fileName]) : fileMap[fileName];
+            //将xml格式良好的字符串转换成对象
+            const x2js = new X2JS();
+            let xmlObj = x2js.xml_str2json(xmlStr);
+            xmlObj = JSON.parse(util.restoreXMLEntity(JSON.stringify(xmlObj)));
+            if (!xmlObj) {
+                throw '无有效数据。';
+            }
+            xmlObjMap[fileName] = xmlObj;
+        }
+        if (escape) {
+            xmlStr = util.escapeXMLEntity(xmlStr);
+        }
+        let xmlObj = x2js.xml_str2json(xmlStr);
+        xmlObj = JSON.parse(util.restoreXMLEntity(JSON.stringify(xmlObj)));
+        if (!xmlObj) {
+            throw '无有效数据。';
+        }
+        //console.log(xmlObj);
+        //提取数据
+        return loadProject(xmlObj);
+    };
+
+    // 接受上传的文件类型(不同的省份可以上传的文件不同)
+    const accept = ['.zip', '.cos'];
+
+    return {
+        accept,
+    }
+})();

+ 367 - 0
web/users/html/index.html

@@ -0,0 +1,367 @@
+<!doctype html>
+<html lang="en">
+   <head>
+      <!-- Required meta tags -->
+      <meta charset="utf-8">
+      <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+      <!-- Bootstrap CSS -->
+      <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
+      <link rel="stylesheet" href="/web/building_saas/css/all.css">
+      <link rel="stylesheet" href="/web/building_saas/css/style.css">
+      <title>大司空云计价 - 远程办公,用免费正版市政计价软件</title>
+      <link rel="shortcut icon" href="/web/building_saas/css/favicon.ico" />
+   </head>
+   <body>
+
+      <header id="header">
+         <nav class="navbar navbar-expand-lg navbar-light bg-light  navbar-transparent">
+            <div class="container">
+               <a class="navbar-brand" href="#home"><img src="/web/users/images/logo.png" alt="" class="img-fluid"></a>
+               <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarLexar" aria-controls="navbarLexar" aria-expanded="false" aria-label="Toggle navigation">
+               <span class="navbar-toggler-icon"></span>
+               </button>
+               <div class="collapse navbar-collapse" id="navbarLexar">      
+               <ul class="navbar-nav ml-auto">
+                     <li class="nav-item active">
+                        <a class="btn btn-primary my-3" href="/login">登录软件</a>
+                     </li>
+                  </ul>
+               </div>
+            </div>
+         </nav>
+      </header>
+      <!--banner-->
+      <div class="hero bg-dark section " style="background-image: url(/web/users/images/bg_01.png);" id="home">
+         <div class="container text-center">
+            <h1 class="text-white mb-4 f-50 ">远程办公,用免费正版市政计价软件</h1>
+            <p class="lead text-white mb-5">跨平台,打开浏览器即可使用,全新在线计价体验。
+            <!-- <div class="btn_hero mb-5">
+               <a href="#" class="btn btn-primary btn-round mr-2">GET THIS APP</a>
+               <a href="#" class="btn btn-outline-primary btn-round ml-2">TRY IT FOR FREE</a>
+            </div> -->
+            <div class="home-desk mt-5">
+               <div class="container pt-5">
+                  <img src="/web/users/images/home-desk.png" alt="" class="img-fluid mx-auto  d-block">
+               </div>
+            </div>
+         </div>
+      </div>
+      <!--简介-->
+      <section class="section">
+         <div class="container">
+            <div class="row">
+               <div class="col-md-10 offset-md-1">
+                  <div class="srction_title text-center">
+                     <img src="/web/users/images/line.png" alt="" class="img-fluid mx-auto my-3 d-block">
+                  </div>
+               </div>
+            </div>
+            <div class="row">
+               <div class="col-12 col-md-6 col-lg-4 mt-30">
+                  <!-- Box -->
+                  <div class="bos bg-bos text-center">
+                     <!-- Icon -->
+                     <div class="text-primary">
+                        <img src="/web/users/images/undraw_gift.svg">
+                     </div>
+                     <!-- Heading -->
+                     <h2>
+                     正版永久免费
+                     </h2>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-6 col-lg-4 mt-30">
+                  <!-- Box -->
+                  <div class="bos bg-bos text-center">
+                     <!-- Icon -->
+                     <div class="text-primary">
+                        <img src="/web/users/images/undraw_browse.svg">
+                     </div>
+                     <!-- Heading -->
+                     <h2>
+                     真云版免安装
+                     </h2>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-6 col-lg-4 mt-30">
+                  <!-- Box -->
+                  <div class="bos bg-bos text-center">
+                     <!-- Icon -->
+                     <div class="text-primary">
+                        <img src="/web/users/images/undraw_work.svg">
+                     </div>
+                     <!-- Heading -->
+                     <h2>
+                     高效协同工作
+                     </h2>
+                  </div>
+                  <!--End Box -->
+               </div>
+            </div>
+         </div>
+      </section>
+      <!--大司空-->
+      <section class="section bg-section py-5">
+         <div class="container">
+            <p class="text-center mb-0 lead">大司空,是中国古代官名,掌土木、营建之事,古人云</p>
+            <h2 class="h1 font-weight-900 mb-0 text-center">伯禹为<span class="text-primary">司空</span>,可成美尧之功</h2>
+         </div>
+      </section>
+      <!-- 详细简介 -->
+      <section class="section ">
+         <div class="container">
+            <div class="row align-items-center mb-100">
+               <div class="col-lg-8 mt-30">
+                  <img src="/web/users/images/softview/1.png" alt="" class="img-fluid d-block mx-auto" style="border:1px solid #ccc">
+               </div>
+               <div class="col-lg-4 mt-30">
+                  <!-- Box -->
+                  <div class="bos text-left mb-30">
+                     <div class="media align-items-lg-center">
+                        <div class="media-body pl-4">
+                           <!-- Heading -->
+                           <h3 class="mb-5">
+                           真云版、免安装
+                           </h3>
+                           <!-- Text -->
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>数据实时云端存储
+                           </p>
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>随时随地自由编辑
+                           </p>
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>支持苹果macOS系统
+                           </p>
+                        </div>
+                     </div>
+                  </div>
+                  <!--End Box -->
+               </div>
+            </div>
+            <div class="row align-items-center mb-100">
+               <div class="col-lg-4 mt-30">
+                  <!-- Box -->
+                  <div class="bos text-left mb-30">
+                     <div class="media align-items-lg-center">
+                        <div class="media-body pl-4">
+                           <!-- Heading -->
+                           <h3 class="mb-5">
+                           正版软件,永久免费
+                           </h3>
+                           <!-- Text -->
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>官方正版
+                           </p>
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>功能齐全
+                           </p>
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>各省定额完全免费
+                           </p>
+                        </div>
+                     </div>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-lg-8 mt-30">
+                  <img src="/web/users/images/softview/2.png" alt="" class="img-fluid d-block mx-auto" style="border:1px solid #ccc">
+               </div>
+            </div>
+            <div class="row align-items-center">
+               <div class="col-lg-8 mt-30">
+                  <img src="/web/users/images/softview/3.png" alt="" class="img-fluid d-block mx-auto" style="border:1px solid #ccc">
+               </div>
+               <div class="col-lg-4 mt-30">
+                  <!-- Box -->
+                  <div class="bos text-left mb-30">
+                     <div class="media align-items-lg-center">
+                        <div class="media-body pl-4">
+                           <!-- Heading -->
+                           <h3 class="mb-5">
+                           高效协同工作
+                           </h3>
+                           <!-- Text -->
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>云端实时安全分享
+                           </p>
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>同步协作快速编辑
+                           </p>
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>私有交互随心设置
+                           </p>
+                        </div>
+                     </div>
+                  </div>
+                  <!--End Box -->
+               </div>
+            </div>
+         </div>
+      </section>
+      <!--产品-->
+      <section class="section">
+         <div class="container">
+            <div class="row mb-30">
+               <div class="col-md-10 offset-md-1">
+                  <div class="srction_title text-center">
+                     <h2 class="h1 font-weight-900 mb-0">产品分类</h2>
+                     <img src="/web/users/images/line.png" alt="" class="img-fluid mx-auto my-3 d-block">
+                  </div>
+               </div>
+            </div>
+            <div class="row">
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fas fa-building"></i>
+                     </div>
+                     <h3>
+                     房建
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fas fa-equals"></i>
+                     </div>
+                     <h3>
+                     轨道
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fas fa-compress"></i>
+                     </div>
+                     <h3>
+                     综合管廊
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fas fa-tree"></i>
+                     </div>
+                     <h3>
+                     园林绿化
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fab fa-houzz"></i>
+                     </div>
+                     <h3>
+                     装配式建筑
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fas fa-screwdriver"></i>
+                     </div>
+                     <h3>
+                     通用安装
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fab fa-codepen"></i>
+                     </div>
+                     <h3>
+                     构筑物
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fas fa-tools"></i>
+                     </div>
+                     <h3>
+                     房屋修缮
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+            </div>
+         </div>
+      </section>
+      <!--底部-->
+      <footer class="footer_area bg-light">
+         <div class="footer_bottom_area section pb-0">
+            <div class="container">
+               <div class="row">
+                  <div class="col-6">
+                     <h3><img src="/web/users/images/laohuicon.png" class="mr-3">加班少一点,胜算多一点</h3>
+                  </div>
+                  <div class="col-6">
+                     <div class="footer_menu">
+                        <ul class="list-unstyled">
+                           <li>
+                              <a  href="https://smartcost.com.cn" target="_blank">首页</a>
+                           </li>
+                           <li>
+                              <a  href="https://smartcost.com.cn/product/24" target="_blank">产品下载</a>
+                           </li>
+                           <li>
+                              <a  href="http://ol.smartcost.com.cn" target="_blank">纵横造价网络版</a>
+                           </li>
+                           <li>
+                              <a  href="https://smartcost.com.cn/train" target="_blank">纵横专业培训</a>
+                           </li>
+                           <li>
+                              <a  href="https://smartcost.com.cn/contact2" target="_blank">联系我们</a>
+                           </li>
+                        </ul>
+                     </div>
+                  </div>
+               </div>
+            </div>
+         </div>
+         <div class="footer_copywrite_area">
+            <div class="container">
+               <div class="row">
+                  <div class="col-12">
+                     <div class="footer_bottom text-center">
+                        Copyright@珠海纵横创新软件有限公司 all rights reserved <a href="http://www.miitbeian.gov.cn" target="_blank">粤ICP备14032472号</a>
+                     </div>
+                     <div style="position:fixed;right:-100px"><script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1278513319'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "v1.cnzz.com/stat.php%3Fid%3D1278513319%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));</script></div>
+                  </div>
+               </div>
+            </div>
+         </div>
+      </footer>
+      <!-- jQuery first, then Popper.js, then Bootstrap JS -->
+      <script src="/lib/jquery/jquery-3.2.1.min.js"></script>
+      <script src="/lib/popper/popper.min.js"></script>
+      <script src="/lib/bootstrap/bootstrap.min.js"></script>
+      <script src="/lib/jquery/jquery.sticky.js"></script>
+      <script src="/web/users/js/index.js"></script>
+   </body>
+</html>

+ 1 - 1
web/users/html/user-info.html

@@ -71,7 +71,7 @@
                             </select>
                         </div>
                         <div class="form-group">
-                            <label class="form-control-label">联系人</label>
+                            <label class="form-control-label">账号姓名</label>
                             <input class="form-control" value="<%= userData.real_name %>" placeholder="输入您的姓名" id="name" name="real_name" autocomplete="off">
                         </div>
                         <div class="form-group">

+ 0 - 0
web/users/images/bg_01.png


Some files were not shown because too many files changed in this diff