From 6a80ae4316393dd78464a5293ccaa20e6beb1230 Mon Sep 17 00:00:00 2001
From: OathK1per <zhangypg@gmail.com>
Date: Wed, 5 Jan 2022 22:07:33 +0800
Subject: [PATCH] =?UTF-8?q?=E6=A6=82=E7=AE=97=E5=88=86=E9=9A=94=E7=AC=A6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../controller/backend/ProjectController.java |  2 +
 .../static/assets/js/project_common.js        | 54 +++++++++------
 .../static/assets/js/project_estimate.js      | 22 ++++++-
 .../templates/admin/project_estimate_add.ftl  | 66 +++++++++----------
 .../templates/admin/project_estimate_edit.ftl | 66 +++++++++----------
 5 files changed, 124 insertions(+), 86 deletions(-)

diff --git a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java
index b4eb2cf..c1bab59 100644
--- a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java
+++ b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java
@@ -17,6 +17,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.format.datetime.DateFormatter;
+import org.springframework.format.number.NumberStyleFormatter;
 import org.springframework.stereotype.Controller;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.WebDataBinder;
@@ -551,6 +552,7 @@ public class ProjectController extends BaseController {
     @InitBinder
     public void initBinder(WebDataBinder webDataBinder) {
         webDataBinder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
+        webDataBinder.addCustomFormatter(new NumberStyleFormatter());
     }
 
     /**
diff --git a/src/main/resources/static/assets/js/project_common.js b/src/main/resources/static/assets/js/project_common.js
index a848702..c61cd3c 100644
--- a/src/main/resources/static/assets/js/project_common.js
+++ b/src/main/resources/static/assets/js/project_common.js
@@ -9,7 +9,6 @@ var layuiAlert = function(msg) {
     });
 };
 
-
 /**
  * parse float保留两位小数,四舍五入
  * 空格或者非数字认为是0
@@ -20,6 +19,10 @@ function f2(x) {
     if(!x){
         return 0;
     }
+    if(typeof x === 'string'){
+        //这一步因为数字格式化为了包含分隔符,获取的时候就去掉这个分隔符
+        x = x.replaceAll(",","");
+    }
     var f = parseFloat(x);
     if (isNaN(f)) {
         return 0;
@@ -28,17 +31,24 @@ function f2(x) {
 }
 
 /**
- * 给定一个数字,保留两位小数输出
+ * 给定一个数字,保留两位小数输出,格式化为包含分隔符
  * @param f
  * @returns {string}
  */
 function f2Fixed(f) {
-    return Number(f).toFixed(2);
-
-    //格式化413,423,423.24,数字类型的输入框填入这样的有问题
-    //return Number(f).toLocaleString('zh',{minimumFractionDigits: 2, maximumFractionDigits: 2, useGrouping: true});
+    //return Number(f).toFixed(2);
+    //格式化413,423,423.24
+    f = Number(f).toLocaleString('en-US',{minimumFractionDigits: 2, maximumFractionDigits: 2, useGrouping: true});
+    return f;
 }
 
+function digitalSelf(name, action) {
+    var self = inputVal(name);
+
+    var $action = $(action);
+
+    $action.val(f2Fixed(f2(self)));
+}
 
 /**
  * 计算利润率
@@ -56,32 +66,37 @@ function rate(r1,r2) {
 
 
 /**
- * 保留两位小数
+ * 保留数字两位小数
  */
 function bindNumberInput() {
-    //所有的数字输入框
-    var $inputs = $("input[type='number']");
+    //所有的数字类型输入框
+    var $numberTypeInputs = $("input[type='number']");
+    inputKeepDigital($numberTypeInputs);
 
+    //所有的number类的输入框
+    var $numberClassInputs = $("input.number");
+    inputKeepDigital($numberClassInputs);
+}
+
+function inputKeepDigital($inputs) {
     //键盘键弹起的时候
     $inputs.keyup(function () {
         keepDigital($(this));
     });
     //失去焦点时再校验一遍
     $inputs.blur(function() {
-
-        /*var reg = new RegExp("^(\-)?[0-9]+(.[0-9]{1,2})?$");
-        if (reg.test(value)) {
-            //是数字就是数字,可以两位或者不带小数
-            $(this).val(value);
-        } else {
-            $(this).val("");
-        }*/
         keepDigital($(this));
     });
 }
 
 function keepDigital($input) {
-    var value = $input.val();
+    $input.val(keepDigitalVal($input.val()));
+}
+
+/**
+ * 只保留数字
+ */
+function keepDigitalVal(value) {
     value = value.replace(/[^\-\d.]/g, ""); //清除“-”、“数字”和“.”以外的字符
     value = value.replace(/\.{2,}/g, "."); //只保留第一个. 清除多余的
     value = value.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
@@ -90,7 +105,8 @@ function keepDigital($input) {
         //以上已经过滤,此处控制的是如果没有小数点,首位不能为类似于 01、02的金额
         value = parseFloat(value);
     }
-    $input.val(value);
+
+    return value;
 }
 
 /**
diff --git a/src/main/resources/static/assets/js/project_estimate.js b/src/main/resources/static/assets/js/project_estimate.js
index b33e3a4..19af6c8 100644
--- a/src/main/resources/static/assets/js/project_estimate.js
+++ b/src/main/resources/static/assets/js/project_estimate.js
@@ -4,30 +4,36 @@ function calIncomeAndCost() {
         calIncomeCost();
 
         calIncomeDeviceTaxExclude();
+        digitalSelf("incomeDeviceTaxInclude", "input[name='incomeDeviceTaxInclude']");
     });
     $("input[name='incomeEngineerTaxInclude']").change(function () {
         calIncomeInclude();
         calIncomeCost();
 
         calIncomeEngineerTaxExclude();
+        digitalSelf("incomeEngineerTaxInclude", "input[name='incomeEngineerTaxInclude']");
     });
     $("input[name='incomeServiceTaxInclude']").change(function () {
         calIncomeInclude();
         calIncomeCost();
 
         calIncomeServiceTaxExclude();
+        digitalSelf("incomeServiceTaxInclude", "input[name='incomeServiceTaxInclude']");
     });
     $("input[name='incomeDeviceTaxExclude']").change(function () {
         calIncomeExclude();
         calIncomeCost();
+        digitalSelf("incomeDeviceTaxExclude", "input[name='incomeDeviceTaxExclude']");
     });
     $("input[name='incomeEngineerTaxExclude']").change(function () {
         calIncomeExclude();
         calIncomeCost();
+        digitalSelf("incomeEngineerTaxExclude", "input[name='incomeEngineerTaxExclude']");
     });
     $("input[name='incomeServiceTaxExclude']").change(function () {
         calIncomeExclude();
         calIncomeCost();
+        digitalSelf("incomeServiceTaxExclude", "input[name='incomeServiceTaxExclude']");
     });
 
 
@@ -38,24 +44,28 @@ function calIncomeAndCost() {
         calIncomeCost();
 
         calCostPurchaseDeviceTaxInclude();
+        digitalSelf("costPurchaseDeviceTaxInclude", "input[name='costPurchaseDeviceTaxInclude']");
     });
     $("input[name='costPurchaseBuildTaxInclude']").change(function () {
         calCostInclude();
         calIncomeCost();
 
         calCostPurchaseBuildTaxInclude();
+        digitalSelf("costPurchaseBuildTaxInclude", "input[name='costPurchaseBuildTaxInclude']");
     });
     $("input[name='costPurchaseServiceTaxInclude']").change(function () {
         calCostInclude();
         calIncomeCost();
 
         calCostPurchaseServiceTaxInclude();
+        digitalSelf("costPurchaseServiceTaxInclude", "input[name='costPurchaseServiceTaxInclude']");
     });
     $("input[name='costPurchaseOtherTaxInclude']").change(function () {
         calCostInclude();
         calIncomeCost();
 
         calCostPurchaseOtherTaxInclude();
+        digitalSelf("costPurchaseOtherTaxInclude", "input[name='costPurchaseOtherTaxInclude']");
     });
     /*$("input[name='costProjectManageTaxInclude']").change(function () {
         calCostInclude();
@@ -66,23 +76,28 @@ function calIncomeAndCost() {
         calIncomeCost();
 
         calCostOtherOtherTaxInclude();
+        digitalSelf("costOtherOtherTaxInclude", "input[name='costOtherOtherTaxInclude']");
     });
 
     $("input[name='costPurchaseDeviceTaxExclude']").change(function () {
         calCostExclude();
         calIncomeCost();
+        digitalSelf("costPurchaseDeviceTaxExclude", "input[name='costPurchaseDeviceTaxExclude']");
     });
     $("input[name='costPurchaseBuildTaxExclude']").change(function () {
         calCostExclude();
         calIncomeCost();
+        digitalSelf("costPurchaseBuildTaxExclude", "input[name='costPurchaseBuildTaxExclude']");
     });
     $("input[name='costPurchaseServiceTaxExclude']").change(function () {
         calCostExclude();
         calIncomeCost();
+        digitalSelf("costPurchaseServiceTaxExclude", "input[name='costPurchaseServiceTaxExclude']");
     });
     $("input[name='costPurchaseOtherTaxExclude']").change(function () {
         calCostExclude();
         calIncomeCost();
+        digitalSelf("costPurchaseOtherTaxExclude", "input[name='costPurchaseOtherTaxExclude']");
     });
     $("input[name='costProjectManageTaxExclude']").change(function () {
         calCostExclude();
@@ -93,17 +108,22 @@ function calIncomeAndCost() {
         calCostInclude();
 
         calIncomeCost();
+        digitalSelf("costProjectManageTaxExclude", "input[name='costProjectManageTaxExclude']");
+        digitalSelf("costProjectManageTaxInclude", "input[name='costProjectManageTaxInclude']");
     });
     $("input[name='costOtherOtherTaxExclude']").change(function () {
         calCostExclude();
         calIncomeCost();
+        digitalSelf("costOtherOtherTaxExclude", "input[name='costOtherOtherTaxExclude']");
     });
 
     $("input[name='costExpropriationTaxExclude']").change(function () {
         calIncomeCost();
+        digitalSelf("costExpropriationTaxExclude", "input[name='costExpropriationTaxExclude']");
     });
     $("input[name='costCompanyManageTaxExclude']").change(function () {
         calIncomeCost();
+        digitalSelf("costCompanyManageTaxExclude", "input[name='costCompanyManageTaxExclude']");
     });
 
     //设备类收入
@@ -421,7 +441,7 @@ function calIncomeCost() {
     }
 
     if ($projectGrossProfit.val()) {
-        $projectContributionProfit.val(f2(f2Fixed($projectGrossProfit.val()) - f2(costCompanyManageTaxExclude)));
+        $projectContributionProfit.val(f2Fixed(f2($projectGrossProfit.val()) - f2(costCompanyManageTaxExclude)));
         $projectContributionProfitRate.val(f2Fixed(f2($projectContributionProfit.val()) * 100 / f2(incomeTotalTaxExclude)))
     } else {
         $projectContributionProfit.val("");
diff --git a/src/main/resources/templates/admin/project_estimate_add.ftl b/src/main/resources/templates/admin/project_estimate_add.ftl
index 3b26a10..5f8a91a 100644
--- a/src/main/resources/templates/admin/project_estimate_add.ftl
+++ b/src/main/resources/templates/admin/project_estimate_add.ftl
@@ -113,7 +113,7 @@
 <#--                            <div class="am-u-sm-4 am-u-md-2 am-text-right"><span style="color: red;">*</span>垫资利息</div>-->
 <#--                            <div class="am-u-sm-6 am-u-md-6">-->
 <#--                                <input type="number" class="am-input" data-validate-async data-validation-message="请输入垫资利息"-->
-<#--                                       name="advanceInterestAmount" placeholder="单位(元)" min="0.00" max="9999999999.99" step="0.01" maxlength="13"-->
+<#--                                       name="advanceInterestAmount" placeholder="单位(元)" maxlength="16"-->
 <#--                                       value="" required />-->
 <#--                            </div>-->
 <#--                            <div class="am-u-sm-2 am-u-md-4 input-msg"></div>-->
@@ -122,7 +122,7 @@
 <#--                            <div class="am-u-sm-4 am-u-md-2 am-text-right"><span style="color: red;">*</span>垫资峰值</div>-->
 <#--                            <div class="am-u-sm-6 am-u-md-6">-->
 <#--                                <input type="number" class="am-input" data-validate-async data-validation-message="请输入垫资峰值"-->
-<#--                                       name="advancePeakAmount" placeholder="单位(元)" min="0.00" max="9999999999.99" step="0.01" maxlength="13"-->
+<#--                                       name="advancePeakAmount" placeholder="单位(元)" maxlength="16"-->
 <#--                                       value="" required />-->
 <#--                            </div>-->
 <#--                            <div class="am-u-sm-2 am-u-md-4 input-msg"></div>-->
@@ -131,7 +131,7 @@
                             <div class="am-u-sm-4 am-u-md-2 am-text-right"><span style="color: red;">*</span>合同金额</div>
                             <div class="am-u-sm-6 am-u-md-6">
                                 <input type="number" class="am-input" data-validate-async data-validation-message="请输入合同金额"
-                                       name="contractAmount" placeholder="单位(元)" min="0.00" max="9999999999.99" step="0.01" maxlength="13"
+                                       name="contractAmount" placeholder="单位(元)" maxlength="16"
                                        value="" required />
                             </div>
                             <div class="am-u-sm-2 am-u-md-4 input-msg"></div>
@@ -149,7 +149,7 @@
                             <div class="am-u-sm-4 am-u-md-2 am-text-right">华智产品金额</div>
                             <div class="am-u-sm-6 am-u-md-6">
                                 <input type="number" class="am-input" data-validation-message="华智产品金额"
-                                       name="huazhiProductAmount" placeholder="单位(元)" min="0.00" max="9999999999.99" step="0.01" maxlength="13" value="" />
+                                       name="huazhiProductAmount" placeholder="单位(元)" maxlength="16" value="" />
                             </div>
                             <div class="am-u-sm-2 am-u-md-4 input-msg"></div>
                         </div>
@@ -157,7 +157,7 @@
                             <div class="am-u-sm-4 am-u-md-2 am-text-right">其他产品金额</div>
                             <div class="am-u-sm-6 am-u-md-6">
                                 <input type="number" class="am-input" data-validation-message="请输入其他产品金额"
-                                       name="ziguangOtherAmount" placeholder="单位(元)" min="0.00" max="9999999999.99" step="0.01" maxlength="13" value="" />
+                                       name="ziguangOtherAmount" placeholder="单位(元)" maxlength="16" value="" />
                             </div>
                             <div class="am-u-sm-2 am-u-md-4 input-msg"></div>
                         </div>
@@ -199,8 +199,8 @@
                                 <tr>
                                     <td>收入</td>
                                     <td>设备类</td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="incomeDeviceTaxInclude" required></td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="incomeDeviceTaxExclude" readonly required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="incomeDeviceTaxInclude" required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="incomeDeviceTaxExclude" readonly required></td>
                                     <td>
                                         <select data-am-selected name="incomeDeviceSelect" id="incomeDeviceSelect">
                                         <option value="请选择税率">请选择税率</option>
@@ -217,8 +217,8 @@
                                 <tr>
                                     <td>收入</td>
                                     <td>工程类</td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="incomeEngineerTaxInclude" required></td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="incomeEngineerTaxExclude" readonly required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="incomeEngineerTaxInclude" required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="incomeEngineerTaxExclude" readonly required></td>
                                     <td>
                                         <select data-am-selected name="incomeEngineerSelect" id="incomeEngineerSelect">
                                             <option value="请选择税率">请选择税率</option>
@@ -235,8 +235,8 @@
                                 <tr>
                                     <td>收入</td>
                                     <td>服务类</td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="incomeServiceTaxInclude" required></td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="incomeServiceTaxExclude" readonly required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="incomeServiceTaxInclude" required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="incomeServiceTaxExclude" readonly required></td>
                                     <td>
                                         <select data-am-selected name="incomeServiceSelect" id="incomeServiceSelect">
                                             <option value="请选择税率">请选择税率</option>
@@ -253,8 +253,8 @@
                                 <tr>
                                     <td>合计</td>
                                     <td></td>
-                                    <td><input type="number" name="incomeTotalTaxInclude" readonly title="此列累计"></td>
-                                    <td><input type="number" name="incomeTotalTaxExclude" readonly title="此列累计"></td>
+                                    <td><input type="text" class="number" name="incomeTotalTaxInclude" readonly title="此列累计"></td>
+                                    <td><input type="text" class="number" name="incomeTotalTaxExclude" readonly title="此列累计"></td>
                                     <td>/</td>
                                 </tr>
                             </tbody>
@@ -274,8 +274,8 @@
                                     <td>成本</td>
                                     <td>采购成本</td>
                                     <td>设备</td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseDeviceTaxInclude" required></td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseDeviceTaxExclude" readonly required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="costPurchaseDeviceTaxInclude" required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="costPurchaseDeviceTaxExclude" readonly required></td>
                                     <td>
                                         <select data-am-selected name="costPurchaseDeviceSelect" id="costPurchaseDeviceSelect">
                                             <option value="请选择税率">请选择税率</option>
@@ -293,8 +293,8 @@
                                     <td>成本</td>
                                     <td>采购成本</td>
                                     <td>施工</td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseBuildTaxInclude" required></td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseBuildTaxExclude" readonly required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="costPurchaseBuildTaxInclude" required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="costPurchaseBuildTaxExclude" readonly required></td>
                                     <td>
                                         <select data-am-selected name="costPurchaseBuildSelect" id="costPurchaseBuildSelect">
                                             <option value="请选择税率">请选择税率</option>
@@ -312,8 +312,8 @@
                                     <td>成本</td>
                                     <td>采购成本</td>
                                     <td>服务</td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseServiceTaxInclude" required></td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseServiceTaxExclude" readonly required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="costPurchaseServiceTaxInclude" required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="costPurchaseServiceTaxExclude" readonly required></td>
                                     <td>
                                         <select data-am-selected name="costPurchaseServiceSelect" id="costPurchaseServiceSelect">
                                             <option value="请选择税率">请选择税率</option>
@@ -331,8 +331,8 @@
                                     <td>成本</td>
                                     <td>采购成本</td>
                                     <td>其他</td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseOtherTaxInclude" required></td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseOtherTaxExclude" readonly required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="costPurchaseOtherTaxInclude" required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="costPurchaseOtherTaxExclude" readonly required></td>
                                     <td>
                                         <select data-am-selected name="costPurchaseOtherSelect" id="costPurchaseOtherSelect">
                                             <option value="请选择税率">请选择税率</option>
@@ -350,8 +350,8 @@
                                     <td>成本</td>
                                     <td>项目管理成本</td>
                                     <td>项目管理成本</td>
-                                    <td><input type="number" name="costProjectManageTaxInclude" required readonly></td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costProjectManageTaxExclude" required></td>
+                                    <td><input type="text" class="number" name="costProjectManageTaxInclude" required readonly></td>
+                                    <td><input type="text" class="number" maxlength="16" name="costProjectManageTaxExclude" required></td>
                                     <td>/</td>
                                 </tr>
                                 <tr>
@@ -359,8 +359,8 @@
                                     <td>其他</td>
                                     <td><input type="text" id="otherName" maxlength="10" data-validate-async data-validation-message="请输入其他类的名称(10字符以内)"
                                                value="" name="otherName" placeholder="请输入其他类的名称(10字符以内)" required/> </td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costOtherOtherTaxInclude" required></td>
-                                    <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costOtherOtherTaxExclude" readonly required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="costOtherOtherTaxInclude" required></td>
+                                    <td><input type="text" class="number" maxlength="16" name="costOtherOtherTaxExclude" readonly required></td>
                                     <td>
                                         <select data-am-selected name="costOtherOtherSelect" id="costOtherOtherSelect">
                                             <option value="请选择税率">请选择税率</option>
@@ -378,8 +378,8 @@
                                     <td>合计</td>
                                     <td></td>
                                     <td></td>
-                                    <td><input type="number" name="costTotalTaxInclude" readonly title="此列累计"></td>
-                                    <td><input type="number" name="costTotalTaxExclude" readonly title="此列累计"></td>
+                                    <td><input type="text" class="number" name="costTotalTaxInclude" readonly title="此列累计"></td>
+                                    <td><input type="text" class="number" name="costTotalTaxExclude" readonly title="此列累计"></td>
                                     <td>/</td>
                                 </tr>
                             </tbody>
@@ -395,12 +395,12 @@
                             <tr>
                                 <td>财务费用</td>
                                 <td>资金占用成本</td>
-                                <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costExpropriationTaxExclude" required></td>
+                                <td><input type="text" class="number" maxlength="16" name="costExpropriationTaxExclude" required></td>
                             </tr>
                             <tr>
                                 <td>公司管理费用</td>
                                 <td></td>
-                                <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costCompanyManageTaxExclude" required></td>
+                                <td><input type="text" class="number" maxlength="16" name="costCompanyManageTaxExclude" required></td>
                             </tr>
                             </tbody>
                         </table>
@@ -414,19 +414,19 @@
                             </tr>
                             <tr>
                                 <td>项目毛利(元)</td>
-                                <td><input type="number" name="projectGrossProfit" readonly title="收入总计(不含税)-成本总计(不含税)-财务费用总计(不含税)"></td>
+                                <td><input type="text" class="number" name="projectGrossProfit" readonly title="收入总计(不含税)-成本总计(不含税)-财务费用总计(不含税)"></td>
                             </tr>
                             <tr>
                                 <td>项目毛利率(%)</td>
-                                <td><input type="number" name="projectGrossProfitRate" readonly title="毛利(不含税)/收入总计(不含税)"></td>
+                                <td><input type="text" class="number" name="projectGrossProfitRate" readonly title="毛利(不含税)/收入总计(不含税)"></td>
                             </tr>
                             <tr>
                                 <td>项目贡献利润(元)</td>
-                                <td><input type="number" name="projectContributionProfit" readonly title="项目毛利(不含税)-公司管理费用总计(不含税)"></td>
+                                <td><input type="text" class="number" name="projectContributionProfit" readonly title="项目毛利(不含税)-公司管理费用总计(不含税)"></td>
                             </tr>
                             <tr>
                                 <td>项目贡献利润率(%)</td>
-                                <td><input type="number" name="projectContributionProfitRate" readonly title="贡献利润(不含税)/收入总计(不含税)"></td>
+                                <td><input type="text" class="number" name="projectContributionProfitRate" readonly title="贡献利润(不含税)/收入总计(不含税)"></td>
                             </tr>
                             </tbody>
                         </table>
diff --git a/src/main/resources/templates/admin/project_estimate_edit.ftl b/src/main/resources/templates/admin/project_estimate_edit.ftl
index 00f5063..f80d8ab 100644
--- a/src/main/resources/templates/admin/project_estimate_edit.ftl
+++ b/src/main/resources/templates/admin/project_estimate_edit.ftl
@@ -120,7 +120,7 @@
 <#--                    <div class="am-u-sm-4 am-u-md-2 am-text-right"><span style="color: red;">*</span>垫资利息</div>-->
 <#--                    <div class="am-u-sm-6 am-u-md-6">-->
 <#--                        <input type="number" class="am-input" data-validate-async data-validation-message="请输入垫资利息"-->
-<#--                               name="advanceInterestAmount" placeholder="单位(元)" min="0.00" max="9999999999.99" step="0.01" maxlength="13"-->
+<#--                               name="advanceInterestAmount" placeholder="单位(元)" maxlength="16"-->
 <#--                               value="${Utils.format(project.advanceInterestAmount)}" required />-->
 <#--                    </div>-->
 <#--                    <div class="am-u-sm-2 am-u-md-4 input-msg"></div>-->
@@ -129,7 +129,7 @@
 <#--                    <div class="am-u-sm-4 am-u-md-2 am-text-right"><span style="color: red;">*</span>垫资峰值</div>-->
 <#--                    <div class="am-u-sm-6 am-u-md-6">-->
 <#--                        <input type="number" class="am-input" data-validate-async data-validation-message="请输入垫资峰值"-->
-<#--                               name="advancePeakAmount" placeholder="单位(元)" min="0.00" max="9999999999.99" step="0.01" maxlength="13"-->
+<#--                               name="advancePeakAmount" placeholder="单位(元)" maxlength="16"-->
 <#--                               value="${Utils.format(project.advancePeakAmount)}" required />-->
 <#--                    </div>-->
 <#--                    <div class="am-u-sm-2 am-u-md-4 input-msg"></div>-->
@@ -138,7 +138,7 @@
                     <div class="am-u-sm-4 am-u-md-2 am-text-right"><span style="color: red;">*</span>合同金额</div>
                     <div class="am-u-sm-6 am-u-md-6">
                         <input type="number" class="am-input" data-validate-async data-validation-message="请输入合同金额"
-                               name="contractAmount" placeholder="单位(元)" min="0.00" max="9999999999.99" step="0.01" maxlength="13"
+                               name="contractAmount" placeholder="单位(元)" maxlength="16"
                                value="${Utils.format(project.contractAmount)}" required />
                     </div>
                     <div class="am-u-sm-2 am-u-md-4 input-msg"></div>
@@ -156,7 +156,7 @@
                     <div class="am-u-sm-4 am-u-md-2 am-text-right"><#--<span style="color: red;">*</span>-->华智产品金额</div>
                     <div class="am-u-sm-6 am-u-md-6">
                         <input type="number" class="am-input" data-validation-message="华智产品金额"
-                               name="huazhiProductAmount" placeholder="单位(元)" min="0.00" max="9999999999.99" step="0.01" maxlength="13" value="${Utils.format(project.huazhiProductAmount)}"  />
+                               name="huazhiProductAmount" placeholder="单位(元)" maxlength="16" value="${Utils.format(project.huazhiProductAmount)}"  />
                     </div>
                     <div class="am-u-sm-2 am-u-md-4 input-msg"></div>
                 </div>
@@ -164,7 +164,7 @@
                     <div class="am-u-sm-4 am-u-md-2 am-text-right"><#--<span style="color: red;">*</span>-->其他产品金额</div>
                     <div class="am-u-sm-6 am-u-md-6">
                         <input type="number" class="am-input" data-validation-message="请输入其他产品金额"
-                               name="ziguangOtherAmount" placeholder="单位(元)" min="0.00" max="9999999999.99" step="0.01" maxlength="13" value="${Utils.format(project.ziguangOtherAmount)}" />
+                               name="ziguangOtherAmount" placeholder="单位(元)" maxlength="16" value="${Utils.format(project.ziguangOtherAmount)}" />
                     </div>
                     <div class="am-u-sm-2 am-u-md-4 input-msg"></div>
                 </div>
@@ -206,8 +206,8 @@
                         <tr>
                             <td>收入</td>
                             <td>设备类</td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="incomeDeviceTaxInclude" value="${Utils.format(estimateBean.incomeDeviceTaxInclude)}" required></td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="incomeDeviceTaxExclude" value="${Utils.format(estimateBean.incomeDeviceTaxExclude)}" <#if estimateBean.incomeDeviceSelect! !="自定义">readonly</#if> required></td>
+                            <td><input type="text" class="number" maxlength="16" name="incomeDeviceTaxInclude" value="${Utils.format(estimateBean.incomeDeviceTaxInclude)}" required></td>
+                            <td><input type="text" class="number" maxlength="16" name="incomeDeviceTaxExclude" value="${Utils.format(estimateBean.incomeDeviceTaxExclude)}" <#if estimateBean.incomeDeviceSelect! !="自定义">readonly</#if> required></td>
                             <td>
                                 <select data-am-selected name="incomeDeviceSelect" id="incomeDeviceSelect">
                                     <option value="请选择税率">请选择税率</option>
@@ -224,8 +224,8 @@
                         <tr>
                             <td>收入</td>
                             <td>工程类</td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="incomeEngineerTaxInclude" value="${Utils.format(estimateBean.incomeEngineerTaxInclude)}" required></td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="incomeEngineerTaxExclude" value="${Utils.format(estimateBean.incomeEngineerTaxExclude)}" <#if estimateBean.incomeEngineerSelect! !="自定义">readonly</#if> required></td>
+                            <td><input type="text" class="number" maxlength="16" name="incomeEngineerTaxInclude" value="${Utils.format(estimateBean.incomeEngineerTaxInclude)}" required></td>
+                            <td><input type="text" class="number" maxlength="16" name="incomeEngineerTaxExclude" value="${Utils.format(estimateBean.incomeEngineerTaxExclude)}" <#if estimateBean.incomeEngineerSelect! !="自定义">readonly</#if> required></td>
                             <td>
                                 <select data-am-selected name="incomeEngineerSelect" id="incomeEngineerSelect">
                                     <option value="请选择税率">请选择税率</option>
@@ -242,8 +242,8 @@
                         <tr>
                             <td>收入</td>
                             <td>服务类</td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="incomeServiceTaxInclude" value="${Utils.format(estimateBean.incomeServiceTaxInclude)}" required></td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="incomeServiceTaxExclude" value="${Utils.format(estimateBean.incomeServiceTaxExclude)}" <#if estimateBean.incomeServiceSelect! !="自定义">readonly</#if> required></td>
+                            <td><input type="text" class="number" maxlength="16" name="incomeServiceTaxInclude" value="${Utils.format(estimateBean.incomeServiceTaxInclude)}" required></td>
+                            <td><input type="text" class="number" maxlength="16" name="incomeServiceTaxExclude" value="${Utils.format(estimateBean.incomeServiceTaxExclude)}" <#if estimateBean.incomeServiceSelect! !="自定义">readonly</#if> required></td>
                             <td>
                                 <select data-am-selected name="incomeServiceSelect" id="incomeServiceSelect">
                                     <option value="请选择税率">请选择税率</option>
@@ -260,8 +260,8 @@
                         <tr>
                             <td>合计</td>
                             <td></td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="incomeTotalTaxInclude" value="${Utils.format(estimateBean.incomeTotalTaxInclude)}" readonly title="此列累计"></td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="incomeTotalTaxExclude" value="${Utils.format(estimateBean.incomeTotalTaxExclude)}" readonly title="此列累计"></td>
+                            <td><input type="text" class="number" maxlength="16" name="incomeTotalTaxInclude" value="${Utils.format(estimateBean.incomeTotalTaxInclude)}" readonly title="此列累计"></td>
+                            <td><input type="text" class="number" maxlength="16" name="incomeTotalTaxExclude" value="${Utils.format(estimateBean.incomeTotalTaxExclude)}" readonly title="此列累计"></td>
                             <td>/</td>
                         </tr>
                     </tbody>
@@ -281,8 +281,8 @@
                             <td>成本</td>
                             <td>采购成本</td>
                             <td>设备</td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseDeviceTaxInclude" value="${Utils.format(estimateBean.costPurchaseDeviceTaxInclude)}" required></td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseDeviceTaxExclude" value="${Utils.format(estimateBean.costPurchaseDeviceTaxExclude)}" <#if estimateBean.costPurchaseDeviceSelect! !="自定义">readonly</#if> required></td>
+                            <td><input type="text" class="number" maxlength="16" name="costPurchaseDeviceTaxInclude" value="${Utils.format(estimateBean.costPurchaseDeviceTaxInclude)}" required></td>
+                            <td><input type="text" class="number" maxlength="16" name="costPurchaseDeviceTaxExclude" value="${Utils.format(estimateBean.costPurchaseDeviceTaxExclude)}" <#if estimateBean.costPurchaseDeviceSelect! !="自定义">readonly</#if> required></td>
                             <td>
                                 <select data-am-selected name="costPurchaseDeviceSelect" id="costPurchaseDeviceSelect">
                                     <option value="请选择税率">请选择税率</option>
@@ -300,8 +300,8 @@
                             <td>成本</td>
                             <td>采购成本</td>
                             <td>施工</td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseBuildTaxInclude" value="${Utils.format(estimateBean.costPurchaseBuildTaxInclude)}" required></td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseBuildTaxExclude" value="${Utils.format(estimateBean.costPurchaseBuildTaxExclude)}" <#if estimateBean.costPurchaseBuildSelect! !="自定义">readonly</#if> required></td>
+                            <td><input type="text" class="number" maxlength="16" name="costPurchaseBuildTaxInclude" value="${Utils.format(estimateBean.costPurchaseBuildTaxInclude)}" required></td>
+                            <td><input type="text" class="number" maxlength="16" name="costPurchaseBuildTaxExclude" value="${Utils.format(estimateBean.costPurchaseBuildTaxExclude)}" <#if estimateBean.costPurchaseBuildSelect! !="自定义">readonly</#if> required></td>
                             <td>
                                 <select data-am-selected name="costPurchaseBuildSelect" id="costPurchaseBuildSelect">
                                     <option value="请选择税率">请选择税率</option>
@@ -319,8 +319,8 @@
                             <td>成本</td>
                             <td>采购成本</td>
                             <td>服务</td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseServiceTaxInclude" value="${Utils.format(estimateBean.costPurchaseServiceTaxInclude)}" required></td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseServiceTaxExclude" value="${Utils.format(estimateBean.costPurchaseServiceTaxExclude)}" <#if estimateBean.costPurchaseServiceSelect! !="自定义">readonly</#if> required></td>
+                            <td><input type="text" class="number" maxlength="16" name="costPurchaseServiceTaxInclude" value="${Utils.format(estimateBean.costPurchaseServiceTaxInclude)}" required></td>
+                            <td><input type="text" class="number" maxlength="16" name="costPurchaseServiceTaxExclude" value="${Utils.format(estimateBean.costPurchaseServiceTaxExclude)}" <#if estimateBean.costPurchaseServiceSelect! !="自定义">readonly</#if> required></td>
                             <td>
                                 <select data-am-selected name="costPurchaseServiceSelect" id="costPurchaseServiceSelect">
                                     <option value="请选择税率">请选择税率</option>
@@ -338,8 +338,8 @@
                             <td>成本</td>
                             <td>采购成本</td>
                             <td>其他</td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseOtherTaxInclude" value="${Utils.format(estimateBean.costPurchaseOtherTaxInclude)}" required></td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costPurchaseOtherTaxExclude" value="${Utils.format(estimateBean.costPurchaseOtherTaxExclude)}" <#if estimateBean.costPurchaseOtherSelect! !="自定义">readonly</#if> required></td>
+                            <td><input type="text" class="number" maxlength="16" name="costPurchaseOtherTaxInclude" value="${Utils.format(estimateBean.costPurchaseOtherTaxInclude)}" required></td>
+                            <td><input type="text" class="number" maxlength="16" name="costPurchaseOtherTaxExclude" value="${Utils.format(estimateBean.costPurchaseOtherTaxExclude)}" <#if estimateBean.costPurchaseOtherSelect! !="自定义">readonly</#if> required></td>
                             <td>
                                 <select data-am-selected name="costPurchaseOtherSelect" id="costPurchaseOtherSelect">
                                     <option value="请选择税率">请选择税率</option>
@@ -357,16 +357,16 @@
                             <td>成本</td>
                             <td>项目管理成本</td>
                             <td>项目管理成本</td>
-                            <td><input type="number" name="costProjectManageTaxInclude" value="${Utils.format(estimateBean.costProjectManageTaxInclude)}" required readonly></td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costProjectManageTaxExclude" value="${Utils.format(estimateBean.costProjectManageTaxExclude)}" required></td>
+                            <td><input type="text" class="number" name="costProjectManageTaxInclude" value="${Utils.format(estimateBean.costProjectManageTaxInclude)}" required readonly></td>
+                            <td><input type="text" class="number" maxlength="16" name="costProjectManageTaxExclude" value="${Utils.format(estimateBean.costProjectManageTaxExclude)}" required></td>
                         </tr>
                         <tr>
                             <td>成本</td>
                             <td>其他</td>
                             <td><input type="text" id="otherName" maxlength="10" data-validate-async data-validation-message="请输入其他类的名称(10字符以内)"
                                        value="${project.otherName!}" name="otherName" placeholder="请输入其他类的名称(10字符以内)" required/> </td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costOtherOtherTaxInclude" value="${Utils.format(estimateBean.costOtherOtherTaxInclude)}" required></td>
-                            <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costOtherOtherTaxExclude" value="${Utils.format(estimateBean.costOtherOtherTaxExclude)}" <#if estimateBean.costOtherOtherSelect! !="自定义">readonly</#if> required></td>
+                            <td><input type="text" class="number" maxlength="16" name="costOtherOtherTaxInclude" value="${Utils.format(estimateBean.costOtherOtherTaxInclude)}" required></td>
+                            <td><input type="text" class="number" maxlength="16" name="costOtherOtherTaxExclude" value="${Utils.format(estimateBean.costOtherOtherTaxExclude)}" <#if estimateBean.costOtherOtherSelect! !="自定义">readonly</#if> required></td>
                             <td>
                                 <select data-am-selected name="costOtherOtherSelect" id="costOtherOtherSelect">
                                     <option value="请选择税率">请选择税率</option>
@@ -384,8 +384,8 @@
                             <td>合计</td>
                             <td></td>
                             <td></td>
-                            <td><input type="number" name="costTotalTaxInclude" value="${Utils.format(estimateBean.costTotalTaxInclude)}" readonly title="此列累计"></td>
-                            <td><input type="number" name="costTotalTaxExclude" value="${Utils.format(estimateBean.costTotalTaxExclude)}" readonly title="此列累计"></td>
+                            <td><input type="text" class="number" name="costTotalTaxInclude" value="${Utils.format(estimateBean.costTotalTaxInclude)}" readonly title="此列累计"></td>
+                            <td><input type="text" class="number" name="costTotalTaxExclude" value="${Utils.format(estimateBean.costTotalTaxExclude)}" readonly title="此列累计"></td>
                             <td>/</td>
                         </tr>
                     </tbody>
@@ -401,12 +401,12 @@
                     <tr>
                         <td>财务费用</td>
                         <td>资金占用成本</td>
-                        <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costExpropriationTaxExclude" value="${Utils.format(estimateBean.costExpropriationTaxExclude)}" required></td>
+                        <td><input type="text" class="number" maxlength="16" name="costExpropriationTaxExclude" value="${Utils.format(estimateBean.costExpropriationTaxExclude)}" required></td>
                     </tr>
                     <tr>
                         <td>公司管理费用</td>
                         <td></td>
-                        <td><input type="number" min="0.00" max="9999999999.99" step="0.01" maxlength="13" name="costCompanyManageTaxExclude" value="${Utils.format(estimateBean.costCompanyManageTaxExclude)}" required></td>
+                        <td><input type="text" class="number" maxlength="16" name="costCompanyManageTaxExclude" value="${Utils.format(estimateBean.costCompanyManageTaxExclude)}" required></td>
                     </tr>
                     </tbody>
                 </table>
@@ -420,19 +420,19 @@
                     </tr>
                     <tr>
                         <td>项目毛利(元)</td>
-                        <td><input type="number" name="projectGrossProfit" value="${Utils.format(estimateBean.projectGrossProfit)}" readonly title="收入总计(不含税)-成本总计(不含税)-财务费用总计(不含税)"></td>
+                        <td><input type="text" class="number" name="projectGrossProfit" value="${Utils.format(estimateBean.projectGrossProfit)}" readonly title="收入总计(不含税)-成本总计(不含税)-财务费用总计(不含税)"></td>
                     </tr>
                     <tr>
                         <td>项目毛利率(%)</td>
-                        <td><input type="number" name="projectGrossProfitRate" value="${Utils.format(estimateBean.projectGrossProfitRate)}" readonly title="毛利(不含税)/收入总计(不含税)"></td>
+                        <td><input type="text" class="number" name="projectGrossProfitRate" value="${Utils.format(estimateBean.projectGrossProfitRate)}" readonly title="毛利(不含税)/收入总计(不含税)"></td>
                     </tr>
                     <tr>
                         <td>项目贡献利润(元)</td>
-                        <td><input type="number" name="projectContributionProfit" value="${Utils.format(estimateBean.projectContributionProfit)}" readonly title="项目毛利(不含税)-公司管理费用总计(不含税)"></td>
+                        <td><input type="text" class="number" name="projectContributionProfit" value="${Utils.format(estimateBean.projectContributionProfit)}" readonly title="项目毛利(不含税)-公司管理费用总计(不含税)"></td>
                     </tr>
                     <tr>
                         <td>项目贡献利润率(%)</td>
-                        <td><input type="number" name="projectContributionProfitRate" value="${Utils.format(estimateBean.projectContributionProfitRate)}" readonly title="贡献利润(不含税)/收入总计(不含税)"></td>
+                        <td><input type="text" class="number" name="projectContributionProfitRate" value="${Utils.format(estimateBean.projectContributionProfitRate)}" readonly title="贡献利润(不含税)/收入总计(不含税)"></td>
                     </tr>
                     </tbody>
                 </table>