Browse Source

挂号优化

hurugang 6 years ago
parent
commit
15d417a894

+ 33 - 5
src/main/java/cn/hnthyy/thmz/controller/MzPatientMiController.java

@@ -53,19 +53,47 @@ public class MzPatientMiController {
      * @return
      */
     @UserLoginToken
-    @RequestMapping(value = "/getByName", method = {RequestMethod.GET})
-    public Map<String, Object> getByName(@RequestParam("name") String name) {
+    @RequestMapping(value = "/getPatientMiByName", method = {RequestMethod.GET})
+    public Map<String, Object> getPatientMiByName(@RequestParam("name") String name,@RequestParam("pageIndex") Integer pageIndex) {
         log.info("根据病人姓名查询病人信息");
         Map<String, Object> resultMap = new HashMap<>();
         try {
             if(StringUtils.isBlank(name)){
+                name=null;
+            }
+            if(pageIndex==null){
+                pageIndex=1;
+            }
+            resultMap.put("code", 0);
+            resultMap.put("message", "查询病人信息成功");
+            resultMap.put("data", mzPatientMiService.queryByNameFuzzy(name,pageIndex,10));
+            return resultMap;
+        }catch (Exception e){
+            resultMap.put("code", -1);
+            resultMap.put("message", "系统出错,请联系管理员");
+            log.error("系统异常,错误信息{}",e.getMessage());
+            return resultMap;
+        }
+    }
+
+
+    /**
+     * 根据病人ID查询病人信息
+     * @return
+     */
+    @UserLoginToken
+    @RequestMapping(value = "/getByPatientId", method = {RequestMethod.GET})
+    public Map<String, Object> getByPatientId(@RequestParam("patientId") String patientId) {
+        Map<String, Object> resultMap = new HashMap<>();
+        try {
+            if(StringUtils.isBlank(patientId)){
                 resultMap.put("code", -1);
-                resultMap.put("message", "姓名不能为空");
+                resultMap.put("message", "病人id不能为空");
                 return resultMap;
             }
             resultMap.put("code", 0);
-            resultMap.put("message", "查询病人信息成功");
-            resultMap.put("data", mzPatientMiService.queryByNameFuzzy(name));
+            resultMap.put("message", "根据病人ID查询病人信息成功");
+            resultMap.put("data", mzPatientMiService.queryByPatientId(patientId));
             return resultMap;
         }catch (Exception e){
             resultMap.put("code", -1);

+ 20 - 4
src/main/java/cn/hnthyy/thmz/mapper/his/MzPatientMiMapper.java

@@ -23,11 +23,27 @@ public interface MzPatientMiMapper {
      * @param name
      * @return
      */
-    @Select(" select rtrim(social_no) social_no,rtrim(hic_no) hic_no,rtrim(name) name,rtrim(sex) sex,lv_date,rtrim(patient_id) patient_id,rtrim(p_bar_code) p_bar_code," +
-            "rtrim(baddebt_mark) baddebt_mark,rtrim(response_type) response_type,rtrim(charge_type) charge_type,times,rtrim(reqdel_mark) reqdel_mark,age,birth_day," +
-            "rtrim(ic_card_no) ic_card_no,rtrim(phone_no) phone_no,rtrim(adress) address,rtrim(yb_card_no) yb_card_no,first_date,rtrim(rel_name) rel_name from mz_patient_mi  where  name like #{name}")
-    List<MzPatientMi> selectByNameFuzzy(@Param("name") String name);
+    @Select({"<script>",
+            " select top ${pageSize} rtrim(social_no) social_no,rtrim(hic_no) hic_no,rtrim(name) name,rtrim(sex) sex,lv_date,rtrim(patient_id) patient_id,rtrim(p_bar_code) p_bar_code,",
+            "rtrim(baddebt_mark) baddebt_mark,rtrim(response_type) response_type,rtrim(charge_type) charge_type,times,rtrim(reqdel_mark) reqdel_mark,age,birth_day," ,
+            "rtrim(ic_card_no) ic_card_no,rtrim(phone_no) phone_no,rtrim(adress) address,rtrim(yb_card_no) yb_card_no,first_date,rtrim(rel_name) rel_name from   " ,
+            "(SELECT ROW_NUMBER() OVER (ORDER BY mz_patient_mi.ic_card_no desc) AS RowNumber,* from mz_patient_mi ",
+            "<when test='name!=null'>",
+            "  where  name like #{name,jdbcType=VARCHAR}",
+            "</when>",
+            ") as A WHERE RowNumber >#{pageSize}*#{pageIndex} order by RowNumber asc",
+            "</script>"})
+    List<MzPatientMi> selectByNameFuzzy(@Param("name") String name,@Param("pageIndex") Integer pageIndex,@Param("pageSize") Integer pageSize);
 
 
+    /**
+     * 按照id查询病人信息
+     * @param patientId
+     * @return
+     */
+    @Select("select rtrim(social_no) social_no,rtrim(hic_no) hic_no,rtrim(name) name,rtrim(sex) sex,lv_date,rtrim(patient_id) patient_id,rtrim(p_bar_code) p_bar_code," +
+            "rtrim(baddebt_mark) baddebt_mark,rtrim(response_type) response_type,rtrim(charge_type) charge_type,times,rtrim(reqdel_mark) reqdel_mark,age,birth_day," +
+            "rtrim(ic_card_no) ic_card_no,rtrim(phone_no) phone_no,rtrim(adress) address,rtrim(yb_card_no) yb_card_no,first_date,rtrim(rel_name) rel_name from mz_patient_mi  where  patient_id =#{patientId}")
+    MzPatientMi selectByPatientId(@Param("patientId") String patientId);
 
 }

+ 7 - 2
src/main/java/cn/hnthyy/thmz/service/his/MzPatientMiService.java

@@ -17,8 +17,13 @@ public interface MzPatientMiService {
      * @param name
      * @return
      */
-    List<MzPatientMi> queryByNameFuzzy(String name);
+    List<MzPatientMi> queryByNameFuzzy(String name,Integer pageIndex,Integer pageSize);
 
 
-    
+    /**
+     * 按照id查询病人信息
+     * @param patientId
+     * @return
+     */
+    MzPatientMi queryByPatientId(String patientId);
 }

+ 7 - 2
src/main/java/cn/hnthyy/thmz/service/impl/his/MzPatientMiServiceImpl.java

@@ -19,10 +19,15 @@ public class MzPatientMiServiceImpl implements MzPatientMiService {
     }
 
     @Override
-    public List<MzPatientMi> queryByNameFuzzy(String name) {
+    public List<MzPatientMi> queryByNameFuzzy(String name,Integer pageIndex,Integer pageSize) {
         if (StringUtils.isNotBlank(name)){
             name="%"+name+"%";
         }
-        return mzPatientMiMapper.selectByNameFuzzy(name);
+        return mzPatientMiMapper.selectByNameFuzzy(name,pageIndex,pageSize);
+    }
+
+    @Override
+    public MzPatientMi queryByPatientId(String patientId) {
+        return mzPatientMiMapper.selectByPatientId(patientId);
     }
 }

+ 21 - 1
src/main/resources/static/css/registration.css

@@ -235,4 +235,24 @@
 .list-group div {
     width: calc(100% - 30px);
     float: right;
-}
+}
+
+
+/*!* 设置滚动条的样式 *!*/
+/*::-webkit-scrollbar{*/
+    /*width: 8px;*/
+/*}*/
+/*!*滚动槽*!*/
+/*::-webkit-scrollbar-track{*/
+    /*-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.3) ;*/
+    /*border-radius: 10px;*/
+/*}*/
+/*!* 滚动条滑块 *!*/
+/*::-webkit-scrollbar-thumb {*/
+    /*border-radius: 10px;*/
+    /*background: rgba(0, 0, 0, 0.1);*/
+    /*-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.5);*/
+/*}*/
+/*::-webkit-scrollbar-thumb:window-inactive {*/
+    /*background: rgba(255, 0, 0, 0.4);*/
+/*}*/

BIN
src/main/resources/static/images/girl_or_boy.png


+ 13 - 0
src/main/resources/static/js/common/string-util.js

@@ -53,3 +53,16 @@ function executeScript(html) {
         }
     }
 }
+
+/**
+ * 判断内容是否是中文
+ * @param val
+ * @returns {boolean}
+ */
+function isChinese(val){
+    var reg = new RegExp("[\\u4E00-\\u9FA5]+","g");
+    if(reg.test(val)){
+        return true;
+    }
+    return false;
+}

+ 360 - 52
src/main/resources/static/js/registration.js

@@ -1,5 +1,9 @@
 //@ sourceURL=registration.js
 var $dataTableHot;
+//病人下拉选当前页记录
+var pageIndex = 0;
+//判断病人列表是否在加载中,防止重复加载
+var msg_list_loading = false;
 var TableInit = function () {
     var oTableInit = new Object();
     //初始化Table
@@ -128,26 +132,13 @@ $(function () {
     $("#cardNo").focus();
     //根据病人姓名输入框内容动态加载病人列表
     initUserList();
-    //用户姓名选中事件
-    $("#userName").on("click", function (t) {
-        $("div.webui-popover-content").html("");
-        $("div.webui-popover-content").append('<div class="list-group"><a href="#" class="list-group-item list-group-item-action"><img src="/thmz/images/girl.png"/><div>邓诗函&nbsp;女&nbsp;23岁<span>18942524626</span></div></a><a href="#" class="list-group-item list-group-item-action"><img src="/thmz/images/boy.png"/><div>丁捷&nbsp;男&nbsp;23岁<span>18942524626</span></div></a><a href="#" class="list-group-item list-group-item-action"><img src="/thmz/images/girl.png"/><div>邓诗函&nbsp;女&nbsp;23岁<span>18942524626</span></div></a></div>');
-        $("div.arrow").css("left", "23px");
-    });
     //卡号输入改变事件
     cardNoChange();
-    //表单校验
-    $("#regi_form").validate({
-        onfocusout: function (element) {
-            $(element).valid();
-        },
-        errorPlacement: function (error, element) {
-            if (element.parent().hasClass("input-group")) {
-                element.parent().after(error);
-            } else
-                element.after(error)
-        }
-    });
+
+    //卡号输入改变事件
+    userNameChange();
+    //数据校验
+    init_validator();
     //时间区间
     initMzWorkTime();
     //初始门诊收银方式下拉选
@@ -176,19 +167,28 @@ $(function () {
         //默认光标在卡号输入框
         $("#cardNo").focus();
         initMzWorkTime();
+        readonlyOrNot(false);
     });
     /**
      * 增加收款方式按钮事件
      */
-    $("#addPayType").on("click",function (t) {
+    $("#addPayType").on("click", function (t) {
         var payTypeIndex = $("#payTypeIndex").val();
-        var payTypeId="payType_"+payTypeIndex;
-        var html ='<div class="item form-group"><div class="col-md-12 col-sm-12 col-xs-12"><div class="col-md-2 col-sm-2 col-xs-12"></div><label class="col-md-3 col-sm-3 col-xs-12"><select class="form-control selectpicker show-tick" required="true" id="'+payTypeId+'"></select></label><div class="col-md-3 col-sm-3 col-xs-12"><input class="form-control col-md-5 col-xs-12" type="number" data-placement="bottom-right" min="0"></div><a style="line-height: 34px;cursor: pointer;" onclick="closeThisParent(this)"><i class="fa fa-close"></i></a></div></div>';
+        var payTypeId = "payType_" + payTypeIndex;
+        var html = '<div class="item form-group"><div class="col-md-12 col-sm-12 col-xs-12"><div class="col-md-2 col-sm-2 col-xs-12"></div><label class="col-md-3 col-sm-3 col-xs-12"><select class="form-control selectpicker show-tick" required="true" id="' + payTypeId + '"></select></label><div class="col-md-3 col-sm-3 col-xs-12"><input class="form-control col-md-5 col-xs-12" type="number" data-placement="bottom-right" min="0"></div><a style="line-height: 34px;cursor: pointer;" onclick="closeThisParent(this)"><i class="fa fa-close"></i></a></div></div>';
         $("#changeAmountParent").before(html);
         initChequeType(payTypeId)
-        payTypeIndex=payTypeIndex+1;
+        payTypeIndex = payTypeIndex + 1;
         $("#payTypeIndex").val(payTypeIndex);
     });
+    // //当ic卡号输入框失去光标后,重置光标到卡号输入框
+    // $("#cardNo").blur(function () {
+    //     var focus = !($("#userName").is(":focus") || $("#age").is(":focus") || $("#birthDay").is(":focus") || $("#phoneNum").is(":focus") || $("#idCard").is(":focus") || $("#address").is(":focus"));
+    //     if (focus && $("#cardNo").val() == null || $("#cardNo").val() == "") {
+    //         //默认光标在卡号输入框
+    //         $("#cardNo").focus();
+    //     }
+    // });
 });
 
 /**
@@ -266,13 +266,13 @@ function initDeptPlus() {
             $.each(data.data, function (commentIndex, comment) {
                 html += '<option value="' + comment.code + '">' + comment.name + '</option>';
             });
-            $('#deptNo').empty();   //清空resText里面的所有内容
+            $('#deptNo').empty();
             $('#deptNo').html(html);
             $('#deptNo').selectpicker('refresh');
-            $('#chargeType').empty();   //清空resText里面的所有内容
+
+            $('#chargeType').empty();
             $('#chargeType').selectpicker('refresh');
-            $('#doctor').empty();   //清空resText里面的所有内容
-            $('#doctor').selectpicker('refresh');
+            emptyInput();
         }
     });
 }
@@ -305,6 +305,7 @@ function initEmployee() {
             $('#doctor').empty();
             $('#doctor').html(html);
             $('#doctor').selectpicker('refresh');
+            validator.checkAll($("#regi_form"));
             if (flag) {
                 //如果有无需选择医生的选项,默认选择
                 $('#doctor').selectpicker('val', -1);
@@ -374,6 +375,8 @@ function initChargeType() {
             $('#chargeType').empty();   //清空resText里面的所有内容
             $('#chargeType').html(html);
             $('#chargeType').selectpicker('refresh');
+            validator.checkAll($("#regi_form"));
+            emptyInput();
         }
     });
 }
@@ -387,6 +390,8 @@ function fitFee() {
     var checkFee = $('#doctor').find("option:selected").attr('data-checkFee');
     $("#checkFee").val(checkFee);
     $("#amountMoney").text(checkFee);
+    $("#amountMoneyConfirm").text(checkFee);
+    $("#realMoney").val(checkFee);
     $.ajax({
         type: "GET",
         url: '/thmz/getMzChargeTypeByCode?code=' + chargeType,
@@ -399,7 +404,10 @@ function fitFee() {
             }
             $("#registrationFee").val(res.data.reqFee);
             $("#hospitalFee").val(res.data.clinicFee);
-            $("#amountMoney").text(parseFloat(checkFee) + parseFloat(res.data.reqFee) + parseFloat(res.data.clinicFee));
+            checkFee = parseFloat(checkFee) + parseFloat(res.data.reqFee) + parseFloat(res.data.clinicFee);
+            $("#amountMoney").text(checkFee);
+            $("#amountMoneyConfirm").text(checkFee);
+            $("#realMoney").val(checkFee);
         }
     });
 }
@@ -423,9 +431,9 @@ function initChequeType(payType) {
             $.each(res.data, function (commentIndex, comment) {
                 html += '<option value="' + comment.code + '">' + comment.name + '</option>';
             });
-            $('#'+payType).empty();
-            $('#'+payType).html(html);
-            $('#'+payType).selectpicker('refresh');
+            $('#' + payType).empty();
+            $('#' + payType).html(html);
+            $('#' + payType).selectpicker('refresh');
         }
     });
 }
@@ -597,11 +605,17 @@ function printModal(data) {
  * @param data
  */
 function confirmFeeModal() {
-   var prevAll= $("#changeAmountParent").prevAll();
-   while(prevAll.length>2){
-       $("#changeAmountParent").prev().remove();
-       prevAll= $("#changeAmountParent").prevAll();
-   }
+    var validatorResult = validator.checkAll($("#regi_form"));
+    if (!validatorResult) {
+        return;
+    }
+    var prevAll = $("#changeAmountParent").prevAll();
+    while (prevAll.length > 2) {
+        $("#changeAmountParent").prev().remove();
+        prevAll = $("#changeAmountParent").prevAll();
+    }
+    $("#realMoney").val($("#amountMoneyConfirm").text());
+    $("#cash").val(null);
     $("#confirmFeeModal").modal();
 }
 
@@ -638,21 +652,37 @@ function queryUserInfoByCardNo() {
                     return;
                 }
                 if (res.code == 0) {
-                    $("#userName").val(res.data.name);
-                    $("#age").val(res.data.age);
-                    $("#gender").selectpicker('val', res.data.sex);
-                    $("#gender").selectpicker('refresh');
-                    $("#birthDay").val(res.data.birthDayStr);
-                    $("#birthDay").attr("title", res.data.birthDayStr);
-                    $("#phoneNum").val(res.data.phoneNo);
-                    $("#phoneNum").attr("title", res.data.phoneNo);
-                    $("#patientsNature").selectpicker('val', res.responseType);//默认选中
-                    $('#patientsNature').selectpicker('refresh');
-                    $("#idCard").val(res.data.socialNo);
-                    $("#idCard").attr("title", res.data.socialNo);
-                    $("#address").val(res.data.address);
-                    if (res.data.name != null && res.data.name != "") {
-                        $("#editUser").show();
+                    if (res.data != null) {
+                        $("#cardNo").blur();
+                        $("#userName").val(res.data.name);
+                        $("#userName").blur();
+                        $("#userNameReadOnly").val(res.data.name);
+                        $("#age").val(res.data.age);
+                        $("#age").blur();
+                        $("#gender").selectpicker('val', res.data.sex);
+                        $("#gender").selectpicker('refresh');
+                        $("#gender").blur();
+                        $("#birthDayReadonly").val(res.data.birthDayStr);
+                        $("#birthDayReadonly").attr("title", res.data.birthDayStr);
+                        $("#birthDay").val(res.data.birthDayStr);
+                        $("#birthDay").blur();
+                        $("#phoneNum").val(res.data.phoneNo);
+                        $("#phoneNum").attr("title", res.data.phoneNo);
+                        $("#phoneNum").blur();
+                        $("#patientsNature").selectpicker('val', res.responseType);//默认选中
+                        $('#patientsNature').selectpicker('refresh');
+                        $("#patientsNature").blur();
+                        $("#idCard").val(res.data.socialNo);
+                        $("#idCard").attr("title", res.data.socialNo);
+                        $("#idCard").blur();
+                        $("#address").val(res.data.address);
+                        $("#address").blur();
+                        if (res.data.name != null && res.data.name != "") {
+                            $("#editUser").show();
+                        }
+                        readonlyOrNot(true);
+                    } else {
+                        $("#newCardModal").modal();
                     }
                 } else {
                     new PNotify({
@@ -683,22 +713,235 @@ function cardNoChange() {
     }
 }
 
+/**
+ * 病人姓名输入改变事件
+ */
+function userNameChange() {
+    if (window.ActiveXObject || "ActiveXObject" in window) {
+        $("#userName").on('input propertychange', function () {
+            refeshPatinetList(true);
+        });
+    } else {
+        $("#userName").on('input οninput', function () {
+            refeshPatinetList(true);
+        });
+    }
+}
+
+
+/**
+ * 校验收款金额
+ */
+function checkFee() {
+    var cash = parseFloat($("#cash").val());
+    var realMoney = parseFloat($("#realMoney").val());
+    realMoney = realMoney.toFixed(2);
+    $("#realMoney").val(realMoney)
+    if (cash < realMoney) {
+        new PNotify({
+            title: '错误提示',
+            text: "收款金额不能少于实收金额!",
+            type: 'error',
+            hide: true,
+            styling: 'bootstrap3'
+        });
+    } else if (cash > realMoney) {
+        if ($("#payType").val() == 1) {
+            var changeAmount = cash - realMoney;
+            $("#changeAmount").val(changeAmount.toFixed(2));
+        } else {
+            new PNotify({
+                title: '错误提示',
+                text: "非现金收款金额不能大于实收金额!",
+                type: 'error',
+                hide: true,
+                styling: 'bootstrap3'
+            });
+        }
+    }
+    //计算和设置折扣比例
+    var amountMoneyConfirm = parseFloat($("#amountMoneyConfirm").text());
+    var discount = realMoney / amountMoneyConfirm * 100;
+    $("#discount").text(discount.toFixed(2))
+}
 
 /**
  * 根据病人姓名输入框内容动态加载病人列表
  */
 function initUserList() {
+    //var width=$("#userName").css("width");
     var settings = {
         trigger: 'click',
         content: '',
-        width: $("#userName").css("width"),
+        width: 170,
         multi: true,
         closeable: false,
         style: '',
         delay: 300,
         padding: true,
+        height: 300
     };
-    $('#userName').webuiPopover('destroy').webuiPopover(settings);
+    var webuiPopover = $('#userName').webuiPopover('destroy').webuiPopover(settings);
+    //用户姓名选中事件
+    $("#userName").on("click", function (t) {
+        if ($(webuiPopover).css("display") == "block") {
+            refeshPatinetList(true);
+        }
+    });
+
+
+}
+
+/**
+ * 刷新病人列表
+ */
+function refeshPatinetList(flag) {
+    //如果是重新加载病人列表,需要重置下标
+    if (flag) {
+        //重置下标
+        pageIndex = 0;
+        msg_list_loading = true;
+    }
+    var userName = $('#userName').val();
+    if (!(userName == null || userName == "" || isChinese(userName))) {
+        return;
+    }
+    $.ajax({
+        type: "GET",
+        url: '/thmz/getPatientMiByName?name=' + userName + "&pageIndex=" + pageIndex,
+        contentType: "application/json;charset=UTF-8",
+        dataType: "json",
+        headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
+        success: function (res) {
+            if (res == '401' || res == 401) {
+                window.location.href = '/thmz/login/view'
+                return;
+            }
+            if (res.code == 0) {
+                if (res.data != null && res.data.length > 0) {
+                    $("#webuiPopover0").css("display", "block");
+                    var html = '<div class="list-group">';
+                    for (var i = 0; i < res.data.length; i++) {
+                        var mzPatientMi = res.data[i];
+                        html += '<a href="#" class="list-group-item list-group-item-action" onclick="fillPatinet(\'' + mzPatientMi.patientId + '\')">';
+                        var sex = "未知";
+                        if (mzPatientMi.sex == 1) {
+                            html += '<img src="/thmz/images/boy.png"/>'
+                            sex = "男";
+                        } else if (mzPatientMi.sex == 2) {
+                            html += '<img src="/thmz/images/girl.png"/>'
+                            sex = "女";
+                        } else if (mzPatientMi.sex == 0 || mzPatientMi.sex == null) {
+                            html += '<img src="/thmz/images/girl_or_boy.png"/>'
+                            sex = "未知";
+                        }
+                        html += '<div>' + mzPatientMi.name + '&nbsp;' + sex + '&nbsp;';
+                        if (mzPatientMi.age != null && mzPatientMi.age != "") {
+                            html += mzPatientMi.age + '岁';
+                        } else {
+                            html += '**岁';
+                        }
+                        if (mzPatientMi.phoneNo != null && mzPatientMi.phoneNo != "") {
+                            html += '<span>' + mzPatientMi.phoneNo + '</span>';
+                        }
+                        html += '</div></a>';
+                    }
+                    html += '</div>';
+                    if (flag) {
+                        $("div.webui-popover-content").html("");
+                    }
+                    $("div.webui-popover-content").append(html);
+                    $("div.arrow").css("left", "23px");
+                    refeshPatinetListScrollEvent();
+                } else {
+                    $("#webuiPopover0").css("display", "none");
+                }
+            }
+            //查询完成,设置加载完成
+            msg_list_loading = false;
+        }
+    });
+}
+
+/**
+ * 病人下拉列表滚动条滚动到底部时继续加载新纪录
+ */
+function refeshPatinetListScrollEvent() {
+    $('.webui-popover-content').scroll(function (event) {
+        var top = $(this).scrollTop();
+        var height = $(this).height();
+        var scrollHeight = $(this).get(0).scrollHeight;
+        if (scrollHeight <= top + height) {
+            if (!msg_list_loading) {
+                msg_list_loading = true;
+                pageIndex = pageIndex + 1;
+                refeshPatinetList(false);
+            }
+        }
+    });
+}
+
+/**
+ * 按照病人id查询病人信息
+ * @param patientId
+ */
+function fillPatinet(patientId) {
+    $.ajax({
+        type: "GET",
+        url: '/thmz/getByPatientId?patientId=' + patientId,
+        contentType: "application/json;charset=UTF-8",
+        dataType: "json",
+        headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
+        success: function (res) {
+            if (res == '401' || res == 401) {
+                window.location.href = '/thmz/login/view'
+                return;
+            }
+            if (res.code == 0) {
+                if (res.data != null) {
+                    $("#cardNo").val(res.data.icCardNo);
+                    $("#cardNo").attr("title", res.data.icCardNo);
+                    $("#cardNo").blur();
+                    $("#userName").val(res.data.name);
+                    $("#userName").blur();
+                    $("#userNameReadOnly").val(res.data.name);
+                    $("#age").val(res.data.age);
+                    $("#age").blur();
+                    $("#gender").selectpicker('val', res.data.sex);
+                    $("#gender").selectpicker('refresh');
+                    $("#gender").blur();
+                    $("#birthDayReadonly").val(res.data.birthDayStr);
+                    $("#birthDayReadonly").attr("title", res.data.birthDayStr);
+                    $("#birthDayReadonly").blur();
+                    $("#birthDay").val(res.data.birthDayStr);
+                    $("#birthDay").blur();
+                    $("#phoneNum").val(res.data.phoneNo);
+                    $("#phoneNum").attr("title", res.data.phoneNo);
+                    $("#phoneNum").blur();
+                    $("#patientsNature").selectpicker('val', res.responseType);//默认选中
+                    $('#patientsNature').selectpicker('refresh');
+                    $("#patientsNature").blur();
+                    $("#idCard").val(res.data.socialNo);
+                    $("#idCard").attr("title", res.data.socialNo);
+                    $("#idCard").blur();
+                    $("#address").val(res.data.address);
+                    $("#address").blur();
+                    if (res.data.name != null && res.data.name != "") {
+                        $("#editUser").show();
+                    }
+                    readonlyOrNot(true);
+                }
+            } else {
+                new PNotify({
+                    title: '错误提示',
+                    text: res.message,
+                    type: 'error',
+                    hide: false,
+                    styling: 'bootstrap3'
+                });
+            }
+        }
+    });
 }
 
 
@@ -707,4 +950,69 @@ function initUserList() {
  */
 function closeThisParent(obj) {
     $(obj).parent().parent().remove();
+}
+
+/**
+ * 科室与时间区间下拉选改变时清空输入框内容
+ */
+function emptyInput() {
+    $('#doctor').empty();
+    $('#doctor').selectpicker('refresh');
+    $("#registrationFee").val(0.00);
+    $("#hospitalFee").val(0.00);
+    $("#checkFee").val(0.00);
+    $("#amountMoney").text(0.00);
+    $("#amountMoneyConfirm").text(0.00);
+    $("#realMoney").val(0.00);
+}
+
+/**
+ * 给某些域增加title或者清除title
+ * @param obj
+ */
+function clearTextOrTitle(obj) {
+    if ($(obj).val() == null || $(obj).val().length == 0) {
+        $(obj).attr("title", null);
+    } else {
+        $(obj).attr("title", $(obj).val());
+    }
+}
+
+/**
+ * 当按照卡号查询时,病人信息输入框不可编辑,当清空输入框时可编辑
+ * @param flag
+ */
+function readonlyOrNot(flag) {
+    if (flag) {
+        $("#cardNo").attr("readonly", "readonly");
+        $("#userName").attr("readonly", "readonly");
+        $("#age").attr("readonly", "readonly");
+        $("#gender").attr("disabled", "disabled");
+        $("#phoneNum").attr("readonly", "readonly");
+        $("#patientsNature").attr("disabled", "disabled");
+        $("#idCard").attr("readonly", "readonly");
+        $("#address").attr("readonly", "readonly");
+        $("#birthDayReadonly").removeClass("hide").addClass("in");
+        $("#birthDayGroup").removeClass("in").addClass("hide");
+        $("#userName").removeClass("in").addClass("hide");
+        $("#userNameReadOnly").removeClass("hide").addClass("in");
+        $("#webuiPopover0").css("display", "none");
+    } else {
+        $("#cardNo").removeAttr("readonly");
+        $("#userName").removeAttr("readonly");
+        $("#age").removeAttr("readonly");
+        $("#gender").removeAttr("disabled");
+        $("#gender").next().removeClass("disabled");
+        $("#phoneNum").removeAttr("readonly");
+        $("#patientsNature").removeAttr("disabled");
+        $("#patientsNature").next().removeClass("disabled");
+        $("#idCard").removeAttr("readonly");
+        $("#address").removeAttr("readonly");
+        $("#birthDayReadonly").removeClass("in").addClass("hide");
+        $("#birthDayGroup").removeClass("hide").addClass("in");
+        $("#userName").removeClass("hide").addClass("in");
+        $("#userNameReadOnly").removeClass("in").addClass("hide");
+        $("#webuiPopover0").css("display", "block");
+    }
+
 }

+ 0 - 1650
src/main/resources/static/js/validation/jquery.validate.js

@@ -1,1650 +0,0 @@
-/*!
- * jQuery Validation Plugin v1.19.1
- *
- * https://jqueryvalidation.org/
- *
- * Copyright (c) 2019 Jörn Zaefferer
- * Released under the MIT license
- */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-		define( ["jquery"], factory );
-	} else if (typeof module === "object" && module.exports) {
-		module.exports = factory( require( "jquery" ) );
-	} else {
-		factory( jQuery );
-	}
-}(function( $ ) {
-
-$.extend( $.fn, {
-
-	// https://jqueryvalidation.org/validate/
-	validate: function( options ) {
-
-		// If nothing is selected, return nothing; can't chain anyway
-		if ( !this.length ) {
-			if ( options && options.debug && window.console ) {
-				console.warn( "Nothing selected, can't validate, returning nothing." );
-			}
-			return;
-		}
-
-		// Check if a validator for this form was already created
-		var validator = $.data( this[ 0 ], "validator" );
-		if ( validator ) {
-			return validator;
-		}
-
-		// Add novalidate tag if HTML5.
-		this.attr( "novalidate", "novalidate" );
-
-		validator = new $.validator( options, this[ 0 ] );
-		$.data( this[ 0 ], "validator", validator );
-
-		if ( validator.settings.onsubmit ) {
-
-			this.on( "click.validate", ":submit", function( event ) {
-
-				// Track the used submit button to properly handle scripted
-				// submits later.
-				validator.submitButton = event.currentTarget;
-
-				// Allow suppressing validation by adding a cancel class to the submit button
-				if ( $( this ).hasClass( "cancel" ) ) {
-					validator.cancelSubmit = true;
-				}
-
-				// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
-				if ( $( this ).attr( "formnovalidate" ) !== undefined ) {
-					validator.cancelSubmit = true;
-				}
-			} );
-
-			// Validate the form on submit
-			this.on( "submit.validate", function( event ) {
-				if ( validator.settings.debug ) {
-
-					// Prevent form submit to be able to see console output
-					event.preventDefault();
-				}
-
-				function handle() {
-					var hidden, result;
-
-					// Insert a hidden input as a replacement for the missing submit button
-					// The hidden input is inserted in two cases:
-					//   - A user defined a `submitHandler`
-					//   - There was a pending request due to `remote` method and `stopRequest()`
-					//     was called to submit the form in case it's valid
-					if ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {
-						hidden = $( "<input type='hidden'/>" )
-							.attr( "name", validator.submitButton.name )
-							.val( $( validator.submitButton ).val() )
-							.appendTo( validator.currentForm );
-					}
-
-					if ( validator.settings.submitHandler && !validator.settings.debug ) {
-						result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
-						if ( hidden ) {
-
-							// And clean up afterwards; thanks to no-block-scope, hidden can be referenced
-							hidden.remove();
-						}
-						if ( result !== undefined ) {
-							return result;
-						}
-						return false;
-					}
-					return true;
-				}
-
-				// Prevent submit for invalid forms or custom submit handlers
-				if ( validator.cancelSubmit ) {
-					validator.cancelSubmit = false;
-					return handle();
-				}
-				if ( validator.form() ) {
-					if ( validator.pendingRequest ) {
-						validator.formSubmitted = true;
-						return false;
-					}
-					return handle();
-				} else {
-					validator.focusInvalid();
-					return false;
-				}
-			} );
-		}
-
-		return validator;
-	},
-
-	// https://jqueryvalidation.org/valid/
-	valid: function() {
-		var valid, validator, errorList;
-
-		if ( $( this[ 0 ] ).is( "form" ) ) {
-			valid = this.validate().form();
-		} else {
-			errorList = [];
-			valid = true;
-			validator = $( this[ 0 ].form ).validate();
-			this.each( function() {
-				valid = validator.element( this ) && valid;
-				if ( !valid ) {
-					errorList = errorList.concat( validator.errorList );
-				}
-			} );
-			validator.errorList = errorList;
-		}
-		return valid;
-	},
-
-	// https://jqueryvalidation.org/rules/
-	rules: function( command, argument ) {
-		var element = this[ 0 ],
-			isContentEditable = typeof this.attr( "contenteditable" ) !== "undefined" && this.attr( "contenteditable" ) !== "false",
-			settings, staticRules, existingRules, data, param, filtered;
-
-		// If nothing is selected, return empty object; can't chain anyway
-		if ( element == null ) {
-			return;
-		}
-
-		if ( !element.form && isContentEditable ) {
-			element.form = this.closest( "form" )[ 0 ];
-			element.name = this.attr( "name" );
-		}
-
-		if ( element.form == null ) {
-			return;
-		}
-
-		if ( command ) {
-			settings = $.data( element.form, "validator" ).settings;
-			staticRules = settings.rules;
-			existingRules = $.validator.staticRules( element );
-			switch ( command ) {
-			case "add":
-				$.extend( existingRules, $.validator.normalizeRule( argument ) );
-
-				// Remove messages from rules, but allow them to be set separately
-				delete existingRules.messages;
-				staticRules[ element.name ] = existingRules;
-				if ( argument.messages ) {
-					settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
-				}
-				break;
-			case "remove":
-				if ( !argument ) {
-					delete staticRules[ element.name ];
-					return existingRules;
-				}
-				filtered = {};
-				$.each( argument.split( /\s/ ), function( index, method ) {
-					filtered[ method ] = existingRules[ method ];
-					delete existingRules[ method ];
-				} );
-				return filtered;
-			}
-		}
-
-		data = $.validator.normalizeRules(
-		$.extend(
-			{},
-			$.validator.classRules( element ),
-			$.validator.attributeRules( element ),
-			$.validator.dataRules( element ),
-			$.validator.staticRules( element )
-		), element );
-
-		// Make sure required is at front
-		if ( data.required ) {
-			param = data.required;
-			delete data.required;
-			data = $.extend( { required: param }, data );
-		}
-
-		// Make sure remote is at back
-		if ( data.remote ) {
-			param = data.remote;
-			delete data.remote;
-			data = $.extend( data, { remote: param } );
-		}
-
-		return data;
-	}
-} );
-
-// Custom selectors
-$.extend( $.expr.pseudos || $.expr[ ":" ], {		// '|| $.expr[ ":" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support
-
-	// https://jqueryvalidation.org/blank-selector/
-	blank: function( a ) {
-		return !$.trim( "" + $( a ).val() );
-	},
-
-	// https://jqueryvalidation.org/filled-selector/
-	filled: function( a ) {
-		var val = $( a ).val();
-		return val !== null && !!$.trim( "" + val );
-	},
-
-	// https://jqueryvalidation.org/unchecked-selector/
-	unchecked: function( a ) {
-		return !$( a ).prop( "checked" );
-	}
-} );
-
-// Constructor for validator
-$.validator = function( options, form ) {
-	this.settings = $.extend( true, {}, $.validator.defaults, options );
-	this.currentForm = form;
-	this.init();
-};
-
-// https://jqueryvalidation.org/jQuery.validator.format/
-$.validator.format = function( source, params ) {
-	if ( arguments.length === 1 ) {
-		return function() {
-			var args = $.makeArray( arguments );
-			args.unshift( source );
-			return $.validator.format.apply( this, args );
-		};
-	}
-	if ( params === undefined ) {
-		return source;
-	}
-	if ( arguments.length > 2 && params.constructor !== Array  ) {
-		params = $.makeArray( arguments ).slice( 1 );
-	}
-	if ( params.constructor !== Array ) {
-		params = [ params ];
-	}
-	$.each( params, function( i, n ) {
-		source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
-			return n;
-		} );
-	} );
-	return source;
-};
-
-$.extend( $.validator, {
-
-	defaults: {
-		messages: {},
-		groups: {},
-		rules: {},
-		errorClass: "error",
-		pendingClass: "pending",
-		validClass: "valid",
-		errorElement: "label",
-		focusCleanup: false,
-		focusInvalid: true,
-		errorContainer: $( [] ),
-		errorLabelContainer: $( [] ),
-		onsubmit: true,
-		ignore: ":hidden",
-		ignoreTitle: false,
-		onfocusin: function( element ) {
-			this.lastActive = element;
-
-			// Hide error label and remove error class on focus if enabled
-			if ( this.settings.focusCleanup ) {
-				if ( this.settings.unhighlight ) {
-					this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
-				}
-				this.hideThese( this.errorsFor( element ) );
-			}
-		},
-		onfocusout: function( element ) {
-			if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {
-				this.element( element );
-			}
-		},
-		onkeyup: function( element, event ) {
-
-			// Avoid revalidate the field when pressing one of the following keys
-			// Shift       => 16
-			// Ctrl        => 17
-			// Alt         => 18
-			// Caps lock   => 20
-			// End         => 35
-			// Home        => 36
-			// Left arrow  => 37
-			// Up arrow    => 38
-			// Right arrow => 39
-			// Down arrow  => 40
-			// Insert      => 45
-			// Num lock    => 144
-			// AltGr key   => 225
-			var excludedKeys = [
-				16, 17, 18, 20, 35, 36, 37,
-				38, 39, 40, 45, 144, 225
-			];
-
-			if ( event.which === 9 && this.elementValue( element ) === "" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {
-				return;
-			} else if ( element.name in this.submitted || element.name in this.invalid ) {
-				this.element( element );
-			}
-		},
-		onclick: function( element ) {
-
-			// Click on selects, radiobuttons and checkboxes
-			if ( element.name in this.submitted ) {
-				this.element( element );
-
-			// Or option elements, check parent select in that case
-			} else if ( element.parentNode.name in this.submitted ) {
-				this.element( element.parentNode );
-			}
-		},
-		highlight: function( element, errorClass, validClass ) {
-			if ( element.type === "radio" ) {
-				this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
-			} else {
-				$( element ).addClass( errorClass ).removeClass( validClass );
-			}
-		},
-		unhighlight: function( element, errorClass, validClass ) {
-			if ( element.type === "radio" ) {
-				this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
-			} else {
-				$( element ).removeClass( errorClass ).addClass( validClass );
-			}
-		}
-	},
-
-	// https://jqueryvalidation.org/jQuery.validator.setDefaults/
-	setDefaults: function( settings ) {
-		$.extend( $.validator.defaults, settings );
-	},
-
-	messages: {
-		required: "This field is required.",
-		remote: "Please fix this field.",
-		email: "Please enter a valid email address.",
-		url: "Please enter a valid URL.",
-		date: "Please enter a valid date.",
-		dateISO: "Please enter a valid date (ISO).",
-		number: "Please enter a valid number.",
-		digits: "Please enter only digits.",
-		equalTo: "Please enter the same value again.",
-		maxlength: $.validator.format( "Please enter no more than {0} characters." ),
-		minlength: $.validator.format( "Please enter at least {0} characters." ),
-		rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
-		range: $.validator.format( "Please enter a value between {0} and {1}." ),
-		max: $.validator.format( "Please enter a value less than or equal to {0}." ),
-		min: $.validator.format( "Please enter a value greater than or equal to {0}." ),
-		step: $.validator.format( "Please enter a multiple of {0}." )
-	},
-
-	autoCreateRanges: false,
-
-	prototype: {
-
-		init: function() {
-			this.labelContainer = $( this.settings.errorLabelContainer );
-			this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );
-			this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
-			this.submitted = {};
-			this.valueCache = {};
-			this.pendingRequest = 0;
-			this.pending = {};
-			this.invalid = {};
-			this.reset();
-
-			var currentForm = this.currentForm,
-				groups = ( this.groups = {} ),
-				rules;
-			$.each( this.settings.groups, function( key, value ) {
-				if ( typeof value === "string" ) {
-					value = value.split( /\s/ );
-				}
-				$.each( value, function( index, name ) {
-					groups[ name ] = key;
-				} );
-			} );
-			rules = this.settings.rules;
-			$.each( rules, function( key, value ) {
-				rules[ key ] = $.validator.normalizeRule( value );
-			} );
-
-			function delegate( event ) {
-				var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false";
-
-				// Set form expando on contenteditable
-				if ( !this.form && isContentEditable ) {
-					this.form = $( this ).closest( "form" )[ 0 ];
-					this.name = $( this ).attr( "name" );
-				}
-
-				// Ignore the element if it belongs to another form. This will happen mainly
-				// when setting the `form` attribute of an input to the id of another form.
-				if ( currentForm !== this.form ) {
-					return;
-				}
-
-				var validator = $.data( this.form, "validator" ),
-					eventType = "on" + event.type.replace( /^validate/, "" ),
-					settings = validator.settings;
-				if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {
-					settings[ eventType ].call( validator, this, event );
-				}
-			}
-
-			$( this.currentForm )
-				.on( "focusin.validate focusout.validate keyup.validate",
-					":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
-					"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
-					"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
-					"[type='radio'], [type='checkbox'], [contenteditable], [type='button']", delegate )
-
-				// Support: Chrome, oldIE
-				// "select" is provided as event.target when clicking a option
-				.on( "click.validate", "select, option, [type='radio'], [type='checkbox']", delegate );
-
-			if ( this.settings.invalidHandler ) {
-				$( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler );
-			}
-		},
-
-		// https://jqueryvalidation.org/Validator.form/
-		form: function() {
-			this.checkForm();
-			$.extend( this.submitted, this.errorMap );
-			this.invalid = $.extend( {}, this.errorMap );
-			if ( !this.valid() ) {
-				$( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
-			}
-			this.showErrors();
-			return this.valid();
-		},
-
-		checkForm: function() {
-			this.prepareForm();
-			for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {
-				this.check( elements[ i ] );
-			}
-			return this.valid();
-		},
-
-		// https://jqueryvalidation.org/Validator.element/
-		element: function( element ) {
-			var cleanElement = this.clean( element ),
-				checkElement = this.validationTargetFor( cleanElement ),
-				v = this,
-				result = true,
-				rs, group;
-
-			if ( checkElement === undefined ) {
-				delete this.invalid[ cleanElement.name ];
-			} else {
-				this.prepareElement( checkElement );
-				this.currentElements = $( checkElement );
-
-				// If this element is grouped, then validate all group elements already
-				// containing a value
-				group = this.groups[ checkElement.name ];
-				if ( group ) {
-					$.each( this.groups, function( name, testgroup ) {
-						if ( testgroup === group && name !== checkElement.name ) {
-							cleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );
-							if ( cleanElement && cleanElement.name in v.invalid ) {
-								v.currentElements.push( cleanElement );
-								result = v.check( cleanElement ) && result;
-							}
-						}
-					} );
-				}
-
-				rs = this.check( checkElement ) !== false;
-				result = result && rs;
-				if ( rs ) {
-					this.invalid[ checkElement.name ] = false;
-				} else {
-					this.invalid[ checkElement.name ] = true;
-				}
-
-				if ( !this.numberOfInvalids() ) {
-
-					// Hide error containers on last error
-					this.toHide = this.toHide.add( this.containers );
-				}
-				this.showErrors();
-
-				// Add aria-invalid status for screen readers
-				$( element ).attr( "aria-invalid", !rs );
-			}
-
-			return result;
-		},
-
-		// https://jqueryvalidation.org/Validator.showErrors/
-		showErrors: function( errors ) {
-			if ( errors ) {
-				var validator = this;
-
-				// Add items to error list and map
-				$.extend( this.errorMap, errors );
-				this.errorList = $.map( this.errorMap, function( message, name ) {
-					return {
-						message: message,
-						element: validator.findByName( name )[ 0 ]
-					};
-				} );
-
-				// Remove items from success list
-				this.successList = $.grep( this.successList, function( element ) {
-					return !( element.name in errors );
-				} );
-			}
-			if ( this.settings.showErrors ) {
-				this.settings.showErrors.call( this, this.errorMap, this.errorList );
-			} else {
-				this.defaultShowErrors();
-			}
-		},
-
-		// https://jqueryvalidation.org/Validator.resetForm/
-		resetForm: function() {
-			if ( $.fn.resetForm ) {
-				$( this.currentForm ).resetForm();
-			}
-			this.invalid = {};
-			this.submitted = {};
-			this.prepareForm();
-			this.hideErrors();
-			var elements = this.elements()
-				.removeData( "previousValue" )
-				.removeAttr( "aria-invalid" );
-
-			this.resetElements( elements );
-		},
-
-		resetElements: function( elements ) {
-			var i;
-
-			if ( this.settings.unhighlight ) {
-				for ( i = 0; elements[ i ]; i++ ) {
-					this.settings.unhighlight.call( this, elements[ i ],
-						this.settings.errorClass, "" );
-					this.findByName( elements[ i ].name ).removeClass( this.settings.validClass );
-				}
-			} else {
-				elements
-					.removeClass( this.settings.errorClass )
-					.removeClass( this.settings.validClass );
-			}
-		},
-
-		numberOfInvalids: function() {
-			return this.objectLength( this.invalid );
-		},
-
-		objectLength: function( obj ) {
-			/* jshint unused: false */
-			var count = 0,
-				i;
-			for ( i in obj ) {
-
-				// This check allows counting elements with empty error
-				// message as invalid elements
-				if ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {
-					count++;
-				}
-			}
-			return count;
-		},
-
-		hideErrors: function() {
-			this.hideThese( this.toHide );
-		},
-
-		hideThese: function( errors ) {
-			errors.not( this.containers ).text( "" );
-			this.addWrapper( errors ).hide();
-		},
-
-		valid: function() {
-			return this.size() === 0;
-		},
-
-		size: function() {
-			return this.errorList.length;
-		},
-
-		focusInvalid: function() {
-			if ( this.settings.focusInvalid ) {
-				try {
-					$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )
-					.filter( ":visible" )
-					.trigger( "focus" )
-
-					// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
-					.trigger( "focusin" );
-				} catch ( e ) {
-
-					// Ignore IE throwing errors when focusing hidden elements
-				}
-			}
-		},
-
-		findLastActive: function() {
-			var lastActive = this.lastActive;
-			return lastActive && $.grep( this.errorList, function( n ) {
-				return n.element.name === lastActive.name;
-			} ).length === 1 && lastActive;
-		},
-
-		elements: function() {
-			var validator = this,
-				rulesCache = {};
-
-			// Select all valid inputs inside the form (no submit or reset buttons)
-			return $( this.currentForm )
-			.find( "input, select, textarea, [contenteditable]" )
-			.not( ":submit, :reset, :image, :disabled" )
-			.not( this.settings.ignore )
-			.filter( function() {
-				var name = this.name || $( this ).attr( "name" ); // For contenteditable
-				var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false";
-
-				if ( !name && validator.settings.debug && window.console ) {
-					console.error( "%o has no name assigned", this );
-				}
-
-				// Set form expando on contenteditable
-				if ( isContentEditable ) {
-					this.form = $( this ).closest( "form" )[ 0 ];
-					this.name = name;
-				}
-
-				// Ignore elements that belong to other/nested forms
-				if ( this.form !== validator.currentForm ) {
-					return false;
-				}
-
-				// Select only the first element for each name, and only those with rules specified
-				if ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
-					return false;
-				}
-
-				rulesCache[ name ] = true;
-				return true;
-			} );
-		},
-
-		clean: function( selector ) {
-			return $( selector )[ 0 ];
-		},
-
-		errors: function() {
-			var errorClass = this.settings.errorClass.split( " " ).join( "." );
-			return $( this.settings.errorElement + "." + errorClass, this.errorContext );
-		},
-
-		resetInternals: function() {
-			this.successList = [];
-			this.errorList = [];
-			this.errorMap = {};
-			this.toShow = $( [] );
-			this.toHide = $( [] );
-		},
-
-		reset: function() {
-			this.resetInternals();
-			this.currentElements = $( [] );
-		},
-
-		prepareForm: function() {
-			this.reset();
-			this.toHide = this.errors().add( this.containers );
-		},
-
-		prepareElement: function( element ) {
-			this.reset();
-			this.toHide = this.errorsFor( element );
-		},
-
-		elementValue: function( element ) {
-			var $element = $( element ),
-				type = element.type,
-				isContentEditable = typeof $element.attr( "contenteditable" ) !== "undefined" && $element.attr( "contenteditable" ) !== "false",
-				val, idx;
-
-			if ( type === "radio" || type === "checkbox" ) {
-				return this.findByName( element.name ).filter( ":checked" ).val();
-			} else if ( type === "number" && typeof element.validity !== "undefined" ) {
-				return element.validity.badInput ? "NaN" : $element.val();
-			}
-
-			if ( isContentEditable ) {
-				val = $element.text();
-			} else {
-				val = $element.val();
-			}
-
-			if ( type === "file" ) {
-
-				// Modern browser (chrome & safari)
-				if ( val.substr( 0, 12 ) === "C:\\fakepath\\" ) {
-					return val.substr( 12 );
-				}
-
-				// Legacy browsers
-				// Unix-based path
-				idx = val.lastIndexOf( "/" );
-				if ( idx >= 0 ) {
-					return val.substr( idx + 1 );
-				}
-
-				// Windows-based path
-				idx = val.lastIndexOf( "\\" );
-				if ( idx >= 0 ) {
-					return val.substr( idx + 1 );
-				}
-
-				// Just the file name
-				return val;
-			}
-
-			if ( typeof val === "string" ) {
-				return val.replace( /\r/g, "" );
-			}
-			return val;
-		},
-
-		check: function( element ) {
-			element = this.validationTargetFor( this.clean( element ) );
-
-			var rules = $( element ).rules(),
-				rulesCount = $.map( rules, function( n, i ) {
-					return i;
-				} ).length,
-				dependencyMismatch = false,
-				val = this.elementValue( element ),
-				result, method, rule, normalizer;
-
-			// Prioritize the local normalizer defined for this element over the global one
-			// if the former exists, otherwise user the global one in case it exists.
-			if ( typeof rules.normalizer === "function" ) {
-				normalizer = rules.normalizer;
-			} else if (	typeof this.settings.normalizer === "function" ) {
-				normalizer = this.settings.normalizer;
-			}
-
-			// If normalizer is defined, then call it to retreive the changed value instead
-			// of using the real one.
-			// Note that `this` in the normalizer is `element`.
-			if ( normalizer ) {
-				val = normalizer.call( element, val );
-
-				// Delete the normalizer from rules to avoid treating it as a pre-defined method.
-				delete rules.normalizer;
-			}
-
-			for ( method in rules ) {
-				rule = { method: method, parameters: rules[ method ] };
-				try {
-					result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
-
-					// If a method indicates that the field is optional and therefore valid,
-					// don't mark it as valid when there are no other rules
-					if ( result === "dependency-mismatch" && rulesCount === 1 ) {
-						dependencyMismatch = true;
-						continue;
-					}
-					dependencyMismatch = false;
-
-					if ( result === "pending" ) {
-						this.toHide = this.toHide.not( this.errorsFor( element ) );
-						return;
-					}
-
-					if ( !result ) {
-						this.formatAndAdd( element, rule );
-						return false;
-					}
-				} catch ( e ) {
-					if ( this.settings.debug && window.console ) {
-						console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
-					}
-					if ( e instanceof TypeError ) {
-						e.message += ".  Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
-					}
-
-					throw e;
-				}
-			}
-			if ( dependencyMismatch ) {
-				return;
-			}
-			if ( this.objectLength( rules ) ) {
-				this.successList.push( element );
-			}
-			return true;
-		},
-
-		// Return the custom message for the given element and validation method
-		// specified in the element's HTML5 data attribute
-		// return the generic message if present and no method specific message is present
-		customDataMessage: function( element, method ) {
-			return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() +
-				method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
-		},
-
-		// Return the custom message for the given element name and validation method
-		customMessage: function( name, method ) {
-			var m = this.settings.messages[ name ];
-			return m && ( m.constructor === String ? m : m[ method ] );
-		},
-
-		// Return the first defined argument, allowing empty strings
-		findDefined: function() {
-			for ( var i = 0; i < arguments.length; i++ ) {
-				if ( arguments[ i ] !== undefined ) {
-					return arguments[ i ];
-				}
-			}
-			return undefined;
-		},
-
-		// The second parameter 'rule' used to be a string, and extended to an object literal
-		// of the following form:
-		// rule = {
-		//     method: "method name",
-		//     parameters: "the given method parameters"
-		// }
-		//
-		// The old behavior still supported, kept to maintain backward compatibility with
-		// old code, and will be removed in the next major release.
-		defaultMessage: function( element, rule ) {
-			if ( typeof rule === "string" ) {
-				rule = { method: rule };
-			}
-
-			var message = this.findDefined(
-					this.customMessage( element.name, rule.method ),
-					this.customDataMessage( element, rule.method ),
-
-					// 'title' is never undefined, so handle empty string as undefined
-					!this.settings.ignoreTitle && element.title || undefined,
-					$.validator.messages[ rule.method ],
-					"<strong>Warning: No message defined for " + element.name + "</strong>"
-				),
-				theregex = /\$?\{(\d+)\}/g;
-			if ( typeof message === "function" ) {
-				message = message.call( this, rule.parameters, element );
-			} else if ( theregex.test( message ) ) {
-				message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
-			}
-
-			return message;
-		},
-
-		formatAndAdd: function( element, rule ) {
-			var message = this.defaultMessage( element, rule );
-
-			this.errorList.push( {
-				message: message,
-				element: element,
-				method: rule.method
-			} );
-
-			this.errorMap[ element.name ] = message;
-			this.submitted[ element.name ] = message;
-		},
-
-		addWrapper: function( toToggle ) {
-			if ( this.settings.wrapper ) {
-				toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
-			}
-			return toToggle;
-		},
-
-		defaultShowErrors: function() {
-			var i, elements, error;
-			for ( i = 0; this.errorList[ i ]; i++ ) {
-				error = this.errorList[ i ];
-				if ( this.settings.highlight ) {
-					this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
-				}
-				this.showLabel( error.element, error.message );
-			}
-			if ( this.errorList.length ) {
-				this.toShow = this.toShow.add( this.containers );
-			}
-			if ( this.settings.success ) {
-				for ( i = 0; this.successList[ i ]; i++ ) {
-					this.showLabel( this.successList[ i ] );
-				}
-			}
-			if ( this.settings.unhighlight ) {
-				for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {
-					this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
-				}
-			}
-			this.toHide = this.toHide.not( this.toShow );
-			this.hideErrors();
-			this.addWrapper( this.toShow ).show();
-		},
-
-		validElements: function() {
-			return this.currentElements.not( this.invalidElements() );
-		},
-
-		invalidElements: function() {
-			return $( this.errorList ).map( function() {
-				return this.element;
-			} );
-		},
-
-		showLabel: function( element, message ) {
-			var place, group, errorID, v,
-				error = this.errorsFor( element ),
-				elementID = this.idOrName( element ),
-				describedBy = $( element ).attr( "aria-describedby" );
-
-			if ( error.length ) {
-
-				// Refresh error/success class
-				error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
-
-				// Replace message on existing label
-				error.html( message );
-			} else {
-
-				// Create error element
-				error = $( "<" + this.settings.errorElement + ">" )
-					.attr( "id", elementID + "-error" )
-					.addClass( this.settings.errorClass )
-					.html( message || "" );
-
-				// Maintain reference to the element to be placed into the DOM
-				place = error;
-				if ( this.settings.wrapper ) {
-
-					// Make sure the element is visible, even in IE
-					// actually showing the wrapped element is handled elsewhere
-					place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
-				}
-				if ( this.labelContainer.length ) {
-					this.labelContainer.append( place );
-				} else if ( this.settings.errorPlacement ) {
-					this.settings.errorPlacement.call( this, place, $( element ) );
-				} else {
-					place.insertAfter( element );
-				}
-
-				// Link error back to the element
-				if ( error.is( "label" ) ) {
-
-					// If the error is a label, then associate using 'for'
-					error.attr( "for", elementID );
-
-					// If the element is not a child of an associated label, then it's necessary
-					// to explicitly apply aria-describedby
-				} else if ( error.parents( "label[for='" + this.escapeCssMeta( elementID ) + "']" ).length === 0 ) {
-					errorID = error.attr( "id" );
-
-					// Respect existing non-error aria-describedby
-					if ( !describedBy ) {
-						describedBy = errorID;
-					} else if ( !describedBy.match( new RegExp( "\\b" + this.escapeCssMeta( errorID ) + "\\b" ) ) ) {
-
-						// Add to end of list if not already present
-						describedBy += " " + errorID;
-					}
-					$( element ).attr( "aria-describedby", describedBy );
-
-					// If this element is grouped, then assign to all elements in the same group
-					group = this.groups[ element.name ];
-					if ( group ) {
-						v = this;
-						$.each( v.groups, function( name, testgroup ) {
-							if ( testgroup === group ) {
-								$( "[name='" + v.escapeCssMeta( name ) + "']", v.currentForm )
-									.attr( "aria-describedby", error.attr( "id" ) );
-							}
-						} );
-					}
-				}
-			}
-			if ( !message && this.settings.success ) {
-				error.text( "" );
-				if ( typeof this.settings.success === "string" ) {
-					error.addClass( this.settings.success );
-				} else {
-					this.settings.success( error, element );
-				}
-			}
-			this.toShow = this.toShow.add( error );
-		},
-
-		errorsFor: function( element ) {
-			var name = this.escapeCssMeta( this.idOrName( element ) ),
-				describer = $( element ).attr( "aria-describedby" ),
-				selector = "label[for='" + name + "'], label[for='" + name + "'] *";
-
-			// 'aria-describedby' should directly reference the error element
-			if ( describer ) {
-				selector = selector + ", #" + this.escapeCssMeta( describer )
-					.replace( /\s+/g, ", #" );
-			}
-
-			return this
-				.errors()
-				.filter( selector );
-		},
-
-		// See https://api.jquery.com/category/selectors/, for CSS
-		// meta-characters that should be escaped in order to be used with JQuery
-		// as a literal part of a name/id or any selector.
-		escapeCssMeta: function( string ) {
-			return string.replace( /([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1" );
-		},
-
-		idOrName: function( element ) {
-			return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
-		},
-
-		validationTargetFor: function( element ) {
-
-			// If radio/checkbox, validate first element in group instead
-			if ( this.checkable( element ) ) {
-				element = this.findByName( element.name );
-			}
-
-			// Always apply ignore filter
-			return $( element ).not( this.settings.ignore )[ 0 ];
-		},
-
-		checkable: function( element ) {
-			return ( /radio|checkbox/i ).test( element.type );
-		},
-
-		findByName: function( name ) {
-			return $( this.currentForm ).find( "[name='" + this.escapeCssMeta( name ) + "']" );
-		},
-
-		getLength: function( value, element ) {
-			switch ( element.nodeName.toLowerCase() ) {
-			case "select":
-				return $( "option:selected", element ).length;
-			case "input":
-				if ( this.checkable( element ) ) {
-					return this.findByName( element.name ).filter( ":checked" ).length;
-				}
-			}
-			return value.length;
-		},
-
-		depend: function( param, element ) {
-			return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;
-		},
-
-		dependTypes: {
-			"boolean": function( param ) {
-				return param;
-			},
-			"string": function( param, element ) {
-				return !!$( param, element.form ).length;
-			},
-			"function": function( param, element ) {
-				return param( element );
-			}
-		},
-
-		optional: function( element ) {
-			var val = this.elementValue( element );
-			return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
-		},
-
-		startRequest: function( element ) {
-			if ( !this.pending[ element.name ] ) {
-				this.pendingRequest++;
-				$( element ).addClass( this.settings.pendingClass );
-				this.pending[ element.name ] = true;
-			}
-		},
-
-		stopRequest: function( element, valid ) {
-			this.pendingRequest--;
-
-			// Sometimes synchronization fails, make sure pendingRequest is never < 0
-			if ( this.pendingRequest < 0 ) {
-				this.pendingRequest = 0;
-			}
-			delete this.pending[ element.name ];
-			$( element ).removeClass( this.settings.pendingClass );
-			if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
-				$( this.currentForm ).submit();
-
-				// Remove the hidden input that was used as a replacement for the
-				// missing submit button. The hidden input is added by `handle()`
-				// to ensure that the value of the used submit button is passed on
-				// for scripted submits triggered by this method
-				if ( this.submitButton ) {
-					$( "input:hidden[name='" + this.submitButton.name + "']", this.currentForm ).remove();
-				}
-
-				this.formSubmitted = false;
-			} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {
-				$( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
-				this.formSubmitted = false;
-			}
-		},
-
-		previousValue: function( element, method ) {
-			method = typeof method === "string" && method || "remote";
-
-			return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
-				old: null,
-				valid: true,
-				message: this.defaultMessage( element, { method: method } )
-			} );
-		},
-
-		// Cleans up all forms and elements, removes validator-specific events
-		destroy: function() {
-			this.resetForm();
-
-			$( this.currentForm )
-				.off( ".validate" )
-				.removeData( "validator" )
-				.find( ".validate-equalTo-blur" )
-					.off( ".validate-equalTo" )
-					.removeClass( "validate-equalTo-blur" )
-				.find( ".validate-lessThan-blur" )
-					.off( ".validate-lessThan" )
-					.removeClass( "validate-lessThan-blur" )
-				.find( ".validate-lessThanEqual-blur" )
-					.off( ".validate-lessThanEqual" )
-					.removeClass( "validate-lessThanEqual-blur" )
-				.find( ".validate-greaterThanEqual-blur" )
-					.off( ".validate-greaterThanEqual" )
-					.removeClass( "validate-greaterThanEqual-blur" )
-				.find( ".validate-greaterThan-blur" )
-					.off( ".validate-greaterThan" )
-					.removeClass( "validate-greaterThan-blur" );
-		}
-
-	},
-
-	classRuleSettings: {
-		required: { required: true },
-		email: { email: true },
-		url: { url: true },
-		date: { date: true },
-		dateISO: { dateISO: true },
-		number: { number: true },
-		digits: { digits: true },
-		creditcard: { creditcard: true }
-	},
-
-	addClassRules: function( className, rules ) {
-		if ( className.constructor === String ) {
-			this.classRuleSettings[ className ] = rules;
-		} else {
-			$.extend( this.classRuleSettings, className );
-		}
-	},
-
-	classRules: function( element ) {
-		var rules = {},
-			classes = $( element ).attr( "class" );
-
-		if ( classes ) {
-			$.each( classes.split( " " ), function() {
-				if ( this in $.validator.classRuleSettings ) {
-					$.extend( rules, $.validator.classRuleSettings[ this ] );
-				}
-			} );
-		}
-		return rules;
-	},
-
-	normalizeAttributeRule: function( rules, type, method, value ) {
-
-		// Convert the value to a number for number inputs, and for text for backwards compability
-		// allows type="date" and others to be compared as strings
-		if ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
-			value = Number( value );
-
-			// Support Opera Mini, which returns NaN for undefined minlength
-			if ( isNaN( value ) ) {
-				value = undefined;
-			}
-		}
-
-		if ( value || value === 0 ) {
-			rules[ method ] = value;
-		} else if ( type === method && type !== "range" ) {
-
-			// Exception: the jquery validate 'range' method
-			// does not test for the html5 'range' type
-			rules[ method ] = true;
-		}
-	},
-
-	attributeRules: function( element ) {
-		var rules = {},
-			$element = $( element ),
-			type = element.getAttribute( "type" ),
-			method, value;
-
-		for ( method in $.validator.methods ) {
-
-			// Support for <input required> in both html5 and older browsers
-			if ( method === "required" ) {
-				value = element.getAttribute( method );
-
-				// Some browsers return an empty string for the required attribute
-				// and non-HTML5 browsers might have required="" markup
-				if ( value === "" ) {
-					value = true;
-				}
-
-				// Force non-HTML5 browsers to return bool
-				value = !!value;
-			} else {
-				value = $element.attr( method );
-			}
-
-			this.normalizeAttributeRule( rules, type, method, value );
-		}
-
-		// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
-		if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
-			delete rules.maxlength;
-		}
-
-		return rules;
-	},
-
-	dataRules: function( element ) {
-		var rules = {},
-			$element = $( element ),
-			type = element.getAttribute( "type" ),
-			method, value;
-
-		for ( method in $.validator.methods ) {
-			value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
-
-			// Cast empty attributes like `data-rule-required` to `true`
-			if ( value === "" ) {
-				value = true;
-			}
-
-			this.normalizeAttributeRule( rules, type, method, value );
-		}
-		return rules;
-	},
-
-	staticRules: function( element ) {
-		var rules = {},
-			validator = $.data( element.form, "validator" );
-
-		if ( validator.settings.rules ) {
-			rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};
-		}
-		return rules;
-	},
-
-	normalizeRules: function( rules, element ) {
-
-		// Handle dependency check
-		$.each( rules, function( prop, val ) {
-
-			// Ignore rule when param is explicitly false, eg. required:false
-			if ( val === false ) {
-				delete rules[ prop ];
-				return;
-			}
-			if ( val.param || val.depends ) {
-				var keepRule = true;
-				switch ( typeof val.depends ) {
-				case "string":
-					keepRule = !!$( val.depends, element.form ).length;
-					break;
-				case "function":
-					keepRule = val.depends.call( element, element );
-					break;
-				}
-				if ( keepRule ) {
-					rules[ prop ] = val.param !== undefined ? val.param : true;
-				} else {
-					$.data( element.form, "validator" ).resetElements( $( element ) );
-					delete rules[ prop ];
-				}
-			}
-		} );
-
-		// Evaluate parameters
-		$.each( rules, function( rule, parameter ) {
-			rules[ rule ] = $.isFunction( parameter ) && rule !== "normalizer" ? parameter( element ) : parameter;
-		} );
-
-		// Clean number parameters
-		$.each( [ "minlength", "maxlength" ], function() {
-			if ( rules[ this ] ) {
-				rules[ this ] = Number( rules[ this ] );
-			}
-		} );
-		$.each( [ "rangelength", "range" ], function() {
-			var parts;
-			if ( rules[ this ] ) {
-				if ( $.isArray( rules[ this ] ) ) {
-					rules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];
-				} else if ( typeof rules[ this ] === "string" ) {
-					parts = rules[ this ].replace( /[\[\]]/g, "" ).split( /[\s,]+/ );
-					rules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];
-				}
-			}
-		} );
-
-		if ( $.validator.autoCreateRanges ) {
-
-			// Auto-create ranges
-			if ( rules.min != null && rules.max != null ) {
-				rules.range = [ rules.min, rules.max ];
-				delete rules.min;
-				delete rules.max;
-			}
-			if ( rules.minlength != null && rules.maxlength != null ) {
-				rules.rangelength = [ rules.minlength, rules.maxlength ];
-				delete rules.minlength;
-				delete rules.maxlength;
-			}
-		}
-
-		return rules;
-	},
-
-	// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
-	normalizeRule: function( data ) {
-		if ( typeof data === "string" ) {
-			var transformed = {};
-			$.each( data.split( /\s/ ), function() {
-				transformed[ this ] = true;
-			} );
-			data = transformed;
-		}
-		return data;
-	},
-
-	// https://jqueryvalidation.org/jQuery.validator.addMethod/
-	addMethod: function( name, method, message ) {
-		$.validator.methods[ name ] = method;
-		$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
-		if ( method.length < 3 ) {
-			$.validator.addClassRules( name, $.validator.normalizeRule( name ) );
-		}
-	},
-
-	// https://jqueryvalidation.org/jQuery.validator.methods/
-	methods: {
-
-		// https://jqueryvalidation.org/required-method/
-		required: function( value, element, param ) {
-
-			// Check if dependency is met
-			if ( !this.depend( param, element ) ) {
-				return "dependency-mismatch";
-			}
-			if ( element.nodeName.toLowerCase() === "select" ) {
-
-				// Could be an array for select-multiple or a string, both are fine this way
-				var val = $( element ).val();
-				return val && val.length > 0;
-			}
-			if ( this.checkable( element ) ) {
-				return this.getLength( value, element ) > 0;
-			}
-			return value !== undefined && value !== null && value.length > 0;
-		},
-
-		// https://jqueryvalidation.org/email-method/
-		email: function( value, element ) {
-
-			// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
-			// Retrieved 2014-01-14
-			// If you have a problem with this implementation, report a bug against the above spec
-			// Or use custom methods to implement your own email validation
-			return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
-		},
-
-		// https://jqueryvalidation.org/url-method/
-		url: function( value, element ) {
-
-			// Copyright (c) 2010-2013 Diego Perini, MIT licensed
-			// https://gist.github.com/dperini/729294
-			// see also https://mathiasbynens.be/demo/url-regex
-			// modified to allow protocol-relative URLs
-			return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
-		},
-
-		// https://jqueryvalidation.org/date-method/
-		date: ( function() {
-			var called = false;
-
-			return function( value, element ) {
-				if ( !called ) {
-					called = true;
-					if ( this.settings.debug && window.console ) {
-						console.warn(
-							"The `date` method is deprecated and will be removed in version '2.0.0'.\n" +
-							"Please don't use it, since it relies on the Date constructor, which\n" +
-							"behaves very differently across browsers and locales. Use `dateISO`\n" +
-							"instead or one of the locale specific methods in `localizations/`\n" +
-							"and `additional-methods.js`."
-						);
-					}
-				}
-
-				return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
-			};
-		}() ),
-
-		// https://jqueryvalidation.org/dateISO-method/
-		dateISO: function( value, element ) {
-			return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
-		},
-
-		// https://jqueryvalidation.org/number-method/
-		number: function( value, element ) {
-			return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
-		},
-
-		// https://jqueryvalidation.org/digits-method/
-		digits: function( value, element ) {
-			return this.optional( element ) || /^\d+$/.test( value );
-		},
-
-		// https://jqueryvalidation.org/minlength-method/
-		minlength: function( value, element, param ) {
-			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
-			return this.optional( element ) || length >= param;
-		},
-
-		// https://jqueryvalidation.org/maxlength-method/
-		maxlength: function( value, element, param ) {
-			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
-			return this.optional( element ) || length <= param;
-		},
-
-		// https://jqueryvalidation.org/rangelength-method/
-		rangelength: function( value, element, param ) {
-			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
-			return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
-		},
-
-		// https://jqueryvalidation.org/min-method/
-		min: function( value, element, param ) {
-			return this.optional( element ) || value >= param;
-		},
-
-		// https://jqueryvalidation.org/max-method/
-		max: function( value, element, param ) {
-			return this.optional( element ) || value <= param;
-		},
-
-		// https://jqueryvalidation.org/range-method/
-		range: function( value, element, param ) {
-			return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
-		},
-
-		// https://jqueryvalidation.org/step-method/
-		step: function( value, element, param ) {
-			var type = $( element ).attr( "type" ),
-				errorMessage = "Step attribute on input type " + type + " is not supported.",
-				supportedTypes = [ "text", "number", "range" ],
-				re = new RegExp( "\\b" + type + "\\b" ),
-				notSupported = type && !re.test( supportedTypes.join() ),
-				decimalPlaces = function( num ) {
-					var match = ( "" + num ).match( /(?:\.(\d+))?$/ );
-					if ( !match ) {
-						return 0;
-					}
-
-					// Number of digits right of decimal point.
-					return match[ 1 ] ? match[ 1 ].length : 0;
-				},
-				toInt = function( num ) {
-					return Math.round( num * Math.pow( 10, decimals ) );
-				},
-				valid = true,
-				decimals;
-
-			// Works only for text, number and range input types
-			// TODO find a way to support input types date, datetime, datetime-local, month, time and week
-			if ( notSupported ) {
-				throw new Error( errorMessage );
-			}
-
-			decimals = decimalPlaces( param );
-
-			// Value can't have too many decimals
-			if ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {
-				valid = false;
-			}
-
-			return this.optional( element ) || valid;
-		},
-
-		// https://jqueryvalidation.org/equalTo-method/
-		equalTo: function( value, element, param ) {
-
-			// Bind to the blur event of the target in order to revalidate whenever the target field is updated
-			var target = $( param );
-			if ( this.settings.onfocusout && target.not( ".validate-equalTo-blur" ).length ) {
-				target.addClass( "validate-equalTo-blur" ).on( "blur.validate-equalTo", function() {
-					$( element ).valid();
-				} );
-			}
-			return value === target.val();
-		},
-
-		// https://jqueryvalidation.org/remote-method/
-		remote: function( value, element, param, method ) {
-			if ( this.optional( element ) ) {
-				return "dependency-mismatch";
-			}
-
-			method = typeof method === "string" && method || "remote";
-
-			var previous = this.previousValue( element, method ),
-				validator, data, optionDataString;
-
-			if ( !this.settings.messages[ element.name ] ) {
-				this.settings.messages[ element.name ] = {};
-			}
-			previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
-			this.settings.messages[ element.name ][ method ] = previous.message;
-
-			param = typeof param === "string" && { url: param } || param;
-			optionDataString = $.param( $.extend( { data: value }, param.data ) );
-			if ( previous.old === optionDataString ) {
-				return previous.valid;
-			}
-
-			previous.old = optionDataString;
-			validator = this;
-			this.startRequest( element );
-			data = {};
-			data[ element.name ] = value;
-			$.ajax( $.extend( true, {
-				mode: "abort",
-				port: "validate" + element.name,
-				dataType: "json",
-				data: data,
-				context: validator.currentForm,
-				success: function( response ) {
-					var valid = response === true || response === "true",
-						errors, message, submitted;
-
-					validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
-					if ( valid ) {
-						submitted = validator.formSubmitted;
-						validator.resetInternals();
-						validator.toHide = validator.errorsFor( element );
-						validator.formSubmitted = submitted;
-						validator.successList.push( element );
-						validator.invalid[ element.name ] = false;
-						validator.showErrors();
-					} else {
-						errors = {};
-						message = response || validator.defaultMessage( element, { method: method, parameters: value } );
-						errors[ element.name ] = previous.message = message;
-						validator.invalid[ element.name ] = true;
-						validator.showErrors( errors );
-					}
-					previous.valid = valid;
-					validator.stopRequest( element, valid );
-				}
-			}, param ) );
-			return "pending";
-		}
-	}
-
-} );
-
-// Ajax mode: abort
-// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
-// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
-
-var pendingRequests = {},
-	ajax;
-
-// Use a prefilter if available (1.5+)
-if ( $.ajaxPrefilter ) {
-	$.ajaxPrefilter( function( settings, _, xhr ) {
-		var port = settings.port;
-		if ( settings.mode === "abort" ) {
-			if ( pendingRequests[ port ] ) {
-				pendingRequests[ port ].abort();
-			}
-			pendingRequests[ port ] = xhr;
-		}
-	} );
-} else {
-
-	// Proxy ajax
-	ajax = $.ajax;
-	$.ajax = function( settings ) {
-		var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
-			port = ( "port" in settings ? settings : $.ajaxSettings ).port;
-		if ( mode === "abort" ) {
-			if ( pendingRequests[ port ] ) {
-				pendingRequests[ port ].abort();
-			}
-			pendingRequests[ port ] = ajax.apply( this, arguments );
-			return pendingRequests[ port ];
-		}
-		return ajax.apply( this, arguments );
-	};
-}
-return $;
-}));

+ 0 - 36
src/main/resources/static/js/validation/messages_zh.js

@@ -1,36 +0,0 @@
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-		define( ["jquery", "../jquery.validate"], factory );
-	} else if (typeof module === "object" && module.exports) {
-		module.exports = factory( require( "jquery" ) );
-	} else {
-		factory( jQuery );
-	}
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: ZH (Chinese, 中文 (Zhōngwén), 汉语, 漢語)
- */
-$.extend( $.validator.messages, {
-	required: "这是必填字段",
-	remote: "请修正此字段",
-	email: "请输入有效的电子邮件地址",
-	url: "请输入有效的网址",
-	date: "请输入有效的日期",
-	dateISO: "请输入有效的日期 (YYYY-MM-DD)",
-	number: "请输入有效的数字",
-	digits: "只能输入数字",
-	creditcard: "请输入有效的信用卡号码",
-	equalTo: "你的输入不相同",
-	extension: "请输入有效的后缀",
-	maxlength: $.validator.format( "最多可以输入 {0} 个字符" ),
-	minlength: $.validator.format( "最少要输入 {0} 个字符" ),
-	rangelength: $.validator.format( "请输入长度在 {0} 到 {1} 之间的字符串" ),
-	range: $.validator.format( "请输入范围在 {0} 到 {1} 之间的数值" ),
-	step: $.validator.format( "请输入 {0} 的整数倍值" ),
-	max: $.validator.format( "请输入不大于 {0} 的数值" ),
-	min: $.validator.format( "请输入不小于 {0} 的数值" )
-} );
-return $;
-}));

+ 3 - 1
src/main/resources/static/js/validator.js

@@ -243,7 +243,9 @@ var validator = (function($){
         // if already is marked as 'bad', then make sure the text is set again because i might change depending on validation
         var item = field.closest('.' + defaults.classes.item),
             warning;
-
+        if(item.hasClass("thmz_alert")){
+            item=field;
+        }
         if( item.hasClass(defaults.classes.bad) ){
             if( defaults.alerts )
                 item.find('.'+defaults.classes.alert).html(text);

+ 1 - 1
src/main/resources/templates/menu.html

@@ -29,7 +29,7 @@
     <link href="/thmz/css/pnotify/pnotify.nonblock.css" rel="stylesheet">
 </head>
 
-<body class="nav-md footer_fixed">
+<body class="nav-md">
 <div class="container body">
     <div class="main_container">
         <div class="col-md-3 left_col">

+ 117 - 53
src/main/resources/templates/registration.html

@@ -8,15 +8,38 @@
 <script src="/thmz/js/daterangepicker.js"></script>
 <script src="/thmz/js/icheck.js"></script>
 <script src="/thmz/js/jquery.webui-popover.min.js"></script>
-<script src="/thmz/js/validation/jquery.validate.js"></script>
-<script src="/thmz/js/validation/messages_zh.js"></script>
+<script src="/thmz/js/validator.js"></script>
 <script src="/thmz/js/registration.js"></script>
+<style>
+    .thmz_alert .alert::after {
+        content: '';
+        display: block;
+        height: 0;
+        width: 0;
+        border-color: transparent transparent #CE5454 transparent;
+        border-style: solid;
+        border-width: 11px 7px;
+        position: absolute;
+        left: 23px;
+        top: -23px;
+    }
+
+    .thmz_alert .alert {
+        float: right;
+        margin-right: 10px;
+        margin-top: 12px;
+    }
+
+    .thmz_group_alert .alert {
+        margin-top: 0px;
+    }
+</style>
 <div class="row">
     <div class="col-md-4 col-sm-4 col-xs-12">
         <div class="title">
             <div>新增挂号</div>
         </div>
-        <form class="form-horizontal form-label-left mz-fixed-form" novalidate id="regi_form" autocomplete="off">
+        <form class="form-horizontal form-label-left mz-fixed-form" novalidate id="regi_form" autocomplete="off" >
             <div class="item form-group">
                 <div class="col-md-6 col-sm-6 col-xs-12">
                     <button type="button" style="margin-left:14px;cursor: default;margin-bottom: 10px !important;"
@@ -31,24 +54,25 @@
                     </div>
                 </div>
             </div>
-            <div class="item form-group">
-                <div class="col-md-6 col-sm-6 col-xs-12">
+            <div class="item form-group thmz_alert">
+                <div class="col-md-6 col-sm-6 col-xs-12 item">
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="userName">姓名 <span
                             class="required">*</span>
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
-                        <input id="userName" class="form-control col-md-7 col-xs-12" rangelength="[2,10]"
-                               placeholder="姓名/卡号/手机号" required="true" type="text" data-placement="bottom-right">
+                        <input id="userName" class="form-control col-md-7 col-xs-12" data-validate-length-range="2,10"
+                               placeholder="姓名/卡号/手机号" required="required" type="text" data-placement="bottom-right">
+                        <input type='text' class="form-control hide" id='userNameReadOnly' readonly/>
                     </div>
                 </div>
-                <div class="col-md-6 col-sm-6 col-xs-12">
+                <div class="col-md-6 col-sm-6 col-xs-12 item thmz_group_alert">
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="age">年龄 <span
                             class="required">*</span>
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
                         <div class="input-group">
-                            <input id="age" class="form-control col-md-7 col-xs-12" type="number" required="true"
-                                   min="0" max="200"
+                            <input id="age" class="form-control col-md-7 col-xs-12" type="number"
+                                   data-validate-minmax="0,200" required="required"
                                    placeholder="请输入">
                             <div class="input-group-btn">
                                 <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"
@@ -69,8 +93,8 @@
                     </div>
                 </div>
             </div>
-            <div class="item form-group">
-                <div class="col-md-6 col-sm-6 col-xs-12">
+            <div class="item form-group thmz_alert">
+                <div class="col-md-6 col-sm-6 col-xs-12 item">
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="gender">性别 <span
                             class="required">*</span>
                     </label>
@@ -79,75 +103,81 @@
                         </select>
                     </div>
                 </div>
-                <div class="col-md-6 col-sm-6 col-xs-12">
+                <div class="col-md-6 col-sm-6 col-xs-12 item thmz_group_alert">
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="birthDayGroup">出生日期 <span
                             class="required">*</span>
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
                         <div class='input-group date' id='birthDayGroup'>
-                            <input type='text' class="form-control" required="true" id='birthDay'/>
+                            <input type='text' class="form-control" required="required" id='birthDay'
+                                   onchange="clearTextOrTitle(this)"/>
                             <span class="input-group-addon">
                             <span class="glyphicon glyphicon-calendar"></span>
                             </span>
                         </div>
+                        <input type='text' class="form-control hide" id='birthDayReadonly' readonly/>
                     </div>
                 </div>
             </div>
-            <div class="item form-group">
-                <div class="col-md-6 col-sm-6 col-xs-12">
+            <div class="item form-group thmz_alert">
+                <div class="col-md-6 col-sm-6 col-xs-12 item thmz_group_alert">
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="cardNo">卡号 <span
                             class="required">*</span>
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
                         <div class="input-group demo2">
-                            <input id="cardNo" class="form-control col-md-7 col-xs-12" maxlength="14"
-                                   placeholder="请输入" required="true" type="text">
+                            <input id="cardNo" class="form-control col-md-7 col-xs-12" type="text"
+                                   data-validate-length-range="1,8"
+                                   placeholder="请输入" required="required">
                             <span class="input-group-addon"><a href="#" style="cursor: default"><i
                                     class="fa fa-credit-card"></i></a></span>
                         </div>
                     </div>
                 </div>
-                <div class="col-md-6 col-sm-6 col-xs-12">
+                <div class="col-md-6 col-sm-6 col-xs-12 item">
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="phoneNum">手机号码 <span
                             class="required">*</span>
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
-                        <input id="phoneNum" class="form-control col-md-7 col-xs-12" range="[11,11]"
-                               placeholder="请输入" required="true" type="text">
+                        <input id="phoneNum" class="form-control col-md-7 col-xs-12" type="text"
+                               data-validate-length-range="11,11"
+                               placeholder="请输入" required="required" onchange="clearTextOrTitle(this)">
                     </div>
                 </div>
             </div>
-            <div class="item form-group">
-                <div class="col-md-6 col-sm-6 col-xs-12">
+            <div class="item form-group thmz_alert">
+                <div class="col-md-6 col-sm-6 col-xs-12 item">
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="patientsNature">病人性质 <span
                             class="required">*</span>
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
-                        <select class="form-control selectpicker show-tick" required="true" id="patientsNature">
+                        <select class="form-control selectpicker show-tick" required="required" id="patientsNature">
                         </select>
                     </div>
                 </div>
-                <div class="col-md-6 col-sm-6 col-xs-12">
+                <div class="col-md-6 col-sm-6 col-xs-12 item thmz_group_alert">
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="idCard">身份证 <span
                             class="required">*</span>
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
                         <div class="input-group demo2">
-                            <input id="idCard" class="form-control col-md-7 col-xs-12" maxlength="18"
-                                   placeholder="请输入" required="true" type="text">
+                            <input id="idCard" class="form-control col-md-7 col-xs-12" type="text"
+                                   data-validate-length-range="18,18"
+                                   placeholder="请输入" required="required">
                             <span class="input-group-addon"><a href="#"><i class="fa fa-newspaper-o"></i></a></span>
                         </div>
                     </div>
                 </div>
             </div>
 
-            <div class="item form-group">
-                <div class="col-md-6 col-sm-6 col-xs-12">
+            <div class="item form-group thmz_alert">
+                <div class="col-md-6 col-sm-6 col-xs-12 item">
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="address">地址
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
-                        <input id="address" class="form-control col-md-7 col-xs-12" maxlength="25"
-                               placeholder="请输入" type="text">
+                        <input id="address" class="form-control col-md-7 col-xs-12 optional" type="text"
+                               data-validate-length-range="0,25"
+                               placeholder="请输入">
                     </div>
                 </div>
                 <!--<div class="col-md-6 col-sm-6 col-xs-12">-->
@@ -167,43 +197,43 @@
                     </button>
                 </div>
             </div>
-            <div class="item form-group">
-                <div class="col-md-6 col-sm-6 col-xs-12">
+            <div class="item form-group thmz_alert">
+                <div class="col-md-6 col-sm-6 col-xs-12 item">
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="ampm">时间区间 <span
                             class="required">*</span>
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
-                        <select class="form-control selectpicker show-tick" required="true" title="请选择"
+                        <select class="form-control selectpicker show-tick" required="required" title="请选择"
                                 onchange="initDeptPlus()"
                                 id="ampm">
                         </select>
                     </div>
                 </div>
-                <div class="col-md-6 col-sm-6 col-xs-12">
+                <div class="col-md-6 col-sm-6 col-xs-12 item">
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="deptNo">科室 <span
                             class="required">*</span>
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
-                        <select class="form-control selectpicker show-tick" data-live-search="true" required="true"
+                        <select class="form-control selectpicker show-tick" data-live-search="true" required="required"
                                 title="请选择" onchange="initChargeType()"
                                 id="deptNo">
                         </select>
                     </div>
                 </div>
             </div>
-            <div class="item form-group">
-                <div class="col-md-6 col-sm-6 col-xs-12">
+            <div class="item form-group thmz_alert">
+                <div class="col-md-6 col-sm-6 col-xs-12 item">
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="chargeType">号别 <span
                             class="required">*</span>
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
-                        <select class="form-control selectpicker show-tick" required="true" title="请选择"
+                        <select class="form-control selectpicker show-tick" required="required" title="请选择"
                                 onchange="initEmployee()"
                                 id="chargeType">
                         </select>
                     </div>
                 </div>
-                <div class="col-md-6 col-sm-6 col-xs-12">
+                <div class="col-md-6 col-sm-6 col-xs-12 item">
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="doctor">医生
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
@@ -226,8 +256,7 @@
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="registrationFee">挂号费
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
-                        <input id="registrationFee" class="form-control col-md-7 col-xs-12" readonly type="number"
-                               min="0">
+                        <input id="registrationFee" class="form-control col-md-7 col-xs-12" readonly>
                     </div>
                 </div>
                 <div class="col-md-6 col-sm-6 col-xs-12">
@@ -235,7 +264,7 @@
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
                         <input id="hospitalFee" class="form-control col-md-7 col-xs-12"
-                               readonly type="number" min="0">
+                               readonly>
                     </div>
                 </div>
             </div>
@@ -244,7 +273,7 @@
                     <label class="control-label col-md-4 col-sm-4 col-xs-12" for="checkFee">检查费
                     </label>
                     <div class="col-md-8 col-sm-8 col-xs-12">
-                        <input id="checkFee" class="form-control col-md-7 col-xs-12" readonly type="number" min="0">
+                        <input id="checkFee" class="form-control col-md-7 col-xs-12" readonly>
                     </div>
                 </div>
             </div>
@@ -252,7 +281,7 @@
             <div class="item form-group" style="margin-top: 50px;">
                 <div class="col-md-6 col-sm-6 col-xs-12">
                     <div class="total"> 合计:
-                        <span class="amountMoney" id="amountMoney">15.54</span><span>元</span>
+                        <span class="amountMoney" id="amountMoney">0.00</span><span>元</span>
                     </div>
                 </div>
                 <!--<div class="col-md-6 col-sm-6 col-xs-12">
@@ -865,7 +894,7 @@
                         <div class="col-md-12 col-sm-12 col-xs-12">
                             <div class="col-md-4 col-sm-4 col-xs-12">
                                 <div class="total"> 合计:
-                                    <span class="amountMoney" id="amountMoneyConfirm">15.54</span><span>元</span>
+                                    <span class="amountMoney" id="amountMoneyConfirm">0.00</span><span>元</span>
                                 </div>
                             </div>
                             <div class="col-md-5 col-sm-5 col-xs-12">
@@ -873,7 +902,7 @@
                                 </label>
                                 <div class="col-md-8 col-sm-8 col-xs-12">
                                     <input id="realMoney" class="form-control col-md-5 col-xs-12" type="number"
-                                           data-placement="bottom-right" min="0">
+                                           data-placement="bottom-right" min="0" onchange="checkFee()">
                                 </div>
                             </div>
                             <div class="col-md-3 col-sm-3 col-xs-12" style="line-height: 34px;">
@@ -885,18 +914,19 @@
                         <div class="col-md-12 col-sm-12 col-xs-12">
                             <div class="col-md-2 col-sm-2 col-xs-12"></div>
                             <label class="col-md-3 col-sm-3 col-xs-12" for="cash">
-                                <select class="form-control selectpicker show-tick" required="true" id="payType"></select>
+                                <select class="form-control selectpicker show-tick" required="true"
+                                        id="payType" onchange="checkFee()"></select>
                             </label>
                             <div class="col-md-3 col-sm-3 col-xs-12">
                                 <input id="cash" class="form-control col-md-5 col-xs-12" type="number"
-                                       data-placement="bottom-right" min="0">
+                                       data-placement="bottom-right" min="0" onchange="checkFee()">
                             </div>
-                            <div class="col-md-4 col-sm-4 col-xs-12">
+                            <!--<div class="col-md-4 col-sm-4 col-xs-12">
                                 <button type="button" class="btn btn-primary" id="addPayType">
                                     <span>增加收款方式</span>
                                 </button>
                                 <input type="hidden" id="payTypeIndex" value="0"/>
-                            </div>
+                            </div>-->
                         </div>
                     </div>
                     <div class="item form-group" id="changeAmountParent">
@@ -1072,8 +1102,9 @@
                             </label>
                             <div class="col-md-8 col-sm-8 col-xs-12">
                                 <div class="input-group">
-                                    <input id="editUserAge" class="form-control" data-validate-length-range="2,10"
-                                           placeholder="请输入" required="required" type="Number">
+                                    <input id="editUserAge" type="number" class="form-control"
+                                           data-validate-length-range="2,10"
+                                           placeholder="请输入" required="required">
                                     <div class="input-group-btn">
                                         <button type="button" class="btn btn-default dropdown-toggle"
                                                 data-toggle="dropdown"
@@ -1393,3 +1424,36 @@
     </div>
 </div>
 <!--打印内容弹窗结尾-->
+
+
+
+
+<!--卡号查询病人信息不存在弹窗开始-->
+<div class="modal fade bs-example-modal-sm in" tabindex="-1" role="dialog" aria-hidden="true" id="newCardModal"
+     style="top:20%;">
+    <div class="modal-dialog modal-sm">
+        <div class="modal-content" style="width: 480px;">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span>
+                </button>
+                <h4 class="modal-title">提示</h4>
+            </div>
+            <div class="modal-body">
+                <form class="form-horizontal form-label-left" novalidate>
+                    <div class="col-md-2 col-sm-2 col-xs-12">
+                        <i class="fa fa-info-circle blue fa-3x"></i>
+                    </div>
+                    <div class="col-md-10 col-sm-10 col-xs-12"
+                         style="font-size: 14px;font-weight: 700;height: 39px;line-height: 39px;">
+                        未找到病人信息,现在注册病人资料吗?
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary" onclick="$('#newCardModal').modal('hide')">确定</button>
+                <button type="button" class="btn btn-default" >取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+<!--卡号查询病人信息不存在弹窗结尾-->