From 5fccfd521d02ae9a3cd29a0bdc9dcf4b4b179f59 Mon Sep 17 00:00:00 2001
From: 克 刘 <4345453@qq.com>
Date: Fri, 10 Apr 2020 11:40:25 +0800
Subject: [PATCH] Merge branch 'dev' of http://192.168.2.240:7070/r/kidgrow-microservices-platform into dev

---
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/resources/application.yml                                             |    1 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysProductServiceImpl.java  |   37 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDictionariesController.java           |   30 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysHospitalService.java                       |    3 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDictionariesMapper.xml                                         |   14 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorAnswer.java                  |    2 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/js/common.js                                                                          |   25 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDepartmentServiceImpl.java             |   42 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysFeedbackService.java         |    7 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysProductMapper.xml                                    |    2 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserService.java                           |    4 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/BusinessServer.java                |    2 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysLoggerController.java   |   24 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DataNeed.java                      |    2 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysFeedbackMapper.xml                                   |   17 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/sysdictionaries.html                                                          |  285 +++
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysFeedbackServiceImpl.java |   37 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysFeedbackController.java |   43 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDoctor.java                                   |   19 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysDictionariesMapper.java                      |    2 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysArea.java                                     |   21 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable2/treeTable.css                                                              |  396 +++++
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysProductService.java          |    7 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/sysArea.html                                                                    |  187 ++
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDoctorController.java                 |   33 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysAreaMapper.java                              |    8 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrderDetail.java            |    2 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysAreaServiceImpl.java                   |   26 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrder.java                  |    2 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDoctorDto.java                                   |    9 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysAreaService.java                           |    8 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysHospitalController.java               |   10 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/resources/application.yml                                                       |    5 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/doctor.html                                                                   |  711 +++++++++
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorServer.java                  |    3 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/feedback.html                                                                 |  153 +
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysAreaMapper.xml                                                 |    5 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable2/treeTable.js                                                               | 1494 ++++++++++++++++++
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDictionaries.java                             |    9 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/hospital.html                                                                 |  236 ++
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDoctorVo.java                                    |    9 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysFeedback.java                   |    2 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDoctorMapper.xml                                               |    4 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserController.java                   |    7 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDoctorService.java                         |   12 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserServiceImpl.java                   |   37 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorSigning.java                 |   12 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDictionariesVo.java                              |   10 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDictionariesService.java                   |    8 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/HospitalScreening.java             |    3 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDoctorServiceImpl.java                 |  125 +
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/BusinessRecords.java               |    2 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysProductController.java  |   60 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorTemplete.java                |    2 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDictionariesServiceImpl.java           |   47 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysProduct.java                    |   18 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/SecurityConstants.java                                    |    5 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDepartmentController.java             |   10 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysHospitalServiceImpl.java               |    7 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/sysArea_form.html                                                               |  110 +
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/product_form.html                                                             |  101 +
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysAreaController.java                   |   45 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/product.html                                                                  |  133 +
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/index.html                                                                                   |   33 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDepartmentService.java                     |    5 
 65 files changed, 4,557 insertions(+), 173 deletions(-)

diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/BusinessRecords.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/BusinessRecords.java
index d2f1139..37c7539 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/BusinessRecords.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/BusinessRecords.java
@@ -1,5 +1,6 @@
 package com.kidgrow.oprationcenter.model;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.kidgrow.common.model.SuperModel;
 import lombok.AllArgsConstructor;
@@ -61,6 +62,7 @@
     /**
      * 是否删除,1删除,0未删除
      */
+    @TableLogic
     private Boolean isDel;
     /**
      * 状态,1启用,0停用
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/BusinessServer.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/BusinessServer.java
index bbe86f9..79457ae 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/BusinessServer.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/BusinessServer.java
@@ -1,5 +1,6 @@
 package com.kidgrow.oprationcenter.model;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.kidgrow.common.model.SuperModel;
 import lombok.AllArgsConstructor;
@@ -54,6 +55,7 @@
     /**
      * 是否删除,1删除,0未删除
      */
+    @TableLogic
     @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
     private Boolean isDel;
     /**
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DataNeed.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DataNeed.java
index f32429d..df4fc12 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DataNeed.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DataNeed.java
@@ -1,5 +1,6 @@
 package com.kidgrow.oprationcenter.model;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.kidgrow.common.model.SuperModel;
 import lombok.AllArgsConstructor;
@@ -72,6 +73,7 @@
     /**
      * 是否删除,1删除(已下载),0未删除(未下载)
      */
+    @TableLogic
     private Boolean isDel;
     /**
      * 文件路径
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorAnswer.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorAnswer.java
index cedd506..7f5cad4 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorAnswer.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorAnswer.java
@@ -1,5 +1,6 @@
 package com.kidgrow.oprationcenter.model;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.kidgrow.common.model.SuperModel;
 import lombok.AllArgsConstructor;
@@ -29,6 +30,7 @@
     /**
      * 是否删除,1删除,0未删除
      */
+    @TableLogic
     @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
     private Boolean isDel;
     /**
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorServer.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorServer.java
index d89f08c..f72a645 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorServer.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorServer.java
@@ -1,12 +1,12 @@
 package com.kidgrow.oprationcenter.model;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.kidgrow.common.model.SuperModel;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
-import org.hibernate.validator.constraints.NotBlank;
 import org.hibernate.validator.constraints.NotEmpty;
 
 /**
@@ -42,6 +42,7 @@
     /**
      * 是否删除,1删除,0未删除
      */
+    @TableLogic
     @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
     private Boolean isDel;
     /**
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorSigning.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorSigning.java
index 0efd75b..3c0f4cd 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorSigning.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorSigning.java
@@ -1,18 +1,13 @@
 package com.kidgrow.oprationcenter.model;
 
-import com.kidgrow.common.model.SuperModel;
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.kidgrow.common.model.SuperModel;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
-import org.hibernate.validator.constraints.*;
-
-import java.util.Date;
+import org.hibernate.validator.constraints.NotEmpty;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -34,6 +29,7 @@
     /**
      * 是否删除,1删除,0未删除
      */
+    @TableLogic
     @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
     private Boolean isDel;
     /**
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorTemplete.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorTemplete.java
index 8d1ebf5..e26093c 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorTemplete.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorTemplete.java
@@ -1,5 +1,6 @@
 package com.kidgrow.oprationcenter.model;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.kidgrow.common.model.SuperModel;
 import lombok.AllArgsConstructor;
@@ -76,6 +77,7 @@
     /**
      * 是否删除,1删除,0未删除
      */
+    @TableLogic
     @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
     private Boolean isDel;
     /**
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/HospitalScreening.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/HospitalScreening.java
index d856b5d..57a9392 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/HospitalScreening.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/HospitalScreening.java
@@ -1,12 +1,12 @@
 package com.kidgrow.oprationcenter.model;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.kidgrow.common.model.SuperModel;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
-import org.hibernate.validator.constraints.NotBlank;
 import org.hibernate.validator.constraints.NotEmpty;
 
 /**
@@ -46,6 +46,7 @@
     /**
      * 是否删除,1删除,0未删除
      */
+    @TableLogic
     @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
     private Boolean isDel;
     /**
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrder.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrder.java
index 32c138c..8995728 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrder.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrder.java
@@ -1,5 +1,6 @@
 package com.kidgrow.oprationcenter.model;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.kidgrow.common.model.SuperModel;
 import lombok.AllArgsConstructor;
@@ -72,6 +73,7 @@
     /**
      * 是否删除,1删除,0未删除
      */
+    @TableLogic
     @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
     private Boolean isDel;
     /**
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrderDetail.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrderDetail.java
index 5865e22..f0d6424 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrderDetail.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrderDetail.java
@@ -1,5 +1,6 @@
 package com.kidgrow.oprationcenter.model;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.kidgrow.common.model.SuperModel;
 import lombok.AllArgsConstructor;
@@ -50,6 +51,7 @@
     /**
      * 是否删除,1删除,0未删除
      */
+    @TableLogic
     @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
     private Boolean isDel;
     /**
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysFeedback.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysFeedback.java
index 639fef6..bc8236d 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysFeedback.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysFeedback.java
@@ -1,5 +1,6 @@
 package com.kidgrow.oprationcenter.model;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.kidgrow.common.model.SuperModel;
 import lombok.AllArgsConstructor;
@@ -66,6 +67,7 @@
     /**
      * 是否删除,1删除,0未删除
      */
+    @TableLogic
     private Boolean isDel;
     /**
      * 状态,1已查收,0未处理
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysProduct.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysProduct.java
index f822277..a38e4f4 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysProduct.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysProduct.java
@@ -1,5 +1,6 @@
 package com.kidgrow.oprationcenter.model;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.kidgrow.common.model.SuperModel;
 import lombok.AllArgsConstructor;
@@ -8,6 +9,7 @@
 import lombok.NoArgsConstructor;
 import org.hibernate.validator.constraints.NotEmpty;
 
+import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 
 /**
@@ -35,31 +37,37 @@
     /**
      * 时长(天)
      */
-    @NotEmpty(message = "时长(天)不能为空")
+    @NotNull(message = "时长不能为空")
     private Integer proTime;
+    /**
+     * 时长单位
+     */
+    @NotNull(message = "时长单位不能为空")
+    private Integer proTimeUnit;
     /**
      * 产品类型 0试用 1正式
      */
-    @NotEmpty(message = "产品类型 0试用 1正式不能为空")
+    @NotNull(message = "产品类型 0试用 1正式不能为空")
     private Integer proType;
     /**
      * 建议售价
      */
-    @NotEmpty(message = "建议售价不能为空")
+    @NotNull(message = "建议售价不能为空")
     private BigDecimal proPrice;
     /**
      * 报告量
      */
-    @NotEmpty(message = "报告量不能为空")
+    @NotNull(message = "报告量不能为空")
     private Integer recordCount;
     /**
      * 读片量
      */
-    @NotEmpty(message = "读片量不能为空")
+    @NotNull(message = "读片量不能为空")
     private Integer ailightCount;
     /**
      * 是否删除,1删除,0未删除
      */
+    @TableLogic
     private Boolean isDel;
     /**
      * 状态,1启用,0停用
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysFeedbackService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysFeedbackService.java
index 3f9f798..f7b1772 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysFeedbackService.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysFeedbackService.java
@@ -1,5 +1,6 @@
 package com.kidgrow.oprationcenter.service;
 
+import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.oprationcenter.model.SysFeedback;
 import com.kidgrow.common.model.PageResult;
 import com.kidgrow.common.service.ISuperService;
@@ -29,5 +30,11 @@
     * @return SysFeedback对象
     */
     SysFeedback findByObject(SysFeedback sysFeedback);
+    /**
+     * 状态变更
+     * @param params
+     * @return
+     */
+    ResultBody updateEnabled(Map<String, Object> params);
 }
 
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysProductService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysProductService.java
index 0487484..64d7428 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysProductService.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysProductService.java
@@ -1,5 +1,6 @@
 package com.kidgrow.oprationcenter.service;
 
+import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.oprationcenter.model.SysProduct;
 import com.kidgrow.common.model.PageResult;
 import com.kidgrow.common.service.ISuperService;
@@ -29,5 +30,11 @@
     * @return SysProduct对象
     */
     SysProduct findByObject(SysProduct sysProduct);
+    /**
+     * 状态变更
+     * @param params
+     * @return
+     */
+    ResultBody updateEnabled(Map<String, Object> params);
 }
 
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysFeedbackServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysFeedbackServiceImpl.java
index a3ca564..0c7e151 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysFeedbackServiceImpl.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysFeedbackServiceImpl.java
@@ -1,18 +1,19 @@
 package com.kidgrow.oprationcenter.service.impl;
 
-import org.springframework.stereotype.Service;
-import com.kidgrow.common.model.PageResult;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.oprationcenter.mapper.SysFeedbackMapper;
+import com.kidgrow.oprationcenter.model.SysFeedback;
+import com.kidgrow.oprationcenter.service.ISysFeedbackService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.stereotype.Service;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.MapUtils;
-import lombok.extern.slf4j.Slf4j;
-
-import com.kidgrow.oprationcenter.model.SysFeedback;
-import com.kidgrow.oprationcenter.mapper.SysFeedbackMapper;
-import com.kidgrow.oprationcenter.service.ISysFeedbackService;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -46,4 +47,24 @@
     public SysFeedback findByObject(SysFeedback sysFeedback){
         return baseMapper.findByObject(sysFeedback);
     }
+
+    /**
+     * 根据id和启用禁用值更新数据
+     * @param params
+     * @return ResultBody
+     */
+    @Override
+    public ResultBody updateEnabled(Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        Boolean enabled = MapUtils.getBoolean(params, "enabled");
+
+        SysFeedback feedback = baseMapper.selectById(id);
+        if (feedback == null) {
+            return ResultBody.failed("该反馈数据不存在!");
+        }
+        feedback.setEnabled(enabled);
+        feedback.setUpdateTime(new Date());
+        int i = baseMapper.updateById(feedback);
+        return i > 0 ? ResultBody.ok().data(feedback).msg("更新成功") : ResultBody.failed("更新失败");
+    }
 }
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysProductServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysProductServiceImpl.java
index 82797e4..a57e78b 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysProductServiceImpl.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysProductServiceImpl.java
@@ -1,18 +1,19 @@
 package com.kidgrow.oprationcenter.service.impl;
 
-import org.springframework.stereotype.Service;
-import com.kidgrow.common.model.PageResult;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.oprationcenter.mapper.SysProductMapper;
+import com.kidgrow.oprationcenter.model.SysProduct;
+import com.kidgrow.oprationcenter.service.ISysProductService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.stereotype.Service;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.MapUtils;
-import lombok.extern.slf4j.Slf4j;
-
-import com.kidgrow.oprationcenter.model.SysProduct;
-import com.kidgrow.oprationcenter.mapper.SysProductMapper;
-import com.kidgrow.oprationcenter.service.ISysProductService;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -46,4 +47,24 @@
     public SysProduct findByObject(SysProduct sysProduct){
         return baseMapper.findByObject(sysProduct);
     }
+
+    /**
+     * 根据id和启用禁用值更新数据
+     * @param params
+     * @return ResultBody
+     */
+    @Override
+    public ResultBody updateEnabled(Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        Boolean enabled = MapUtils.getBoolean(params, "enabled");
+
+        SysProduct sysProduct = baseMapper.selectById(id);
+        if (sysProduct == null) {
+            return ResultBody.failed("该数据不存在!");
+        }
+        sysProduct.setEnabled(enabled);
+        sysProduct.setUpdateTime(new Date());
+        int i = baseMapper.updateById(sysProduct);
+        return i > 0 ? ResultBody.ok().data(sysProduct).msg("更新成功") : ResultBody.failed("更新失败");
+    }
 }
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysFeedbackMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysFeedbackMapper.xml
index de5684f..50c3397 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysFeedbackMapper.xml
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysFeedbackMapper.xml
@@ -4,7 +4,13 @@
 <mapper namespace="com.kidgrow.oprationcenter.mapper.SysFeedbackMapper">
     <!--定义查询列-->
     <sql id="Column_List">
-	   *
+	    id,
+        doctor_name,
+        doctor_tel,
+        department_name,
+        hospital_name,
+        enabled,
+        create_time
 	</sql>
 
     <!--sql查询片段-->
@@ -19,7 +25,7 @@
                 and doctor_id = #{p.doctorId}
             </if>
             <if test="p.doctorName != null and p.doctorName !=''">
-                and doctor_name = #{p.doctorName}
+                and doctor_name  like concat('%', #{p.doctorName}, '%')
             </if>
             <if test="p.doctorTel != null and p.doctorTel !=''">
                 and doctor_tel = #{p.doctorTel}
@@ -57,11 +63,8 @@
             <if test="p.updateUserName != null and p.updateUserName !=''">
                 and update_user_name = #{p.updateUserName}
             </if>
-            <if test="p.createTime != null and p.createTime !=''">
-                and create_time = #{p.createTime}
-            </if>
-            <if test="p.updateTime != null and p.updateTime !=''">
-                and update_time = #{p.updateTime}
+            <if test="p.createTime != null and p.createTime !='' and p.updateTime != null and p.updateTime !=''">
+                and (create_time between #{p.createTime} and #{p.updateTime})
             </if>
         </where>
     </sql>
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysProductMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysProductMapper.xml
index e015f6f..c23f867 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysProductMapper.xml
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysProductMapper.xml
@@ -16,7 +16,7 @@
                 and id = #{p.id}
             </if>
             <if test="p.proName != null and p.proName !=''">
-                and pro_name = #{p.proName}
+                and pro_name like concat('%', #{p.proName}, '%')
             </if>
             <if test="p.proTime != null and p.proTime !=''">
                 and pro_time = #{p.proTime}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysFeedbackController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysFeedbackController.java
index 5376e06..e95b416 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysFeedbackController.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysFeedbackController.java
@@ -1,28 +1,24 @@
 package com.kidgrow.oprationcenter.controller;
 
-import java.util.Map;
 import com.kidgrow.common.controller.BaseController;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.ObjectError;
-import org.springframework.web.bind.annotation.*;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.model.SysFeedback;
+import com.kidgrow.oprationcenter.service.ISysFeedbackService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-
-import com.kidgrow.oprationcenter.model.SysFeedback;
-import com.kidgrow.oprationcenter.service.ISysFeedbackService;
-import com.kidgrow.common.model.*;
-
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.*;
+
 import javax.validation.Valid;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 
 /**
@@ -50,12 +46,12 @@
             @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
     })
     @GetMapping
-    public ResultBody<PageResult> list(@RequestParam Map<String, Object> params) {
+    public PageResult list(@RequestParam Map<String, Object> params) {
         if(params.size()==0){
             params.put("page",1);
             params.put("limit",10);
         }
-        return ResultBody.ok().data(sysFeedbackService.findList(params));
+        return sysFeedbackService.findList(params);
     }
 
     /**
@@ -115,4 +111,23 @@
             return ResultBody.failed().msg("删除失败");
         }
     }
+    /**
+     * 修改状态
+     *
+     * @param params
+     * @return
+     */
+    @ApiOperation(value = "修改反馈数据状态")
+    @GetMapping("/updateEnabled")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "enabled", value = "是否启用", required = true, dataType = "Boolean")
+    })
+    public ResultBody updateEnabled(@RequestParam Map<String, Object> params) {
+        if (params.size()==0)
+        {
+            return ResultBody.failed().msg("参数异常!");
+        }
+        return sysFeedbackService.updateEnabled(params);
+    }
 }
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysLoggerController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysLoggerController.java
index ee6f3b1..35c2c14 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysLoggerController.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysLoggerController.java
@@ -1,28 +1,24 @@
 package com.kidgrow.oprationcenter.controller;
 
-import java.util.Map;
 import com.kidgrow.common.controller.BaseController;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.ObjectError;
-import org.springframework.web.bind.annotation.*;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.model.SysLogger;
+import com.kidgrow.oprationcenter.service.ISysLoggerService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-
-import com.kidgrow.oprationcenter.model.SysLogger;
-import com.kidgrow.oprationcenter.service.ISysLoggerService;
-import com.kidgrow.common.model.*;
-
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.*;
+
 import javax.validation.Valid;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 
 /**
@@ -93,10 +89,10 @@
         }  else {
             boolean v= sysLoggerService.saveOrUpdate(sysLogger);
             if(v) {
-                return ResultBody.ok().data(sysLogger).msg("保存成功");
+                return ResultBody.ok().data(sysLogger).msg("反馈提交成功");
             }
             else {
-                return ResultBody.failed().msg("保存失败");
+                return ResultBody.failed().msg("信息提交失败");
             }
         }
     }
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysProductController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysProductController.java
index dea3751..16185a5 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysProductController.java
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysProductController.java
@@ -3,13 +3,16 @@
 import com.kidgrow.common.controller.BaseController;
 import com.kidgrow.common.model.PageResult;
 import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.model.ProductOrderDetail;
 import com.kidgrow.oprationcenter.model.SysProduct;
+import com.kidgrow.oprationcenter.service.IProductOrderDetailService;
 import com.kidgrow.oprationcenter.service.ISysProductService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.BindingResult;
 import org.springframework.validation.ObjectError;
@@ -31,11 +34,13 @@
  */
 @Slf4j
 @RestController
-@RequestMapping("/sysproduct")
+@RequestMapping("/product")
 @Api(tags = "")
 public class SysProductController  extends BaseController{
     @Autowired
     private ISysProductService sysProductService;
+    @Autowired
+    private IProductOrderDetailService productOrderDetailService;
 
     /**
      * 列表
@@ -46,12 +51,12 @@
             @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
     })
     @GetMapping
-    public ResultBody<PageResult> list(@RequestParam Map<String, Object> params) {
+    public PageResult list(@RequestParam Map<String, Object> params) {
         if(params.size()==0){
             params.put("page",1);
             params.put("limit",10);
         }
-        return ResultBody.ok().data(sysProductService.findList(params));
+        return sysProductService.findList(params);
     }
 
     /**
@@ -103,12 +108,53 @@
     @ApiOperation(value = "删除")
     @DeleteMapping("/{id}")
     public ResultBody delete(@PathVariable Long id) {
-        boolean v= sysProductService.removeById(id);
-        if(v) {
-            return ResultBody.ok().msg("删除成功");
+        if (!ProIsUseed(id)) {
+            return ResultBody.failed().msg("该产品已经被使用,无法删除!");
         }
         else {
-            return ResultBody.failed().msg("删除失败");
+            boolean v = sysProductService.removeById(id);
+            if (v) {
+                return ResultBody.ok().msg("删除成功");
+            } else {
+                return ResultBody.failed().msg("删除失败");
+            }
+        }
+    }
+
+    /**
+     * 判断该产品id下有没有已经使用的订单明细
+     * @param id
+     * @return
+     */
+    private boolean ProIsUseed(Long id)
+    {
+        ProductOrderDetail productOrderDetail=new ProductOrderDetail();
+        productOrderDetail.setProId(id);
+        productOrderDetail=productOrderDetailService.findByObject(productOrderDetail);
+        return (productOrderDetail==null);
+    }
+    /**
+     * 修改状态
+     *
+     * @param params
+     * @return
+     */
+    @ApiOperation(value = "修改数据状态")
+    @GetMapping("/updateEnabled")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "enabled", value = "是否启用", required = true, dataType = "Boolean")
+    })
+    public ResultBody updateEnabled(@RequestParam Map<String, Object> params) {
+        if (params.size()==0)
+        {
+            return ResultBody.failed().msg("参数异常!");
+        }
+        else if (!ProIsUseed(Long.valueOf(MapUtils.getInteger(params, "id")))) {
+            return ResultBody.failed().msg("该产品已经被使用,无法删除!");
+        }
+        else{
+            return sysProductService.updateEnabled(params);
         }
     }
 }
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/resources/application.yml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/resources/application.yml
index 0a3f8d2..dc1f9c9 100644
--- a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/resources/application.yml
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/resources/application.yml
@@ -61,6 +61,7 @@
       - sys_logger
       - data_need
       - business_records
+      - sys_feedback
     ignoreSqls:
       - com.kidgrow.usercenter.mapper.SysRoleMapper.findAll
 
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysArea.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysArea.java
index 7b93ba0..57cfc7b 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysArea.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysArea.java
@@ -1,11 +1,13 @@
 package com.kidgrow.usercenter.model;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.kidgrow.common.model.SuperModel;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -21,12 +23,16 @@
 @NoArgsConstructor
 @AllArgsConstructor
 @TableName("sys_area")
-public class SysArea extends SuperModel {
-    private static final long serialVersionUID = 1L;
+public class SysArea extends Model<SysArea> {
 
+    /**
+     * 区域id
+     */
+    private Long id;
     /**
      * 区域名称
      */
+    @NotEmpty(message = "区域名称不能为空")
     private String areaName;
     /**
      * 父级区域id
@@ -60,4 +66,13 @@
      * 名称拼音
      */
     private String areaCh;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean enabled;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    private Boolean isDel;
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDictionaries.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDictionaries.java
index a04cd74..563a202 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDictionaries.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDictionaries.java
@@ -1,10 +1,7 @@
 package com.kidgrow.usercenter.model;
 
+import com.baomidou.mybatisplus.annotation.*;
 import com.kidgrow.common.model.SuperModel;
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -36,6 +33,9 @@
      */
     @NotEmpty(message = "字典值不能为空")
     private String dictionariesName;
+
+    @NotEmpty(message = "字典KEY不能为空")
+    private String dictionariesKey;
     /**
      * 字典归属分类的标识(如果这个字典项是分类,则该字段为空)
      */
@@ -47,6 +47,7 @@
     /**
      * 是否删除,1删除,0未删除
      */
+    @TableLogic
     private Integer isDel;
     /**
      * 状态,1启用,0停用
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDoctor.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDoctor.java
index 1927292..e738e58 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDoctor.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDoctor.java
@@ -1,5 +1,6 @@
 package com.kidgrow.usercenter.model;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.kidgrow.common.model.SuperModel;
 import lombok.AllArgsConstructor;
@@ -7,6 +8,8 @@
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -32,7 +35,7 @@
     /**
      * 所属医院ID
      */
-    @NotEmpty(message = "所属医院ID不能为空")
+    @NotNull(message = "所属医院ID不能为空")
     private Long hospitalId;
     /**
      * 医院名称
@@ -42,12 +45,10 @@
     /**
      * 科室ID
      */
-    @NotEmpty(message = "科室ID不能为空")
     private Long departmentId;
     /**
      * 科室名称
      */
-    @NotEmpty(message = "科室名称不能为空")
     private String departmentName;
     /**
      * 医生姓名
@@ -98,14 +99,24 @@
     /**
      * 是否删除,1删除,0未删除
      */
+    @TableLogic
     private Boolean isDel;
     /**
      * 医生状态 1正常 0试用
      */
-    @NotEmpty(message = "医生状态 1正常 0试用不能为空")
+    @NotNull(message = "医生状态 1正常 0试用不能为空")
     private Boolean doctorState;
     /**
      * 启用禁用状态,1启用,0停用
      */
     private Boolean enabled;
+
+    /**
+     * 销售代表的id
+     */
+    private String serverUserId;
+    /**
+     * 销售代表名称
+     */
+    private String serverUserName;
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDictionariesVo.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDictionariesVo.java
new file mode 100644
index 0000000..28ede91
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDictionariesVo.java
@@ -0,0 +1,10 @@
+package com.kidgrow.usercenter.vo;
+
+import com.kidgrow.usercenter.model.SysDictionaries;
+import lombok.Data;
+
+@Data
+public class SysDictionariesVo extends SysDictionaries {
+
+    private String  dictionariesClassName;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDoctorDto.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDoctorDto.java
new file mode 100644
index 0000000..b8900fe
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDoctorDto.java
@@ -0,0 +1,9 @@
+package com.kidgrow.usercenter.vo;
+
+import lombok.Data;
+
+@Data
+public class SysDoctorDto extends  SysDoctorVo {
+    private String username;
+    private String password;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDoctorVo.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDoctorVo.java
new file mode 100644
index 0000000..562f388
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDoctorVo.java
@@ -0,0 +1,9 @@
+package com.kidgrow.usercenter.vo;
+
+import com.kidgrow.usercenter.model.SysDoctor;
+import lombok.Data;
+
+@Data
+public class SysDoctorVo extends SysDoctor {
+    private String username;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysAreaMapper.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysAreaMapper.java
index 344a45e..0524888 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysAreaMapper.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysAreaMapper.java
@@ -1,8 +1,7 @@
 package com.kidgrow.usercenter.mapper;
 
-import com.kidgrow.usercenter.model.SysArea;
 import com.kidgrow.db.mapper.SuperMapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.usercenter.model.SysArea;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -18,12 +17,11 @@
  */
 public interface SysAreaMapper extends SuperMapper<SysArea> {
     /**
-     * 分页查询省市区数据表列表
-     * @param page
+     * 查询省市区数据表列表
      * @param params
      * @return
      */
-    List<SysArea> findList(Page<SysArea> page, @Param("p") Map<String, Object> params);
+    List<SysArea> findList(@Param("p") Map<String, Object> params);
 
     /**
      * 根据SysArea对象当做查询条件进行查询
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysDictionariesMapper.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysDictionariesMapper.java
index 8721214..141fe6e 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysDictionariesMapper.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysDictionariesMapper.java
@@ -31,4 +31,6 @@
      * @return SysDictionaries对象
      */
     SysDictionaries findByObject(@Param("p") SysDictionaries sysDictionaries);
+
+    List<SysDictionaries> findAll(@Param("p") Map<String, Object> params);
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysAreaService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysAreaService.java
index 4d484bb..7ce78d4 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysAreaService.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysAreaService.java
@@ -1,5 +1,6 @@
 package com.kidgrow.usercenter.service;
 
+import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.usercenter.model.SysArea;
 import com.kidgrow.common.model.PageResult;
 import com.kidgrow.common.service.ISuperService;
@@ -29,5 +30,12 @@
     * @return SysArea对象
     */
     SysArea findByObject(SysArea sysArea);
+
+    /**
+     * 状态变更
+     * @param params
+     * @return
+     */
+    ResultBody updateEnabled(Map<String, Object> params);
 }
 
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDepartmentService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDepartmentService.java
index c90eea9..9775fca 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDepartmentService.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDepartmentService.java
@@ -1,5 +1,6 @@
 package com.kidgrow.usercenter.service;
 
+import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.usercenter.model.SysDepartment;
 import com.kidgrow.common.model.PageResult;
 import com.kidgrow.common.service.ISuperService;
@@ -29,5 +30,9 @@
     * @return SysDepartment对象
     */
     SysDepartment findByObject(SysDepartment sysDepartment);
+
+    ResultBody findAll(Map<String, Object> params);
+
+    ResultBody findListByHospitalId(Map<String, Object> params);
 }
 
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDictionariesService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDictionariesService.java
index 1c5fba0..933ce9d 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDictionariesService.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDictionariesService.java
@@ -1,9 +1,11 @@
 package com.kidgrow.usercenter.service;
 
+import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.usercenter.model.SysDictionaries;
 import com.kidgrow.common.model.PageResult;
 import com.kidgrow.common.service.ISuperService;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -20,7 +22,7 @@
      * @param params
      * @return
      */
-    PageResult<SysDictionaries> findList(Map<String, Object> params);
+    PageResult findList(Map<String, Object> params);
 
 
     /**
@@ -29,5 +31,9 @@
     * @return SysDictionaries对象
     */
     SysDictionaries findByObject(SysDictionaries sysDictionaries);
+
+    ResultBody updateEnabled(Map<String, Object> params);
+
+    List<SysDictionaries> findAll(Map<String, Object> params);
 }
 
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDoctorService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDoctorService.java
index ec3e4b7..988ccbb 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDoctorService.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDoctorService.java
@@ -1,9 +1,13 @@
 package com.kidgrow.usercenter.service;
 
+import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.usercenter.model.SysDoctor;
 import com.kidgrow.common.model.PageResult;
 import com.kidgrow.common.service.ISuperService;
+import com.kidgrow.usercenter.vo.SysDoctorDto;
+import com.kidgrow.usercenter.vo.SysDoctorVo;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 /**
@@ -20,7 +24,7 @@
      * @param params
      * @return
      */
-    PageResult<SysDoctor> findList(Map<String, Object> params);
+    PageResult<SysDoctorVo> findList(Map<String, Object> params);
 
 
     /**
@@ -29,5 +33,11 @@
     * @return SysDoctor对象
     */
     SysDoctor findByObject(SysDoctor sysDoctor);
+
+    boolean delete(Long id);
+
+    ResultBody enable(Map<String, Object> params);
+
+    boolean saveOrUpdateSer(SysDoctorDto sysDoctor, HttpServletRequest request);
 }
 
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysHospitalService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysHospitalService.java
index 42b2137..2c44889 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysHospitalService.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysHospitalService.java
@@ -1,5 +1,6 @@
 package com.kidgrow.usercenter.service;
 
+import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.usercenter.model.SysHospital;
 import com.kidgrow.common.model.PageResult;
 import com.kidgrow.common.service.ISuperService;
@@ -29,5 +30,7 @@
     * @return SysHospital对象
     */
     SysHospital findByObject(SysHospital sysHospital);
+
+    ResultBody<SysHospital> findAll(Map<String, Object> params);
 }
 
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserService.java
index 8792cdd..28c445c 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserService.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserService.java
@@ -3,7 +3,9 @@
 import com.kidgrow.common.model.*;
 import com.kidgrow.common.service.ISuperService;
 import com.kidgrow.usercenter.model.SysUserExcel;
+import org.springframework.web.bind.annotation.RequestBody;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -107,4 +109,6 @@
 	boolean delUser(Long id);
 
 	ResultBody findAll(Map<String, Object> map);
+
+	ResultBody getThisUserOrganizationUser(HttpServletRequest request);
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysAreaServiceImpl.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysAreaServiceImpl.java
index 99e8614..e7b5972 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysAreaServiceImpl.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysAreaServiceImpl.java
@@ -1,7 +1,7 @@
 package com.kidgrow.usercenter.service.impl;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.common.service.impl.SuperServiceImpl;
 import com.kidgrow.usercenter.mapper.SysAreaMapper;
 import com.kidgrow.usercenter.model.SysArea;
@@ -31,9 +31,8 @@
      */
     @Override
     public PageResult<SysArea> findList(Map<String, Object> params){
-        Page<SysArea> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
-        List<SysArea> list  =  baseMapper.findList(page, params);
-        return PageResult.<SysArea>builder().data(list).code(0).count(page.getTotal()).build();
+        List<SysArea> list  =  baseMapper.findList(params);
+        return PageResult.<SysArea>builder().data(list).code(0).count((long) list.size()).build();
     }
 
     /**
@@ -45,4 +44,23 @@
     public SysArea findByObject(SysArea sysArea){
         return baseMapper.findByObject(sysArea);
     }
+    /**
+     * 根据id和启用禁用值更新数据
+     * @param params
+     * @return ResultBody
+     */
+    @Override
+    public ResultBody updateEnabled(Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        Boolean enabled = MapUtils.getBoolean(params, "enabled");
+
+        SysArea area = baseMapper.selectById(id);
+        if (area == null) {
+            return ResultBody.failed("该数据不存在!");
+        }
+        area.setEnabled(enabled);
+
+        int i = baseMapper.updateById(area);
+        return i > 0 ? ResultBody.ok().data(area).msg("更新成功") : ResultBody.failed("更新失败");
+    }
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDepartmentServiceImpl.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDepartmentServiceImpl.java
index 7095637..f0c9c3b 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDepartmentServiceImpl.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDepartmentServiceImpl.java
@@ -1,12 +1,24 @@
 package com.kidgrow.usercenter.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.usercenter.model.SysHospital;
+import com.kidgrow.usercenter.service.ISysHospitalService;
+import com.kidgrow.usercenter.service.ISysOrganizationService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.kidgrow.common.model.PageResult;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kidgrow.common.service.impl.SuperServiceImpl;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
+
 import org.apache.commons.collections4.MapUtils;
 import lombok.extern.slf4j.Slf4j;
 
@@ -25,6 +37,11 @@
 @Slf4j
 @Service
 public class SysDepartmentServiceImpl extends SuperServiceImpl<SysDepartmentMapper, SysDepartment> implements ISysDepartmentService {
+
+    @Autowired
+    private ISysOrganizationService iSysOrganizationService;
+    @Autowired
+    private ISysHospitalService iSysHospitalService;
     /**
      * 列表
      * @param params
@@ -46,4 +63,29 @@
     public SysDepartment findByObject(SysDepartment sysDepartment){
         return baseMapper.findByObject(sysDepartment);
     }
+
+    @Override
+    public ResultBody findAll(Map<String, Object> params) {
+        return  ResultBody.ok().data(baseMapper.selectByMap(params));
+    }
+
+    @Override
+    public ResultBody findListByHospitalId(Map<String, Object> params) {
+        //查询组织
+        Long id = MapUtils.getLong(params, "id");
+        List<SysDepartment> sysDepartments=new ArrayList<>();
+        SysHospital byId = iSysHospitalService.getById(id);
+        if(byId!=null){
+            params=new HashMap<>();
+            params.put("org_parent_id",byId.getOrgId());
+            List<SysOrganization> sysOrganizations = iSysOrganizationService.listByMap(params);
+            if (sysOrganizations.size()>0) {
+                List<Long> collect = sysOrganizations.stream().map(e -> e.getId()).collect(Collectors.toList());
+                QueryWrapper<SysDepartment> queryWrapper=new QueryWrapper();
+                queryWrapper.in("org_id",collect );
+                sysDepartments= baseMapper.selectList(queryWrapper);
+            }
+        }
+        return ResultBody.ok().data(sysDepartments);
+    }
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDictionariesServiceImpl.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDictionariesServiceImpl.java
index 7b5ad28..f53f2a7 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDictionariesServiceImpl.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDictionariesServiceImpl.java
@@ -1,10 +1,18 @@
 package com.kidgrow.usercenter.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.usercenter.vo.SysDictionariesVo;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.cglib.beans.BeanCopier;
 import org.springframework.stereotype.Service;
 import com.kidgrow.common.model.PageResult;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kidgrow.common.service.impl.SuperServiceImpl;
 
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import org.apache.commons.collections4.MapUtils;
@@ -31,10 +39,24 @@
      * @return
      */
     @Override
-    public PageResult<SysDictionaries> findList(Map<String, Object> params){
+    public PageResult findList(Map<String, Object> params){
         Page<SysDictionaries> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
         List<SysDictionaries> list  =  baseMapper.findList(page, params);
-        return PageResult.<SysDictionaries>builder().data(list).code(0).count(page.getTotal()).build();
+        List<SysDictionariesVo> listvo  = new ArrayList<>();
+        for (SysDictionaries dictionaries:list
+             ) {
+            SysDictionariesVo sysDictionariesVo=new SysDictionariesVo();
+            BeanCopier beanCopier = BeanCopier.create(SysDictionaries.class, SysDictionariesVo.class, false);
+            beanCopier.copy(dictionaries,sysDictionariesVo,null);
+            if(StringUtils.isNotBlank(dictionaries.getDictionariesClassId())){
+                SysDictionaries dic = baseMapper.selectById(dictionaries.getDictionariesClassId());
+                if(dic!=null){
+                    sysDictionariesVo.setDictionariesClassName(dic.getDictionariesName());
+                }
+            }
+            listvo.add(sysDictionariesVo);
+        }
+        return PageResult.<SysDictionariesVo>builder().data(listvo).code(0).count(page.getTotal()).build();
     }
 
     /**
@@ -46,4 +68,25 @@
     public SysDictionaries findByObject(SysDictionaries sysDictionaries){
         return baseMapper.findByObject(sysDictionaries);
     }
+
+    @Override
+    public ResultBody updateEnabled(Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        SysDictionaries dictionaries = baseMapper.selectById(id);
+        if(dictionaries!=null){
+            Integer enabled = MapUtils.getInteger( params,"enabled");
+            dictionaries.setEnabled(enabled);
+            dictionaries.setUpdateTime(new Date());
+            int i = baseMapper.updateById(dictionaries);
+            return ResultBody.ok(0,"更新成功");
+        }else {
+            return ResultBody.failed("更新成功");
+        }
+
+    }
+
+    @Override
+    public List<SysDictionaries> findAll(Map<String, Object> params) {
+        return baseMapper.findAll(params);
+    }
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDoctorServiceImpl.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDoctorServiceImpl.java
index 8566373..4fcd9b5 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDoctorServiceImpl.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDoctorServiceImpl.java
@@ -1,49 +1,156 @@
 package com.kidgrow.usercenter.service.impl;
 
+import com.kidgrow.common.constant.SecurityConstants;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.usercenter.service.ISysUserService;
+import com.kidgrow.usercenter.vo.SysDoctorDto;
+import com.kidgrow.usercenter.vo.SysDoctorVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cglib.beans.BeanCopier;
+import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 import com.kidgrow.common.model.PageResult;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kidgrow.common.service.impl.SuperServiceImpl;
 
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
+
 import org.apache.commons.collections4.MapUtils;
 import lombok.extern.slf4j.Slf4j;
 
 import com.kidgrow.usercenter.model.SysDoctor;
 import com.kidgrow.usercenter.mapper.SysDoctorMapper;
 import com.kidgrow.usercenter.service.ISysDoctorService;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
  * @Description: <br>
  * @Project: 用户中心<br>
  * @CreateDate: Created in 2020-04-02 14:02:50 <br>
  * @Author: <a href="4345453@kidgrow.com">liuke</a>
- * @version 1.0
  */
 @Slf4j
 @Service
 public class SysDoctorServiceImpl extends SuperServiceImpl<SysDoctorMapper, SysDoctor> implements ISysDoctorService {
     /**
      * 列表
+     *
      * @param params
      * @return
      */
+    @Autowired
+    private ISysUserService iSysUserService;
+    @Autowired
+    private PasswordEncoder passwordEncoder;
+
     @Override
-    public PageResult<SysDoctor> findList(Map<String, Object> params){
+    public PageResult<SysDoctorVo> findList(Map<String, Object> params) {
         Page<SysDoctor> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
-        List<SysDoctor> list  =  baseMapper.findList(page, params);
-        return PageResult.<SysDoctor>builder().data(list).code(0).count(page.getTotal()).build();
+        List<SysDoctor> list = baseMapper.findList(page, params);
+        List<SysDoctorVo> listvo = new ArrayList<>();
+        list.forEach(e -> {
+            SysDoctorVo vo = new SysDoctorVo();
+            BeanCopier beanCopier = BeanCopier.create(SysDoctor.class, SysDoctorVo.class, false);
+            beanCopier.copy(e, vo, null);
+            //查询用户的登录账号;
+            if (e.getUserId() != null) {
+                SysUser sysUser = iSysUserService.getById(e.getUserId());
+                if (sysUser != null) {
+                    vo.setUsername(sysUser.getUsername());
+                }
+            }
+            listvo.add(vo);
+        });
+        return PageResult.<SysDoctorVo>builder().data(listvo).code(0).count(page.getTotal()).build();
     }
 
     /**
-   * 根据SysDoctor对象当做查询条件进行查询
-   * @param sysDoctor
-   * @return SysDoctor
-   */
+     * 根据SysDoctor对象当做查询条件进行查询
+     *
+     * @param sysDoctor
+     * @return SysDoctor
+     */
     @Override
-    public SysDoctor findByObject(SysDoctor sysDoctor){
+    public SysDoctor findByObject(SysDoctor sysDoctor) {
         return baseMapper.findByObject(sysDoctor);
     }
+
+    @Override
+    public boolean delete(Long id) {
+        //查询user表
+        SysDoctor sysDoctor = baseMapper.selectById(id);
+        if (sysDoctor != null && sysDoctor.getUserId() != null) {
+            boolean b = iSysUserService.delUser(sysDoctor.getUserId());
+        }
+        sysDoctor.setIsDel(true);
+        int i = baseMapper.deleteById(id);
+        return true;
+    }
+
+    @Override
+    public ResultBody enable(Map<String, Object> params) {
+        Long aLong = MapUtils.getLong(params,"id");
+        SysDoctor sysDoctor = baseMapper.selectById(aLong);
+        if (sysDoctor != null && sysDoctor.getUserId() != null) {
+            SysUser byId = iSysUserService.getById(sysDoctor.getUserId());
+            if(byId!=null){
+                byId.setEnabled(true);
+                iSysUserService.updateById(byId);
+            }
+        }
+        if(sysDoctor!=null){
+            sysDoctor.setEnabled(true);
+            baseMapper.updateById(sysDoctor);
+        }else {
+            return ResultBody.failed("禁用失败");
+        }
+        return ResultBody.ok(0,"禁用成功");
+    }
+
+    @Override
+    @Transactional
+    public boolean saveOrUpdateSer(SysDoctorDto sysDoctor, HttpServletRequest request) {
+        String id = request.getHeader(SecurityConstants.USER_ID_HEADER);
+        if(null==sysDoctor){
+           return  false;
+        }else {
+            if (sysDoctor.getId()==null) {
+                //保存
+                SysUser sysUser=new SysUser();
+                sysUser.setUsername(sysDoctor.getUsername());
+                sysUser.setPassword(passwordEncoder.encode(sysDoctor.getPassword()));
+                sysUser.setNickname(sysDoctor.getHospitalName());
+                sysUser.setHeadImgUrl(sysDoctor.getDoctorLogo());
+                sysUser.setMobile(sysDoctor.getDoctorTel());
+                sysUser.setType("doctor");
+                sysUser.setTenantId("hospital");
+                sysUser.setCreateTime(new Date());
+                SysUser byId = iSysUserService.getById(id);
+                if(byId!=null){
+                    sysUser.setCreateUserId(byId.getId());
+                    sysUser.setCreateUserName(byId.getUsername());
+                }
+                iSysUserService.save(sysUser);
+                //保存doctor的数据
+                SysDoctor sysDoc=new SysDoctor();
+                BeanCopier beanCopier = BeanCopier.create(SysDoctorDto.class, SysDoctor.class, false);
+                beanCopier.copy(sysDoctor,sysDoc,null);
+                sysDoc.setUserId(sysUser.getId());
+                baseMapper.insert(sysDoc);
+            }else {
+                //更新
+                baseMapper.updateById(sysDoctor);
+            }
+        }
+        return true;
+    }
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysHospitalServiceImpl.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysHospitalServiceImpl.java
index 949389f..accdf78 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysHospitalServiceImpl.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysHospitalServiceImpl.java
@@ -1,5 +1,6 @@
 package com.kidgrow.usercenter.service.impl;
 
+import com.kidgrow.common.model.ResultBody;
 import org.springframework.stereotype.Service;
 import com.kidgrow.common.model.PageResult;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -46,4 +47,10 @@
     public SysHospital findByObject(SysHospital sysHospital){
         return baseMapper.findByObject(sysHospital);
     }
+
+    @Override
+    public ResultBody<SysHospital> findAll(Map<String, Object> params) {
+        List<SysHospital> sysHospitals = baseMapper.selectByMap(params);
+        return  ResultBody.ok().data(sysHospitals).msg("查询成功");
+    }
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserServiceImpl.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserServiceImpl.java
index bcb4b7c..94f1dad 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserServiceImpl.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserServiceImpl.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kidgrow.common.constant.CommonConstant;
+import com.kidgrow.common.constant.SecurityConstants;
 import com.kidgrow.common.context.ClientContextHolder;
 import com.kidgrow.common.lock.DistributedLock;
 import com.kidgrow.common.model.*;
@@ -14,11 +15,13 @@
 import com.kidgrow.usercenter.model.SysUserExcel;
 import com.kidgrow.usercenter.service.ISysOrganizationService;
 import com.kidgrow.usercenter.service.ISysRoleUserService;
+import com.kidgrow.usercenter.service.ISysUserOrgService;
 import com.kidgrow.usercenter.service.ISysUserService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.hibernate.validator.constraints.NotBlank;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.crypto.password.PasswordEncoder;
@@ -27,6 +30,7 @@
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -54,6 +58,8 @@
 
     @Autowired
     private ISysOrganizationService organizationService;
+    @Autowired
+    private ISysUserOrgService iSysUserOrgService;
 
 
 
@@ -285,4 +291,35 @@
         List<SysUser> sysUsers = baseMapper.selectByMap(map);
         return ResultBody.ok().data(sysUsers).msg("操作成功");
     }
+
+    /**
+     * 获取当前用的 组织下的所有人员
+     * @param request
+     * @return
+     */
+    @Override
+    public ResultBody getThisUserOrganizationUser(HttpServletRequest request) {
+        String id = request.getHeader(SecurityConstants.USER_ID_HEADER);
+        List<SysUser> sysUsers=new ArrayList<>();
+        if(StringUtils.isNotBlank(id)){
+            QueryWrapper<SysUserOrg> queryWrapper=new QueryWrapper();
+            queryWrapper.eq("user_id",id);
+            List<SysUserOrg> list = iSysUserOrgService.list(queryWrapper);
+            if(list.size()>0){
+                List<Long> collect = list.stream().map(e -> e.getOrgId()).collect(Collectors.toList());
+                if (collect.size()>0) {
+                    queryWrapper=new QueryWrapper<>();
+                    queryWrapper.in("org_id",collect);
+                    List<SysUserOrg> sysUserOrgs = iSysUserOrgService.list(queryWrapper);
+                    List<Long> userIds = sysUserOrgs.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+                    QueryWrapper<SysUser> sysUserQueryWrapper=new QueryWrapper();
+                    sysUserQueryWrapper.in("id",userIds);
+                    sysUsers= baseMapper.selectList(sysUserQueryWrapper);
+                }
+            }
+        }else {
+            return ResultBody.failed("暂无数据");
+        }
+        return ResultBody.ok().data(sysUsers);
+    }
 }
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysAreaMapper.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysAreaMapper.xml
index 2adbfca..b9271bd 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysAreaMapper.xml
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysAreaMapper.xml
@@ -42,6 +42,9 @@
             <if test="p.areaCh != null and p.areaCh !=''">
                 and area_ch = #{p.areaCh}
             </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
         </where>
     </sql>
 
@@ -61,6 +64,6 @@
         <include refid="Column_List"/>
         from sys_area
         <include refid="where"/>
-        order by id desc
+        order by id
     </select>
 </mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDictionariesMapper.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDictionariesMapper.xml
index f9c5492..b8f51c3 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDictionariesMapper.xml
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDictionariesMapper.xml
@@ -16,10 +16,13 @@
                 and id = #{p.id}
             </if>
             <if test="p.dictionariesName != null and p.dictionariesName !=''">
-                and dictionaries_name = #{p.dictionariesName}
+                and dictionaries_name like  '%${p.dictionariesName}%'
             </if>
             <if test="p.dictionariesClassId != null and p.dictionariesClassId !=''">
                 and dictionaries_class_id = #{p.dictionariesClassId}
+            </if>
+            <if test="p.dictionariesClassIdIsNull != null and p.dictionariesClassIdIsNull !=''">
+                and dictionaries_class_id is null
             </if>
             <if test="p.dictionariesOrder != null and p.dictionariesOrder !=''">
                 and dictionaries_order = #{p.dictionariesOrder}
@@ -67,6 +70,13 @@
         <include refid="Column_List"/>
         from sys_dictionaries
         <include refid="where"/>
-        order by id desc
+        order by id asc
+    </select>
+    <select id="findAll" resultType="com.kidgrow.usercenter.model.SysDictionaries">
+        select
+        <include refid="Column_List"/>
+        from sys_dictionaries
+        <include refid="where"/>
+        order by id asc
     </select>
 </mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDoctorMapper.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDoctorMapper.xml
index 04087be..e9af41f 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDoctorMapper.xml
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDoctorMapper.xml
@@ -31,13 +31,13 @@
                 and department_name = #{p.departmentName}
             </if>
             <if test="p.doctorName != null and p.doctorName !=''">
-                and doctor_name = #{p.doctorName}
+                and doctor_name like '%${p.doctorName}%'
             </if>
             <if test="p.doctorLogo != null and p.doctorLogo !=''">
                 and doctor_logo = #{p.doctorLogo}
             </if>
             <if test="p.doctorTel != null and p.doctorTel !=''">
-                and doctor_tel = #{p.doctorTel}
+                and doctor_tel like '%${p.doctorTel}%'
             </if>
             <if test="p.doctorRankId != null and p.doctorRankId !=''">
                 and doctor_rank_id = #{p.doctorRankId}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysAreaController.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysAreaController.java
index ad22d4d..7a5e36c 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysAreaController.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysAreaController.java
@@ -41,17 +41,9 @@
      * 列表
      */
     @ApiOperation(value = "查询列表")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
-            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
-    })
-    @GetMapping
-    public ResultBody<PageResult> list(@RequestParam Map<String, Object> params) {
-        if(params.size()==0){
-            params.put("page",1);
-            params.put("limit",10);
-        }
-        return ResultBody.ok().data(sysAreaService.findList(params));
+    @GetMapping("/findAlls")
+    public PageResult<SysArea> findAlls(@RequestParam Map<String, Object> params) {
+        return sysAreaService.findList(params);
     }
 
     /**
@@ -87,6 +79,18 @@
             }
             return ResultBody.failed().msg(errMsg.toString());
         } else {
+            //如果父级id是空的,默认填-1
+            if (sysArea.getAreaParentId()==null) {
+                sysArea.setAreaParentId(-1L);
+            }
+            //添加的时候得判断主键唯一
+             if (sysArea.getIsDel()==null) {
+                 SysArea model =sysAreaService.getById(sysArea.getId());
+                 if (model!=null)
+                 {
+                     return ResultBody.failed().msg("区域编号已存在!");
+                 }
+            }
             boolean v= sysAreaService.saveOrUpdate(sysArea);
             if(v) {
                 return ResultBody.ok().data(sysArea).msg("保存成功");
@@ -111,4 +115,23 @@
             return ResultBody.failed().msg("删除失败");
         }
     }
+    /**
+     * 修改状态
+     *
+     * @param params
+     * @return
+     */
+    @ApiOperation(value = "修改反馈数据状态")
+    @GetMapping("/updateEnabled")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "enabled", value = "是否启用", required = true, dataType = "Boolean")
+    })
+    public ResultBody updateEnabled(@RequestParam Map<String, Object> params) {
+        if (params.size()==0)
+        {
+            return ResultBody.failed().msg("参数异常!");
+        }
+        return sysAreaService.updateEnabled(params);
+    }
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDepartmentController.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDepartmentController.java
index 4f68ff7..157e44f 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDepartmentController.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDepartmentController.java
@@ -115,4 +115,14 @@
             return ResultBody.failed().msg("删除失败");
         }
     }
+
+    /**
+     * 根据医院获取  组织,通过组织,获取科室;
+     * @param params
+     * @return
+     */
+    @GetMapping("findListByHospitalId")
+    public ResultBody findListByHospitalId(@RequestParam Map<String, Object> params) {
+        return sysDepartmentService.findListByHospitalId(params);
+    }
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDictionariesController.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDictionariesController.java
index 47b328b..4fc3002 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDictionariesController.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDictionariesController.java
@@ -2,6 +2,7 @@
 
 import java.util.Map;
 import com.kidgrow.common.controller.BaseController;
+import org.apache.commons.collections4.MapUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.ObjectError;
 import org.springframework.web.bind.annotation.*;
@@ -50,12 +51,12 @@
             @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
     })
     @GetMapping
-    public ResultBody<PageResult> list(@RequestParam Map<String, Object> params) {
+    public PageResult list(@RequestParam Map<String, Object> params) {
         if(params.size()==0){
             params.put("page",1);
             params.put("limit",10);
         }
-        return ResultBody.ok().data(sysDictionariesService.findList(params));
+        return sysDictionariesService.findList(params);
     }
 
     /**
@@ -65,6 +66,12 @@
     @GetMapping("/{id}")
     public ResultBody findById(@PathVariable Long id) {
         SysDictionaries model = sysDictionariesService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+    @ApiOperation(value = "根据SysDictionaries当做查询条件进行查询")
+    @PostMapping("/findAll")
+    public ResultBody findAll(@RequestBody Map<String, Object> params) {
+        List<SysDictionaries> model = sysDictionariesService.findAll(params);
         return ResultBody.ok().data(model).msg("查询成功");
     }
 
@@ -102,6 +109,25 @@
     }
 
     /**
+     * 修改字典表状态
+     *
+     * @param params
+     * @return
+     */
+    @ApiOperation(value = "修改字典表状态")
+    @GetMapping("/updateEnabled")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "用户id", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "enabled", value = "是否启用", required = true, dataType = "Integer")
+    })
+    public ResultBody updateEnabled(@RequestParam Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        if (id==null) {
+            return ResultBody.failed("请选择一条数据");
+        }
+        return sysDictionariesService.updateEnabled(params);
+    }
+    /**
      * 删除
      */
     @ApiOperation(value = "删除")
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDoctorController.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDoctorController.java
index 51be1e4..0a589ab 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDoctorController.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDoctorController.java
@@ -2,6 +2,9 @@
 
 import java.util.Map;
 import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.usercenter.vo.SysDoctorVo;
+import com.kidgrow.usercenter.vo.SysDoctorDto;
+import org.apache.commons.collections4.MapUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.ObjectError;
 import org.springframework.web.bind.annotation.*;
@@ -16,13 +19,11 @@
 import com.kidgrow.common.model.*;
 
 import org.springframework.validation.BindingResult;
+
+import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
 
 /**
@@ -50,12 +51,12 @@
             @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
     })
     @GetMapping
-    public ResultBody<PageResult> list(@RequestParam Map<String, Object> params) {
+    public PageResult<SysDoctorVo> list(@RequestParam Map<String, Object> params) {
         if(params.size()==0){
             params.put("page",1);
             params.put("limit",10);
         }
-        return ResultBody.ok().data(sysDoctorService.findList(params));
+        return sysDoctorService.findList(params);
     }
 
     /**
@@ -83,7 +84,7 @@
      */
     @ApiOperation(value = "保存")
     @PostMapping
-    public ResultBody save(@Valid @RequestBody SysDoctor sysDoctor, BindingResult bindingResult) {
+    public ResultBody save(@Valid @RequestBody SysDoctorDto sysDoctor, BindingResult bindingResult, HttpServletRequest request) {
         List<String> errMsg= new ArrayList<>();
         if (bindingResult.hasErrors()) {
             for (ObjectError error : bindingResult.getAllErrors()) {
@@ -91,7 +92,8 @@
             }
             return ResultBody.failed().msg(errMsg.toString());
         } else {
-            boolean v= sysDoctorService.saveOrUpdate(sysDoctor);
+            boolean v= sysDoctorService.saveOrUpdateSer(sysDoctor,request);
+
             if(v) {
                 return ResultBody.ok().data(sysDoctor).msg("保存成功");
             }
@@ -107,7 +109,7 @@
     @ApiOperation(value = "删除")
     @DeleteMapping("/{id}")
     public ResultBody delete(@PathVariable Long id) {
-        boolean v= sysDoctorService.removeById(id);
+        boolean v= sysDoctorService.delete(id);
         if(v) {
             return ResultBody.ok().msg("删除成功");
         }
@@ -115,4 +117,17 @@
             return ResultBody.failed().msg("删除失败");
         }
     }
+    /**
+     * 状态
+     */
+    @ApiOperation(value = "修改状态")
+    @PostMapping("enable")
+    public ResultBody enable(@RequestBody Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        if (id==null) {
+            return ResultBody.failed("请选择一条数据");
+        }
+            return sysDoctorService.enable(params);
+    }
+
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysHospitalController.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysHospitalController.java
index e673471..7b1e22b 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysHospitalController.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysHospitalController.java
@@ -50,14 +50,18 @@
             @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
     })
     @GetMapping
-    public ResultBody<PageResult> list(@RequestParam Map<String, Object> params) {
+    public PageResult<SysHospital> list(@RequestParam Map<String, Object> params) {
         if(params.size()==0){
             params.put("page",1);
             params.put("limit",10);
         }
-        return ResultBody.ok().data(sysHospitalService.findList(params));
+        return sysHospitalService.findList(params);
     }
-
+    @PostMapping("findAll")
+    @ApiOperation(value = "查询所有列表")
+    public ResultBody<SysHospital> findAll(@RequestBody Map<String, Object> params) {
+        return sysHospitalService.findAll(params);
+    }
     /**
      * 查询
      */
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserController.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserController.java
index 7e38efd..0bd18d0 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserController.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserController.java
@@ -336,4 +336,11 @@
     public ResultBody findAll(@RequestParam Map<String,Object> map) {
         return appUserService.findAll(map);
     }
+    /**
+     * 获取当前用的 组织下的所有人员
+     */
+    @GetMapping("users/getThisUserOrganizationUser")
+    public ResultBody getThisUserOrganizationUser(HttpServletRequest request){
+        return appUserService.getThisUserOrganizationUser(request);
+    }
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/resources/application.yml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/resources/application.yml
index 2837660..185051f 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/resources/application.yml
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/resources/application.yml
@@ -65,6 +65,11 @@
       - sys_user_logs
       - sys_organization
       - sys_user_org
+      - sys_dictionaries
+      - sys_hospital
+      - sys_doctor
+      - sys_department
+      - sys_area
     ignoreSqls:
       - com.kidgrow.usercenter.mapper.SysRoleMapper.findAll
 
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/SecurityConstants.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/SecurityConstants.java
index 18e47d2..f1b26c1 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/SecurityConstants.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/SecurityConstants.java
@@ -43,7 +43,10 @@
      * 用户所属部门名称
      */
     String USER_DEP_NAME_HEADER="x-user-dep-name-header";
-
+    /**
+     * 用户真实名信息头
+     */
+    String USER_REAL_NAME = "x-user-real-name-header";
     /**
      * 角色信息头
      */
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/js/common.js b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/js/common.js
index 8d1b993..9042ad8 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/js/common.js
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/js/common.js
@@ -4,11 +4,32 @@
 }).extend({
     formSelects: 'formSelects/formSelects-v4',
     treetable: 'treetable-lay/treetable',
+    treetable2: 'treetable2/TreeTable',
     step: 'step-lay/step'
-}).use(['layer'], function () {
+}).use(['layer','config', 'index', 'element'], function () {
     var $ = layui.jquery;
     var layer = layui.layer;
+    let config = layui.config;
+    let index = layui.index;
+    let element = layui.element;
 
+    // 检查是否登录
+    if (!config.getToken() || config.getToken() == '') {
+        location.replace('login.html');
+        return;
+    }
+
+    // 检查多标签功能是否开启
+    index.checkPageTabs();
+
+    // 获取当前用户信息
+    index.getUser(function (user) {
+        $('.layui-layout-admin .layui-header').vm(user);
+        index.initLeftNav();
+        element.render('nav');
+        index.initRouter();
+        index.bindEvent();
+    });
     // 加载设置的主题
     var theme = layui.data('easyweb').theme;
     if (theme) {
@@ -236,4 +257,4 @@
         }
         return true;
     }
-};
\ No newline at end of file
+};
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/index.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/index.html
index 567d597..28c158c 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/index.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/index.html
@@ -1,6 +1,5 @@
 <!DOCTYPE html>
 <html>
-
 <head>
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
     <meta charset="utf-8"/>
@@ -60,37 +59,5 @@
 <script type="text/javascript" src="assets/libs/layui/layui.js"></script>
 <script type="text/javascript" src="assets/js/common.js?v=1.0"></script>
 <script type="text/javascript" src="assets/libs/zTree/js/jquery.ztree.all-3.5.min.js"></script>
-
-<script>
-    layui.config({
-        base: 'module/'
-    }).extend({
-        formSelects: 'formSelects/formSelects-v4',
-        treetable: 'treetable-lay/treetable'
-    }).use(['config', 'index', 'element'], function () {
-        let config = layui.config;
-        let index = layui.index;
-        let element = layui.element;
-
-        // 检查是否登录
-        if (!config.getToken() || config.getToken() == '') {
-            location.replace('login.html');
-            return;
-        }
-
-        // 检查多标签功能是否开启
-        index.checkPageTabs();
-
-        // 获取当前用户信息
-        index.getUser(function (user) {
-            $('.layui-layout-admin .layui-header').vm(user);
-            index.initLeftNav();
-            element.render('nav');
-            index.initRouter();
-            index.bindEvent();
-        });
-    });
-</script>
 </body>
-
 </html>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable2/treeTable.css b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable2/treeTable.css
new file mode 100644
index 0000000..147dc2f
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable2/treeTable.css
@@ -0,0 +1,396 @@
+/* 最外层容器 */
+.ew-tree-table {
+    margin: 10px 0;
+    position: relative;
+}
+
+.ew-tree-table .layui-table {
+    margin: 0;
+    table-layout: fixed;
+}
+
+/* 表格容器 */
+.ew-tree-table-group {
+    position: relative;
+}
+
+/* 主体表格容器 */
+.ew-tree-table > .ew-tree-table-group > .ew-tree-table-box {
+    overflow: auto;
+    position: relative;
+    box-sizing: border-box;
+}
+
+/* 表头表格容器 */
+.ew-tree-table > .ew-tree-table-group > .ew-tree-table-head {
+    overflow: hidden;
+    position: relative;
+    box-sizing: border-box;
+    background-color: #f2f2f2;
+}
+
+/* 容器加边框 */
+.ew-tree-table .ew-tree-table-border {
+    position: absolute;
+    background-color: #e6e6e6;
+}
+
+.ew-tree-table .ew-tree-table-border.top {
+    left: 0;
+    right: 0;
+    top: 0;
+    height: 1px;
+}
+
+.ew-tree-table .ew-tree-table-border.left {
+    top: 0;
+    left: 0;
+    bottom: 0;
+    width: 1px;
+}
+
+.ew-tree-table .ew-tree-table-border.right {
+    top: 0;
+    right: 0;
+    bottom: 0;
+    width: 0.52px;
+}
+
+.ew-tree-table .ew-tree-table-border.bottom {
+    left: 0;
+    right: 0;
+    bottom: 0;
+    height: 0.52px;
+}
+
+/* table的loading */
+.ew-tree-table .ew-tree-table-box > .ew-tree-table-loading {
+    padding: 10px 0;
+    text-align: center;
+}
+
+.ew-tree-table .ew-tree-table-box > .ew-tree-table-loading > i {
+    color: #999;
+    font-size: 30px;
+}
+
+.ew-tree-table .ew-tree-table-box > .ew-tree-table-loading.ew-loading-float {
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 0;
+}
+
+/* 空数据提示 */
+.ew-tree-table .ew-tree-table-box > .ew-tree-table-empty {
+    color: #666;
+    font-size: 14px;
+    text-align: center;
+}
+
+/* 折叠箭头 */
+.ew-tree-table .ew-tree-table-arrow {
+    margin-right: 5px;
+    vertical-align: middle;
+}
+
+.ew-tree-table .ew-tree-table-arrow:before {
+    content: "\e623";
+}
+
+.ew-tree-table .ew-tree-table-open .ew-tree-table-arrow:before {
+    content: "\e625";
+}
+
+.ew-tree-table .ew-tree-table-arrow.arrow2 {
+    font-size: 13px;
+    font-weight: 600;
+    line-height: 16px;
+    height: 16px;
+    width: 16px;
+    display: inline-block;
+    text-align: center;
+    color: #888;
+}
+
+.ew-tree-table .ew-tree-table-arrow.arrow2:before {
+    content: "\e602";
+}
+
+.ew-tree-table .ew-tree-table-open .ew-tree-table-arrow.arrow2:before {
+    content: "\e61a";
+}
+
+/* 箭头隐藏 */
+.ew-tree-table-arrow.ew-tree-table-arrow-hide {
+    visibility: hidden;
+}
+
+/* 箭头变加载中状态 */
+.ew-tree-table .ew-tree-table-loading > td .ew-tree-pack > .ew-tree-table-arrow:before {
+    content: "\e63d" !important;
+}
+
+.ew-tree-table .ew-tree-table-loading > td .ew-tree-pack > .ew-tree-table-arrow {
+    margin-right: 0;
+}
+
+.ew-tree-table .ew-tree-table-loading > td .ew-tree-pack > .ew-tree-table-arrow + * {
+    margin-left: 5px;
+}
+
+/* tr加载中禁用事件 */
+.ew-tree-table tr.ew-tree-table-loading > * {
+    pointer-events: none !important;
+}
+
+/* 图标列 */
+.ew-tree-table .ew-tree-pack {
+    cursor: pointer;
+    line-height: 16px;
+    display: inline-block;
+    vertical-align: middle;
+}
+
+.ew-tree-table .ew-tree-pack > span {
+    height: 16px;
+    line-height: 16px;
+    display: inline-block;
+    vertical-align: middle;
+}
+
+/* 折叠行 */
+.ew-tree-table .ew-tree-tb-hide {
+    display: none;
+}
+
+/* 缩进 */
+.ew-tree-table .ew-tree-table-indent {
+    margin-right: 5px;
+    padding-left: 16px;
+}
+
+/* 图标 */
+.ew-tree-table .ew-tree-icon {
+    margin-right: 5px;
+    display: inline-block;
+    vertical-align: middle;
+}
+
+.ew-tree-table .ew-tree-icon-folder, .ew-tree-table .ew-tree-icon-file {
+    width: 22px;
+    height: 16px;
+    line-height: 16px;
+    position: relative;
+}
+
+.ew-tree-table .ew-tree-icon-folder:after, .ew-tree-table .ew-tree-icon-file:after {
+    content: "";
+    width: 22px;
+    height: 22px;
+    position: absolute;
+    left: 0;
+    top: -3px;
+    background-size: cover;
+    background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTc0MDYyMzE3MTQ3IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjIxNTgiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiPjxkZWZzPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4MSA4MjNoLTMxLjFjLTI4LjYgMC01MS45LTIzLjItNTEuOS01MS45VjI1Mi40YzAtMjguNiAyMy4yLTUxLjkgNTEuOS01MS45SDQzMGw4MyA3Ny44aDMzMmM0NS42IDAgODMgMzUgODMgNzcuOHYzODkuMWMwIDQyLjgtMzcuMyA3Ny44LTgzIDc3LjhIMTgxeiIgcC1pZD0iMjE1OSIgZmlsbD0iI0ZGQTUwMCI+PC9wYXRoPjwvc3ZnPg==")
+}
+
+.ew-tree-table tr.ew-tree-table-open > td > .ew-tree-pack .ew-tree-icon-folder:after {
+    background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTc0MDYyMzA5MDQwIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE5NzciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiPjxkZWZzPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMyNi40IDQ2MC4xSDkyOGwtODIuMyAzMjRjLTUuOCAyMy0yNi42IDM5LjEtNTAuMyAzOS4xSDE0OS45Yy0yOC42IDAtNTEuOS0yMy4yLTUxLjktNTEuOVYyNTIuNmMwLTI4LjYgMjMuMi01MS45IDUxLjktNTEuOUg0MTNsMTA1IDEwMy43aDI5MS44YzE0LjMgMCAyNS45IDExLjYgMjUuOSAyNS45djc3LjhoLTUyN0wyMDMuNCA1NjMuOWg1Mi43bDcwLjMtMTAzLjh6IiBwLWlkPSIxOTc4IiBmaWxsPSIjRkZBNTAwIj48L3BhdGg+PC9zdmc+")
+}
+
+.ew-tree-table .ew-tree-icon-file:after {
+    background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTc0MDYyNTE1MDUxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjEzNTE4IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0Ij48ZGVmcz48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwvc3R5bGU+PC9kZWZzPjxwYXRoIGQ9Ik03NDEuMyAxNjEuNmgtNDIuNGMtMTAuNSAwLTE5LjEgOC42LTE5LjEgMTkuMXM4LjYgMTkuMSAxOS4xIDE5LjFoNDIuNGM0MiAwIDc2LjIgMzQuMiA3Ni4yIDc2LjN2NDc3LjRjMCA0Mi4xLTM0LjMgNzYuMy03Ni40IDc2LjNIMjgyLjljLTQyLjEgMC03Ni4zLTM0LjItNzYuMy03Ni4zVjI3Ni4xYzAtNDIuMSAzNC4yLTc2LjMgNzYuMy03Ni4zaDQ0LjljMTAuNSAwIDE5LjEtOC42IDE5LjEtMTkuMXMtOC42LTE5LjEtMTkuMS0xOS4xaC00NC45Yy02My4xIDAtMTE0LjUgNTEuNC0xMTQuNSAxMTQuNXY0NzcuNGMwIDYzLjEgNTEuNCAxMTQuNSAxMTQuNSAxMTQuNWg0NTguM2M2My4xIDAgMTE0LjUtNTEuNCAxMTQuNS0xMTQuNVYyNzYuMWMtMC4xLTYzLjEtNTEuNC0xMTQuNS0xMTQuNC0xMTQuNXoiIHAtaWQ9IjEzNTE5IiBmaWxsPSIjRkZBNTAwIj48L3BhdGg+PHBhdGggZD0iTTY4MC42IDUwNS4zSDM0My40Yy0xMi4zIDAtMjIuMyA4LjYtMjIuMyAxOS4xczEwIDE5LjEgMjIuMyAxOS4xaDMzNy4yYzEyLjMgMCAyMi4zLTguNiAyMi4zLTE5LjEgMC0xMC42LTEwLTE5LjEtMjIuMy0xOS4xek00MzkuMyAyMTMuM2gxNDQuNmMxOSAwIDM0LjQtMTIuOCAzNC40LTI4LjZzLTE1LjQtMjguNi0zNC40LTI4LjZINDM5LjNjLTE5IDAtMzQuNCAxMi44LTM0LjQgMjguNi0wLjEgMTUuNyAxNS4zIDI4LjYgMzQuNCAyOC42ek02ODAuNiA2NThIMzQzLjRjLTEyLjMgMC0yMi4zIDguNS0yMi4zIDE5LjEgMCAxMC41IDEwIDE5LjEgMjIuMyAxOS4xaDMzNy4yYzEyLjMgMCAyMi4zLTguNiAyMi4zLTE5LjEgMC0xMC42LTEwLTE5LjEtMjIuMy0xOS4xek02ODAuNiAzNTIuNUgzNDMuNGMtMTIuMyAwLTIyLjMgOC42LTIyLjMgMTkuMXMxMCAxOS4xIDIyLjMgMTkuMWgzMzcuMmMxMi4zIDAgMjIuMy04LjYgMjIuMy0xOS4xIDAtMTAuNS0xMC0xOS4xLTIyLjMtMTkuMXoiIHAtaWQ9IjEzNTIwIiBmaWxsPSIjRkZBNTAwIj48L3BhdGg+PC9zdmc+")
+}
+
+/* 序号列调整 */
+.ew-tree-table td[data-type="numbers"] {
+    padding-left: 0;
+    padding-right: 0;
+    text-align: center;
+}
+
+/* 单元格内表单元素样式调整 */
+.ew-tree-table .layui-form-switch {
+    margin-top: 0;
+}
+
+.ew-tree-table .layui-form-radio {
+    margin: 0;
+}
+
+/* checkbox和radio列调整 */
+.ew-tree-table-checkbox + .layui-form-checkbox {
+    padding: 0;
+}
+
+.ew-tree-table-checkbox + .layui-form-checkbox > .layui-icon {
+    color: transparent;
+    transition: background-color .1s linear;
+}
+
+.ew-tree-table-checkbox + .layui-form-checkbox.layui-form-checked > .layui-icon {
+    color: #fff;
+}
+
+.ew-tree-table-radio + .layui-form-radio {
+    padding: 0;
+    height: 20px;
+    line-height: 20px;
+}
+
+.ew-tree-table-radio + .layui-form-radio > i {
+    margin: 0;
+    height: 20px;
+    font-size: 20px;
+    line-height: 20px;
+}
+
+/* checkbox半选状态 */
+.ew-tree-table .layui-form-checked.ew-form-indeterminate > .layui-icon:before {
+    content: "";
+    width: 9px;
+    height: 2px;
+    display: inline-block;
+    background-color: #eee;
+    vertical-align: middle;
+}
+
+.ew-tree-table .layui-form-checked.ew-form-indeterminate > .layui-icon {
+    line-height: 14px;
+}
+
+/* 单元格编辑 */
+.ew-tree-table .layui-table td[data-edit] {
+    cursor: text;
+}
+
+.ew-tree-table .ew-tree-table-edit {
+    position: absolute;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    border-radius: 0;
+    box-shadow: 1px 1px 20px rgba(0, 0, 0, .15);
+}
+
+.ew-tree-table .ew-tree-table-edit:focus {
+    border-color: #5FB878 !important;
+}
+
+.ew-tree-table .ew-tree-table-edit.layui-form-danger {
+    border-color: #FF5722 !important;
+}
+
+/* 搜索数据隐藏行 */
+.ew-tree-table tr.ew-tree-table-filter-hide {
+    display: none !important;
+}
+
+/* 单元格超出隐藏 */
+.ew-tree-table-td-single {
+    position: relative;
+}
+
+.ew-tree-table-td-single > .ew-tree-tips {
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+}
+
+.ew-tree-table-td-single > .ew-tree-tips-c {
+    position: absolute;
+    right: -10px;
+    top: -6px;
+    width: 24px;
+    height: 24px;
+    line-height: 24px;
+    font-size: 18px;
+    text-align: center;
+    color: #fff;
+    border-radius: 50%;
+    background-color: #666;
+    cursor: pointer;
+    display: none;
+}
+
+.ew-tree-table table tr:first-child .ew-tree-table-td-single > .ew-tree-tips-c {
+    top: 2px;
+    bottom: auto;
+    right: -12px;
+}
+
+.ew-tree-table-td-single.ew-tree-tips-open {
+    position: absolute;
+    top: 0;
+    left: 0;
+    z-index: 5;
+    background-color: #fff;
+    min-height: 100%;
+    box-sizing: border-box;
+    box-shadow: 3px 3px 8px rgba(0, 0, 0, .15);
+}
+
+.ew-tree-table table thead .ew-tree-table-td-single.ew-tree-tips-open {
+    background-color: #f2f2f2;
+}
+
+.ew-tree-table-td-single.ew-tree-tips-open.ew-show-left {
+    right: 0;
+    left: auto;
+    box-shadow: -3px 3px 8px rgba(0, 0, 0, .15);
+}
+
+.ew-tree-table-td-single.ew-tree-tips-open.ew-show-bottom {
+    bottom: 0;
+    top: auto;
+    box-shadow: 3px -3px 8px rgba(0, 0, 0, .15);
+}
+
+.ew-tree-table-td-single.ew-tree-tips-open.ew-show-left.ew-show-bottom {
+    box-shadow: -3px -3px 8px rgba(0, 0, 0, .15);
+}
+
+.ew-tree-table-td-single.ew-tree-tips-open > .ew-tree-tips {
+    padding: 9px 15px;
+    overflow: auto;
+    max-width: 280px;
+    max-height: 100px;
+    width: max-content;
+    white-space: normal;
+}
+
+.ew-tree-table-td-single.ew-tree-tips-open > .ew-tree-tips-c {
+    display: block;
+}
+
+.ew-tree-table-td-single.ew-tree-tips-open.ew-show-left > .ew-tree-tips-c {
+    left: -10px;
+    right: auto !important;
+}
+
+.ew-tree-table td > .layui-table-grid-down {
+    bottom: 0;
+    height: auto;
+}
+
+/* 辅助样式 */
+.pd-tb-0 {
+    padding-top: 0 !important;
+    padding-bottom: 0 !important;
+}
+
+.break-all {
+    word-break: break-all !important;
+}
+
+/* 列宽拖拽调整 */
+/*.ew-tree-table .ew-tb-resize {
+    position: absolute;
+    right: 0;
+    top: 0;
+    bottom: 0;
+    width: 10px;
+    cursor: col-resize;
+}*/
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable2/treeTable.js b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable2/treeTable.js
new file mode 100644
index 0000000..8906848
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable2/treeTable.js
@@ -0,0 +1,1494 @@
+/**
+ * 树形表格 2.x
+ * date:2019-11-08   License By http://easyweb.vip
+ */
+layui.define(['layer', 'laytpl', 'form'], function (exports) {
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var laytpl = layui.laytpl;
+    var form = layui.form;
+    var device = layui.device();
+    var MOD_NAME = 'treeTable2';  // 绑定事件的模块名
+    // 改为同步加载css,避免滚动条补丁首次进入无效
+    $.ajax({
+        url: layui.cache.base + 'treeTable2/treeTable.css',
+        async: false,
+        success: function (res) {
+            $('head').append('<style id="ew-tree-table-css">' + res + '</style>');
+        }
+    });
+
+    /** TreeTable类构造方法 */
+    var TreeTable = function (options) {
+        // 表格默认参数
+        var defaultOption = {
+            elem: undefined,   // table容器
+            data: [],  // 数据
+            cols: [],  // 列配置
+            reqData: undefined,  // 异步加载数据的方法
+            width: undefined,  // 容器宽度
+            height: undefined,  // 容器高度
+            cellMinWidth: 100,  // 单元格最小宽度
+            skin: undefined,  // 表格风格
+            size: undefined,  // 表格尺寸
+            even: undefined,  // 是否开启隔行变色
+            style: undefined,   // 容器样式
+            getThead: function () {  // 获取表头
+                return getThead(this);
+            },
+            getAllChooseBox: function () {  // 获取全选按钮
+                return getAllChooseBox(this);
+            },
+            getColgroup: function () {  // 获取colgroup
+                return getColgroup(this);
+            },
+            getTbWidth: function () {  // 计算table的宽度
+                return getTbWidth(this);
+            },
+            tree: {},
+            text: {}
+        };
+        // 默认tree参数
+        var treeDefaultOption = {
+            idName: 'id',  // id的字段名
+            pidName: 'pid',  // pid的字段名
+            childName: 'children',  // children的字段名
+            haveChildName: 'haveChild',  // 是否有children标识的字段名
+            openName: 'open',  // 是否默认展开的字段名
+            isPidData: false,  // 是否是pid形式的数据
+            iconIndex: 0,  // 图标列的索引
+            arrowType: undefined,  // 箭头类型
+            onlyIconControl: false,  // 仅允许点击图标折叠
+            getIcon: function (d) {  // 自定义图标
+                return getIcon(d, this);
+            }
+        };
+        // 默认提示文本
+        var textDefaultOption = {
+            none: '<div style="padding: 18px 0;">暂无数据</div>'  // 空文本提示文字
+        };
+        this.options = $.extend(defaultOption, options);
+        this.options.tree = $.extend(treeDefaultOption, options.tree);
+        this.options.text = $.extend(textDefaultOption, options.text);
+        for (var i = 0; i < options.cols.length; i++) {
+            // 列默认参数
+            var colDefaultOption = {
+                field: undefined,   // 字段名
+                title: undefined,   // 标题
+                align: undefined,  // 对齐方式
+                templet: undefined,  // 自定义模板
+                toolbar: undefined,  // 工具列
+                width: undefined,   // 宽度
+                minWidth: undefined,  // 最小宽度
+                type: undefined,    // 列类型
+                style: undefined,   // 单元格样式
+                class: '',  // 单元格class
+                singleLine: true,  // 一行显示
+                fixed: undefined,    // 固定列
+                unresize: false   // 关闭拖拽列宽
+            };
+            this.options.cols[i] = $.extend(colDefaultOption, options.cols[i]);
+        }
+        this.init();  // 初始化表格
+        this.bindEvents();  // 绑定事件
+    };
+
+    /** 初始化表格 */
+    TreeTable.prototype.init = function () {
+        var options = this.options;
+        var tbFilter = options.elem.substring(1);  // 树表格的filter
+        var $elem = $(options.elem);  // 原始表格
+
+        // 生成树表格dom
+        $elem.removeAttr('lay-filter');
+        $elem.next('.ew-tree-table').remove();
+        var viewHtml = '<div class="layui-form ew-tree-table" style="' + (options.style || '') + '">';
+        viewHtml += '      <div class="ew-tree-table-group">';
+        viewHtml += '         <div class="ew-tree-table-head">';
+        viewHtml += '            <table class="layui-table"></table>';
+        viewHtml += '            <div class="ew-tree-table-border bottom"></div>';
+        viewHtml += '         </div>';
+        viewHtml += '         <div class="ew-tree-table-box">';
+        viewHtml += '            <table class="layui-table"></table>';
+        viewHtml += '            <div class="ew-tree-table-loading"><i class="layui-icon layui-anim layui-anim-rotate layui-anim-loop">&#xe63d;</i></div>';
+        viewHtml += '            <div class="ew-tree-table-empty" style="display: none;">' + (options.text.none || '') + '</div>';
+        viewHtml += '         </div>';
+        viewHtml += '      </div>';
+        viewHtml += '      <div class="ew-tree-table-border top"></div><div class="ew-tree-table-border left"></div>';
+        viewHtml += '      <div class="ew-tree-table-border right"></div><div class="ew-tree-table-border bottom"></div>';
+        viewHtml += '   </div>';
+        $elem.after(viewHtml);
+
+        // 获取各个组件
+        var components = this.getComponents();
+        var $view = components.$view;   // 容器
+        $view.attr('lay-filter', tbFilter);
+        var $group = components.$group;  // 表格容器
+        var $tbBox = components.$tbBox;  // 表格主体部分容器
+        var $table = components.$table;  // 主体表格
+        var $headTb = components.$headTb;  // 表头表格
+        var $tbEmpty = components.$tbEmpty;  // 空视图
+        var $tbLoading = components.$tbLoading;  // 空视图
+
+        // 基础参数设置
+        options.skin && $table.attr('lay-skin', options.skin);
+        options.size && $table.attr('lay-size', options.size);
+        options.even && $table.attr('lay-even', options.even);
+
+        // 容器边框调整
+        if (device.ie) {
+            $view.find('.ew-tree-table-border.bottom').css('height', '1px');
+            $view.find('.ew-tree-table-border.right').css('width', '1px');
+        }
+
+        // 固定宽度
+        if (options.width) {
+            $view.css('width', options.width);
+            $headTb.parent().css('width', options.width);
+            $tbBox.css('width', options.width);
+        }
+        // col最小宽度
+        var tbWidth = options.getTbWidth();
+        if (tbWidth.setWidth) {
+            $table.css('width', tbWidth.minWidth);
+            $headTb.css('width', tbWidth.minWidth);
+        } else {
+            $table.css('min-width', tbWidth.minWidth);
+            $headTb.css('min-width', tbWidth.minWidth);
+        }
+
+        // 渲染表结构及表头
+        var colgroupHtmlStr = options.getColgroup();
+        var headHtmlStr = colgroupHtmlStr + '<thead>' + options.getThead() + '</thead>';
+        if (options.height) {  // 固定表头
+            $table.html(colgroupHtmlStr + '<tbody></tbody>');
+            $headTb.html(headHtmlStr);
+            $table.css('margin-top', '-1px');
+            if (options.height.indexOf('full-') == 0) {  // 差值高度
+                var h = parseFloat(options.height.substring(5));
+                var cssStr = '<style>.ew-tree-table > .ew-tree-table-group > .ew-tree-table-box {';
+                cssStr += '      height: ' + (getPageHeight() - h) + 'px;';
+                cssStr += '      height: -moz-calc(100vh - ' + h + 'px);';
+                cssStr += '      height: -webkit-calc(100vh - ' + h + 'px);';
+                cssStr += '      height: calc(100vh - ' + h + 'px);';
+                cssStr += '   }</style>';
+                $tbBox.after(cssStr);
+                $tbBox.attr('ew-tree-full', h);
+            } else {  // 固定高度
+                $tbBox.css('height', options.height);
+            }
+        } else {
+            $table.html(headHtmlStr + '<tbody></tbody>');
+        }
+        form.render('checkbox', tbFilter);  // 渲染表头的表单元素
+
+        // 渲染数据
+        if (options.reqData) {  // 异步加载
+            this.renderBodyAsync();
+        } else {  // 一次性渲染
+            if (options.data && options.data.length > 0) {
+                // 处理数据
+                if (options.tree.isPidData) {  // pid形式数据
+                    options.data = treeTb.pidToChildren(options.data, options.tree.idName, options.tree.pidName, options.tree.childName);
+                } else {  // children形式数据
+                    addPidField(options.data, options.tree);
+                }
+                $table.children('tbody').html(this.renderBody(options.data));
+                $tbLoading.hide();
+                this.renderNumberCol();  // 渲染序号列
+                form.render(null, tbFilter);  // 渲染表单元素
+                this.checkChooseAllCB();  // 联动全选框
+                updateFixedTbHead($view);
+            } else {
+                $tbLoading.hide();
+                $tbEmpty.show();
+            }
+        }
+    };
+
+    /** 绑定各项事件 */
+    TreeTable.prototype.bindEvents = function () {
+        var that = this;
+        var options = this.options;
+        var components = this.getComponents();
+        var $view = components.$view;
+        var $table = components.$table;
+        var $tbEmpty = components.$tbEmpty;
+        var tbFilter = components.tbFilter;
+        var checkboxFilter = components.checkboxFilter;
+        var radioFilter = components.radioFilter;
+        var cbAllFilter = components.cbAllFilter;
+        var $tbody = $table.children('tbody');
+
+        /** 行事件公共返回对象 */
+        var commonMember = function (ext) {
+            var $tr = $(this);
+            if (!$tr.is('tr')) {
+                var $td_tr = $tr.parent('tr[data-id]');
+                if ($td_tr.length > 0) {
+                    $tr = $td_tr;
+                } else {
+                    $tr = $tr.parentsUntil('tr[data-id]').last().parent();
+                }
+            }
+            var id = $tr.data('id');
+            var data = getDataById(options.data, id, options.tree);
+            var obj = {
+                tr: $tr,  // 当前行
+                data: data, //当前行数据
+                del: function () { // 删除行
+                    var indent = parseInt(this.tr.data('indent'));
+                    this.tr.nextAll('tr').each(function () {
+                        if (parseInt($(this).data('indent')) <= indent) {
+                            return false;
+                        }
+                        $(this).remove();
+                    });
+                    var $parentTr = this.tr.prevAll('tr');
+                    this.tr.remove();
+                    delDataById(options.data, id, options.tree);
+                    if (!options.data || options.data.length <= 0) {
+                        $tbEmpty.show();
+                    }
+                    that.renderNumberCol();  // 渲染序号列
+                    // 联动父级
+                    $parentTr.each(function () {
+                        var tInd = parseInt($(this).data('indent'));
+                        if (tInd < indent) {
+                            that.checkParentCB($(this));
+                            indent = tInd;
+                        }
+                    });
+                    that.checkChooseAllCB();  // 联动全选框
+                },
+                update: function (fields) {  // 修改行
+                    data = $.extend(data, fields);
+                    var indent = parseInt(this.tr.data('indent'));
+                    that.renderBodyTr(data, indent, undefined, this.tr);
+                    form.render(null, tbFilter);  // 渲染表单元素
+                    that.checkIndeterminateCB();  // 恢复半选框状态
+                    that.checkChooseAllCB();  // 联动全选框
+                }
+            };
+            return $.extend(obj, ext);
+        };
+
+        // 绑定折叠展开事件
+        $tbody.off('click.fold').on('click.fold', '.ew-tree-pack', function (e) {
+            layui.stope(e);
+            var $tr = $(this).parentsUntil('tr').last().parent();
+            if ($tr.hasClass('ew-tree-table-loading')) {  // 已是加载中
+                return;
+            }
+            var haveChild = $tr.data('have-child');
+            if (haveChild != true && haveChild != 'true') {  // 子节点
+                return;
+            }
+            var id = $tr.data('id');
+            var isOpen = $tr.hasClass('ew-tree-table-open');
+            var data = getDataById(options.data, id, options.tree);
+            if (!isOpen && (!data[options.tree.childName] || data[options.tree.childName].length <= 0)) {
+                that.renderBodyAsync(data, $tr);
+            } else {
+                toggleRow($tr);
+            }
+        });
+
+        // 绑定lay-event事件
+        $tbody.off('click.tool').on('click.tool', '*[lay-event]', function (e) {
+            layui.stope(e);
+            var $this = $(this);
+            layui.event.call(this, MOD_NAME, 'tool(' + tbFilter + ')', commonMember.call(this, {
+                event: $this.attr('lay-event')
+            }));
+        });
+
+        // 绑定单选框事件
+        form.on('radio(' + radioFilter + ')', function (data) {
+            var d = getDataById(options.data, data.value, options.tree);
+            that.removeAllChecked();
+            d.LAY_CHECKED = true;  // 同时更新数据
+            layui.event.call(this, MOD_NAME, 'checkbox(' + tbFilter + ')', {checked: true, data: d, type: 'one'});
+        });
+
+        // 绑定复选框事件
+        form.on('checkbox(' + checkboxFilter + ')', function (data) {
+            var checked = data.elem.checked;
+            var $cb = $(data.elem);
+            var $layCb = $cb.next('.layui-form-checkbox');
+            // 如果是半选状态,点击全选
+            if (!checked && $layCb.hasClass('ew-form-indeterminate')) {
+                checked = true;
+                $cb.prop('checked', checked);
+                $cb.data('indeterminate', 'false');
+                $layCb.addClass('layui-form-checked');
+                $layCb.removeClass('ew-form-indeterminate');
+            }
+            var d = getDataById(options.data, data.value, options.tree);
+            d.LAY_CHECKED = checked;  // 同时更新数据
+            // 联动操作
+            var $tr = $cb.parentsUntil('tr').last().parent();
+            if (d[options.tree.childName] && d[options.tree.childName].length > 0) {
+                that.checkSubCB($tr, checked);  // 联动子级
+            }
+            var indent = parseInt($tr.data('indent'));
+            $tr.prevAll('tr').each(function () {
+                var tInd = parseInt($(this).data('indent'));
+                if (tInd < indent) {
+                    that.checkParentCB($(this));  // 联动父级
+                    indent = tInd;
+                }
+            });
+            that.checkChooseAllCB();  // 联动全选框
+            // 回调事件
+            layui.event.call(this, MOD_NAME, 'checkbox(' + tbFilter + ')', {
+                checked: checked,
+                data: d,
+                type: 'one'
+            });
+        });
+
+        // 绑定全选复选框事件
+        form.on('checkbox(' + cbAllFilter + ')', function (data) {
+            var checked = data.elem.checked;
+            var $cb = $(data.elem);
+            var $layCb = $cb.next('.layui-form-checkbox');
+            if (!options.data || options.data.length <= 0) {  // 如果数据为空
+                $cb.prop('checked', false);
+                $cb.data('indeterminate', 'false');
+                $layCb.removeClass('layui-form-checked ew-form-indeterminate');
+                return;
+            }
+            // 如果是半选状态,点击全选
+            if (!checked && $layCb.hasClass('ew-form-indeterminate')) {
+                checked = true;
+                $cb.prop('checked', checked);
+                $cb.data('indeterminate', 'false');
+                $layCb.addClass('layui-form-checked');
+                $layCb.removeClass('ew-form-indeterminate');
+            }
+            layui.event.call(this, MOD_NAME, 'checkbox(' + tbFilter + ')', {
+                checked: checked,
+                data: undefined,
+                type: 'all'
+            });
+            that.checkSubCB($table.children('tbody'), checked);  // 联动操作
+        });
+
+        // 绑定行单击事件
+        $tbody.off('click.row').on('click.row', 'tr', function () {
+            layui.event.call(this, MOD_NAME, 'row(' + tbFilter + ')', commonMember.call(this, {}));
+        });
+
+        // 绑定行双击事件
+        $tbody.off('dblclick.rowDouble').on('dblclick.rowDouble', 'tr', function () {
+            layui.event.call(this, MOD_NAME, 'rowDouble(' + tbFilter + ')', commonMember.call(this, {}));
+        });
+
+        // 绑定单元格点击事件
+        $tbody.off('click.cell').on('click.cell', 'td', function (e) {
+            var $td = $(this);
+            var type = $td.data('type');
+            // 判断是否是复选框、单选框列
+            if (type == 'checkbox' || type == 'radio') {
+                layui.stope(e);
+                return;
+            }
+            var edit = $td.data('edit');
+            var field = $td.data('field');
+            if (edit) {  // 开启了单元格编辑
+                layui.stope(e);
+                if ($tbody.find('.ew-tree-table-edit').length > 0) {
+                    return;
+                }
+                var index = $td.data('index');
+                var indentSize = $td.children('.ew-tree-table-indent').length;
+                var id = $td.parent().data('id');
+                var d = getDataById(options.data, id, options.tree);
+                if ('text' == edit || 'number' == edit) {  // 文本框
+                    var $input = $('<input type="' + edit + '" class="layui-input ew-tree-table-edit"/>');
+                    $input[0].value = d[field];
+                    $td.append($input);
+                    $input.focus();
+                    $input.blur(function () {
+                        var value = $(this).val();
+                        if (value == d[field]) {
+                            $(this).remove();
+                            return;
+                        }
+                        var rs = layui.event.call(this, MOD_NAME, 'edit(' + tbFilter + ')', commonMember.call(this, {
+                            value: value,
+                            field: field
+                        }));
+                        if (rs == false) {
+                            $(this).addClass('layui-form-danger');
+                            $(this).focus();
+                        } else {
+                            d[field] = value;  // 同步更新数据
+                            that.renderBodyTd(d, indentSize, index, $td);  // 更新单元格
+                        }
+                    });
+                } else {
+                    console.error('不支持的单元格编辑类型:' + edit);
+                }
+            } else {  // 回调单元格点击事件
+                var rs = layui.event.call(this, MOD_NAME, 'cell(' + tbFilter + ')', commonMember.call(this, {
+                    td: $td,
+                    field: field
+                }));
+                if (rs == false) {
+                    layui.stope(e);
+                }
+            }
+        });
+
+        // 绑定单元格双击事件
+        $tbody.off('dblclick.cellDouble').on('dblclick.cellDouble', 'td', function (e) {
+            var $td = $(this);
+            var type = $td.data('type');
+            // 判断是否是复选框、单选框列
+            if (type == 'checkbox' || type == 'radio') {
+                layui.stope(e);
+                return;
+            }
+            var edit = $td.data('edit');
+            var field = $td.data('field');
+            if (edit) {  // 开启了单元格编辑
+                layui.stope(e);
+            } else {  // 回调单元格双击事件
+                var rs = layui.event.call(this, MOD_NAME, 'cellDouble(' + tbFilter + ')', commonMember.call(this, {
+                    td: $td,
+                    field: field
+                }));
+                if (rs == false) {
+                    layui.stope(e);
+                }
+            }
+        });
+
+        // 同步滚动条
+        components.$tbBox.on('scroll', function () {
+            var $this = $(this);
+            var scrollLeft = $this.scrollLeft();
+            var scrollTop = $this.scrollTop();
+            components.$headTb.parent().scrollLeft(scrollLeft);
+            // $headGroup.scrollTop(scrollTop);
+        });
+
+        // 列宽拖拽调整
+        /*$view.off('mousedown.resize').on('mousedown.resize', '.ew-tb-resize', function (e) {
+            layui.stope(e);
+            var index = $(this).parent().data('index');
+            $(this).data('move', 'true');
+            $(this).data('x', e.clientX);
+            var w = $(this).parent().parent().parent().parent().children('colgroup').children('col').eq(index).attr('width');
+            $(this).data('width', w);
+        });
+        $view.off('mousemove.resize').on('mousemove.resize', '.ew-tb-resize', function (e) {
+            layui.stope(e);
+            var move = $(this).data('move');
+            if ('true' == move) {
+                var x = $(this).data('x');
+                var w = $(this).data('width');
+                var index = $(this).parent().data('index');
+                var nw = parseFloat(w) + e.clientX - parseFloat(x);
+                $(this).parent().parent().parent().parent().children('colgroup').children('col').eq(index).attr('width', nw);
+            }
+        });
+        $view.off('mouseup.resize').on('mouseup.resize', '.ew-tb-resize', function (e) {
+            layui.stope(e);
+            $(this).data('move', 'false');
+        });
+        $view.off('mouseleave.resize').on('mouseleave.resize', '.ew-tb-resize', function (e) {
+            layui.stope(e);
+            $(this).data('move', 'false');
+        });*/
+
+    };
+
+    /** 获取各个组件 */
+    TreeTable.prototype.getComponents = function () {
+        var $view = $(this.options.elem).next();   // 容器
+        var $group = $view.children('.ew-tree-table-group');  // 表格容器
+        var $tbBox = $group.children('.ew-tree-table-box');  // 表格主体部分容器
+        var $table = $tbBox.children('.layui-table');  // 主体表格
+        var $headTb = $group.children('.ew-tree-table-head').children('.layui-table');  // 表头表格
+        var $tbEmpty = $tbBox.children('.ew-tree-table-empty');  // 空视图
+        var $tbLoading = $tbBox.children('.ew-tree-table-loading');  // 加载视图
+        var tbFilter = $view.attr('lay-filter');  // 容器filter
+        var checkboxFilter = 'ew_tb_checkbox_' + tbFilter;  // 复选框filter
+        var radioFilter = 'ew_tb_radio_' + tbFilter;  // 单选框filter
+        var cbAllFilter = 'ew_tb_choose_all_' + tbFilter;  // 全选按钮filter
+        return {
+            $view: $view,
+            $group: $group,
+            $tbBox: $tbBox,
+            $table: $table,
+            $headTb: $headTb,
+            $tbEmpty: $tbEmpty,
+            $tbLoading: $tbLoading,
+            tbFilter: tbFilter,
+            checkboxFilter: checkboxFilter,
+            radioFilter: radioFilter,
+            cbAllFilter: cbAllFilter
+        };
+    };
+
+    /**
+     * 递归渲染表格主体部分
+     * @param data 数据列表
+     * @param indentSize 缩进大小
+     * @param isHide 是否默认隐藏
+     * @returns {string}
+     */
+    TreeTable.prototype.renderBody = function (data, indentSize, isHide) {
+        var options = this.options;
+        var treeOption = options.tree;
+        indentSize || (indentSize = 0);
+        var htmlStr = '';
+        for (var i = 0; i < data.length; i++) {
+            var d = data[i];
+            htmlStr += this.renderBodyTr(d, indentSize, isHide);
+            // 递归渲染子集
+            var children = d[treeOption.childName];
+            if (children && children.length > 0) {
+                htmlStr += this.renderBody(children, indentSize + 1, !d[treeOption.openName]);
+            }
+        }
+        return htmlStr;
+    };
+
+    /**
+     * 渲染一行数据
+     * @param d 行数据
+     * @param option 配置
+     * @param indentSize 缩进大小
+     * @param isHide 是否隐藏
+     * @param $tr
+     * @returns {string}
+     */
+    TreeTable.prototype.renderBodyTr = function (d, indentSize, isHide, $tr) {
+        var options = this.options;
+        var cols = options.cols;
+        var treeOption = options.tree;
+        indentSize || (indentSize = 0);
+        var htmlStr = '';
+        var haveChild = getHaveChild(d, treeOption);
+        if ($tr) {
+            $tr.data('pid', d[treeOption.pidName] || '');
+            $tr.data('have-child', haveChild);
+            $tr.data('indent', indentSize);
+            $tr.removeClass('ew-tree-table-loading');
+        } else {
+            var classNames = '';
+            if (haveChild && d[treeOption.openName]) {
+                classNames += 'ew-tree-table-open';
+            }
+            if (isHide) {
+                classNames += 'ew-tree-tb-hide';
+            }
+            htmlStr += '<tr class="' + classNames + '" data-id="' + d[treeOption.idName] + '"';
+            htmlStr += ' data-pid="' + (d[treeOption.pidName] || '') + '" data-have-child="' + haveChild + '"';
+            htmlStr += ' data-indent="' + indentSize + '">';
+        }
+        for (var j = 0; j < cols.length; j++) {
+            var $td;
+            if ($tr) {
+                $td = $tr.children('td').eq(j);
+            }
+            htmlStr += this.renderBodyTd(d, indentSize, j, $td);
+        }
+        htmlStr += '</tr>';
+        return htmlStr;
+    };
+
+    /**
+     * 渲染每一个单元格数据
+     * @param d 行数据
+     * @param indentSize 缩进大小
+     * @param index 第几列
+     * @param $td
+     * @returns {string}
+     */
+    TreeTable.prototype.renderBodyTd = function (d, indentSize, index, $td) {
+        var options = this.options;
+        var col = options.cols[index];
+        var treeOption = options.tree;
+        var components = this.getComponents();
+        var checkboxFilter = components.checkboxFilter;
+        var radioFilter = components.radioFilter;
+        indentSize || (indentSize = 0);
+        // 内容填充
+        var fieldStr = '';
+        if (col.type == 'numbers') {  // 序号列
+            fieldStr += '<span class="ew-tree-table-numbers"></span>';
+            col.singleLine = false;
+        } else if (col.type == 'checkbox') {  // 复选框列
+            var attrStr = 'name="' + checkboxFilter + '" lay-filter="' + checkboxFilter + '" value="' + d[treeOption.idName] + '"';
+            attrStr += d.LAY_CHECKED ? ' checked="checked"' : '';
+            fieldStr += '<input type="checkbox" lay-skin="primary" ' + attrStr + ' class="ew-tree-table-checkbox" />';
+            col.singleLine = false;
+        } else if (col.type == 'radio') {  // 单选框列
+            var attrStr = 'name="' + radioFilter + '" lay-filter="' + radioFilter + '" value="' + d[treeOption.idName] + '"';
+            attrStr += d.LAY_CHECKED ? ' checked="checked"' : '';
+            fieldStr += '<input type="radio" ' + attrStr + ' class="ew-tree-table-radio" />';
+            col.singleLine = false;
+        } else if (col.templet) {  // 自定义模板
+            if (typeof col.templet == 'function') {
+                fieldStr += col.templet(d);
+            } else if (typeof col.templet == 'string') {
+                laytpl($(col.templet).html()).render(d, function (html) {
+                    fieldStr += html;
+                });
+            }
+        } else if (col.toolbar) {  // 工具列
+            laytpl($(col.toolbar).html()).render(d, function (html) {
+                fieldStr += html;
+            });
+        } else if (col.field && d[col.field] != undefined && d[col.field] != null) {  // 普通字段
+            fieldStr += d[col.field];
+        }
+        var tdStr = '';
+        // 图标列处理
+        if (index == treeOption.iconIndex) {
+            // 缩进
+            for (var k = 0; k < indentSize; k++) {
+                tdStr += '<span class="ew-tree-table-indent"></span>';
+            }
+            tdStr += '<span class="ew-tree-pack">';
+            // 加箭头
+            var haveChild = getHaveChild(d, treeOption);
+            tdStr += ('<i class="layui-icon ew-tree-table-arrow ' + (haveChild ? '' : 'ew-tree-table-arrow-hide') + ' ' + (options.tree.arrowType || '') + '"></i>');
+            // 加图标
+            tdStr += treeOption.getIcon(d);
+            if (options.tree.onlyIconControl) {
+                tdStr += '</span>';
+                tdStr += ('<span>' + fieldStr + '</span>');
+            } else {
+                tdStr += ('<span>' + fieldStr + '</span>');
+                tdStr += '</span>';
+            }
+        } else {
+            tdStr += fieldStr;
+        }
+        if ($td && col.type != 'numbers') {
+            $td.html(tdStr);
+        }
+        var htmlStr = '<td data-index="' + index + '" ';
+        col.field && (htmlStr += (' data-field="' + col.field + '"'));
+        col.edit && (htmlStr += (' data-edit="' + col.edit + '"'));
+        col.type && (htmlStr += (' data-type="' + col.type + '"'));
+        col.align && (htmlStr += (' align="' + col.align + '"'));  // 对齐方式
+        col.style && (htmlStr += (' style="' + col.style + '"'));  // 单元格样式
+        col.class && (htmlStr += (' class="' + col.class + '"'));  // 单元格样式
+        htmlStr += '>';
+        if (col.singleLine) {
+            htmlStr += ('<div class="ew-tree-table-td-single"><i class="layui-icon layui-icon-close ew-tree-tips-c"></i><div class="ew-tree-tips">' + tdStr + '</div></div>');
+        } else {
+            htmlStr += tdStr;
+        }
+        htmlStr += '</td>';
+        return htmlStr;
+    };
+
+    /**
+     * 异步加载渲染
+     * @param data 父级数据
+     * @param $tr 父级dom
+     */
+    TreeTable.prototype.renderBodyAsync = function (d, $tr) {
+        var that = this;
+        var options = this.options;
+        var components = this.getComponents();
+        var $tbEmpty = components.$tbEmpty;
+        var $tbLoading = components.$tbLoading;
+        // 显示loading
+        if ($tr) {
+            $tr.addClass('ew-tree-table-loading');
+            $tr.children('td').find('.ew-tree-pack').children('.ew-tree-table-arrow').addClass('layui-anim layui-anim-rotate layui-anim-loop');
+        } else {
+            if (options.data && options.data.length > 0) {
+                $tbLoading.addClass('ew-loading-float');
+            }
+            $tbLoading.show();
+            $tbEmpty.hide();
+        }
+        // 请求数据
+        options.reqData(d, function (res) {
+            if (options.tree.isPidData) {
+                res = treeTb.pidToChildren(res, options.tree.idName, options.tree.pidName, options.tree.childName);
+            }
+            that.renderBodyData(res, d, $tr);  // 渲染内容
+            // 移除loading
+            if ($tr) {
+                $tr.removeClass('ew-tree-table-loading');
+                $tr.children('td').find('.ew-tree-pack').children('.ew-tree-table-arrow').removeClass('layui-anim layui-anim-rotate layui-anim-loop');
+            } else {
+                $tbLoading.hide();
+                $tbLoading.removeClass('ew-loading-float');
+                // 是否为空
+                if (!res || res.length == 0) {
+                    $tbEmpty.show();
+                } else {
+                    $tbEmpty.hide();
+                }
+            }
+        });
+    };
+
+    /**
+     * 根据数据渲染body
+     * @param data  数据集合
+     * @param option 配置项
+     * @param d 父级数据
+     * @param $tr 父级dom
+     */
+    TreeTable.prototype.renderBodyData = function (data, d, $tr) {
+        var that = this;
+        var options = this.options;
+        var components = this.getComponents();
+        var $view = components.$view;
+        var $table = components.$table;
+        var tbFilter = components.tbFilter;
+        addPidField(data, options.tree, d);  // 补充pid字段
+        // 更新到数据
+        if (d == undefined) {
+            options.data = data;
+        } else {
+            d[options.tree.childName] = data;
+        }
+        var indent;
+        if ($tr) {
+            indent = parseInt($tr.data('indent')) + 1;
+        }
+        var htmlStr = this.renderBody(data, indent);
+        if ($tr) {
+            // 移除旧dom
+            $tr.nextAll('tr').each(function () {
+                if (parseInt($(this).data('indent')) <= (indent - 1)) {
+                    return false;
+                }
+                $(this).remove();
+            });
+            // 渲染新dom
+            $tr.after(htmlStr);
+            $tr.addClass('ew-tree-table-open');
+        } else {
+            $table.children('tbody').html(htmlStr);
+        }
+        form.render(null, tbFilter);  // 渲染表单元素
+        this.renderNumberCol();  // 渲染序号列
+        this.checkIndeterminateCB();  // 恢复复选框半选状态
+        if ($tr) {
+            // 更新父级复选框状态
+            this.checkParentCB($tr);
+            $tr.prevAll('tr').each(function () {
+                var tInd = parseInt($(this).data('indent'));
+                if (tInd < (indent - 1)) {
+                    that.checkParentCB($(this));
+                    indent = tInd + 1;
+                }
+            });
+        }
+        this.checkChooseAllCB();  // 联动全选框
+        updateFixedTbHead($view);
+    };
+
+    /**
+     * 联动子级复选框状态
+     * @param $tr 当前tr的dom
+     * @param checked
+     */
+    TreeTable.prototype.checkSubCB = function ($tr, checked) {
+        var that = this;
+        var components = this.getComponents();
+        var cbFilter = components.checkboxFilter;
+        var indent = -1, $trList;
+        if ($tr.is('tbody')) {
+            $trList = $tr.children('tr');
+        } else {
+            indent = parseInt($tr.data('indent'));
+            $trList = $tr.nextAll('tr')
+        }
+        $trList.each(function () {
+            if (parseInt($(this).data('indent')) <= indent) {
+                return false;
+            }
+            var $cb = $(this).children('td').find('input[name="' + cbFilter + '"]');
+            $cb.prop('checked', checked);
+            if (checked) {
+                $cb.data('indeterminate', 'false');
+                $cb.next('.layui-form-checkbox').addClass('layui-form-checked');
+                $cb.next('.layui-form-checkbox').removeClass('ew-form-indeterminate');
+            } else {
+                $cb.data('indeterminate', 'false');
+                $cb.next('.layui-form-checkbox').removeClass('layui-form-checked ew-form-indeterminate');
+            }
+            that.update($(this).data('id'), {LAY_CHECKED: checked});  // 同步更新数据
+        });
+    };
+
+    /**
+     * 联动父级复选框状态
+     * @param $tr 父级的dom
+     */
+    TreeTable.prototype.checkParentCB = function ($tr) {
+        var that = this;
+        var components = this.getComponents();
+        var cbFilter = components.checkboxFilter;
+        var indent = parseInt($tr.data('indent'));
+        var ckNum = 0, unCkNum = 0;
+        $tr.nextAll('tr').each(function () {
+            if (parseInt($(this).data('indent')) <= indent) {
+                return false;
+            }
+            var $cb = $(this).children('td').find('input[name="' + cbFilter + '"]');
+            if ($cb.prop('checked')) {
+                ckNum++;
+            } else {
+                unCkNum++;
+            }
+        });
+        var $cb = $tr.children('td').find('input[name="' + cbFilter + '"]');
+        if (ckNum > 0 && unCkNum == 0) {  // 全选
+            $cb.prop('checked', true);
+            $cb.data('indeterminate', 'false');
+            $cb.next('.layui-form-checkbox').addClass('layui-form-checked');
+            $cb.next('.layui-form-checkbox').removeClass('ew-form-indeterminate');
+            that.update($tr.data('id'), {LAY_CHECKED: true});  // 同步更新数据
+        } else if (ckNum == 0 && unCkNum > 0) {  // 全不选
+            $cb.prop('checked', false);
+            $cb.data('indeterminate', 'false');
+            $cb.next('.layui-form-checkbox').removeClass('layui-form-checked ew-form-indeterminate');
+            that.update($tr.data('id'), {LAY_CHECKED: false});  // 同步更新数据
+        } else if (ckNum > 0 && unCkNum > 0) {  // 半选
+            $cb.prop('checked', true);
+            $cb.data('indeterminate', 'true');
+            $cb.next('.layui-form-checkbox').addClass('layui-form-checked ew-form-indeterminate');
+            that.update($tr.data('id'), {LAY_CHECKED: true});  // 同步更新数据
+        }
+    };
+
+    /** 联动全选复选框 */
+    TreeTable.prototype.checkChooseAllCB = function () {
+        var components = this.getComponents();
+        var cbAllFilter = components.cbAllFilter;
+        var cbFilter = components.checkboxFilter;
+        var $tbody = components.$table.children('tbody');
+        var ckNum = 0, unCkNum = 0;
+        $tbody.children('tr').each(function () {
+            var $cb = $(this).children('td').find('input[name="' + cbFilter + '"]');
+            if ($cb.prop('checked')) {
+                ckNum++;
+            } else {
+                unCkNum++;
+            }
+        });
+        var $cb = $('input[lay-filter="' + cbAllFilter + '"]');
+        if (ckNum > 0 && unCkNum == 0) {  // 全选
+            $cb.prop('checked', true);
+            $cb.data('indeterminate', 'false');
+            $cb.next('.layui-form-checkbox').addClass('layui-form-checked');
+            $cb.next('.layui-form-checkbox').removeClass('ew-form-indeterminate');
+        } else if ((ckNum == 0 && unCkNum > 0) || (ckNum == 0 && unCkNum == 0)) {  // 全不选
+            $cb.prop('checked', false);
+            $cb.data('indeterminate', 'false');
+            $cb.next('.layui-form-checkbox').removeClass('layui-form-checked ew-form-indeterminate');
+        } else if (ckNum > 0 && unCkNum > 0) {  // 半选
+            $cb.prop('checked', true);
+            $cb.data('indeterminate', 'true');
+            $cb.next('.layui-form-checkbox').addClass('layui-form-checked ew-form-indeterminate');
+        }
+    };
+
+    /** 填充序号列 */
+    TreeTable.prototype.renderNumberCol = function () {
+        var components = this.getComponents();
+        var $tbody = components.$table.children('tbody');
+        $tbody.children('tr').each(function (index) {
+            $(this).children('td').find('.ew-tree-table-numbers').text(index + 1);
+        });
+    };
+
+    /* 解决form.render之后半选框被重置的问题 */
+    TreeTable.prototype.checkIndeterminateCB = function () {
+        var components = this.getComponents();
+        var cbFilter = components.checkboxFilter;
+        $('input[lay-filter="' + cbFilter + '"]').each(function () {
+            var $cb = $(this);
+            if ($cb.data('indeterminate') == 'true' && $cb.prop('checked')) {
+                $cb.next('.layui-form-checkbox').addClass('ew-form-indeterminate');
+            }
+        });
+    };
+
+    /**
+     * 搜索数据
+     * @param ids 关键字或数据id集合
+     */
+    TreeTable.prototype.filterData = function (ids) {
+        var components = this.getComponents();
+        var $trList = components.$table.children('tbody').children('tr');
+        if (typeof ids == 'string') {  // 关键字
+            var keyword = ids;
+            ids = [];
+            $trList.each(function () {
+                var id = $(this).data('id');
+                $(this).children('td').each(function () {
+                    if ($(this).text().indexOf(keyword) != -1) {
+                        ids.push(id);
+                        return false;
+                    }
+                });
+            });
+        }
+        $trList.addClass('ew-tree-table-filter-hide');
+        for (var i = 0; i < ids.length; i++) {
+            var $tr = $trList.filter('[data-id="' + ids[i] + '"]');
+            $tr.removeClass('ew-tree-table-filter-hide');
+            // 联动父级
+            var indent = parseInt($tr.data('indent'));
+            $tr.prevAll('tr').each(function () {
+                var tInd = parseInt($(this).data('indent'));
+                if (tInd < indent) {
+                    $(this).removeClass('ew-tree-table-filter-hide');  // 联动父级
+                    if (!$(this).hasClass('ew-tree-table-open')) {
+                        toggleRow($(this));
+                    }
+                    indent = tInd;
+                }
+            });
+        }
+    };
+
+    /** 重置搜索 */
+    TreeTable.prototype.clearFilter = function () {
+        var components = this.getComponents();
+        var $trList = components.$table.children('tbody').children('tr');
+        $trList.removeClass('ew-tree-table-filter-hide');
+    };
+
+    /** 展开指定行 */
+    TreeTable.prototype.expand = function (id, cascade) {
+        var components = this.getComponents();
+        var $tr = components.$table.children('tbody').children('tr[data-id="' + id + '"]');
+        if (!$tr.hasClass('ew-tree-table-open')) {
+            $tr.children('td').find('.ew-tree-pack').trigger('click');
+        }
+        if (cascade == false) {
+            return;
+        }
+        // 联动父级
+        var indent = parseInt($tr.data('indent'));
+        $tr.prevAll('tr').each(function () {
+            var tInd = parseInt($(this).data('indent'));
+            if (tInd < indent) {
+                if (!$(this).hasClass('ew-tree-table-open')) {
+                    $(this).children('td').find('.ew-tree-pack').trigger('click');
+                }
+                indent = tInd;
+            }
+        });
+    };
+
+    /** 折叠指定行 */
+    TreeTable.prototype.fold = function (id, cascade) {
+        var components = this.getComponents();
+        var $tr = components.$table.children('tbody').children('tr[data-id="' + id + '"]');
+        if ($tr.hasClass('ew-tree-table-open')) {
+            $tr.children('td').find('.ew-tree-pack').trigger('click');
+        }
+        if (cascade == false) {
+            return;
+        }
+        // 联动父级
+        var indent = parseInt($tr.data('indent'));
+        $tr.prevAll('tr').each(function () {
+            var tInd = parseInt($(this).data('indent'));
+            if (tInd < indent) {
+                if ($(this).hasClass('ew-tree-table-open')) {
+                    $(this).children('td').find('.ew-tree-pack').trigger('click');
+                }
+                indent = tInd;
+            }
+        });
+    };
+
+    /** 全部展开 */
+    TreeTable.prototype.expandAll = function () {
+        var that = this;
+        var components = this.getComponents();
+        var $trList = components.$table.children('tbody').children('tr');
+        $trList.each(function () {
+            that.expand($(this).data('id'), false);
+        });
+    };
+
+    /** 全部折叠 */
+    TreeTable.prototype.foldAll = function () {
+        var that = this;
+        var components = this.getComponents();
+        var $trList = components.$table.children('tbody').children('tr');
+        $trList.each(function () {
+            that.fold($(this).data('id'), false);
+        });
+    };
+
+    /** 获取当前数据 */
+    TreeTable.prototype.getData = function () {
+        return this.options.data;
+    };
+
+    /** 重载表格 */
+    TreeTable.prototype.reload = function (opt) {
+        treeTb.render($.extend(this.options, opt));
+    };
+
+    /** 根据id更新数据 */
+    TreeTable.prototype.update = function (id, fields) {
+        var data = getDataById(this.getData(), id, this.options.tree);
+        $.extend(data, fields);
+    };
+
+    /** 根据id删除数据 */
+    TreeTable.prototype.del = function (id) {
+        delDataById(this.getData(), id, this.options.tree);
+    };
+
+    /** 获取当前选中行 */
+    TreeTable.prototype.checkStatus = function (needIndeterminate) {
+        (needIndeterminate == undefined) && (needIndeterminate = true);
+        var that = this;
+        var components = this.getComponents();
+        var $table = components.$table;
+        var checkboxFilter = components.checkboxFilter;
+        var radioFilter = components.radioFilter;
+        var list = [];
+        // 获取单选框选中数据
+        var $radio = $table.find('input[name="' + radioFilter + '"]');
+        if ($radio.length > 0) {
+            var id = $radio.filter(':checked').val();
+            var d = getDataById(this.getData(), id, this.options.tree);
+            if (d) {
+                list.push(d);
+            }
+        } else {  // 获取复选框数据
+            $table.find('input[name="' + checkboxFilter + '"]:checked').each(function () {
+                var id = $(this).val();
+                var isIndeterminate = $(this).next('.layui-form-checkbox').hasClass('ew-form-indeterminate');
+                if (needIndeterminate || !isIndeterminate) {
+                    var d = getDataById(that.getData(), id, that.options.tree);
+                    if (d) {
+                        d.isIndeterminate = isIndeterminate;
+                        list.push(d);
+                    }
+                }
+            });
+        }
+        return list;
+    };
+
+    /** 设置复/单选框选中 */
+    TreeTable.prototype.setChecked = function (ids) {
+        var components = this.getComponents();
+        var $table = components.$table;
+        var checkboxFilter = components.checkboxFilter;
+        var radioFilter = components.radioFilter;
+        var $radio = $table.find('input[name="' + radioFilter + '"]');
+        if ($radio.length > 0) {  // 开启了单选框
+            $radio.each(function () {
+                if (ids[ids.length - 1] == $(this).val()) {
+                    $(this).next('.layui-form-radio').trigger('click');
+                    return false;
+                }
+            });
+        } else {  // 开启了复选框
+            $table.find('input[name="' + checkboxFilter + '"]').each(function () {
+                var $cb = $(this);
+                var value = $cb.val();
+                var $layCb = $cb.next('.layui-form-checkbox');
+                for (var i = 0; i < ids.length; i++) {
+                    if (value == ids[i]) {
+                        var checked = $cb.prop('checked');
+                        var indeterminate = $layCb.hasClass('ew-form-indeterminate');
+                        if (!checked || indeterminate) {
+                            $layCb.trigger('click');
+                        }
+                    }
+                }
+            });
+        }
+    };
+
+    /** 移除全部选中 */
+    TreeTable.prototype.removeAllChecked = function () {
+        var components = this.getComponents();
+        var $table = components.$table;
+        var checkboxFilter = components.checkboxFilter;
+        this.checkSubCB($table.children('tbody'), false);
+    };
+
+    /**
+     * 刷新指定父级下的节点
+     * @param id 父级id,空则全部刷新
+     * @param data 非异步模式替换的数据
+     */
+    TreeTable.prototype.refresh = function (id, data) {
+        if (isClass(id) == 'Array') {
+            data = id;
+            id = undefined;
+        }
+        var components = this.getComponents();
+        var $table = components.$table;
+        var d, $tr;
+        if (id != undefined) {
+            d = getDataById(this.getData(), id, this.options.tree);
+            $tr = $table.children('tbody').children('tr[data-id="' + id + '"]');
+        }
+        if (data) {  // 数据模式
+            components.$tbLoading.addClass('ew-loading-float');
+            components.$tbLoading.show();
+            this.renderBodyData(data, d, $tr);
+            components.$tbLoading.hide();
+            components.$tbLoading.removeClass('ew-loading-float');
+            if (data && data.length > 0) {
+                components.$tbEmpty.hide();
+            } else {
+                components.$tbEmpty.show();
+            }
+        } else {  // 异步模式
+            this.renderBodyAsync(d, $tr);
+        }
+    };
+
+    /** 生成表头 */
+    function getThead(options) {
+        var htmlStr = '<tr>';
+        for (var i = 0; i < options.cols.length; i++) {
+            var col = options.cols[i];
+            htmlStr += '<td data-index="' + i + '" ';
+            col.align && (htmlStr += ' align="' + col.align + '"');  // 对齐方式
+            htmlStr += ' >';
+            if (col.singleLine && col.type != 'checkbox') {  // 单行显示
+                htmlStr += '<div class="ew-tree-table-td-single"><i class="layui-icon layui-icon-close ew-tree-tips-c"></i><div class="ew-tree-tips">';
+            }
+            // 标题
+            if (col.type == 'checkbox') {
+                htmlStr += options.getAllChooseBox();
+            } else {
+                htmlStr += (col.title || '');
+            }
+            // 列宽拖拽
+            if (!col.unresize && 'checkbox' != col.type && 'radio' != col.type && 'numbers' != col.type && 'space' != col.type) {
+                htmlStr += '<span class="ew-tb-resize"></span>';
+            }
+            if (col.singleLine) {  // 单行显示
+                htmlStr += '</div></div>';
+            }
+            htmlStr += '</td>';
+        }
+        htmlStr += '</tr>';
+        return htmlStr;
+    }
+
+    /** 生成colgroup */
+    function getColgroup(options) {
+        var htmlStr = '<colgroup>';
+        for (var i = 0; i < options.cols.length; i++) {
+            var col = options.cols[i];
+            htmlStr += '<col ';
+            // 设置宽度
+            if (col.width) {
+                htmlStr += 'width="' + col.width + '"'
+            } else if (col.type == 'space') {  // 空列
+                htmlStr += 'width="15"'
+            } else if (col.type == 'numbers') {  // 序号列
+                htmlStr += 'width="40"'
+            } else if (col.type == 'checkbox' || col.type == 'radio') {  // 复/单选框列
+                htmlStr += 'width="48"'
+            }
+            htmlStr += ' />';
+        }
+        htmlStr += '</colgroup>';
+        return htmlStr;
+    }
+
+    /** 计算table宽度 */
+    function getTbWidth(options) {
+        var minWidth = 0, setWidth = true;
+        for (var i = 0; i < options.cols.length; i++) {
+            var col = options.cols[i];
+            if (col.type == 'space') {  // 空列
+                minWidth += 15;
+            } else if (col.type == 'numbers') {  // 序号列
+                minWidth += 40;
+            } else if (col.type == 'checkbox' || col.type == 'radio') {  // 复/单选框列
+                minWidth += 48;
+            } else if (!col.width || /\d+%$/.test(col.width)) {  // 列未固定宽度
+                setWidth = false;
+                if (col.minWidth) {
+                    minWidth += col.minWidth;
+                } else if (options.cellMinWidth) {
+                    minWidth += options.cellMinWidth;
+                }
+            } else {  // 列固定宽度
+                minWidth += col.width;
+            }
+        }
+        return {minWidth: minWidth, setWidth: setWidth};
+    }
+
+    /** 生成全选按钮 */
+    function getAllChooseBox(options) {
+        var tbFilter = $(options.elem).next().attr('lay-filter');
+        var cbAllFilter = 'ew_tb_choose_all_' + tbFilter;
+        return '<input type="checkbox" lay-filter="' + cbAllFilter + '" lay-skin="primary" class="ew-tree-table-checkbox"/>';
+    }
+
+    /** 获取列图标 */
+    function getIcon(d, treeOption) {
+        if (getHaveChild(d, treeOption)) {
+            return '<i class="ew-tree-icon layui-icon layui-icon-layer"></i>';
+        } else {
+            return '<i class="ew-tree-icon layui-icon layui-icon-file"></i>';
+        }
+    }
+
+    /** 折叠/展开行 */
+    function toggleRow($tr) {
+        var indent = parseInt($tr.data('indent'));
+        var isOpen = $tr.hasClass('ew-tree-table-open');
+        if (isOpen) {  // 折叠
+            $tr.removeClass('ew-tree-table-open');
+            $tr.nextAll('tr').each(function () {
+                if (parseInt($(this).data('indent')) <= indent) {
+                    return false;
+                }
+                $(this).addClass('ew-tree-tb-hide');
+            });
+        } else {  // 展开
+            $tr.addClass('ew-tree-table-open');
+            var hideInd;
+            $tr.nextAll('tr').each(function () {
+                var ind = parseInt($(this).data('indent'));
+                if (ind <= indent) {
+                    return false;
+                }
+                if (hideInd != undefined && ind > hideInd) {
+                    return true;
+                }
+                $(this).removeClass('ew-tree-tb-hide');
+                if (!$(this).hasClass('ew-tree-table-open')) {
+                    hideInd = parseInt($(this).data('indent'));
+                } else {
+                    hideInd = undefined;
+                }
+            });
+        }
+        updateFixedTbHead($tr.parent().parent().parent().parent().parent());
+    }
+
+    /** 固定表头滚动条补丁 */
+    function updateFixedTbHead($view) {
+        var $group = $view.children('.ew-tree-table-group');
+        var $headBox = $group.children('.ew-tree-table-head');
+        var $tbBox = $group.children('.ew-tree-table-box');
+        var sWidth = $tbBox.width() - $tbBox.prop('clientWidth');
+        if (sWidth > 0) {
+            $headBox.css('border-right', sWidth + 'px solid #f2f2f2');
+        } else {
+            $headBox.css('border-right', 'none');
+        }
+    }
+
+    // 监听窗口大小改变
+    $(window).resize(function () {
+        $('.ew-tree-table').each(function () {
+            updateFixedTbHead($(this));
+            var $tbBox = $(this).children('.ew-tree-table-group').children('.ew-tree-table-box');
+            var full = $tbBox.attr('ew-tree-full');
+            if (full && device.ie && device.ie < 10) {
+                $tbBox.css('height', getPageHeight() - full);
+            }
+        });
+    });
+
+    // 表格溢出点击展开功能
+    $(document).on('mouseenter', '.ew-tree-table td', function () {
+        var $tdSingle = $(this).children('.ew-tree-table-td-single');
+        var $content = $tdSingle.children('.ew-tree-tips');
+        if ($tdSingle.length > 0 && $content.prop('scrollWidth') > $content.outerWidth()) {
+            $(this).append('<div class="layui-table-grid-down"><i class="layui-icon layui-icon-down"></i></div>');
+        }
+    }).on('mouseleave', '.ew-tree-table td', function () {
+        $(this).children('.layui-table-grid-down').remove();
+    });
+    // 点击箭头展开
+    $(document).on('click', '.ew-tree-table td>.layui-table-grid-down', function (e) {
+        hideAllTdTips();
+        var $tdSingle = $(this).parent().children('.ew-tree-table-td-single');
+        $tdSingle.addClass('ew-tree-tips-open');
+        var $box = $tdSingle.parents().filter('.ew-tree-table-box');
+        if ($box.length <= 0) {
+            $box = $tdSingle.parents().filter('.ew-tree-table-head');
+        }
+        if (($tdSingle.outerWidth() + $tdSingle.parent().offset().left) > $box.offset().left + $box.outerWidth()) {
+            $tdSingle.addClass('ew-show-left');
+        }
+        if (($tdSingle.outerHeight() + $tdSingle.parent().offset().top) > $box.offset().top + $box.outerHeight()) {
+            $tdSingle.addClass('ew-show-bottom');
+        }
+        e.stopPropagation();
+    });
+    // 点击关闭按钮关闭
+    $(document).on('click', '.ew-tree-table .ew-tree-tips-c', function (e) {
+        hideAllTdTips();
+    });
+    // 点击空白部分关闭
+    $(document).on('click', function () {
+        hideAllTdTips();
+    });
+    $(document).on('click', '.ew-tree-table-td-single.ew-tree-tips-open', function (e) {
+        e.stopPropagation();
+    });
+
+    /* 关闭所有单元格溢出提示框 */
+    function hideAllTdTips() {
+        var $single = $('.ew-tree-table-td-single');
+        $single.removeClass('ew-tree-tips-open');
+        $single.removeClass('ew-show-left');
+    }
+
+    /** 判断是否还有子节点 */
+    function getHaveChild(d, treeOption) {
+        var haveChild = false;
+        if (d[treeOption.haveChildName] != undefined) {
+            haveChild = d[treeOption.haveChildName];
+            haveChild = haveChild == true || haveChild == 'true';
+        } else if (d[treeOption.childName]) {
+            haveChild = d[treeOption.childName].length > 0;
+        }
+        return haveChild;
+    }
+
+    /** 补充pid字段 */
+    function addPidField(data, treeOption, parent) {
+        for (var i = 0; i < data.length; i++) {
+            if (parent) {
+                data[i][treeOption.pidName] = parent[treeOption.idName];
+            }
+            if (data[i][treeOption.childName] && data[i][treeOption.childName].length > 0) {
+                addPidField(data[i][treeOption.childName], treeOption, data[i]);
+            }
+        }
+    }
+
+    /** 根据id获取数据 */
+    function getDataById(data, id, treeOption) {
+        for (var i = 0; i < data.length; i++) {
+            if (data[i][treeOption.idName] == id) {
+                return data[i];
+            }
+            if (data[i][treeOption.childName] && data[i][treeOption.childName].length > 0) {
+                var d = getDataById(data[i][treeOption.childName], id, treeOption);
+                if (d != undefined) {
+                    return d;
+                }
+            }
+        }
+    }
+
+    /** 根据id删除数据 */
+    function delDataById(data, id, treeOption) {
+        for (var i = 0; i < data.length; i++) {
+            if (data[i][treeOption.idName] == id) {
+                data.splice(i, 1);
+                return true;
+            }
+            if (data[i][treeOption.childName] && data[i][treeOption.childName].length > 0) {
+                var rs = delDataById(data[i][treeOption.childName], id, treeOption);
+                if (rs) {
+                    return true;
+                }
+            }
+        }
+    }
+
+    /** 获取顶级的pId */
+    function getPids(list, idName, pidName) {
+        var pids = [];
+        for (var i = 0; i < list.length; i++) {
+            var hasPid = false;
+            for (var j = 0; j < list.length; j++) {
+                if (i != j && list[j][idName] == list[i][pidName]) {
+                    hasPid = true;
+                }
+            }
+            if (!hasPid) {
+                pids.push(list[i][pidName]);
+            }
+        }
+        return pids;
+    }
+
+    /** 判断pId是否相等 */
+    function pidEquals(pId, pIds) {
+        if (isClass(pIds) == 'Array') {
+            for (var i = 0; i < pIds.length; i++) {
+                if (pId == pIds[i]) {
+                    return true;
+                }
+            }
+        } else {
+            return pId == pIds;
+        }
+        return false;
+    }
+
+    /** 获取变量类型 */
+    function isClass(o) {
+        if (o === null)
+            return 'Null';
+        if (o === undefined)
+            return 'Undefined';
+        return Object.prototype.toString.call(o).slice(8, -1);
+    }
+
+    /* 获取浏览器高度 */
+    function getPageHeight() {
+        return document.documentElement.clientHeight || document.body.clientHeight;
+    }
+
+    /* 获取浏览器宽度 */
+    function getPageWidth() {
+        return document.documentElement.clientWidth || document.body.clientWidth;
+    }
+
+    /** 对外提供的方法 */
+    var treeTb = {
+        /* 渲染 */
+        render: function (options) {
+            return new TreeTable(options);
+        },
+        /* 事件监听 */
+        on: function (events, callback) {
+            return layui.onevent.call(this, MOD_NAME, events, callback);
+        },
+        /* pid转children形式 */
+        pidToChildren: function (data, idName, pidName, childName, pId) {
+            childName || (childName = 'children');
+            var newList = [];
+            for (var i = 0; i < data.length; i++) {
+                (pId == undefined) && (pId = getPids(data, idName, pidName));
+                if (pidEquals(data[i][pidName], pId)) {
+                    var children = this.pidToChildren(data, idName, pidName, childName, data[i][idName]);
+                    (children.length > 0) && (data[i][childName] = children);
+                    newList.push(data[i]);
+                }
+            }
+            return newList;
+        }
+    };
+
+    exports('treeTable', treeTb);
+});
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/doctor.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/doctor.html
new file mode 100644
index 0000000..f9ba10b
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/doctor.html
@@ -0,0 +1,711 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">医生管理</h2>
+        <span class="layui-breadcrumb pull-right">
+            <a href="#!home_console">首页</a>
+            <a><cite>医生管理</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            <button id="doctor-btn-add" class="layui-btn icon-btn"><i class="layui-icon">&#xe654;</i>添加</button>
+            <select placeholder="选择一个应用" id="doctorState" lay-filter="role_clients">
+                <option value="">-请选择-</option>
+                <option value="true">正常</option>
+                <option value="false">试用</option>
+            </select>
+            <select id="hospitalName-seach" placeholder="选择一个应用" lay-filter="role_clients">
+                <option value="">-请选择-</option>
+            </select>
+            <input id="doctorTel" class="layui-input search-input" type="text" placeholder="按手机号..." />&emsp;
+            <input id="doctorName" class="layui-input search-input" type="text" placeholder="按医生..." />&emsp;
+            <button id="app-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
+        </div>
+
+        <!-- 数据表格 -->
+        <table class="layui-table" id="app-table" lay-filter="app-table"></table>
+    </div>
+</div>
+
+<!-- 表格操作列 -->
+
+<script type="text/html" id="doctor-table-bar">
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看详情</a>
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="reset">重置密码</a>
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
+    <a class="layui-btn layui-btn-xs" lay-event="del">删除</a>
+    <a class="layui-btn layui-btn-xs" lay-event="enable">停用</a>
+</script>
+
+
+<!-- 表单弹窗 -->
+<script type="text/html" id="app-model">
+    <form id="app-form" lay-filter="app-form" class="layui-form model-form">
+        <input name="id" type="hidden"/>
+        <div class="layui-form-item">
+            <label class="layui-form-label">医院名称</label>
+            <div class="layui-input-block">
+                <input name="hospitalName" id="hospitalName" type="hidden" class="layui-input" maxlength="20"/>
+                       <select id="hospitalId" name="hospitalId" lay-filter="getdepartment"  placeholder="选择一个应用" lay-filter="role_clients">
+                        <option value="">-请选择-</option>
+                    </select>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">科室</label>
+            <div class="layui-input-block">
+                <input name="departmentName" id="departmentName"   placeholder="请输入应用名称" type="hidden" class="layui-input" maxlength="20"/>
+                <select id="departmentId" name="departmentId" lay-filter="departmentId"  placeholder="选择一个应用" lay-filter="role_clients">
+                    <option value="">-请选择-</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">医生姓名</label>
+            <div class="layui-input-block">
+                <input name="doctorName"  type="text" class="layui-input" maxlength="20"
+                       lay-verify="required" required />
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">医生的头像</label>
+            <div class="layui-input-block">
+                <input name="doctorLogo"  type="text" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">联系方式</label>
+            <div class="layui-input-block">
+                <input name="doctorTel"  type="text" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">职称</label>
+            <div class="layui-input-block">
+                <input name="doctorRank"  type="text" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">其它联系方式</label>
+            <div class="layui-input-block">
+                <input name="doctorOtherLink"  type="text" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">医生的email</label>
+            <div class="layui-input-block">
+                <input name="doctorEmail"  type="text" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">医生简介</label>
+            <div class="layui-input-block">
+                <input name="doctorAbout"  type="text" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">是否医答</label>
+            <div class="layui-input-block">
+                <input name="isAnswer" id="isAnswer-shi" type="radio" checked value="true" title="是" class="layui-input" maxlength="20"/>
+                <input name="isAnswer" id="isAnswer-fou" type="radio"  value="false" title="否" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">是否签约医生</label>
+            <div class="layui-input-block">
+                <input name="isSigning" id="isSigning-shi" type="radio" checked value="true" title="是" class="layui-input" maxlength="20"/>
+                <input name="isSigning" id="isSigning-fou" type="radio"  value="false" title="否" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label"> 是否置顶</label>
+            <div class="layui-input-block">
+                <input name="isTop" id="isTop-shi" type="radio" checked value="true" title="是" class="layui-input" maxlength="20"/>
+                <input name="isTop" id="isTop-fou" type="radio"  value="false" title="否" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label"> 医生状态</label>
+            <div class="layui-input-block">
+                <input name="doctorState" id="doctorState-shi" type="radio" checked value="true" title="是" class="layui-input" maxlength="20"/>
+                <input name="doctorState" id="doctorState-fou" type="radio"  value="false" title="否" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label" >销售代表名称</label>
+            <div class="layui-input-block">
+                <input name="serverUserName"  type="text" class="layui-input" maxlength="15"/>
+            </div>
+        </div>
+        <div class="layui-form-item model-form-footer">
+            <button class="layui-btn layui-btn-primary"  ew-event="closeDialog" type="button">取消</button>
+            <button class="layui-btn" id="sure" lay-filter="user-form-submit" lay-submit>保存</button>
+        </div>
+    </form>
+</script>
+
+<!-- 表单弹窗 添加-->
+<script type="text/html" id="app-model-add">
+   
+    <form id="app-form-add" lay-filter="app-form-add" class="layui-form model-form">
+        <input name="id" type="hidden"/>
+        <div class="layui-form-item">
+            <label class="layui-form-label">医院名称</label>
+            <div class="layui-input-block">
+                <input name="hospitalName" id="hospitalId-add" type="hidden" class="layui-input" maxlength="20"/>
+                       <select  id="hospitalName-add" name="hospitalId" lay-filter="getdepartment-add"  placeholder="选择一个应用" lay-filter="role_clients">
+                        <option value="">-请选择-</option>
+                    </select>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">姓名</label>
+            <div class="layui-input-block">
+                <input name="doctorName"  type="text" class="layui-input" maxlength="20"
+                       lay-verify="required" required />
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">科室</label>
+            <div class="layui-input-block">
+                <input name="departmentName" id="departmentName"   placeholder="请输入应用名称" type="hidden" class="layui-input" maxlength="20"/>
+                <select id="departmentId" name="departmentId" lay-filter="departmentId"  placeholder="选择一个应用" lay-filter="role_clients">
+                    <option value="">-请选择-</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">职称</label>
+            <div class="layui-input-block">
+                <select id="doctorRankId" name="doctorRankId"  lay-filter="doctorRankId" placeholder="选择一个职称" >
+                    <option value="">-请选择-</option>
+                </select>
+                <input name="doctorRank" id='doctorRank' type="hidden" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">联系电话</label>
+            <div class="layui-input-block">
+                <input name="doctorTel"  type="text" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">其它联系方式</label>
+            <div class="layui-input-block">
+                <input name="doctorOtherLink"  type="text" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">医生的email</label>
+            <div class="layui-input-block">
+                <input name="doctorEmail"  type="text" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">医生简介</label>
+            <div class="layui-input-block">
+                <input name="doctorAbout"  type="text" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">医生的头像</label>
+            <div class="layui-input-block" id="demo">
+                <button type="button" class="layui-btn" id="phonto">
+                    <i class="layui-icon">&#xe67c;</i>上传图片
+                  </button>
+                <input name="doctorLogo" id="doctorLogo-add"  type="hidden" class="layui-input" maxlength="20"/>
+                <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                    预览图:
+                    <div class="layui-upload-list" id="demo2"></div>
+                </blockquote>
+            </div>
+        </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label"> 是否置顶</label>
+        <div class="layui-input-block">
+            <input name="isTop" id="isTop-shi" type="radio" checked value="true" title="是" class="layui-input" maxlength="20"/>
+            <input name="isTop" id="isTop-fou" type="radio"  value="false" title="否" class="layui-input" maxlength="20"/>
+        </div>
+    </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">是否医答</label>
+            <div class="layui-input-block">
+                <input name="isAnswer" id="isAnswer-shi" type="radio" checked value="true" title="是" class="layui-input" maxlength="20"/>
+                <input name="isAnswer" id="isAnswer-fou" type="radio"  value="false" title="否" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">是否签约医生</label>
+            <div class="layui-input-block">
+                <input name="isSigning" id="isSigning-shi" type="radio" checked value="true" title="是" class="layui-input" maxlength="20"/>
+                <input name="isSigning" id="isSigning-fou" type="radio"  value="false" title="否" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+         <div class="layui-form-item">
+            <label class="layui-form-label"> 医生状态</label>
+            <div class="layui-input-block">
+                <input name="doctorState" id="doctorState-shi" type="radio" checked value="true" title="是" class="layui-input" maxlength="20"/>
+                <input name="doctorState" id="doctorState-fou" type="radio"  value="false" title="否" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label" >登录帐号</label>
+            <div class="layui-input-block">
+                <input name="username"  type="text" class="layui-input" maxlength="15"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label" >登录密码</label>
+            <div class="layui-input-block">
+                <input name="password"  type="text" class="layui-input" maxlength="15"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label" >确认密码</label>
+            <div class="layui-input-block">
+                <input name="passwordSure"  type="text" class="layui-input" maxlength="15"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label" >销售代表名称</label>
+            <div class="layui-input-block">
+                <input name="serverUserName" id="serverUserName-add"   type="hidden" class="layui-input" maxlength="15"/>
+                <select  id="serverUserId-add" name="serverUserId" lay-filter="serverUserId-add"  placeholder="选择一个应用" lay-filter="role_clients">
+                    <option value="">-请选择-</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-form-item model-form-footer">
+            <button class="layui-btn layui-btn-primary"  ew-event="closeDialog" type="button">取消</button>
+            <button class="layui-btn" id="sure" lay-filter="user-form-submit" lay-submit>保存</button>
+        </div> 
+    </form>
+</script>
+
+
+<script>
+    layui.use(['form', 'table', 'laydate', 'util', 'config', 'upload', 'admin'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var config = layui.config;
+        var layer = layui.layer;
+        var util = layui.util;
+        var admin = layui.admin;
+        var upload = layui.upload;
+
+
+        //执行实例
+        var uploadInst = upload.render({
+            elem: '#phonto' //绑定元素
+            , url: '/upload/' //上传接口
+            , done: function (res) {
+                //上传完毕回调
+            }
+            , error: function () {
+                //请求异常回调
+            }
+        });
+        //医院数据绑定在弹框里
+        var hospital = "";
+
+        var department = "";
+        //销售代表
+        var user = "";
+        //职称
+        var doctorRank="";
+        // 获取应用列表
+        // layer.load(2);
+        admin.req('api-user/syshospital/findAll', JSON.stringify({ is_del: 0 }), function (data) {
+            layer.closeAll('loading');
+            if (0 === data.code) {
+                let selected = false;
+                clientsAll = data.data;
+                hospital = data.data;
+                $.each(data.data, function (index, item) {
+                    if (config.clientId === item.clientId) {
+                        selected = true;
+                    } else {
+                        selected = false;
+                    }
+                    //往下拉菜单里添加元素
+                    $('#hospitalName-seach').append(new Option(item.hospitalName, item.id, false, selected));
+                    // $('#hospitalId').append(new Option(item.hospitalName, item.id, false, selected));
+                    form.render('select', 'app-form');
+                })
+                form.render();
+            } else {
+                layer.msg(data.msg, { icon: 2, time: 500 });
+            }
+        }, 'Post');
+        //职称添加数据
+        var getZhiCheng = function () {
+            admin.req('api-user/sysdictionaries/findAll', JSON.stringify({ dictionariesClassId: "1248150699682988034" }), function (data) {
+                layer.closeAll('loading');
+                if (0 === data.code) {
+                    let selected = false;
+                    doctorRank = data.data;
+                    $.each(data.data, function (index, item) {
+                        if (config.clientId === item.clientId) {
+                            selected = true;
+                        } else {
+                            selected = false;
+                        }
+                        //往下拉菜单里添加元素
+                        $('#doctorRankId').append(new Option(item.dictionariesName, item.id, false, selected));
+                    })
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 500 });
+                }
+            }, 'Post');
+        }
+        //获取销售代表
+        var getXiaoShouDaiBiao = function () {
+            admin.req('api-user/users/getThisUserOrganizationUser', {}, function (data) {
+                layer.closeAll('loading');
+                if (0 === data.code) {
+                    user = data.data;
+                    $.each(data.data, function (index, item) {
+                        //往下拉菜单里添加元素
+                        console.log(item.nickname)
+                        $('#serverUserId-add').append(new Option(item.nickname, item.id, false, false));
+                    })
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 500 });
+                }
+            }, 'get');
+        }
+
+        // 添加按钮点击事件
+        $('#doctor-btn-add').click(function () {
+            showEditModel_add(undefined, 2);
+        });
+        //时间格式
+        var laydate = layui.laydate;
+        //执行一个laydate实例
+        laydate.render({
+            elem: '#test1' //指定元素
+        });
+        laydate.render({
+            elem: '#test2' //指定元素
+        });
+
+        // 渲染表格
+        table.render({
+            elem: '#app-table',
+            url: config.base_server + 'api-user/sysdoctor',
+            method: 'GET',
+            headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+            page: true,
+            cols: [[
+                { type: 'numbers' },
+                { field: 'hospitalName', width: 180, sort: true, title: '医院名称' },
+                { field: 'doctorName', width: 200, sort: true, title: '医生姓名' },
+                { field: 'doctorRank', width: 180, sort: true, title: '职称' },
+                { field: 'username', width: 300, sort: true, title: '登录帐号' },
+                { field: 'doctorTel', width: 300, sort: true, title: '联系方式' },
+                {
+                    field: 'doctorState', width: 300, sort: true, title: '状态', templet: function (d) {
+                        return d.doctorState ? "正式" : "试用"
+                    }
+                },
+                {
+                    field: 'isAnswer', width: 300, sort: true, title: '医答', templet: function (d) {
+                        return d.isAnswer ? "是" : "否"
+                    }
+                },
+                {
+                    field: 'isSigning', width: 300, sort: true, title: '签约', templet: function (d) {
+                        return d.isSigning ? "是" : "否"
+                    }
+                },
+                { field: 'createTime', width: 250, sort: true, title: '时间', templet: "<div>{{layui.util.toDateString(d.createTime, 'yyyy年MM月dd日 HH:mm:ss')}}</div>" },
+                { field: 'serverUserName', width: 100, sort: true, title: '销售代表' },
+                { width: 200, width: 300, align: 'center', toolbar: '#doctor-table-bar', sort: true, title: '操作' },
+            ]]
+        });
+
+        // 工具条点击事件
+        table.on('tool(app-table)', function (obj) {
+            var data = obj.data;
+            var layEvent = obj.event;
+            if (layEvent === 'detail') { // 查看详情
+                showEditModel(data, 1);
+            } else if (layEvent === 'reset') {
+                layer.confirm('确定重置此用户的密码吗?', function (i) {
+                    layer.close(i);
+                    layer.load(2);
+                    admin.req('api-user/users/' + obj.data.userId + '/password', {}, function (data) {
+                        layer.closeAll('loading');
+                        if (data.code == 0) {
+                            layer.msg(data.msg, { icon: 1, time: 500 });
+                        } else {
+                            layer.msg(data.msg, { icon: 2, time: 500 });
+                        }
+                    }, 'PUT');
+                });
+            } else if (layEvent === 'edit') {
+                showEditModel(data, 3);
+            } else if (layEvent === 'del') {
+                layer.confirm('确定删除此用户吗?', function (i) {
+                    layer.close(i);
+                    layer.load(2);
+                    admin.req('api-user/sysdoctor/' + obj.data.id, {}, function (data) {
+                        layer.closeAll('loading');
+                        if (data.code == 0) {
+                            layer.msg(data.msg, { icon: 1, time: 500 });
+                            table.reload('app-table', {});
+                        } else {
+                            layer.msg(data.msg, { icon: 2, time: 500 });
+                        }
+                    }, 'delete');
+                });
+            } else if (layEvent === 'enable') {
+                layer.confirm('确定删除此用户吗?', function (i) {
+                    layer.close(i);
+                    layer.load(2);
+                    admin.req('api-user/sysdoctor/enable', JSON.stringify({ id: obj.data.id }), function (data) {
+                        layer.closeAll('loading');
+                        if (data.code == 0) {
+                            layer.msg(data.msg, { icon: 1, time: 500 });
+                            table.reload('app-table', {});
+                        } else {
+                            layer.msg(data.msg, { icon: 2, time: 500 });
+                        }
+                    }, 'post');
+                });
+            }
+        });
+
+        // 搜索按钮点击事件
+        $('#app-btn-search').click(function () {
+            var doctorState = $('#doctorState').val();
+            var hospitalName = $('#hospitalName-seach').val();
+            var doctorTel = $('#doctorTel').val();
+            var doctorName = $('#doctorName').val();
+            table.reload('app-table', { where: { doctorState: doctorState, hospitalId: hospitalName, doctorTel: doctorTel, doctorName: doctorName } });
+        });
+        // 显示新增弹窗
+        var showEditModel_add = function () {
+            layer.open({
+                type: 1,
+                title: '新增',
+                area: '450px',
+                offset: '120px',
+                content: $('#app-model-add').html(),
+                success: function () {
+                    $('#app-form-add')[0].reset();
+                    $('#app-form-add').attr('method', 'POST');
+                    $('.layui-layer-content').css('overflow','auto');
+                    //将医院的数据保存到下拉表
+                    let selected = false;
+                    //获取职称的
+                    getZhiCheng();
+                    //获取销售代表
+                    getXiaoShouDaiBiao();
+                    var upload = layui.upload;
+                    //执行实例
+                    upload.render({
+                        elem: '#phonto',
+                        url: config.base_server + 'api-file/files-anon',
+                        accept: 'file',
+                        auto: true,
+                        headers: { "Authorization": "Bearer " + config.getToken().access_token },
+                        before: function (obj) {
+                            layer.load(); //上传loading
+                            //预读本地文件示例,不支持ie8
+                            obj.preview(function (index, file, result) {
+                                $(".layui-upload-img").remove();
+                                $('#demo2').append('<img src="' + result + '" width="50px" height="50px" alt="' + file.name + '" class="layui-upload-img">')
+                            });
+                        },
+                        done: function (data) {
+                            layer.closeAll('loading');
+                            $("#doctorLogo-add").val(data.url);
+                        },
+                        error: function (data) {
+                            layer.closeAll('loading');
+                        }
+                    });
+                    $.each(hospital, function (index, item) {
+                        if (config.clientId === item.clientId) {
+                            selected = true;
+                        } else {
+                            selected = false;
+                        }
+                        console.log(item)
+                        $('#hospitalName-add').append(new Option(item.hospitalName, item.id, false, selected));
+                    })
+                    form.render();
+                }
+            });
+        };
+        // 显示编辑弹窗
+        var showEditModel = function (data, flag) {
+            var title = "";
+            if (flag == 1) {
+                title = "查看详情";
+            } else if (flag == 2) {
+                title = "新增";
+            } else if (flag == 3) {
+                title = "编辑";
+            }
+
+            layer.open({
+                type: 1,
+                title: title,
+                area: '450px',
+                offset: '120px',
+                content: $('#app-model').html(),
+                success: function () {
+                    $('#app-form')[0].reset();
+                    $('#app-form').attr('method', 'POST');
+                    //将医院的数据保存到下拉表
+                    let selected = false;
+                    $.each(hospital, function (index, item) {
+                        if (config.clientId === item.clientId) {
+                            selected = true;
+                        } else {
+                            selected = false;
+                        }
+                        //往下拉菜单里添加元素
+                        $('#hospitalId').append(new Option(item.hospitalName, item.id, false, selected));
+                    })
+                    //将科室的数据绑定到里面
+                    if (flag != 2) {
+                        getdepartment(data.hospitalId);
+                    }
+                    if (data) {
+                        if (data.isAnswer) {
+                            $("#isAnswer-shi").attr('checked', true);
+                        } else {
+                            $("#isAnswer-fou").attr('checked', true);
+                        }
+
+                        if (data.isSigning) {
+                            $("#isSigning-shi").attr('checked', true);
+                        } else {
+                            $("#isSigning-fou").attr('checked', true);
+                        }
+
+                        if (data.isTop) {
+                            $("#isTop-shi").attr('checked', true);
+                        } else {
+                            $("#isTop-fou").attr('checked', true);
+                        }
+
+                        if (data.doctorState) {
+                            $("#doctorState-shi").attr('checked', true);
+                        } else {
+                            $("#doctorState-fou").attr('checked', true);
+                        }
+                        form.val('app-form', data);
+                        if (flag == 1) {
+                            //将确定隐藏  doctorState-shi
+                            $("#sure").hide();
+                            //将所有的设置为只读
+                            $('#app-form').find('input').attr('readonly', true);
+                            $('#app-form').find('select,input[type="radio"]').attr('disabled', true);
+                        } else {
+                            $("#sure").show();
+                            $('#app-form').attr('method', 'POST');
+                        }
+                    }
+                }
+            });
+        };
+        // 表单提交事件
+        form.on('submit(user-form-submit)', function (data) {
+            layer.load(2);
+            data.field.hospitalId = parseInt(data.field.hospitalId);
+            admin.req('api-user/sysdoctor', JSON.stringify(data.field), function (data) {
+                layer.closeAll('loading');
+                if (data.code == 0) {
+                    // layer.msg(data.msg, { icon: 1, time: 500 });
+                    layer.closeAll();
+                    table.reload('app-table', {});
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 500 });
+                }
+            }, "POST");
+            return false;
+        });
+        //更新 点击医院触发的事件
+        form.on('select(getdepartment)', function (data) {
+            //将医院名称赋值
+            $.each(hospital, function (index, item) {
+                if (item.id == data.value) {
+                    $('#hospitalName').val(item.hospitalName);
+                }
+            })
+            //
+            getdepartment(data.value);
+        });
+        //新增----点击医院触发的事件   
+        form.on('select(getdepartment-add)', function (data) {
+            //将医院名称赋值
+            $.each(hospital, function (index, item) {
+                if (item.id == data.value) {
+                    $('#hospitalId-add').val(item.hospitalName);
+                    console.log($('#hospitalId-add').val())
+                }
+            })
+            //
+            getdepartment(data.value);
+        });
+        //将新增  中的 serverUserName 赋值
+        form.on('select(serverUserId-add)', function (data) {
+            //将医院名称赋值
+            $.each(user, function (index, item) {
+                if (item.id == data.value) {
+                    $('#serverUserName-add').val(item.nickname);
+                    console.log($('#serverUserName-add').val())
+                }
+            })
+            //
+        });
+        //新增   点击职称的触发事件
+        form.on('select(doctorRankId)', function (data) {
+            //将部门名称赋值
+           
+            $.each(doctorRank, function (index, item) {
+                if (item.id == data.value) {
+                    console.log(12312312312)
+                    $('#doctorRank').val(item.dictionariesName);
+                    console.log($('#doctorRank').val())
+                }
+            })
+        });
+        //新增 和  更新   科室触发的事件
+        form.on('select(departmentId)', function (data) {
+            //将部门名称赋值
+            $.each(department, function (index, item) {
+                if (item.id == data.value) {
+                    $('#departmentName').val(item.departmentName);
+                }
+            })
+            //
+            // getdepartment(data.value);
+        });
+        //获取科室
+        var getdepartment = function (data) {
+            admin.req('api-user/sysdepartment/findListByHospitalId', { id: data }, function (data) {
+                layer.closeAll('loading');
+                if (0 === data.code) {
+                    department = data.data;
+                    $('#departmentId').empty();
+                    if(data.data.length>0){
+                        $('#departmentName').val(data.data[0].departmentName);
+                    }
+                    $.each(data.data, function (index, item) {
+                        //往下拉菜单里添加元素
+                        $('#departmentId').append(new Option(item.departmentName, item.id, false, false));
+                        form.render('select', 'app-form');
+                    })
+                    form.render();
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 500 });
+                }
+            }, 'get');
+        }
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/feedback.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/feedback.html
new file mode 100644
index 0000000..57dbde3
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/feedback.html
@@ -0,0 +1,153 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">用户反馈</h2>
+        <span class="layui-breadcrumb pull-right">
+            <a href="#!console">首页</a>
+            <a><cite>用户反馈</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">&emsp;
+            <input id="user-search-value" class="layui-input search-input" type="text" placeholder="输入医生姓名" />&emsp;
+            <input type="text" name="date" id="datebegin" lay-verify="date" placeholder="yyyy-MM-dd" autocomplete="off"
+                class="layui-input search-input">
+            至
+            <input type="text" name="date" id="dateend" lay-verify="date" placeholder="yyyy-MM-dd" autocomplete="off"
+                class="layui-input search-input"> &emsp;
+            <button id="user-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
+        </div>
+
+        <table class="layui-table" id="feedback-table" lay-filter="feedback-table"></table>
+    </div>
+</div>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="feeedback-table-bar">
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看详情</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+</script>
+<!-- 表格状态列 -->
+<script type="text/html" id="user-tpl-state">
+    <input type="checkbox" lay-filter="feedback-tpl-state" value="{{d.id}}" lay-skin="switch" lay-text="未处理|已处理"
+           {{d.enabled==true?'checked':''}}/>
+</script>
+<!-- 弹窗内容 -->
+<script type="text/html" id="feedback-detail">
+    <div class="layui-card-body" id="feedback-detail-note">
+    </div>
+</script>
+<script>
+    layui.use(['table', 'util', 'admin', 'laydate', 'config', 'form'], function () {
+        let table = layui.table;
+        let util = layui.util;
+        let admin = layui.admin;
+        let form = layui.form;
+        let laydate = layui.laydate;
+        let config = layui.config;
+
+        //日期
+        laydate.render({
+            elem: '#datebegin'
+        });
+        laydate.render({
+            elem: '#dateend'
+        });
+        // 渲染表格
+        var tableLoad = table.render({
+            elem: '#feedback-table',
+            url: config.base_server + 'api-opration/sysfeedback',
+            method: 'GET',
+            headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+            //where: {tenantId: config.clientId},
+            page: true,
+            cols: [[
+                { field: 'doctorName', width: 150, title: '医生姓名' },
+                { field: 'doctorTel', width: 200, title: '联系电话' },
+                { field: 'hospitalName', width: 300, title: '医院' },
+                { field: 'departmentName', width: 180, title: '科室' },
+                { field: 'enabled', width: 150, templet: '#user-tpl-state', sort: true, title: '状态' },
+                { field: 'createTime', width: 200, sort: true, title: '创建时间' },
+                { align: 'center', width: 200, toolbar: '#feeedback-table-bar', title: '操作' }
+            ]]
+        });
+
+        // 修改状态
+        form.on('switch(feedback-tpl-state)', function (obj) {
+            layer.load(2);
+            admin.req('api-opration/sysfeedback/updateEnabled', {
+                id: obj.elem.value,
+                enabled: obj.elem.checked ? true : false
+            }, function (data) {
+                layer.closeAll('loading');
+                if (data.code == 0) {
+                    layer.msg(data.msg, { icon: 1, time: 500 });
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 500 });
+                    $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+                }
+            }, 'GET');
+        });
+
+        // 工具条点击事件
+        table.on('tool(feedback-table)', function (obj) {
+            if (obj.event === 'del') { // 删除
+                layer.confirm('确定要删除吗?', function (i) {
+                    layer.close(i);
+                    layer.load(2);
+                    admin.req('api-opration/sysfeedback/' + obj.data.id, {}, function (data) {
+                        layer.closeAll('loading');
+                        layer.msg(data.msg, { icon: 1, time: 500 }, function () {
+                            tableLoad();
+                        });
+                        obj.del();
+                    }, 'DELETE');
+                });
+            }
+            else if (obj.event == 'detail') {
+                $.ajax({
+                    type: "GET",
+                    url: config.base_server + "api-opration/sysfeedback/" + obj.data.id,
+                    success: function (data) {
+                        if (data != null) {
+                            layer.open({
+                                type: 1,
+                                title: '详情',
+                                area: ['500px', '300px'],
+                                offset: 'auto',
+                                content: $("#feedback-detail").html(),
+                                success: function (obj) {
+                                    $("#feedback-detail-note").html(data.data.feedbackNote);
+                                }
+                            });
+                        }
+                        else {
+                            layer.msg('未找到相关数据', { icon: 1, time: 500 });
+                        }
+                    },
+                    beforeSend: function (xhr) {
+                        xhr.setRequestHeader("Authorization", "Bearer " + config.getToken().access_token);
+                        xhr.setRequestHeader("Content-Type", "application/json")
+                    }
+                });
+            }
+        });
+
+        // 搜索按钮点击事件
+        $('#user-btn-search').click(function () {
+            var doctorName = $('#user-search-value').val();
+            var datebegin = $('#datebegin').val();
+            var dateend = $('#dateend').val();
+            if (strUtil.isEmpty(datebegin) && !strUtil.isEmpty(dateend)) {
+                datebegin = dateUtil.getNowDate();
+                $('#datebegin').val(datebegin);
+            }
+            if (!strUtil.isEmpty(datebegin) && strUtil.isEmpty(dateend)) {
+                dateend = dateUtil.getNowDate();
+                $('#dateend').val(dateend);
+            }
+            table.reload('feedback-table', { where: { doctorName: doctorName, createTime: datebegin, updateTime: dateend } });
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/hospital.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/hospital.html
new file mode 100644
index 0000000..6a3ac4b
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/hospital.html
@@ -0,0 +1,236 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">医院管理</h2>
+        <span class="layui-breadcrumb pull-right">
+            <a href="#!home_console">首页</a>
+            <a><cite>医院管理</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            <input id="app-edit-search" class="layui-input search-input" type="text" placeholder="请输入标题" />&emsp;
+            <input type="text" class="layui-input search-input" id="test1"> 至 <input type="text"
+                class="layui-input search-input" id="test2"> &emsp;
+            <select id="role_clients" placeholder="选择一个应用" lay-filter="role_clients">
+                <option value="">-请选择-</option>
+            </select>
+            <button id="app-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
+        </div>
+
+        <!-- 数据表格 -->
+        <table class="layui-table" id="app-table" lay-filter="app-table"></table>
+    </div>
+</div>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="businessRecords-table-bar">
+    <select>
+        <option></option
+    </select>
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看详情</a>
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
+    <a class="layui-btn layui-btn-xs" lay-event="reset">重置密码</a>
+    <a class="layui-btn layui-btn-xs" lay-event="del">删除</a>
+</script>
+
+<!-- 表单弹窗 -->
+<script type="text/html" id="app-model">
+    <form id="app-form" lay-filter="app-form" class="layui-form model-form">
+        <input name="id" type="hidden"/>
+        <div class="layui-form-item">
+            <label class="layui-form-label">记录标题</label>
+            <div class="layui-input-block">
+                <input name="recordTitle" disabled="true" type="text" class="layui-input" maxlength="20"
+                       lay-verify="required" required/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">操作人姓名</label>
+            <div class="layui-input-block">
+                <input name="userName" disabled="true" placeholder="请输入应用名称" type="text" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">应用名称</label>
+            <div class="layui-input-block">
+                <input name="appName" disabled="true" type="text" class="layui-input" maxlength="20"
+                       lay-verify="required" required />
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">ip</label>
+            <div class="layui-input-block">
+                <input name="recordIp" disabled="true" type="text" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">业务操作记录</label>
+            <div class="layui-input-block">
+                <input name="recordDetail" disabled="true" type="text" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item model-form-footer">
+            <button class="layui-btn layui-btn-primary" ew-event="closeDialog" type="button">确定</button>
+        </div>
+    </form>
+</script>
+
+
+<script>
+    layui.use(['form', 'table', 'laydate', 'util', 'config', 'admin'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var config = layui.config;
+        var layer = layui.layer;
+        var util = layui.util;
+        var admin = layui.admin;
+
+        // 获取应用列表
+        // layer.load(2);
+        admin.req('api-user/users/findAll', {}, function (data) {
+            layer.closeAll('loading');
+            if (0 === data.code) {
+                let selected = false;
+                clientsAll = data.data;
+                $.each(data.data, function (index, item) {
+                    if (config.clientId === item.clientId) {
+                        selected = true;
+                    } else {
+                        selected = false;
+                    }
+                    //往下拉菜单里添加元素
+                    $('#role_clients').append(new Option(item.username, item.id, false, selected));
+                })
+                form.render();
+            } else {
+                layer.msg(data.msg, { icon: 2, time: 500 });
+            }
+        }, 'Post');
+
+        //时间格式
+        var laydate = layui.laydate;
+        //执行一个laydate实例
+        laydate.render({
+            elem: '#test1' //指定元素
+        });
+        laydate.render({
+            elem: '#test2' //指定元素
+        });
+
+        // 渲染表格
+        table.render({
+            elem: '#app-table',
+            url: config.base_server + 'api-user/syshospital',
+            method: 'GET',
+            headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+            page: true,
+            cols: [[
+                { type: 'numbers' },
+                { field: 'hospitalName', width: 180, sort: true, title: '医院名称' },
+                { field: 'hospitalTypeName', width: 200, sort: true, title: '科室' },
+                { field: 'serverUserName', width: 180, sort: true, title: '联系人' },
+                { field: 'hospitalTel', width: 300, sort: true, title: '联系方式' },
+                { field: 'time', width: 300, sort: true, title: '服务到期时间' },
+                { field: 'enabled', width: 300, sort: true, title: '状态' ,templet:function (d) {
+                        return d.hospitalState==0?"试用":"正式"
+                    }},
+                { field: 'isScreen', width: 300, sort: true, title: '筛查',templet:function (d) {
+                        return d.isScreen?"是":"否"
+                    } },
+                { field: 'createTime', width: 300, sort: true, title: '创建时间', templet: "<div>{{layui.util.toDateString(d.createTime, 'yyyy/MM/dd')}}</div>" },
+                { field: 'id', width: 250, align: 'center', toolbar: '#businessRecords-table-bar', sort: true, title: '操作' },// 0就诊数据 1筛查
+            ]]
+        });
+
+        // 工具条点击事件
+        table.on('tool(app-table)', function (obj) {
+            var data = obj.data;
+            var layEvent = obj.event;
+            if (layEvent === 'detail') { // 查看详情
+                showEditModel(data);
+            }
+        });
+
+        // 搜索按钮点击事件
+        $('#app-btn-search').click(function () {
+            var userId = $('#role_clients').val();
+            var key = $('#app-edit-search').val();
+            var startTime = $('#test1').val();
+            var endTime = $('#test2').val();
+            if (startTime != null && endTime != null) {
+                var flag = compareDate(startTime, endTime);
+                if (!flag) {
+                    layer.msg('结束时间不得小于开始时间');
+                    return;
+                }
+            }
+
+            table.reload('app-table', { where: { recordTitle: key, startTime: startTime, endTime: endTime, userId: userId } });
+        });
+        //比较日期大小
+        function compareDate(logintime, logouttime) {
+            var arys1 = new Array();
+            var arys2 = new Array();
+            if (logintime != null && logouttime != null) {
+                arys1 = logintime.split('-');
+                var logindate = new Date(arys1[0], parseInt(arys1[1] - 1), arys1[2]);
+                arys2 = logouttime.split('-');
+                var logoutdate = new Date(arys2[0], parseInt(arys2[1] - 1), arys2[2]);
+                if (logindate > logoutdate) {
+                    return false;
+                } else {
+                    return true;
+                }
+            }
+        }
+        // 导出
+        $('#app-btn-export').click(function () {
+            var url = config.base_server + 'api-user/dataneed/export';
+            var xhr = new XMLHttpRequest();
+            xhr.open('POST', url, true);
+            xhr.responseType = "blob";
+            xhr.setRequestHeader("client_type", "DESKTOP_WEB");
+            xhr.setRequestHeader("Authorization", "Bearer " + config.getToken().access_token);
+            xhr.onload = function () {
+                if (this.status == 200) {
+                    var fileName = "user.xlsx";
+                    var blob = this.response;
+                    var a = document.createElement('a');
+                    a.innerHTML = fileName;
+                    // 指定生成的文件名
+                    a.download = fileName;
+                    a.href = URL.createObjectURL(blob);
+                    document.body.appendChild(a);
+                    var evt = document.createEvent("MouseEvents");
+                    evt.initEvent("click", false, false);
+                    a.dispatchEvent(evt);
+                    document.body.removeChild(a);
+                }
+            }
+            xhr.send();
+        });
+
+        // // 显示编辑弹窗
+        var showEditModel = function (data) {
+            layer.open({
+                type: 1,
+                title: '查看详情',
+                area: '450px',
+                offset: '120px',
+                content: $('#app-model').html(),
+                success: function () {
+                    $('#app-form')[0].reset();
+                    $('#app-form').attr('method', 'POST');
+                    if (data) {
+                        $("input[name='clientId']").attr('disabled', true);
+                        $("input[name='clientId']").attr('class', "layui-input layui-disabled");
+                        $("input[name='webServerRedirectUri']").attr('disabled', true);
+                        $("input[name='webServerRedirectUri']").attr('class', "layui-input layui-disabled");
+                        form.val('app-form', data);
+                        // $('#app-form').attr('method', 'POST');
+                    }
+                }
+            });
+        };
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/product.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/product.html
new file mode 100644
index 0000000..53c6ebb
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/product.html
@@ -0,0 +1,133 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">产品管理</h2>
+        <span class="layui-breadcrumb pull-right">
+            <a href="#!console">首页</a>
+            <a><cite>产品管理</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">&emsp;
+            <input id="product-search-value" class="layui-input search-input" type="text" placeholder="输入产品名" />&emsp;
+            <button id="product-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
+            <button id="product-btn-add" class="layui-btn icon-btn"><i class="layui-icon">&#xe654;</i>添加</button>
+        </div>
+        <table class="layui-table" id="product-table" lay-filter="product-table"></table>
+    </div>
+</div>
+<!-- 表格操作列 -->
+<script type="text/html" id="product-table-bar">
+    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+</script>
+<!-- 表格状态列 -->
+<script type="text/html" id="product-tpl-state">
+    <input type="checkbox" lay-filter="product-tpl-state" value="{{d.id}}" lay-skin="switch" lay-text="未处理|已处理"
+           {{d.enabled==true?'checked':''}}/>
+</script>
+<!-- 弹窗内容 -->
+<script type="text/html" id="feedback-detail">
+
+</script>
+
+<script>
+    layui.use(['table', 'util', 'admin', 'config', 'form'], function () {
+        let table = layui.table;
+        let util = layui.util;
+        let admin = layui.admin;
+        let form = layui.form;
+        let laydate = layui.laydate;
+        let config = layui.config;
+
+        // 渲染表格
+        var renderTable = function () {
+            layer.load(2);
+            table.render({
+                elem: '#product-table',
+                url: config.base_server + 'api-opration/product',
+                method: 'GET',
+                headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+                page: true,
+                cols: [[
+                    { field: 'proName', width: 300, title: '产品名称' },
+                    {
+                        field: 'proTime', width: 150, title: '有效时长', templet: function (d) {
+                            switch (d.proTimeUnit) {
+                                case 0:
+                                    return d.proTime + "天";
+                                    break;
+                                case 1:
+                                    return d.proTime + "月";
+                                    break;
+                                case 2:
+                                    return d.proTime + "年";
+                                    break;
+                            }
+                        }
+                    },
+                    { field: 'proPrice', width: 100, title: '价格' },
+                    { field: 'recordCount', width: 180, title: '报告数' },
+                    { field: 'ailightCount', width: 180, title: '读片量' },
+                    { field: 'enabled', width: 150, templet: '#product-tpl-state', sort: true, title: '状态' },
+                    { field: 'createTime', width: 200, sort: true, title: '创建时间' },
+                    { align: 'center', width: 100, toolbar: '#product-table-bar', title: '操作' }
+                ]],
+                done: function () {
+                    layer.closeAll('loading');
+                }
+            });
+        }
+        renderTable();
+
+        // 修改状态
+        form.on('switch(product-tpl-state)', function (obj) {
+            layer.load(2);
+            admin.req('api-opration/product/updateEnabled', {
+                id: obj.elem.value,
+                enabled: obj.elem.checked ? true : false
+            }, function (data) {
+                layer.closeAll('loading');
+                if (data.code == 0) {
+                    layer.msg(data.msg, { icon: 1, time: 500 });
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 500 });
+                    $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+                }
+            }, 'GET');
+        });
+
+        // 工具条点击事件
+        table.on('tool(product-table)', function (obj) {
+            if (obj.event === 'del') { // 删除
+                layer.confirm('确定要删除吗?', function (i) {
+                    layer.close(i);
+                    layer.load(2);
+                    admin.req('api-opration/product/' + obj.data.id, {}, function (data) {
+                        layer.closeAll('loading');
+                        layer.msg(data.msg, { icon: 1, time: 500 }, function () {
+
+                            renderTable();
+                        });
+                        obj.del();
+                    }, 'DELETE');
+                });
+            }
+        });
+
+        // 搜索按钮点击事件
+        $('#product-btn-search').click(function () {
+            var proName = $('#product-search-value').val();
+            table.reload('product-table', { where: { proName: proName } });
+        });
+        // 添加按钮点击事件
+        $('#product-btn-add').click(function () {
+            admin.popupCenter({
+                title: '添加产品',
+                path: 'pages/opration/product_form.html',
+                finish: function () {
+                    renderTable();
+                }
+            })
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/product_form.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/product_form.html
new file mode 100644
index 0000000..55aa09e
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/product_form.html
@@ -0,0 +1,101 @@
+<form id="product-form" lay-filter="product-form" class="layui-form model-form" method="POST">
+    <div class="layui-form-item">
+        <label class="layui-form-label">产品类型</label>
+        <div class="layui-input-block">
+            <input type="radio" name="proType" value="1" title="正式" checked />
+            <input type="radio" name="proType" value="0" title="试用" />
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">产品名称</label>
+        <div class="layui-input-block">
+            <input name="proName" placeholder="请输入产品名称" type="text" class="layui-input" maxlength="50"
+                lay-verify="required" required />
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">有效时长</label>
+        <div class="layui-input-block">
+            <input name="proTime" type="text" class="layui-input" maxlength="4" lay-verify="required|number" required />
+            <select name="proTimeUnit" id="proTimeUnit">
+                <option value="0">天</option>
+                <option value="1">月</option>
+                <option value="2">年</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">价格</label>
+        <div class="layui-input-block">
+            <input name="proPrice" type="text" class="layui-input" maxlength="8" lay-verify="required|number" required />
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">报告量</label>
+        <div class="layui-input-block">
+            <input name="recordCount" type="text" class="layui-input" maxlength="6" lay-verify="required|number"
+                required />
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">读片量</label>
+        <div class="layui-input-block">
+            <input name="ailightCount" type="text" class="layui-input" maxlength="6" lay-verify="required|number"
+                required />
+        </div>
+    </div>
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" ew-event="closeDialog" type="button">取消</button>
+        <button class="layui-btn" lay-filter="product-form-submit" lay-submit>保存</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['form', 'table', 'util', 'config', 'admin', 'formSelects'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var config = layui.config;
+        var layer = layui.layer;
+        var util = layui.util;
+        var admin = layui.admin;
+        var formSelects = layui.formSelects;
+        var clientsAll = null;
+        // 获取应用列表
+        layer.load(2);
+        admin.req('api-uaa/clients/all', {}, function (data) {
+            layer.closeAll('loading');
+            if (0 === data.code) {
+                let selected = false;
+                clientsAll = data.data;
+                $.each(data.data, function (index, item) {
+                    if (config.clientId === item.clientId) {
+                        selected = true;
+                    } else {
+                        selected = false;
+                    }
+                    //往下拉菜单里添加元素
+                    $('#tenantId').append(new Option(item.clientName, item.clientId, false, selected));
+                })
+                form.render();
+            } else {
+                layer.msg(data.msg, { icon: 2, time: 500 });
+            }
+        }, 'GET');
+        // 表单提交事件
+        form.on('submit(product-form-submit)', function (data) {
+            layer.load(2);
+            admin.req('api-opration/product', JSON.stringify(data.field), function (data) {
+                if (data.code === 0) {
+                    layer.closeAll('loading');
+                    layer.msg(data.msg, { icon: 1, time: 500 });
+                    admin.finishPopupCenter();
+                } else {
+                    layer.closeAll('loading');
+                    layer.msg(data.msg, { icon: 2, time: 500 });
+                }
+            }, $('#product-form').attr('method'));
+            return false;
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/sysdictionaries.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/sysdictionaries.html
new file mode 100644
index 0000000..cc81dd6
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/sysdictionaries.html
@@ -0,0 +1,285 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">字典管理</h2>
+        <span class="layui-breadcrumb pull-right">
+            <a href="#!home_console">首页</a>
+            <a><cite>字典管理</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            <input id="app-edit-search" class="layui-input search-input" type="text" placeholder="按名称" />&emsp;
+            <button id="app-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
+            <button id="user-btn-add" class="layui-btn icon-btn"><i class="layui-icon">&#xe654;</i>添加</button>
+        </div>
+
+        <!-- 数据表格 -->
+        <table class="layui-table" id="app-table" lay-filter="app-table"></table>
+    </div>
+</div>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="dictionaries-table-bar">
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
+    <a class="layui-btn layui-btn-xs" lay-event="del">删除</a>
+</script>
+<!-- 表格状态列 -->
+<script type="text/html" id="dictionaries-tpl-state">
+    <input type="checkbox" lay-filter="dictionaries-tpl-state" value="{{d.id}}" lay-skin="switch" lay-text="启用|禁用"
+           {{d.enabled==1?'checked':''}}/>
+</script>
+
+<!-- 表单弹窗 -->
+<script type="text/html" id="app-model">
+    <style>
+        .layui-layer-setwin {
+    position: absolute;
+    right: 15px;
+    *right: 0;
+    top: -29px;
+    font-size: 0;
+    line-height: initial;
+}
+    </style>
+    <form id="app-form" lay-filter="app-form" class="layui-form model-form">
+        <input name="id" type="hidden"/>
+        <div class="layui-form-item">
+            <label class="layui-form-label">字典值</label>
+            <div class="layui-input-block">
+                <input name="dictionariesName" placeholder="字典值"  type="text" class="layui-input" maxlength="20"
+                       lay-verify="required" required/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">字典key</label>
+            <div class="layui-input-block">
+                <input name="dictionariesKey"  placeholder="字典key" type="text" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">字段排序</label>
+            <div class="layui-input-block">
+                <input name="dictionariesOrder" placeholder="请输入数字"  type="text" class="layui-input" maxlength="20"
+                       lay-verify="required" required />
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">字典类型</label>
+            <div class="layui-input-block">
+                <input name="zidian_or_fenlei" id="fenlei" type="radio" value="1"   lay-filter="resourceType" onchange="ccc" title="分类" class="layui-input" maxlength="20"/>
+                <input name="zidian_or_fenlei" id="zidian " type="radio" value="0" checked lay-filter="resourceType"  title="字典" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">状态</label>
+            <div class="layui-input-block">
+                <input name="enabled" id="enabled1" type="radio" checked value="1" title="启用" class="layui-input" maxlength="20"/>
+                <input name="enabled" id="enabled2" type="radio"  value="0" title="停用" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">所属类型</label>
+            <div class="layui-input-block">
+                <select id="role_clients"   name="dictionariesClassId" placeholder="选择一个应用" lay-filter="role_clients">
+                    <option value="">-请选择-</option>
+                </select>
+        </div>
+        <div class="layui-form-item model-form-footer zd-btn-class" style="margin-top:30px;">
+            <button class="layui-btn layui-btn-primary" ew-event="closeDialog" type="button">取消</button>
+            <button class="layui-btn" lay-filter="user-form-submit" lay-submit>保存</button>
+        </div>
+    </form>
+</script>
+
+
+<script>
+    layui.use(['form', 'table', 'laydate', 'util', 'config', 'admin'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var config = layui.config;
+        var layer = layui.layer;
+        var util = layui.util;
+        var admin = layui.admin;
+
+        //时间格式
+        var laydate = layui.laydate;
+        //执行一个laydate实例
+        laydate.render({
+            elem: '#test1' //指定元素
+        });
+        laydate.render({
+            elem: '#test2' //指定元素
+        });
+
+        // 渲染表格
+        table.render({
+            elem: '#app-table',
+            url: config.base_server + 'api-user/sysdictionaries',
+            method: 'GET',
+            headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+            page: true,
+            cols: [[
+                { type: 'numbers' },
+                {
+                    field: 'dictionariesClassId', width: 180, sort: true, title: '字典类型', templet: function (d) {
+                        return d.dictionariesClassId == undefined ? "分类" : "字典"
+                    }
+                },
+                { field: 'dictionariesClassName', width: 200, sort: true, title: '字典分类' },
+                { field: 'dictionariesKey', width: 180, sort: true, title: '字典Key' },
+                { field: 'dictionariesName', width: 264, sort: true, title: '字典值' },
+                { field: 'id', width: 250, align: 'center', toolbar: '#dictionaries-tpl-state', sort: true, title: '状态' },// 0就诊数据 1筛查
+                { field: 'createTime', width: 250, sort: true, title: '创建时间', templet: "<div>{{layui.util.toDateString(d.createTime, 'yyyy年MM月dd日 HH:mm:ss')}}</div>" },
+                { field: 'id', width: 250, align: 'center', toolbar: '#dictionaries-table-bar', sort: true, title: '操作' },// 0就诊数据 1筛查
+            ]]
+        });
+
+        // 修改菜单类型
+        let changeType = function (type) {
+
+            if (type == 1) {
+                $('#role_clients').attr('disabled', true);
+                $('#role_clients').val("");
+            } else {
+                $('#role_clients').attr('disabled', false);
+            }
+            form.render('select', 'app-form');
+        };
+
+        // 工具条点击事件
+        table.on('tool(app-table)', function (obj) {
+            var data = obj.data;
+            var layEvent = obj.event;
+            if (layEvent === 'edit') { // 查看详情
+                showEditModel(data);
+            } else if (layEvent === 'del') {
+                doDelete(data);
+            }
+        });
+        function ccc() {
+            console.log(11111111)
+        }
+        // 删除
+        var doDelete = function (obj) {
+            layer.confirm('确定删除此用户吗?', function (i) {
+                layer.close(i);
+                layer.load(2);
+                admin.req('api-user/sysdictionaries/' + obj.id, {}, function (data) {
+                    layer.closeAll('loading');
+                    if (data.code == 0) {
+                        layer.msg(data.msg, { icon: 1, time: 500 });
+                        table.reload('app-table', {});
+                    } else {
+                        layer.msg(data.msg, { icon: 2, time: 500 });
+                    }
+                }, 'delete');
+            });
+        };
+
+        // 获取应用列表
+        var getdata = function () {
+            var co = $('#role_clients');
+            console.log(11111111111111);
+            console.log(co);
+            admin.req('api-user/sysdictionaries/findAll', JSON.stringify({ dictionariesClassIdIsNull: "str" }), function (data) {
+                layer.closeAll('loading');
+                if (0 === data.code) {
+                    console.log(123132132132132132)
+                    let selected = false;
+                    clientsAll = data;
+                    $.each(data.data, function (index, item) {
+                        //往下拉菜单里添加元素
+                        // console.log(JSON.stringify(item))
+                        $('#role_clients').append(new Option(item.dictionariesName, item.id, false, selected));
+                    })
+                    form.render();
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 500 });
+                }
+            }, 'Post');
+        }
+
+
+        // 搜索按钮点击事件
+        $('#app-btn-search').click(function () {
+            var key = $('#app-edit-search').val();
+            table.reload('app-table', { where: { dictionariesName: key } });
+        });
+        // 修改role状态
+        form.on('switch(dictionaries-tpl-state)', function (obj) {
+            layer.load(2);
+            admin.req('api-user/sysdictionaries/updateEnabled', {
+                id: obj.elem.value,
+                enabled: obj.elem.checked ? 1 : 0
+            }, function (data) {
+                layer.closeAll('loading');
+                if (data.code == 0) {
+                    // layer.msg(data.msg, { icon: 1, time: 500 });
+                    table.reload('app-table', {});
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 500 });
+                    $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+                }
+            }, 'GET');
+        });
+        // // 显示编辑弹窗
+        var showEditModel = function (data) {
+
+            layer.open({
+                type: 1,
+                title: data ? '修改用户' : '添加用户',
+                area: '400px',
+                offset: '200px',
+                content: $('#app-model').html(),
+                success: function () {
+                    $('#app-form')[0].reset();
+                    $('#app-form').attr('method', 'POST');
+                    // 将数据绑定到下拉框
+                    getdata();
+                    if (data) {
+                        if (data.enabled == 1) {
+                            $("#enabled1").attr('checked', true);
+                        } else {
+                            $("#enabled2").attr('checked', true);
+                        }
+                        if (data.dictionariesClassId == undefined || data.dictionariesClassId == "") {
+                            $("#fenlei").attr('checked', true);
+                            $("#role_clients").attr('disabled', true);
+                        } else {
+                            $("#zidian").attr('checked', true);
+                        }
+                        form.val('app-form', data);
+                    }
+                }
+            });
+        };
+        // 添加按钮点击事件
+        $('#user-btn-add').click(function () {
+            showEditModel();
+        });
+        //
+        // 表单提交事件
+        form.on('submit(user-form-submit)', function (data) {
+            layer.load(2);
+            if (data.field.dictionariesClassId == "") {
+                data.field.dictionariesClassId = null;
+            }
+            admin.req('api-user/sysdictionaries', JSON.stringify(data.field), function (data) {
+                layer.closeAll('loading');
+                if (data.code == 0) {
+                    // layer.msg(data.msg, { icon: 1, time: 500 });
+                    layer.closeAll();
+                    table.reload('app-table', {});
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 500 });
+                }
+            }, "POST");
+            return false;
+        });
+
+        form.on("radio(resourceType)", function (data) {
+            changeType(data.value);
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/sysArea.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/sysArea.html
new file mode 100644
index 0000000..2782d31
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/sysArea.html
@@ -0,0 +1,187 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">地区管理</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#!console">首页</a>
+          <a><cite>地区管理</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">&emsp;
+            <input id="area-search-value" class="layui-input search-input" type="text" placeholder="输入地区名称"/>&emsp;
+            <button id="area-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
+            <button id="area-btn-add" class="layui-btn icon-btn"><i class="layui-icon">&#xe654;</i>添加</button>
+            <button id="area-btn-expand" class="layui-btn">全部展开</button>
+            <button id="area-btn-fold" class="layui-btn">全部折叠</button>
+        </div>
+
+        <table class="layui-table" id="area-table" lay-filter="area-table"></table>
+    </div>
+</div>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="area-table-bar">
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">编辑</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+</script>
+
+<!-- 表格状态列 -->
+<script type="text/html" id="area-tpl-state">
+    <input type="checkbox" lay-filter="area-tpl-state" value="{{d.id}}" lay-skin="switch" lay-text="启用|禁用"
+           {{d.enabled==true?'checked':''}}/>
+</script>
+
+<script>
+    layui.use(['form', 'util', 'config', 'admin','treetable','table'],function () {
+        let layer = layui.layer;
+        let admin = layui.admin;
+        let treetable = layui.treetable;
+        let config = layui.config;
+        let form = layui.form;
+        let table=layui.table;
+
+        // 渲染表格
+        var renderTable = function (param) {
+            layer.load(2);
+            if (param) {
+                param.access_token = config.getToken().access_token;
+            } else {
+                param = {
+                    access_token: config.getToken().access_token
+                };
+            }
+            treetable.render({
+                treeColIndex: 0,
+                treeSpid: -1,
+                treeIdName: 'id',
+                treePidName: 'areaParentId',
+                elem: '#area-table',
+                url: config.base_server + 'api-user/sysarea/findAlls',
+                where: param,
+                page: false,
+                cols: [[
+                    {field: 'areaName', minWidth: 200, title: '区域名称'},
+                    {field: 'areaCh',  align: 'center', title: '拼音'},
+                    {field: 'areaShortname', minWidth: 80, title: '简称'},
+                    {field: 'areaCitycode', title: '区号'},
+                    {field: 'areaZipcode', title: '邮编'},
+                    {field: 'sort', width: 80, align: 'center', title: '排序号'},
+                    {
+                        field: 'areaLeveltype', width: 80, align: 'center', templet: function (d) {
+                            switch(d.areaLeveltype){
+                                case 0:
+                                return '<span class="layui-badge layui-bg-red">国家</span>';
+                                break;
+                                case 1:
+                                return '<span class="layui-badge layui-bg-blue">省/行政区</span>';
+                                break;
+                                case 2:
+                                return '<span class="layui-badge layui-bg-gray">市</span>';
+                                break;
+                                case 3:
+                                return '<span class="layui-badge layui-bg-green">区/县</span>';
+                                break;
+                            }
+                        }, title: '级别'
+                    },
+                    {field: 'enabled', width: 100,sort: true, templet: '#area-tpl-state', title: '状态'},
+                    {templet: '#area-table-bar', width: 120, align: 'center', title: '操作'}
+                ]],
+                    done: function () {
+                        layer.closeAll('loading');
+                    }
+            });
+        };
+        renderTable();
+
+        // 修改状态
+        form.on('switch(area-tpl-state)', function (obj) {
+        layer.load(2);
+        admin.req('api-user/sysarea/updateEnabled', {
+            id: obj.elem.value,
+            enabled: obj.elem.checked ? true : false
+        }, function (data) {
+            layer.closeAll('loading');
+            if (data.code == 0) {
+                layer.msg(data.msg, {icon: 1, time: 500});
+            } else {
+                layer.msg(data.msg, {icon: 2, time: 500});
+                $(obj.elem).prop('checked', !obj.elem.checked);
+                form.render('checkbox');
+            }
+        }, 'GET');
+        });
+
+        // 工具条点击事件
+        table.on('tool(area-table)', function (obj) {
+            if (obj.event === 'del') { // 删除
+                layer.confirm('确定要删除吗?', function (i) {
+                layer.close(i);
+                layer.load(2);
+                admin.req('api-user/sysarea/'+obj.data.id, {}, function (data) {
+                    layer.closeAll('loading');
+                    layer.msg(data.msg, {icon: 1, time: 800},function(){
+                        renderTable();
+                    });
+                    obj.del();
+                }, 'DELETE');
+            });
+            }
+            else if(obj.event=='edit')
+            {
+                showEditModel(obj.data);
+            }
+        });
+
+        // 显示编辑弹窗
+        var showEditModel = function (data) {
+            let title = data ? '修改区域' : '添加区域';
+            if (!data){
+                data = {};
+            }
+            admin.putTempData('t_area', data);
+
+            admin.popupCenter({
+                title: title,
+                path: 'pages/system/sysarea_form.html',
+                finish: function () {
+                    renderTable();
+                }
+            });
+        };
+
+        // 搜索按钮点击事件
+        $('#area-btn-search').click(function () {
+            var keyword = $('#area-search-value').val();
+            var searchCount = 0;
+            $('#area-table').next('.treeTable').find('.layui-table-body tbody tr td').each(function () {
+                $(this).css('background-color', 'transparent');
+                var text = $(this).text();
+                if (keyword !== '' && text.indexOf(keyword) >= 0) {
+                    $(this).css('background-color', 'rgba(250,230,160,0.5)');
+                    if (searchCount === 0) {
+                        $('.layui-tab-item.layui-show').stop(true);
+                        $('.layui-tab-item.layui-show').animate({scrollTop: $(this).offset().top - 150}, 500);
+                    }
+                    searchCount++;
+                }
+            });
+            if (keyword !== '' && searchCount === 0) {
+                layer.msg("没有匹配结果", {icon: 5, time: 500});
+            } else {
+                treetable.expandAll('#area-table');
+            }
+        });
+        $('#area-btn-expand').click(function () {
+            treetable.expandAll('#area-table');
+        });
+
+        $('#area-btn-fold').click(function () {
+            treetable.foldAll('#area-table');
+        });
+        // 添加按钮点击事件
+        $('#area-btn-add').click(function () {
+            showEditModel();
+        });
+    });
+</script>
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/sysArea_form.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/sysArea_form.html
new file mode 100644
index 0000000..61d4536
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/sysArea_form.html
@@ -0,0 +1,110 @@
+<!-- 菜单弹框 -->
+<form id="area-form" lay-filter="area-form" class="layui-form model-form" method="POST">
+    <div class="layui-form-item">
+        <label class="layui-form-label">区域级别</label>
+        <div class="layui-input-block">
+            <select name="areaLeveltype" id="areaLeveltype">
+                <option value="">请选择</option>
+                <option value="0">国家</option>
+                <option value="1">省/行政区</option>
+                <option value="2">市</option>
+                <option value="3">区县</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">区域编号</label>
+        <div class="layui-input-block">
+            <input id="Id" name="id" placeholder="请输入区域编号" type="text" class="layui-input" maxlength="20"
+                   lay-verify="required" required/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">区域名称</label>
+        <div class="layui-input-block">
+            <input name="areaName" placeholder="请输入区域名称" type="text" class="layui-input" maxlength="50"
+                   lay-verify="required" required/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">简称</label>
+        <div class="layui-input-block">
+            <input name="areaShortname"  type="text" class="layui-input" maxlength="50"/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">拼音名称</label>
+        <div class="layui-input-block">
+            <input name="areaCh"  type="text" class="layui-input" maxlength="50"/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">父级编号</label>
+        <div class="layui-input-block">
+            <input name="areaParentId"  type="text" class="layui-input" maxlength="20"/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">区号</label>
+        <div class="layui-input-block">
+            <input name="areaCitycode"  type="text" class="layui-input"/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">邮编</label>
+        <div class="layui-input-block">
+            <input name="areaZipcode"  type="text" class="layui-input"/>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">纬度</label>
+        <div class="layui-input-block">
+            <input name="areaLng"  type="text" class="layui-input"/>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">经度</label>
+        <div class="layui-input-block">
+            <input name="areaLat"  type="text" class="layui-input"/>
+        </div>
+    </div>
+
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" ew-event="closeDialog" type="button">取消</button>
+        <button class="layui-btn" lay-filter="area-form-submit" lay-submit>保存</button>
+    </div>
+    <input name="enabled"  type="hidden" />
+    <input name="isDel"  type="hidden" />
+</form>
+
+<script>
+    layui.use(['layer', 'admin', 'form'],function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+
+        // 回显menu数据
+        let area = admin.getTempData('t_area');
+        if(area){
+        form.val('area-form', area);
+        $("#Id").attr("enabled","false");
+    }
+        // 表单提交事件
+        form.on('submit(area-form-submit)', function (data) {
+            layer.load(2);
+            admin.req('api-user/sysarea', JSON.stringify(data.field), function (data) {
+                if (data.code === 0) {
+                	layer.closeAll('loading');
+                    layer.msg(data.msg, {icon: 1, time: 500});
+                    admin.finishPopupCenter();
+                } else {
+                	layer.closeAll('loading');
+                    layer.msg(data.msg, {icon: 2, time: 500});
+                }
+            }, $('#area-form').attr('method'));
+            return false;
+        });
+    });
+</script>
\ No newline at end of file

--
Gitblit v1.8.0