From daa697719eb0ddfd170f1ab94c5422a4f5b93951 Mon Sep 17 00:00:00 2001
From: zhaoxiaohao <279049017@qq.com>
Date: Fri, 18 Sep 2020 14:36:54 +0800
Subject: [PATCH] Merge branch 'dev'

---
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/scandal.ttf                                                                                                                    |    0 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/config.js                                                                                               |    4 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/ransom.ttf                                                                                                                     |    0 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/BaseSupperModel.java                                                           |   65 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/resources/application.yml                                                               |   97 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysLogger.java                                                     |   64 
 kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/role.html                                                                                        |   14 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/service/AliyunSmsService.java                                                   |   44 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/menus_form.html                                                                                   |    8 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/businessRecords.html                                                                            |   91 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/test.java                                                  |   12 
 kidgrow-uaa/kidgrow-uaa-server/Dockerfile                                                                                                                                |   92 
 kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/user_form.html                                                                                   |    6 
 kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/annotation/EnableFeignTenantInterceptor.java                                         |   26 
 kidgrow-business/kidgrow-opration-center/pom.xml                                                                                                                         |   56 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorSigningService.java                         |   33 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderController.java                  |  193 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysLoggerController.java                     |  114 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/pinball.ttf                                                                                                                    |    0 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/area.js                                                                                                 |   73 
 kidgrow-demo/kidgrow-demo-order/src/main/resources/personal/黄泽好友列表.json                                                                                                  |  842 +
 kidgrow-business/kidgrow-filecenter/pom.xml                                                                                                                              |   11 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IBusinessRecordsService.java                       |   41 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysFeedbackMapper.xml                                                     |   90 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/utils/JsonUtils.java                                                                                     |   50 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysDictionariesMapper.java                                        |   36 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysArea.java                                                       |   82 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/musicdbz.ttf                                                                                                                   |    0 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ProductAllVo.java                                       |   62 
 kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/properties/LogDbProperties.java                                                            |   19 
 kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/fallback/SysDoctorServiceFallbackFactory.java                                          |   32 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysDoctor.java                                                                 |  131 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/HospitalScreeningMapper.xml                                               |   75 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ConsumptionRecord.java                               |   96 
 kidgrow-commons/kidgrow-redis-spring-boot-starter/src/main/java/com/kidgrow/redis/util/RedisConstant.java                                                                |   13 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorServer.java                                    |   53 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/dto/SysRoleOrganizationMybatisDto.java                                   |    9 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysRole.java                                                       |   55 
 pom.xml                                                                                                                                                                  |   74 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/feign/fallback/SmsChuangLanServiceFallbackFactory.java                            |   31 
 kidgrow-demo/kidgrow-demo-product/src/main/resources/application.yml                                                                                                     |    2 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/client/SmsClient.java                                                           |  216 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/admin.js                                                                                                |   16 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysUserLogsMapper.java                                            |    9 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/antelope.ttf                                                                                                                   |    0 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/OrderInfoController.java                                                                      |    4 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorSigningServiceImpl.java                 |   49 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/layui/css/layui.css                                                                                |    2 
 kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignHttpInterceptorConfig.java                                               |    9 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/pom.xml                                                                                               |   66 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysHospitalServiceImpl.java                                 |  205 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/SysDoctorService.java                                              |   38 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/fallback/SysHospitalServiceFallbackFactory.java                    |   33 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserLogsController.java                                 |   73 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/contract.html                                                                                   |  168 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/UserProductDetail.java                                  |   28 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/properties/FileServerProperties.java                                  |    2 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorAnswerMapper.java                             |   34 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/model/WxFriend.java                                                                                      |   24 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/feign/FileService.java                                                   |   64 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/suckgolf.ttf                                                                                                                   |    0 
 .idea/inspectionProfiles/Project_Default.xml                                                                                                                             |   36 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/exception/SmsException.java                                                     |   31 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/DictionariesConstants.java                                                  |   28 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/toast.ttf                                                                                                                      |    0 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/HospitalListVo.java                                                   |  113 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/dataNeed.html                                                                                   |  321 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/model/OrderDetail.java                                                                                   |   26 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/yikatu.ttf                                                                                                                     |    0 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysHospitalService.java                                         |   53 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ConsumptionRecordMapper.java                        |   46 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/HospitalDoctorListVo.java                                             |   43 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/fresnel.ttf                                                                                                                    |    0 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/BusinessServer.java                                  |   75 
 kidgrow-business/kidgrow-searchcenter/kidgrow-searchcenter-server/Dockerfile                                                                                             |   14 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/DiagnosisRecord.java                                    |   70 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/KidgrowDateValidator.java                                                      |   62 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/antiblue.ttf                                                                                                                   |    0 
 kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/ZuulApplication.java                                                                              |    6 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/test.java                                                  |   12 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderRecordController.java            |  302 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysUserOrg.java                                                                |   67 
 kidgrow-jobs/kidgrow-jobs-admin/src/main/resources/application-dev.properties                                                                                            |    2 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysCompanyVo.java                                                     |   14 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager_form.html                                                                           |    4 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/tpl/iframe.html                                                                                          |    3 
 kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-admin/Dockerfile                                                                             |   14 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/SysUserService.java                                                |   25 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/annotation/DateValidator.java                                                        |   52 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/baidu-map/MarkerClusterer.js                                                                       |    2 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/sysArea.html                                                                                      |  187 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/ANGSTROM.TTF                                                                                                                   |    0 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserLogsMapper.xml                                                               |   59 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SuperEntity.java                                                               |    6 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/.vscode/settings.json                                                                                          |    3 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDoctorController.java                                   |  167 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/feign/fallback/FileServiceFallbackFactory.java                           |   56 
 kidgrow-web/kidgrow-web-hospital/src/main/resources/static/login.html                                                                                                    |    6 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorServerController.java                  |  117 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/RoleOrganizationService.java                         |   31 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/signal.ttf                                                                                                                     |    0 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/feedback.html                                                                                   |  156 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysUserLogs.java                                                   |    2 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/BusinessRecordsController.java               |  126 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/nullp.ttf                                                                                                                      |    0 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/robot.ttf                                                                                                                      |    0 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/hospital.html                                                                                   |  383 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/HospitalScreeningMapper.java                        |   34 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDoctorVo.java                                                      |    9 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/cosinek.ttf                                                                                                                    |    0 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/SysHospitalService.java                                            |   29 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/DoctorUserAll.java                                                             |  191 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/mapper/OrderTestMapper.java                                                                              |    2 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SuperModel.java                                                                |    5 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/codon.ttf                                                                                                                      |    0 
 kidgrow-springcloud/kidgrow-springcloud-eureka/src/main/resources/application.yml                                                                                        |    6 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionRequest.java                                 |   42 
 kidgrow-plugin/kidgrow-plugin-email/Dockerfile                                                                                                                           |   14 
 kidgrow-jobs/kidgrow-jobs-admin/src/main/resources/application-test.properties                                                                                           |    2 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/groupProduct.html                                                                               |   65 
 kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/rabbitmq/recieve/TopicReceive.java                                                   |   38 
 kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/UserInfoHeaderFilter.java                                                             |   74 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDoctorServiceImpl.java                                   |  535 
 kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/sharding/TableSuffix.java                                                                    |    4 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/template/SmsTemplate.java                                                         |   27 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/config/FeignMultipartConfig.java                                         |   23 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysUserOrgMapper.java                                             |   34 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/AliyunSmsUtils.java                                                        |  175 
 kidgrow-config/src/main/resources/application-open.properties                                                                                                            |   74 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/doctor_form.html                                                                                |  638 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysOrganizationVo.java                                                |    9 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/sysArea_form.html                                                                                 |  109 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/RoleOrganizationServiceFallbackFactory.java |   26 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/fallback/SysDoctorServiceFallbackFactory.java                      |   37 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/login.html                                                                                                     |   25 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserMapper.xml                                                                   |  239 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/BaseController.java                                                                           |   30 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats6.ttf                                                                                                                   |    0 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DataNeedServiceImpl.java                      |  140 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysRoleServiceImpl.java                                     |    8 
 kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-dashboard/Dockerfile                                                                         |   14 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/ProductOrderFallbackFactory.java            |   22 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/pom.xml                                                                                             |   34 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/tpl/password.html                                                                                        |    6 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IBusinessServerService.java                        |   33 
 kidgrow-commons/pom.xml                                                                                                                                                  |    1 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysRoleOrganizationMapper.java                                    |   34 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/apiUrl.js                                                                                               |   10 
 kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager.html                                                                               |    4 
 kidgrow-business/kidgrow-code-generator/src/main/resources/template/Mapper.xml.vm                                                                                        |    6 
 kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignInterceptorConfig.java                                                   |    2 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysLogger.java                                       |   65 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDictionariesController.java                             |  144 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysLoggerMapper.xml                                                                 |   59 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable-lay/treetable.js                                                                              |    4 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/pom.xml                                                                                                       |    8 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/PageResult.java                                                                |   18 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager_view.html                                                                           |    2 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/ConsumptionService.java                              |   59 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/pom.xml                                                                                                         |   16 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysLoggerMapper.java                                              |   34 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysRoleService.java                                             |    6 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/7hours.ttf                                                                                                                     |    0 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserService.java                                             |   79 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysOrganization.java                                                           |   70 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/diagnosisRecord.html                                                                            |  156 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/sysdictionaries.html                                                                            |  276 
 kidgrow-business/pom.xml                                                                                                                                                 |    1 
 kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/rabbitmq/send/TopicSender.java                                                       |   31 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorServerService.java                          |   33 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysFeedbackServiceImpl.java                   |  104 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysUser.java                                                                   |   10 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/controller/FileController.java                                        |   87 
 kidgrow-web/kidgrow-web-manager/pom.xml                                                                                                                                  |   15 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/donner.ttf                                                                                                                     |    0 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/model/FileInfo.java                                                      |    7 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java                                        |   37 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/model/SmsModel.java                                                               |   28 
 kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/auth/Oauth2AuthSuccessHandler.java                                                           |   20 
 kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-dashboard/pom.xml                                                                            |   15 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/pom.xml                                                                                                    |   15 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/AesUtils.java                                                                  |  102 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysRoleMapper.xml                                                                   |    3 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/ExceptionAdvice.java                             |   15 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/constant.ttf                                                                                                                   |    0 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/Dockerfile                                                                                                 |   14 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/guildof.ttf                                                                                                                    |    0 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserController.java                                     |  214 
 kidgrow-config/src/main/resources/application-pro.properties                                                                                                             |   55 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserServiceImpl.java                                     |  899 +
 kidgrow-demo/kidgrow-demo-product/pom.xml                                                                                                                                |   15 
 kidgrow-commons/kidgrow-rabbitmq-spring-boot-starter/src/main/java/com/kidgrow/rabbitmq/model/MqMessage.java                                                             |   31 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/FastdfsAutoConfigure.java                                      |   18 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorTempleteController.java                |  138 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/zincboom.ttf                                                                                                                   |    0 
 kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/menus_form.html                                                                                  |    6 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DataNeedMapper.xml                                                        |  113 
 kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/pom.xml                                                                                                        |   30 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/colophon.ttf                                                                                                                   |    0 
 kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/store/CustomRedisTokenStore.java                                             |   12 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/IOrderDetailService.java                                                                         |   26 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/davis.ttf                                                                                                                      |    0 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorServerMapper.xml                                                    |   69 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserLogsServiceImpl.java                                 |   27 
 kidgrow-demo/kidgrow-demo-order/src/test/java/com/kidgrow/order/mapper/OrderInfoMapperTest.java                                                                          |   38 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/user_org_form.html                                                                                |  164 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorSigningMapper.xml                                                   |   60 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java                                 |   46 
 kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/fallback/SysOrganizationServiceFallbackFactory.java                                    |   34 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IConsumptionRecordService.java                     |   67 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/dto/SysRoleOrganizationDto.java                                          |   25 
 kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/SysOrganizationService.java                                                            |   29 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/DOVES.TTF                                                                                                                      |    0 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysProductServiceImpl.java                    |  110 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/console.html                                                                                             |  733 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/geodesic.ttf                                                                                                                   |    0 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorTempleteMapper.java                           |   41 
 kidgrow-business/kidgrow-code-generator/pom.xml                                                                                                                          |   15 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/melanie.ttf                                                                                                                    |    0 
 kidgrow-business/kidgrow-logcenter/Dockerfile                                                                                                                            |   14 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/dnahand.ttf                                                                                                                    |    0 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/natlog.ttf                                                                                                                     |    0 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/ConstantSMS.java                                                          |    9 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/WebMvcConfig.java                                |   16 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/bboron.ttf                                                                                                                     |    0 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/dyspro.ttf                                                                                                                     |    0 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/hydrogen.ttf                                                                                                                   |    0 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/faraday.ttf                                                                                                                    |    0 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ConsumptionRecordController.java             |  132 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/pom.xml                                                                                             |   16 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/myInfo.html                                                                                       |   15 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/PasswordConfig.java                              |   16 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/linear.ttf                                                                                                                     |    0 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java                                             |   37 
 kidgrow-demo/kidgrow-demo-order/Dockerfile                                                                                                                               |   14 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysFeedbackController.java                   |  133 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable2/treeTable.css                                                                                |  396 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/metalang.ttf                                                                                                                   |    0 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/BaseConstants.java                                                          |    5 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/LoginAppUser.java                                                              |    4 
 kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager_form.html                                                                          |    4 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/UserRegVo.java                                                        |  117 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysAreaServiceImpl.java                                     |   73 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysCompanyController.java                                  |  129 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/sysOrganization.html                                                                            |  298 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDoctorDto.java                                                     |   13 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserOrgMapper.xml                                                                |   69 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysHospitalController.java                                 |  197 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/resources/application.yml                                                                         |   15 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserOrgController.java                                  |  200 
 kidgrow-business/kidgrow-searchcenter/kidgrow-searchcenter-server/pom.xml                                                                                                |   15 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysRoleOrganizationMapper.xml                                                       |  120 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/OrderDetailController.java                                                                    |   49 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/PROTERON.TTF                                                                                                                   |    0 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/QiniuOSSAutoConfigure.java                                     |   18 
 kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/files/files.html                                                                                        |    4 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/BusinessRecordsMapper.xml                                                 |   90 
 kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/SysDoctorService.java                                                                  |   28 
 kidgrow-web/kidgrow-web-hospital/Dockerfile                                                                                                                              |   14 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/HospitalInfo.java                                    |   10 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ProductOrderJoinDetail.java                             |  113 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/recharge.html                                                                                   |  616 
 kidgrow-config/src/main/resources/bootstrap.properties                                                                                                                   |    7 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserLogsService.java                                         |   10 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysCompanyMapper.xml                                                                |   88 
 kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/properties/RenewProperties.java                                              |    2 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/Dockerfile                                                                                                  |   14 
 kidgrow-demo/kidgrow-demo-product/Dockerfile                                                                                                                             |   14 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/DataNeedExcel.java                                      |   64 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/RandomValueUtils.java                                                          |   15 
 kidgrow-demo/kidgrow-demo-order/src/main/resources/application.yml                                                                                                       |    4 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/impl/OrderDetailServiceImpl.java                                                                 |   50 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/feign/SmsChuangLanService.java                                                    |   29 
 kidgrow-plugin/kidgrow-plugin-sms/pom.xml                                                                                                                                |   40 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysProduct.java                                      |   98 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysLoggerMapper.xml                                                       |   60 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserOrgService.java                                          |   39 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserOrgServiceImpl.java                                  |   88 
 kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/config/SecurityConfig.java                                                                               |   27 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDepartmentController.java                               |  189 
 kidgrow-demo/kidgrow-demo-order/src/main/resources/mapper/OrderTestMapper.xml                                                                                            |   37 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/product_form.html                                                                               |  103 
 kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/resources/application.yml                                                                             |   23 
 kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-admin/src/main/resources/application.yml                                                     |   25 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/product.html                                                                                    |  142 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/user.html                                                                                         |  108 
 kidgrow-business/kidgrow-code-generator/src/main/resources/template/Model.java.vm                                                                                        |    3 
 kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/service/impl/DefaultPermissionServiceImpl.java                               |   31 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorAnswerMapper.xml                                                    |   60 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorAnswerService.java                          |   33 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/header.html                                                                                              |   17 
 kidgrow-business/kidgrow-code-generator/src/main/resources/template/Controller.java.vm                                                                                   |   29 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ConsumptionRecordMapper.xml                                               |   76 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/epilog.ttf                                                                                                                     |    0 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/complete/autocomplete.js                                                                                |  232 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/SmsModel.java                                                             |   28 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/valium.ttf                                                                                                                     |    0 
 kidgrow-business/kidgrow-code-generator/src/main/resources/application.yml                                                                                               |    4 
 kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/controller/ValidateCodeController.java                                                                   |    5 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDepartment.java                                                 |   84 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/cwisdom.ttf                                                                                                                    |    0 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/tomhand.ttf                                                                                                                    |    0 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ProductOrderDetailMapper.java                       |   96 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDictionariesMapper.xml                                                           |   85 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/progbot.ttf                                                                                                                    |    0 
 kidgrow-config/src/main/resources/application-dev.properties                                                                                                             |   34 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysFeedbackService.java                           |   43 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysProductMapper.xml                                                      |  134 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/MybatisPlusConfig.java                           |   36 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/DiagnosticServiceFallbackFactory.java       |   23 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/BatchSmsTemplate.java                                                  |   26 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/SUBMERGD.TTF                                                                                                                   |    0 
 kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager_view.html                                                                          |    2 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysLoggerService.java                                           |   33 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/ProductOrderService.java                             |   29 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDataNeedService.java                              |   61 
 kidgrow-springcloud/kidgrow-springcloud-zuul/pom.xml                                                                                                                     |   29 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/AliyunOSSAutoConfigure.java                                    |  105 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/BusinessServerController.java                |  114 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/aes.js                                                                                                  |   50 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/model/OrderTest.java                                                                                     |   39 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderRecordServiceImpl.java            |  191 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/fallback/SysUserServiceFallbackFactory.java                        |   31 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/technet.ttf                                                                                                                    |    0 
 kidgrow-web/kidgrow-web-sso/pom.xml                                                                                                                                      |   15 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/q.js                                                                                               |    1 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/MultipartFileUtils.java                                                        |   61 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/QRCodeUtil.java                                                                |  138 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/TOMBATS1.TTF                                                                                                                   |    0 
 kidgrow-plugin/kidgrow-plugin-email/pom.xml                                                                                                                              |   15 
 kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/OrganizationFilter.java                                                               |  148 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/BusinessServerMapper.java                           |   34 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/SysLoggerMapper.java                                |   34 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysLoggerServiceImpl.java                     |   49 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/resolver/TokenArgumentResolver.java                                                  |   25 
 kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/fallback/SysUserOrgServiceFallbackFactory.java                                         |   36 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/OprationCenterApplication.java                                         |   25 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysOrganizationMapper.java                                        |   42 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java                                      |   46 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorServerServiceImpl.java                  |   49 
 kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/annotation/EnableFeignInterceptor.java                                               |    2 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombots.ttf                                                                                                                    |    0 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/DateUtils.java                                                                 |   10 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable2/treeTable.js                                                                                 | 1494 ++
 kidgrow-business/kidgrow-logcenter/pom.xml                                                                                                                               |   15 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/32768no.ttf                                                                                                                    |    0 
 kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/config/LogAutoConfigure.java                                                               |   14 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/prefix.ttf                                                                                                                     |    0 
 kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/controller/OAuth2Controller.java                                                                         |    9 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/initial.ttf                                                                                                                    |    0 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/BusinessServerServiceImpl.java                |   49 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ConsumptionConstant.java                                                    |   86 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysCompanyService.java                                          |   43 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDepartmentMapper.xml                                                             |   83 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/gauss.ttf                                                                                                                      |    0 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorSigningController.java                 |  118 
 kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/resources/META-INF/spring.factories                                                                             |    5 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/departmentProduct.html                                                                          |  166 
 kidgrow-demo/kidgrow-demo-order/src/main/resources/mapper/OrderInfoDetailMapper.xml                                                                                      |   13 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/actionj.ttf                                                                                                                    |    0 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysRoleController.java                                     |   10 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/lanchuang/controller/SmsChuangLanController.java                        |  156 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionVo.java                                      |   48 
 kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignTenantInterceptorConfig.java                                             |   46 
 kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/tokens.html                                                                                      |    4 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/UserProductData.java                                    |   30 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/headache.ttf                                                                                                                   |    0 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats7.ttf                                                                                                                   |    0 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/user_form.html                                                                                    |   61 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysCompanyMapper.java                                             |   34 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/dic.js                                                                                                  |   44 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/org_form.html                                                                                   |  113 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/secret.ttf                                                                                                                     |    0 
 kidgrow-springcloud/kidgrow-springcloud-eureka/Dockerfile                                                                                                                |   14 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorTempleteServiceImpl.java                |   71 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ProductOrderMapper.xml                                                    |   95 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysRoleMenuMapper.xml                                                               |   60 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/gmt.ttf                                                                                                                        |    0 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/resources/application.yml                                                                    |   58 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDepartmentServiceImpl.java                               |   94 
 kidgrow-uaa/kidgrow-uaa-server/pom.xml                                                                                                                                   |   26 
 kidgrow-web/kidgrow-web-sso/Dockerfile                                                                                                                                   |   14 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/CommonConstant.java                                                         |  141 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/IOrderTestService.java                                                                           |    2 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysLoggerService.java                             |   33 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/exception/SmsException.java                                                       |   31 
 kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/DateMetaObjectHandler.java                                                            |   41 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/service/AliyunSmsService.java                                                     |   44 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/thisprty.ttf                                                                                                                   |    0 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/BusinessServerMapper.xml                                                  |   78 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/OrderTestController.java                                                                      |   37 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysRole.java                                                                   |    1 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/util/AliyunSmsUtils.java                                                          |  175 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/filecenter/util/FileUtil.java                                                       |   16 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrderDetail.java                              |   96 
 kidgrow-web/kidgrow-web-hospital/pom.xml                                                                                                                                 |   15 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrder.java                                    |   93 
 .gitignore                                                                                                                                                               |   29 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/SmsChuangLanUtils.java                                                     |   63 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/OrderChartVo.java                                       |   33 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/tsmiles.ttf                                                                                                                    |    0 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/recordNote.html                                                                                 |   17 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/complete/autocomplete.css                                                                               |   10 
 kidgrow-demo/kidgrow-demo-order/pom.xml                                                                                                                                  |   15 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorAnswerController.java                  |  118 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDoctorMapper.xml                                                                 |  158 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/properties/OssProperties.java                                         |    5 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/Pinyin4jUtil.java                                                              |  149 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorSigning.java                                   |   40 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDictionariesService.java                                     |   39 
 kidgrow-commons/kidgrow-rabbitmq-spring-boot-starter/src/main/java/com/kidgrow/rabbitmq/config/RabbitConfig.java                                                         |  195 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysMenuServiceImpl.java                                     |    7 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/levity.ttf                                                                                                                     |    0 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/doctorTemplete.html                                                                             |  242 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysCompanyServiceImpl.java                                  |   81 
 kidgrow-commons/kidgrow-redis-spring-boot-starter/src/main/java/com/kidgrow/redis/util/RedisUtils.java                                                                   |  658 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/mapper/OrderInfoDetailMapper.java                                                                        |   14 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/BusinessRecords.java                                 |   68 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/verifyRecharge.html                                                                             |  108 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/SmsChuangLanService.java                                                  |   29 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysOrganizationService.java                                     |   68 
 kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/resources/logback-spring.xml                                                                                    |   34 
 kidgrow-web/kidgrow-web-manager/Dockerfile                                                                                                                               |   14 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysAreaController.java                                     |  142 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/nonblock.ttf                                                                                                                   |    0 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/SysProductMapper.java                               |   36 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/tommys.ttf                                                                                                                     |    0 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/GroupProductDetail.java                                 |   30 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DataNeedMapper.java                                 |   40 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorServerMapper.java                             |   34 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysHospital.java                                                   |  113 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderServiceImpl.java                  |  204 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/WeiXinImportData.java                                                                         |   30 
 kidgrow-springcloud/kidgrow-springcloud-eureka/pom.xml                                                                                                                   |   15 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/fallback/SmsChuangLanServiceFallbackFactory.java                          |   29 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysRoleOrganizationServiceImpl.java                         |  213 
 kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/util/AuthUtils.java                                                          |   12 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderDetailServiceImpl.java            |  399 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ServiceNameConstants.java                                                   |   42 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/company.html                                                                                    |  470 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/Dockerfile                                                                                                 |   14 
 kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/handler/SingleTokenServices.java                                                                         |  309 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ProductOrderDetailMapper.xml                                              |  267 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/HospitalScreeningController.java             |  118 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysHospitalMapper.xml                                                               |  281 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/BTTSOIEF.TTF                                                                                                                   |    0 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/js/common.js                                                                                            |  291 
 kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/myInfo.html                                                                                      |    4 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderDetailController.java            |  428 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DataNeedController.java                      |  155 
 kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/attestation/app.html                                                                                    |    6 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ProductOrderMapper.java                             |   41 
 kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/SysUserOrgService.java                                                                 |   33 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/attestation/app.html                                                                                     |   30 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DataNeed.java                                        |  110 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysOrganizationMapper.xml                                                           |  109 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderDetailService.java                    |  135 
 kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/sharding/HashModTableSuffix.java                                                             |   10 
 kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/menus.html                                                                                       |    8 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/util/SmsChuangLanUtils.java                                                       |   63 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorTempleteMapper.xml                                                  |  126 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/wolves.ttf                                                                                                                     |    0 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderRecordService.java                    |   63 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/resources/error.properties                                                                                   |    3 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/SmsApplication.java                                                         |    0 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/client/SmsClient.java                                                             |  216 
 kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/resources/application.yml                                                                                          |  105 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/SysFeedbackMapper.java                              |   34 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/tokens.html                                                                                       |   13 
 kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignHttpTenantInterceptorConfig.java                                         |  108 
 kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/DefaultMybatisPlusConfig.java                                                         |   28 
 kidgrow-config/src/main/resources/application.properties                                                                                                                 |   20 
 kidgrow-uaa/kidgrow-uaa-biz/src/main/java/com/kidgrow/oauth2/mapper/ClientMapper.java                                                                                    |    2 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/lanchuang/controller/SmsChuangLanController.java                             |  156 
 kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/impl/OrderTestServiceImpl.java                                                                   |   20 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/index.js                                                                                                |   67 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderService.java                          |   55 
 kidgrow-uaa/kidgrow-uaa-server/src/main/resources/application.yml                                                                                                        |    6 
 kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-admin/pom.xml                                                                                |   19 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/menus.html                                                                                        |   70 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java                                         |  133 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysDoctorMapper.java                                              |   47 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/Dockerfile                                                                                       |   14 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats3.ttf                                                                                                                   |    0 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysUser.java                                                       |   83 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDictionariesServiceImpl.java                             |   88 
 kidgrow-demo/kidgrow-demo-order/src/main/resources/personal/黄泽好友列表2.json                                                                                                 | 4973 ++++++
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ProductOrderDetailVo.java                               |   12 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/DoctorAz.ttf                                                                                                                   |    0 
 kidgrow-commons/kidgrow-common-spring-boot-starter/Dockerfile                                                                                                            |   14 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ProductOrderRecordMapper.java                       |   49 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/AsycTaskExecutorConfig.java                      |   17 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/template/BatchSmsTemplate.java                                                    |   26 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/resurgen.ttf                                                                                                                   |    0 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysDepartmentMapper.java                                          |   42 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDepartmentService.java                                       |   44 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/SmsTemplate.java                                                       |   27 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysOrganizationServiceImpl.java                             |  276 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/lexo.ttf                                                                                                                       |    0 
 kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/handler/KidgrowTokenServices.java                                                                        |  115 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/pom.xml                                                                                                    |   15 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/role.html                                                                                         |  249 
 kidgrow-config/src/main/resources/application-uat.properties                                                                                                             |   77 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysRoleOrganizationService.java                                 |   42 
 kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/aspect/AuditLogAspect.java                                                                 |   14 
 kidgrow-business/kidgrow-code-generator/Dockerfile                                                                                                                       |   14 
 kidgrow-business/kidgrow-mqcenter/pom.xml                                                                                                                                |    1 
 kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/config/AuthorizationServerConfig.java                                                                    |   95 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorAnswer.java                                    |   41 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ProductOrderRecordMapper.xml                                              |  177 
 kidgrow-commons/kidgrow-log-spring-boot-starter/pom.xml                                                                                                                  |   26 
 kidgrow-springcloud/kidgrow-springcloud-zuul/Dockerfile                                                                                                                  |   16 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/hospital_form_base.html                                                                         |  545 
 kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/TenantAutoConfigure.java                                                              |    2 
 kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/user.html                                                                                        |   16 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/pom.xml                                                                                                         |   26 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/pom.xml                                                                                          |   67 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/BusinessRecordsServiceImpl.java               |   75 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/HospitalScreeningServiceImpl.java             |   49 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/ConsumptionServiceFallbackFactory.java      |   47 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java                                    |  133 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/tetanus.ttf                                                                                                                    |    0 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/productdetail.html                                                                              |  165 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/DiagnosticService.java                               |   29 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/dis.ttf                                                                                                                        |    0 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDoctor.java                                                     |  147 
 kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/rabbitmq/controller/TopicController.java                                             |   30 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysRoleOrganization.java                                           |   52 
 kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/RabbitMqApplication.java                                                             |   19 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysProductService.java                            |   47 
 kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/service/AccessLogService.java                                                                |    3 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorSigningMapper.java                            |   34 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/filecenter/service/impl/AbstractIFileService.java                                   |  256 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/Dockerfile                                                                                            |   14 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/opticbot.ttf                                                                                                                   |    0 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysMenu.java                                                       |   88 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysHospitalMapper.java                                            |   32 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorAnswerServiceImpl.java                  |   49 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysAreaMapper.java                                                |   32 
 kidgrow-commons/kidgrow-common-spring-boot-starter/pom.xml                                                                                                               |   63 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysAreaService.java                                             |   43 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/doctor.html                                                                                     |  619 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/files/files.html                                                                                         |    4 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysAreaMapper.xml                                                                   |   69 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDictionaries.java                                               |   56 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysOrganizationController.java                             |  152 
 kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/resources/application.yml                                                                         |   80 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysFeedback.java                                     |   83 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysRoleOrganizationController.java                         |  137 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IHospitalScreeningService.java                     |   33 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysUserMapper.java                                                |   37 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDoctorService.java                                           |   78 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/UserType.java                                                                  |    6 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDictionariesVo.java                                                |   10 
 kidgrow-config/src/main/resources/application-fat.properties                                                                                                             |   55 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysCompany.java                                                    |   84 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/HospitalScreening.java                               |   66 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorTempleteService.java                        |   41 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/BusinessRecordsMapper.java                          |   34 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysProductController.java                    |  171 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorTemplete.java                                  |   83 
 kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/service/impl/DbAuditServiceImpl.java                                                       |   70 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/MAYQUEEN.TTF                                                                                                                   |    0 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats4.ttf                                                                                                                   |    0 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/germs.ttf                                                                                                                      |    0 
 kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/SecurityConstants.java                                                      |   36 
 kidgrow-business/kidgrow-code-generator/src/main/resources/template/Mapper.java.vm                                                                                       |    2 
 kidgrow-commons/kidgrow-rabbitmq-spring-boot-starter/pom.xml                                                                                                             |   22 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/tuesday.ttf                                                                                                                    |    0 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/px10.ttf                                                                                                                       |    0 
 kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysMenuController.java                                     |   15 
 /dev/null                                                                                                                                                                |   16 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrderRecord.java                              |   96 
 kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/properties/AuditLogProperties.java                                                         |    4 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/index.html                                                                                                     |   34 
 kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ConsumptionRecordServiceImpl.java             |  697 
 kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager.html                                                                                |    4 
 kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/model/ConstantSMS.java                                                            |    9 
 kidgrow-uaa/kidgrow-uaa-server/dockerfont/tomnr.ttf                                                                                                                      |    0 
 579 files changed, 42,773 insertions(+), 1,004 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..90005e6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,29 @@
+HELP.md
+/target/
+!.mvn/wrapper/maven-wrapper.jar
+/*/target/
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+ 
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+ 
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+/build/
+ 
+### VS Code ###
+.vscode/
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..6560a98
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,36 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="TOP_LEVEL_CLASS_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="INNER_CLASS_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="METHOD_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
+        </value>
+      </option>
+      <option name="FIELD_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="IGNORE_DEPRECATED" value="false" />
+      <option name="IGNORE_JAVADOC_PERIOD" value="true" />
+      <option name="IGNORE_DUPLICATED_THROWS" value="false" />
+      <option name="IGNORE_POINT_TO_ITSELF" value="false" />
+      <option name="myAdditionalJavadocTags" value="date" />
+    </inspection_tool>
+  </profile>
+</component>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-code-generator/Dockerfile b/kidgrow-business/kidgrow-code-generator/Dockerfile
new file mode 100644
index 0000000..fef5f1e
--- /dev/null
+++ b/kidgrow-business/kidgrow-code-generator/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-code-generator/pom.xml b/kidgrow-business/kidgrow-code-generator/pom.xml
index cb53263..2f4f3c5 100644
--- a/kidgrow-business/kidgrow-code-generator/pom.xml
+++ b/kidgrow-business/kidgrow-code-generator/pom.xml
@@ -71,6 +71,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-code-generator/src/main/resources/application.yml b/kidgrow-business/kidgrow-code-generator/src/main/resources/application.yml
index 217a228..32da5c4 100644
--- a/kidgrow-business/kidgrow-code-generator/src/main/resources/application.yml
+++ b/kidgrow-business/kidgrow-code-generator/src/main/resources/application.yml
@@ -4,10 +4,10 @@
   application:
     name: code-generator
   datasource:
-    url: jdbc:mysql://${kidgrow.datasource.ip}:3306/user_center?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
+    url: jdbc:mysql://${kidgrow.datasource.ip}:3306/xigao?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
     username: ${kidgrow.datasource.username}
     password: ${kidgrow.datasource.password}
-    driver-class-name: com.mysql.jdbc.Driver
+#    driver-class-name: com.mysql.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
     druid:
       aop-patterns: com.kidgrow.generator.controller.*,com.kidgrow.generator.mapper.*
diff --git a/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Controller.java.vm b/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Controller.java.vm
index a3172cf..3491a40 100644
--- a/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Controller.java.vm
+++ b/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Controller.java.vm
@@ -15,6 +15,7 @@
 import com.kidgrow.common.model.*;
 
 import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
 import javax.validation.Valid;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
@@ -49,12 +50,12 @@
             @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
     })
     @GetMapping
-    public PageResult list(@RequestParam Map<String, Object> params) {
+    public ResultBody<PageResult> list(@RequestParam Map<String, Object> params) {
         if(params.size()==0){
             params.put("page",1);
             params.put("limit",10);
         }
-        return ${classname}Service.findList(params);
+        return ResultBody.ok().data(${classname}Service.findList(params));
     }
 
     /**
@@ -83,11 +84,20 @@
     @ApiOperation(value = "保存")
     @PostMapping
     public ResultBody save(@Valid @RequestBody ${className} ${classname}, BindingResult bindingResult) {
+        List<String> errMsg= new ArrayList<>();
         if (bindingResult.hasErrors()) {
-            return ResultBody.failed().msg(bindingResult.getFieldError().getDefaultMessage());
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
         } else {
-            ${classname}Service.saveOrUpdate(${classname});
-            return ResultBody.ok().data(${classname}).msg("保存成功");
+            boolean v= ${classname}Service.saveOrUpdate(${classname});
+            if(v) {
+                return ResultBody.ok().data(${classname}).msg("保存成功");
+            }
+            else {
+                return ResultBody.failed().msg("保存失败");
+            }
         }
     }
 
@@ -97,7 +107,12 @@
     @ApiOperation(value = "删除")
     @DeleteMapping("/{id}")
     public ResultBody delete(@PathVariable Long ${pk.attrname}) {
-        ${classname}Service.removeById(${pk.attrname});
-        return ResultBody.ok().msg("删除成功");
+        boolean v= ${classname}Service.removeById(${pk.attrname});
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            return ResultBody.failed().msg("删除失败");
+        }
     }
 }
diff --git a/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Mapper.java.vm b/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Mapper.java.vm
index 452c19e..a16f4ea 100644
--- a/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Mapper.java.vm
+++ b/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Mapper.java.vm
@@ -30,5 +30,5 @@
      * @param
      * @return ${className}对象
      */
-    ${className} findByObject(${className} ${classname});
+    ${className} findByObject(@Param("p") ${className} ${classname});
 }
diff --git a/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Mapper.xml.vm b/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Mapper.xml.vm
index 8c652d5..3569505 100644
--- a/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Mapper.xml.vm
+++ b/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Mapper.xml.vm
@@ -14,8 +14,8 @@
             is_del=0
             #foreach($column in $columns)
             #if($column.columnName != $pk.columnName || $pk.extra != 'auto_increment')
-            <if test="$column.attrname != null and $column.attrname !=''">
-                and  $column.columnName =  #{$column.attrname}
+            <if test="p.$column.attrname != null and p.$column.attrname !=''">
+                and  $column.columnName =  #{p.$column.attrname}
             </if>
             #end
             #end
@@ -28,12 +28,14 @@
         from ${tableName}
         <include refid="where"/>
         order by id desc
+        limit 1
     </select>
 
     <!--定义根据-${className}当作查询条件返回对象集合-->
     <select id="findList" resultType="${package}.${moduleName}.model.${className}">
         select <include refid="Column_List"/>
         from ${tableName}
+        <include refid="where"/>
         order by id desc
     </select>
 </mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Model.java.vm b/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Model.java.vm
index a82fd49..992cfbc 100644
--- a/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Model.java.vm
+++ b/kidgrow-business/kidgrow-code-generator/src/main/resources/template/Model.java.vm
@@ -11,6 +11,7 @@
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 import org.hibernate.validator.constraints.*;
+import javax.validation.constraints.*;
 #if(${hasBigDecimal})
 import java.math.BigDecimal;
 #end
@@ -38,7 +39,7 @@
     * $column.comments
     */
     #if($column.isNullAble=="NO")
-    @NotBlank(message = "$column.comments不能为空")
+    @NotEmpty(message = "$column.comments不能为空")
     #end
     private $column.attrType $column.attrname;
     #end
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/config/FeignMultipartConfig.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/config/FeignMultipartConfig.java
new file mode 100644
index 0000000..233b59b
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/config/FeignMultipartConfig.java
@@ -0,0 +1,23 @@
+package com.kidgrow.filecenter.config;
+
+import feign.form.spring.SpringFormEncoder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Scope;
+
+//@Configuration
+public class FeignMultipartConfig {
+
+    @Bean
+    @Primary
+    @Scope("prototype")
+    public SpringFormEncoder multipartFormEncoder() {
+        return new SpringFormEncoder();
+    }
+
+    @Bean
+    public feign.Logger.Level multipartLoggerLevel() {
+        return feign.Logger.Level.FULL;
+    }
+}
+
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/feign/FileService.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/feign/FileService.java
new file mode 100644
index 0000000..7aea84d
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/feign/FileService.java
@@ -0,0 +1,64 @@
+package com.kidgrow.filecenter.feign;
+
+import com.kidgrow.common.constant.ServiceNameConstants;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.filecenter.config.FeignMultipartConfig;
+import com.kidgrow.filecenter.feign.fallback.FileServiceFallbackFactory;
+import com.kidgrow.filecenter.model.FileInfo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/22 14:33 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@FeignClient(name = ServiceNameConstants.FILE_CENTER_SERVER, configuration = FeignMultipartConfig.class,fallbackFactory = FileServiceFallbackFactory.class, decode404 = true)
+public interface FileService {
+    /**
+     * 根据条件查询
+     * @param file
+     */
+    @PostMapping(value = "/files-anon",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    FileInfo upload(@RequestPart("file") MultipartFile file);
+
+    /**
+     * 根据条件查询
+     * @param file
+     * @param imgType 文件类型:X光片/医院Logo[Xray/Logo]
+     */
+    @PostMapping(value = "/files-upload",produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    FileInfo feignUpload(@RequestPart("file") MultipartFile file,@RequestParam("imgType") String imgType);
+
+    /**
+     * base64上传图片
+     * @param file,imgType
+     * @param imgType 文件类型:X光片/医院Logo[Xray/Logo]
+     */
+    @PostMapping(value = "/baseUplaod",produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    FileInfo baseUplaod(@RequestParam("file") String file,@RequestParam("imgType") String imgType,@RequestParam("hospitalId") String hospitalId,@RequestParam("departmentId") String departmentId);
+
+    /**
+     * base64  下载图片
+     * @param map
+     */
+    @PostMapping(value = "/baseDownLoad",produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    ResultBody baseDownLoad(@RequestBody Map<String,Object> map) throws Exception;
+    /**
+     * byte数组模式上传 到 oss
+     * @param fileName bytes
+     */
+    @PostMapping(value="byteUplaod")
+    FileInfo byteUplaod(@RequestParam("fileName") String fileName,@RequestBody byte[] bytes);
+
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/feign/fallback/FileServiceFallbackFactory.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/feign/fallback/FileServiceFallbackFactory.java
new file mode 100644
index 0000000..18f5142
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/feign/fallback/FileServiceFallbackFactory.java
@@ -0,0 +1,56 @@
+package com.kidgrow.filecenter.feign.fallback;
+
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.filecenter.feign.FileService;
+import com.kidgrow.filecenter.model.FileInfo;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/22 14:33 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@Component
+public class FileServiceFallbackFactory implements FallbackFactory<FileService> {
+
+    @Override
+    public FileService create(Throwable throwable) {
+        return  new FileService() {
+            @Override
+            public FileInfo upload(@RequestParam("file") MultipartFile file) {
+                return null;
+            }
+            @Override
+            public FileInfo feignUpload(@RequestPart("file") MultipartFile file,@RequestParam String imgType) {
+                return null;
+            }
+
+            @Override
+            public FileInfo baseUplaod(String file, String imgType, String hospitalId, String departmentId) {
+                return null;
+            }
+
+            @Override
+            public ResultBody baseDownLoad(Map<String, Object> map) throws Exception {
+                return null;
+            }
+
+            @Override
+            public FileInfo byteUplaod(String fileName, byte[] bytes) {
+                return null;
+            }
+        };
+    }
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/model/FileInfo.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/model/FileInfo.java
index f1b9def..bcf5181 100644
--- a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/model/FileInfo.java
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/filecenter/model/FileInfo.java
@@ -35,6 +35,13 @@
      * 是否图片
      */
     private Boolean isImg;
+
+    /**
+     * 图片类型
+     * Xray还是logo
+     */
+    @TableField(exist = false)
+    private String imgType;
     /**
      * 上传文件类型
      */
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/SmsChuangLanService.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/SmsChuangLanService.java
new file mode 100644
index 0000000..a82b647
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/SmsChuangLanService.java
@@ -0,0 +1,29 @@
+package com.kidgrow.sms.feign;
+
+import com.kidgrow.common.constant.ServiceNameConstants;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.sms.feign.fallback.SmsChuangLanServiceFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/27 22:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@FeignClient(value = ServiceNameConstants.SMS_SERVICE_SERVER,
+        fallbackFactory = SmsChuangLanServiceFallbackFactory.class, decode404 = true)
+public interface SmsChuangLanService {
+    /**
+     * feign rpc访问远程 接口
+     */
+    @PostMapping(value = "/smsChangLan/send")
+    ResultBody sendVerificationCode(@RequestBody Map map);
+
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/fallback/SmsChuangLanServiceFallbackFactory.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/fallback/SmsChuangLanServiceFallbackFactory.java
new file mode 100644
index 0000000..24deae9
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/feign/fallback/SmsChuangLanServiceFallbackFactory.java
@@ -0,0 +1,29 @@
+package com.kidgrow.sms.feign.fallback;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.sms.feign.SmsChuangLanService;
+import feign.hystrix.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/27 22:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Component
+public class SmsChuangLanServiceFallbackFactory implements FallbackFactory<SmsChuangLanService> {
+    @Override
+    public SmsChuangLanService create(Throwable throwable) {
+        return new SmsChuangLanService() {
+            @Override
+            public ResultBody sendVerificationCode(Map ma) {
+                return ResultBody.failed("短息调用失败");
+            }
+        };
+    }
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/ConstantSMS.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/ConstantSMS.java
new file mode 100644
index 0000000..86f32f2
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/ConstantSMS.java
@@ -0,0 +1,9 @@
+package com.kidgrow.sms.model;
+
+import com.kidgrow.common.constant.CommonConstant;
+
+public interface ConstantSMS {
+    String PASSWORD_SMS = "PASSWORD_SMS";//修改密码 短信验证的type值
+    String REGISTER_SMS = "REGISTER_SMS";//注册 短信验证的type值
+    String PHONE_SMS = "PHONE_SMS";//更换手机号 短信验证的type值
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/SmsModel.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/SmsModel.java
new file mode 100644
index 0000000..fb7ae0a
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-api/src/main/java/com/kidgrow/sms/model/SmsModel.java
@@ -0,0 +1,28 @@
+package com.kidgrow.sms.model;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 发送短信实体类<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:18 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@ApiModel(value = "发送短信实体类")
+@Data
+public class SmsModel implements Serializable {
+
+    private String phoneNumber; //手机号
+    private String key; // 短信模板key
+    private String code; // 短信验证码
+    private Map<String,String> params; // 内容 key 值要与模板一致
+    private List<String> phoneNumbers; // 群发消息时使用
+
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/filecenter/service/impl/AbstractIFileService.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/filecenter/service/impl/AbstractIFileService.java
index 6a66532..492dbff 100644
--- a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/filecenter/service/impl/AbstractIFileService.java
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/filecenter/service/impl/AbstractIFileService.java
@@ -1,21 +1,34 @@
 package com.kidgrow.filecenter.service.impl;
 
+import cn.hutool.core.util.IdUtil;
+import com.aliyun.oss.model.OSSObject;
+import com.aliyun.oss.model.ObjectMetadata;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-
+import com.kidgrow.common.constant.CommonConstant;
 import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.utils.DateUtil;
+import com.kidgrow.common.utils.RandomValueUtils;
+import com.kidgrow.common.utils.StringUtils;
 import com.kidgrow.filecenter.mapper.FileMapper;
 import com.kidgrow.filecenter.model.FileInfo;
 import com.kidgrow.filecenter.service.IFileService;
 import com.kidgrow.filecenter.util.FileUtil;
-
 import lombok.extern.slf4j.Slf4j;
-
+import net.coobird.thumbnailator.Thumbnails;
 import org.apache.commons.collections4.MapUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.multipart.MultipartFile;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
 
-import java.util.List;
-import java.util.Map;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.*;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -28,7 +41,12 @@
 @Slf4j
 public abstract class AbstractIFileService extends ServiceImpl<FileMapper, FileInfo> implements IFileService {
     private static final String FILE_SPLIT = ".";
+    private static Logger logger = LoggerFactory.getLogger(AbstractIFileService.class);
 
+    @Value("${kidgrow.file-server.oss.domain}")
+    private  String DOMAIN;
+    @Value("${spring.profiles.active}")
+    private String OssPathEn;
     @Override
     public FileInfo upload(MultipartFile file) throws Exception {
         FileInfo fileInfo = FileUtil.getFileInfo(file);
@@ -39,6 +57,26 @@
         if (!fileInfo.getName().contains(FILE_SPLIT)) {
             throw new IllegalArgumentException("缺少后缀名");
         }
+        uploadFile(file, fileInfo);
+        // 设置文件来源
+        fileInfo.setSource(fileType());
+        // 将文件信息保存到数据库
+        baseMapper.insert(fileInfo);
+
+        return fileInfo;
+    }
+
+    @Override
+    public FileInfo upload(MultipartFile file,String imgType) throws Exception {
+        FileInfo fileInfo = FileUtil.getFileInfo(file);
+        FileInfo oldFileInfo = baseMapper.selectById(fileInfo.getId());
+        if (oldFileInfo != null) {
+            return oldFileInfo;
+        }
+        if (!fileInfo.getName().contains(FILE_SPLIT)) {
+            throw new IllegalArgumentException("缺少后缀名");
+        }
+        fileInfo.setImgType(imgType); // X光片或者Logo
         uploadFile(file, fileInfo);
         // 设置文件来源
         fileInfo.setSource(fileType());
@@ -62,6 +100,9 @@
      * @param fileInfo
      */
     protected abstract void uploadFile(MultipartFile file, FileInfo fileInfo) throws Exception;
+    protected abstract void fileUpLoadOss(FileInfo fileInfo,String newFilePath, InputStream fileStream);
+    protected abstract String FilePath(String imgType,String folderByDate,String hospitalId,String departmentId);
+    protected abstract OSSObject down(String url);
 
     /**
      * 删除文件
@@ -90,5 +131,210 @@
         List<FileInfo> list = baseMapper.findList(page, params);
         return PageResult.<FileInfo>builder().data(list).code(0).count(page.getTotal()).build();
     }
+    /**
+     * 上传图片-并缩略,其实是给文件服务器存储了两个文件 一个原文件  一个缩略图文件
+     * @param file form内的文件数据
+     * @param imgType 业务类型 例如logo
+     * @return 返回的实体中  path字段保存的是缩略图地址
+     * @throws Exception
+     */
+    @Override
+    public FileInfo uploadForThumbnails(MultipartFile file, String imgType) throws Exception {
+        FileInfo fileInfo=this.upload(file,imgType);
+        List<String> lassStr= Arrays.asList("png","bmp","dib","gif","jfif","jpe","jpeg","jpg","tif","tiff","ico");
+        String suffix=file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
+        if(!lassStr.contains(suffix)){
+            return null;
+        }
+        if (StringUtils.isNotBlank(fileInfo.getUrl())) {
+            //生成缩略图上传
+//            File nowFile= MultipartFileUtils.multipartFileToFile(file);
+//            File nowFile= new File(file.getOriginalFilename());
+            //暂存目录  发布后真实存在的磁盘目录
+            String result = CommonConstant.TEMP_IMAGE_PATH;
+            //文件扩展名
+            String newFileName= RandomValueUtils.uuid()+"."+suffix;
+            //生成缩略图
+            Thumbnails.of(file.getInputStream()).size(CommonConstant.TH_IMG_WIDTH, CommonConstant.TH_IMG_HEIGHT).toFile(result+newFileName);
+            File thuFile= new File(result+newFileName);
+            if (thuFile.exists()) {
+                //将生成的文件转换为流
+                InputStream inputStream=new FileInputStream(thuFile);
+                String folderByDate = DateUtil.formatDate(new Date());
+                String filefloder=this.FilePath(imgType,folderByDate,null,null);
+                FileInfo newfileInfo=new FileInfo();
+                newfileInfo.setName(newFileName);
+                newfileInfo.setId(IdUtil.fastSimpleUUID());
+                newfileInfo.setSize(thuFile.length());
+                newfileInfo.setIsImg(true);
+                newfileInfo.setContentType(file.getContentType());
+                newfileInfo.setSource(fileInfo.getSource());
+                newfileInfo.setImgType(imgType);
+                newfileInfo.setCreateTime(new Date());
+                //文件上传到oss
+                this.fileUpLoadOss(newfileInfo,filefloder+newFileName,inputStream);
+                inputStream.close();
+//                //删除暂存文件
+//                MultipartFileUtils.delteTempFile(thuFile);
+                boolean delete = thuFile.delete();
+
+                // 将文件信息保存到数据库
+                baseMapper.insert(newfileInfo);
+                fileInfo.setPath(newfileInfo.getUrl());
+            }
+            return fileInfo;
+        }
+        else
+        {
+            return fileInfo;
+        }
+    }
+
+    @Override
+    public FileInfo baseUplaod(String file, String imgType, String hospitalId, String departmentId) {
+        if(file==null||"".equals(file.trim())){
+            return null;
+        }
+        String name=file.split(",")[0];
+        file = file.split(",")[1];
+        BASE64Decoder decoder = new BASE64Decoder();
+        try {
+            byte[] bytes = decoder.decodeBuffer(file);
+            ObjectMetadata objectMeta = new ObjectMetadata();
+            objectMeta.setContentLength(file.length());
+            //将字节码转换成流
+            InputStream input = new ByteArrayInputStream(bytes);
+            String fileName= UUID.randomUUID().toString().replaceAll("-","");
+            //image/jpeg;base64
+            String newFileName=fileName+"."+name.substring(name.lastIndexOf("/")+1,name.lastIndexOf(";"));
+            FileInfo newfileInfo=new FileInfo();
+            newfileInfo.setName(newFileName);
+            newfileInfo.setId(IdUtil.fastSimpleUUID());
+            newfileInfo.setSize(file.length());
+            newfileInfo.setIsImg(true);
+            newfileInfo.setContentType("image/jpeg");
+            newfileInfo.setSource("aliyun");
+            newfileInfo.setImgType(imgType);
+            newfileInfo.setCreateTime(new Date());
+            String folderByDate =DateUtil.formatDate(new Date());
+            String filePath = FilePath(imgType, folderByDate, hospitalId, departmentId);
+            this.fileUpLoadOss(newfileInfo,filePath+newFileName,input);
+            input.close();
+            baseMapper.insert(newfileInfo);
+            return newfileInfo;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Override
+    public ResultBody baseDownLoad(Map<String, Object> map) throws Exception {
+        String urlDiZhi=MapUtils.getString(map,"url");
+        if(!urlDiZhi.contains(DOMAIN)){
+            ByteArrayOutputStream outPut = new ByteArrayOutputStream();
+            byte[] data = new byte[1024];
+            try {
+                // 创建URL
+                URL url = new URL(urlDiZhi);
+                // 创建链接
+                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+                conn.setRequestMethod("GET");
+                conn.setConnectTimeout(10 * 1000);
+                InputStream inStream = conn.getInputStream();
+                int len = -1;
+                while ((len = inStream.read(data)) != -1) {
+                    outPut.write(data, 0, len);
+                }
+                inStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            String substring = urlDiZhi.substring(urlDiZhi.lastIndexOf(".") + 1, urlDiZhi.length());
+            String str="data:image/" + substring + ";base64,";
+            // 对字节数组Base64编码
+            BASE64Encoder encoder = new BASE64Encoder();
+            System.out.println(encoder.encode(outPut.toByteArray()));
+            return ResultBody.ok().data(str+encoder.encode(outPut.toByteArray()).replaceAll("\n", "").replaceAll("\r", ""));
+        }else {
+            List<FileInfo> fileInfos = baseMapper.selectByMap(map);
+            if (fileInfos.size() > 0) {
+                FileInfo fileInfo = fileInfos.get(0);
+                OSSObject down = this.down(fileInfo.getUrl().replace(DOMAIN, ""));
+                InputStream objectContent = down.getObjectContent();
+                //返回Base64编码过的字节数组字符串
+                byte[] data = null;
+                // 读取图片字节数组
+                try {
+                    ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
+                    byte[] buff = new byte[100];
+                    int rc = 0;
+                    while ((rc = objectContent.read(buff, 0, 100)) > 0) {
+                        swapStream.write(buff, 0, rc);
+                    }
+                    data = swapStream.toByteArray();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                } finally {
+                    if (objectContent != null) {
+                        try {
+                            objectContent.close();
+                            down.close();
+                        } catch (IOException e) {
+                            throw new Exception("输入流关闭异常");
+                        }
+                    }
+                }
+                String encode = "data:" + fileInfo.getContentType() + ";base64," + Base64.getEncoder().encodeToString(data);
+                return ResultBody.ok().data(encode);
+            } else {
+                return ResultBody.failed("获取数据失败");
+            }
+        }
+    }
+
+    public static void main(String[] args) {
+
+        ByteArrayOutputStream outPut = new ByteArrayOutputStream();
+        byte[] data = new byte[1024];
+        try {
+            // 创建URL
+            URL url = new URL("http://192.168.2.25:8008/123/J-1.jpg");
+            // 创建链接
+            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+            conn.setRequestMethod("GET");
+            conn.setConnectTimeout(10 * 1000);
+            InputStream inStream = conn.getInputStream();
+            int len = -1;
+            while ((len = inStream.read(data)) != -1) {
+                outPut.write(data, 0, len);
+            }
+            inStream.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        // 对字节数组Base64编码
+        BASE64Encoder encoder = new BASE64Encoder();
+        System.out.println(encoder.encode(outPut.toByteArray()));
+
+    }
+
+    @Override
+    public FileInfo byteUplaod(String fileName, InputStream inputStream,int size) {
+        String houzhui=fileName.substring(fileName.lastIndexOf(".")+1);
+        String newFileName= RandomValueUtils.uuid()+"."+houzhui;
+        FileInfo newfileInfo=new FileInfo();
+        newfileInfo.setName(newFileName);
+        newfileInfo.setId(IdUtil.fastSimpleUUID());
+        newfileInfo.setSize(size);
+        newfileInfo.setIsImg(false);
+        newfileInfo.setContentType("byte[]");
+        newfileInfo.setSource("aliyun");
+        newfileInfo.setImgType(houzhui);
+        newfileInfo.setCreateTime(new Date());
+        this.fileUpLoadOss(newfileInfo,OssPathEn+"pdf/"+newFileName,inputStream);
+        baseMapper.insert(newfileInfo);
+        return newfileInfo;
+    }
 }
 
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/filecenter/util/FileUtil.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/filecenter/util/FileUtil.java
index 0e9d05e..3cac468 100644
--- a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/filecenter/util/FileUtil.java
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/filecenter/util/FileUtil.java
@@ -32,7 +32,21 @@
         fileInfo.setId(IdUtil.fastSimpleUUID());
         fileInfo.setName(file.getOriginalFilename());
         fileInfo.setContentType(file.getContentType());
-        fileInfo.setIsImg(fileInfo.getContentType().startsWith("image/"));
+        if (fileInfo.getContentType().startsWith("image/")) {
+            fileInfo.setIsImg(true);
+        }
+        else if (fileInfo.getContentType().startsWith("multipart")){
+            String extendName = file.getOriginalFilename().substring(file.getOriginalFilename().indexOf(".")+1,file.getOriginalFilename().length()).toLowerCase();
+            if (extendName.equals("png") || extendName.equals("bmp") || extendName.equals("jpg") || extendName.equals("jpeg") || extendName.equals("gif")) {
+                fileInfo.setIsImg(true);
+            } else  {
+                fileInfo.setIsImg(false);
+            }
+
+        } else  {
+            fileInfo.setIsImg(false);
+        }
+
         fileInfo.setSize(file.getSize());
         fileInfo.setCreateTime(new Date());
         return fileInfo;
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/client/SmsClient.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/client/SmsClient.java
new file mode 100644
index 0000000..0288e7b
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/client/SmsClient.java
@@ -0,0 +1,216 @@
+package com.kidgrow.sms.client;
+
+import com.aliyuncs.CommonRequest;
+import com.aliyuncs.CommonResponse;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.google.gson.Gson;
+import com.kidgrow.sms.exception.SmsException;
+import com.kidgrow.sms.template.BatchSmsTemplate;
+import com.kidgrow.sms.template.SmsTemplate;
+import com.kidgrow.sms.util.AliyunSmsUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云 SMS 客户端<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:07 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class SmsClient {
+    private final IAcsClient acsClient;
+    private final Map<String, SmsTemplate> smsTemplates;
+    private final Gson gson = new Gson();
+
+    @Value("${aliyun.commonRequest.domain}")
+    private String domain;
+
+    @Value("${aliyun.commonRequest.version}")
+    private String version;
+
+    @Value("${aliyun.commonRequest.action}")
+    private String action;
+
+    /**
+     * Instantiates a new SmsClient.
+     *
+     * @param accessKeyId 阿里云短信 accessKeyId
+     * @param accessKeySecret 阿里云短信 accessKeySecret
+     */
+    public SmsClient(final String accessKeyId, final String accessKeySecret) {
+        this(accessKeyId, accessKeySecret, Collections.emptyMap());
+    }
+
+    /**
+     * Instantiates a new SmsClient.
+     *
+     * @param accessKeyId 阿里云短信 accessKeyId
+     * @param accessKeySecret 阿里云短信 accessKeySecret
+     * @param smsTemplates 预置短信模板
+     */
+    public SmsClient(final String accessKeyId,
+                     final String accessKeySecret,
+                     final Map<String, SmsTemplate> smsTemplates) {
+        AliyunSmsUtils.checkNotEmpty(accessKeyId, "'accessKeyId' must be not empty");
+        AliyunSmsUtils.checkNotEmpty(accessKeySecret, "'accessKeySecret' must be not empty");
+
+        final IClientProfile clientProfile = DefaultProfile.getProfile(
+                "default", accessKeyId, accessKeySecret);
+
+        this.acsClient = new DefaultAcsClient(clientProfile);
+        this.smsTemplates = smsTemplates;
+    }
+
+    /**
+     * Instantiates a new SmsClient.
+     *
+     * @param acsClient IAcsClient
+     * @param smsTemplates 预置短信模板
+     */
+    public SmsClient(final IAcsClient acsClient, final Map<String, SmsTemplate> smsTemplates) {
+        this.acsClient = acsClient;
+        this.smsTemplates = smsTemplates;
+    }
+
+    /**
+     * 发送短信验证码.
+     *
+     * @param phoneNumber 手机号码(中国)
+     *
+     * @return 6 位数的随机码
+     */
+    public int sendVerificationCode(final String smsTemplateKey, final String phoneNumber) {
+        AliyunSmsUtils.checkPhoneNumber(phoneNumber);
+        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
+        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
+
+        final int code = AliyunSmsUtils.randomCode();
+        smsTemplate.setTemplateParam(Collections.singletonMap("code", String.valueOf(code)));
+        smsTemplate.setPhoneNumbers(Collections.singletonList(phoneNumber));
+        send(smsTemplate);
+        return code;
+    }
+
+    /**
+     * 发送消息 支持群发
+     * @param smsTemplateKey
+     * @param params
+     * @param phoneNumbers
+     */
+    public void sendSmsMsg(final String smsTemplateKey, Map<String, String> params, final List<String> phoneNumbers){
+        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
+        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
+
+        smsTemplate.setTemplateParam(params);
+        smsTemplate.setPhoneNumbers(phoneNumbers);
+        send(smsTemplate);
+    }
+
+    /**
+     * 发送短信.
+     *
+     * @param smsTemplateKey 预置短信模板 key
+     */
+    public void send(final String smsTemplateKey) {
+        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
+        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
+
+        send(smsTemplate);
+    }
+
+    /**
+     * 发送短信.
+     *
+     * @param smsTemplateKey 预置短信模板 key
+     * @param phoneNumbers 手机号码,优先于预置短信模板中配置的手机号码
+     */
+    public void send(final String smsTemplateKey, final String... phoneNumbers) {
+        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
+        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
+
+        smsTemplate.setPhoneNumbers(Arrays.asList(phoneNumbers));
+        send(smsTemplate);
+    }
+
+    /**
+     * 发送短信.
+     *
+     * @param smsTemplate 短信模板
+     */
+    public void send(final SmsTemplate smsTemplate) {
+        Objects.requireNonNull(smsTemplate);
+        AliyunSmsUtils.checkSmsTemplate(smsTemplate);
+
+        final CommonRequest request = new CommonRequest();
+        request.setSysMethod(MethodType.POST);
+        request.setSysDomain(domain);
+        request.setSysVersion(version);
+        request.setSysAction(action);
+        request.putQueryParameter("PhoneNumbers", String.join(",", smsTemplate.getPhoneNumbers()));
+        request.putQueryParameter("SignName", smsTemplate.getSignName());
+        request.putQueryParameter("TemplateCode", smsTemplate.getTemplateCode());
+        request.putQueryParameter("TemplateParam", AliyunSmsUtils.toJsonStr(smsTemplate.getTemplateParam()));
+        try {
+            final CommonResponse response = this.acsClient.getCommonResponse(request);
+            AliyunSmsUtils.checkSmsResponse(response);
+        }
+        catch (final ClientException e) {
+            throw new SmsException(e);
+        }
+    }
+
+    /**
+     * 批量发送短信.
+     *
+     * <p>
+     * 批量发送短信接口,支持在一次请求中分别向多个不同的手机号码发送不同签名的短信。
+     * 手机号码,签名,模板参数字段个数相同,一一对应,短信服务根据字段的顺序判断发往指定手机号码的签名。
+     *
+     * <p>
+     * 如果您需要往多个手机号码中发送同样签名的短信,请使用 {@link #send(SmsTemplate)}。
+     *
+     * @param batchSmsTemplate 批量发送短信模板
+     */
+    public void send(final BatchSmsTemplate batchSmsTemplate) {
+        Objects.requireNonNull(batchSmsTemplate);
+        AliyunSmsUtils.checkBatchSmsTemplate(batchSmsTemplate);
+
+        final CommonRequest request = new CommonRequest();
+        request.setSysMethod(MethodType.POST);
+        request.setSysDomain("dysmsapi.aliyuncs.com");
+        request.setSysVersion("2017-05-25");
+        request.setSysAction("SendBatchSms");
+        request.putQueryParameter("PhoneNumberJson", this.gson.toJson(batchSmsTemplate.getPhoneNumbers()));
+        request.putQueryParameter("SignNameJson", this.gson.toJson(batchSmsTemplate.getSignNames()));
+        request.putQueryParameter("TemplateCode", batchSmsTemplate.getTemplateCode());
+        request.putQueryParameter("TemplateParamJson", this.gson.toJson(batchSmsTemplate.getTemplateParams()));
+        try {
+            final CommonResponse response = this.acsClient.getCommonResponse(request);
+            AliyunSmsUtils.checkSmsResponse(response);
+        }
+        catch (final ClientException e) {
+            throw new SmsException(e);
+        }
+    }
+
+//    public static void main(String[] args) {
+//        Map<String, SmsTemplate> smsTemplates = new HashMap<>();
+//        SmsTemplate smsTemplate = SmsTemplate.builder()
+//                .signName("模板名称")
+//                .templateCode("模板code")
+//                .addTemplateParam("code", "123456")
+//                .build();
+//        smsTemplates.put("aaa",smsTemplate);
+//        SmsClient smsClient = new SmsClient("aaaa","aaaaa",smsTemplates);
+//        smsClient.sendVerificationCode("aaa","18503198351");
+//    }
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/exception/SmsException.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/exception/SmsException.java
new file mode 100644
index 0000000..4f74858
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/exception/SmsException.java
@@ -0,0 +1,31 @@
+package com.kidgrow.sms.exception;
+
+import com.kidgrow.common.exception.KidgrowException;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 08:57 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class SmsException extends KidgrowException {
+    /**
+     * Instantiates a new SmsException.
+     *
+     * @param message the message
+     */
+    public SmsException(final String message) {
+        super(message);
+    }
+
+    /**
+     * Instantiates a new SmsException.
+     *
+     * @param cause the cause
+     */
+    public SmsException(final Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/service/AliyunSmsService.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/service/AliyunSmsService.java
new file mode 100644
index 0000000..29556ac
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/service/AliyunSmsService.java
@@ -0,0 +1,44 @@
+package com.kidgrow.sms.service;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.sms.model.SmsModel;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 对外API 短信发送和验证码校验接口 feignClient 继承这个接口 即可调用<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:20 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Api(tags = "短信发送服务")
+public interface AliyunSmsService {
+
+    /**
+     * 发送手机验证码
+     * @param smsModel
+     */
+    @ApiOperation(value = "发送短信验证码接口")
+    @PostMapping("/send/verificationCode")
+    ResultBody sendVerificationCode(@RequestBody SmsModel smsModel);
+
+    /**
+     * 校验手机验证码是否正确
+     * @param smsModel
+     */
+    @ApiOperation(value = "验证短信验证码接口")
+    @PostMapping("/validate/verificationCode")
+    ResultBody validateVerificationCode(@RequestBody SmsModel smsModel);
+
+    /**
+     * 发送手机短信消息
+     * @param smsModel
+     */
+    @ApiOperation(value = "发送手机短信消息接口")
+    @PostMapping("/send/smsMsg")
+    ResultBody sendSmsMsg(@RequestBody SmsModel smsModel);
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/BatchSmsTemplate.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/BatchSmsTemplate.java
new file mode 100644
index 0000000..002e154
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/BatchSmsTemplate.java
@@ -0,0 +1,26 @@
+package com.kidgrow.sms.template;
+
+import lombok.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云调用批量模板<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Builder(builderClassName = "Builder", toBuilder = true)
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class BatchSmsTemplate {
+    private List<String> signNames;
+    private String templateCode;
+    private List<Map<String, String>> templateParams;
+    private List<String> phoneNumbers;
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/SmsTemplate.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/SmsTemplate.java
new file mode 100644
index 0000000..c943ded
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/template/SmsTemplate.java
@@ -0,0 +1,27 @@
+package com.kidgrow.sms.template;
+
+import lombok.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云调用模板<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Builder(builderClassName = "Builder", toBuilder = true)
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class SmsTemplate {
+    private String signName;
+    private String templateCode;
+    private Map<String, String> templateParam;
+    private List<String> phoneNumbers;
+
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/AliyunSmsUtils.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/AliyunSmsUtils.java
new file mode 100644
index 0000000..edf35c7
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/AliyunSmsUtils.java
@@ -0,0 +1,175 @@
+package com.kidgrow.sms.util;
+
+import com.aliyuncs.CommonResponse;
+import com.google.gson.Gson;
+import com.kidgrow.sms.exception.SmsException;
+import com.kidgrow.sms.template.BatchSmsTemplate;
+import com.kidgrow.sms.template.SmsTemplate;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ThreadLocalRandom;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云短信服务工具类<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 08:53 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class AliyunSmsUtils {
+    private static final String SUCCESS_CODE = "OK";
+    /**
+     * 宽松校验即可.
+     */
+    private static final String PHONE_NUMBER_REGEX = "\\d{5,}";
+
+    /**
+     * 生成随机验证码.
+     *
+     * @return 随机数
+     */
+    public static int randomCode() {
+        return 100_000 + ThreadLocalRandom.current().nextInt(1_000_000 - 100_000);
+    }
+
+    /**
+     * Map 转 json 字符串的简单实现.
+     *
+     * @param map the map
+     *
+     * @return the json string
+     */
+    public static String toJsonStr(final Map<String, String> map) {
+        if (null == map || map.isEmpty()) {
+            return null;
+        }
+
+        final StringBuilder sb = new StringBuilder();
+        sb.append('{');
+        for (final Map.Entry<String, String> entry : map.entrySet()) {
+            sb.append('"')
+                    .append(entry.getKey().replace("\"", "\\\""))
+                    .append('"')
+                    .append(':')
+                    .append('"')
+                    .append(entry.getValue().replace("\"", "\\\""))
+                    .append('"')
+                    .append(',');
+        }
+        sb.deleteCharAt(sb.length() - 1);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    /**
+     * 校验 SmsTemplate.
+     *
+     * @param template the SmsTemplate
+     */
+    public static void checkSmsTemplate(final SmsTemplate template) {
+
+        checkNotEmpty(template.getSignName(), "SmsTemplate signName must be not empty");
+        checkNotEmpty(template.getTemplateCode(), "SmsTemplate templateCode must be not empty");
+        checkNotEmpty(template.getPhoneNumbers(), "SmsTemplate phoneNumbers must be not empty");
+
+    }
+
+    /**
+     * 校验 BatchSmsTemplate.
+     *
+     * @param template the BatchSmsTemplate
+     */
+    public static void checkBatchSmsTemplate(final BatchSmsTemplate template) {
+
+        checkNotEmpty(template.getSignNames(), "BatchSmsTemplate signNames must be not empty");
+        checkNotEmpty(template.getPhoneNumbers(), "BatchSmsTemplate phoneNumbers must be not empty");
+        checkNotEmpty(template.getTemplateCode(), "BatchSmsTemplate templateCode must be not empty");
+        checkNotEmpty(template.getTemplateParams(), "BatchSmsTemplate templateParams must be not empty");
+
+        if (template.getSignNames().size() != template.getPhoneNumbers().size()
+                && template.getPhoneNumbers().size() != template.getTemplateParams().size()) {
+            throw new IllegalArgumentException("BatchSmsTemplate phoneNumbers, signNames, templateParams size must be the same");
+        }
+    }
+
+    /**
+     * 校验 SendSmsResponse 状态.
+     *
+     * @param response the SendSmsResponse
+     */
+    public static void checkSmsResponse(final CommonResponse response) {
+        if (null == response) {
+            throw new SmsException("Response is null");
+        }
+        final Gson gson = new Gson();
+        final Map<String, String> json = gson.fromJson(response.getData(), Map.class);
+        if (!SUCCESS_CODE.equalsIgnoreCase(json.get("Code"))) {
+            //throw new SmsException("Http status: " + response.getHttpStatus() + ", response: " + response.getData());
+            throw new SmsException(response.getData());
+        }
+    }
+
+    /**
+     * 校验手机号码(中国).
+     *
+     * @param phoneNumber the phone number
+     */
+    public static void checkPhoneNumber(final String phoneNumber) {
+        if (null == phoneNumber || !phoneNumber.matches(PHONE_NUMBER_REGEX)) {
+            throw new IllegalArgumentException("Invalid phone number");
+        }
+    }
+
+    /**  <br>     2018年3月已知
+     中国电信号段
+     133,149,153,173,177,180,181,189,199
+     中国联通号段
+     130,131,132,145,155,156,166,175,176,185,186
+     中国移动号段
+     134(0-8),135,136,137,138,139,147,150,151,152,157,158,159,178,182,183,184,187,188,198
+     其他号段
+     14号段以前为上网卡专属号段,如中国联通的是145,中国移动的是147等等。
+     虚拟运营商
+     电信:1700,1701,1702
+     移动:1703,1705,1706
+     联通:1704,1707,1708,1709,171
+     卫星通信:148(移动) 1349
+     */
+    public static boolean isMobile(String str) {
+        boolean b = false;
+        String s2="^[1](([3][0-9])|([4][5,7,9])|([5][0-9])|([6][6])|([7][3,5,6,7,8])|([8][0-9])|([9][8,9]))[0-9]{8}$";// 验证手机号
+        if(StringUtils.isNotBlank(str)){
+            return str.matches(s2);
+        }
+        return b;
+    }
+
+
+
+    /**
+     * 校验字符串不为空.
+     *
+     * @param str the str
+     * @param message the message
+     */
+    public static void checkNotEmpty(final String str, final String message) {
+        if (null == str || str.isEmpty()) {
+            throw new IllegalArgumentException(message);
+        }
+    }
+
+    /**
+     * 校验集合不为空.
+     *
+     * @param coll the Collection
+     * @param message the message
+     */
+    public static void checkNotEmpty(final Collection coll, final String message) {
+        if (null == coll || coll.isEmpty()) {
+            throw new IllegalArgumentException(message);
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/SmsChuangLanUtils.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/SmsChuangLanUtils.java
new file mode 100644
index 0000000..98277bf
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-biz/src/main/java/com/kidgrow/sms/util/SmsChuangLanUtils.java
@@ -0,0 +1,63 @@
+package com.kidgrow.sms.util;
+
+import com.alibaba.fastjson.JSONObject;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+public class SmsChuangLanUtils {
+    public static void main(String[] args) {
+        //短信下发
+        String sendUrl = "http://smssh1.253.com/msg/send/json";
+        Map map = new HashMap();
+        map.put("account","N2561124");//API账号
+        map.put("password","Mguj6qlRWX7b5e");//API密码
+        map.put("msg","123123");//短信内容
+        map.put("phone","18600376209");//手机号
+        map.put("report","false");//是否需要状态报告
+        JSONObject js = (JSONObject) JSONObject.toJSON(map);
+        System.out.println(sendSmsByPost(sendUrl,js.toString()));
+    }
+    public static String send(Map map,String url){
+        JSONObject js = (JSONObject) JSONObject.toJSON(map);
+        return sendSmsByPost(url,js.toString());
+
+    }
+    public static String sendSmsByPost(String path, String postContent) {
+        URL url = null;
+        try {
+            url = new URL(path);
+            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
+            httpURLConnection.setRequestMethod("POST");
+            httpURLConnection.setConnectTimeout(10000);
+            httpURLConnection.setReadTimeout(10000);
+            httpURLConnection.setDoOutput(true);
+            httpURLConnection.setDoInput(true);
+            httpURLConnection.setRequestProperty("Charset", "UTF-8");
+            httpURLConnection.setRequestProperty("Content-Type", "application/json");
+            httpURLConnection.connect();
+            OutputStream os=httpURLConnection.getOutputStream();
+            os.write(postContent.getBytes("UTF-8"));
+            os.flush();
+            StringBuilder sb = new StringBuilder();
+            int httpRspCode = httpURLConnection.getResponseCode();
+            if (httpRspCode == HttpURLConnection.HTTP_OK) {
+                BufferedReader br = new BufferedReader(
+                        new InputStreamReader(httpURLConnection.getInputStream(), "utf-8"));
+                String line = null;
+                while ((line = br.readLine()) != null) {
+                    sb.append(line);
+                }
+                br.close();
+                return sb.toString();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/Dockerfile b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/Dockerfile
new file mode 100644
index 0000000..78e6474
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-Xms64m","-Xmx256m","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/pom.xml b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/pom.xml
index 9c4276f..f2e5959 100644
--- a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/pom.xml
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/pom.xml
@@ -48,6 +48,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/AliyunOSSAutoConfigure.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/AliyunOSSAutoConfigure.java
index a66e263..754b5b0 100644
--- a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/AliyunOSSAutoConfigure.java
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/AliyunOSSAutoConfigure.java
@@ -1,17 +1,27 @@
 package com.kidgrow.filecenter.config;
 
+import com.aliyun.oss.OSSClient;
 import com.aliyun.oss.common.auth.DefaultCredentialProvider;
+import com.aliyun.oss.model.GetObjectRequest;
+import com.aliyun.oss.model.OSSObject;
+import com.kidgrow.common.constant.SecurityConstants;
+import com.kidgrow.common.utils.DateUtil;
+import com.kidgrow.common.utils.StringUtils;
 import com.kidgrow.filecenter.model.FileInfo;
 import com.kidgrow.filecenter.properties.FileServerProperties;
 import com.kidgrow.filecenter.service.impl.AbstractIFileService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-
-import com.aliyun.oss.OSSClient;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.UUID;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -26,6 +36,7 @@
 public class AliyunOSSAutoConfigure {
     @Autowired
     private FileServerProperties fileProperties;
+
 
     /**
      * 阿里云文件存储client
@@ -44,21 +55,107 @@
         @Autowired
         private OSSClient ossClient;
 
+        @Autowired
+        private HttpServletRequest httpServletRequest;
+
         @Override
         protected String fileType() {
             return fileProperties.getType();
         }
 
+        @Value("${spring.profiles.active}")
+        private String OssPathEn;
+
         @Override
         protected void uploadFile(MultipartFile file, FileInfo fileInfo) throws Exception {
-            ossClient.putObject(fileProperties.getOss().getBucketName(), fileInfo.getName(), file.getInputStream());
-            fileInfo.setUrl(fileProperties.getOss().getDomain() + "/" + fileInfo.getName());
+            String clientID = httpServletRequest.getHeader(SecurityConstants.CLIENT_HEADER);
+            String hospitalID = httpServletRequest.getHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER);
+            String depID = httpServletRequest.getHeader(SecurityConstants.USER_DEP_ID_HEADER);
+            String folderByDate = DateUtil.formatDate(new Date());
+            int begin = file.getOriginalFilename().indexOf(".");
+            int last = file.getOriginalFilename().length();
+            String fileType = file.getOriginalFilename().substring(begin, last);
+            String fileName = UUID.randomUUID().toString().replaceAll("-", "") + fileType;
+            String fileFolder = "";
+            if (clientID.equals("hospital")) {//医院端平台,
+                fileFolder = FilePath(fileInfo.getImgType(), folderByDate, hospitalID, depID);
+                fileUpLoadOss(fileInfo, fileFolder + fileName, file.getInputStream());
+            } else {
+                fileFolder = FilePath(fileInfo.getImgType(), folderByDate, hospitalID, depID);
+                fileUpLoadOss(fileInfo, fileFolder + fileName, file.getInputStream());
+            }
         }
 
         @Override
         protected boolean deleteFile(FileInfo fileInfo) {
+
             ossClient.deleteObject(fileProperties.getOss().getBucketName(), fileInfo.getName());
             return true;
         }
+
+        /**
+         * 给OSS上上传文件
+         *
+         * @param fileInfo    返回对象
+         * @param newFilePath 上传到的文件路径
+         * @param fileStream  要上传的文件流
+         */
+        @Override
+        public void fileUpLoadOss(FileInfo fileInfo, String newFilePath, InputStream fileStream) {
+            ossClient.putObject(fileProperties.getOss().getBucketName(), newFilePath, fileStream);
+            fileInfo.setUrl(fileProperties.getOss().getDomain() + newFilePath);
+
+        }
+        @Override
+        public OSSObject down(String url) {
+            GetObjectRequest request = new GetObjectRequest(fileProperties.getOss().getBucketName(), url);
+            return ossClient.getObject(request);
+        }
+
+        /**
+         * 组合sso上的文件路径
+         *
+         * @param imgType
+         * @return
+         */
+        @Override
+        public String FilePath(String imgType, String folderByDate, String hospitalId, String departmentId) {
+            //返回的文件路径
+            String fileFolder = OssPathEn+"/";
+
+
+            if (StringUtils.isNotBlank(imgType)) {
+                // 光片需要按照根据医院ID,科室ID,日期进行OSS存储
+                if (imgType.toLowerCase().equals("xray")) {
+
+                    if (StringUtils.isNotBlank(hospitalId) &&
+                            StringUtils.isNotBlank(departmentId)) {
+                        fileFolder += "Xray/" + hospitalId + "/" + departmentId + "/" + folderByDate + "/";
+                    } else {
+                        fileFolder += "Xray/" + folderByDate + "/";
+                    }
+
+                } else if (imgType.toLowerCase().equals("app")) {
+                    //移动端APP上传
+                    if (StringUtils.isNotBlank(hospitalId) &&
+                            StringUtils.isNotBlank(departmentId)) {
+                        fileFolder += "AppXray/" + hospitalId + "/" + departmentId + "/" + folderByDate + "/";
+                    } else {
+                        fileFolder += "AppXray/" + folderByDate + "/";
+                    }
+                }
+                // 医院Logo只保存在一个目录中
+                else if (imgType.toLowerCase().equals("logo")) {
+                    fileFolder += "HospitalLogo/";
+                } else if (imgType.toLowerCase().equals("doctor")) {
+                    fileFolder += "DoctorImage/";
+                } else {
+                    fileFolder += "OtherImage/" + folderByDate + "/";
+                }
+            } else {
+                fileFolder += "OtherImage/" + folderByDate + "/";
+            }
+            return fileFolder;
+        }
     }
 }
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/FastdfsAutoConfigure.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/FastdfsAutoConfigure.java
index 2150754..6c164d6 100644
--- a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/FastdfsAutoConfigure.java
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/FastdfsAutoConfigure.java
@@ -1,6 +1,7 @@
 package com.kidgrow.filecenter.config;
 
 import cn.hutool.core.util.StrUtil;
+import com.aliyun.oss.model.OSSObject;
 import com.kidgrow.filecenter.model.FileInfo;
 import com.kidgrow.filecenter.properties.FileServerProperties;
 import com.kidgrow.filecenter.service.impl.AbstractIFileService;
@@ -12,6 +13,8 @@
 import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
+
+import java.io.InputStream;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -45,6 +48,21 @@
         }
 
         @Override
+        protected void fileUpLoadOss(FileInfo fileInfo, String newFilePath, InputStream fileStream) {
+
+        }
+
+        @Override
+        protected String FilePath(String imgType, String folderByDate,String hospitalId,String departmentId) {
+            return null;
+        }
+
+        @Override
+        protected OSSObject down(String url) {
+            return null;
+        }
+
+        @Override
         protected boolean deleteFile(FileInfo fileInfo) {
             if (fileInfo != null && StrUtil.isNotEmpty(fileInfo.getPath())) {
                 StorePath storePath = StorePath.parseFromUrl(fileInfo.getPath());
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/QiniuOSSAutoConfigure.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/QiniuOSSAutoConfigure.java
index e82a167..ed5e0f2 100644
--- a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/QiniuOSSAutoConfigure.java
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/config/QiniuOSSAutoConfigure.java
@@ -1,5 +1,6 @@
 package com.kidgrow.filecenter.config;
 
+import com.aliyun.oss.model.OSSObject;
 import com.kidgrow.filecenter.model.FileInfo;
 import com.kidgrow.filecenter.properties.FileServerProperties;
 import com.kidgrow.filecenter.service.impl.AbstractIFileService;
@@ -16,6 +17,8 @@
 import com.qiniu.util.Auth;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
+
+import java.io.InputStream;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -88,6 +91,21 @@
         }
 
         @Override
+        protected void fileUpLoadOss(FileInfo fileInfo, String newFilePath, InputStream fileStream) {
+
+        }
+
+        @Override
+        protected String FilePath(String imgType, String folderByDate,String hospitalId,String departmentId) {
+            return null;
+        }
+
+        @Override
+        protected OSSObject down(String url) {
+            return null;
+        }
+
+        @Override
         protected boolean deleteFile(FileInfo fileInfo) {
             try {
                 Response response = bucketManager.delete(fileProperties.getOss().getBucketName(), fileInfo.getPath());
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/controller/FileController.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/controller/FileController.java
index fce1698..b70149c 100644
--- a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/controller/FileController.java
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/controller/FileController.java
@@ -2,12 +2,20 @@
 
 import com.kidgrow.common.model.PageResult;
 import com.kidgrow.common.model.Result;
+import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.filecenter.model.FileInfo;
 import com.kidgrow.filecenter.service.IFileService;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.Map;
 
 /**
@@ -31,11 +39,88 @@
      * @return
      * @throws Exception
      */
-    @PostMapping("/files-anon")
+    @PostMapping(value="/files-anon",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     public FileInfo upload(@RequestParam("file") MultipartFile file) throws Exception {
         return fileService.upload(file);
     }
 
+
+    /**
+     * 文件上传
+     * 根据fileType选择上传方式
+     *
+     * @param file
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value="/files-upload",produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public FileInfo feignUpload(@RequestPart("file") MultipartFile file,@RequestParam String imgType) throws Exception {
+        return fileService.upload(file,imgType);
+    }
+    /**
+     * 文件上传 返回带缩略图地址的对象,缩略图在path字段
+     *
+     * @param file
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value="/files-thupload",produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public FileInfo thUpload(@RequestPart("file") MultipartFile file,@RequestParam String imgType) throws Exception {
+        return fileService.uploadForThumbnails(file,imgType);
+    }
+    /**
+     * base64上传图片
+     */
+    @PostMapping(value="baseUplaod",produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public FileInfo baseUplaod(@RequestParam("file") String file,@RequestParam("imgType") String imgType,
+                               @RequestParam("hospitalId") String hospitalId,@RequestParam("departmentId") String departmentId){
+        return fileService.baseUplaod(file,imgType,hospitalId,departmentId);
+    }
+    /**
+     * base64图片下载
+     */
+    @PostMapping(value="baseDownLoad")
+    public ResultBody baseDownLoad(@RequestBody Map<String,Object> map) throws Exception{
+        String url = MapUtils.getString(map, "url");
+        if (StringUtils.isBlank(url)) {
+            return ResultBody.failed("请输入地址");
+        }
+        return fileService.baseDownLoad(map);
+    }
+    /**
+     * byte[]上传
+     */
+    @PostMapping(value="byteUplaod")
+    public FileInfo byteUplaod(@RequestParam("fileName") String fileName,@RequestBody byte[] bytes){
+        if(bytes.length == 0){
+            return null;
+        }
+        if (com.kidgrow.common.utils.StringUtils.isBlank(fileName)) {
+            return null;
+        }
+        InputStream inputStream = new ByteArrayInputStream(bytes);
+        return fileService.byteUplaod(fileName,inputStream,bytes.length);
+    }
+    /**
+     * byte[]上传
+     */
+    @PostMapping(value="byteUplaodTest",produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public FileInfo byteUplaodTest(@RequestParam("fileName") String fileName,@RequestPart("file") MultipartFile file)throws IOException {
+        InputStream inputStream = file.getInputStream();
+        ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
+        byte[] buffer=new byte[1024];
+        int ch;
+        /**
+         *
+         * */
+        while ((ch = inputStream.read(buffer)) != -1) {
+            bytestream.write(buffer,0,ch);
+        }
+        byte[] data = bytestream.toByteArray();
+        InputStream inputStream1 = new ByteArrayInputStream(data);
+        return fileService.byteUplaod(fileName,inputStream,data.length);
+    }
+
     /**
      * 文件删除
      *
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/properties/FileServerProperties.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/properties/FileServerProperties.java
index 9db651f..af7f964 100644
--- a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/properties/FileServerProperties.java
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/properties/FileServerProperties.java
@@ -34,4 +34,6 @@
      */
     FdfsProperties fdfs = new FdfsProperties();
 
+
+
 }
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/properties/OssProperties.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/properties/OssProperties.java
index 9b9aabd..e3001fb 100644
--- a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/properties/OssProperties.java
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/filecenter/properties/OssProperties.java
@@ -32,5 +32,10 @@
      * 说明
      */
     private String domain;
+
+    /**
+     * 文件夹
+     */
+    private String folder;
 }
 
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java
new file mode 100644
index 0000000..80ffb22
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java
@@ -0,0 +1,46 @@
+package com.kidgrow.sms.aliyun.config;
+
+import com.kidgrow.sms.client.SmsClient;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云 SMS 自动配置<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:11 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Configuration
+@ConditionalOnClass(name = "com.aliyuncs.IAcsClient")
+@EnableConfigurationProperties(SmsProperties.class)
+public class SmsAutoConfiguration {
+    private final SmsProperties smsProperties;
+
+    public SmsAutoConfiguration(final SmsProperties smsProperties) {
+        this.smsProperties = smsProperties;
+    }
+
+    /**
+     * Configuration SmsClient bean.
+     *
+     * @return the sms client
+     */
+    @Bean
+    @ConditionalOnMissingBean
+    public SmsClient smsClient() {
+        if (this.smsProperties.getTemplates() == null) {
+            return new SmsClient(this.smsProperties.getAccessKeyId(), this.smsProperties.getAccessKeySecret());
+        } else {
+            return new SmsClient(
+                    this.smsProperties.getAccessKeyId(),
+                    this.smsProperties.getAccessKeySecret(),
+                    this.smsProperties.getTemplates());
+        }
+    }
+}
+
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java
new file mode 100644
index 0000000..103737d
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java
@@ -0,0 +1,37 @@
+package com.kidgrow.sms.aliyun.config;
+
+import com.kidgrow.sms.template.SmsTemplate;
+import lombok.Data;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云 SMS 配置属性<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:10 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@ConfigurationProperties(prefix = "aliyun.sms")
+public class SmsProperties implements InitializingBean {
+
+    private String accessKeyId;
+    private String accessKeySecret;
+    private String signName;
+    private Map<String, SmsTemplate> templates;
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        if (null != this.templates) {
+            for (final SmsTemplate smsTemplate : this.templates.values()) {
+                if (null == smsTemplate.getSignName()) {
+                    smsTemplate.setSignName(this.signName);
+                }
+            }
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java
new file mode 100644
index 0000000..af27f80
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java
@@ -0,0 +1,133 @@
+package com.kidgrow.sms.aliyun.controller;
+
+import com.kidgrow.common.base.ResponseCode;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.redis.template.RedisRepository;
+import com.kidgrow.sms.client.SmsClient;
+import com.kidgrow.sms.exception.SmsException;
+import com.kidgrow.sms.service.AliyunSmsService;
+import com.kidgrow.sms.model.SmsModel;
+import com.kidgrow.sms.util.AliyunSmsUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:15 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@RestController
+@RequestMapping("sms")
+public class SmsController implements AliyunSmsService {
+
+    @Autowired
+    private SmsClient smsClient;
+
+    @Autowired
+    private RedisRepository redisRepository;
+
+    @Value("${sms.verificationCode.timeOut:180}")
+    private Long timeOut;
+
+    @Value("${sms.verificationCode.prefix:default}")
+    private String smsPrefix;
+
+    /**
+     * 发送短信验证码
+     *
+     * @param smsModel
+     */
+    @Override
+    public ResultBody sendVerificationCode(@RequestBody SmsModel smsModel) {
+        String phoneNumber = smsModel.getPhoneNumber();
+        String key = smsModel.getKey();
+        if (StringUtils.isBlank(phoneNumber) || StringUtils.isBlank(key)) {
+            return ResultBody.fail(ResponseCode.ERROR_PARAMS, "手机号或短信模板不能为空!");
+        }
+        if (!AliyunSmsUtils.isMobile(phoneNumber)) {
+            return ResultBody.fail(ResponseCode.ERROR_PARAMS, "手机号格式不正确!");
+        }
+        try {
+            // 发送验证码
+            Integer code = smsClient.sendVerificationCode(key, phoneNumber);
+            // 缓存验证码和有效期
+            redisRepository.setExpire(smsPrefix + phoneNumber, code.toString(), timeOut);
+//            redisRepository.expire(smsPrefix + phoneNumber, timeOut);
+            return ResultBody.ok();
+        } catch (SmsException smsEx) {
+            smsEx.printStackTrace();
+            return ResultBody.failed().msg(smsEx.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultBody.failed().msg(e.getMessage());
+        }
+    }
+
+    /**
+     * 验证码校验
+     *
+     * @param smsModel
+     */
+    @Override
+    public ResultBody validateVerificationCode(@RequestBody SmsModel smsModel) {
+        String phoneNumber = smsModel.getPhoneNumber();
+        String code = smsModel.getCode();
+        if (StringUtils.isBlank(phoneNumber) || StringUtils.isBlank(code)) {
+            return ResultBody.failed(ResponseCode.ERROR_PARAMS, "手机号或验证码不能为空!");
+        }
+        try {
+            if (redisRepository.exists(smsPrefix + phoneNumber)) {
+                String rightCode = (String) redisRepository.get(smsPrefix + phoneNumber);
+                if (code.equals(rightCode)) {
+                    // 验证成功 移除缓存验证码
+                    redisRepository.del(smsPrefix + phoneNumber);
+                    return ResultBody.ok();
+                } else {
+                    return ResultBody.failed(ResponseCode.ERROR_PARAMS, "验证码不正确!");
+                }
+            } else {
+                return ResultBody.failed(ResponseCode.ERROR_PARAMS, "验证码已失效!");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultBody.failed("系统错误");
+        }
+    }
+
+    /**
+     * 发送手机短信消息
+     *
+     * @param smsModel
+     * @return
+     */
+    @Override
+    public ResultBody sendSmsMsg(SmsModel smsModel) {
+        List<String> phoneNumbers = smsModel.getPhoneNumbers();
+        String key = smsModel.getKey();
+//        if ((phoneNumbers == null || phoneNumbers.isEmpty()) || StringUtils.isBlank(key)) {
+//            return ResponseBuilder.buildResultError(ResponseCode.ERROR_PARAMS, "手机号或短信模板不能为空!");
+//        }
+
+        try {
+            // 发送手机短信消息
+            smsClient.sendSmsMsg(key, smsModel.getParams(), phoneNumbers);
+            return ResultBody.ok();
+        } catch (SmsException smsEx) {
+            smsEx.printStackTrace();
+            return ResultBody.failed(smsEx.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultBody.failed(e.getMessage());
+        }
+    }
+}
+
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/lanchuang/controller/SmsChuangLanController.java b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/lanchuang/controller/SmsChuangLanController.java
new file mode 100644
index 0000000..12ba9dc
--- /dev/null
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/java/com/kidgrow/sms/lanchuang/controller/SmsChuangLanController.java
@@ -0,0 +1,156 @@
+package com.kidgrow.sms.lanchuang.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.utils.DateUtils;
+import com.kidgrow.redis.util.RedisUtils;
+import com.kidgrow.sms.util.SmsChuangLanUtils;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+
+@RestController
+@RequestMapping("smsChangLan")
+@Api(tags = "创蓝短信模块")
+public class SmsChuangLanController {
+    @Value("${chuanglan.sms.sendUrl}")
+    private String CHUANGLAN_SMS_SENDURL;
+    @Value("${chuanglan.sms.account}")
+    private String CHUANGLAN_SMS_ACCOUNT;
+    @Value("${chuanglan.sms.password}")
+    private String CHUANGLAN_SMS_PASSWORD;
+    @Value("${chuanglan.sms.num}")
+    private Integer CHUANGLAN_SMS_NUM;
+    @Value("${chuanglan.sms.timeLimit}")
+    private Integer CHUANGLAN_SMS_TIMELIMIT;
+    @Autowired
+    private RedisUtils redisUtils;
+
+    /**
+     * type  为类型, "type":"LOGIN_SMS"  为登录,"type":"PASSWORD_SMS" 为密码找回,"type":"REGISTER_SMS" 为
+     * @param map
+     * @return
+     */
+    @PostMapping("send")
+    public ResultBody sendVerificationCode(@RequestBody Map map) {
+        if(CHUANGLAN_SMS_NUM==null){
+            CHUANGLAN_SMS_NUM=5;
+        }
+        Object phone = map.get("phone");
+        if (map.get("phone")==null||"".equals(map.get("phone"))){
+            return ResultBody.failed("请输入手机号");
+        }
+        Object type = map.get("type");
+        if (map.get("type")==null||"".equals(map.get("type"))){
+            return ResultBody.failed("请输入保存的类型");
+        }
+        String verificationCode="";
+        Random random=new Random();
+        for (int i = 0; i < 6; i++) {
+            int i1 = random.nextInt(9);
+            verificationCode+=i1;
+        }
+        try {
+            //组装发送消息的内容
+            map.put("account", CHUANGLAN_SMS_ACCOUNT);//API账号
+            map.put("password", CHUANGLAN_SMS_PASSWORD);//API密码
+            map.put("report","false");
+            map.put("msg","您好,您的验证码是"+verificationCode);
+            //在Redis中获取
+            Object hget = redisUtils.hget(map.get("type").toString(), map.get("phone").toString());
+            JSONObject jsonObject =new JSONObject();
+            Map<String,Object> cunMap=new HashMap<>();
+            cunMap.put("verificationCode",verificationCode);
+            cunMap.put("count",CHUANGLAN_SMS_NUM);//总共
+            if(hget==null){
+                String send = SmsChuangLanUtils.send(map, CHUANGLAN_SMS_SENDURL);
+                jsonObject=JSON.parseObject(send);
+                String s1 = DateUtils.formatCurrentDateTime();
+                cunMap.put("date",s1);
+                cunMap.put("remnant",CHUANGLAN_SMS_NUM-1);//剩余
+                Date date2 = DateUtils.addMilliseconds(DateUtils.parseDate(s1), CHUANGLAN_SMS_TIMELIMIT);
+                cunMap.put("endTime",DateUtils.formatDateTime(date2));
+            }else {
+                JSONObject redisJson = JSON.parseObject(JSON.toJSONString(hget));
+                Object remnantObject = redisJson.get("remnant");
+                if(remnantObject instanceof Integer){
+                    Integer remnant=(Integer)remnantObject;
+                    if(remnant>0){
+                        String send = SmsChuangLanUtils.send(map, CHUANGLAN_SMS_SENDURL);
+                        jsonObject=JSON.parseObject(send);
+                        String s1 = DateUtils.formatCurrentDateTime();
+                        cunMap.put("date",DateUtils.formatCurrentDateTime());
+                        cunMap.put("remnant",remnant-1);//剩余
+                        Date date2 = DateUtils.addMilliseconds(DateUtils.parseDate(s1), CHUANGLAN_SMS_TIMELIMIT);
+                        cunMap.put("endTime",DateUtils.formatDateTime(date2));
+                    }else{
+                        return ResultBody.failed().data("每个手机号限用"+CHUANGLAN_SMS_NUM+"次");
+                    }
+                }else {
+                    return ResultBody.failed();
+                }
+            }
+            if ("0".equals(jsonObject.get("code"))) {
+                redisUtils.hset(map.get("type").toString(), map.get("phone").toString(),cunMap,DateUtils.getSecondsNextEarlyMorning());
+//                return ResultBody.ok().data(verificationCode);
+                return ResultBody.ok();
+            } else {
+                return ResultBody.failed();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultBody.failed();
+        }
+    }
+    @PostMapping("verification")
+    public ResultBody verification(@RequestBody Map<String,Object> map){
+        Object phone = map.get("phone");
+        if (map.get("phone")==null||"".equals(map.get("phone"))){
+            return ResultBody.failed("请输入手机号");
+        }
+        Object verificationCode = map.get("verificationCode");
+        if (map.get("verificationCode")==null||"".equals(map.get("verificationCode"))){
+            return ResultBody.failed("请输入保存的类型");
+        }
+        Object type = map.get("type");
+        if (map.get("type")==null||"".equals(map.get("type"))){
+            return ResultBody.failed("请输入保存的类型");
+        }
+        Object hget = redisUtils.hget(map.get("type").toString(), map.get("phone").toString());
+        if(hget!=null){
+            JSONObject redisJson = JSON.parseObject(JSON.toJSONString(hget));
+            Object verificationCodeObject = redisJson.get("verificationCode");
+            if(verificationCode.equals(verificationCodeObject)){
+                Object date = redisJson.get("date");
+                long time = DateUtils.addMilliseconds(DateUtils.parseDate(date.toString()), CHUANGLAN_SMS_TIMELIMIT).getTime();
+                Date dateNow=new Date();
+                long timeNow = dateNow.getTime();
+                if(timeNow<=time){
+                    return ResultBody.ok();
+                }else {
+                    return ResultBody.failed("验证码超时");
+                }
+            }else {
+                return ResultBody.failed("验证码错误");
+            }
+        }else {
+            return ResultBody.failed("该手机号没有验证码");
+        }
+    }
+    //获取 存放 Redis的时间 秒(到今晚的秒数)
+    public Long getSecondsNextEarlyMorning() {
+        Date afterDay = DateUtils.getAfterDay(new Date());
+        String s = DateUtils.formatDate(afterDay, null);
+        Date date = DateUtils.parseDate(s);
+        System.out.println(date.getTime()-System.currentTimeMillis());
+        long second= (date.getTime()-System.currentTimeMillis())/1000;
+        return second;
+    }
+}
diff --git a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/resources/application.yml b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/resources/application.yml
index b0ec04d..ced8b2c 100644
--- a/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/resources/application.yml
+++ b/kidgrow-business/kidgrow-filecenter/kidgrow-filecenter-server/src/main/resources/application.yml
@@ -10,10 +10,10 @@
   application:
     name: filecenter-server
   datasource:
-    url: jdbc:mysql://${kidgrow.datasource.ip}:3306/file_center?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
+    url: jdbc:mysql://${kidgrow.datasource.ip}:3306/file_center_${spring.profiles.active}?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
     username: ${kidgrow.datasource.username}
     password: ${kidgrow.datasource.password}
-    driver-class-name: com.mysql.jdbc.Driver
+    #    driver-class-name: com.mysql.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
     druid:
       aop-patterns: com.kidgrow.filecenter.controller.*
@@ -37,21 +37,44 @@
 
 
 
+
 kidgrow:
-#  fdfs:
-#    web-url: 192.168.28.130
-#    trackerList: ${kidgrow.fdfs.web-url}:22122
+  #  fdfs:
+  #    web-url: 192.168.28.130
+  #    trackerList: ${kidgrow.fdfs.web-url}:22122
   file-server:
-    type: qiniu
+    type: aliyun
     fdfs:
       web-url: ${kidgrow.fdfs.web-url}
     #oss配置
     oss:
-      access-key: j977Ii3DODvQXzE241Z6ouW9so4Q6_6PeOPwN5UZ
-      accessKeySecret: W8ArRp3mr-w3n4R-lHEvSFzGdgdrYfC9wHkZlqec
-      endpoint: http://q68nl7reu.bkt.clouddn.com
-      bucketName: kidgrow
-      domain: kidgrow.s3-cn-east-1.qiniucs.com
+      #      access-key: j977Ii3DODvQXzE241Z6ouW9so4Q6_6PeOPwN5UZ
+      #      accessKeySecret: W8ArRp3mr-w3n4R-lHEvSFzGdgdrYfC9wHkZlqec
+      #      endpoint: http://q68nl7reu.bkt.clouddn.com
+      #      bucketName: kidgrow
+      #      domain: kidgrow.s3-cn-east-1.qiniucs.com
+
+#      access-key: LTAI4GG27Q85eTB5YvVKZAyg
+#      accessKeySecret: thEEFtCxYTPQGrHl0KmUUBXr7gWKdh
+##      endpoint: kidgrow.oss-cn-beijing-internal.aliyuncs.com
+#      endpoint: 123.kidgrow.cloud
+##      endpoint: oss-accelerate.aliyuncs.com
+#      bucketName: kidgrow
+#      #注意加上/
+#      domain: http://123.kidgrow.cloud/
+##      domain: https://kidgrow.oss-accelerate.aliyuncs.com/
+#      folder: kidgrow/
+      access-key: ${kidgrow.oss.access-key}
+      accessKeySecret: ${kidgrow.oss.accessKeySecret}
+        #      endpoint: kidgrow.oss-cn-beijing-internal.aliyuncs.com
+      endpoint: ${kidgrow.oss.endpoint}
+        #      endpoint: oss-accelerate.aliyuncs.com
+      bucketName: ${kidgrow.oss.bucketName}
+        #注意加上/
+      domain: ${kidgrow.oss.domain}
+        #      domain: https://kidgrow.oss-accelerate.aliyuncs.com/
+      folder: kidgrow/
+
   swagger:
     base-package: com.kidgrow.filecenter.controller
     description: 文件上传服务接口文档
@@ -65,3 +88,38 @@
 #  trackerList: ${kidgrow.fdfs.trackerList}
 
 
+#创蓝
+chuanglan:
+  sms:
+    sendUrl: http://smssh1.253.com/msg/send/json
+    account: N2561124
+    password: Mguj6qlRWX7b5e
+    num: 5
+    timeLimit: 720000
+#阿里云相关
+aliyun:
+  sms:
+    accessKeyId: LTAIX1whVSBUUKNW
+    accessKeySecret: j7UywJDoUkPRvGafKrik1pyYtEC2ys
+    signName: 微课堂
+    templates:
+      ### 模板key
+      key1:
+        ## 模板code 需要在阿里云控制台设置
+        templateCode: SMS_151231928 # 与阿里云设置的保持一致,模板内容需在后面加上,方便使用:****
+      key2:
+        templateCode: SMS_105665033 # 与阿里云设置的保持一致,模板内容需在后面加上,方便使用:****
+  commonRequest:
+    domain: dysmsapi.aliyuncs.com
+    ## 版本号
+    version: 2017-05-25
+    ##
+    action: SendSms
+
+## 短信验证码过期时间,时间单位/秒
+sms:
+  verificationCode:
+    ## 短信验证码过期时间,时间单位/秒
+    timeOut: 120
+    ##  缓存手机号key值前缀
+    prefix: "sms:aliyun:code:"
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-filecenter/pom.xml b/kidgrow-business/kidgrow-filecenter/pom.xml
index 5267404..68b0ae5 100644
--- a/kidgrow-business/kidgrow-filecenter/pom.xml
+++ b/kidgrow-business/kidgrow-filecenter/pom.xml
@@ -21,6 +21,17 @@
 
     <dependencies>
         <dependency>
+            <groupId>io.github.openfeign.form</groupId>
+            <artifactId>feign-form</artifactId>
+            <version>3.8.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.github.openfeign.form</groupId>
+            <artifactId>feign-form-spring</artifactId>
+            <version>3.8.0</version>
+        </dependency>
+        <dependency>
             <groupId>com.kidgrow</groupId>
             <artifactId>kidgrow-common-spring-boot-starter</artifactId>
         </dependency>
diff --git a/kidgrow-business/kidgrow-logcenter/Dockerfile b/kidgrow-business/kidgrow-logcenter/Dockerfile
new file mode 100644
index 0000000..f28a337
--- /dev/null
+++ b/kidgrow-business/kidgrow-logcenter/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-Xms64m","-Xmx128m","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-logcenter/pom.xml b/kidgrow-business/kidgrow-logcenter/pom.xml
index f634b4c..42451dc 100644
--- a/kidgrow-business/kidgrow-logcenter/pom.xml
+++ b/kidgrow-business/kidgrow-logcenter/pom.xml
@@ -64,6 +64,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/pom.xml b/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/pom.xml
new file mode 100644
index 0000000..0b3b65f
--- /dev/null
+++ b/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/pom.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kidgrow-mqcenter</artifactId>
+        <groupId>com.kidgrow</groupId>
+        <version>1.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>kidgrow-mqcenter-rabbit</artifactId>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-rabbitmq-spring-boot-starter</artifactId>
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.kidgrow</groupId>-->
+<!--            <artifactId>kidgrow-common-spring-boot-starter</artifactId>-->
+<!--        </dependency>-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/RabbitMqApplication.java b/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/RabbitMqApplication.java
new file mode 100644
index 0000000..c7b66c7
--- /dev/null
+++ b/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/RabbitMqApplication.java
@@ -0,0 +1,19 @@
+package com.kidgrow;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/3/23 18:56 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@SpringBootApplication
+public class RabbitMqApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(RabbitMqApplication.class,args);
+    }
+}
diff --git a/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/rabbitmq/controller/TopicController.java b/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/rabbitmq/controller/TopicController.java
new file mode 100644
index 0000000..a770d8a
--- /dev/null
+++ b/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/rabbitmq/controller/TopicController.java
@@ -0,0 +1,30 @@
+package com.kidgrow.rabbitmq.controller;
+
+import com.kidgrow.rabbitmq.send.TopicSender;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/3/23 18:51 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@RestController
+@RequestMapping("/topic")
+public class TopicController {
+
+    @Autowired
+    private TopicSender topicSender;
+
+    @RequestMapping("/send")
+    public String send(){
+        topicSender.send();
+        return "OK";
+    }
+}
diff --git a/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/rabbitmq/recieve/TopicReceive.java b/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/rabbitmq/recieve/TopicReceive.java
new file mode 100644
index 0000000..f4f9145
--- /dev/null
+++ b/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/rabbitmq/recieve/TopicReceive.java
@@ -0,0 +1,38 @@
+package com.kidgrow.rabbitmq.recieve;
+
+import com.rabbitmq.client.Channel;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/3/23 18:49 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Component
+@RabbitListener(queues = "AdvancedEvaluation")
+public class TopicReceive {
+    @RabbitHandler
+    public void process(String messages, Message message, Channel channel) {
+        //  如果手动ACK,消息会被监听消费,但是消息在队列中依旧存在,如果 未配置 acknowledge-mode 默认是会在消费完毕后自动ACK掉
+        final long deliveryTag = message.getMessageProperties().getDeliveryTag();
+        try {
+            System.out.println("Topic Receiver : " + messages);
+            // 通知 MQ 消息已被成功消费,可以ACK了
+            channel.basicAck(deliveryTag, false);
+        }
+        catch (Exception e) {
+            try {
+                // 处理失败,重新压入MQ
+                channel.basicRecover();
+            } catch (Exception e1) {
+                e1.printStackTrace();
+            }
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/rabbitmq/send/TopicSender.java b/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/rabbitmq/send/TopicSender.java
new file mode 100644
index 0000000..9cb3373
--- /dev/null
+++ b/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/java/com/kidgrow/rabbitmq/send/TopicSender.java
@@ -0,0 +1,31 @@
+package com.kidgrow.rabbitmq.send;
+
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/3/23 18:45 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Component
+public class TopicSender {
+//    @Autowired
+//    private AmqpTemplate rabbitTemplate;
+
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+
+    public void send() {
+        for(int i=1;i<10000;i++) {
+            String context = "hi, i am message:"+i;
+            this.rabbitTemplate.setQueue("AIEvaluation");
+            this.rabbitTemplate.convertAndSend("test_exchange", "test_routingKey", context);
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/resources/application.yml b/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/resources/application.yml
new file mode 100644
index 0000000..4b045ff
--- /dev/null
+++ b/kidgrow-business/kidgrow-mqcenter/kidgrow-mqcenter-rabbit/src/main/resources/application.yml
@@ -0,0 +1,23 @@
+server:
+  port: 9909
+spring:
+  rabbitmq:
+    host: 182.92.99.224
+    port: 5672
+    username: liuke
+    password: kidgrow2020
+    #交换机名称
+    exchangeName: test_exchange
+    #队列名称
+    queueName: test_queue
+    #routingKeyName
+    routingKeyName: test_routingKey
+    virtual-host: my_vhost
+    #开启重试机制
+    listener:
+      simple:
+        #采用手动应答
+        acknowledge-mode: manual
+        retry:
+          enabled: true
+          max-attempts: 5
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-mqcenter/pom.xml b/kidgrow-business/kidgrow-mqcenter/pom.xml
index 9a02e2d..b96cf1c 100644
--- a/kidgrow-business/kidgrow-mqcenter/pom.xml
+++ b/kidgrow-business/kidgrow-mqcenter/pom.xml
@@ -13,5 +13,6 @@
 
     <modules>
         <module>kidgrow-mqcenter-rocket</module>
+        <module>kidgrow-mqcenter-rabbit</module>
     </modules>
 </project>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/pom.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/pom.xml
new file mode 100644
index 0000000..0e0102e
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/pom.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kidgrow-opration-center</artifactId>
+        <groupId>com.kidgrow</groupId>
+        <version>1.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kidgrow-opration-center-api</artifactId>
+
+
+</project>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/ConsumptionService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/ConsumptionService.java
new file mode 100644
index 0000000..84211fb
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/ConsumptionService.java
@@ -0,0 +1,59 @@
+package com.kidgrow.oprationcenter.feign;
+
+import com.kidgrow.common.constant.ServiceNameConstants;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.feign.fallback.ConsumptionServiceFallbackFactory;
+import com.kidgrow.oprationcenter.model.HospitalInfo;
+import com.kidgrow.oprationcenter.vo.ConsumptionRequest;
+import com.kidgrow.oprationcenter.vo.UserProductData;
+import com.kidgrow.ribbon.config.FeignHttpInterceptorConfig;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 扣费业务相关内部调用
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-06-27 15:26:33 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ * @version: 1.0
+ */
+@FeignClient(value = ServiceNameConstants.OPRATION_SERVER,configuration= FeignHttpInterceptorConfig.class,
+        fallbackFactory = ConsumptionServiceFallbackFactory.class, decode404 = true)
+public interface ConsumptionService {
+    /**
+     * 要让AI读片-调用
+     */
+    @PostMapping(value = "consumption/AIStart")
+    ResultBody consumptionAIStart (@RequestBody ConsumptionRequest consumptionRequest);
+    /**
+     * AI返回结果-调用
+     */
+    @PostMapping(value = "consumption/AIReturn")
+    ResultBody consumptionAIReturn (@RequestBody ConsumptionRequest consumptionRequest);
+    /**
+     * AI拒读/失败通知-调用
+     */
+    @PostMapping(value = "consumption/AIFail")
+    ResultBody consumptionAIFail (@RequestBody ConsumptionRequest consumptionRequest);
+    /**
+     * 发起人工读片-调用
+     */
+    @PostMapping(value = "consumption/Artificial")
+    ResultBody consumptionArtificial (@RequestBody ConsumptionRequest consumptionRequest);
+    /**
+     * 获取医院套餐是否到期和到期时间
+     * data内 isend为true说明套餐到期
+     * endtime上套餐的到期时间
+     * @param hospitalId
+     * @param departmentId
+     */
+    @GetMapping(value = "productorderdetail/UserProductDetailData")
+    ResultBody<UserProductData> UserProductDetailData (@RequestParam("hospitalId") Long hospitalId, @RequestParam("departmentId")  Long departmentId);
+
+    @PostMapping("/productorderdetail/serviceperiod")
+    ResultBody<UserProductData> ServicePeriod(@RequestBody HospitalInfo hospitalInfo);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/DiagnosticService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/DiagnosticService.java
new file mode 100644
index 0000000..d853939
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/DiagnosticService.java
@@ -0,0 +1,29 @@
+package com.kidgrow.oprationcenter.feign;
+
+import com.kidgrow.common.constant.ServiceNameConstants;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.feign.fallback.DiagnosticServiceFallbackFactory;
+import com.kidgrow.ribbon.config.FeignHttpInterceptorConfig;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.Map;
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 孩子的每次诊断数据
+ * @Project: 用户中心
+ * @CreateDate: Created in 2020-04-07 15:26:33 <br>
+ * @Author: <a href="2396341626@kidgrow.com">zhaobingliang</a>
+ * @version: 1.0
+ */
+@FeignClient(value = ServiceNameConstants.RECORD_CENTER_SERVICE,configuration= FeignHttpInterceptorConfig.class,
+        fallbackFactory = DiagnosticServiceFallbackFactory.class, decode404 = true)
+public interface DiagnosticService {
+    /**
+     * feign rpc访问远程 接口
+     */
+    @GetMapping(value = "/diagnostic/diagnosticitem")
+    ResultBody<PageResult> getDiagnosticItemList(@RequestParam Map<String, Object> params);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/ProductOrderService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/ProductOrderService.java
new file mode 100644
index 0000000..b3ba0c6
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/ProductOrderService.java
@@ -0,0 +1,29 @@
+package com.kidgrow.oprationcenter.feign;
+
+import com.kidgrow.common.constant.ServiceNameConstants;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.feign.fallback.ProductOrderFallbackFactory;
+import com.kidgrow.ribbon.config.FeignHttpInterceptorConfig;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 扣费业务相关内部调用
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-06-27 15:26:33 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ * @version: 1.0
+ */
+@FeignClient(value = ServiceNameConstants.OPRATION_SERVER,configuration= FeignHttpInterceptorConfig.class,
+        fallbackFactory = ProductOrderFallbackFactory.class, decode404 = true)
+public interface ProductOrderService {
+    /**
+     * 冲试用套餐  用于注册医生自动充值
+     */
+    @PostMapping(value = "contract/saveTemp")
+    ResultBody saveProductDetail(@RequestBody Map<String,Object> params);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/RoleOrganizationService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/RoleOrganizationService.java
new file mode 100644
index 0000000..cb00255
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/RoleOrganizationService.java
@@ -0,0 +1,31 @@
+package com.kidgrow.oprationcenter.feign;
+
+import com.kidgrow.common.constant.ServiceNameConstants;
+import com.kidgrow.common.model.SysRole;
+import com.kidgrow.oprationcenter.feign.fallback.DiagnosticServiceFallbackFactory;
+import com.kidgrow.ribbon.config.FeignHttpInterceptorConfig;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 孩子的每次诊断数据
+ * @Project: 用户中心
+ * @CreateDate: Created in 2020-04-07 15:26:33 <br>
+ * @Author: <a href="2396341626@kidgrow.com">zhaobingliang</a>
+ * @version: 1.0
+ */
+@FeignClient(value = ServiceNameConstants.USER_SERVICE,configuration= FeignHttpInterceptorConfig.class,
+        fallbackFactory = DiagnosticServiceFallbackFactory.class, decode404 = true)
+public interface RoleOrganizationService {
+    /**
+     * feign rpc访问远程 接口
+     */
+    @PostMapping(value = "/sysroleorganization/getRoleOrg")
+    Map<String, Object> getRoleOrgMap(List<SysRole> list) ;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/ConsumptionServiceFallbackFactory.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/ConsumptionServiceFallbackFactory.java
new file mode 100644
index 0000000..c2df1b6
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/ConsumptionServiceFallbackFactory.java
@@ -0,0 +1,47 @@
+package com.kidgrow.oprationcenter.feign.fallback;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.feign.ConsumptionService;
+import com.kidgrow.oprationcenter.model.HospitalInfo;
+import com.kidgrow.oprationcenter.vo.ConsumptionRequest;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+@Slf4j
+@Component
+public class ConsumptionServiceFallbackFactory implements FallbackFactory<ConsumptionService> {
+    @Override
+    public ConsumptionService create(Throwable throwable) {
+        return new ConsumptionService() {
+            @Override
+            public ResultBody consumptionAIStart(ConsumptionRequest consumptionRequest) {
+                return ResultBody.failed().msg("consumptionAIStart的FeignClient调用失败");
+            }
+
+            @Override
+            public ResultBody consumptionAIReturn(ConsumptionRequest consumptionRequest) {
+                return ResultBody.failed().msg("consumptionAIReturn的FeignClient调用失败");
+            }
+
+            @Override
+            public ResultBody consumptionAIFail(ConsumptionRequest consumptionRequest) {
+                return ResultBody.failed().msg("consumptionAIFail的FeignClient调用失败");
+            }
+
+            @Override
+            public ResultBody consumptionArtificial(ConsumptionRequest consumptionRequest) {
+                return ResultBody.failed().msg("consumptionArtificial的FeignClient调用失败");
+            }
+
+            @Override
+            public ResultBody UserProductDetailData(Long hospitalId, Long departmentId) {
+                return ResultBody.failed().msg("UserProductDetailData的FeignClient调用失败");
+            }
+
+            @Override
+            public ResultBody ServicePeriod(HospitalInfo hospitalInfo) {
+                return ResultBody.failed().msg("getForecastHeight的FeignClient调用失败");
+            }
+        };
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/DiagnosticServiceFallbackFactory.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/DiagnosticServiceFallbackFactory.java
new file mode 100644
index 0000000..c610c2a
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/DiagnosticServiceFallbackFactory.java
@@ -0,0 +1,23 @@
+package com.kidgrow.oprationcenter.feign.fallback;
+
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.feign.DiagnosticService;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+@Slf4j
+@Component
+public class DiagnosticServiceFallbackFactory implements FallbackFactory<DiagnosticService> {
+    @Override
+    public DiagnosticService create(Throwable throwable) {
+       return new DiagnosticService() {
+           @Override
+           public ResultBody<PageResult> getDiagnosticItemList(Map<String, Object> params) {
+               return ResultBody.failed().msg("getDiagnosticItemList的FeignClient调用参数传递测试失败");
+           }
+       };
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/ProductOrderFallbackFactory.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/ProductOrderFallbackFactory.java
new file mode 100644
index 0000000..9f68d19
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/ProductOrderFallbackFactory.java
@@ -0,0 +1,22 @@
+package com.kidgrow.oprationcenter.feign.fallback;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.feign.ProductOrderService;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+@Slf4j
+@Component
+public class ProductOrderFallbackFactory implements FallbackFactory<ProductOrderService> {
+    @Override
+    public ProductOrderService create(Throwable throwable) {
+        return new ProductOrderService() {
+            @Override
+            public ResultBody saveProductDetail(Map<String, Object> params) {
+                return ResultBody.failed().msg("saveProductDetail的FeignClient调用失败");
+            }
+        };
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/RoleOrganizationServiceFallbackFactory.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/RoleOrganizationServiceFallbackFactory.java
new file mode 100644
index 0000000..dcc8b33
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/feign/fallback/RoleOrganizationServiceFallbackFactory.java
@@ -0,0 +1,26 @@
+package com.kidgrow.oprationcenter.feign.fallback;
+
+import com.kidgrow.common.model.SysRole;
+import com.kidgrow.oprationcenter.feign.RoleOrganizationService;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+@Slf4j
+@Component
+public class RoleOrganizationServiceFallbackFactory implements FallbackFactory<RoleOrganizationService> {
+    @Override
+    public RoleOrganizationService create(Throwable throwable) {
+       return new RoleOrganizationService() {
+           @Override
+           public Map<String, Object> getRoleOrgMap(List<SysRole> list) {
+               Map<String, Object> map=new HashMap<>();
+               map.put("id",null);
+               return map;
+           }
+       };
+    }
+}
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
new file mode 100644
index 0000000..71bd2aa
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/BusinessRecords.java
@@ -0,0 +1,68 @@
+package com.kidgrow.oprationcenter.model;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.kidgrow.common.model.SuperModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 业务操作记录<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("business_records")
+public class BusinessRecords extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 记录标题
+     */
+    @NotEmpty(message = "记录标题不能为空")
+    private String recordTitle;
+    /**
+     * 操作人ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long userId;
+    /**
+     * 操作人姓名
+     */
+    @NotEmpty(message = "操作人姓名不能为空")
+    private String userName;
+    /**
+     * 应用名称
+     */
+    @NotEmpty(message = "应用名称不能为空")
+    private String appName;
+    /**
+     * ip
+     */
+    private String recordIp;
+    /**
+     * 业务操作记录详情
+     */
+    private String recordDetail;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    private Boolean isDel;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean enabled;
+}
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
new file mode 100644
index 0000000..c2fd96b
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/BusinessServer.java
@@ -0,0 +1,75 @@
+package com.kidgrow.oprationcenter.model;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.kidgrow.common.model.SuperModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 医院服务信息表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("business_server")
+public class BusinessServer extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 科室ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotEmpty(message = "科室ID不能为空")
+    private Long departmentId;
+    /**
+     * 医生账户数量
+     */
+    @NotNull(message = "医生账户数量不能为空")
+    private Integer doctorCount;
+    /**
+     * 服务到期时间
+     */
+    @NotNull(message = "服务到期时间不能为空")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date serverEndDate;
+    /**
+     * 累积读片量
+     */
+    private Long totalRayCount;
+    /**
+     * 累积报告量
+     */
+    private Long totalRecordCount;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
+    private Boolean isDel;
+    /**
+     * 租户字段
+     */
+    private String tenantId;
+    /**
+     * 状态,1启用,0停用
+     */
+    @NotEmpty(message = "状态,1启用,0停用不能为空")
+    private Boolean enabled;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ConsumptionRecord.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ConsumptionRecord.java
new file mode 100644
index 0000000..fd7746d
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ConsumptionRecord.java
@@ -0,0 +1,96 @@
+package com.kidgrow.oprationcenter.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.kidgrow.common.model.BaseModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: <br>
+ * @Project: 运营中心<br>
+ * @CreateDate: Created in 2020-06-23 15:07:14 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("consumption_record")
+public class ConsumptionRecord extends BaseModel {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 上次消费记录id(用于退费,扣费)
+     */
+    @TableId
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+    /**
+     * 上次消费记录id(用于退费,扣费)
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long lastRecordId;
+    /**
+     * 用户充值的套餐id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "用户充值的套餐id不能为空")
+    private Long proOrderDetailId;
+    /**
+     * 调用方业务编号,光片名称
+     */
+    private String businessId;
+    /**
+     * 记录类型
+     * 1:预扣费
+     * 2:退预扣费(需要关联预扣费编号)
+     * 3:退扣费(需要关联扣费编号)
+     * 4:扣费(需要关联预扣费编号)
+     */
+    @NotNull(message = "记录类型不能为空")
+    private Integer recordType;
+    /**
+     * 业务返回结果
+     * bcode                 含义
+     * ---------------------------------
+     * 100                 余额充足
+     * 101                 余额不足
+     * 200                 已经预扣
+     * 201                 已经扣费
+     * 300                 退还预扣
+     * 301                 退还扣费
+     * 400                 义务执行出错
+     * 401                 参数为空异常
+     * 402                 业务失败
+     */
+    @NotEmpty(message = "业务返回结果不能为空")
+    private Integer businessCode;
+    /**
+     * 扣费数量/金额
+     */
+    @NotNull(message = "扣费数量/金额不能为空")
+    private Integer consumptionCount;
+    /**
+     * 创建时间
+     */
+    @NotNull(message = "创建时间不能为空")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /**
+     * 更新时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+}
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
new file mode 100644
index 0000000..64fc544
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DataNeed.java
@@ -0,0 +1,110 @@
+package com.kidgrow.oprationcenter.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.kidgrow.common.model.SuperModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 医生的数据需求<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("data_need")
+public class DataNeed extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 需求类型 0就诊数据 1筛查
+     */
+    @NotNull(message = "需求类型 0就诊数据 1筛查不能为空")
+    private Integer needType;
+    /**
+     * 提需求的医生
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "提需求的医生不能为空")
+    private Long doctorId;
+    /**
+     * 医生姓名
+     */
+    @NotEmpty(message = "医生姓名不能为空")
+    private String doctorName;
+    /**
+     * 医院id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long hospitalId;
+    /**
+     * 医院名称
+     */
+    private String hospitalName;
+    /**
+     * 科室id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long departmentId;
+    /**
+     * 科室名称
+     */
+    private String departmentName;
+    /**
+     * 医生连续方式
+     */
+    private String doctorTel;
+    /**
+     * 需求数据的开始时间
+     */
+    @NotNull(message = "需求数据的开始时间不能为空")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date needBegintime;
+    /**
+     * 需求数据的结束时间
+     */
+    @NotNull(message = "需求数据的结束时间不能为空")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date needEndtime;
+    /**
+     * 需求标签
+     */
+    @NotEmpty(message = "需求标签不能为空")
+    private String needTags;
+    /**
+     * 其他需求标签
+     */
+    private String needDataRemark;
+    /**
+     * 是否删除,1删除(已下载),0未删除(未下载)
+     */
+    private Boolean isDel;
+    /**
+     * 文件路径
+     */
+    private String dataFile;
+    /**
+     * 下载时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date downTime;
+    /**
+     * 状态,1已上传了数据文件,0未处理
+     */
+    private Boolean enabled;
+}
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
new file mode 100644
index 0000000..7f5cad4
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorAnswer.java
@@ -0,0 +1,41 @@
+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;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 医答医生信息表-未完待续<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("doctor_answer")
+public class DoctorAnswer extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
+    private Boolean isDel;
+    /**
+     * 状态,1启用,0停用
+     */
+    @NotEmpty(message = "状态,1启用,0停用不能为空")
+    private Boolean enabled;
+}
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
new file mode 100644
index 0000000..f72a645
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorServer.java
@@ -0,0 +1,53 @@
+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.NotEmpty;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 医生业务服务信息表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("doctor_server")
+public class DoctorServer extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 是否医答医生 0否1是
+     */
+    private Boolean isAnswer;
+    /**
+     * 是否签约医生 0否1是
+     */
+    private Boolean isSigning;
+    /**
+     * 医生状态 1正常 0试用
+     */
+    @NotEmpty(message = "医生状态 1正常 0试用不能为空")
+    private Boolean doctorState;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
+    private Boolean isDel;
+    /**
+     * 状态,1启用,0停用
+     */
+    @NotEmpty(message = "状态,1启用,0停用不能为空")
+    private Boolean enabled;
+}
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
new file mode 100644
index 0000000..3c0f4cd
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorSigning.java
@@ -0,0 +1,40 @@
+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.NotEmpty;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 签约医生信息表-未完待续<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("doctor_signing")
+public class DoctorSigning extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
+    private Boolean isDel;
+    /**
+     * 状态,1启用,0停用
+     */
+    @NotEmpty(message = "状态,1启用,0停用不能为空")
+    private Boolean enabled;
+}
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
new file mode 100644
index 0000000..9849c14
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/DoctorTemplete.java
@@ -0,0 +1,83 @@
+package com.kidgrow.oprationcenter.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.kidgrow.common.model.SuperModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 医生的模板<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("doctor_templete")
+public class DoctorTemplete extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 医院标识id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long hospitalId;
+    /**
+     * 医院名称
+     */
+    private String hospitalName;
+    /**
+     * 科室ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long departmentId;
+    /**
+     * 科室名称
+     */
+    private String departmentName;
+    /**
+     * 医生id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long doctorId;
+    /**
+     * 医生姓名
+     */
+    private String doctorName;
+    /**
+     * 公开类型 0公开 1私有
+     */
+    private Boolean publicType;
+    /**
+     * 模板分类 0结论 1建议  2方案
+     */
+    private Integer templeteType;
+    /**
+     * 模板标题
+     */
+    @NotEmpty(message = "模板标题不能为空")
+    private String templeteTitle;
+    /**
+     * 模板内容
+     */
+    private String templeteNote;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+
+    private Boolean isDel;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean enabled;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/HospitalInfo.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/HospitalInfo.java
new file mode 100644
index 0000000..a54c9cb
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/HospitalInfo.java
@@ -0,0 +1,10 @@
+package com.kidgrow.oprationcenter.model;
+
+import lombok.Data;
+
+@Data
+public class HospitalInfo {
+    private Long hospitalId;
+    private Long departmentId;
+    private String diagnosticId;
+}
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
new file mode 100644
index 0000000..15651e4
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/HospitalScreening.java
@@ -0,0 +1,66 @@
+package com.kidgrow.oprationcenter.model;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.kidgrow.common.model.SuperModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 筛查医院信息表-未完待续<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("hospital_screening")
+public class HospitalScreening extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 医院ID
+     */
+    @NotNull(message = "医院ID不能为空")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long hospitalId;
+    /**
+     * 医院名称
+     */
+    private String hospitalName;
+    /**
+     * 医院logo
+     */
+    private String hospitalLogo;
+    /**
+     * 筛查二维码图片
+     */
+    private String hospitalQrImage;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
+    private Boolean isDel;
+    /**
+     * 租户字段
+     */
+    private String tenantId;
+    /**
+     * 状态,1启用,0停用
+     */
+    @NotEmpty(message = "状态,1启用,0停用不能为空")
+    private Boolean enabled;
+}
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
new file mode 100644
index 0000000..d6bf227
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrder.java
@@ -0,0 +1,93 @@
+package com.kidgrow.oprationcenter.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.kidgrow.common.model.SuperModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 产品的充值记录-订单<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("product_order")
+public class ProductOrder extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 医院标识id
+     */
+    @NotNull(message = "医院标识id不能为空")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long hospitalId;
+    /**
+     * 医院名称
+     */
+    @NotEmpty(message = "医院名称不能为空")
+    private String hospitalName;
+    /**
+     * 科室ID
+     */
+    @NotNull(message = "科室ID不能为空")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long departmentId;
+    /**
+     * 科室名称
+     */
+    @NotEmpty(message = "科室名称不能为空")
+    private String departmentName;
+    /**
+     * 合同编号
+     */
+    @NotEmpty(message = "合同编号不能为空")
+    private String contractNo;
+    /**
+     * 合同名称
+     */
+    @NotEmpty(message = "合同名称不能为空")
+    private String contractTitle;
+    /**
+     * 合同开始时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date contractBeginTime;
+    /**
+     * 合同结束时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date contractEndTime;
+    /**
+     * 合同签订日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date contractTime;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    private Boolean isDel;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean enabled;
+    /**
+     * 创建者的部门
+     */
+    private String createUserOrgCode;
+}
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
new file mode 100644
index 0000000..46ac6c3
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrderDetail.java
@@ -0,0 +1,96 @@
+package com.kidgrow.oprationcenter.model;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.kidgrow.common.model.SuperModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 产品/明显的充值记录<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("product_order_detail")
+public class ProductOrderDetail extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 对应product_order表中的id
+     */
+    @NotEmpty(message = "对应product_order表中的id不能为空")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orderId;
+    /**
+     * 产品/明细ID
+     */
+    @NotEmpty(message = "产品/明细ID不能为空")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long proId;
+    /**
+     * 产品/明细名称
+     */
+    @NotEmpty(message = "产品/明细名称不能为空")
+    private String proName;
+    /**
+     * 产品类型 0试用 1正式
+     */
+    @NotNull(message = "产品类型不能为空")
+    private Integer proType;
+    /**
+     * 是否共享 0否 1是
+     */
+    @NotEmpty(message = "是否共享不能为空")
+    private Boolean isShare;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
+    private Boolean isDel;
+    /**
+     * 读片量
+     */
+    @NotNull(message = "读片量不能为空")
+    private Integer ailightCount;
+    /**
+     * 报告量
+     */
+    @NotNull(message = "报告量不能为空")
+    private Integer recordCount;
+    /**
+     * 有效的开始时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date proBegintime;
+    /**
+     * 有效的结束时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date proEndtime;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean enabled;
+    /**
+     * 创建者的部门
+     */
+    private String createUserOrgCode;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrderRecord.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrderRecord.java
new file mode 100644
index 0000000..7dde074
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/ProductOrderRecord.java
@@ -0,0 +1,96 @@
+package com.kidgrow.oprationcenter.model;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.kidgrow.common.model.SuperModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 产品/明显的充值记录<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("product_order_record")
+public class ProductOrderRecord extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 对应product_order表中的id
+     */
+    @NotNull(message = "对应product_order表中的id不能为空")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orderId;
+    /**
+     * 产品/明细ID
+     */
+    @NotNull(message = "产品/明细ID不能为空")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long proId;
+    /**
+     * 产品/明细名称
+     */
+    @NotEmpty(message = "产品/明细名称不能为空")
+    private String proName;
+    /**
+     * 产品类型 0试用 1正式
+     */
+    @NotNull(message = "产品类型不能为空")
+    private Integer proType;
+    /**
+     * 是否共享 0否 1是
+     */
+    @NotEmpty(message = "是否共享不能为空")
+    private Boolean isShare;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    @NotEmpty(message = "是否删除,1删除,0未删除不能为空")
+    private Boolean isDel;
+    /**
+     * 读片量
+     */
+    @NotNull(message = "读片量不能为空")
+    private Integer ailightCount;
+    /**
+     * 报告量
+     */
+    @NotNull(message = "报告量不能为空")
+    private Integer recordCount;
+    /**
+     * 有效的开始时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date proBegintime;
+    /**
+     * 有效的结束时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date proEndtime;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean enabled;
+    /**
+     * 创建者的部门
+     */
+    private String createUserOrgCode;
+}
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
new file mode 100644
index 0000000..0d72d8c
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysFeedback.java
@@ -0,0 +1,83 @@
+package com.kidgrow.oprationcenter.model;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.kidgrow.common.model.SuperModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: <br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_feedback")
+public class SysFeedback extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 提需求的医生
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "提需求的医生不能为空")
+    private Long doctorId;
+    /**
+     * 医生姓名
+     */
+    @NotEmpty(message = "医生姓名不能为空")
+    private String doctorName;
+    /**
+     * 医生联系方式
+     */
+    private String doctorTel;
+    /**
+     * 科室ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "科室ID不能为空")
+    private Long departmentId;
+    /**
+     * 科室名称
+     */
+    @NotEmpty(message = "科室名称不能为空")
+    private String departmentName;
+    /**
+     * 医院标识id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "医院标识id不能为空")
+    private Long hospitalId;
+    /**
+     * 医院名称
+     */
+    private String hospitalName;
+    /**
+     * 反馈的意见内容
+     */
+    @NotEmpty(message = "反馈的意见内容不能为空")
+    private String feedbackNote;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    private Boolean isDel;
+    /**
+     * 状态,1已查收,0未处理
+     */
+    private Boolean enabled;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysLogger.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysLogger.java
new file mode 100644
index 0000000..87c1777
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysLogger.java
@@ -0,0 +1,65 @@
+package com.kidgrow.oprationcenter.model;
+
+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;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: <br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_logger")
+public class SysLogger extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 应用名
+     */
+    private String applicationName;
+    /**
+     * 类名
+     */
+    @NotEmpty(message = "类名不能为空")
+    private String className;
+    /**
+     * 方法名
+     */
+    @NotEmpty(message = "方法名不能为空")
+    private String methodName;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 用户名
+     */
+    private String userName;
+    /**
+     * 租户id
+     */
+    private String clientId;
+    /**
+     * 操作信息
+     */
+    @NotEmpty(message = "操作信息不能为空")
+    private String operation;
+    /**
+     * 创建时间
+     */
+    @NotEmpty(message = "创建时间不能为空")
+    private String timestamp;
+}
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
new file mode 100644
index 0000000..aa7327d
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/model/SysProduct.java
@@ -0,0 +1,98 @@
+package com.kidgrow.oprationcenter.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.kidgrow.common.model.SuperModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: <br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_product")
+public class SysProduct extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 产品名称
+     */
+    @NotEmpty(message = "产品名称不能为空")
+    private String proName;
+    /**
+     * 时长(天)
+     */
+    @NotNull(message = "时长不能为空")
+    private Integer proTime;
+    /**
+     * 时长单位
+     */
+    @NotNull(message = "时长单位不能为空")
+    private Integer proTimeUnit;
+    /**
+     * 产品类型 0试用 1正式
+     */
+    @NotNull(message = "产品类型 0试用 1正式不能为空")
+    private Integer proType;
+    /**
+     * 建议售价
+     */
+    @NotNull(message = "建议售价不能为空")
+    private BigDecimal proPrice;
+    /**
+     * 报告量
+     */
+    @NotNull(message = "报告量不能为空")
+    private Integer recordCount;
+    /**
+     * 读片量
+     */
+    @NotNull(message = "读片量不能为空")
+    private Integer ailightCount;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    private Boolean isDel;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean enabled;
+//    /**
+//     * 产品结束时间-供前端使用
+//     */
+//    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+//    private Date endTime;
+//    /**
+//     * 产品结束时间-供前端使用
+//     */
+//    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+//    @TableField(exist = false)
+//    private Date beginTime;
+//    /**
+//     * 共享,1是,0不
+//     */
+//    private Boolean isShare;
+    /**
+     * 创建者的部门
+     */
+    private String createUserOrgCode;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/test.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/test.java
new file mode 100644
index 0000000..45aa41d
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/test.java
@@ -0,0 +1,12 @@
+package com.kidgrow.oprationcenter;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/4/1 10:14 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class test {
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionRequest.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionRequest.java
new file mode 100644
index 0000000..f5f534f
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionRequest.java
@@ -0,0 +1,42 @@
+package com.kidgrow.oprationcenter.vo;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: <br>
+ * @Project: 运营中心<br>
+ * @CreateDate: Created in 2020-06-23 15:07:14 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ * @version 1.0
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ConsumptionRequest extends Model<ConsumptionRequest> {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 医院ID
+     */
+    private Long hospitalId;
+    /**
+     * 科室ID
+     */
+    private Long departmentId;
+    /**
+     * 医生ID
+     */
+    private Long doctorId;
+    /**
+     * 调用方业务编号,光片编号
+     */
+    private String businessId;
+    /**
+     * 实际变动数量
+     */
+    private int consumptionCount;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionVo.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionVo.java
new file mode 100644
index 0000000..d8c7a5b
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ConsumptionVo.java
@@ -0,0 +1,48 @@
+package com.kidgrow.oprationcenter.vo;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/06/24 11:01 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ConsumptionVo extends Model<ConsumptionVo> {
+    //实体序列化  必要
+    private static final long serialVersionUID = 1L;
+    /**
+     * 业务执行返回码
+     * 100                 余额充足
+     * 101                 余额不足
+     * 200                 已经预扣         (包括预扣费并写了记录,检查已经预扣费)
+     * 201                 已经扣费         (包括扣费并写了记录,检查已经扣费)
+     * 300                 退还预扣
+     * 301                 退还扣费
+     * 400                 业务执行出错
+     */
+    private int bcode;
+    /**
+     * 调用方业务编号,光片编号
+     */
+    private String businessId;
+    /**
+     * 实际变动数量
+     */
+    private int consumptionCount;
+    /**
+     * 记录类型
+     * 1:预扣费
+     * 2:退预扣费(需要关联预扣费编号)
+     * 3:退扣费(需要关联扣费编号)
+     * 4:扣费(需要关联预扣费编号)
+     */
+    private int recordType;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/DataNeedExcel.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/DataNeedExcel.java
new file mode 100644
index 0000000..ed91110
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/DataNeedExcel.java
@@ -0,0 +1,64 @@
+package com.kidgrow.oprationcenter.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.kidgrow.common.constant.CommonConstant;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 数据需求导出<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/13 15:36 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+public class DataNeedExcel implements Serializable {
+    private static final long serialVersionUID = -5886012896705137070L;
+
+    @Excel(name = "需求类型", height = 20,replace = { "就诊_0", "筛查_1" }, width = 30, isImportField = "true_st")
+    private Integer needType;
+
+    @Excel(name = "需求类型", height = 20, width = 30, isImportField = "true_st")
+    private Long doctorId;
+
+    @Excel(name = "医生姓名", height = 20, width = 30, isImportField = "true_st")
+    private String doctorName;
+
+    @Excel(name = "医院名称", height = 20, width = 30, isImportField = "true_st")
+    private String hospitalName;
+
+    @Excel(name = "科室名称", isImportField = "true_st" , width = 20)
+    private Integer departmentName;
+
+    @Excel(name = "医生联系方式", isImportField = "true_st" , width = 20)
+    private String doctorTel;
+
+    @Excel(name = "需求数据的开始时间不能为空", format = CommonConstant.DATETIME_FORMAT, isImportField = "true_st", width = 20)
+    private Date needBegintime;
+
+    @Excel(name = "需求数据的结束时间不能为空", format = CommonConstant.DATETIME_FORMAT, isImportField = "true_st", width = 20)
+    private Date needEndtime;
+
+    @Excel(name = "需求标签", isImportField = "true_st" , width = 20)
+    private String needTags;
+
+    /**
+     * 是否删除,1删除(已下载),0未删除(未下载)
+     */
+    @Excel(name = "是否删除", isImportField = "true_st" ,replace = { "删除_true", "未删除_false" }, width = 20)
+    private Boolean isDel;
+
+    @Excel(name = "文件路径", isImportField = "true_st" , width = 20)
+    private String dataFile;
+
+    @Excel(name = "下载时间", format = CommonConstant.DATETIME_FORMAT, isImportField = "true_st", width = 20)
+    private Date downTime;
+
+    @Excel(name = "需求类型", height = 20,replace = { "已上传_true", "未处理_false" }, width = 30, isImportField = "true_st")
+    private Boolean enabled;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/DiagnosisRecord.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/DiagnosisRecord.java
new file mode 100644
index 0000000..1adbb32
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/DiagnosisRecord.java
@@ -0,0 +1,70 @@
+package com.kidgrow.oprationcenter.vo;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/04/27 11:01 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ */
+public class DiagnosisRecord extends Model<DiagnosisRecord> {
+    //实体序列化  必要
+    private static final long serialVersionUID = 1L;
+    /**
+     *诊断记录id
+     */
+    private  String diagnosticId;
+    /**
+     *诊断医院名称
+     */
+    private String diagnosticHospitalName;
+    /**
+     *诊断门诊名称
+     */
+    private String diagnosticDepartName;
+    /**
+     *诊断医生名称
+     */
+    private String diagnosticDoctorName;
+    /**
+     *诊断孩子名称
+     */
+    private String childName;
+    /**
+     *诊断孩子性别
+     */
+    private Integer childSex;
+    /**
+     *诊断孩子出生日期
+     */
+    private Date childBirthday;
+    /**
+     *是否删除
+     */
+    private Boolean isDeleted;
+    /**
+     *诊断孩子的联系方式
+     */
+    private String childPhone;
+    /**
+     * 诊断时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date diagnosticDiagnoseTime;
+    /**
+     * 诊断创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
+    private Date createTime;
+    /**
+     * 诊断更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
+    private Date updateTime;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/GroupProductDetail.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/GroupProductDetail.java
new file mode 100644
index 0000000..acdc134
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/GroupProductDetail.java
@@ -0,0 +1,30 @@
+package com.kidgrow.oprationcenter.vo;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/04/13 10:28 <br>
+ * @Author: <a href="411269194@kidgrow.com">liuke</a>
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class GroupProductDetail extends Model<GroupProductDetail> {
+    //实体序列化  必要
+    private static final long serialVersionUID = 1L;
+    /**
+     * 产品数量
+     */
+    private Long proCount;
+    /**
+     * 产品/明细名称
+     */
+    private String proName;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/OrderChartVo.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/OrderChartVo.java
new file mode 100644
index 0000000..6951c61
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/OrderChartVo.java
@@ -0,0 +1,33 @@
+package com.kidgrow.oprationcenter.vo;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/06/24 11:01 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class OrderChartVo extends Model<OrderChartVo> {
+    //实体序列化  必要
+    private static final long serialVersionUID = 1L;
+    /**
+     * 统计的数量
+     */
+    private Integer ccount;
+    /**
+     * 统计的单位   具体就是 年  月  日  周  之类的
+     * 2020/4
+     * 4
+     * 25
+     * 2
+     */
+    private String units;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ProductAllVo.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ProductAllVo.java
new file mode 100644
index 0000000..a7b782c
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ProductAllVo.java
@@ -0,0 +1,62 @@
+package com.kidgrow.oprationcenter.vo;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProductAllVo extends Model<ProductAllVo> {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 产品id
+     */
+    private Long Id;
+    /**
+     * 产品名称
+     */
+    private String proName;
+    /**
+     * 时长(天)
+     */
+    private Integer proTime;
+    /**
+     * 时长单位
+     */
+    private Integer proTimeUnit;
+    /**
+     * 产品类型 0试用 1正式
+     */
+    private Integer proType;
+    /**
+     * 建议售价
+     */
+    private BigDecimal proPrice;
+    /**
+     * 报告量
+     */
+    private Integer recordCount;
+    /**
+     * 读片量
+     */
+    private Integer ailightCount;
+    /**
+     * 产品结束时间-供前端使用
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date endTime;
+    /**
+     * 产品结束时间-供前端使用
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date beginTime;
+    /**
+     * 共享,1是,0不
+     */
+    private Boolean isShare;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ProductOrderDetailVo.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ProductOrderDetailVo.java
new file mode 100644
index 0000000..a019c10
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ProductOrderDetailVo.java
@@ -0,0 +1,12 @@
+package com.kidgrow.oprationcenter.vo;
+
+import com.kidgrow.oprationcenter.model.ProductOrderDetail;
+import lombok.Data;
+
+@Data
+public class ProductOrderDetailVo extends ProductOrderDetail {
+    private String hospitalName;
+    private Long hospitalId;
+    private String departmentName;
+    private Long departmentId;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ProductOrderJoinDetail.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ProductOrderJoinDetail.java
new file mode 100644
index 0000000..4722ff4
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/ProductOrderJoinDetail.java
@@ -0,0 +1,113 @@
+package com.kidgrow.oprationcenter.vo;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/04/10 18:38 <br>
+ * @Author: <a href="411269194@kidgrow.com">liuke</a>
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ProductOrderJoinDetail extends Model<ProductOrderJoinDetail> {
+    //实体序列化  必要
+    private static final long serialVersionUID = 1L;
+    /**
+     * 对应product_order_detail表中的id
+     */
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+    /**
+     * 对应product_order表中的id
+     */
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orderId;
+    /**
+     * 产品/明细ID
+     */
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long proId;
+    /**
+     * 产品类型
+     */
+    private Integer proType;
+    /**
+     * 产品/明细名称
+     */
+    private String proName;
+    /**
+     * 医院id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long hospitalId;
+    /**
+     * 医院名称
+     */
+    private String hospitalName;
+    /**
+     * 科室id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long departmentId;
+    /**
+     * 科室名称
+     */
+    private String departmentName;
+    /**
+     * 是否共享 0否 1是
+     */
+    private Boolean isShare;
+    /**
+     * 读片量
+     */
+    private Integer ailightCount;
+    /**
+     * 报告量
+     */
+    private Integer recordCount;
+    /**
+     * 有效的开始时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date proBegintime;
+    /**
+     * 有效的结束时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date proEndtime;
+    /**
+     *创建时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    private Boolean isDel;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean enabled;
+
+    /**
+     * 使用状态
+     */
+    private String useType;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/UserProductData.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/UserProductData.java
new file mode 100644
index 0000000..59f6b2d
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/UserProductData.java
@@ -0,0 +1,30 @@
+package com.kidgrow.oprationcenter.vo;
+
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserProductData extends Model<UserProductData> {
+private static final long serialVersionUID = 1L;
+    /**
+     * 套餐是否到期
+     */
+    private Boolean isEnd;
+    /**
+     * 剩余天数
+     */
+    private Integer limitDays;
+    /**
+     * 读片量
+     */
+    private Integer ailightCount;
+    /**
+     * 报告量
+     */
+    private Integer recordCount;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/UserProductDetail.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/UserProductDetail.java
new file mode 100644
index 0000000..5595f12
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-api/src/main/java/com/kidgrow/oprationcenter/vo/UserProductDetail.java
@@ -0,0 +1,28 @@
+package com.kidgrow.oprationcenter.vo;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/04/27 11:01 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ * **/
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserProductDetail extends Model<UserProductDetail> {
+    //实体序列化  必要
+    private static final long serialVersionUID = 1L;
+    //共享套餐列表
+    List<ProductOrderJoinDetail> productOrderJoinDetailListShare;
+    //私有套餐列表
+    List<ProductOrderJoinDetail> productOrderJoinDetailsListDep;
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/pom.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/pom.xml
new file mode 100644
index 0000000..9c25797
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/pom.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kidgrow-opration-center</artifactId>
+        <groupId>com.kidgrow</groupId>
+        <version>1.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kidgrow-opration-center-biz</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-opration-center-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-usercenter-api</artifactId>
+        </dependency>
+        <!-- 消息总线rabbitMQ -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/BusinessRecordsMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/BusinessRecordsMapper.java
new file mode 100644
index 0000000..4d91f6e
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/BusinessRecordsMapper.java
@@ -0,0 +1,34 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.kidgrow.oprationcenter.model.BusinessRecords;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 业务操作记录<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface BusinessRecordsMapper extends SuperMapper<BusinessRecords> {
+    /**
+     * 分页查询业务操作记录列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<BusinessRecords> findList(Page<BusinessRecords> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据BusinessRecords对象当做查询条件进行查询
+     * @param
+     * @return BusinessRecords对象
+     */
+    BusinessRecords findByObject(@Param("p") BusinessRecords businessRecords);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/BusinessServerMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/BusinessServerMapper.java
new file mode 100644
index 0000000..7139ba8
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/BusinessServerMapper.java
@@ -0,0 +1,34 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.kidgrow.oprationcenter.model.BusinessServer;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医院服务信息表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface BusinessServerMapper extends SuperMapper<BusinessServer> {
+    /**
+     * 分页查询医院服务信息表列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<BusinessServer> findList(Page<BusinessServer> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据BusinessServer对象当做查询条件进行查询
+     * @param
+     * @return BusinessServer对象
+     */
+    BusinessServer findByObject(@Param("p") BusinessServer businessServer);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ConsumptionRecordMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ConsumptionRecordMapper.java
new file mode 100644
index 0000000..4d3c16e
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ConsumptionRecordMapper.java
@@ -0,0 +1,46 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.kidgrow.oprationcenter.model.ConsumptionRecord;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: <br>
+ * @Project: 运营中心<br>
+ * @CreateDate: Created in 2020-06-23 15:07:14 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ * @version 1.0
+ */
+public interface ConsumptionRecordMapper extends SuperMapper<ConsumptionRecord> {
+    /**
+     * 分页查询列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<ConsumptionRecord> findList(Page<ConsumptionRecord> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据ConsumptionRecord对象当做查询条件进行查询
+     * @param
+     * @return ConsumptionRecord对象
+     */
+    ConsumptionRecord findByObject(@Param("p") ConsumptionRecord consumptionRecord);
+    /**
+     * 查询列表
+     * @param params
+     * @return
+     */
+    List<ConsumptionRecord> findList(@Param("p") Map<String, Object> params);
+    /**
+     * 查询有效预扣费
+     * @param DetailList 有效的套餐
+     * @return
+     */
+    List<ConsumptionRecord> findDetailList(@Param("DetailList") List<Long> DetailList);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DataNeedMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DataNeedMapper.java
new file mode 100644
index 0000000..7be71b1
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DataNeedMapper.java
@@ -0,0 +1,40 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.kidgrow.oprationcenter.model.DataNeed;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医生的数据需求<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface DataNeedMapper extends SuperMapper<DataNeed> {
+    /**
+     * 分页查询医生的数据需求列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<DataNeed> findList(Page<DataNeed> page, @Param("p") Map<String, Object> params);
+    /**
+     * 查询医生的数据需求列表 不分页
+     * @param params
+     * @return
+     */
+    List<DataNeed> findHList(@Param("p") Map<String, Object> params);
+
+    /**
+     * 根据DataNeed对象当做查询条件进行查询
+     * @param
+     * @return DataNeed对象
+     */
+    DataNeed findByObject(@Param("p") DataNeed dataNeed);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorAnswerMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorAnswerMapper.java
new file mode 100644
index 0000000..a37fa24
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorAnswerMapper.java
@@ -0,0 +1,34 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.kidgrow.oprationcenter.model.DoctorAnswer;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医答医生信息表-未完待续<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface DoctorAnswerMapper extends SuperMapper<DoctorAnswer> {
+    /**
+     * 分页查询医答医生信息表-未完待续列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<DoctorAnswer> findList(Page<DoctorAnswer> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据DoctorAnswer对象当做查询条件进行查询
+     * @param
+     * @return DoctorAnswer对象
+     */
+    DoctorAnswer findByObject(@Param("p") DoctorAnswer doctorAnswer);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorServerMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorServerMapper.java
new file mode 100644
index 0000000..8932136
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorServerMapper.java
@@ -0,0 +1,34 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.kidgrow.oprationcenter.model.DoctorServer;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医生业务服务信息表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface DoctorServerMapper extends SuperMapper<DoctorServer> {
+    /**
+     * 分页查询医生业务服务信息表列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<DoctorServer> findList(Page<DoctorServer> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据DoctorServer对象当做查询条件进行查询
+     * @param
+     * @return DoctorServer对象
+     */
+    DoctorServer findByObject(@Param("p") DoctorServer doctorServer);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorSigningMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorSigningMapper.java
new file mode 100644
index 0000000..6359806
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorSigningMapper.java
@@ -0,0 +1,34 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.kidgrow.oprationcenter.model.DoctorSigning;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 签约医生信息表-未完待续<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface DoctorSigningMapper extends SuperMapper<DoctorSigning> {
+    /**
+     * 分页查询签约医生信息表-未完待续列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<DoctorSigning> findList(Page<DoctorSigning> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据DoctorSigning对象当做查询条件进行查询
+     * @param
+     * @return DoctorSigning对象
+     */
+    DoctorSigning findByObject(@Param("p") DoctorSigning doctorSigning);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorTempleteMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorTempleteMapper.java
new file mode 100644
index 0000000..031ae38
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/DoctorTempleteMapper.java
@@ -0,0 +1,41 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.kidgrow.oprationcenter.model.DoctorTemplete;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医生的模板<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface DoctorTempleteMapper extends SuperMapper<DoctorTemplete> {
+    /**
+     * 分页查询医生的模板列表
+     * @param page
+     * @param params
+     * @returnfindDoctorList
+     */
+    List<DoctorTemplete> findList(Page<DoctorTemplete> page, @Param("p") Map<String, Object> params);
+    /**
+     * 分页查询医生的模板列表
+     * @param page
+     * @param params
+     * @returnfindDoctorList
+     */
+    List<DoctorTemplete> findDoctorList(Page<DoctorTemplete> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据DoctorTemplete对象当做查询条件进行查询
+     * @param
+     * @return DoctorTemplete对象
+     */
+    DoctorTemplete findByObject(@Param("p") DoctorTemplete doctorTemplete);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/HospitalScreeningMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/HospitalScreeningMapper.java
new file mode 100644
index 0000000..333a80f
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/HospitalScreeningMapper.java
@@ -0,0 +1,34 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.kidgrow.oprationcenter.model.HospitalScreening;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 筛查医院信息表-未完待续<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface HospitalScreeningMapper extends SuperMapper<HospitalScreening> {
+    /**
+     * 分页查询筛查医院信息表-未完待续列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<HospitalScreening> findList(Page<HospitalScreening> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据HospitalScreening对象当做查询条件进行查询
+     * @param
+     * @return HospitalScreening对象
+     */
+    HospitalScreening findByObject(@Param("p") HospitalScreening hospitalScreening);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ProductOrderDetailMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ProductOrderDetailMapper.java
new file mode 100644
index 0000000..10d516e
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ProductOrderDetailMapper.java
@@ -0,0 +1,96 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.kidgrow.oprationcenter.model.ProductOrderDetail;
+import com.kidgrow.oprationcenter.vo.GroupProductDetail;
+import com.kidgrow.oprationcenter.vo.OrderChartVo;
+import com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 产品/明显的充值记录<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface ProductOrderDetailMapper extends SuperMapper<ProductOrderDetail> {
+    /**
+     * 分页查询产品/明显的充值记录列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<ProductOrderDetail> findList(Page<ProductOrderDetail> page, @Param("p") Map<String, Object> params);
+    /**
+     * 查询产品/明显的充值记录列表
+     * @param params
+     * @return
+     */
+    List<ProductOrderJoinDetail> findAllList(@Param("p") Map<String, Object> params);
+    /**
+     * 根据ProductOrderDetail对象当做查询条件进行查询
+     * @param
+     * @return ProductOrderDetail对象
+     */
+    ProductOrderDetail findByObject(@Param("p") ProductOrderDetail productOrderDetail);/**
+     * 统计产品使用量
+     * @param
+     * @return ProductOrderDetail对象
+     */
+    List<GroupProductDetail> groupProductDetail(Page<GroupProductDetail> page, @Param("p") Map<String, Object> params);
+
+    List<ProductOrderJoinDetail> getTypeByUser(Long id);
+
+    /**
+     * 获取一个科室的试用套餐数量
+     * @param departmentId
+     * @return
+     */
+    int getEnabledCount(Long departmentId);
+
+    /**
+     * 统计获取数据量
+     * @param datatype
+     * 0 试用审核量
+     * 1 套餐总量
+     * 2 未处理用户反馈
+     * 3 未处理数据需求
+     * @return
+     */
+    int oprationChart(@Param("datatype") int datatype);
+
+    /**
+     * 按指定类型统计合同数量
+     * @param params
+     *    datatype     1 按年
+     *                 2 按月
+     *                 3 按天
+     *                 4 按周
+     *    beginTime 查询时间段的开始时间
+     *    endTime   结束时间
+     * @return
+     */
+    List<OrderChartVo> productOrderChart(@Param("p") Map<String, Object> params);
+
+    /**
+     * 统计产品的使用数量
+     * @return  ccount 是数量
+     *          units 是产品名称
+     */
+    List<OrderChartVo> proCountChart();
+
+    /**
+     *获取该科室下的所有的套餐信息
+     *获取该科室下的所有的套餐信息
+     * @param hospitalId
+     * @param departmentId
+     * @return
+     */
+    List<ProductOrderDetail> departmentProductDetail(Page<ProductOrderDetail> page,@Param("hospitalId") Long hospitalId,@Param("departmentId") Long departmentId);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ProductOrderMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ProductOrderMapper.java
new file mode 100644
index 0000000..a4119be
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ProductOrderMapper.java
@@ -0,0 +1,41 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.kidgrow.oprationcenter.model.ProductOrder;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 产品的充值记录-订单<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface ProductOrderMapper extends SuperMapper<ProductOrder> {
+    /**
+     * 分页查询产品的充值记录-订单列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<ProductOrder> findList(Page<ProductOrder> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据ProductOrder对象当做查询条件进行查询
+     * @param
+     * @return ProductOrder对象
+     */
+    ProductOrder findByObject(@Param("p") ProductOrder productOrder);
+
+    /**
+     * 删除指定orderid下的套餐数据
+     * @param orderId
+     * @return
+     */
+    int delProductDetail(@Param("orderId") Long orderId);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ProductOrderRecordMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ProductOrderRecordMapper.java
new file mode 100644
index 0000000..7eb3c10
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/ProductOrderRecordMapper.java
@@ -0,0 +1,49 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.kidgrow.oprationcenter.model.ProductOrderRecord;
+import com.kidgrow.oprationcenter.vo.GroupProductDetail;
+import com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 产品/明显的充值记录<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface ProductOrderRecordMapper extends SuperMapper<ProductOrderRecord> {
+    /**
+     * 分页查询产品/明显的充值记录列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<ProductOrderRecord> findList(Page<ProductOrderRecord> page, @Param("p") Map<String, Object> params);
+    /**
+     * 分页查询产品/明显的充值记录列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<ProductOrderJoinDetail> findAllList(Page<ProductOrderJoinDetail> page, @Param("p") Map<String, Object> params);
+    /**
+     * 根据ProductOrderDetail对象当做查询条件进行查询
+     * @param
+     * @return ProductOrderDetail对象
+     */
+    ProductOrderRecord findByObject(@Param("p") ProductOrderRecord productOrderDetail);/**
+     * 统计产品使用量
+     * @param
+     * @return ProductOrderDetail对象
+     */
+    List<GroupProductDetail> groupProductDetail(Page<GroupProductDetail> page, @Param("p") Map<String, Object> params);
+
+    List<ProductOrderJoinDetail> getTypeByUser(Long id);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/SysFeedbackMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/SysFeedbackMapper.java
new file mode 100644
index 0000000..5d29628
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/SysFeedbackMapper.java
@@ -0,0 +1,34 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.kidgrow.oprationcenter.model.SysFeedback;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: <br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface SysFeedbackMapper extends SuperMapper<SysFeedback> {
+    /**
+     * 分页查询列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<SysFeedback> findList(Page<SysFeedback> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据SysFeedback对象当做查询条件进行查询
+     * @param
+     * @return SysFeedback对象
+     */
+    SysFeedback findByObject(@Param("p") SysFeedback sysFeedback);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/SysLoggerMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/SysLoggerMapper.java
new file mode 100644
index 0000000..5d8c66d
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/SysLoggerMapper.java
@@ -0,0 +1,34 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.kidgrow.oprationcenter.model.SysLogger;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: <br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface SysLoggerMapper extends SuperMapper<SysLogger> {
+    /**
+     * 分页查询列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<SysLogger> findList(Page<SysLogger> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据SysLogger对象当做查询条件进行查询
+     * @param
+     * @return SysLogger对象
+     */
+    SysLogger findByObject(@Param("p") SysLogger sysLogger);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/SysProductMapper.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/SysProductMapper.java
new file mode 100644
index 0000000..bef3be5
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/mapper/SysProductMapper.java
@@ -0,0 +1,36 @@
+package com.kidgrow.oprationcenter.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.kidgrow.oprationcenter.model.SysProduct;
+import com.kidgrow.oprationcenter.vo.ProductAllVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: <br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface SysProductMapper extends SuperMapper<SysProduct> {
+    /**
+     * 分页查询列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<SysProduct> findList(Page<SysProduct> page, @Param("p") Map<String, Object> params);
+    List<ProductAllVo> findAllList(@Param("p") Map<String, Object> params);
+
+    /**
+     * 根据SysProduct对象当做查询条件进行查询
+     * @param
+     * @return SysProduct对象
+     */
+    SysProduct findByObject(@Param("p") SysProduct sysProduct);
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IBusinessRecordsService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IBusinessRecordsService.java
new file mode 100644
index 0000000..bb3b514
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IBusinessRecordsService.java
@@ -0,0 +1,41 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+import com.kidgrow.oprationcenter.model.BusinessRecords;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 业务操作记录<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface IBusinessRecordsService extends ISuperService<BusinessRecords> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<BusinessRecords> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据BusinessRecords对象当做查询条件进行查询
+    * @param businessRecords
+    * @return BusinessRecords对象
+    */
+    BusinessRecords findByObject(BusinessRecords businessRecords);
+
+    /**
+     * 写入系统业务日志
+     * @param recordTitle 日志标题
+     * @param recordNote 日志内容
+     * @return
+     */
+    boolean recordBusinessData(String  recordTitle, String recordNote);
+}
+
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IBusinessServerService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IBusinessServerService.java
new file mode 100644
index 0000000..eef5868
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IBusinessServerService.java
@@ -0,0 +1,33 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.oprationcenter.model.BusinessServer;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医院服务信息表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface IBusinessServerService extends ISuperService<BusinessServer> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<BusinessServer> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据BusinessServer对象当做查询条件进行查询
+    * @param businessServer
+    * @return BusinessServer对象
+    */
+    BusinessServer findByObject(BusinessServer businessServer);
+}
+
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IConsumptionRecordService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IConsumptionRecordService.java
new file mode 100644
index 0000000..ddc9003
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IConsumptionRecordService.java
@@ -0,0 +1,67 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.service.ISuperService;
+import com.kidgrow.oprationcenter.model.ConsumptionRecord;
+import com.kidgrow.oprationcenter.vo.ConsumptionRequest;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: <br>
+ * @Project: 运营中心<br>
+ * @CreateDate: Created in 2020-06-23 15:07:14 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ * @version 1.0
+ */
+public interface IConsumptionRecordService extends ISuperService<ConsumptionRecord> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<ConsumptionRecord> findList(Map<String, Object> params);
+
+    /**
+     * 自定义条件查询所有的列表
+     * @param params
+     * @return
+     */
+    List<ConsumptionRecord> findAllList(Map<String, Object> params);
+
+
+    /**
+    * 根据ConsumptionRecord对象当做查询条件进行查询
+    * @param consumptionRecord
+    * @return ConsumptionRecord对象
+    */
+    ConsumptionRecord findByObject(ConsumptionRecord consumptionRecord);
+
+    /**
+     * 要让AI读片-调用
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    ResultBody consumptionAIStart(ConsumptionRequest consumptionRequest);
+    /**
+     * AI返回结果-调用
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    ResultBody consumptionAIReturn(ConsumptionRequest consumptionRequest);
+    /**
+     * AI拒读/失败通知-调用
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    ResultBody consumptionAIFail(ConsumptionRequest consumptionRequest);
+    /**
+     * 发起人工读片-调用
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    ResultBody consumptionArtificial(ConsumptionRequest consumptionRequest);
+}
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDataNeedService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDataNeedService.java
new file mode 100644
index 0000000..3f3fa94
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDataNeedService.java
@@ -0,0 +1,61 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.oprationcenter.model.DataNeed;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+import com.kidgrow.oprationcenter.vo.DataNeedExcel;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医生的数据需求<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface IDataNeedService extends ISuperService<DataNeed> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<DataNeed> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据DataNeed对象当做查询条件进行查询
+    * @param dataNeed
+    * @return DataNeed对象
+    */
+    DataNeed findByObject(DataNeed dataNeed);
+
+    /**
+     * 导出
+     * @param params
+     * @return
+     */
+    List<DataNeedExcel> findListExportByParam(Map<String, Object> params);
+
+    /**
+     *更新状态和文件地址
+     */
+    ResultBody updateEnabled(Map<String, Object> map);
+
+    /**
+     * 用户点击下载后,下载成功需要调用这个接口更新状态
+     * @param id
+     * @return
+     */
+    ResultBody updateDelete(Long id, SysUser sysUser);
+    /**
+     *获取某个医院的所有需求数据
+     */
+    ResultBody FindAllByHId(Map<String, Object> map, SysUser sysUser);
+
+}
+
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorAnswerService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorAnswerService.java
new file mode 100644
index 0000000..6495d2f
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorAnswerService.java
@@ -0,0 +1,33 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.oprationcenter.model.DoctorAnswer;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医答医生信息表-未完待续<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface IDoctorAnswerService extends ISuperService<DoctorAnswer> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<DoctorAnswer> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据DoctorAnswer对象当做查询条件进行查询
+    * @param doctorAnswer
+    * @return DoctorAnswer对象
+    */
+    DoctorAnswer findByObject(DoctorAnswer doctorAnswer);
+}
+
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorServerService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorServerService.java
new file mode 100644
index 0000000..b30d1ab
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorServerService.java
@@ -0,0 +1,33 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.oprationcenter.model.DoctorServer;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医生业务服务信息表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface IDoctorServerService extends ISuperService<DoctorServer> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<DoctorServer> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据DoctorServer对象当做查询条件进行查询
+    * @param doctorServer
+    * @return DoctorServer对象
+    */
+    DoctorServer findByObject(DoctorServer doctorServer);
+}
+
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorSigningService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorSigningService.java
new file mode 100644
index 0000000..15a3c4d
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorSigningService.java
@@ -0,0 +1,33 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.oprationcenter.model.DoctorSigning;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 签约医生信息表-未完待续<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface IDoctorSigningService extends ISuperService<DoctorSigning> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<DoctorSigning> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据DoctorSigning对象当做查询条件进行查询
+    * @param doctorSigning
+    * @return DoctorSigning对象
+    */
+    DoctorSigning findByObject(DoctorSigning doctorSigning);
+}
+
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorTempleteService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorTempleteService.java
new file mode 100644
index 0000000..7285034
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IDoctorTempleteService.java
@@ -0,0 +1,41 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.model.DoctorTemplete;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医生的模板<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface IDoctorTempleteService extends ISuperService<DoctorTemplete> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult findList(Map<String, Object> params);
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult findDoctorList(Map<String, Object> params);
+
+    /**
+    * 根据DoctorTemplete对象当做查询条件进行查询
+    * @param doctorTemplete
+    * @return DoctorTemplete对象
+    */
+    DoctorTemplete findByObject(DoctorTemplete doctorTemplete);
+
+    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/IHospitalScreeningService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IHospitalScreeningService.java
new file mode 100644
index 0000000..7f1646f
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IHospitalScreeningService.java
@@ -0,0 +1,33 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.oprationcenter.model.HospitalScreening;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 筛查医院信息表-未完待续<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface IHospitalScreeningService extends ISuperService<HospitalScreening> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<HospitalScreening> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据HospitalScreening对象当做查询条件进行查询
+    * @param hospitalScreening
+    * @return HospitalScreening对象
+    */
+    HospitalScreening findByObject(HospitalScreening hospitalScreening);
+}
+
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderDetailService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderDetailService.java
new file mode 100644
index 0000000..a4569b7
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderDetailService.java
@@ -0,0 +1,135 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.common.service.ISuperService;
+import com.kidgrow.oprationcenter.model.ProductOrderDetail;
+import com.kidgrow.oprationcenter.vo.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 产品/明显的充值记录<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface IProductOrderDetailService extends ISuperService<ProductOrderDetail> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<ProductOrderDetail> findList(Map<String, Object> params);
+
+    /**
+     * 诊断列表
+     * @param params
+     * @return
+     */
+    PageResult<DiagnosisRecord> findAllDataList(Map<String, Object> params);
+    /**
+     * 统计产品使用量列表
+     * @param params
+     * @return
+     */
+    PageResult<GroupProductDetail> groupList(Map<String, Object> params);
+
+    /**
+    * 根据ProductOrderDetail对象当做查询条件进行查询
+    * @param productOrderDetail
+    * @return ProductOrderDetail对象
+    */
+    ProductOrderDetail findByObject(ProductOrderDetail productOrderDetail);
+    /**
+     * 状态变更
+     * @param params
+     * @return
+     */
+    ResultBody updateEnabled(Map<String, Object> params);
+
+    ResultBody getTypeByUser(SysUser sysUser);
+    /**
+     * 获取所有的套餐记录数据
+     * @param params
+     * @return
+     */
+    List<ProductOrderJoinDetail> findAllList(Map<String, Object> params);
+    /**
+     * 获取医院的套餐数据
+     * @param hospitalId
+     * @param departmentId
+     * @return
+     */
+    UserProductDetail getUserProductDetail(Long hospitalId, Long departmentId);
+
+    /**
+     *
+     * @param hospitalId
+     * @param departmentId
+     * @return
+     */
+    ResultBody biUserNowProduct(Long hospitalId,Long departmentId);
+
+    /**
+     * 获取医院的到期时间
+     * @param hospitalId
+     * @param departmentId
+     * @param diagnosticId
+     * @return
+     */
+    ResultBody<UserProductData> userProductDetailData(Long hospitalId, Long departmentId,String diagnosticId);
+
+    /**
+     * 试用审核的列表
+     * @param params
+     * @return
+     */
+    PageResult all(Map<String, Object> params);
+
+    /**
+     * 获取一个科室使用过多少个试用套餐
+     * @param departmentId
+     * @return
+     */
+    int getEnabledCount(Long departmentId);
+    /**
+     * 统计获取数据量
+     * @param datatype
+     * 0 试用审核量
+     * 1 套餐总量
+     * 2 未处理用户反馈
+     * 3 未处理数据需求
+     * @return
+     */
+    int oprationChart(int datatype);
+    /**
+     * 按指定类型统计合同数量
+     * @param params
+     *    datatype      1 按年
+     *                 2 按月
+     *                 3 按天
+     *                 4 按周
+     *    beginTime 查询时间段的开始时间
+     *    endTime   结束时间
+     * @return
+     */
+    List<OrderChartVo> productOrderChart(Map<String, Object> params);
+    /**
+     * 统计产品的使用数量
+     * @return  ccount 是数量
+     *          units 是产品名称
+     */
+    List<OrderChartVo> proCountChart();
+    /**
+     *获取该科室下的所有的套餐信息
+     * @param params
+     * @return
+     */
+    PageResult<ProductOrderDetail> departmentProductDetail(Map<String, Object> params);
+}
+
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderRecordService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderRecordService.java
new file mode 100644
index 0000000..d3a859d
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderRecordService.java
@@ -0,0 +1,63 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.common.service.ISuperService;
+import com.kidgrow.oprationcenter.model.ProductOrderRecord;
+import com.kidgrow.oprationcenter.vo.DiagnosisRecord;
+import com.kidgrow.oprationcenter.vo.GroupProductDetail;
+import com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 产品/明显的充值记录<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface IProductOrderRecordService extends ISuperService<ProductOrderRecord> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<ProductOrderRecord> findList(Map<String, Object> params);
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<ProductOrderJoinDetail> findAllList(Map<String, Object> params, SysUser sysUser);
+
+    /**
+     * 诊断列表
+     * @param params
+     * @return
+     */
+    PageResult<DiagnosisRecord> findAllDataList(Map<String, Object> params);
+
+    /**
+    * 根据ProductOrderRecord对象当做查询条件进行查询
+    * @param productOrderRecord
+    * @return ProductOrderRecord对象
+    */
+    ProductOrderRecord findByObject(ProductOrderRecord productOrderRecord);
+    /**
+     * 状态变更
+     * @param params
+     * @return
+     */
+    ResultBody updateEnabled(Map<String, Object> params);
+    ResultBody getTypeByUser(SysUser sysUser);
+    /**
+     * 统计产品使用量列表
+     * @param params
+     * @return
+     */
+    PageResult<GroupProductDetail> groupList(Map<String, Object> params);
+}
+
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderService.java
new file mode 100644
index 0000000..e1498d6
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/IProductOrderService.java
@@ -0,0 +1,55 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.common.annotation.LoginUser;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.oprationcenter.model.ProductOrder;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 产品的充值记录-订单<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface IProductOrderService extends ISuperService<ProductOrder> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<ProductOrder> findList(Map<String, Object> params,@LoginUser SysUser sysUser);
+
+
+    /**
+    * 根据ProductOrder对象当做查询条件进行查询
+    * @param productOrder
+    * @return ProductOrder对象
+    */
+    ProductOrder findByObject(ProductOrder productOrder);
+    /**
+     * 状态变更
+     * @param params
+     * @return
+     */
+    ResultBody updateEnabled(Map<String, Object> params);
+
+    /**
+     * 删除指定orderid下的套餐数据
+     * @param orderId
+     * @return
+     */
+    int delProductDetail(Long orderId);
+    /**
+     * 用户充值(创建订单,增加充值记录,冲套餐)
+     * @param params
+     * @return
+     */
+    boolean saveProductDetail(Map<String,Object> params,SysUser sysUser);
+}
+
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
new file mode 100644
index 0000000..9c09a03
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysFeedbackService.java
@@ -0,0 +1,43 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.common.service.ISuperService;
+import com.kidgrow.oprationcenter.model.SysFeedback;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: <br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface ISysFeedbackService extends ISuperService<SysFeedback> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<SysFeedback> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据SysFeedback对象当做查询条件进行查询
+    * @param sysFeedback
+    * @return SysFeedback对象
+    */
+    SysFeedback findByObject(SysFeedback sysFeedback);
+    /**
+     * 状态变更
+     * @param params
+     * @return
+     */
+    ResultBody updateEnabled(Map<String, Object> params);
+
+    boolean saveOrUpdateStr(SysFeedback sysFeedback, SysUser sysUser);
+}
+
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysLoggerService.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysLoggerService.java
new file mode 100644
index 0000000..d4f4036
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysLoggerService.java
@@ -0,0 +1,33 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.oprationcenter.model.SysLogger;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: <br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface ISysLoggerService extends ISuperService<SysLogger> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<SysLogger> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据SysLogger对象当做查询条件进行查询
+    * @param sysLogger
+    * @return SysLogger对象
+    */
+    SysLogger findByObject(SysLogger sysLogger);
+}
+
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
new file mode 100644
index 0000000..fa4293c
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/ISysProductService.java
@@ -0,0 +1,47 @@
+package com.kidgrow.oprationcenter.service;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.oprationcenter.model.SysProduct;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+import com.kidgrow.oprationcenter.vo.ProductAllVo;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: <br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface ISysProductService extends ISuperService<SysProduct> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<SysProduct> findList(Map<String, Object> params, SysUser sysUser);
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<ProductAllVo> findAllList(Map<String, Object> params, SysUser sysUser);
+
+    /**
+    * 根据SysProduct对象当做查询条件进行查询
+    * @param sysProduct
+    * @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/BusinessRecordsServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/BusinessRecordsServiceImpl.java
new file mode 100644
index 0000000..6c7d3f7
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/BusinessRecordsServiceImpl.java
@@ -0,0 +1,75 @@
+package com.kidgrow.oprationcenter.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.constant.CommonConstant;
+import com.kidgrow.common.constant.SecurityConstants;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.oprationcenter.mapper.BusinessRecordsMapper;
+import com.kidgrow.oprationcenter.model.BusinessRecords;
+import com.kidgrow.oprationcenter.service.IBusinessRecordsService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 业务操作记录<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+@Slf4j
+@Service
+public class BusinessRecordsServiceImpl extends SuperServiceImpl<BusinessRecordsMapper, BusinessRecords> implements IBusinessRecordsService {
+
+    @Autowired
+    private HttpServletRequest httpServletRequest;
+
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<BusinessRecords> findList(Map<String, Object> params){
+        Page<BusinessRecords> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<BusinessRecords> list  =  baseMapper.findList(page, params);
+        return PageResult.<BusinessRecords>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据BusinessRecords对象当做查询条件进行查询
+   * @param businessRecords
+   * @return BusinessRecords
+   */
+    @Override
+    public BusinessRecords findByObject(BusinessRecords businessRecords){
+        return baseMapper.findByObject(businessRecords);
+    }
+
+    /**
+     * 写入系统业务日志
+     * @param recordTitle
+     * @param recordNote
+     * @return
+     */
+    @Override
+    public boolean recordBusinessData(String  recordTitle,String recordNote)
+    {
+        BusinessRecords businessRecords=new BusinessRecords();
+        businessRecords.setAppName(httpServletRequest.getHeader(SecurityConstants.TENANT_HEADER));
+        businessRecords.setUserId(Long.valueOf(httpServletRequest.getHeader(SecurityConstants.USER_ID_HEADER)));
+        businessRecords.setUserName(httpServletRequest.getHeader(SecurityConstants.USER_HEADER));
+        businessRecords.setRecordTitle(recordTitle);
+        businessRecords.setRecordIp(httpServletRequest.getHeader(CommonConstant.USER_AGENT_IP));
+        businessRecords.setRecordDetail(recordNote);
+        return baseMapper.insert(businessRecords)>0;
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/BusinessServerServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/BusinessServerServiceImpl.java
new file mode 100644
index 0000000..ca162ea
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/BusinessServerServiceImpl.java
@@ -0,0 +1,49 @@
+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.service.impl.SuperServiceImpl;
+
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections4.MapUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import com.kidgrow.oprationcenter.model.BusinessServer;
+import com.kidgrow.oprationcenter.mapper.BusinessServerMapper;
+import com.kidgrow.oprationcenter.service.IBusinessServerService;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医院服务信息表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+@Slf4j
+@Service
+public class BusinessServerServiceImpl extends SuperServiceImpl<BusinessServerMapper, BusinessServer> implements IBusinessServerService {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<BusinessServer> findList(Map<String, Object> params){
+        Page<BusinessServer> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<BusinessServer> list  =  baseMapper.findList(page, params);
+        return PageResult.<BusinessServer>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据BusinessServer对象当做查询条件进行查询
+   * @param businessServer
+   * @return BusinessServer
+   */
+    @Override
+    public BusinessServer findByObject(BusinessServer businessServer){
+        return baseMapper.findByObject(businessServer);
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ConsumptionRecordServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ConsumptionRecordServiceImpl.java
new file mode 100644
index 0000000..1a3955b
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ConsumptionRecordServiceImpl.java
@@ -0,0 +1,697 @@
+package com.kidgrow.oprationcenter.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.constant.ConsumptionConstant;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.common.utils.DateUtils;
+import com.kidgrow.common.utils.StringUtils;
+import com.kidgrow.oprationcenter.mapper.ConsumptionRecordMapper;
+import com.kidgrow.oprationcenter.model.ConsumptionRecord;
+import com.kidgrow.oprationcenter.model.ProductOrderDetail;
+import com.kidgrow.oprationcenter.service.IConsumptionRecordService;
+import com.kidgrow.oprationcenter.service.IProductOrderDetailService;
+import com.kidgrow.oprationcenter.vo.ConsumptionRequest;
+import com.kidgrow.oprationcenter.vo.ConsumptionVo;
+import com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail;
+import com.kidgrow.oprationcenter.vo.UserProductDetail;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+import java.util.stream.Collectors;
+
+//import org.springframework.amqp.rabbit.annotation.RabbitListener;
+//import org.springframework.amqp.rabbit.core.RabbitTemplate;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: <br>
+ * @Project: 运营中心<br>
+ * @CreateDate: Created in 2020-06-23 15:07:14 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ */
+@Slf4j
+@Service
+public class ConsumptionRecordServiceImpl extends SuperServiceImpl<ConsumptionRecordMapper, ConsumptionRecord> implements IConsumptionRecordService {
+    @Autowired
+    private IProductOrderDetailService productOrderDetailService;
+    @Autowired
+    private HttpServletRequest httpServletRequest;
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+    private static final Logger logger = LoggerFactory.getLogger(ConsumptionRecordServiceImpl.class);
+    @Value("${spring.profiles.active}")
+    private String envName;
+    /**
+     * 列表
+     *
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<ConsumptionRecord> findList(Map<String, Object> params) {
+        Page<ConsumptionRecord> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<ConsumptionRecord> list = baseMapper.findList(page, params);
+        return PageResult.<ConsumptionRecord>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+     * 列表
+     *
+     * @param params
+     * @return
+     */
+    @Override
+    public List<ConsumptionRecord> findAllList(Map<String, Object> params) {
+        return baseMapper.findList(params);
+    }
+
+    /**
+     * 根据ConsumptionRecord对象当做查询条件进行查询
+     *
+     * @param consumptionRecord
+     * @return ConsumptionRecord
+     */
+    @Override
+    public ConsumptionRecord findByObject(ConsumptionRecord consumptionRecord) {
+        return baseMapper.findByObject(consumptionRecord);
+    }
+
+    /**
+     * 要让AI读片-调用
+     *
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultBody consumptionAIStart(ConsumptionRequest consumptionRequest) {
+        //默认的业务返回码
+        int bcode = -1;
+        //记录类型
+        int recordType=ConsumptionConstant.BEFORE_DEDUCTION;
+        //业务执行结果
+        boolean isSuccess = true;
+        //业务执行结果信息
+        String reMsg = "";
+        if (VateParams(consumptionRequest)) {
+            //先获取这个业务关联的扣费记录
+            List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
+            //1.先检查是否已经扣费
+            if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
+                //2.没有扣费,检查是否已经预扣费
+                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
+                    //3.没有预扣,查询余额
+                    Map<String,Object> vateMap=VateUserNowProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId());
+                    if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) {
+                        //4.余额充足 获取要扣的套餐 写预扣费记录
+                        if (beforeConsumption(consumptionRequest)) {
+                            //预扣费成功
+                            reMsg = "预扣费成功!";
+                            bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION;
+                        } else {
+                            //预扣费执行失败
+                            isSuccess = false;
+                            reMsg = "预扣费执行失败!";
+                            bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
+                        }
+                    } else {
+                        //余额不足 或获取异常
+                        isSuccess = false;
+                        reMsg = vateMap.get("vateMsg").toString();
+                        bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
+                    }
+                } else {
+                    //已经预扣费
+                    reMsg = "该业务已经预扣费!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION;
+                }
+            } else {
+                //已经扣费
+                reMsg = "该业务已经扣费!";
+                bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+            }
+        } else {
+            isSuccess = false;
+            reMsg = "传入参数有误!";
+            bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
+        }
+        return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess);
+    }
+
+    /**
+     * AI返回结果-调用
+     *
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultBody consumptionAIReturn(ConsumptionRequest consumptionRequest) {
+        //默认的业务返回码
+        int bcode = -1;
+        //记录类型
+        int recordType=ConsumptionConstant.DEDUCTION;
+        //业务执行结果
+        boolean isSuccess = true;
+        //业务执行结果信息
+        String reMsg = "";
+        if (VateParams(consumptionRequest)) {
+            //先获取这个业务关联的扣费记录
+            List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
+            Long hospitalId = consumptionRequest.getHospitalId();
+
+            //1.先检查是否已经扣费
+            if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
+                //2.没有扣费,检查是否已经预扣费
+                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
+                    //2.1.没有预扣,查询余额
+                    Map<String,Object> vateMap=VateUserNowProduct(consumptionRequest.getConsumptionCount(),hospitalId,consumptionRequest.getDepartmentId());
+                    if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) {
+                        //2.2.余额充足 获取要扣的套餐 写预扣费记录
+                        if (beforeConsumption(consumptionRequest)) {
+                            //预扣费成功
+                            logger.info("医院id:【{}】AI返回结果应该不走预扣,目前确已经预扣!", hospitalId);
+                        } else {
+                            //预扣费执行失败
+                            isSuccess = false;
+                            reMsg = "预扣费执行失败!";
+                            bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
+                            return ResultReturn(consumptionRequest, bcode,ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
+                        }
+                    } else {
+                        //余额不足
+                        isSuccess = false;
+                        reMsg = vateMap.get("vateMsg").toString();
+                        bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
+                        return ResultReturn(consumptionRequest, bcode,ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
+                    }
+                }
+                if (consumptionBusiess(consumptionRequest, consumptionRecordList)) {
+                    reMsg = "该业务扣费成功!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+                } else {
+                    isSuccess = false;
+                    reMsg = "该业务扣费失败!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
+                }
+            } else {
+                //已经扣费
+                reMsg = "该业务已经扣费!";
+                bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+            }
+        } else {
+            isSuccess = false;
+            reMsg = "传入参数有误!";
+            bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
+        }
+        return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess);
+    }
+
+    /**
+     * AI拒读/失败通知-调用
+     *
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultBody consumptionAIFail(ConsumptionRequest consumptionRequest) {
+        //默认的业务返回码
+        int bcode = -1;
+        //记录类型
+        int recordType = ConsumptionConstant.RETURN_BEFORE_DEDUCTION;
+        //业务执行结果
+        boolean isSuccess = false;
+        //业务执行结果信息
+        String reMsg = "";
+        if (VateParams(consumptionRequest)) {
+            //先获取这个业务关联的扣费记录
+            List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
+            //1.先检查是否已经扣费
+            if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
+                //2.没有扣费,检查是否已经预扣费
+                if (isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
+                    //2.1.有预扣费
+                    ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.BEFORE_DEDUCTION&&f.getProOrderDetailId()>0).collect(Collectors.toList()).get(0);
+                    //把占用的套餐id还回去
+                    Long tempProOrderDetailId=consumptionRecord.getProOrderDetailId();
+                    consumptionRecord.setProOrderDetailId(0L);
+                    consumptionRecord.setUpdateTime(new Date());
+                    if (SaveConsumptionRecord(consumptionRecord))
+                    {
+                        //退预扣记录
+                        ConsumptionRecord consumptionRecordNew = new ConsumptionRecord();
+                        consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION);
+                        consumptionRecordNew.setBusinessId(consumptionRequest.getBusinessId());
+                        consumptionRecordNew.setConsumptionCount(0-consumptionRequest.getConsumptionCount());
+                        consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_BEFORE_DEDUCTION);
+                        consumptionRecordNew.setProOrderDetailId(tempProOrderDetailId);
+                        consumptionRecordNew.setLastRecordId(consumptionRecord.getId());
+                        if (SaveConsumptionRecord(consumptionRecordNew))
+                        {
+                            isSuccess=true;
+                            reMsg = "有预扣,写退还预扣成功!";
+                            bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_BEFORE_DEDUCTION;
+                        }
+                        else
+                        {
+                            reMsg = "写退还预扣失败!";
+                            bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
+                        }
+                    }
+                    else{
+                        reMsg = "更新预扣费记录失败!";
+                        bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
+                    }
+                }
+                else
+                {
+                    reMsg = "没有相关预扣记录!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
+                }
+            } else {
+                recordType=ConsumptionConstant.RETURN_DEDUCTION;
+                //3.有扣费记录 这种情况的流程,实际业务中不会出现,但理论上应该这样处理
+                //3.1 退还账户
+                //获取预扣的时候占住的套餐id
+                ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.DEDUCTION).collect(Collectors.toList()).get(0);
+                if (consumptionRecord != null) {
+                    ProductOrderDetail productOrderDetail = productOrderDetailService.getById(consumptionRecord.getProOrderDetailId());
+                    if (productOrderDetail != null) {
+                        //退还金额 
+                        productOrderDetail.setAilightCount(productOrderDetail.getAilightCount()+consumptionRecord.getConsumptionCount());
+                        productOrderDetail.setUpdateTime(new Date());
+                        //退费
+                        boolean consumptionRe = productOrderDetailService.saveOrUpdate(productOrderDetail);
+                        if (consumptionRe) {
+                            //更新扣费记录  还回占用套餐
+                            consumptionRecord.setProOrderDetailId(0L);
+                            consumptionRecord.setUpdateTime(new Date());
+                            if (SaveConsumptionRecord(consumptionRecord))
+                            {
+                                //退费成功
+                                //3.2 写退费记录
+                                ConsumptionRecord consumptionRecordNew = new ConsumptionRecord();
+                                consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION);
+                                consumptionRecordNew.setBusinessId(consumptionRecord.getBusinessId());
+                                consumptionRecordNew.setConsumptionCount(0-consumptionRecord.getConsumptionCount());
+                                consumptionRecordNew.setRecordType(ConsumptionConstant.RETURN_DEDUCTION);
+                                consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId());
+                                consumptionRecordNew.setLastRecordId(consumptionRecord.getId());
+                                if (SaveConsumptionRecord(consumptionRecordNew)) {
+                                    //写退费记录成功
+                                    isSuccess=true;
+                                    reMsg = "退还扣费成功!";
+                                    bcode = ConsumptionConstant.BUSINESS_CODE_RETURN_DEDUCTION;
+                                }
+                                else
+                                {
+                                    reMsg = "退还扣费失败!";
+                                    bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
+                                }
+                            }
+                            else
+                            {
+                                //更新扣费失败
+                                reMsg = "更新扣费失败!";
+                                bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
+                            }
+                        }
+                        else
+                        {
+                            //退费失败
+                            reMsg = "退还扣费失败!";
+                            bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
+                        }
+                    }
+                    else
+                    {
+                        reMsg = "无相关套餐数据!";
+                        bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
+                    }
+                }
+                else
+                {
+                    reMsg = "无相关扣费数据!";
+                    bcode = ConsumptionConstant.BUSINESS_RUN_FAIL;
+                }
+            }
+        } else {
+            reMsg = "传入参数有误!";
+            bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
+        }
+        return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess);
+    }
+
+    /**
+     * 发起人工读片-调用
+     * @param consumptionRequest 请求的数据实体
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultBody consumptionArtificial(ConsumptionRequest consumptionRequest) {
+        //默认的业务返回码
+        int bcode = -1;
+        //记录类型
+        int recordType = ConsumptionConstant.DEDUCTION;
+        //业务执行结果
+        boolean isSuccess = false;
+        //业务执行结果信息
+        String reMsg = "";
+        if (VateParams(consumptionRequest)) {
+            //先获取这个业务关联的扣费记录
+            List<ConsumptionRecord> consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
+            //1.先检查是否已经扣费
+            if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.DEDUCTION)) {
+                //2.没有扣费,检查是否已经预扣费
+                if (!isBeforeDeduction(consumptionRecordList, ConsumptionConstant.BEFORE_DEDUCTION)) {
+                    //3.没有预扣,查询余额
+                    Map<String,Object> vateMap=VateUserNowProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId());
+                    if (Boolean.parseBoolean(vateMap.get("vateRe").toString())) {
+                        //4.余额充足 获取要扣的套餐 写预扣费记录
+                        if (!beforeConsumption(consumptionRequest)) {
+                            //预扣费执行失败
+                            reMsg = "预扣费执行失败!";
+                            bcode = ConsumptionConstant.BUSINESS_CODE_ERROR;
+                            return ResultReturn(consumptionRequest, bcode,ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
+                        }
+                        else
+                        {
+                            //发起了一个新的预扣,需要更新扣费业务数据列表
+                            consumptionRecordList = GetBusinessConsumptionList(consumptionRequest.getBusinessId());
+                        }
+                    } else {
+                        //余额不足
+                        reMsg = vateMap.get("vateMsg").toString();
+                        bcode = ConsumptionConstant.BUSINESS_CODE_FAIL;
+                        return ResultReturn(consumptionRequest, bcode,ConsumptionConstant.BEFORE_DEDUCTION, reMsg, isSuccess);
+                    }
+                }
+                //扣费业务
+                isSuccess= consumptionBusiess(consumptionRequest,consumptionRecordList);
+                if (isSuccess) {
+                    reMsg = "该业务已经扣费!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+                }
+                else
+                {
+                    reMsg = "该业务扣费失败!";
+                    bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
+                }
+            } else {
+                isSuccess = true;
+                //已经扣费
+                reMsg = "该业务已经扣费!";
+                bcode = ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION;
+            }
+        } else {
+            reMsg = "传入参数有误!";
+            bcode = ConsumptionConstant.BUSINESS_CODE_PARAMS_ERROR;
+        }
+        return ResultReturn(consumptionRequest, bcode,recordType, reMsg, isSuccess);
+    }
+
+    /**
+     * 扣费业务(扣费 更新预扣 写扣费记录)
+     * @param consumptionRequest    请求参数
+     * @param consumptionRecordList 扣费业务数据
+     * @return
+     */
+    private boolean consumptionBusiess(ConsumptionRequest consumptionRequest, List<ConsumptionRecord> consumptionRecordList) {
+        //3.已经预扣费 则扣费 写扣费记录 更新预扣状态
+        ConsumptionRecord consumptionRecord = consumptionRecordList.stream().filter(f -> f.getRecordType() == ConsumptionConstant.BEFORE_DEDUCTION).collect(Collectors.toList()).get(0);
+        Long detailId = consumptionRecord.getProOrderDetailId();
+        //获取预扣的时候占住的套餐id
+        ProductOrderDetail productOrderDetail = productOrderDetailService.getById(detailId);
+        if (productOrderDetail.getAilightCount() >= consumptionRequest.getConsumptionCount()) {
+            //扣掉
+            productOrderDetail.setAilightCount(productOrderDetail.getAilightCount() - consumptionRequest.getConsumptionCount());
+        } else {
+            //要是被别人已经用了,就要重新找套餐
+            productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId());
+            if (productOrderDetail == null) {
+                logger.info("业务编号:【{}】无可用套餐!", consumptionRequest.getBusinessId());
+                return false;
+            } else {
+                //新套餐扣费
+                productOrderDetail = productOrderDetailService.getById(detailId);
+                productOrderDetail.setAilightCount(productOrderDetail.getAilightCount() - consumptionRequest.getConsumptionCount());
+            }
+        }
+        //3.1扣费!
+        boolean consumptionRe = productOrderDetailService.saveOrUpdate(productOrderDetail);
+        if (consumptionRe) {
+            //3.2扣费成功,写扣费记录
+            ConsumptionRecord consumptionRecordNew = new ConsumptionRecord();
+            consumptionRecordNew.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_IS_DEDUCTION);
+            consumptionRecordNew.setBusinessId(consumptionRequest.getBusinessId());
+            consumptionRecordNew.setConsumptionCount(consumptionRequest.getConsumptionCount());
+            consumptionRecordNew.setRecordType(ConsumptionConstant.DEDUCTION);
+            consumptionRecordNew.setProOrderDetailId(productOrderDetail.getId());
+            consumptionRecordNew.setLastRecordId(consumptionRecord.getId());
+            consumptionRecordNew.setCreateTime(new Date());
+
+            if (SaveConsumptionRecord(consumptionRecordNew)) {
+                //3.3 扣费成功 如果套餐id变化,则更新预扣费的套餐id
+                if (consumptionRecordNew.getProOrderDetailId() != consumptionRecord.getProOrderDetailId()) {
+                    consumptionRecord.setProOrderDetailId(productOrderDetail.getId());
+                    consumptionRecord.setUpdateTime(new Date());
+                    if (!SaveConsumptionRecord(consumptionRecord)) {
+                        logger.info("业务编号:【{}】更新预扣费的套餐id!", consumptionRequest.getBusinessId());
+                    }
+                }
+                //消息队列通知
+                MessageToBI(consumptionRequest);
+                //已经扣费
+                logger.info("业务编号:【{}】该业务已经扣费!", consumptionRequest.getBusinessId());
+                return true;
+            } else {
+                logger.info("业务编号:【{}】预扣费执行失败!", consumptionRequest.getBusinessId());
+            }
+        } else {
+            logger.info("业务编号:【{}】扣除套餐失败!", consumptionRequest.getBusinessId());
+        }
+        return false;
+    }
+
+    /**
+     * 返回结果包装
+     *
+     * @param consumptionRequest 请求参数
+     * @param bcode              返回码
+     * @param reMsg              返回信息
+     * @param isSuccess          业务执行是否成功
+     * @return
+     */
+    private ResultBody ResultReturn(ConsumptionRequest consumptionRequest, int bcode,int recordType, String reMsg, boolean isSuccess) {
+        //返回的数据实体
+        ConsumptionVo consumptionVo = new ConsumptionVo();
+        consumptionVo.setConsumptionCount(consumptionRequest.getConsumptionCount());
+        consumptionVo.setBusinessId(consumptionRequest.getBusinessId());
+        consumptionVo.setBcode(bcode);
+        consumptionVo.setRecordType(recordType);
+        if (isSuccess) {
+            return ResultBody.ok().data(consumptionVo).msg(reMsg);
+        } else {
+            return ResultBody.failed(reMsg).data(consumptionVo);
+        }
+    }
+
+    /**
+     * 预扣费业务
+     * @param consumptionRequest 请求参数
+     * @return
+     */
+    private Boolean beforeConsumption(ConsumptionRequest consumptionRequest) {
+        ProductOrderDetail productOrderDetail = deductionDepartmentProduct(consumptionRequest.getConsumptionCount(),consumptionRequest.getHospitalId(),consumptionRequest.getDepartmentId());
+        if (productOrderDetail != null) {
+            ConsumptionRecord consumptionRecord = new ConsumptionRecord();
+            consumptionRecord.setBusinessCode(ConsumptionConstant.BUSINESS_CODE_IS_BEFORE_DEDUCTION);
+            consumptionRecord.setBusinessId(consumptionRequest.getBusinessId());
+            consumptionRecord.setConsumptionCount(consumptionRequest.getConsumptionCount());
+            consumptionRecord.setRecordType(ConsumptionConstant.BEFORE_DEDUCTION);
+            consumptionRecord.setProOrderDetailId(productOrderDetail.getId());
+            if (SaveConsumptionRecord(consumptionRecord)) {
+                return true;
+            } else {
+                logger.info("医院id:【{}】预扣费执行失败!", consumptionRequest.getHospitalId());
+            }
+        } else {
+            logger.info("医院id:【{}】套餐获取失败!", consumptionRequest.getHospitalId());
+        }
+        return false;
+    }
+
+    /**
+     * 参数验证
+     */
+    private Boolean VateParams(ConsumptionRequest consumptionRequest) {
+        if (consumptionRequest != null) {
+            //从请求头获取医院和科室id
+            String hosId = consumptionRequest.getHospitalId().toString();
+            String depId = consumptionRequest.getDepartmentId().toString();
+            String doctorId = consumptionRequest.getDoctorId().toString();
+            if (StringUtils.isNotBlank(consumptionRequest.getBusinessId())
+                    && consumptionRequest.getConsumptionCount() > 0
+                    && StringUtils.isNotBlank(hosId)
+                    && StringUtils.isNotBlank(depId)
+                    && StringUtils.isNotBlank(doctorId)) {
+                return true;
+            } else {
+                logger.info("扣费请求参数不完整!");
+            }
+        } else {
+            logger.info("扣费请求参数为空!");
+        }
+        return false;
+    }
+
+    /**
+     * 检查余额够不够
+     * @param consumptionCount 要扣的数量
+     * @return
+     */
+    private Map<String,Object> VateUserNowProduct(int consumptionCount,Long hospitalId,Long departmentId) {
+        Map<String,Object> returnMap=new HashMap<>();
+        ResultBody biUserPro = productOrderDetailService.biUserNowProduct(hospitalId, departmentId);
+        if (biUserPro.getCode() == 0) {
+            if (StringUtils.isNotBlank(biUserPro.getData().toString())) {
+                //余额
+                int userAICount = Integer.parseInt(biUserPro.getData().toString());
+                if (userAICount >= consumptionCount) {
+                    returnMap.put("vateRe",true);
+                    returnMap.put("vateMsg","余额足够!");
+                } else {
+                    returnMap.put("vateRe",false);
+                    returnMap.put("vateMsg","余额不足!");
+                    logger.info("医院id:【{}】余额不足!", hospitalId);
+                }
+            } else {
+                returnMap.put("vateRe",false);
+                returnMap.put("vateMsg","余额获取异常,data为空!");
+                logger.error("医院id:【{}】余额获取异常!", hospitalId);
+            }
+         }else {
+            returnMap.put("vateRe",false);
+            returnMap.put("vateMsg","余额获取异常,Code非0!");
+            logger.info("医院id:【{}】余额获取异常,返回非0!", hospitalId);
+        }
+        return returnMap;
+    }
+
+    /**
+     * 获取要使用的套餐实体
+     * @param consumCount  要使用的数量
+     * @return
+     */
+    private ProductOrderDetail deductionDepartmentProduct(int consumCount,Long hospitalId,Long departmentId) {
+        UserProductDetail userProductDetail = productOrderDetailService.getUserProductDetail(hospitalId, departmentId);
+        //合并集合
+        userProductDetail.getProductOrderJoinDetailListShare().addAll(userProductDetail.getProductOrderJoinDetailsListDep());
+        List<ProductOrderJoinDetail> productOrderJoinDetailList = userProductDetail.getProductOrderJoinDetailListShare();
+        if (productOrderJoinDetailList.size() > 0) {
+            //合并后按id排序并筛除已用完的套餐
+            List<ProductOrderJoinDetail> productOrderJoinDetailsNewList = productOrderJoinDetailList.stream().filter(f -> f.getAilightCount() >= consumCount).sorted(Comparator.comparing(ProductOrderJoinDetail::getId)).collect(Collectors.toList());
+            //要使用的套餐信息
+            ProductOrderDetail productOrderDetail = productOrderDetailService.getById(productOrderJoinDetailsNewList.get(0).getId());
+            return productOrderDetail;
+        }
+        return null;
+    }
+
+    /**
+     * 写/更新记录数据
+     *
+     * @param consumptionRecord
+     * @return
+     */
+    private Boolean SaveConsumptionRecord(ConsumptionRecord consumptionRecord) {
+        if (consumptionRecord != null) {
+            if (consumptionRecord.getCreateTime() == null) {
+                consumptionRecord.setCreateTime(new Date());
+            }
+            return this.saveOrUpdate(consumptionRecord);
+        } else {
+            logger.info("扣费数据写入参数为空!");
+        }
+        return false;
+    }
+
+    /**
+     * 检查该业务是否存在该业务类型
+     *
+     * @param consumptionRecordList 该业务下的扣费列表
+     * @param recordType            记录类型编码 参考ConsumptionConstant里面
+     * @return
+     */
+    private boolean isBeforeDeduction(List<ConsumptionRecord> consumptionRecordList, int recordType) {
+        if (consumptionRecordList != null) {
+            if (consumptionRecordList.size() > 0) {
+                //过滤预扣费的记录
+                return consumptionRecordList.stream().filter(f -> f.getRecordType() == recordType&&f.getProOrderDetailId()>0).collect(Collectors.toList()).size() == 1;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 获取一个业务关联的扣费记录
+     *
+     * @param businessId 光片的名称/编号
+     * @return
+     */
+    private List<ConsumptionRecord> GetBusinessConsumptionList(String businessId) {
+        if (StringUtils.isNotBlank(businessId)) {
+            Map<String, Object> params = new HashMap<>();
+            params.put("businessId", businessId);
+            List<ConsumptionRecord> consumptionRecordList = this.findAllList(params);
+            return consumptionRecordList;
+        }
+        return null;
+    }
+
+    /**
+     * 获取一个扣费记录
+     *
+     * @param recordId 扣费记录id
+     * @return
+     */
+    private ConsumptionRecord GetBusinessConsumptionList(Long recordId) {
+        if (recordId > 0) {
+            return baseMapper.selectById(recordId);
+        }
+        return null;
+    }
+
+    /**
+     * 发消息到消息队列
+     * @return
+     */
+    //@RabbitListener(queues = "BoneAgeEvaluationData")
+    private void MessageToBI(ConsumptionRequest consumptionRequest)
+    {
+        //发消息到队列
+        String context = "{\"hospitalId\":\"" + consumptionRequest.getHospitalId() +
+                "\",\"departmentId\":\"" + consumptionRequest.getDepartmentId() +
+                "\",\"doctorId\":\"" + consumptionRequest.getDoctorId() +
+                "\",\"date\":\"" + DateUtils.formatDate(new Date(),"yyyy-MM-dd")+"\"}";
+        rabbitTemplate.convertAndSend(ConsumptionConstant.EXCHANGE_DATA, ConsumptionConstant.ROUTINGKEY_DATA+envName, context);
+
+        log.error("骨龄评价扣费消息已发送:"+context);
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DataNeedServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DataNeedServiceImpl.java
new file mode 100644
index 0000000..2d82958
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DataNeedServiceImpl.java
@@ -0,0 +1,140 @@
+package com.kidgrow.oprationcenter.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysDoctor;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.oprationcenter.mapper.DataNeedMapper;
+import com.kidgrow.oprationcenter.model.DataNeed;
+import com.kidgrow.oprationcenter.service.IDataNeedService;
+import com.kidgrow.oprationcenter.vo.DataNeedExcel;
+import com.kidgrow.usercenter.feign.SysDoctorService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cglib.beans.BeanCopier;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医生的数据需求<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+@Slf4j
+@Service
+public class DataNeedServiceImpl extends SuperServiceImpl<DataNeedMapper, DataNeed> implements IDataNeedService {
+    @Autowired
+    private SysDoctorService sysDoctorService;
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<DataNeed> findList(Map<String, Object> params){
+        Page<DataNeed> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<DataNeed> list  =  baseMapper.findList(page, params);
+        return PageResult.<DataNeed>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据DataNeed对象当做查询条件进行查询
+   * @param dataNeed
+   * @return DataNeed
+   */
+    @Override
+    public DataNeed findByObject(DataNeed dataNeed){
+        return baseMapper.findByObject(dataNeed);
+    }
+
+    @Override
+    public List<DataNeedExcel> findListExportByParam(Map<String, Object> params) {
+        QueryWrapper queryWrapper=new QueryWrapper();
+        String doctor_name = MapUtils.getString(params, "doctor_name");
+        if(doctor_name!=null){
+            queryWrapper.like("doctor_name","%"+doctor_name+"%");
+        }
+        String need_begintime = MapUtils.getString(params, "need_begintime");
+        if(need_begintime!=null){
+            queryWrapper.gt("need_begintime",need_begintime);
+        }
+        String need_endtime = MapUtils.getString(params, "need_endtime");
+        if(need_endtime!=null){
+            queryWrapper.gt("need_endtime",need_endtime);
+        }
+        queryWrapper.eq("is_del",0);
+        List<DataNeed> dataNeeds = baseMapper.selectList(queryWrapper);
+        List<DataNeedExcel> voList=new ArrayList<>();
+        dataNeeds.forEach(e ->{
+            DataNeedExcel vo=new DataNeedExcel();
+            BeanCopier beanCopier = BeanCopier.create(DataNeed.class, DataNeedExcel.class, false);
+            beanCopier.copy(e,vo,null);
+            voList.add(vo);
+        });
+        return voList;
+    }
+
+    @Override
+    public ResultBody updateEnabled(Map<String, Object> map) {
+        Long id = MapUtils.getLong(map, "id");
+        if(id==null){
+            return ResultBody.failed("请选择一条数据");
+        }else {
+            DataNeed dataNeed = baseMapper.selectById(id);
+            if (dataNeed != null) {
+                Boolean enabled = MapUtils.getBoolean(map, "enabled");
+                String dataFile = MapUtils.getString(map, "dataFile");
+                dataNeed.setDataFile(dataFile);
+                dataNeed.setEnabled(enabled);
+                baseMapper.updateById(dataNeed);
+            }else {
+                return ResultBody.failed("查找数据失败");
+            }
+            return ResultBody.ok();
+        }
+    }
+    @Override
+    public ResultBody updateDelete(Long id,SysUser sysUser) {
+        if(id==null){
+            return ResultBody.failed("请选择一条数据");
+        }else {
+            DataNeed dataNeed = baseMapper.selectById(id);
+            if (dataNeed != null) {
+                dataNeed.setIsDel(true);
+                dataNeed.setUpdateTime(new Date());
+                dataNeed.setUpdateUserId(sysUser.getId());
+                dataNeed.setUpdateUserName(sysUser.getUsername());
+                int u=baseMapper.updateById(dataNeed);
+                return ResultBody.ok().data(u>0);
+            }else {
+                return ResultBody.failed("查找数据失败");
+            }
+        }
+    }
+
+    @Override
+    public ResultBody FindAllByHId(Map<String, Object> map, SysUser sysUser) {
+            Map<String,Object> doctoerMap =new HashMap<>();
+            doctoerMap.put("user_id",sysUser.getId());
+            ResultBody listByMap = sysDoctorService.getListByMap(doctoerMap);
+            List<SysDoctor> sysDoctors = JSON.parseArray(JSON.toJSONString(listByMap.getData()), SysDoctor.class);
+            if (sysDoctors!=null&&sysDoctors.size()>0){
+                Page<DataNeed> page = new Page<>(MapUtils.getInteger(map, "page"), MapUtils.getInteger(map, "limit"));
+//                List<DataNeed> dataNeedList=baseMapper.findHList(map);
+                List<DataNeed> list  =  baseMapper.findList(page, map);
+                PageResult<DataNeed> build = PageResult.<DataNeed>builder().data(list).code(0).count(page.getTotal()).build();
+                return ResultBody.ok().data(build);
+            }else {
+                return ResultBody.failed("非管理用户无权查看");
+            }
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorAnswerServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorAnswerServiceImpl.java
new file mode 100644
index 0000000..76eb4bf
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorAnswerServiceImpl.java
@@ -0,0 +1,49 @@
+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.service.impl.SuperServiceImpl;
+
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections4.MapUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import com.kidgrow.oprationcenter.model.DoctorAnswer;
+import com.kidgrow.oprationcenter.mapper.DoctorAnswerMapper;
+import com.kidgrow.oprationcenter.service.IDoctorAnswerService;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医答医生信息表-未完待续<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+@Slf4j
+@Service
+public class DoctorAnswerServiceImpl extends SuperServiceImpl<DoctorAnswerMapper, DoctorAnswer> implements IDoctorAnswerService {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<DoctorAnswer> findList(Map<String, Object> params){
+        Page<DoctorAnswer> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<DoctorAnswer> list  =  baseMapper.findList(page, params);
+        return PageResult.<DoctorAnswer>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据DoctorAnswer对象当做查询条件进行查询
+   * @param doctorAnswer
+   * @return DoctorAnswer
+   */
+    @Override
+    public DoctorAnswer findByObject(DoctorAnswer doctorAnswer){
+        return baseMapper.findByObject(doctorAnswer);
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorServerServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorServerServiceImpl.java
new file mode 100644
index 0000000..046982d
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorServerServiceImpl.java
@@ -0,0 +1,49 @@
+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.service.impl.SuperServiceImpl;
+
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections4.MapUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import com.kidgrow.oprationcenter.model.DoctorServer;
+import com.kidgrow.oprationcenter.mapper.DoctorServerMapper;
+import com.kidgrow.oprationcenter.service.IDoctorServerService;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医生业务服务信息表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+@Slf4j
+@Service
+public class DoctorServerServiceImpl extends SuperServiceImpl<DoctorServerMapper, DoctorServer> implements IDoctorServerService {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<DoctorServer> findList(Map<String, Object> params){
+        Page<DoctorServer> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<DoctorServer> list  =  baseMapper.findList(page, params);
+        return PageResult.<DoctorServer>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据DoctorServer对象当做查询条件进行查询
+   * @param doctorServer
+   * @return DoctorServer
+   */
+    @Override
+    public DoctorServer findByObject(DoctorServer doctorServer){
+        return baseMapper.findByObject(doctorServer);
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorSigningServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorSigningServiceImpl.java
new file mode 100644
index 0000000..92f60d1
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorSigningServiceImpl.java
@@ -0,0 +1,49 @@
+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.service.impl.SuperServiceImpl;
+
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections4.MapUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import com.kidgrow.oprationcenter.model.DoctorSigning;
+import com.kidgrow.oprationcenter.mapper.DoctorSigningMapper;
+import com.kidgrow.oprationcenter.service.IDoctorSigningService;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 签约医生信息表-未完待续<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+@Slf4j
+@Service
+public class DoctorSigningServiceImpl extends SuperServiceImpl<DoctorSigningMapper, DoctorSigning> implements IDoctorSigningService {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<DoctorSigning> findList(Map<String, Object> params){
+        Page<DoctorSigning> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<DoctorSigning> list  =  baseMapper.findList(page, params);
+        return PageResult.<DoctorSigning>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据DoctorSigning对象当做查询条件进行查询
+   * @param doctorSigning
+   * @return DoctorSigning
+   */
+    @Override
+    public DoctorSigning findByObject(DoctorSigning doctorSigning){
+        return baseMapper.findByObject(doctorSigning);
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorTempleteServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorTempleteServiceImpl.java
new file mode 100644
index 0000000..1fb7660
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/DoctorTempleteServiceImpl.java
@@ -0,0 +1,71 @@
+package com.kidgrow.oprationcenter.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.oprationcenter.mapper.DoctorTempleteMapper;
+import com.kidgrow.oprationcenter.model.DoctorTemplete;
+import com.kidgrow.oprationcenter.service.IDoctorTempleteService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医生的模板<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+@Slf4j
+@Service
+public class DoctorTempleteServiceImpl extends SuperServiceImpl<DoctorTempleteMapper, DoctorTemplete> implements IDoctorTempleteService {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult findList(Map<String, Object> params){
+        Page<DoctorTemplete> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<DoctorTemplete> list  =  baseMapper.findList(page, params);
+        return PageResult.<DoctorTemplete>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    @Override
+    public PageResult findDoctorList(Map<String, Object> params) {
+        Page<DoctorTemplete> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<DoctorTemplete> list  =  baseMapper.findDoctorList(page, params);
+        return PageResult.<DoctorTemplete>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据DoctorTemplete对象当做查询条件进行查询
+   * @param doctorTemplete
+   * @return DoctorTemplete
+   */
+    @Override
+    public DoctorTemplete findByObject(DoctorTemplete doctorTemplete){
+        return baseMapper.findByObject(doctorTemplete);
+    }
+
+    @Override
+    public ResultBody updateEnabled(Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        if(id==null){
+            ResultBody.failed("请选择一条数据");
+        }
+        Boolean enabled = MapUtils.getBoolean(params, "enabled");
+        DoctorTemplete doctorTemplete = baseMapper.selectById(id);
+        if (doctorTemplete!=null){
+            doctorTemplete.setEnabled(enabled);
+            baseMapper.updateById(doctorTemplete);
+        }
+        return ResultBody.ok();
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/HospitalScreeningServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/HospitalScreeningServiceImpl.java
new file mode 100644
index 0000000..24a012a
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/HospitalScreeningServiceImpl.java
@@ -0,0 +1,49 @@
+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.service.impl.SuperServiceImpl;
+
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections4.MapUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import com.kidgrow.oprationcenter.model.HospitalScreening;
+import com.kidgrow.oprationcenter.mapper.HospitalScreeningMapper;
+import com.kidgrow.oprationcenter.service.IHospitalScreeningService;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 筛查医院信息表-未完待续<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+@Slf4j
+@Service
+public class HospitalScreeningServiceImpl extends SuperServiceImpl<HospitalScreeningMapper, HospitalScreening> implements IHospitalScreeningService {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<HospitalScreening> findList(Map<String, Object> params){
+        Page<HospitalScreening> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<HospitalScreening> list  =  baseMapper.findList(page, params);
+        return PageResult.<HospitalScreening>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据HospitalScreening对象当做查询条件进行查询
+   * @param hospitalScreening
+   * @return HospitalScreening
+   */
+    @Override
+    public HospitalScreening findByObject(HospitalScreening hospitalScreening){
+        return baseMapper.findByObject(hospitalScreening);
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderDetailServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderDetailServiceImpl.java
new file mode 100644
index 0000000..df69cd0
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderDetailServiceImpl.java
@@ -0,0 +1,399 @@
+package com.kidgrow.oprationcenter.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.constant.CommonConstant;
+import com.kidgrow.common.model.*;
+import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.common.utils.DateUtils;
+import com.kidgrow.common.utils.StringUtils;
+import com.kidgrow.oprationcenter.feign.DiagnosticService;
+import com.kidgrow.oprationcenter.mapper.ConsumptionRecordMapper;
+import com.kidgrow.oprationcenter.mapper.ProductOrderDetailMapper;
+import com.kidgrow.oprationcenter.model.ConsumptionRecord;
+import com.kidgrow.oprationcenter.model.ProductOrder;
+import com.kidgrow.oprationcenter.model.ProductOrderDetail;
+import com.kidgrow.oprationcenter.service.IProductOrderDetailService;
+import com.kidgrow.oprationcenter.service.IProductOrderService;
+import com.kidgrow.oprationcenter.vo.*;
+import com.kidgrow.redis.util.RedisUtils;
+import com.kidgrow.usercenter.feign.SysDoctorService;
+import com.kidgrow.usercenter.feign.SysHospitalService;
+import com.kidgrow.usercenter.model.SysHospital;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cglib.beans.BeanCopier;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 产品/明显的充值记录<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+@Slf4j
+@Service
+public class ProductOrderDetailServiceImpl extends SuperServiceImpl<ProductOrderDetailMapper, ProductOrderDetail> implements IProductOrderDetailService {
+   @Autowired
+    DiagnosticService diagnosticService;
+    @Autowired
+    private SysDoctorService sysDoctorService;
+    @Autowired
+    private SysHospitalService sysHospitalService;
+    @Autowired
+    private ConsumptionRecordMapper consumptionRecordMapper;
+    @Autowired
+    private IProductOrderService iProductOrderService;
+    @Autowired
+    private RedisUtils redisUtils;
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<ProductOrderDetail> findList(Map<String, Object> params){
+        Page<ProductOrderDetail> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<ProductOrderDetail> list  =  baseMapper.findList(page, params);
+        return PageResult.<ProductOrderDetail>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+    /**
+     * 获取已购买产品列表
+     * @param params
+     * @return
+     */
+    @Override
+    public List<ProductOrderJoinDetail> findAllList(Map<String, Object> params){
+        return baseMapper.findAllList(params);
+    }
+
+    /**
+     * 判定医院科室的套餐是否到期 以及剩余的读片量
+     * @param hospitalId
+     * @param departmentId
+     * @param diagnosticId
+     * @return
+     */
+    @Override
+    public ResultBody<UserProductData> userProductDetailData(Long hospitalId,Long departmentId,String diagnosticId)
+    {
+        UserProductData userProductData=new UserProductData();
+        userProductData.setIsEnd(true);
+        userProductData.setRecordCount(0);
+        userProductData.setAilightCount(0);
+        userProductData.setLimitDays(0);
+        UserProductDetail userProductDetail = this.getUserProductDetail(hospitalId, departmentId);
+        if (userProductDetail != null) {
+            //合并集合
+            userProductDetail.getProductOrderJoinDetailListShare().addAll(userProductDetail.getProductOrderJoinDetailsListDep());
+            List<ProductOrderJoinDetail> productOrderJoinDetailList = userProductDetail.getProductOrderJoinDetailListShare();
+            if (productOrderJoinDetailList.size() > 0) {
+                userProductData.setIsEnd(false);
+                //合并后按id排序并筛除已用完的套餐
+                List<ProductOrderJoinDetail> productOrderJoinDetailsNewList = productOrderJoinDetailList.stream().filter(f -> f.getAilightCount() >= 0).sorted(Comparator.comparing(ProductOrderJoinDetail::getProEndtime)).collect(Collectors.toList());
+                for (int i = 0; i <productOrderJoinDetailsNewList.size(); i++) {
+                    userProductData.setAilightCount(productOrderJoinDetailsNewList.get(i).getAilightCount());
+                    userProductData.setRecordCount(productOrderJoinDetailsNewList.get(i).getRecordCount());
+                    Double days=DateUtils.getDays(new Date(),productOrderJoinDetailsNewList.get(i).getProEndtime());
+                    if (i<productOrderJoinDetailsNewList.size()-1) {
+                        //按照结束日期正序排序后,如果第二条的开始时间减去第一条的结束时间 差值大于0  说明套餐间有中断 则以当前这条套餐作为当前套餐的剩余天数
+                        Double daysTemp=DateUtils.getDays(productOrderJoinDetailsNewList.get(i).getProEndtime(),
+                                productOrderJoinDetailsNewList.get(i+1).getProBegintime());
+                        if (daysTemp>0) {
+                            userProductData.setLimitDays(Integer.valueOf(Double.valueOf(days).intValue()));
+                        }
+                    }
+                    else
+                    {
+                        userProductData.setLimitDays(Integer.valueOf(Double.valueOf(days).intValue()));
+                    }
+                }
+            }
+        }
+        //是否已经结束
+        if (userProductData.getIsEnd()&& StringUtils.isNotBlank(diagnosticId)) {
+            //写入redis中,防止扣非后不能生成报告
+            redisUtils.lSet(CommonConstant.SAAS_LAST_SERVER+diagnosticId,diagnosticId);
+        }
+        return ResultBody.ok().data(userProductData);
+    }
+
+    /**
+     * 获取需要审核的套餐
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult all(Map<String, Object> params) {
+        Page<ProductOrderDetail> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<ProductOrderDetail> list  =  baseMapper.findList(page, params);
+        List<ProductOrderDetailVo> volist=new ArrayList<>();
+        for (ProductOrderDetail productOrderDetail : list) {
+            ProductOrderDetailVo productOrderDetailVo=new ProductOrderDetailVo();
+            BeanCopier beanCopier = BeanCopier.create(ProductOrderDetail.class, ProductOrderDetailVo.class, false);
+            beanCopier.copy(productOrderDetail,productOrderDetailVo,null);
+            //查询医院
+            if(productOrderDetail.getOrderId()!=null){
+                ProductOrder productOrder = iProductOrderService.getById(productOrderDetail.getOrderId());
+                if(productOrder!=null){
+                    productOrderDetailVo.setDepartmentId(productOrder.getDepartmentId());
+                    productOrderDetailVo.setDepartmentName(productOrder.getDepartmentName());
+                    productOrderDetailVo.setHospitalId(productOrder.getHospitalId());
+                    productOrderDetailVo.setHospitalName(productOrder.getHospitalName());
+                }
+               volist.add(productOrderDetailVo);
+            }
+        }
+        return PageResult.<ProductOrderDetailVo>builder().data(volist).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+     * 获取科室试用次数
+     * @param departmentId  科室ID
+     * @return
+     */
+    @Override
+    public int getEnabledCount(Long departmentId) {
+        int counts=baseMapper.getEnabledCount(departmentId);
+        return counts;
+    }
+    /**
+     * 统计获取数据量
+     * @param datatype
+     * 0 试用审核量
+     * 1 套餐总量
+     * 2 未处理用户反馈
+     * 3 未处理数据需求
+     * @return
+     */
+    @Override
+    public int oprationChart(int datatype) {
+        return baseMapper.oprationChart(datatype);
+    }
+    /**
+     * 按指定类型统计合同数量
+     * @param params
+     *    datatype     1 按年
+     *                 2 按月
+     *                 3 按天
+     *                 4 按周
+     *    beginTime 查询时间段的开始时间
+     *    endTime   结束时间
+     * @return
+             */
+    @Override
+    public List<OrderChartVo> productOrderChart(Map<String, Object> params) {
+        return baseMapper.productOrderChart(params);
+    }
+    /**
+     * 统计产品的使用数量
+     * @return  ccount 是数量
+     *          units 是产品名称
+     */
+    @Override
+    public List<OrderChartVo> proCountChart() {
+        return baseMapper.proCountChart();
+    }
+    /**
+     *获取该科室下的所有的套餐信息
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<ProductOrderDetail> departmentProductDetail(Map<String, Object> params) {
+        Page<ProductOrderDetail> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<ProductOrderDetail> list  =
+                baseMapper.departmentProductDetail(page, Long.parseLong(params.get("hospitalId").toString()),Long.parseLong(params.get("departmentId").toString()));
+        return PageResult.<ProductOrderDetail>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+     * 获取诊断列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<DiagnosisRecord> findAllDataList(Map<String, Object> params){
+        return  diagnosticService.getDiagnosticItemList(params).getData();
+    }
+
+    /**
+     * 获取统计数据
+     * @param params
+     * @return
+     */
+
+    @Override
+    public PageResult<GroupProductDetail> groupList(Map<String, Object> params) {
+        Page<GroupProductDetail> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<GroupProductDetail> list  =  baseMapper.groupProductDetail(page,params);
+        return PageResult.<GroupProductDetail>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据ProductOrderDetail对象当做查询条件进行查询
+   * @param productOrderDetail
+   * @return ProductOrderDetail
+   */
+    @Override
+    public ProductOrderDetail findByObject(ProductOrderDetail productOrderDetail){
+        return baseMapper.findByObject(productOrderDetail);
+    }
+    /**
+     * 修改数据状态 启用 禁用
+     * @param params
+     * @return
+     */
+    @Override
+    public ResultBody updateEnabled(Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        Boolean enabled = MapUtils.getBoolean(params, "enabled");
+
+        ProductOrderDetail productOrder = baseMapper.selectById(id);
+        if (productOrder == null) {
+            return ResultBody.failed("该数据不存在!");
+        }
+        productOrder.setEnabled(enabled);
+        productOrder.setUpdateTime(new Date());
+        int i = baseMapper.updateById(productOrder);
+        return i > 0 ? ResultBody.ok().data(productOrder).msg("更新成功") : ResultBody.failed("更新失败");
+    }
+
+    @Override
+    public ResultBody getTypeByUser(SysUser sysUser) {
+        List<SysOrganization> organizations = sysUser.getOrganizations();
+        if(organizations.size()>0){
+            SysOrganization sysOrganization = organizations.get(0);
+            List<ProductOrderJoinDetail> list=baseMapper.getTypeByUser(sysOrganization.getId());
+            if (list.size()>0) {
+                ProductOrderJoinDetail productOrderJoinDetail = list.get(0);
+                //查询用户的真实姓名
+                Map<String,Object> selectMap=new HashMap<>();
+                selectMap.put("user_id",sysUser.getId());
+                ResultBody listByMap = sysDoctorService.getListByMap(selectMap);
+                List<SysDoctor> sysDoctors = JSON.parseArray(JSON.toJSONString(listByMap.getData()), SysDoctor.class);
+                String str="";
+                if(sysDoctors!=null&&sysDoctors.size()>0){
+                    str= sysDoctors.get(0).getDoctorName();
+                }
+                //查询医院的 logo
+                Map<String,Object> map=new HashMap<>();
+                map.put("id",sysOrganization.getId());
+                ResultBody allByMap = sysHospitalService.findAllByMap(map);
+                List<SysHospital> hospitals = JSON.parseArray(JSON.toJSONString(allByMap.getData()), SysHospital.class);
+                String logo="";
+                if(hospitals.size()>0){
+                    logo = hospitals.get(0).getHospitalLogo();
+                }
+                Map<String,Object> mapVo=new HashMap<>();
+                mapVo.put("type",productOrderJoinDetail.getProType());
+                mapVo.put("realName",str);
+                //剩余时间
+                Date proEndtime = productOrderJoinDetail.getProEndtime();
+                Double surplusDay=DateUtils.getDays(proEndtime, new Date());
+                int surplus = surplusDay.intValue();
+                mapVo.put("surplus",surplus);
+                mapVo.put("logo",logo);
+                //获取 售后服务工程师********不能从sysOrganization获取,从department获取
+               /* mapVo.put("saleUserName",sysOrganization.getSaleUserName());
+                mapVo.put("saleUserTel",sysOrganization.getSaleUserTel());*/
+                return ResultBody.ok().data(mapVo);
+            }else {
+                return ResultBody.failed("该用户套餐已经失效");
+            }
+        }else {
+            return ResultBody.failed("该用户的组织已经失效");
+        }
+    }
+    /**
+     *获取医院的套餐数据
+     * @param hospitalId
+     * @param departmentId
+     * @return
+     */
+    @Override
+    public UserProductDetail getUserProductDetail(Long hospitalId, Long departmentId)
+    {
+        //查询当前医院正在使用的套餐
+        Map<String, Object> selectMap = new HashMap<>();
+        selectMap.put("hospitalId", hospitalId);
+        List<ProductOrderJoinDetail> productOrderDetailList = this.findAllList(selectMap);
+        if (productOrderDetailList.size() > 0) {
+            UserProductDetail userProductDetail=new UserProductDetail();
+            //包含共享的数据
+            userProductDetail.setProductOrderJoinDetailListShare(productOrderDetailList.stream().filter(f -> f.getIsShare()).collect(Collectors.toList()));
+            //科室私有的数据
+            userProductDetail.setProductOrderJoinDetailsListDep(productOrderDetailList.stream().filter((f -> departmentId.equals(f.getDepartmentId()) && !f.getIsShare())).collect(Collectors.toList()));
+            return userProductDetail;
+        }
+        return null;
+    }
+    /**
+     * 统计用户所有套餐剩余  套餐剩余量=(有效期内的医院所有共享+科室私有的套餐的读片量)-预扣费的读片量
+     *
+     * @param hospitalId
+     * @param departmentId
+     * @return
+     */
+    @Override
+    public ResultBody biUserNowProduct(Long hospitalId, Long departmentId) {
+        if (hospitalId > 0 && departmentId > 0) {
+            UserProductDetail userProductDetail=getUserProductDetail(hospitalId,departmentId);
+            int userAICount = 0;
+            if (userProductDetail!=null) {
+                //包含共享的数据
+                List<ProductOrderJoinDetail> productOrderJoinDetailListShare = userProductDetail.getProductOrderJoinDetailListShare();
+                //科室私有的数据
+                List<ProductOrderJoinDetail> productOrderJoinDetailsListDep = userProductDetail.getProductOrderJoinDetailsListDep();
+                //本医院可共享的读片总量
+                int shareCount = (productOrderJoinDetailListShare.size()>0)?
+                        productOrderJoinDetailListShare.stream().collect(Collectors.summingInt(ProductOrderJoinDetail::getAilightCount))
+                        :0;
+                //本科室私有读片总量
+                int depCount = (productOrderJoinDetailsListDep.size()>0)?
+                        productOrderJoinDetailsListDep.stream().collect(Collectors.summingInt(ProductOrderJoinDetail::getAilightCount))
+                        :0;
+                //可用的总量
+                userAICount = shareCount + depCount;
+
+                //共享套餐里面的detailid
+                List<Long> shareDetailId = (productOrderJoinDetailListShare.size()>0)
+                        ?productOrderJoinDetailListShare.stream().map(m -> m.getId()).collect(Collectors.toList())
+                        :new ArrayList<>();
+                //私有套餐里面的detailid
+                List<Long> depDetailId = (productOrderJoinDetailsListDep.size()>0)
+                        ?productOrderJoinDetailsListDep.stream().map(m -> m.getId()).collect(Collectors.toList())
+                        :new ArrayList<>();
+                //获取所有有效的套餐id
+                List<Long> nowDetailList=new ArrayList<>();
+                BeanUtils.copyProperties(shareDetailId,nowDetailList);
+                nowDetailList.addAll(depDetailId);
+                //查询已预扣 未退还  未扣费的数据
+                List<ConsumptionRecord> consumptionRecordList = consumptionRecordMapper.findDetailList(nowDetailList);
+                //计算预扣费的总量
+                if (consumptionRecordList.size() > 0) {
+                    //共享套餐里面预扣费总数
+                    int shareConCount = (shareDetailId.size()>0)?consumptionRecordList.stream()
+                            .filter(f -> shareDetailId.contains(f.getProOrderDetailId()))
+                            .collect(Collectors.summingInt(ConsumptionRecord::getConsumptionCount)):0;
+                    //私有套餐里面预扣费总数
+                    int depConCount = (depDetailId.size()>0)?consumptionRecordList.stream()
+                            .filter(f -> depDetailId.contains(f.getProOrderDetailId()))
+                            .collect(Collectors.summingInt(ConsumptionRecord::getConsumptionCount)):0;
+                    userAICount -= (shareConCount + depConCount);
+                }
+            }
+
+            return ResultBody.ok().data(userAICount);
+        } else {
+            return ResultBody.failed("医院和科室数据有误!");
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderRecordServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderRecordServiceImpl.java
new file mode 100644
index 0000000..9940f0d
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderRecordServiceImpl.java
@@ -0,0 +1,191 @@
+package com.kidgrow.oprationcenter.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.model.*;
+import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.common.utils.DateUtils;
+import com.kidgrow.oprationcenter.feign.DiagnosticService;
+import com.kidgrow.oprationcenter.feign.RoleOrganizationService;
+import com.kidgrow.oprationcenter.mapper.ProductOrderRecordMapper;
+import com.kidgrow.oprationcenter.model.ProductOrderRecord;
+import com.kidgrow.oprationcenter.service.IProductOrderRecordService;
+import com.kidgrow.oprationcenter.vo.DiagnosisRecord;
+import com.kidgrow.oprationcenter.vo.GroupProductDetail;
+import com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail;
+import com.kidgrow.usercenter.feign.SysDoctorService;
+import com.kidgrow.usercenter.feign.SysHospitalService;
+import com.kidgrow.usercenter.model.SysHospital;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 产品/明显的充值记录<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@Service
+public class ProductOrderRecordServiceImpl extends SuperServiceImpl<ProductOrderRecordMapper, ProductOrderRecord> implements IProductOrderRecordService {
+    @Autowired
+    DiagnosticService diagnosticService;
+    @Autowired
+    private RoleOrganizationService roleOrganizationService;
+    @Autowired
+    private SysDoctorService sysDoctorService;
+    @Autowired
+    private SysHospitalService sysHospitalService;
+
+    /**
+     * 列表
+     *
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<ProductOrderRecord> findList(Map<String, Object> params) {
+        Page<ProductOrderRecord> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<ProductOrderRecord> list = baseMapper.findList(page, params);
+        return PageResult.<ProductOrderRecord>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+     * 获取诊断列表
+     *
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<DiagnosisRecord> findAllDataList(Map<String, Object> params) {
+        return diagnosticService.getDiagnosticItemList(params).getData();
+    }
+
+    /**
+     * 列表
+     *
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<ProductOrderJoinDetail> findAllList(Map<String, Object> params, SysUser sysUser) {
+        Page<ProductOrderJoinDetail> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        Map<String, Object> roleOrgMap = roleOrganizationService.getRoleOrgMap(sysUser.getRoles());
+        params.putAll(roleOrgMap);
+        List<ProductOrderJoinDetail> list = baseMapper.findAllList(page, params);
+        for (ProductOrderJoinDetail productOrderJoinDetail : list) {
+            Date proBegintime = productOrderJoinDetail.getProBegintime();
+            Date proEndtime = productOrderJoinDetail.getProEndtime();
+            Date nowDate = new Date();
+            if(nowDate.getTime()<proBegintime.getTime()){
+                productOrderJoinDetail.setUseType("未使用");
+            }else if (proBegintime.getTime()<=nowDate.getTime()&&nowDate.getTime()<proEndtime.getTime()){
+                productOrderJoinDetail.setUseType("使用中");
+            }else if(nowDate.getTime()>=proEndtime.getTime()){
+                productOrderJoinDetail.setUseType("已结束");
+            }
+        }
+        return PageResult.<ProductOrderJoinDetail>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+     * 获取统计数据
+     *
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<GroupProductDetail> groupList(Map<String, Object> params) {
+        Page<GroupProductDetail> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<GroupProductDetail> list = baseMapper.groupProductDetail(page, params);
+        return PageResult.<GroupProductDetail>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+    /**
+     * 根据ProductOrderRecord对象当做查询条件进行查询
+     *
+     * @param productOrderRecord
+     * @return ProductOrderRecord
+     */
+    @Override
+    public ProductOrderRecord findByObject(ProductOrderRecord productOrderRecord) {
+        return baseMapper.findByObject(productOrderRecord);
+    }
+
+    /**
+     * 修改数据状态 启用 禁用
+     *
+     * @param params
+     * @return
+     */
+    @Override
+    public ResultBody updateEnabled(Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        Boolean enabled = MapUtils.getBoolean(params, "enabled");
+
+        ProductOrderRecord productOrder = baseMapper.selectById(id);
+        if (productOrder == null) {
+            return ResultBody.failed("该数据不存在!");
+        }
+        productOrder.setEnabled(enabled);
+        productOrder.setUpdateTime(new Date());
+        int i = baseMapper.updateById(productOrder);
+        return i > 0 ? ResultBody.ok().data(productOrder).msg("更新成功") : ResultBody.failed("更新失败");
+    }
+
+    @Override
+    public ResultBody getTypeByUser(SysUser sysUser) {
+        List<SysOrganization> organizations = sysUser.getOrganizations();
+        if (organizations.size() > 0) {
+            SysOrganization sysOrganization = organizations.get(0);
+            List<ProductOrderJoinDetail> list = baseMapper.getTypeByUser(sysOrganization.getId());
+            if (list.size() > 0) {
+                ProductOrderJoinDetail productOrderJoinDetail = list.get(0);
+                //查询用户的真实姓名
+                Map<String, Object> selectMap = new HashMap<>();
+                selectMap.put("user_id", sysUser.getId());
+                ResultBody listByMap = sysDoctorService.getListByMap(selectMap);
+                List<SysDoctor> sysDoctors = JSON.parseArray(JSON.toJSONString(listByMap.getData()), SysDoctor.class);
+                String str = "";
+                if (sysDoctors != null && sysDoctors.size() > 0) {
+                    str = sysDoctors.get(0).getDoctorName();
+                }
+                //查询医院的 logo
+                Map<String, Object> map = new HashMap<>();
+                map.put("id", sysOrganization.getId());
+                ResultBody allByMap = sysHospitalService.findAllByMap(map);
+                List<SysHospital> hospitals = JSON.parseArray(JSON.toJSONString(allByMap.getData()), SysHospital.class);
+                String logo = "";
+                if (hospitals.size() > 0) {
+                    logo = hospitals.get(0).getHospitalLogo();
+                }
+                Map<String, Object> mapVo = new HashMap<>();
+                mapVo.put("type", productOrderJoinDetail.getProType());
+                mapVo.put("realName", str);
+                //剩余时间
+                Date proEndtime = productOrderJoinDetail.getProEndtime();
+                Double surplusDay = DateUtils.getDays(proEndtime, new Date());
+                int surplus = surplusDay.intValue();
+                mapVo.put("surplus", surplus);
+                mapVo.put("logo", logo);
+                //获取 售后服务工程师********不能从sysOrganization获取,从department获取
+               /* mapVo.put("saleUserName",sysOrganization.getSaleUserName());
+                mapVo.put("saleUserTel",sysOrganization.getSaleUserTel());*/
+                return ResultBody.ok().data(mapVo);
+            } else {
+                return ResultBody.failed("该用户套餐已经失效");
+            }
+        } else {
+            return ResultBody.failed("该用户的组织已经失效");
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderServiceImpl.java
new file mode 100644
index 0000000..d631229
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/ProductOrderServiceImpl.java
@@ -0,0 +1,204 @@
+package com.kidgrow.oprationcenter.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.annotation.LoginUser;
+import com.kidgrow.common.constant.CommonConstant;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.common.utils.DateUtil;
+import com.kidgrow.common.utils.RandomValueUtils;
+import com.kidgrow.oprationcenter.feign.RoleOrganizationService;
+import com.kidgrow.oprationcenter.mapper.ProductOrderDetailMapper;
+import com.kidgrow.oprationcenter.mapper.ProductOrderMapper;
+import com.kidgrow.oprationcenter.mapper.ProductOrderRecordMapper;
+import com.kidgrow.oprationcenter.model.ProductOrder;
+import com.kidgrow.oprationcenter.model.ProductOrderDetail;
+import com.kidgrow.oprationcenter.model.ProductOrderRecord;
+import com.kidgrow.oprationcenter.model.SysProduct;
+import com.kidgrow.oprationcenter.service.IProductOrderService;
+import com.kidgrow.oprationcenter.service.ISysProductService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 产品的充值记录-订单<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+@Slf4j
+@Service
+public class ProductOrderServiceImpl extends SuperServiceImpl<ProductOrderMapper, ProductOrder> implements IProductOrderService {
+    @Autowired
+    private RoleOrganizationService roleOrganizationService;
+    @Autowired
+    private ISysProductService sysProductService;
+    @Autowired
+    private ProductOrderDetailMapper productOrderDetailMapper;
+    @Autowired
+    private ProductOrderRecordMapper productOrderRecordMapper;
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<ProductOrder> findList(Map<String, Object> params,@LoginUser SysUser sysUser){
+        Page<ProductOrder> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        Map<String, Object> roleOrgMap = roleOrganizationService.getRoleOrgMap(sysUser.getRoles());
+        params.putAll(roleOrgMap);
+        List<ProductOrder> list  =  baseMapper.findList(page, params);
+        return PageResult.<ProductOrder>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据ProductOrder对象当做查询条件进行查询
+   * @param productOrder
+   * @return ProductOrder
+   */
+    @Override
+    public ProductOrder findByObject(ProductOrder productOrder){
+        return baseMapper.findByObject(productOrder);
+    }
+
+    /**
+     * 修改数据状态 启用 禁用
+     * @param params
+     * @return
+     */
+    @Override
+    public ResultBody updateEnabled(Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        Boolean enabled = MapUtils.getBoolean(params, "enabled");
+
+        ProductOrder productOrder = baseMapper.selectById(id);
+        if (productOrder == null) {
+            return ResultBody.failed("该数据不存在!");
+        }
+        productOrder.setEnabled(enabled);
+        productOrder.setUpdateTime(new Date());
+        int i = baseMapper.updateById(productOrder);
+        return i > 0 ? ResultBody.ok().data(productOrder).msg("更新成功") : ResultBody.failed("更新失败");
+    }
+
+    @Override
+    public int delProductDetail(Long orderId) {
+        return baseMapper.delProductDetail(orderId);
+    }
+
+    /**
+     * 用户充值(创建订单,增加充值记录,冲套餐)
+     * @param params
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public boolean saveProductDetail(Map<String,Object> params,SysUser sysUser)
+    {
+        //指定套餐数据
+        SysProduct sysProduct=sysProductService.getById(CommonConstant.REG_USER_PRODUCT_ID);
+        if (sysProduct != null) {
+            //订单合同数据
+            ProductOrder productOrder=new ProductOrder();
+            productOrder.setIsDel(false);
+            productOrder.setEnabled(true);
+            productOrder.setContractBeginTime(new Date());
+            productOrder.setContractEndTime(DateUtil.addDays(new Date(), CommonConstant.REG_USER_CONTRACT_DAY));
+            productOrder.setContractTime(new Date());
+            productOrder.setContractNo(RandomValueUtils.getRandom(10));
+            productOrder.setContractTitle(CommonConstant.REG_USER_CONTRACT_NAME);
+            productOrder.setHospitalId(Long.valueOf(params.get("hospitalId").toString()));
+            productOrder.setHospitalName(params.get("hospitalName").toString());
+            productOrder.setDepartmentId(Long.valueOf(params.get("departmentId").toString()));
+            productOrder.setDepartmentName(params.get("departmentName").toString());
+            productOrder.setCreateUserId(CommonConstant.CREATE_USER_ID);
+            productOrder.setCreateUserName(CommonConstant.CREATE_USER_NAME);
+            if (baseMapper.insert(productOrder)==1) {
+                //套餐数据
+                ProductOrderDetail productOrderDetail=new ProductOrderDetail();
+                productOrderDetail.setEnabled(true);
+                productOrderDetail.setIsDel(false);
+                productOrderDetail.setAilightCount(sysProduct.getAilightCount());
+                productOrderDetail.setRecordCount(sysProduct.getRecordCount());
+                productOrderDetail.setProBegintime(new Date());
+                //0 天 1 月 2 年
+                switch(sysProduct.getProTimeUnit())
+                {
+                    case 0:
+                    default:
+                        productOrderDetail.setProEndtime(DateUtil.addDays(new Date(),sysProduct.getProTime()));
+                        break;
+                    case 1:
+                        productOrderDetail.setProEndtime(DateUtil.addMonths(new Date(),sysProduct.getProTime()));
+                        break;
+                    case 2:
+                        productOrderDetail.setProEndtime(DateUtil.addYears(new Date(),sysProduct.getProTime()));
+                        break;
+                }
+                productOrderDetail.setProId(sysProduct.getId());
+                productOrderDetail.setProName(sysProduct.getProName());
+                productOrderDetail.setOrderId(productOrder.getId());
+                productOrderDetail.setProType(sysProduct.getProType());
+                productOrderDetail.setCreateUserId(CommonConstant.CREATE_USER_ID);
+                productOrderDetail.setCreateUserName(CommonConstant.CREATE_USER_NAME);
+                productOrderDetail.setIsShare(false);
+                if(productOrderDetailMapper.insert(productOrderDetail)==1)
+                {
+                    //充值记录
+                    ProductOrderRecord productOrderRecord=new ProductOrderRecord();
+                    productOrderRecord.setEnabled(true);
+                    productOrderRecord.setIsDel(false);
+                    productOrderRecord.setAilightCount(sysProduct.getAilightCount());
+                    productOrderRecord.setRecordCount(sysProduct.getRecordCount());
+                    productOrderRecord.setProBegintime(new Date());
+                    productOrderRecord.setIsShare(false);
+                    //0 天 1 月 2 年
+                    switch(sysProduct.getProTimeUnit())
+                    {
+                        case 0:
+                        default:
+                            productOrderRecord.setProEndtime(DateUtil.addDays(new Date(),sysProduct.getProTime()));
+                            break;
+                        case 1:
+                            productOrderRecord.setProEndtime(DateUtil.addMonths(new Date(),sysProduct.getProTime()));
+                            break;
+                        case 2:
+                            productOrderRecord.setProEndtime(DateUtil.addYears(new Date(),sysProduct.getProTime()));
+                            break;
+                    }
+                    productOrderRecord.setProId(sysProduct.getId());
+                    productOrderRecord.setProName(sysProduct.getProName());
+                    productOrderRecord.setOrderId(productOrder.getId());
+                    productOrderRecord.setProType(sysProduct.getProType());
+                    productOrderRecord.setCreateUserId(CommonConstant.CREATE_USER_ID);
+                    productOrderRecord.setCreateUserName(CommonConstant.CREATE_USER_NAME);
+                    if(productOrderRecordMapper.insert(productOrderRecord)<1)
+                    {
+                        baseMapper.deleteById(productOrder.getId());
+                        productOrderDetailMapper.deleteById(productOrderDetail.getId());
+                    }
+                    else
+                    {
+                        return true;
+                    }
+                }
+                else
+                {
+                    baseMapper.deleteById(productOrder.getId());
+                }
+            }
+        }
+        return false;
+    }
+}
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
new file mode 100644
index 0000000..dc74330
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysFeedbackServiceImpl.java
@@ -0,0 +1,104 @@
+package com.kidgrow.oprationcenter.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.model.SysOrganization;
+import com.kidgrow.common.model.SysUser;
+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 com.kidgrow.usercenter.feign.SysDoctorService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: <br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@Service
+public class SysFeedbackServiceImpl extends SuperServiceImpl<SysFeedbackMapper, SysFeedback> implements ISysFeedbackService {
+    @Autowired
+    SysDoctorService sysDoctorService;
+
+    /**
+     * 列表
+     *
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<SysFeedback> findList(Map<String, Object> params) {
+        Page<SysFeedback> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<SysFeedback> list = baseMapper.findList(page, params);
+        return PageResult.<SysFeedback>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+     * 根据SysFeedback对象当做查询条件进行查询
+     *
+     * @param sysFeedback
+     * @return SysFeedback
+     */
+    @Override
+    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("更新失败");
+    }
+
+    @Override
+    public boolean saveOrUpdateStr(SysFeedback sysFeedback, SysUser sysUser) {
+        if (sysFeedback.getId()==null) {
+            List<SysOrganization> organizations = sysUser.getOrganizations();
+            if (organizations.size() > 0) {
+                int insert = baseMapper.insert(sysFeedback);
+                if (insert > 0) {
+                    return true;
+                } else {
+                    return false;
+                }
+            }
+        }else {
+            int i = baseMapper.updateById(sysFeedback);
+            if (i > 0) {
+                return true;
+            } else {
+                return false;
+            }
+        }
+        return false;
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysLoggerServiceImpl.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysLoggerServiceImpl.java
new file mode 100644
index 0000000..aa4ed6e
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysLoggerServiceImpl.java
@@ -0,0 +1,49 @@
+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.service.impl.SuperServiceImpl;
+
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections4.MapUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import com.kidgrow.oprationcenter.model.SysLogger;
+import com.kidgrow.oprationcenter.mapper.SysLoggerMapper;
+import com.kidgrow.oprationcenter.service.ISysLoggerService;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: <br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+@Slf4j
+@Service
+public class SysLoggerServiceImpl extends SuperServiceImpl<SysLoggerMapper, SysLogger> implements ISysLoggerService {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<SysLogger> findList(Map<String, Object> params){
+        Page<SysLogger> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<SysLogger> list  =  baseMapper.findList(page, params);
+        return PageResult.<SysLogger>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据SysLogger对象当做查询条件进行查询
+   * @param sysLogger
+   * @return SysLogger
+   */
+    @Override
+    public SysLogger findByObject(SysLogger sysLogger){
+        return baseMapper.findByObject(sysLogger);
+    }
+}
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
new file mode 100644
index 0000000..213bb71
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/service/impl/SysProductServiceImpl.java
@@ -0,0 +1,110 @@
+package com.kidgrow.oprationcenter.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.model.SysUser;
+import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.common.utils.DateUtil;
+import com.kidgrow.oprationcenter.feign.RoleOrganizationService;
+import com.kidgrow.oprationcenter.mapper.SysProductMapper;
+import com.kidgrow.oprationcenter.model.SysProduct;
+import com.kidgrow.oprationcenter.service.ISysProductService;
+import com.kidgrow.oprationcenter.vo.ProductAllVo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: <br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-01 09:37:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+@Slf4j
+@Service
+public class SysProductServiceImpl extends SuperServiceImpl<SysProductMapper, SysProduct> implements ISysProductService {
+    @Autowired
+    private RoleOrganizationService roleOrganizationService;
+
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<SysProduct> findList(Map<String, Object> params, SysUser sysUser){
+        Page<SysProduct> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        Map<String, Object> roleOrgMap = roleOrganizationService.getRoleOrgMap(sysUser.getRoles());
+        params.putAll(roleOrgMap);
+        List<SysProduct> list  =  baseMapper.findList(page, params);
+        return PageResult.<SysProduct>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<ProductAllVo> findAllList(Map<String, Object> params, SysUser sysUser){
+        List<ProductAllVo> list  =  baseMapper.findAllList(params);
+        if (list != null) {
+            for (int i = 0; i <list.size() ; i++) {
+                list.get(i).setBeginTime(new Date());
+                switch (list.get(i).getProTimeUnit())
+                {
+                    //天
+                    case 0:
+                        list.get(i).setEndTime(DateUtil.addDays(new Date(),list.get(i).getProTime()));
+                        break;
+                        //月
+                    case 1:
+                        list.get(i).setEndTime(DateUtil.addMonths(new Date(),list.get(i).getProTime()));
+                        break;
+                        //年
+                    case 2:
+                        list.get(i).setEndTime(DateUtil.addYears(new Date(),list.get(i).getProTime()));
+                        break;
+                }
+            }
+        }
+        return PageResult.<ProductAllVo>builder().data(list).code(0).count(0L).build();
+    }
+
+    /**
+   * 根据SysProduct对象当做查询条件进行查询
+   * @param sysProduct
+   * @return SysProduct
+   */
+    @Override
+    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/java/com/kidgrow/oprationcenter/test.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/test.java
new file mode 100644
index 0000000..45aa41d
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/java/com/kidgrow/oprationcenter/test.java
@@ -0,0 +1,12 @@
+package com.kidgrow.oprationcenter;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/4/1 10:14 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class test {
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/BusinessRecordsMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/BusinessRecordsMapper.xml
new file mode 100644
index 0000000..9f33dac
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/BusinessRecordsMapper.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--业务操作记录-->
+<mapper namespace="com.kidgrow.oprationcenter.mapper.BusinessRecordsMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.recordTitle != null and p.recordTitle !=''">
+                and record_title like '%${p.recordTitle}%'
+            </if>
+            <if test="p.userId != null and p.userId !=''">
+                and user_id = #{p.userId}
+            </if>
+            <if test="p.userName != null and p.userName !=''">
+                and user_name = #{p.userName}
+            </if>
+            <if test="p.appId != null and p.appId !=''">
+                and app_id = #{p.appId}
+            </if>
+            <if test="p.appName != null and p.appName !=''">
+                and app_name = #{p.appName}
+            </if>
+            <if test="p.recordIp != null and p.recordIp !=''">
+                and record_ip = #{p.recordIp}
+            </if>
+            <if test="p.recordDetail != null and p.recordDetail !=''">
+                and record_detail = #{p.recordDetail}
+            </if>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <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.startTime!= null and p.startTime !=''">
+                and create_time &gt;= #{p.startTime}
+            </if>
+            <if test="p.endTime!= null and p.endTime !=''">
+                and create_time &lt;= #{p.endTime}
+            </if>
+            <if test="p.updateTime != null and p.updateTime !=''">
+                and update_time = #{p.updateTime}
+            </if>
+        </where>
+    </sql>
+
+    <!--定义根据-BusinessRecords当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.BusinessRecords">
+        select
+        <include refid="Column_List"/>
+        from business_records
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-BusinessRecords当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.BusinessRecords">
+        select
+        <include refid="Column_List"/>
+        from business_records
+        <include refid="where"/>
+        order by id desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/BusinessServerMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/BusinessServerMapper.xml
new file mode 100644
index 0000000..7e4a39d
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/BusinessServerMapper.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--医院服务信息表-->
+<mapper namespace="com.kidgrow.oprationcenter.mapper.BusinessServerMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.departmentId != null and p.departmentId !=''">
+                and department_id = #{p.departmentId}
+            </if>
+            <if test="p.doctorCount != null and p.doctorCount !=''">
+                and doctor_count = #{p.doctorCount}
+            </if>
+            <if test="p.serverEndDate != null and p.serverEndDate !=''">
+                and server_end_date = #{p.serverEndDate}
+            </if>
+            <if test="p.totalRayCount != null and p.totalRayCount !=''">
+                and total_ray_count = #{p.totalRayCount}
+            </if>
+            <if test="p.totalRecordCount != null and p.totalRecordCount !=''">
+                and total_record_count = #{p.totalRecordCount}
+            </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>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.tenantId != null and p.tenantId !=''">
+                and tenant_id = #{p.tenantId}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <if test="p.updateUserName != null and p.updateUserName !=''">
+                and update_user_name = #{p.updateUserName}
+            </if>
+        </where>
+    </sql>
+
+    <!--定义根据-BusinessServer当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.BusinessServer">
+        select
+        <include refid="Column_List"/>
+        from business_server
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-BusinessServer当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.BusinessServer">
+        select
+        <include refid="Column_List"/>
+        from business_server
+        <include refid="where"/>
+        order by id desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ConsumptionRecordMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ConsumptionRecordMapper.xml
new file mode 100644
index 0000000..d0898fe
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ConsumptionRecordMapper.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!---->
+<mapper namespace="com.kidgrow.oprationcenter.mapper.ConsumptionRecordMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            1=1
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.lastRecordId != null and p.lastRecordId !=''">
+                and last_record_id = #{p.lastRecordId}
+            </if>
+            <if test="p.proOrderDetailId != null and p.proOrderDetailId !=''">
+                and pro_order_detail_id = #{p.proOrderDetailId}
+            </if>
+            <if test="p.businessId != null and p.businessId !=''">
+                and business_id = #{p.businessId}
+            </if>
+            <if test="p.recordType != null and p.recordType !=''">
+                and record_type = #{p.recordType}
+            </if>
+            <if test="p.businessCode != null and p.businessCode !=''">
+                and business_code = #{p.businessCode}
+            </if>
+            <if test="p.consumptionCount != null and p.consumptionCount !=''">
+                and consumption_count = #{p.consumptionCount}
+            </if>
+            <if test="p.updateTime != null and p.updateTime !=''">
+                and update_time = #{p.updateTime}
+            </if>
+            <if test="p.createTime != null and p.createTime !=''">
+                and create_time = #{p.createTime}
+            </if>
+        </where>
+    </sql>
+
+    <!--定义根据-ConsumptionRecord当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.ConsumptionRecord">
+        select
+        <include refid="Column_List"/>
+        from consumption_record
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-ConsumptionRecord当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.ConsumptionRecord">
+        select
+        <include refid="Column_List"/>
+        from consumption_record
+        <include refid="where"/>
+        order by id desc
+    </select>
+    <!--定义根据-ConsumptionRecord当作查询条件返回对象集合-->
+    <select id="findDetailList" resultType="com.kidgrow.oprationcenter.model.ConsumptionRecord">
+        SELECT * FROM `consumption_record`
+        where record_type=1
+        and update_time is null
+            <if test="DetailList!=null and DetailList.size()>0">
+                and pro_order_detail_id in
+                <foreach item="item" index="index" collection="DetailList" open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+        order by id desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DataNeedMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DataNeedMapper.xml
new file mode 100644
index 0000000..59a3051
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DataNeedMapper.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--医生的数据需求-->
+<mapper namespace="com.kidgrow.oprationcenter.mapper.DataNeedMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.needType != null and p.needType !=''">
+                and need_type = #{p.needType}
+            </if>
+            <if test="p.doctorId != null and p.doctorId !=''">
+                and doctor_id = #{p.doctorId}
+            </if>
+            <if test="p.doctorName != null and p.doctorName !=''">
+                and doctor_name like '%${p.doctorName}%'
+            </if>
+            <if test="p.hospitalId != null and p.hospitalId !=''">
+                and hospital_id = #{p.hospitalId}
+            </if>
+            <if test="p.hospitalName != null and p.hospitalName !=''">
+                and hospital_name = #{p.hospitalName}
+            </if>
+            <if test="p.departmentId != null and p.departmentId !=''">
+                and department_id = #{p.departmentId}
+            </if>
+            <if test="p.departmentName != null and p.departmentName !=''">
+                and department_name = #{p.departmentName}
+            </if>
+            <if test="p.doctorTel != null and p.doctorTel !=''">
+                and doctor_tel = #{p.doctorTel}
+            </if>
+            <if test="p.needBegintime != null and p.needBegintime !=''">
+                and need_begintime &gt;= #{p.needBegintime}
+            </if>
+            <if test="p.needEndtime != null and p.needEndtime !=''">
+                and need_endtime &lt;= #{p.needEndtime}
+            </if>
+            <if test="p.needTags != null and p.needTags !=''">
+                and need_tags = #{p.needTags}
+            </if>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.dataFile != null and p.dataFile !=''">
+                and data_file = #{p.dataFile}
+            </if>
+            <if test="p.downTime != null and p.downTime !=''">
+                and down_time = #{p.downTime}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <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>
+        </where>
+    </sql>
+
+    <!--定义根据-DataNeed当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.DataNeed">
+        select
+        <include refid="Column_List"/>
+        from data_need
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-DataNeed当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.DataNeed">
+        select
+        <include refid="Column_List"/>
+        from data_need
+        <include refid="where"/>
+        order by id desc
+    </select>
+    <!--定义根据-DataNeed当作查询条件返回对象集合-->
+    <select id="findHList" resultType="com.kidgrow.oprationcenter.model.DataNeed">
+        select
+        <include refid="H_Column_List"/>
+        from data_need
+        <include refid="where"/>
+        order by id desc
+    </select>
+    <!--定义查询列-->
+    <sql id="H_Column_List">
+	   id,need_type,doctor_name,hospital_id,department_id,need_begintime,need_endtime,data_file,down_time,enabled
+	</sql>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorAnswerMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorAnswerMapper.xml
new file mode 100644
index 0000000..0fd75fd
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorAnswerMapper.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--医答医生信息表-未完待续-->
+<mapper namespace="com.kidgrow.oprationcenter.mapper.DoctorAnswerMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <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>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <if test="p.updateUserName != null and p.updateUserName !=''">
+                and update_user_name = #{p.updateUserName}
+            </if>
+        </where>
+    </sql>
+
+    <!--定义根据-DoctorAnswer当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.DoctorAnswer">
+        select
+        <include refid="Column_List"/>
+        from doctor_answer
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-DoctorAnswer当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.DoctorAnswer">
+        select
+        <include refid="Column_List"/>
+        from doctor_answer
+        <include refid="where"/>
+        order by id desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorServerMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorServerMapper.xml
new file mode 100644
index 0000000..c28b6ad
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorServerMapper.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--医生业务服务信息表-->
+<mapper namespace="com.kidgrow.oprationcenter.mapper.DoctorServerMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.isAnswer != null and p.isAnswer !=''">
+                and is_answer = #{p.isAnswer}
+            </if>
+            <if test="p.isSigning != null and p.isSigning !=''">
+                and is_signing = #{p.isSigning}
+            </if>
+            <if test="p.doctorState != null and p.doctorState !=''">
+                and doctor_state = #{p.doctorState}
+            </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>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <if test="p.updateUserName != null and p.updateUserName !=''">
+                and update_user_name = #{p.updateUserName}
+            </if>
+        </where>
+    </sql>
+
+    <!--定义根据-DoctorServer当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.DoctorServer">
+        select
+        <include refid="Column_List"/>
+        from doctor_server
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-DoctorServer当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.DoctorServer">
+        select
+        <include refid="Column_List"/>
+        from doctor_server
+        <include refid="where"/>
+        order by id desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorSigningMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorSigningMapper.xml
new file mode 100644
index 0000000..b9c3899
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorSigningMapper.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--签约医生信息表-未完待续-->
+<mapper namespace="com.kidgrow.oprationcenter.mapper.DoctorSigningMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <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>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <if test="p.updateUserName != null and p.updateUserName !=''">
+                and update_user_name = #{p.updateUserName}
+            </if>
+        </where>
+    </sql>
+
+    <!--定义根据-DoctorSigning当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.DoctorSigning">
+        select
+        <include refid="Column_List"/>
+        from doctor_signing
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-DoctorSigning当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.DoctorSigning">
+        select
+        <include refid="Column_List"/>
+        from doctor_signing
+        <include refid="where"/>
+        order by id desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorTempleteMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorTempleteMapper.xml
new file mode 100644
index 0000000..dca1e77
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/DoctorTempleteMapper.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--医生的模板-->
+<mapper namespace="com.kidgrow.oprationcenter.mapper.DoctorTempleteMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.hospitalId != null and p.hospitalId !=''">
+                and hospital_id = #{p.hospitalId}
+            </if>
+            <if test="p.hospitalName != null and p.hospitalName !=''">
+                and hospital_name = #{p.hospitalName}
+            </if>
+            <if test="p.departmentId != null and p.departmentId !=''">
+                and department_id = #{p.departmentId}
+            </if>
+            <if test="p.departmentName != null and p.departmentName !=''">
+                and department_name = #{p.departmentName}
+            </if>
+            <if test="p.doctorId != null and p.doctorId !=''">
+                and doctor_id = #{p.doctorId}
+            </if>
+            <if test="p.doctorName != null and p.doctorName !=''">
+                and doctor_name = #{p.doctorName}
+            </if>
+            <if test="p.publicType != null and p.publicType !=''">
+                and public_type = #{p.publicType}
+            </if>
+            <if test="p.templeteType != null and p.templeteType !=''">
+                and templete_type = #{p.templeteType}
+            </if>
+            <if test="p.templeteTitle != null and p.templeteTitle !=''">
+                and templete_title like '%${p.templeteTitle}%'
+            </if>
+            <if test="p.templeteNote != null and p.templeteNote !=''">
+                and templete_note = #{p.templeteNote}
+            </if>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.updateTime != null and p.updateTime !=''">
+                and update_time = #{p.updateTime}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <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>
+        </where>
+    </sql>
+
+    <!--定义根据-DoctorTemplete当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.DoctorTemplete">
+        select
+        <include refid="Column_List"/>
+        from doctor_templete
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-DoctorTemplete当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.DoctorTemplete">
+        select
+        <include refid="Column_List"/>
+        from doctor_templete
+        <include refid="where"/>
+        order by id desc
+    </select>
+    <select id="findDoctorList" resultType="com.kidgrow.oprationcenter.model.DoctorTemplete">
+        SELECT
+	id,
+	doctor_id,
+	doctor_name,
+	public_type,
+	templete_type,
+	templete_title,
+	templete_note,
+	create_time
+FROM
+	doctor_templete
+WHERE
+	is_del = 0
+	AND enabled = 1
+	<if test="p.templeteType!=null and p.templeteType!=''">
+        AND templete_type = #{p.templeteType}
+    </if>
+	AND((
+			hospital_id IS NULL
+			AND hospital_id IS NULL
+			AND doctor_id IS NULL
+			)
+		OR (
+				hospital_id =#{p.hospitalId}
+				AND department_id =#{p.departmentId}
+				AND (
+					public_type = 0
+					OR (
+						doctor_id =#{p.doctorId} AND public_type = 1))))
+				 ORDER BY public_type DESC,id desc
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/HospitalScreeningMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/HospitalScreeningMapper.xml
new file mode 100644
index 0000000..d7deceb
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/HospitalScreeningMapper.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--筛查医院信息表-未完待续-->
+<mapper namespace="com.kidgrow.oprationcenter.mapper.HospitalScreeningMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.hospitalId != null and p.hospitalId !=''">
+                and hospital_id = #{p.hospitalId}
+            </if>
+            <if test="p.hospitalName != null and p.hospitalName !=''">
+                and hospital_name = #{p.hospitalName}
+            </if>
+            <if test="p.hospitalLogo != null and p.hospitalLogo !=''">
+                and hospital_logo = #{p.hospitalLogo}
+            </if>
+            <if test="p.hospitalQrImage != null and p.hospitalQrImage !=''">
+                and hospital_qr_image = #{p.hospitalQrImage}
+            </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>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.tenantId != null and p.tenantId !=''">
+                and tenant_id = #{p.tenantId}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <if test="p.updateUserName != null and p.updateUserName !=''">
+                and update_user_name = #{p.updateUserName}
+            </if>
+        </where>
+    </sql>
+
+    <!--定义根据-HospitalScreening当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.HospitalScreening">
+        select
+        <include refid="Column_List"/>
+        from hospital_screening
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-HospitalScreening当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.HospitalScreening">
+        select
+        <include refid="Column_List"/>
+        from hospital_screening
+        <include refid="where"/>
+        order by id desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ProductOrderDetailMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ProductOrderDetailMapper.xml
new file mode 100644
index 0000000..14d010c
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ProductOrderDetailMapper.xml
@@ -0,0 +1,267 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--产品/明显的充值记录-->
+<mapper namespace="com.kidgrow.oprationcenter.mapper.ProductOrderDetailMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   DISTINCT *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.orderId != null and p.orderId !=''">
+                and order_id = #{p.orderId}
+            </if>
+            <if test="p.proId != null and p.proId !=''">
+                and pro_id = #{p.proId}
+            </if>
+            <if test="p.proName != null and p.proName !=''">
+                and pro_name = #{p.proName}
+            </if>
+            <if test="p.isShare != null and p.isShare !=''">
+                and is_share = #{p.isShare}
+            </if>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.ailightCount != null and p.ailightCount !=''">
+                and ailight_count = #{p.ailightCount}
+            </if>
+            <if test="p.recordCount != null and p.recordCount !=''">
+                and record_count = #{p.recordCount}
+            </if>
+            <if test="p.proBegintime != null and p.proBegintime !=''">
+                and pro_begintime = #{p.proBegintime}
+            </if>
+            <if test="p.proEndtime != null and p.proEndtime !=''">
+                and pro_endtime = #{p.proEndtime}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <if test="p.updateTime != null and p.updateTime !=''">
+                and update_time = #{p.updateTime}
+            </if>
+            <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>
+        </where>
+    </sql>
+    <!--定义根据-ProductOrderDetail当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.ProductOrderDetail">
+        select
+        <include refid="Column_List"/>
+        from product_order_detail
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-ProductOrderDetail当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.ProductOrderDetail">
+        select
+        <include refid="Column_List"/>
+        from product_order_detail
+        <include refid="where"/>
+        order by id desc
+    </select>
+    <!--sql查询片段-->
+    <sql id="wherelimit">
+        <where>
+            <!--查询条件自行添加-->
+            DE.is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.proType != null and p.proType !=''">
+                and DE.pro_type = #{p.proType}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and DE.enabled = #{p.enabled}
+            </if>
+            <if test="p.hospitalName != null and p.hospitalName !=''">
+                and PRO.hospital_name like concat ('%',#{p.hospitalName},'%')
+            </if>
+            <if test="p.proName != null and p.proName !=''">
+                and DE.pro_name like concat ('%',#{p.proName},'%')
+            </if>
+            <if test="p.createTime != null and p.createTime !='' and p.updateTime != null and p.updateTime !=''">
+                and (DE.create_time between #{p.createTime} and #{p.updateTime})
+            </if>
+            <if test="p.startTime!= null and p.startTime !=''">
+                and DE.create_time &gt;= #{p.startTime}
+            </if>
+            <if test="p.endTime!= null and p.endTime !=''">
+                and DE.create_time &lt;= #{p.endTime}
+            </if>
+            <include refid="com.kidgrow.oprationcenter.mapper.SysProductMapper.Role_Organization"></include>
+        </where>
+    </sql>
+    <select id="groupProductDetail" resultType="com.kidgrow.oprationcenter.vo.GroupProductDetail">
+        select
+        COUNT(DE.pro_id) pro_count,
+        max(DE.pro_name) pro_name
+        from product_order_detail AS DE
+        <include refid="wherelimit"/>
+        GROUP BY DE.pro_id
+        order by pro_count desc
+    </select>
+    <select id="getTypeByUser" resultType="com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail" parameterType="long">
+        SELECT
+        pod.*
+        FROM
+        `product_order` po
+        INNER JOIN product_order_detail pod ON po.id = pod.order_id
+        WHERE
+        po.hospital_id = #{id}
+        AND NOW() &gt;= pod.pro_begintime
+        AND NOW() &lt;=pod.pro_endtime
+        AND pod.enabled = 1
+        AND pod.is_del = 0
+        AND po.enabled = 1
+        AND po.is_del = 0
+        ORDER BY
+        pod.pro_type desc,pod.pro_endtime desc
+    </select>
+    <!--sql查询片段-->
+    <sql id="whereforall">
+        <where>
+            <!--查询条件自行添加-->
+            DE.is_del=0 and DE.ailight_count>=0 and DE.pro_begintime &lt;=now() and DE.pro_endtime >=now() and
+            DE.enabled=1
+            <if test="p.hospitalId != null and p.hospitalId !=''">
+                and PRO.hospital_id = #{p.hospitalId}
+            </if>
+        </where>
+    </sql>
+    <!--查询产品的购买记录-->
+    <select id="findAllList" resultType="com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail">
+        SELECT
+        DE.id,
+        DE.ailight_count,
+        DE.record_count,
+        DE.is_share,
+        DE.pro_begintime,
+        DE.pro_endtime,
+        PRO.hospital_Id,
+        PRO.department_id,
+        DE.pro_type
+        FROM
+        product_order_detail DE
+        LEFT JOIN product_order PRO ON DE.order_id = PRO.id
+        <include refid="whereforall"/>
+        order by
+        DE.pro_endtime ASC,
+        DE.pro_begintime ASC,
+        DE.id asc
+    </select>
+
+    <select id="getEnabledCount" resultType="int" parameterType="long">
+        SELECT
+	COUNT(*)
+FROM
+	product_order_record
+WHERE
+pro_type=0 AND is_del=0 AND enabled=1 AND
+	order_id IN (
+	SELECT
+		id
+	FROM
+		product_order
+WHERE
+	department_id = #{departmentId})
+    </select>
+    <select id="oprationChart" resultType="int" parameterType="int">
+        <if test="datatype==0">
+            -- 试用审核
+            SELECT count(*) FROM product_order_detail WHERE enabled=0 AND is_del=0 and pro_type=0
+        </if>
+        <if test="datatype==1">
+            -- 套餐总量
+            SELECT count(*) FROM sys_product WHERE is_del=0 and enabled=1
+        </if>
+        <if test="datatype==2">
+            -- 未处理用户反馈
+            SELECT count(*) FROM sys_feedback WHERE is_del=0 and enabled=0
+        </if>
+        <if test="datatype==3">
+            -- 未处理数据需求
+            SELECT count(*) FROM data_need WHERE is_del=0 and enabled=0
+        </if>
+    </select>
+
+    <select id="productOrderChart" resultType="com.kidgrow.oprationcenter.vo.OrderChartVo">
+        <if test="p.datatype==1">
+            -- 按年统计
+            SELECT COUNT(t.id) ccount,t.units FROM
+            (select id,DATE_FORMAT(contract_time,'%Y/%m') units,contract_time from product_order
+            <include refid="whereorderchart"/>
+            ) AS t
+            GROUP BY t.units
+        </if>
+        <if test="p.datatype==2">
+            -- 按月统计
+            SELECT COUNT(t.id) ccount,t.units FROM
+            (select id,DATE_FORMAT(contract_time,'%Y') units,contract_time from product_order
+            <include refid="whereorderchart"/>
+            ) AS t
+            GROUP BY t.units
+        </if>
+    </select>
+    <sql id="whereorderchart">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0 and enabled=1
+            <if test="p.startTime != null and p.endTime !=''">
+                and contract_time between #{p.startTime} and #{p.endTime}
+            </if>
+        </where>
+    </sql>
+    <select id="proCountChart" resultType="com.kidgrow.oprationcenter.vo.OrderChartVo">
+        SELECT
+	count( pro_id ) ccount,
+	pro_name units
+FROM
+	product_order_record
+WHERE
+	is_del = 0
+	AND enabled = 1
+	AND pro_id IN ( SELECT id FROM sys_product WHERE is_del = 0 AND enabled = 1 )
+GROUP BY
+	pro_id,
+	pro_name
+ORDER BY
+	ccount DESC
+	LIMIT 10
+    </select>
+    <select id="departmentProductDetail" resultType="com.kidgrow.oprationcenter.model.ProductOrderDetail">
+        SELECT
+	*
+FROM
+	product_order_detail
+WHERE
+	order_id IN ( SELECT id FROM product_order WHERE hospital_id = #{hospitalId} AND department_id = #{departmentId} AND is_del = 0 AND enabled = 1 )
+	AND is_del = 0
+	AND enabled = 1
+ORDER BY
+	create_time DESC
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ProductOrderMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ProductOrderMapper.xml
new file mode 100644
index 0000000..81c0769
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ProductOrderMapper.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--产品的充值记录-订单-->
+<mapper namespace="com.kidgrow.oprationcenter.mapper.ProductOrderMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	  DISTINCT *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.hospitalId != null and p.hospitalId !=''">
+                and hospital_id = #{p.hospitalId}
+            </if>
+            <if test="p.hospitalName != null and p.hospitalName !=''">
+                and hospital_name like concat('%',#{p.hospitalName},'%')
+            </if>
+            <if test="p.departmentId != null and p.departmentId !=''">
+                and department_id = #{p.departmentId}
+            </if>
+            <if test="p.departmentName != null and p.departmentName !=''">
+                and department_name = #{p.departmentName}
+            </if>
+            <if test="p.contractNo != null and p.contractNo !=''">
+                and contract_no = #{p.contractNo}
+            </if>
+            <if test="p.contractTitle != null and p.contractTitle !=''">
+                and contract_title = #{p.contractTitle}
+            </if>
+            <if test="p.contractBeginTime != null and p.contractBeginTime !=''">
+                and contract_begin_time = #{p.contractBeginTime}
+            </if>
+            <if test="p.contractEndTime != null and p.contractEndTime !=''">
+                and contract_end_time = #{p.contractEndTime}
+            </if>
+            <if test="p.contractTime != null and p.contractTime !=''">
+                and contract_time = #{p.contractTime}
+            </if>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.updateTime != null and p.updateTime !=''">
+                and update_time = #{p.updateTime}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <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>
+            <include refid="com.kidgrow.oprationcenter.mapper.SysProductMapper.Role_Organization"></include>
+        </where>
+    </sql>
+
+    <!--定义根据-ProductOrder当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.ProductOrder">
+        select
+        <include refid="Column_List"/>
+        from product_order
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-ProductOrder当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.ProductOrder">
+        select
+        <include refid="Column_List"/>
+        from product_order
+        <include refid="where"/>
+        order by id desc
+    </select>
+    <update id="delProductDetail">
+        UPDATE  product_order_record SET is_del=1,update_time=now() WHERE order_id= #{orderId};
+        UPDATE  product_order_detail SET is_del=1,update_time=now() WHERE order_id= #{orderId};
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ProductOrderRecordMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ProductOrderRecordMapper.xml
new file mode 100644
index 0000000..8099d25
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/ProductOrderRecordMapper.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--产品/明显的充值记录-->
+<mapper namespace="com.kidgrow.oprationcenter.mapper.ProductOrderRecordMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	  DISTINCT *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.orderId != null and p.orderId !=''">
+                and order_id = #{p.orderId}
+            </if>
+            <if test="p.proId != null and p.proId !=''">
+                and pro_id = #{p.proId}
+            </if>
+            <if test="p.proName != null and p.proName !=''">
+                and pro_name = #{p.proName}
+            </if>
+            <if test="p.isShare != null and p.isShare !=''">
+                and is_share = #{p.isShare}
+            </if>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.ailightCount != null and p.ailightCount !=''">
+                and ailight_count = #{p.ailightCount}
+            </if>
+            <if test="p.recordCount != null and p.recordCount !=''">
+                and record_count = #{p.recordCount}
+            </if>
+            <if test="p.proBegintime != null and p.proBegintime !=''">
+                and pro_begintime = #{p.proBegintime}
+            </if>
+            <if test="p.proEndtime != null and p.proEndtime !=''">
+                and pro_endtime = #{p.proEndtime}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <if test="p.updateTime != null and p.updateTime !=''">
+                and update_time = #{p.updateTime}
+            </if>
+            <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>
+        </where>
+    </sql>
+
+    <!--定义根据-ProductOrderDetail当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.ProductOrderRecord">
+        select
+        <include refid="Column_List"/>
+        from product_order_record
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-ProductOrderRecord当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.ProductOrderRecord">
+        select
+        <include refid="Column_List"/>
+        from product_order_record
+        <include refid="where"/>
+        order by id desc
+    </select>
+    <!--sql查询片段-->
+    <sql id="wherelimit">
+        <where>
+            <!--查询条件自行添加-->
+            DE.is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.proType != null and p.proType !=''">
+                and DE.pro_type = #{p.proType}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and DE.enabled = #{p.enabled}
+            </if>
+            <if test="p.hospitalName != null and p.hospitalName !=''">
+                and PRO.hospital_name like concat ('%',#{p.hospitalName},'%')
+            </if>
+            <if test="p.hospitalId != null and p.hospitalId !=''">
+                and PRO.hospital_id  = #{p.hospitalId}
+            </if>
+            <if test="p.departmentId != null and p.departmentId !=''">
+                and PRO.department_id  = #{p.departmentId}
+            </if>
+            <if test="p.proName != null and p.proName !=''">
+                and DE.pro_name like concat ('%',#{p.proName},'%')
+            </if>
+            <if test="p.createTime != null and p.createTime !='' and p.updateTime != null and p.updateTime !=''">
+                and (DE.create_time between #{p.createTime} and #{p.updateTime})
+            </if>
+            <if test="p.startTime!= null and p.startTime !=''">
+                and DE.create_time &gt;= #{p.startTime}
+            </if>
+            <if test="p.endTime!= null and p.endTime !=''">
+                and DE.create_time &lt;= #{p.endTime}
+            </if>
+            <include refid="com.kidgrow.oprationcenter.mapper.SysProductMapper.Role_Organization"></include>
+        </where>
+    </sql>
+    <!--查询产品的消费记录-->
+    <select id="findAllList" resultType="com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail">
+        SELECT
+        DE.id,
+        DE.ailight_count,
+        DE.order_id,
+        DE.pro_name,
+        DE.record_count,
+        DE.is_share,
+        DE.pro_begintime,
+        DE.pro_endtime,
+        DE.pro_id,
+        DE.create_time,
+        DE.is_del,
+        DE.enabled,
+        PRO.hospital_Id,
+        PRO.hospital_name,
+        PRO.department_id,
+        PRO.department_name,
+        DE.pro_type
+        FROM
+        product_order_record DE
+        LEFT JOIN product_order PRO ON DE.order_id = PRO.id
+        <include refid="wherelimit"/>
+        order by DE.id desc
+    </select>
+    <select id="groupProductDetail" resultType="com.kidgrow.oprationcenter.vo.GroupProductDetail">
+        select
+        COUNT(DE.pro_id) pro_count,
+        max(DE.pro_name) pro_name
+        from product_order_record AS DE
+        <include refid="wherelimit"/>
+        GROUP BY DE.pro_id
+        order by pro_count desc
+    </select>
+    <select id="getTypeByUser" resultType="com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail" parameterType="long">
+        SELECT
+        pod.*
+        FROM
+        `product_order` po
+        INNER JOIN product_order_record pod ON po.id = pod.order_id
+        WHERE
+        po.hospital_id = #{id}
+        AND NOW() &gt;= pod.pro_begintime
+        AND NOW() &lt;=pod.pro_endtime
+        AND pod.enabled = 1
+        AND pod.is_del = 0
+        AND po.enabled = 1
+        AND po.is_del = 0
+        ORDER BY
+        pod.pro_type desc,pod.pro_endtime desc
+    </select>
+</mapper>
\ No newline at end of file
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
new file mode 100644
index 0000000..50c3397
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysFeedbackMapper.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!---->
+<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查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.doctorId != null and p.doctorId !=''">
+                and doctor_id = #{p.doctorId}
+            </if>
+            <if test="p.doctorName != null and p.doctorName !=''">
+                and doctor_name  like concat('%', #{p.doctorName}, '%')
+            </if>
+            <if test="p.doctorTel != null and p.doctorTel !=''">
+                and doctor_tel = #{p.doctorTel}
+            </if>
+            <if test="p.departmentId != null and p.departmentId !=''">
+                and department_id = #{p.departmentId}
+            </if>
+            <if test="p.departmentName != null and p.departmentName !=''">
+                and department_name = #{p.departmentName}
+            </if>
+            <if test="p.hospitalId != null and p.hospitalId !=''">
+                and hospital_id = #{p.hospitalId}
+            </if>
+            <if test="p.hospitalName != null and p.hospitalName !=''">
+                and hospital_name = #{p.hospitalName}
+            </if>
+            <if test="p.feedbackNote != null and p.feedbackNote !=''">
+                and feedback_note = #{p.feedbackNote}
+            </if>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <if test="p.updateUserName != null and p.updateUserName !=''">
+                and update_user_name = #{p.updateUserName}
+            </if>
+            <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>
+
+    <!--定义根据-SysFeedback当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.SysFeedback">
+        select
+        <include refid="Column_List"/>
+        from sys_feedback
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-SysFeedback当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.SysFeedback">
+        select
+        <include refid="Column_List"/>
+        from sys_feedback
+        <include refid="where"/>
+        order by id desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysLoggerMapper.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysLoggerMapper.xml
new file mode 100644
index 0000000..85d8f2c
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysLoggerMapper.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!---->
+<mapper namespace="com.kidgrow.oprationcenter.mapper.SysLoggerMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.applicationName != null and p.applicationName !=''">
+                and application_name = #{p.applicationName}
+            </if>
+            <if test="p.className != null and p.className !=''">
+                and class_name = #{p.className}
+            </if>
+            <if test="p.methodName != null and p.methodName !=''">
+                and method_name = #{p.methodName}
+            </if>
+            <if test="p.userId != null and p.userId !=''">
+                and user_id = #{p.userId}
+            </if>
+            <if test="p.userName != null and p.userName !=''">
+                and user_name = #{p.userName}
+            </if>
+            <if test="p.clientId != null and p.clientId !=''">
+                and client_id = #{p.clientId}
+            </if>
+            <if test="p.operation != null and p.operation !=''">
+                and operation = #{p.operation}
+            </if>
+            <if test="p.timestamp != null and p.timestamp !=''">
+                and timestamp = #{p.timestamp}
+            </if>
+        </where>
+    </sql>
+
+    <!--定义根据-SysLogger当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.SysLogger">
+        select
+        <include refid="Column_List"/>
+        from sys_logger
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-SysLogger当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.SysLogger">
+        select
+        <include refid="Column_List"/>
+        from sys_logger
+        <include refid="where"/>
+        order by id desc
+    </select>
+</mapper>
\ No newline at end of file
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
new file mode 100644
index 0000000..ac9b12c
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-biz/src/main/resources/mapper/SysProductMapper.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!---->
+<mapper namespace="com.kidgrow.oprationcenter.mapper.SysProductMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	  DISTINCT *
+	</sql>
+    <!--定义数据权限的查询-->
+    <sql id="Role_Organization">
+        <if test="p.roleOrg != null and p.roleOrg.size>0">
+
+            <foreach item="item" collection="p.roleOrg" index="">
+                <foreach item="itemto" collection="item" index="inx">
+
+
+                    <choose>
+                        <when test="inx == 1"></when>
+
+                        <when test=" inx ==2">
+                            AND
+                            <foreach item="itemtoto" collection="itemto" separator="or" open="(" close=")" index="">
+                                create_user_org_code like '${itemtoto.orgCode}%'
+                            </foreach>
+                        </when>
+                        <when test="inx == 3">
+                            AND
+                            <foreach item="itemtoto" collection="itemto" separator="or" open="(" close=")" index="">
+                                create_user_org_code = #{itemtoto.orgCode}
+                            </foreach>
+                        </when>
+                        <when test="inx == 4">
+                            AND
+                            <foreach item="itemtoto" collection="itemto" separator="or" open="(" close=")" index="">
+                                create_user_org_code like '${itemtoto.orgCode}%'
+                            </foreach>
+                        </when>
+                        <when test="inx == 5">
+                            AND
+                            <foreach item="itemtoto" collection="itemto" separator="or" open="(" close=")" index="">
+                                create_user_id = #{itemtoto.orgCode}
+                            </foreach>
+                        </when>
+                        <otherwise>
+                            AND id is null
+                        </otherwise>
+                    </choose>
+
+                </foreach>
+            </foreach>
+        </if>
+    </sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.proName != null and p.proName !=''">
+                and pro_name like concat('%', #{p.proName}, '%')
+            </if>
+            <if test="p.proTime != null and p.proTime !=''">
+                and pro_time = #{p.proTime}
+            </if>
+            <if test="p.proType != null and p.proType !=''">
+                and pro_type = #{p.proType}
+            </if>
+            <if test="p.proPrice != null and p.proPrice !=''">
+                and pro_price = #{p.proPrice}
+            </if>
+            <if test="p.recordCount != null and p.recordCount !=''">
+                and record_count = #{p.recordCount}
+            </if>
+            <if test="p.ailightCount != null and p.ailightCount !=''">
+                and ailight_count = #{p.ailightCount}
+            </if>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <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>
+            <include refid="Role_Organization"></include>
+        </where>
+    </sql>
+
+    <!--定义根据-SysProduct当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.oprationcenter.model.SysProduct">
+        select
+        <include refid="Column_List"/>
+        from sys_product
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-SysProduct当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.oprationcenter.model.SysProduct">
+        select
+        <include refid="Column_List"/>
+        from sys_product
+        <include refid="where"/>
+        order by id desc
+    </select>
+    <!--定义根据-SysProduct当作查询条件返回对象集合-->
+    <select id="findAllList" resultType="com.kidgrow.oprationcenter.vo.ProductAllVo">
+        select
+        <include refid="Column_List"/>
+        from sys_product
+        <include refid="where"/>
+        order by id desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/Dockerfile b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/Dockerfile
new file mode 100644
index 0000000..80fee4b
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-Xms64m","-Xmx400m","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/pom.xml b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/pom.xml
new file mode 100644
index 0000000..79c1e62
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/pom.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kidgrow-opration-center</artifactId>
+        <groupId>com.kidgrow</groupId>
+        <version>1.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <description>运营中心服务</description>
+    <artifactId>kidgrow-opration-center-server</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-opration-center-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-opration-center-biz</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/OprationCenterApplication.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/OprationCenterApplication.java
new file mode 100644
index 0000000..8e9f64a
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/OprationCenterApplication.java
@@ -0,0 +1,25 @@
+package com.kidgrow;
+
+import com.kidgrow.ribbon.annotation.EnableFeignTenantInterceptor;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/4/1 09:51 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@SpringBootApplication
+@EnableFeignClients
+@EnableDiscoveryClient
+@EnableFeignTenantInterceptor
+public class OprationCenterApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(OprationCenterApplication.class,args);
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/AsycTaskExecutorConfig.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/AsycTaskExecutorConfig.java
new file mode 100644
index 0000000..edc75ef
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/AsycTaskExecutorConfig.java
@@ -0,0 +1,17 @@
+package com.kidgrow.oprationcenter.config;
+
+import com.kidgrow.common.config.DefaultAsycTaskConfig;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 线程池配置、启用异步<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/13 15:50 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Configuration
+public class AsycTaskExecutorConfig extends DefaultAsycTaskConfig {
+
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/ExceptionAdvice.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/ExceptionAdvice.java
new file mode 100644
index 0000000..c18a569
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/ExceptionAdvice.java
@@ -0,0 +1,15 @@
+package com.kidgrow.oprationcenter.config;
+
+import com.kidgrow.common.exception.DefaultExceptionAdvice;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/13 15:50 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+//@ControllerAdvice
+public class ExceptionAdvice extends DefaultExceptionAdvice {
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/MybatisPlusConfig.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..abd81f0
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/MybatisPlusConfig.java
@@ -0,0 +1,36 @@
+package com.kidgrow.oprationcenter.config;
+
+import com.alibaba.druid.wall.WallConfig;
+import com.alibaba.druid.wall.WallFilter;
+import com.kidgrow.db.config.DefaultMybatisPlusConfig;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: MybatisPlus配置<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/13 15:50 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Configuration
+@MapperScan({"com.kidgrow.oprationcenter.mapper*"})
+public class MybatisPlusConfig extends DefaultMybatisPlusConfig {
+    @Bean(name = "wallFilter")
+    @DependsOn("wallConfig")
+    public WallFilter wallFilter(WallConfig wallConfig) {
+        WallFilter wallFilter = new WallFilter();
+        wallFilter.setConfig(wallConfig);
+        return wallFilter;
+    }
+    @Bean(name = "wallConfig")
+    public WallConfig wallConfig() {
+        WallConfig wallConfig = new WallConfig();
+        wallConfig.setMultiStatementAllow(true);//允许一次执行多条语句
+        wallConfig.setNoneBaseStatementAllow(true);//允许一次执行多条语句
+        return wallConfig;
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/PasswordConfig.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/PasswordConfig.java
new file mode 100644
index 0000000..6db946b
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/PasswordConfig.java
@@ -0,0 +1,16 @@
+package com.kidgrow.oprationcenter.config;
+
+import com.kidgrow.common.config.DefaultPasswordConfig;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/13 15:50 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Configuration
+public class PasswordConfig extends DefaultPasswordConfig {
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/WebMvcConfig.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/WebMvcConfig.java
new file mode 100644
index 0000000..23bedfa
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/config/WebMvcConfig.java
@@ -0,0 +1,16 @@
+package com.kidgrow.oprationcenter.config;
+
+import com.kidgrow.common.config.DefaultWebMvcConfig;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/13 15:50 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Configuration
+public class WebMvcConfig extends DefaultWebMvcConfig {
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/BusinessRecordsController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/BusinessRecordsController.java
new file mode 100644
index 0000000..590591c
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/BusinessRecordsController.java
@@ -0,0 +1,126 @@
+package com.kidgrow.oprationcenter.controller;
+
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.model.BusinessRecords;
+import com.kidgrow.oprationcenter.service.IBusinessRecordsService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 业务操作记录
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-04-02 18:25:34 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/businessrecords")
+@Api(tags = "业务操作记录")
+public class BusinessRecordsController extends BaseController {
+    @Autowired
+    private IBusinessRecordsService businessRecordsService;
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping
+    public PageResult list(@RequestParam Map<String, Object> params) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        return businessRecordsService.findList(params);
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        BusinessRecords model = businessRecordsService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据BusinessRecords当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据BusinessRecords当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody BusinessRecords businessRecords) {
+        BusinessRecords model = businessRecordsService.findByObject(businessRecords);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+//    /**
+//     * 新增or更新
+//     */
+//    @ApiOperation(value = "保存")
+//    @PostMapping
+//    public ResultBody save(@Valid @RequestBody BusinessRecords businessRecords, BindingResult bindingResult) {
+//        if (bindingResult.hasErrors()) {
+//            return ResultBody.failed().msg(bindingResult.getFieldError().getDefaultMessage());
+//        } else {
+//            BusinessRecords model = businessRecordsService.getById(businessRecords.getId());
+//            if (model == null) {
+//                boolean v = businessRecordsService.saveOrUpdate(businessRecords);
+//                if (v) {
+//                    return ResultBody.ok().data(businessRecords).msg("保存成功");
+//                } else {
+//                    return ResultBody.failed().msg("保存失败");
+//                }
+//            } else {
+//                return ResultBody.failed().msg("业务日志不允许更新!");
+//            }
+//        }
+//    }
+    /**
+     * 新增
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(String  recordTitle,String recordNote) {
+        if (recordTitle.isEmpty()||recordNote.isEmpty()) {
+            return ResultBody.failed().msg("业务日志参数有误!");
+        } else {
+                boolean v = businessRecordsService.recordBusinessData(recordTitle,recordNote);
+                if (v) {
+                    return ResultBody.ok().msg("保存成功");
+                } else {
+                    return ResultBody.failed().msg("保存失败");
+                }
+            }
+        }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v = businessRecordsService.removeById(id);
+        if (v) {
+            return ResultBody.ok().msg("删除成功");
+        } else {
+            return ResultBody.failed().msg("删除失败");
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/BusinessServerController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/BusinessServerController.java
new file mode 100644
index 0000000..eaa2068
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/BusinessServerController.java
@@ -0,0 +1,114 @@
+package com.kidgrow.oprationcenter.controller;
+
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.model.BusinessServer;
+import com.kidgrow.oprationcenter.service.IBusinessServerService;
+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.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 java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医院服务信息表
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-04-02 18:25:34 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/businessserver")
+@Api(tags = "医院服务信息表")
+public class BusinessServerController  extends BaseController{
+    @Autowired
+    private IBusinessServerService businessServerService;
+
+    /**
+     * 列表
+     */
+    @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(businessServerService.findList(params));
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        BusinessServer model = businessServerService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据BusinessServer当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据BusinessServer当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody BusinessServer businessServer) {
+        BusinessServer model = businessServerService.findByObject(businessServer);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody BusinessServer businessServer, BindingResult bindingResult) {
+        List<String> errMsg= new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        }  else {
+            boolean v= businessServerService.saveOrUpdate(businessServer);
+            if(v) {
+                return ResultBody.ok().data(businessServer).msg("保存成功");
+            }
+            else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v= businessServerService.removeById(id);
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            return ResultBody.failed().msg("删除失败");
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ConsumptionRecordController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ConsumptionRecordController.java
new file mode 100644
index 0000000..bcd34f3
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ConsumptionRecordController.java
@@ -0,0 +1,132 @@
+package com.kidgrow.oprationcenter.controller;
+
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.model.ConsumptionRecord;
+import com.kidgrow.oprationcenter.service.IConsumptionRecordService;
+import com.kidgrow.oprationcenter.vo.ConsumptionRequest;
+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.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 java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-06-23 15:07:14 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/consumption")
+@Api(tags = "")
+public class ConsumptionRecordController  extends BaseController{
+    @Autowired
+    private IConsumptionRecordService consumptionRecordService;
+
+    /**
+     * 列表
+     */
+    @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(consumptionRecordService.findList(params));
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{recordId}")
+    public ResultBody findById(@PathVariable Long recordId) {
+        ConsumptionRecord model = consumptionRecordService.getById(recordId);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据ConsumptionRecord当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据ConsumptionRecord当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody ConsumptionRecord consumptionRecord) {
+        ConsumptionRecord model = consumptionRecordService.findByObject(consumptionRecord);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody ConsumptionRecord consumptionRecord, BindingResult bindingResult) {
+        List<String> errMsg= new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        } else {
+            boolean v= consumptionRecordService.saveOrUpdate(consumptionRecord);
+            if(v) {
+                return ResultBody.ok().data(consumptionRecord).msg("保存成功");
+            }
+            else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+    /**
+     * 要让AI读片-调用
+     */
+    @ApiOperation(value = "要让AI读片-调用")
+    @PostMapping("/AIStart")
+    public ResultBody consumptionAIStart(@RequestBody ConsumptionRequest consumptionRequest) {
+        return consumptionRecordService.consumptionAIStart(consumptionRequest);
+    }
+    /**
+     * AI返回结果-调用
+     */
+    @ApiOperation(value = "AI返回结果-调用")
+    @PostMapping("/AIReturn")
+    public ResultBody consumptionAIReturn(@RequestBody ConsumptionRequest consumptionRequest) {
+        return consumptionRecordService.consumptionAIReturn(consumptionRequest);
+    }
+    /**
+     * AI拒读/失败通知-调用
+     */
+    @ApiOperation(value = "AI拒读/失败通知-调用")
+    @PostMapping("/AIFail")
+    public ResultBody consumptionAIFail(@RequestBody ConsumptionRequest consumptionRequest) {
+        return consumptionRecordService.consumptionAIFail(consumptionRequest);
+    }
+    /**
+     * 发起人工读片-调用
+     */
+    @ApiOperation(value = "发起人工读片-调用")
+    @PostMapping("/Artificial")
+    public ResultBody consumptionArtificial(@RequestBody ConsumptionRequest consumptionRequest) {
+        return consumptionRecordService.consumptionArtificial(consumptionRequest);
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DataNeedController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DataNeedController.java
new file mode 100644
index 0000000..595630a
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DataNeedController.java
@@ -0,0 +1,155 @@
+package com.kidgrow.oprationcenter.controller;
+
+import com.kidgrow.common.annotation.LoginUser;
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.common.utils.ExcelUtil;
+import com.kidgrow.oprationcenter.model.DataNeed;
+import com.kidgrow.oprationcenter.service.IDataNeedService;
+import com.kidgrow.oprationcenter.vo.DataNeedExcel;
+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.collections.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 医生的数据需求
+ * @Project: 用户中心
+ * @CreateDate: Created in 2020-04-01 09:37:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/dataneed")
+@Api(tags = "医生的数据需求")
+public class DataNeedController extends BaseController {
+    @Autowired
+    private IDataNeedService dataNeedService;
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping
+    public PageResult list(@RequestParam Map<String, Object> params) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        return dataNeedService.findList(params);
+    }
+
+    /**
+     * H端列表  需要医院和科室id
+     */
+    @ApiOperation(value = "H端列表,需要医院和科室id")
+    @GetMapping("/hlist")
+    public ResultBody list(@RequestParam Map<String, Object> params, @LoginUser(isFull = true) SysUser sysUser) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        if(MapUtils.getString(params,"page")==null){
+            params.put("page", 1);
+        }if(MapUtils.getString(params,"limit")==null){
+            params.put("limit", 10);
+        }
+        return dataNeedService.FindAllByHId(params, sysUser);
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        DataNeed model = dataNeedService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 更新状态和文件地址
+     */
+    @ApiOperation(value = "更新状态和文件地址")
+    @GetMapping("updateEnabled")
+    public ResultBody updateEnabled(@RequestParam Map<String, Object> map) {
+        return dataNeedService.updateEnabled(map);
+    }
+
+    /**
+     * 更新使用状态
+     */
+    @ApiOperation(value = "更新使用状态")
+    @GetMapping("updateDelete")
+    public ResultBody updateDelete(@RequestParam Long id, @LoginUser(isFull = true) SysUser sysUser) {
+        return dataNeedService.updateDelete(id, sysUser);
+    }
+
+    /**
+     * 根据DataNeed当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据DataNeed当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody DataNeed dataNeed) {
+        DataNeed model = dataNeedService.findByObject(dataNeed);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody DataNeed dataNeed, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultBody.failed().msg(bindingResult.getFieldError().getDefaultMessage());
+        } else {
+            dataNeedService.saveOrUpdate(dataNeed);
+            return ResultBody.ok().data(dataNeed).msg("保存成功");
+        }
+    }
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        dataNeedService.removeById(id);
+        return ResultBody.ok().msg("删除成功");
+    }
+
+    /**
+     * 导出excel
+     *
+     * @return
+     */
+    @PostMapping("/export")
+    public ResultBody exportUser(@RequestParam Map<String, Object> params, HttpServletResponse response) throws IOException {
+        List<DataNeedExcel> result = dataNeedService.findListExportByParam(params);
+        //导出操作
+        ExcelUtil.exportExcel(result, null, "数据需求", DataNeedExcel.class, "DataNeed", response);
+        return ResultBody.ok().msg("导出数据成功");
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorAnswerController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorAnswerController.java
new file mode 100644
index 0000000..a1bc29d
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorAnswerController.java
@@ -0,0 +1,118 @@
+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 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.DoctorAnswer;
+import com.kidgrow.oprationcenter.service.IDoctorAnswerService;
+import com.kidgrow.common.model.*;
+
+import org.springframework.validation.BindingResult;
+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;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医答医生信息表-未完待续
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-04-02 18:25:34 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/doctoranswer")
+@Api(tags = "医答医生信息表-未完待续")
+public class DoctorAnswerController  extends BaseController{
+    @Autowired
+    private IDoctorAnswerService doctorAnswerService;
+
+    /**
+     * 列表
+     */
+    @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(doctorAnswerService.findList(params));
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        DoctorAnswer model = doctorAnswerService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据DoctorAnswer当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据DoctorAnswer当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody DoctorAnswer doctorAnswer) {
+        DoctorAnswer model = doctorAnswerService.findByObject(doctorAnswer);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody DoctorAnswer doctorAnswer, BindingResult bindingResult) {
+        List<String> errMsg= new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        }  else {
+            boolean v= doctorAnswerService.saveOrUpdate(doctorAnswer);
+            if(v) {
+                return ResultBody.ok().data(doctorAnswer).msg("保存成功");
+            }
+            else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v= doctorAnswerService.removeById(id);
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            return ResultBody.failed().msg("删除失败");
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorServerController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorServerController.java
new file mode 100644
index 0000000..4c583d8
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorServerController.java
@@ -0,0 +1,117 @@
+package com.kidgrow.oprationcenter.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.model.DoctorServer;
+import com.kidgrow.oprationcenter.service.IDoctorServerService;
+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.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 java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医生业务服务信息表
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-04-02 18:25:34 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/doctorserver")
+@Api(tags = "医生业务服务信息表")
+public class DoctorServerController  extends BaseController{
+    @Autowired
+    private IDoctorServerService doctorServerService;
+
+    /**
+     * 列表
+     */
+    @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(doctorServerService.findList(params));
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        DoctorServer model = doctorServerService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据DoctorServer当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据DoctorServer当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody DoctorServer doctorServer) {
+        DoctorServer model = doctorServerService.findByObject(doctorServer);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody DoctorServer doctorServer, BindingResult bindingResult) {
+        List<String> errMsg= new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            ResultBody msg = ResultBody.failed().msg(errMsg.toString());
+            DoctorServer doctorServer1 = JSON.toJavaObject(JSON.parseObject(msg.getData().toString()), DoctorServer.class);
+            return ResultBody.failed().msg(errMsg.toString());
+        }  else {
+            boolean v= doctorServerService.saveOrUpdate(doctorServer);
+            if(v) {
+                return ResultBody.ok().data(doctorServer).msg("保存成功");
+            }
+            else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v= doctorServerService.removeById(id);
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            return ResultBody.failed().msg("删除失败");
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorSigningController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorSigningController.java
new file mode 100644
index 0000000..b2b3896
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorSigningController.java
@@ -0,0 +1,118 @@
+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 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.DoctorSigning;
+import com.kidgrow.oprationcenter.service.IDoctorSigningService;
+import com.kidgrow.common.model.*;
+
+import org.springframework.validation.BindingResult;
+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;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 签约医生信息表-未完待续
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-04-02 18:25:34 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/doctorsigning")
+@Api(tags = "签约医生信息表-未完待续")
+public class DoctorSigningController  extends BaseController{
+    @Autowired
+    private IDoctorSigningService doctorSigningService;
+
+    /**
+     * 列表
+     */
+    @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(doctorSigningService.findList(params));
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        DoctorSigning model = doctorSigningService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据DoctorSigning当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据DoctorSigning当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody DoctorSigning doctorSigning) {
+        DoctorSigning model = doctorSigningService.findByObject(doctorSigning);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody DoctorSigning doctorSigning, BindingResult bindingResult) {
+        List<String> errMsg= new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        }  else {
+            boolean v= doctorSigningService.saveOrUpdate(doctorSigning);
+            if(v) {
+                return ResultBody.ok().data(doctorSigning).msg("保存成功");
+            }
+            else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v= doctorSigningService.removeById(id);
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            return ResultBody.failed().msg("删除失败");
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorTempleteController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorTempleteController.java
new file mode 100644
index 0000000..c81c49c
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/DoctorTempleteController.java
@@ -0,0 +1,138 @@
+package com.kidgrow.oprationcenter.controller;
+
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.oprationcenter.model.DoctorTemplete;
+import com.kidgrow.oprationcenter.service.IDoctorTempleteService;
+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.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 java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 医生的模板
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-04-02 18:25:34 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/doctortemplete")
+@Api(tags = "医生的模板")
+public class DoctorTempleteController  extends BaseController{
+    @Autowired
+    private IDoctorTempleteService doctorTempleteService;
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping
+    public PageResult list(@RequestParam Map<String, Object> params) {
+        if(params.size()==0){
+            params.put("page",1);
+            params.put("limit",10);
+        }
+        return doctorTempleteService.findList(params);
+    }
+    /**
+     * 医生的模板列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping("/doctorTempleteList")
+    public PageResult doctorList(@RequestParam Map<String, Object> params) {
+        if(params.size()==0){
+            params.put("page",1);
+            params.put("limit",10);
+        }
+        return doctorTempleteService.findDoctorList(params);
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        DoctorTemplete model = doctorTempleteService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据DoctorTemplete当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据DoctorTemplete当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody DoctorTemplete doctorTemplete) {
+        DoctorTemplete model = doctorTempleteService.findByObject(doctorTemplete);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody DoctorTemplete doctorTemplete, BindingResult bindingResult) {
+        List<String> errMsg= new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        }  else {
+            boolean v= doctorTempleteService.saveOrUpdate(doctorTemplete);
+            if(v) {
+                return ResultBody.ok().data(doctorTemplete.getId()).msg("模板保存成功!");
+            }
+            else {
+                return ResultBody.failed().msg("模板保存失败,请稍候重试。");
+            }
+        }
+    }
+    //updateEnabled
+    @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) {
+        return doctorTempleteService.updateEnabled(params);
+    }
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v= doctorTempleteService.removeById(id);
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            return ResultBody.failed().msg("删除失败");
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/HospitalScreeningController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/HospitalScreeningController.java
new file mode 100644
index 0000000..21a70fd
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/HospitalScreeningController.java
@@ -0,0 +1,118 @@
+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 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.HospitalScreening;
+import com.kidgrow.oprationcenter.service.IHospitalScreeningService;
+import com.kidgrow.common.model.*;
+
+import org.springframework.validation.BindingResult;
+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;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 筛查医院信息表-未完待续
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-04-02 18:25:34 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/hospitalscreening")
+@Api(tags = "筛查医院信息表-未完待续")
+public class HospitalScreeningController  extends BaseController{
+    @Autowired
+    private IHospitalScreeningService hospitalScreeningService;
+
+    /**
+     * 列表
+     */
+    @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(hospitalScreeningService.findList(params));
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        HospitalScreening model = hospitalScreeningService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据HospitalScreening当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据HospitalScreening当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody HospitalScreening hospitalScreening) {
+        HospitalScreening model = hospitalScreeningService.findByObject(hospitalScreening);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody HospitalScreening hospitalScreening, BindingResult bindingResult) {
+        List<String> errMsg= new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        }  else {
+            boolean v= hospitalScreeningService.saveOrUpdate(hospitalScreening);
+            if(v) {
+                return ResultBody.ok().data(hospitalScreening).msg("保存成功");
+            }
+            else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v= hospitalScreeningService.removeById(id);
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            return ResultBody.failed().msg("删除失败");
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderController.java
new file mode 100644
index 0000000..19dda58
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderController.java
@@ -0,0 +1,193 @@
+package com.kidgrow.oprationcenter.controller;
+
+import com.kidgrow.common.annotation.LoginUser;
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.common.utils.StringUtils;
+import com.kidgrow.oprationcenter.model.ProductOrder;
+import com.kidgrow.oprationcenter.service.IBusinessRecordsService;
+import com.kidgrow.oprationcenter.service.IProductOrderService;
+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.transaction.annotation.Transactional;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 产品的充值记录-订单
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-04-02 18:25:34 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/contract")
+@Api(tags = "产品的充值的合同信息")
+public class ProductOrderController  extends BaseController {
+    @Autowired
+    private IProductOrderService productOrderService;
+    @Autowired
+    private IBusinessRecordsService businessRecordsService;
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping
+    public PageResult list(@RequestParam Map<String, Object> params, @LoginUser SysUser sysUser) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        return productOrderService.findList(params,sysUser);
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        ProductOrder model = productOrderService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据ProductOrder当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据ProductOrder当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody ProductOrder productOrder) {
+        ProductOrder model = productOrderService.findByObject(productOrder);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody ProductOrder productOrder, BindingResult bindingResult,@LoginUser SysUser sysUser) {
+        List<String> errMsg = new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        } else {
+            List<SysOrganization> organizations = sysUser.getOrganizations();
+            if(organizations.size()>0){
+                productOrder.setCreateUserOrgCode(organizations.get(organizations.size()-1).getOrgCode());
+            }
+            //默认添加的合同视为无效合同,在充值完成后,会将对应合同启用
+            productOrder.setIsDel(true);
+            boolean v = productOrderService.saveOrUpdate(productOrder);
+            if (v) {
+                return ResultBody.ok().data(productOrder).msg("保存成功");
+            } else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+
+    /**
+     * 冲试用套餐  用于注册医生自动充值
+     * @param params
+     * @return
+     */
+    @ApiOperation(value = "套餐充值")
+    @PostMapping("/saveTemp")
+    public ResultBody saveProductDetail(@RequestBody Map<String,Object> params,@LoginUser SysUser sysUser)
+    {
+        if (StringUtils.isNotBlank(params.get("hospitalId").toString()) &&
+                StringUtils.isNotBlank(params.get("departmentId").toString())&&
+                        StringUtils.isNotBlank(params.get("hospitalName").toString())&&
+                                StringUtils.isNotBlank(params.get("departmentName").toString())) {
+            boolean isResult= productOrderService.saveProductDetail(params,sysUser);
+            if (isResult) {
+                return ResultBody.ok().data(isResult).msg("试用套餐充值成功");
+            }
+            else
+            {
+                return ResultBody.failed().data(isResult).msg("试用套餐充值失败");
+            }
+        }
+        else
+        {
+            return ResultBody.failed().data(false).msg("充值参数有误");
+        }
+    }
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    @Transactional(rollbackFor = {Exception.class})
+    public ResultBody delete(@PathVariable Long id,HttpServletRequest request) {
+        //先删除合同下的充值
+        int delRows= productOrderService.delProductDetail(id);
+        if (delRows==0) {
+            log.info(String.format("该订单下无套餐数据{0}!",id));
+        }
+        //再删除合同
+        boolean v = productOrderService.removeById(id);
+        if (v) {
+            if (!businessRecordsService.recordBusinessData("删除合同:"+id,id.toString())) {
+                log.error(String.format("删除合同编号为:{0}的数据后,写入业务日志失败!",id));
+
+            }
+            return ResultBody.ok().msg("删除成功");
+        } else {
+            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, HttpServletRequest request) {
+        if (params.size() == 0) {
+            return ResultBody.failed().msg("参数异常!");
+        }
+        ResultBody resultBody=productOrderService.updateEnabled(params);
+        //记录业务日志
+        if (resultBody.getCode()==0) {
+            String enablad=(MapUtils.getBoolean(params, "enabled"))?"启用":"禁用";
+            if (!businessRecordsService.recordBusinessData("修改合同状态为:"+enablad,enablad)) {
+                log.error(String.format("修改合同状态为:{0},写入业务日志失败!合同管理id为:{1}",enablad,MapUtils.getString(params,"id")));
+            }
+        }
+        return resultBody;
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderDetailController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderDetailController.java
new file mode 100644
index 0000000..856a219
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderDetailController.java
@@ -0,0 +1,428 @@
+package com.kidgrow.oprationcenter.controller;
+
+import com.kidgrow.common.annotation.LoginUser;
+import com.kidgrow.common.constant.CommonConstant;
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.*;
+import com.kidgrow.oprationcenter.model.HospitalInfo;
+import com.kidgrow.oprationcenter.model.ProductOrder;
+import com.kidgrow.oprationcenter.model.ProductOrderDetail;
+import com.kidgrow.oprationcenter.model.ProductOrderRecord;
+import com.kidgrow.oprationcenter.service.IBusinessRecordsService;
+import com.kidgrow.oprationcenter.service.IProductOrderDetailService;
+import com.kidgrow.oprationcenter.service.IProductOrderRecordService;
+import com.kidgrow.oprationcenter.service.IProductOrderService;
+import com.kidgrow.oprationcenter.vo.OrderChartVo;
+import com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail;
+import com.kidgrow.oprationcenter.vo.UserProductData;
+import com.kidgrow.usercenter.feign.SysUserService;
+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.collections.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 产品/明显的充值记录
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-04-02 18:25:34 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/productorderdetail")
+@Api(tags = "产品/明显的充值记录")
+public class ProductOrderDetailController extends BaseController {
+    @Autowired
+    private IProductOrderDetailService productOrderDetailService;
+    @Autowired
+    private IProductOrderRecordService productOrderRecordService;
+    @Autowired
+    private IBusinessRecordsService businessRecordsService;
+    @Autowired
+    private IProductOrderService productOrderService;
+    @Autowired
+    private SysUserService sysUserServiceFeign;
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping
+    public PageResult list(@RequestParam Map<String, Object> params) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        return productOrderDetailService.findList(params);
+    }
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping("all")
+    public PageResult all(@RequestParam Map<String, Object> params) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        return productOrderDetailService.all(params);
+    }
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping("alldetail")
+    public PageResult alldetail(@RequestParam Map<String, Object> params) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        return productOrderDetailService.departmentProductDetail(params);
+    }
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @PostMapping("/alldata")
+    public PageResult findAllDataList(@RequestParam Map<String, Object> params) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        if (params.get("diagnosticHospitalId") == null)
+            return PageResult.<ProductOrderJoinDetail>builder().data(null).code(0).count(0L).build();
+        return productOrderDetailService.findAllDataList(params);
+    }
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping("/group")
+    public PageResult groupList(@RequestParam Map<String, Object> params) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        return productOrderDetailService.groupList(params);
+    }
+
+    /**
+     * 获取医院套餐是否到期和到期时间
+     * data内 isend为true说明套餐到期
+     * endtime上套餐的到期时间
+     *
+     * @param hospitalId
+     * @param departmentId
+     * @param diagnosticId
+     * @return
+     */
+
+    @ApiOperation(value = "获取医院套餐是否到期和到期时间")
+    @GetMapping("/UserProductDetailData")
+    public ResultBody<UserProductData> serProductDetailData(@RequestParam Long hospitalId, @RequestParam Long departmentId,@RequestParam String diagnosticId) {
+        return productOrderDetailService.userProductDetailData(hospitalId, departmentId,diagnosticId);
+    }
+
+    /**
+     * 获取医院套餐是否到期和到期时间
+     * data内 isend为true说明套餐到期
+     * endtime上套餐的到期时间
+     *
+     * @return
+     */
+
+    @ApiOperation(value = "获取医院套餐是否到期和到期时间")
+    @PostMapping("/serviceperiod")
+    public ResultBody<UserProductData> servicePeriod(@RequestBody HospitalInfo hospitalInfo) {
+        return productOrderDetailService.userProductDetailData(hospitalInfo.getHospitalId(), hospitalInfo.getDepartmentId(),hospitalInfo.getDiagnosticId());
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        ProductOrderDetail model = productOrderDetailService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据ProductOrderDetail当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据ProductOrderDetail当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody ProductOrderDetail productOrderDetail) {
+        ProductOrderDetail model = productOrderDetailService.findByObject(productOrderDetail);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody ProductOrderDetail productOrderDetail, BindingResult bindingResult, @LoginUser SysUser sysUser) {
+        List<String> errMsg = new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        } else {
+            List<SysOrganization> organizations = sysUser.getOrganizations();
+            if (organizations.size() > 0) {
+                productOrderDetail.setCreateUserOrgCode(organizations.get(organizations.size() - 1).getOrgCode());
+            }
+            boolean v = productOrderDetailService.saveOrUpdate(productOrderDetail);
+            if (v) {
+                return ResultBody.ok().data(productOrderDetail).msg("保存成功");
+            } else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+
+    /**
+     * 新增or更新  套餐充值
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping("/saveall")
+    @Transactional(rollbackFor = Exception.class)
+    public ResultBody batchInsert(@Valid @RequestBody List<ProductOrderDetail> list,BindingResult bindingResult) {
+        List<String> errMsg = new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        } else {
+            //先检查科室试用数量是否已经超
+            ProductOrder productOrder = productOrderService.getById(list.get(0).getOrderId());
+            if (productOrder != null) {
+                //是否管理人员
+                boolean ismanager=false,
+                        //是否有待审核套餐
+                        isenabled=false;
+                //如果是超管,高管,销售部门管理  则不受次数限制
+                ResultBody<LoginAppUser> loginAppUserTemp=sysUserServiceFeign.getLoginAppUser();
+                LoginAppUser loginAppUser=loginAppUserTemp.getData();
+                if (loginAppUser != null) {
+
+                    List<SysRole> sysRoleList = loginAppUser.getRoles();
+                    if (sysRoleList != null && sysRoleList.size() > 0) {
+                        for (int i = 0; i < sysRoleList.size(); i++) {
+                            String roleName = sysRoleList.get(i).getCode();
+                            if (roleName.equals(CommonConstant.SYSTEM_ADMIN_ROLE_CODE) ||
+                                    roleName.equals(CommonConstant.SALE_MANAGER_ROLE_CODE) ||
+                                    roleName.equals(CommonConstant.PC_ADMIN_ROLE_CODE) ||
+                                    roleName.equals(CommonConstant.OPRATIONMANAGER_ROLE_CODE)) {
+                                ismanager=true;
+                                break;
+                            }
+                        }
+                    }
+                }
+                if (!ismanager) {
+                    int counts = productOrderDetailService.getEnabledCount(productOrder.getDepartmentId());
+                    if (counts >= CommonConstant.MAX_FREE_COUNT) {
+                        //超过了限定次数  将试用套餐改为禁用 待审核
+                        for (int i = 0; i <list.size() ; i++) {
+                            if (list.get(i).getProType()==0) {
+                                //试用套餐
+                                list.get(i).setEnabled(false);
+                                isenabled=true;
+                            }
+                        }
+                    }
+                }
+                //写充值套餐给用户
+                Boolean v = productOrderDetailService.saveBatch(list);
+                //写充值记录
+                //对象转换
+                List<ProductOrderRecord> productOrderRecordList = new ArrayList<ProductOrderRecord>();
+                ;
+                list.forEach(item -> {
+                    ProductOrderRecord productOrderRecord = new ProductOrderRecord();
+                    productOrderRecord.setAilightCount(item.getAilightCount());
+                    productOrderRecord.setOrderId(item.getOrderId());
+                    productOrderRecord.setProId(item.getProId());
+                    productOrderRecord.setProName(item.getProName());
+                    productOrderRecord.setProType(item.getProType());
+                    productOrderRecord.setIsShare(item.getIsShare());
+                    productOrderRecord.setIsDel(item.getIsDel());
+                    productOrderRecord.setRecordCount(item.getRecordCount());
+                    productOrderRecord.setProBegintime(item.getProBegintime());
+                    productOrderRecord.setProEndtime(item.getProEndtime());
+                    productOrderRecord.setEnabled(item.getEnabled());
+                    productOrderRecordList.add(productOrderRecord);
+                });
+                Boolean r = productOrderRecordService.saveBatch(productOrderRecordList);
+                //更新合同
+                Boolean p = false;
+                if (productOrder != null) {
+                    productOrder.setIsDel(false);
+                    p = productOrderService.saveOrUpdate(productOrder);
+                }
+                if (v && r && p) {
+                    if (isenabled) {
+                        return ResultBody.ok().data(list.size()).msg("充值成功,但是试用套餐需要管理审核才可使用!");
+                    }
+                    else
+                    {
+                        return ResultBody.ok().data(list.size()).msg("产品充值成功...");
+                    }
+                } else {
+                    //写入订单明细失败,则删除订单记录数据
+                    Boolean e = productOrderService.removeById(list.get(0).getOrderId());
+                    if (e)
+                        return ResultBody.failed().msg("充值数据保存失败,订单已撤回!");
+                    else
+                        return ResultBody.failed().msg("充值数据保存失败,订单撤回失败!");
+                }
+            } else {
+                return ResultBody.failed().msg("充值数据关联订单不存在!");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v = productOrderDetailService.removeById(id);
+        if (v) {
+            if (!businessRecordsService.recordBusinessData("删除订单明细:" + id, id.toString())) {
+                log.error(String.format("删除订单明细id为:{1}", id));
+            }
+            return ResultBody.ok().msg("删除成功");
+        } else {
+            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, HttpServletRequest request) {
+        if (params.size() == 0) {
+            return ResultBody.failed().msg("参数异常!");
+        }
+        ResultBody resultBody = productOrderDetailService.updateEnabled(params);
+        //记录业务日志
+        if (resultBody.getCode() == 0) {
+            String enablad = (MapUtils.getBoolean(params, "enabled")) ? "启用" : "禁用";
+            if (!businessRecordsService.recordBusinessData("修改订单明细状态为:" + enablad, enablad)) {
+                log.error(String.format("修改合同状态为:{0},写入业务日志失败!合同管理id为:{1}", enablad, MapUtils.getString(params, "id")));
+            }
+        }
+        return resultBody;
+    }
+
+    /**
+     * 获取 用户的状态  为试用状态还是 启用状态
+     *
+     * @return
+     */
+    @ApiOperation(value = "获取 用户的状态")
+    @GetMapping("/getTypeByUser")
+    public ResultBody getTypeByUser(@LoginUser SysUser sysUser) {
+        return productOrderDetailService.getTypeByUser(sysUser);
+    }
+
+    /**
+     * 统计获取数据量
+     * @param datatype
+     * 0 试用审核量
+     * 1 套餐总量
+     * 2 未处理用户反馈
+     * 3 未处理数据需求
+     * @return
+     */
+    @ApiOperation(value = "统计获取数据量")
+    @GetMapping("/oprationChart")
+    public ResultBody oprationChart(int datatype) {
+        int counts=productOrderDetailService.oprationChart(datatype);
+        return ResultBody.ok().data(counts).msg("数据获取成功!") ;
+    }
+
+    /**
+     * 按指定类型统计合同数量
+     * @param params
+     *    datatype     1 按年
+     *                 2 按月
+     *                 3 按天
+     *                 4 按周
+     *    beginTime 查询时间段的开始时间
+     *    endTime   结束时间
+     * @return
+     */
+    @ApiOperation(value = "按指定类型统计合同数量")
+    @GetMapping("/productOrderChart")
+    public ResultBody productOrderChart(@RequestParam  Map<String, Object> params) {
+        List<OrderChartVo> orderChartVo=productOrderDetailService.productOrderChart(params);
+        return ResultBody.ok().data(orderChartVo).msg("数据获取成功!") ;
+    }
+
+    /**
+     * 统计产品的使用数量
+     * @return  ccount 是数量
+     *          units 是产品名称
+     */
+    @ApiOperation(value = "统计产品的使用数量")
+    @GetMapping("/proCountChart")
+    public ResultBody proCountChart() {
+        List<OrderChartVo> orderChartVo=productOrderDetailService.proCountChart();
+        return ResultBody.ok().data(orderChartVo).msg("数据获取成功!") ;
+    }
+}
diff --git a/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderRecordController.java b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderRecordController.java
new file mode 100644
index 0000000..fedef3d
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/ProductOrderRecordController.java
@@ -0,0 +1,302 @@
+package com.kidgrow.oprationcenter.controller;
+
+import com.kidgrow.common.annotation.LoginUser;
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.common.utils.StringUtils;
+import com.kidgrow.oprationcenter.model.ProductOrderDetail;
+import com.kidgrow.oprationcenter.model.ProductOrderRecord;
+import com.kidgrow.oprationcenter.service.IBusinessRecordsService;
+import com.kidgrow.oprationcenter.service.IProductOrderDetailService;
+import com.kidgrow.oprationcenter.service.IProductOrderRecordService;
+import com.kidgrow.oprationcenter.service.IProductOrderService;
+import com.kidgrow.oprationcenter.vo.ProductOrderJoinDetail;
+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.collections.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 产品/明显的充值记录
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-04-02 18:25:34 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/productorderrecord")
+@Api(tags = "产品/明显的充值记录")
+public class ProductOrderRecordController extends BaseController {
+    @Autowired
+    private IProductOrderRecordService productOrderRecordService;
+    @Autowired
+    private IProductOrderDetailService productOrderDetailService;
+    @Autowired
+    private IBusinessRecordsService businessRecordsService;
+    @Autowired
+    private IProductOrderService productOrderService;
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping
+    public PageResult list(@RequestParam Map<String, Object> params) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        return productOrderRecordService.findList(params);
+    }
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping("/all")
+    public PageResult findAllList(@RequestParam Map<String, Object> params,@LoginUser SysUser sysUser) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        String departmentId=MapUtils.getString(params, "departmentId");
+        if (StringUtils.isNotBlank(departmentId)) {
+            params.put("enable", 1);
+            params.put("isDel", 0);
+        }
+        return productOrderRecordService.findAllList(params,sysUser);
+    }
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @PostMapping("/alldata")
+    public PageResult findAllDataList(@RequestParam Map<String, Object> params) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        if(params.get("diagnosticHospitalId")==null)
+            return PageResult.<ProductOrderJoinDetail>builder().data(null).code(0).count(0L).build();
+        return productOrderRecordService.findAllDataList(params);
+    }
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping("/group")
+    public PageResult groupList(@RequestParam Map<String, Object> params) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        return productOrderRecordService.groupList(params);
+    }
+
+    /**
+     * 查询用户的套餐剩余量
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/biUserNowProduct")
+    public ResultBody biUserNowProduct(@RequestParam long hospitalId, Long departmentId) {
+        return productOrderDetailService.biUserNowProduct(hospitalId,departmentId);
+    }
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        ProductOrderRecord model = productOrderRecordService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据ProductOrderRecord当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据ProductOrderRecord当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody ProductOrderRecord productOrderRecord) {
+        ProductOrderRecord model = productOrderRecordService.findByObject(productOrderRecord);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody ProductOrderRecord productOrderRecord, BindingResult bindingResult,@LoginUser SysUser sysUser) {
+        List<String> errMsg = new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        } else {
+            List<SysOrganization> organizations = sysUser.getOrganizations();
+            if(organizations.size()>0){
+                productOrderRecord.setCreateUserOrgCode(organizations.get(organizations.size()-1).getOrgCode());
+            }
+            boolean v = productOrderRecordService.saveOrUpdate(productOrderRecord);
+            if (v) {
+                return ResultBody.ok().data(productOrderRecord).msg("保存成功");
+            } else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping("/saveall")
+    @Transactional(rollbackFor = Exception.class)
+    public ResultBody batchInsert(@Valid @RequestBody List<ProductOrderRecord> list, BindingResult bindingResult) {
+        List<String> errMsg = new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        } else {
+            Boolean v = productOrderRecordService.saveBatch(list);
+            if (v) {
+                return ResultBody.ok().data(list.size()).msg("产品充值成功");
+            } else {
+                //写入订单明细失败,则删除订单记录数据
+                Boolean e = productOrderService.removeById(list.get(0).getOrderId());
+                if (e)
+                    return ResultBody.failed().msg("充值数据保存失败,订单已撤回!");
+                else
+                    return ResultBody.failed().msg("充值数据保存失败,订单撤回失败!");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @Transactional(rollbackFor = Exception.class)
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        ProductOrderRecord productOrderRecord=productOrderRecordService.getById(id);
+        if (productOrderRecord != null) {
+            Map<String,Object> detailSelect=new HashMap<String,Object>();
+            detailSelect.put("pro_id",productOrderRecord.getProId());
+            detailSelect.put("order_id",productOrderRecord.getOrderId());
+            List<ProductOrderDetail> productOrderDetailList=productOrderDetailService.listByMap(detailSelect);
+            if (productOrderDetailList != null&&productOrderDetailList.size()>0) {
+                ProductOrderDetail productOrderDetail=productOrderDetailList.get(0);
+                if (productOrderDetail.getAilightCount() == productOrderRecord.getAilightCount()&&
+                        productOrderDetail.getRecordCount()==productOrderRecord.getRecordCount()) {
+                    //读片量和报告量都没有改变 可以删除
+                    //删记录
+                    boolean isdel= productOrderRecordService.removeById(id);
+                    //删套餐
+                    boolean isdelDetail=productOrderDetailService.removeById(productOrderDetail.getId());
+                    //写记录
+                    boolean record=businessRecordsService.recordBusinessData("删除订单明细:" + id, id.toString());
+                    log.info(String.format("删除订单明细id为:{1}",id));
+                    if (isdelDetail&&isdel) {
+                        return ResultBody.ok().msg("套餐删除成功!");
+                    }
+                    else
+                    {
+                        return ResultBody.failed().msg("当前套餐删除失败!");
+                    }
+                }
+                else
+                {
+                    return ResultBody.failed().msg("当前套餐已经使用,无法删除!");
+                }
+            }
+            else
+            {
+                return ResultBody.failed().msg("无相关套餐记录!");
+            }
+        }
+        else
+        {
+            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, HttpServletRequest request) {
+        if (params.size() == 0) {
+            return ResultBody.failed().msg("参数异常!");
+        }
+        ResultBody resultBody = productOrderRecordService.updateEnabled(params);
+        //记录业务日志
+        if (resultBody.getCode() == 0) {
+            String enablad = (MapUtils.getBoolean(params, "enabled")) ? "启用" : "禁用";
+            if (!businessRecordsService.recordBusinessData("修改订单明细状态为:" + enablad, enablad)) {
+                //log.error(String.format("修改合同状态为:{0},写入业务日志失败!合同管理id为:{1}",enablad,MapUtils.getString(params,"id")));
+            }
+        }
+        return resultBody;
+    }
+
+    /**
+     * 获取 用户的状态  为试用状态还是 启用状态
+     *
+     * @return
+     */
+    @ApiOperation(value = "获取 用户的状态")
+    @GetMapping("/getTypeByUser")
+    public ResultBody getTypeByUser(@LoginUser SysUser sysUser) {
+        return productOrderRecordService.getTypeByUser(sysUser);
+    }
+}
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
new file mode 100644
index 0000000..82c357a
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysFeedbackController.java
@@ -0,0 +1,133 @@
+package com.kidgrow.oprationcenter.controller;
+
+import com.kidgrow.common.annotation.LoginUser;
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description:
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-04-02 18:25:34 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/sysfeedback")
+@Api(tags = "")
+public class SysFeedbackController extends BaseController {
+    @Autowired
+    private ISysFeedbackService sysFeedbackService;
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping
+    public PageResult list(@RequestParam Map<String, Object> params) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        return sysFeedbackService.findList(params);
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        SysFeedback model = sysFeedbackService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据SysFeedback当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据SysFeedback当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody SysFeedback sysFeedback) {
+        SysFeedback model = sysFeedbackService.findByObject(sysFeedback);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save( @RequestBody SysFeedback sysFeedback, BindingResult bindingResult, @LoginUser SysUser sysUser) {
+        List<String> errMsg = new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        } else {
+            boolean v = sysFeedbackService.saveOrUpdateStr(sysFeedback, sysUser);
+            if (v) {
+                return ResultBody.ok().data(sysFeedback).msg("保存成功");
+            } else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v = sysFeedbackService.removeById(id);
+        if (v) {
+            return ResultBody.ok().msg("删除成功");
+        } else {
+            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
new file mode 100644
index 0000000..35c2c14
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysLoggerController.java
@@ -0,0 +1,114 @@
+package com.kidgrow.oprationcenter.controller;
+
+import com.kidgrow.common.controller.BaseController;
+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 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 java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-04-02 18:25:34 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/syslogger")
+@Api(tags = "")
+public class SysLoggerController  extends BaseController{
+    @Autowired
+    private ISysLoggerService sysLoggerService;
+
+    /**
+     * 列表
+     */
+    @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(sysLoggerService.findList(params));
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        SysLogger model = sysLoggerService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据SysLogger当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据SysLogger当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody SysLogger sysLogger) {
+        SysLogger model = sysLoggerService.findByObject(sysLogger);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody SysLogger sysLogger, BindingResult bindingResult) {
+        List<String> errMsg= new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        }  else {
+            boolean v= sysLoggerService.saveOrUpdate(sysLogger);
+            if(v) {
+                return ResultBody.ok().data(sysLogger).msg("反馈提交成功");
+            }
+            else {
+                return ResultBody.failed().msg("信息提交失败");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v= sysLoggerService.removeById(id);
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            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
new file mode 100644
index 0000000..0583022
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/java/com/kidgrow/oprationcenter/controller/SysProductController.java
@@ -0,0 +1,171 @@
+package com.kidgrow.oprationcenter.controller;
+
+import com.kidgrow.common.annotation.LoginUser;
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.common.model.SysUser;
+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;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 
+ * @Project: 运营中心
+ * @CreateDate: Created in 2020-04-02 18:25:34 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/product")
+@Api(tags = "")
+public class SysProductController  extends BaseController{
+    @Autowired
+    private ISysProductService sysProductService;
+    @Autowired
+    private IProductOrderDetailService productOrderDetailService;
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping
+    public PageResult list(@RequestParam Map<String, Object> params, @LoginUser SysUser sysUser) {
+        if(params.size()==0){
+            params.put("page",1);
+            params.put("limit",10);
+        }
+        return sysProductService.findList(params,sysUser);
+    }
+    @GetMapping("/all")
+    public PageResult allList(@RequestParam Map<String, Object> params, @LoginUser SysUser sysUser) {
+        return sysProductService.findAllList(params,sysUser);
+    }
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        SysProduct model = sysProductService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据SysProduct当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据SysProduct当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody SysProduct sysProduct) {
+        SysProduct model = sysProductService.findByObject(sysProduct);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody SysProduct sysProduct, BindingResult bindingResult,@LoginUser SysUser sysUser) {
+        List<String> errMsg= new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        }  else {
+            List<SysOrganization> organizations = sysUser.getOrganizations();
+            if(organizations.size()>0){
+                sysProduct.setCreateUserOrgCode(organizations.get(organizations.size()-1).getOrgCode());
+            }
+
+            boolean v= sysProductService.saveOrUpdate(sysProduct);
+            if(v) {
+                return ResultBody.ok().data(sysProduct).msg("保存成功");
+            }
+            else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        if (!ProIsUseed(id)) {
+            return ResultBody.failed().msg("该产品已经被使用,无法删除!");
+        }
+        else {
+            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
new file mode 100644
index 0000000..407a8ee
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/kidgrow-opration-center-server/src/main/resources/application.yml
@@ -0,0 +1,97 @@
+server:
+  tomcat:
+    uri-encoding: UTF-8
+    max-threads: 1000
+    min-spare-threads: 30
+  port: 6005
+
+# mysql
+spring:
+  application:
+    name: oprationcenter-server
+  datasource:
+    url: jdbc:mysql://${kidgrow.datasource.ip}:3306/opration_center_${spring.profiles.active}?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
+    username: ${kidgrow.datasource.username}
+    password: ${kidgrow.datasource.password}
+    #    driver-class-name: com.mysql.jdbc.Driver
+    type: com.alibaba.druid.pool.DruidDataSource
+    druid:
+      aop-patterns: com.kidgrow.oprationcenter.controller.*,com.kidgrow.oprationcenter.mapper.*
+  # rabbitMQ
+  rabbitmq:
+    host: ${kidgrow.rabbitmq.host}
+    port: ${kidgrow.rabbitmq.port}
+    username: ${kidgrow.rabbitmq.username}
+    password: ${kidgrow.rabbitmq.password}
+    #交换机名称
+    exchangeName: ${kidgrow.rabbitmq.exchangeName}
+    #队列名称
+    queueName: ${kidgrow.rabbitmq.queueName} #AdvancedEvaluation # AIEvaluation #,AdvancedEvaluationResult
+    #routingKeyName
+    routingKeyName: ${kidgrow.rabbitmq.routingKeyName}
+    virtual-host: ${kidgrow.rabbitmq.virtual-host}
+    AIEvaluationResults: AIEvaluationResults_${spring.profiles.active}
+    BoneAgeEvaluationData: BoneAgeEvaluationData_${spring.profiles.active}
+    ChildRecordData: ChildRecordData_${spring.profiles.active}
+    ReportData: ReportData_${spring.profiles.active}
+    #开启重试机制
+    listener:
+      simple:
+        #采用手动应答
+        acknowledge-mode: manual
+        retry:
+          enabled: true
+          max-attempts: 5
+eureka:
+  instance:
+    ###注册中心ip地址
+    hostname: ${kidgrow.eureka.instance.hostname}
+    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
+    prefer-ip-address: true
+  client:
+    serviceUrl:
+      defaultZone: ${kidgrow.eureka.client.serviceUrl.defaultZone}
+
+mybatis-plus:
+  mapper-locations: classpath:/mapper/*.xml
+  #实体扫描,多个package用逗号或者分号分隔
+  typeAliasesPackage: com.kidgrow.common.model
+  global-config:
+    db-config:
+      id-type: ASSIGN_ID
+
+
+
+kidgrow:
+  swagger:
+    base-package: com.kidgrow.oprationcenter.controller
+    description: 运营中心接口文档
+    enabled: true
+    title: 运营中心
+    version: 1.0
+  cache-manager:
+    configs:
+      - key: menu
+        second: 300
+      - key: user
+        second: 1800
+  #多租户配置
+  tenant:
+    enable: true
+    #多租户隔离字段
+    tenantid: tenant_id
+    ignoreTables:
+      - sys_logger
+      - data_need
+      - business_records
+      - sys_feedback
+      - doctor_templete
+      - consumption_record
+      - product_order
+      - product_order_detail
+      - product_order_record
+    ignoreSqls:
+      - com.kidgrow.usercenter.mapper.SysRoleMapper.findAll
+      - com.kidgrow.oprationcenter.mapper.ConsumptionRecordMapper.findDetailList
+
+
diff --git a/kidgrow-business/kidgrow-opration-center/pom.xml b/kidgrow-business/kidgrow-opration-center/pom.xml
new file mode 100644
index 0000000..9fb3c1b
--- /dev/null
+++ b/kidgrow-business/kidgrow-opration-center/pom.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kidgrow-business</artifactId>
+        <groupId>com.kidgrow</groupId>
+        <version>1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kidgrow-opration-center</artifactId>
+    <packaging>pom</packaging>
+    <description>运营中心服务</description>
+    <modules>
+        <module>kidgrow-opration-center-api</module>
+        <module>kidgrow-opration-center-biz</module>
+        <module>kidgrow-opration-center-server</module>
+    </modules>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-common-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-db-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-log-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-swagger2-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-redis-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-ribbon-spring-boot-starter</artifactId>
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.kidgrow</groupId>-->
+<!--            <artifactId>kidgrow-rabbitmq-spring-boot-starter</artifactId>-->
+<!--        </dependency>-->
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-usercenter-api</artifactId>
+            <version>1.0</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-searchcenter/kidgrow-searchcenter-server/Dockerfile b/kidgrow-business/kidgrow-searchcenter/kidgrow-searchcenter-server/Dockerfile
new file mode 100644
index 0000000..fef5f1e
--- /dev/null
+++ b/kidgrow-business/kidgrow-searchcenter/kidgrow-searchcenter-server/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-searchcenter/kidgrow-searchcenter-server/pom.xml b/kidgrow-business/kidgrow-searchcenter/kidgrow-searchcenter-server/pom.xml
index 8ced557..6873ef2 100644
--- a/kidgrow-business/kidgrow-searchcenter/kidgrow-searchcenter-server/pom.xml
+++ b/kidgrow-business/kidgrow-searchcenter/kidgrow-searchcenter-server/pom.xml
@@ -104,6 +104,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/dto/SysRoleOrganizationDto.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/dto/SysRoleOrganizationDto.java
new file mode 100644
index 0000000..46e7059
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/dto/SysRoleOrganizationDto.java
@@ -0,0 +1,25 @@
+package com.kidgrow.usercenter.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Data
+public class SysRoleOrganizationDto {
+    /**
+     * 1代表全部数据权限,2自定义数据权限,3本部门数据权限,4本部门及以下数据权限,5仅本人数据权限
+     */
+    // @NotEmpty(message = "1代表全部数据权限,2自定义数据权限,3本部门数据权限,4本部门及以下数据权限,5仅本人数据权限不能为空")
+    @NotNull(message = "权限范围不能为空")
+    private Integer type;
+    /**
+     * 角色id
+     */
+    @NotNull(message = "角色不能为空")
+    private Long roleId;
+    /**
+     * 部门id  organization_id
+     */
+    private List<Long> orgIds;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/dto/SysRoleOrganizationMybatisDto.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/dto/SysRoleOrganizationMybatisDto.java
new file mode 100644
index 0000000..24661fc
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/dto/SysRoleOrganizationMybatisDto.java
@@ -0,0 +1,9 @@
+package com.kidgrow.usercenter.dto;
+
+import lombok.Data;
+
+@Data
+public class SysRoleOrganizationMybatisDto {
+    private boolean flag;
+    private Object object;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/SysDoctorService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/SysDoctorService.java
new file mode 100644
index 0000000..2d50ea2
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/SysDoctorService.java
@@ -0,0 +1,38 @@
+package com.kidgrow.usercenter.feign;
+
+import com.kidgrow.common.constant.ServiceNameConstants;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.usercenter.feign.fallback.SysDoctorServiceFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/22 14:33 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@FeignClient(name = ServiceNameConstants.USER_SERVICE, fallbackFactory = SysDoctorServiceFallbackFactory.class, decode404 = true)
+public interface SysDoctorService {
+    /**
+     * 根据条件查询
+     * @param map
+     */
+    @PostMapping(value = "/sysdoctor/findByMap")
+    ResultBody getListByMap(@RequestBody Map<String, Object> map);
+
+    /**
+     * 根据id查询数据
+     * @param id
+     * @return
+     */
+    @GetMapping("sysdoctor/{id}")
+    ResultBody findById(@PathVariable(value="id") Long id);
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/SysHospitalService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/SysHospitalService.java
new file mode 100644
index 0000000..a233628
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/SysHospitalService.java
@@ -0,0 +1,29 @@
+package com.kidgrow.usercenter.feign;
+
+import com.kidgrow.common.constant.ServiceNameConstants;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.usercenter.feign.fallback.SysDoctorServiceFallbackFactory;
+import com.kidgrow.usercenter.feign.fallback.SysHospitalServiceFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/22 14:33 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@FeignClient(name = ServiceNameConstants.USER_SERVICE, fallbackFactory = SysHospitalServiceFallbackFactory.class, decode404 = true)
+public interface SysHospitalService {
+    /**
+     * 根据条件查询
+     * @param map
+     */
+    @PostMapping(value = "/syshospital/findAllByMap")
+    ResultBody findAllByMap(@RequestBody Map<String, Object> map);
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/SysUserService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/SysUserService.java
new file mode 100644
index 0000000..3572e8e
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/SysUserService.java
@@ -0,0 +1,25 @@
+package com.kidgrow.usercenter.feign;
+
+import com.kidgrow.common.constant.ServiceNameConstants;
+import com.kidgrow.common.model.LoginAppUser;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.usercenter.feign.fallback.SysUserServiceFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/8/4 14:33 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ * */
+@FeignClient(name = ServiceNameConstants.USER_SERVICE, fallbackFactory = SysUserServiceFallbackFactory.class, decode404 = true)
+public interface SysUserService {
+    /**
+     * 获取用户登录后的相关信息
+     */
+    @GetMapping("/users/current")
+    ResultBody<LoginAppUser> getLoginAppUser();
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/fallback/SysDoctorServiceFallbackFactory.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/fallback/SysDoctorServiceFallbackFactory.java
new file mode 100644
index 0000000..fe0d1a5
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/fallback/SysDoctorServiceFallbackFactory.java
@@ -0,0 +1,37 @@
+package com.kidgrow.usercenter.feign.fallback;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.usercenter.feign.SysDoctorService;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/22 14:33 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@Component
+public class SysDoctorServiceFallbackFactory implements FallbackFactory<SysDoctorService> {
+
+    @Override
+    public SysDoctorService create(Throwable throwable) {
+        return  new SysDoctorService() {
+            @Override
+            public ResultBody getListByMap(Map<String, Object> map) {
+                return ResultBody.failed("获取医生失败");
+            }
+
+            @Override
+            public ResultBody findById(Long id) {
+                return ResultBody.failed("获取医生失败");
+            }
+        };
+    }
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/fallback/SysHospitalServiceFallbackFactory.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/fallback/SysHospitalServiceFallbackFactory.java
new file mode 100644
index 0000000..81459a0
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/fallback/SysHospitalServiceFallbackFactory.java
@@ -0,0 +1,33 @@
+package com.kidgrow.usercenter.feign.fallback;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.usercenter.feign.SysDoctorService;
+import com.kidgrow.usercenter.feign.SysHospitalService;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/22 14:33 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@Component
+public class SysHospitalServiceFallbackFactory implements FallbackFactory<SysHospitalService> {
+
+    @Override
+    public SysHospitalService create(Throwable throwable) {
+        return new SysHospitalService() {
+            @Override
+            public ResultBody findAllByMap(Map<String, Object> map) {
+                return ResultBody.failed("查询失败");
+            }
+        };
+    }
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/fallback/SysUserServiceFallbackFactory.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/fallback/SysUserServiceFallbackFactory.java
new file mode 100644
index 0000000..ceccb0b
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/feign/fallback/SysUserServiceFallbackFactory.java
@@ -0,0 +1,31 @@
+package com.kidgrow.usercenter.feign.fallback;
+
+import com.kidgrow.common.model.LoginAppUser;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.usercenter.feign.SysUserService;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/8/4 14:33 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ */
+@Slf4j
+@Component
+public class SysUserServiceFallbackFactory  implements FallbackFactory<SysUserService> {
+    @Override
+    public SysUserService create(Throwable throwable) {
+        return new SysUserService() {
+            @Override
+            public ResultBody<LoginAppUser> getLoginAppUser() {
+                return null;
+            }
+        };
+    }
+}
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
new file mode 100644
index 0000000..ba14e95
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysArea.java
@@ -0,0 +1,82 @@
+package com.kidgrow.usercenter.model;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © 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>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_area")
+public class SysArea extends Model<SysArea> {
+
+    /**
+     * 区域id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+    /**
+     * 区域名称
+     */
+    @NotEmpty(message = "区域名称不能为空")
+    private String areaName;
+    /**
+     * 父级区域id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long areaParentId;
+    /**
+     * 简称
+     */
+    private String areaShortname;
+    /**
+     * 省市区级别
+     */
+    private Integer areaLeveltype;
+    /**
+     * 区号
+     */
+    private String areaCitycode;
+    /**
+     * 邮编
+     */
+    private String areaZipcode;
+    /**
+     * 纬度
+     */
+    private String areaLng;
+    /**
+     * 经度
+     */
+    private String areaLat;
+    /**
+     * 名称拼音
+     */
+    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/SysCompany.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysCompany.java
new file mode 100644
index 0000000..c4be091
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysCompany.java
@@ -0,0 +1,84 @@
+package com.kidgrow.usercenter.model;
+
+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.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © 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>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_company")
+public class SysCompany extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 组织id
+     */
+    @NotNull(message = "组织id不能为空")
+    private Long orgId;
+    /**
+     * 公司名称
+     */
+    @NotEmpty(message = "公司名称不能为空")
+    private String companyName;
+    /**
+     * 省名称
+     */
+    private String companyProvince;
+    /**
+     * 市名称
+     */
+    private String companyCity;
+    /**
+     * 县名称
+     */
+    private String companyArea;
+    /**
+     * 公司联系电话
+     */
+    private String companyTel;
+    /**
+     * 公司地址
+     */
+    private String companyAdress;
+    /**
+     * 公司logo
+     */
+    private String companyLogo;
+    /**
+     * 公司简介
+     */
+    private String companyAbout;
+    /**
+     * 租户字段
+     */
+    private String tenantId;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean enabled;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    private Boolean isDel;
+    /**
+     * 创建者的部门
+     */
+    private String createUserOrgCode;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDepartment.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDepartment.java
new file mode 100644
index 0000000..41ae83d
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDepartment.java
@@ -0,0 +1,84 @@
+package com.kidgrow.usercenter.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.kidgrow.common.model.SuperModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © 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>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_department")
+public class SysDepartment extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 科室/部门名称 同组织名称
+     */
+    @NotEmpty(message = "科室/部门名称 同组织名称不能为空")
+    private String departmentName;
+    /**
+     * 组织Id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+    /**
+     * 负责的销售代表
+     */
+    @NotNull(message = "服务代表不能为空")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long serverUserId;
+    /**
+     * 销售代表的名字
+     */
+    @NotEmpty(message = "服务代表的名字不能为空")
+    private String serverUserName;
+    /**
+     * 销售代表电话
+     */
+    private String serverUserTel;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean enabled;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    private Boolean isDel;
+    /**
+     * 负责的销售代表
+     */
+    @NotNull(message = "负责的销售代表不能为空")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long saleUserId;
+    /**
+     * 销售代表的名字
+     */
+    @NotEmpty(message = "销售代表的名字不能为空")
+    private String saleUserName;
+    /**
+     * 销售代表电话
+     */
+    private String saleUserTel;
+    /**
+     * 帐号数量,默认6
+     */
+    private Integer accountsCount;
+}
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
new file mode 100644
index 0000000..563a202
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDictionaries.java
@@ -0,0 +1,56 @@
+package com.kidgrow.usercenter.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+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.*;
+
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © 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>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_dictionaries")
+public class SysDictionaries extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 字典值
+     */
+    @NotEmpty(message = "字典值不能为空")
+    private String dictionariesName;
+
+    @NotEmpty(message = "字典KEY不能为空")
+    private String dictionariesKey;
+    /**
+     * 字典归属分类的标识(如果这个字典项是分类,则该字段为空)
+     */
+    private String dictionariesClassId;
+    /**
+     * 字段排序 默认0
+     */
+    private Integer dictionariesOrder;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    private Integer isDel;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Integer enabled;
+}
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
new file mode 100644
index 0000000..14edf52
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysDoctor.java
@@ -0,0 +1,147 @@
+package com.kidgrow.usercenter.model;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.kidgrow.common.model.SuperModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © 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>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_doctor")
+public class SysDoctor extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 关联的登录帐号ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long userId;
+    /**
+     * 所属医院ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "所属医院ID不能为空")
+    private Long hospitalId;
+    /**
+     * 医院名称
+     */
+    @NotEmpty(message = "医院名称不能为空")
+    private String hospitalName;
+    /**
+     * 科室ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long departmentId;
+    /**
+     * 科室名称
+     */
+    private String departmentName;
+    /**
+     * 医生姓名
+     */
+    @NotEmpty(message = "医生姓名不能为空")
+    private String doctorName;
+    /**
+     * 医生的头像
+     */
+    private String doctorLogo;
+    /**
+     * 医生联系方式
+     */
+    @NotEmpty(message = "医生联系方式不能为空")
+    private String doctorTel;
+    /**
+     * 职称ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long doctorRankId;
+    /**
+     * 职称
+     */
+    private String doctorRank;
+    /**
+     * 医生其它联系方式
+     */
+    private String doctorOtherLink;
+    /**
+     * 医生的email
+     */
+    private String doctorEmail;
+    /**
+     * 医生简介
+     */
+    private String doctorAbout;
+    /**
+     * 是否医答医生 0否1是
+     */
+    private Boolean isAnswer;
+    /**
+     * 是否签约医生 0否1是
+     */
+    private Boolean isSigning;
+    /**
+     * 是否置顶 0否1是
+     */
+    private Boolean isTop;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    private Boolean isDel;
+    /**
+     * 是否管理员 0否 1是
+     */
+    private Boolean isAdminUser;
+    /**
+     * 医生状态 1正常 0试用
+     */
+    @NotNull(message = "医生状态不能为空")
+    private Boolean doctorState;
+    /**
+     * 医生类型 0H+C端都可用   1H端   2C端 默认2
+     */
+    @NotNull(message = "医生类型不能为空")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Integer doctorType;
+    /**
+     * 启用禁用状态,1启用,0停用
+     */
+    private Boolean enabled;
+
+    /**
+     * 销售代表的id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long serverUserId;
+    /**
+     * 销售代表名称
+     */
+    private String serverUserName;
+    /**
+     * 创建者的部门
+     */
+    private String createUserOrgCode;
+    /**
+     * 医生资质证书
+     */
+    private String doctorCcie;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysHospital.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysHospital.java
index 53d9055..2ba88a4 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysHospital.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysHospital.java
@@ -1,20 +1,22 @@
 package com.kidgrow.usercenter.model;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 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;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
  *
  * @version 1.0
- * @Description: <br>
+ * @Description: 医院基础信息表<br>
  * @Project: 用户中心<br>
- * @CreateDate: Created in 2020-03-11 14:26:59 <br>
+ * @CreateDate: Created in 2020-04-02 18:32:36 <br>
  * @Author: <a href="4345453@kidgrow.com">liuke</a>
  */
 @Data
@@ -26,20 +28,113 @@
     private static final long serialVersionUID = 1L;
 
     /**
-     * 医院名称
+     * 医院名称 同组织名字
      */
-    @NotBlank(message = "医院名称不能为空")
+    @NotEmpty(message = "医院名称 同组织名字不能为空")
     private String hospitalName;
     /**
-     * 是否删除,1删除,0未删除
+     * 组织ID-
      */
-    private Integer isDel;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+    /**
+     * 医院简称
+     */
+    private String hospitalShortName;
+    /**
+     * 医院编码
+     */
+    private String hospitalCode;
+    /**
+     * 医院类型ID  从字典表关联 社区/儿保等等之类
+     */
+    private String hospitalTypeId;
+    /**
+     * 医院类型 社区/儿保等等之类
+     */
+    private String hospitalTypeName;
+    /**
+     * 医院电话
+     */
+    private String hospitalTel;
+    /**
+     * 医院联系人
+     */
+    private String hospitalLink;
+    /**
+     * 医院所在省
+     */
+    private String hospitalProvince;
+    /**
+     * 医院所在城
+     */
+    private String hospitalCity;
+    /**
+     * 医院所在地区
+     */
+    private String hospitalArea;
+    /**
+     * 区号
+     */
+    private String areaCode;
+    /**
+     * 医院地址
+     */
+    private String hospitalAdress;
+    /**
+     * 所在位置纬度
+     */
+    private String latitude;
+    /**
+     * 所在位置经度
+     */
+    private String longitude;
+    /**
+     * 资质ID
+     */
+    private String hospitalQualifiedId;
+    /**
+     * 资质(三甲医院)
+     */
+    private String hospitalQualifiedName;
+    /**
+     * 医院logo  缩略图
+     */
+    private String hospitalLitLogo;
+    /**
+     * 医院logo 原图
+     */
+    private String hospitalLogo;
+    /**
+     * 医院简介图片
+     */
+    private String hospitalAdimage;
+    /**
+     * 医院简介
+     */
+    private String hospitalAbout;
+    /**
+     * 是否筛查医院 1是0否
+     */
+    private Boolean isScreen;
+    /**
+     * 服务状态 0试用 1正式
+     */
+    private Integer hospitalState;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean enabled;
     /**
      * 租户字段
      */
     private String tenantId;
     /**
-     * 状态,1启用,0停用
+     * 是否删除,1删除,0未删除
      */
-    private Integer enabled;
+    private Boolean isDel;
+    /**
+     * 创建者的部门
+     */
+    private String createUserOrgCode;
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysLogger.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysLogger.java
new file mode 100644
index 0000000..be93255
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysLogger.java
@@ -0,0 +1,64 @@
+package com.kidgrow.usercenter.model;
+
+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;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © 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>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_logger")
+public class SysLogger extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 应用名
+     */
+    private String applicationName;
+    /**
+     * 类名
+     */
+    @NotBlank(message = "类名不能为空")
+    private String className;
+    /**
+     * 方法名
+     */
+    @NotBlank(message = "方法名不能为空")
+    private String methodName;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 用户名
+     */
+    private String userName;
+    /**
+     * 租户id
+     */
+    private String clientId;
+    /**
+     * 操作信息
+     */
+    @NotBlank(message = "操作信息不能为空")
+    private String operation;
+    /**
+     * 创建时间
+     */
+    @NotBlank(message = "创建时间不能为空")
+    private String timestamp;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysMenu.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysMenu.java
new file mode 100644
index 0000000..c6ee2ea
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysMenu.java
@@ -0,0 +1,88 @@
+package com.kidgrow.usercenter.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.kidgrow.common.model.SuperModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © 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>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_menu")
+public class SysMenu extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 父ID
+     */
+    @NotNull(message = "父ID不能为空")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+    /**
+     * 菜单名称
+     */
+    @NotEmpty(message = "菜单名称不能为空")
+    private String name;
+    /**
+     * 菜单Url
+     */
+    private String url;
+    /**
+     * 菜单路径
+     */
+    private String path;
+    /**
+     * API 访问模式
+     */
+    private String pathMethod;
+    /**
+     * 样式表
+     */
+    private String css;
+    /**
+     * 排序
+     */
+    @NotNull(message = "排序不能为空")
+    private Integer sort;
+    /**
+     * 类型,1菜单,2API资源
+     */
+    @NotNull(message = "类型,1菜单,2API资源不能为空")
+    private Integer type;
+    /**
+     * 是否显示
+     */
+    @NotNull(message = "是否显示不能为空")
+    private Integer hidden;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @NotNull(message = "是否删除,1删除,0未删除不能为空")
+    private Integer isDel;
+    /**
+     * 租户字段
+     */
+    private String tenantId;
+    /**
+     * 是否启用,1启用,0停用
+     */
+    @NotNull(message = "是否启用,1启用,0停用不能为空")
+    private Integer enabled;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysRole.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysRole.java
new file mode 100644
index 0000000..05938c7
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysRole.java
@@ -0,0 +1,55 @@
+package com.kidgrow.usercenter.model;
+
+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.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © 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>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_role")
+public class SysRole extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 角色code
+     */
+    @NotEmpty(message = "角色code不能为空")
+    private String code;
+    /**
+     * 角色名
+     */
+    @NotEmpty(message = "角色名不能为空")
+    private String name;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @NotNull(message = "是否删除,1删除,0未删除不能为空")
+    private Integer isDel;
+    /**
+     * 租户字段
+     */
+    private String tenantId;
+    /**
+     * 状态,1启用,0停用
+     */
+    @NotNull(message = "状态,1启用,0停用不能为空")
+    private Integer enabled;
+
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysRoleOrganization.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysRoleOrganization.java
new file mode 100644
index 0000000..091e1ec
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysRoleOrganization.java
@@ -0,0 +1,52 @@
+package com.kidgrow.usercenter.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+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.*;
+
+import javax.validation.constraints.*;
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 角色对应的   部门<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-21 14:24:41 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_role_organization")
+public class SysRoleOrganization extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 1代表全部数据权限,2自定义数据权限,3本部门数据权限,4本部门及以下数据权限,5仅本人数据权限
+     */
+    /**
+     * 角色id
+     */
+    private Long roleId;
+    /**
+     * 部门id  organization_id
+     */
+    private Long orgId;
+    /**
+     * 部门code  organization_code
+     */
+    private String orgCode;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    private Boolean isDel;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysUser.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysUser.java
new file mode 100644
index 0000000..30b766a
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysUser.java
@@ -0,0 +1,83 @@
+package com.kidgrow.usercenter.model;
+
+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.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © 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>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_user")
+public class SysUser extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户账号
+     */
+    @NotEmpty(message = "用户账号不能为空")
+    private String username;
+    /**
+     * 账号密码
+     */
+    @NotEmpty(message = "账号密码不能为空")
+    private String password;
+    /**
+     * 昵称
+     */
+    private String nickname;
+    /**
+     * 联系电话
+     */
+    private String mobile;
+    /**
+     * 性别
+     */
+    private Integer sex;
+    /**
+     * 是否启用,1启用,0停用
+     */
+    @NotNull(message = "是否启用,1启用,0停用不能为空")
+    private Integer enabled;
+    /**
+     *
+     */
+    @NotEmpty(message = "不能为空")
+    private String type;
+    /**
+     *
+     */
+    private String company;
+    /**
+     *
+     */
+    private String openId;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @NotNull(message = "是否删除,1删除,0未删除不能为空")
+    private Integer isDel;
+    /**
+     * 租户字段
+     */
+    private String tenantId;
+    /**
+     * 是否默认密码状态
+     */
+    private boolean isDefaultAuth;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysUserLogs.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysUserLogs.java
index 0c51f5e..4aa24c5 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysUserLogs.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/model/SysUserLogs.java
@@ -38,6 +38,8 @@
     private String loginAgentBrowser;
     //登录设备操作系统
     private String loginAgentSystem;
+    //登录设备的分辨率
+    private String loginSystemScreen;
     //
     private Integer loginNums;
     //登录类型,账户密码、Token、微信、qq
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/HospitalDoctorListVo.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/HospitalDoctorListVo.java
new file mode 100644
index 0000000..bd1a18a
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/HospitalDoctorListVo.java
@@ -0,0 +1,43 @@
+package com.kidgrow.usercenter.vo;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: <br>
+ * @Project: H端用户列表<br>
+ * @CreateDate: Created in 2020-06-16 14:02:50 <br>
+ * @Author: <a href="411269194@kidgrow.com">hrj</a>
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class HospitalDoctorListVo extends Model<HospitalDoctorListVo> {
+    private static final long serialVersionUID = 1L;
+    private String createTime;
+    private String departmentName;
+    private String hospitalName;
+    private String doctorName;
+    private String doctorRank;
+    private String doctorTel;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long userId;
+    private boolean isAdminUser;
+    private boolean doctorState;
+    private String Mobile;
+    private String userName;
+    private boolean defaultAuth;
+    private boolean enabled;
+    private boolean isDel;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long roleId;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/HospitalListVo.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/HospitalListVo.java
new file mode 100644
index 0000000..ce17542
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/HospitalListVo.java
@@ -0,0 +1,113 @@
+package com.kidgrow.usercenter.vo;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/04/14 11:06 <br>
+ * @Author: <a href="411269194@kidgrow.com">liuke</a>
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class HospitalListVo extends Model<HospitalListVo> {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 医院id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long hospitalId;
+    /**
+     * 医院名称 同组织名字
+     */
+    private String hospitalName;
+    /**
+     * 组织ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+    /**
+     * 医院编码
+     */
+    private String hospitalCode;
+    /**
+     * 医院区号
+     */
+    private String areaCode;
+    /**
+     * 医院电话
+     */
+    private String hospitalTel;
+    /**
+     * 医院联系人
+     */
+    private String hospitalLink;
+    /**
+     * 所在省
+     */
+    private String hospitalProvince;
+    /**
+     * 所在城市
+     */
+    private String hospitalCity;
+    /**
+     * 所在区域
+     */
+    private String hospitalArea;
+    /**
+     * 负责的销售代表
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long serverUserId;
+    /**
+     * 销售代表的名字
+     */
+    private String serverUserName;
+    /**
+     * 科室id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long departmentId;
+    /**
+     * 科室/部门名称 同组织名称
+     */
+    private String departmentName;
+    /**
+     * 医院状态
+     */
+    private Integer hospitalState;
+    /**
+     * 是否筛查医院
+     */
+    private Integer isScreen;
+    /**
+     * 是否医医院
+     */
+    private Integer isAnswer;
+    /**
+     * 医院数据创建时间
+     */
+    private Date createTime;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean enabled;
+    /**
+     * 租户字段
+     */
+    private String tenantId;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    private Boolean isDel;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysCompanyVo.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysCompanyVo.java
new file mode 100644
index 0000000..350bd15
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysCompanyVo.java
@@ -0,0 +1,14 @@
+package com.kidgrow.usercenter.vo;
+
+import com.kidgrow.usercenter.model.SysCompany;
+import lombok.Data;
+
+@Data
+public class SysCompanyVo extends SysCompany {
+    private String sheng;
+    private Long shengId;
+    private String shi;
+    private Long shiId;
+    private String xian;
+    private Long xianId;
+}
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..12d3966
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysDoctorDto.java
@@ -0,0 +1,13 @@
+package com.kidgrow.usercenter.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SysDoctorDto extends  SysDoctorVo {
+    private String password;
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private List<Long> roles;
+}
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-api/src/main/java/com/kidgrow/usercenter/vo/SysOrganizationVo.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysOrganizationVo.java
new file mode 100644
index 0000000..787b70d
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysOrganizationVo.java
@@ -0,0 +1,9 @@
+package com.kidgrow.usercenter.vo;
+
+import com.kidgrow.common.model.SysOrganization;
+import lombok.Data;
+
+@Data
+public class SysOrganizationVo extends SysOrganization {
+    private String orgParentName;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/UserRegVo.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/UserRegVo.java
new file mode 100644
index 0000000..6fcffe1
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/UserRegVo.java
@@ -0,0 +1,117 @@
+package com.kidgrow.usercenter.vo;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: <br>
+ * @Project: H端用户注册实/添加用户实体<br>
+ * @CreateDate: Created in 2020-06-11 14:02:50 <br>
+ * @Author: <a href="411269194@kidgrow.com">hrj</a>
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserRegVo extends Model<UserRegVo> {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 用户账号
+     */
+    @NotEmpty(message = "用户账号不能为空")
+    private String username;
+    /**
+     * 账号密码
+     */
+    @NotEmpty(message = "账号密码不能为空")
+    private String password;
+    /**
+     * 昵称/真实姓名
+     */
+    private String nickname;
+    /**
+     * 头像Url
+     */
+    private String headImgUrl;
+    /**
+     * 联系电话 手机号
+     */
+    @NotEmpty(message = "手机号不能为空")
+    private String mobile;
+    /**
+     * 性别
+     */
+    private Integer sex;
+    /**
+     *来源类型 H端是 DOCTOR
+     */
+    @NotEmpty(message = "不能为空")
+    private String type;
+    /**
+     *openid
+     */
+    private String openId;
+    /**
+     * 租户字段
+     */
+    private String tenantId;
+    /**
+     * 是否默认密码状态
+     */
+    private boolean isDefaultAuth;
+
+/***************以下上医生信息****************/
+    /**
+     * 所属医院ID 注册用户固定传0
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long hospitalId;
+    /**
+     * 医院名称
+     */
+    @NotEmpty(message = "医院名称不能为空")
+    private String hospitalName;
+    /**
+     * 科室ID 注册用户固定传0
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long departmentId;
+    /**
+     * 科室名称
+     */
+    private String departmentName;
+    /**
+     * 职称ID 注册用户固定传0
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long doctorRankId;
+    /**
+     * 职称
+     */
+    private String doctorRank;
+    /**
+     * 医生状态 1正常 0试用(注册用户)
+     */
+    @NotNull(message = "医生状态 1正常 0试用不能为空")
+    private Boolean doctorState;
+    /**
+     * 资质证书 图片地址
+     */
+    private String doctorCcie;
+    /**
+     * 手机验证码
+     */
+    private String verification;
+    /**
+     * 当前登录用户的id
+     */
+    private Long userId;
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/pom.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/pom.xml
index 45087c7..04aedb1 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/pom.xml
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/pom.xml
@@ -26,5 +26,13 @@
             <groupId>eu.bitwalker</groupId>
             <artifactId>UserAgentUtils</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-filecenter-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-opration-center-api</artifactId>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
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
new file mode 100644
index 0000000..0524888
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysAreaMapper.java
@@ -0,0 +1,32 @@
+package com.kidgrow.usercenter.mapper;
+
+import com.kidgrow.db.mapper.SuperMapper;
+import com.kidgrow.usercenter.model.SysArea;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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
+ */
+public interface SysAreaMapper extends SuperMapper<SysArea> {
+    /**
+     * 查询省市区数据表列表
+     * @param params
+     * @return
+     */
+    List<SysArea> findList(@Param("p") Map<String, Object> params);
+
+    /**
+     * 根据SysArea对象当做查询条件进行查询
+     * @param
+     * @return SysArea对象
+     */
+    SysArea findByObject(@Param("p") SysArea sysArea);
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysCompanyMapper.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysCompanyMapper.java
new file mode 100644
index 0000000..5be5827
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysCompanyMapper.java
@@ -0,0 +1,34 @@
+package com.kidgrow.usercenter.mapper;
+
+import com.kidgrow.usercenter.model.SysCompany;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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
+ */
+public interface SysCompanyMapper extends SuperMapper<SysCompany> {
+    /**
+     * 分页查询公司信息表列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<SysCompany> findList(Page<SysCompany> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据SysCompany对象当做查询条件进行查询
+     * @param
+     * @return SysCompany对象
+     */
+    SysCompany findByObject(@Param("p") SysCompany sysCompany);
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysDepartmentMapper.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysDepartmentMapper.java
new file mode 100644
index 0000000..a2a2cf5
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysDepartmentMapper.java
@@ -0,0 +1,42 @@
+package com.kidgrow.usercenter.mapper;
+
+import com.kidgrow.usercenter.model.SysDepartment;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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
+ */
+public interface SysDepartmentMapper extends SuperMapper<SysDepartment> {
+    /**
+     * 分页查询科室表列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<SysDepartment> findList(Page<SysDepartment> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据SysDepartment对象当做查询条件进行查询
+     * @param
+     * @return SysDepartment对象
+     */
+    SysDepartment findByObject(@Param("p") SysDepartment sysDepartment);
+
+    /**
+     *检查指定医院下是否已经存在该名称的科室
+     * @param hosId
+     * @param departmentName
+     * @return  如果返回空则视为不存在
+     */
+    String checkDepartmentName(@Param("hosId") Long hosId,@Param("departmentName") String departmentName);
+}
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
new file mode 100644
index 0000000..141fe6e
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysDictionariesMapper.java
@@ -0,0 +1,36 @@
+package com.kidgrow.usercenter.mapper;
+
+import com.kidgrow.usercenter.model.SysDictionaries;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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
+ */
+public interface SysDictionariesMapper extends SuperMapper<SysDictionaries> {
+    /**
+     * 分页查询系统字典表列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<SysDictionaries> findList(Page<SysDictionaries> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据SysDictionaries对象当做查询条件进行查询
+     * @param
+     * @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/mapper/SysDoctorMapper.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysDoctorMapper.java
new file mode 100644
index 0000000..9a9a80a
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysDoctorMapper.java
@@ -0,0 +1,47 @@
+package com.kidgrow.usercenter.mapper;
+
+import com.kidgrow.usercenter.model.SysDoctor;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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
+ */
+public interface SysDoctorMapper extends SuperMapper<SysDoctor> {
+    /**
+     * 分页查询列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<SysDoctor> findList(Page<SysDoctor> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据SysDoctor对象当做查询条件进行查询
+     * @param
+     * @return SysDoctor对象
+     */
+    SysDoctor findByObject(@Param("p") SysDoctor sysDoctor);
+    /**
+     * 查询账户名是否管理员
+     * @param userName
+     * @return SysDoctor
+     */
+    SysDoctor userIsAdmin(@Param("userName") String userName);
+
+    /**
+     * 统计医生数量
+     * @param datatype
+     * @return
+     */
+    int chartDoctor(@Param("datatype") int datatype);
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysHospitalMapper.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysHospitalMapper.java
index ede2ae1..e5e72bf 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysHospitalMapper.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysHospitalMapper.java
@@ -1,8 +1,9 @@
 package com.kidgrow.usercenter.mapper;
 
-import com.kidgrow.usercenter.model.SysHospital;
-import com.kidgrow.db.mapper.SuperMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.kidgrow.usercenter.model.SysHospital;
+import com.kidgrow.usercenter.vo.HospitalListVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -26,9 +27,34 @@
     List<SysHospital> findList(Page<SysHospital> page, @Param("p") Map<String, Object> params);
 
     /**
+     * 根据医院名称模糊查询医院数据列表
+     * @param hospitalName
+     * @return
+     */
+    List<SysHospital> findByName(@Param("hospitalName") String hospitalName);
+    /**
+     * 医院信息列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<HospitalListVo> findHospitalList(Page<HospitalListVo> page, @Param("p") Map<String, Object> params);
+
+    /**
      * 根据SysHospital对象当做查询条件进行查询
      * @param
      * @return SysHospital对象
      */
-    SysHospital findByObject(SysHospital sysHospital);
+    SysHospital findByObject(@Param("p") SysHospital sysHospital);
+
+    /**
+     * 统计医院数量
+     * @param datatype  医院类型
+     *                 0 试用医院
+     *                  1 正式医院
+     *                  11 筛查医院
+     * @return
+     */
+    int chartHospital(@Param("datatype") int datatype);
+
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysLoggerMapper.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysLoggerMapper.java
new file mode 100644
index 0000000..7407739
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysLoggerMapper.java
@@ -0,0 +1,34 @@
+package com.kidgrow.usercenter.mapper;
+
+import com.kidgrow.usercenter.model.SysLogger;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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
+ */
+public interface SysLoggerMapper extends SuperMapper<SysLogger> {
+    /**
+     * 分页查询列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<SysLogger> findList(Page<SysLogger> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据SysLogger对象当做查询条件进行查询
+     * @param
+     * @return SysLogger对象
+     */
+    SysLogger findByObject(@Param("p") SysLogger sysLogger);
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysOrganizationMapper.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysOrganizationMapper.java
new file mode 100644
index 0000000..b114cc5
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysOrganizationMapper.java
@@ -0,0 +1,42 @@
+package com.kidgrow.usercenter.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.db.mapper.SuperMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 组织架构表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-03-31 11:01:35 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface SysOrganizationMapper extends SuperMapper<SysOrganization> {
+    /**
+     * 分页查询组织架构表列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<SysOrganization> findList(Page<SysOrganization> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据SysOrganization对象当做查询条件进行查询
+     * @param
+     * @return SysOrganization对象
+     */
+    SysOrganization findByObject(@Param("p") SysOrganization sysOrganization);
+
+
+    /**
+     * 根据用户ID获取用户组织机构列表
+     * @param userId
+     * @return
+     */
+    List<SysOrganization> findListByUserId(Long userId);
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysRoleOrganizationMapper.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysRoleOrganizationMapper.java
new file mode 100644
index 0000000..9bd3f32
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysRoleOrganizationMapper.java
@@ -0,0 +1,34 @@
+package com.kidgrow.usercenter.mapper;
+
+import com.kidgrow.usercenter.model.SysRoleOrganization;
+import com.kidgrow.db.mapper.SuperMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 角色对应的   部门<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-21 14:24:41 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface SysRoleOrganizationMapper extends SuperMapper<SysRoleOrganization> {
+    /**
+     * 分页查询角色对应的   部门列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<SysRoleOrganization> findList(Page<SysRoleOrganization> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据SysRoleOrganization对象当做查询条件进行查询
+     * @param
+     * @return SysRoleOrganization对象
+     */
+    SysRoleOrganization findByObject(@Param("p") SysRoleOrganization sysRoleOrganization);
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysUserLogsMapper.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysUserLogsMapper.java
index b2aec72..8156c20 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysUserLogsMapper.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysUserLogsMapper.java
@@ -12,7 +12,7 @@
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
  * @Description: 系统用户登录日志表<br>
  * @Project: 用户中心<br>
- * @CreateDate: Created in 2020-03-09 10:13:23 <br>
+ * @CreateDate: Created in 2020-04-02 18:32:36 <br>
  * @Author: <a href="4345453@kidgrow.com">liuke</a>
  * @version 1.0
  */
@@ -24,4 +24,11 @@
      * @return
      */
     List<SysUserLogs> findList(Page<SysUserLogs> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据SysUserLogs对象当做查询条件进行查询
+     * @param
+     * @return SysUserLogs对象
+     */
+    SysUserLogs findByObject(@Param("p") SysUserLogs sysUserLogs);
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysUserMapper.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysUserMapper.java
index 7d38e14..9f3f09f 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysUserMapper.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysUserMapper.java
@@ -1,8 +1,10 @@
 package com.kidgrow.usercenter.mapper;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.model.DoctorUserAll;
 import com.kidgrow.common.model.SysUser;
 import com.kidgrow.db.mapper.SuperMapper;
+import com.kidgrow.usercenter.vo.HospitalDoctorListVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -24,4 +26,39 @@
      * @return
      */
     List<SysUser> findList(Page<SysUser> page, @Param("u") Map<String, Object> params);
+
+    Integer selectCountByMap(@Param("u")Map<String, Object> map);
+
+    /**
+     * 查询指定角色用户
+     * @param  type:0销售,1运维
+     * @return
+     */
+    List<SysUser> findAppointUsers(@Param("type") Integer type);
+
+    /**
+     * 获取登录用户的其它信息
+     * @param userId
+     * @return
+     */
+    DoctorUserAll findDoctorUserAllData(@Param("userId") Long userId);
+
+    /**
+     * 获取医院科室下的所有有效的医生
+     * @param hospitalId
+     * @param departmentId
+     * @param roleId1 管理员医生角色id
+     * @param roleId2 普通医生角色id
+     * @return
+     */
+    List<HospitalDoctorListVo> hospitalDoctorList(@Param("hospitalId") Long hospitalId, @Param("departmentId") Long departmentId,@Param("roleId1") Long roleId1,@Param("roleId2") Long roleId2);
+/**
+     * 获取医院科室下的所有有效的医生  and 已经删除的
+     * @param hospitalId
+     * @param departmentId
+     * @param roleId1 管理员医生角色id
+     * @param roleId2 普通医生角色id
+     * @return
+     */
+    List<HospitalDoctorListVo> hospitalDoctorListAndDel(@Param("hospitalId") Long hospitalId, @Param("departmentId") Long departmentId,@Param("roleId1") Long roleId1,@Param("roleId2") Long roleId2);
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysUserOrgMapper.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysUserOrgMapper.java
new file mode 100644
index 0000000..971876c
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/mapper/SysUserOrgMapper.java
@@ -0,0 +1,34 @@
+package com.kidgrow.usercenter.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.model.SysUserOrg;
+import com.kidgrow.db.mapper.SuperMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 用户和组织关系表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-03-31 11:01:35 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface SysUserOrgMapper extends SuperMapper<SysUserOrg> {
+    /**
+     * 分页查询用户和组织关系表列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<SysUserOrg> findList(Page<SysUserOrg> page, @Param("p") Map<String, Object> params);
+
+    /**
+     * 根据SysUserOrg对象当做查询条件进行查询
+     * @param
+     * @return SysUserOrg对象
+     */
+    SysUserOrg findByObject(@Param("p") SysUserOrg sysUserOrg);
+}
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
new file mode 100644
index 0000000..4b45e08
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysAreaService.java
@@ -0,0 +1,43 @@
+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;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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
+ */
+public interface ISysAreaService extends ISuperService<SysArea> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<SysArea> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据SysArea对象当做查询条件进行查询
+    * @param sysArea
+    * @return SysArea对象
+    */
+    SysArea findByObject(SysArea sysArea);
+
+    /**
+     * 状态变更
+     * @param params
+     * @return
+     */
+    ResultBody updateEnabled(Map<String, Object> params);
+
+    ResultBody getListByMap(Map<String, Object> params);
+}
+
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysCompanyService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysCompanyService.java
new file mode 100644
index 0000000..a6e89b2
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysCompanyService.java
@@ -0,0 +1,43 @@
+package com.kidgrow.usercenter.service;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.usercenter.model.SysCompany;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+import com.kidgrow.usercenter.vo.SysCompanyVo;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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
+ */
+public interface ISysCompanyService extends ISuperService<SysCompany> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<SysCompanyVo> findList(Map<String, Object> params, SysUser user);
+
+
+    /**
+    * 根据SysCompany对象当做查询条件进行查询
+    * @param sysCompany
+    * @return SysCompany对象
+    */
+    SysCompany findByObject(SysCompany sysCompany);
+
+    /**
+     * 更新公司的状态
+     * @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
new file mode 100644
index 0000000..16ba17a
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDepartmentService.java
@@ -0,0 +1,44 @@
+package com.kidgrow.usercenter.service;
+
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.service.ISuperService;
+import com.kidgrow.usercenter.model.SysDepartment;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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
+ */
+public interface ISysDepartmentService extends ISuperService<SysDepartment> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<SysDepartment> findList(Map<String, Object> params);
+
+    /**
+    * 根据SysDepartment对象当做查询条件进行查询
+    * @param sysDepartment
+    * @return SysDepartment对象
+    */
+    SysDepartment findByObject(SysDepartment sysDepartment);
+
+    ResultBody findAll(Map<String, Object> params);
+
+    ResultBody findListByHospitalId(Map<String, Object> params);
+    /**
+     *检查指定医院下是否已经存在该名称的科室
+     * @param hosId
+     * @param departmentName
+     * @return  如果返回空则视为不存在
+     */
+    String checkDepartmentName(Long hosId,String departmentName);
+}
+
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
new file mode 100644
index 0000000..933ce9d
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDictionariesService.java
@@ -0,0 +1,39 @@
+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;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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
+ */
+public interface ISysDictionariesService extends ISuperService<SysDictionaries> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult findList(Map<String, Object> params);
+
+
+    /**
+    * 根据SysDictionaries对象当做查询条件进行查询
+    * @param sysDictionaries
+    * @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
new file mode 100644
index 0000000..fc6e05a
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysDoctorService.java
@@ -0,0 +1,78 @@
+package com.kidgrow.usercenter.service;
+
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.common.service.ISuperService;
+import com.kidgrow.usercenter.model.SysDoctor;
+import com.kidgrow.usercenter.vo.SysDoctorDto;
+import com.kidgrow.usercenter.vo.SysDoctorVo;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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
+ */
+public interface ISysDoctorService extends ISuperService<SysDoctor> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<SysDoctorDto> findList(Map<String, Object> params, SysUser user);
+
+
+    /**
+    * 根据SysDoctor对象当做查询条件进行查询
+    * @param sysDoctor
+    * @return SysDoctor对象
+    */
+    SysDoctor findByObject(SysDoctor sysDoctor);
+
+    boolean delete(Long id);
+
+    ResultBody enable(Map<String, Object> params);
+
+    ResultBody saveOrUpdateSer(SysDoctorDto sysDoctor, HttpServletRequest request,SysUser user);
+
+    List<SysDoctor> findByMap(Map<String, Object> map);
+
+    /**
+     * 设为医院超管
+     * @param map
+     * @return
+     */
+    ResultBody setAdminDoctor(Map<String, Object> map);
+    /**
+     * H端检查用户名是否管理员
+     * @param userName
+     * @return
+     */
+    ResultBody userIsAdmin(String userName);
+
+    /**
+     * 根据userid删除医生数据
+     * @param userId
+     * @return
+     */
+    int deleteByUserId(Long userId);
+    /**
+     * 统计医生的数量
+     * @param datatype 业务类型
+     *                 0 自注册医生
+     *                 1 签约医生
+     *                 2 医答医生
+     *                 3 C端医生
+     *                 4 H端医生
+     * @return
+     */
+    int chartDoctor(int datatype);
+}
+
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..b95da88 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,8 +1,12 @@
 package com.kidgrow.usercenter.service;
 
-import com.kidgrow.usercenter.model.SysHospital;
 import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
 import com.kidgrow.common.service.ISuperService;
+import com.kidgrow.usercenter.model.SysHospital;
+import com.kidgrow.usercenter.vo.HospitalListVo;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.Map;
 
@@ -21,13 +25,54 @@
      * @return
      */
     PageResult<SysHospital> findList(Map<String, Object> params);
-
-
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<HospitalListVo> findHospitalList(Map<String, Object> params, SysUser user);
     /**
     * 根据SysHospital对象当做查询条件进行查询
     * @param sysHospital
     * @return SysHospital对象
     */
     SysHospital findByObject(SysHospital sysHospital);
-}
+    /**
+     * 根据医院名称模糊查询医院数据列表
+     * @param hospitalName
+     * @return
+     */
+    ResultBody<SysHospital> findByName(String hospitalName);
 
+    ResultBody<SysHospital> findAll(Map<String, Object> params);
+
+    /**
+     * 状态变更
+     * @param params
+     * @return
+     */
+    ResultBody updateEnabled(Map<String, Object> params);
+    /**
+     * 逻辑删除数据
+     * @param params
+     * @return
+     */
+    ResultBody delete(Map<String, Object> params);
+
+    /**
+     * 修改logo数据
+     * @param params
+     * @return
+     */
+    ResultBody updateLogo(@RequestBody Map<String, Object> params);
+
+    /**
+     * 统计医院数量
+     * @param datatype  医院类型
+     *                 0 试用医院
+     *                  1 正式医院
+     *                  11 筛查医院
+     * @return
+             */
+    ResultBody chartHospital(int datatype);
+}
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysLoggerService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysLoggerService.java
new file mode 100644
index 0000000..a9b4fc7
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysLoggerService.java
@@ -0,0 +1,33 @@
+package com.kidgrow.usercenter.service;
+
+import com.kidgrow.usercenter.model.SysLogger;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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
+ */
+public interface ISysLoggerService extends ISuperService<SysLogger> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<SysLogger> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据SysLogger对象当做查询条件进行查询
+    * @param sysLogger
+    * @return SysLogger对象
+    */
+    SysLogger findByObject(SysLogger sysLogger);
+}
+
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysOrganizationService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysOrganizationService.java
new file mode 100644
index 0000000..282563d
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysOrganizationService.java
@@ -0,0 +1,68 @@
+package com.kidgrow.usercenter.service;
+
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.common.service.ISuperService;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 组织架构表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-03-31 11:01:35 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface ISysOrganizationService extends ISuperService<SysOrganization> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<SysOrganization> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据SysOrganization对象当做查询条件进行查询
+    * @param sysOrganization
+    * @return SysOrganization对象
+    */
+    SysOrganization findByObject(SysOrganization sysOrganization);
+
+
+    /**
+     * 通过用户ID获取用户所属组织机构列表
+     * @param userId
+     * @return
+     */
+    List<SysOrganization> findListByUserId(Long userId);
+    /**
+     * 根据map  查询,  将参数中的  access_token 去掉
+     * @param params
+     * @return
+     */
+    ResultBody getListByMap(Map<String, Object> params);
+
+
+    ResultBody updateEnabled(Map<String, Object> params);
+
+    /**
+     * 获取树状图
+     * @param params
+     * @return
+     */
+    ResultBody getTree(Map<String, Object> params);
+
+    boolean saveOrUpdateSer(SysOrganization sysOrganization);
+
+    /**
+     * 根据userid删除组织对应数据
+     * @param userId
+     * @return
+     */
+    int deleteByUserId(Long userId);
+}
+
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysRoleOrganizationService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysRoleOrganizationService.java
new file mode 100644
index 0000000..4a87b0e
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysRoleOrganizationService.java
@@ -0,0 +1,42 @@
+package com.kidgrow.usercenter.service;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.usercenter.dto.SysRoleOrganizationDto;
+import com.kidgrow.usercenter.model.SysRoleOrganization;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 角色对应的   部门<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-21 14:24:41 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface ISysRoleOrganizationService extends ISuperService<SysRoleOrganization> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<SysRoleOrganization> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据SysRoleOrganization对象当做查询条件进行查询
+    * @param sysRoleOrganization
+    * @return SysRoleOrganization对象
+    */
+    SysRoleOrganization findByObject(SysRoleOrganization sysRoleOrganization);
+
+    boolean saveOrUpdateSer(SysRoleOrganizationDto sysRoleOrganizationDto, SysUser user);
+
+    ResultBody getTree(Map<String, Object> params,SysUser user);
+
+    Map<String, Object> getRoleOrgMap( SysUser user);
+}
+
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysRoleService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysRoleService.java
index 587d490..065f752 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysRoleService.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysRoleService.java
@@ -47,4 +47,10 @@
 	 * @return
 	 */
 	ResultBody updateEnabled(Map<String, Object> params);
+
+	/**
+	 * 用户管理根据条件查询角色
+	 * @return
+	 */
+    List<SysRole> findByMap(Map<String, Object> params);
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserLogsService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserLogsService.java
index ad92fc4..433ba40 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserLogsService.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserLogsService.java
@@ -10,7 +10,7 @@
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
  * @Description: 系统用户登录日志表<br>
  * @Project: 用户中心<br>
- * @CreateDate: Created in 2020-03-09 10:13:23 <br>
+ * @CreateDate: Created in 2020-04-02 18:32:36 <br>
  * @Author: <a href="4345453@kidgrow.com">liuke</a>
  * @version 1.0
  */
@@ -21,5 +21,13 @@
      * @return
      */
     PageResult<SysUserLogs> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据SysUserLogs对象当做查询条件进行查询
+    * @param sysUserLogs
+    * @return SysUserLogs对象
+    */
+    SysUserLogs findByObject(SysUserLogs sysUserLogs);
 }
 
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserOrgService.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserOrgService.java
new file mode 100644
index 0000000..a23b078
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysUserOrgService.java
@@ -0,0 +1,39 @@
+package com.kidgrow.usercenter.service;
+
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.common.model.SysUserOrg;
+import com.kidgrow.common.service.ISuperService;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 用户和组织关系表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-03-31 11:01:35 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+public interface ISysUserOrgService extends ISuperService<SysUserOrg> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<SysUserOrg> findList(Map<String, Object> params);
+
+
+    /**
+    * 根据SysUserOrg对象当做查询条件进行查询
+    * @param sysUserOrg
+    * @return SysUserOrg对象
+    */
+    SysUserOrg findByObject(SysUserOrg sysUserOrg);
+
+    List<SysUserOrg> getListByMap(Map<String, Object> params);
+
+    List<SysOrganization> getListUser(Long userId);
+}
+
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 8d9b84b..9604b15 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 com.kidgrow.usercenter.vo.UserRegVo;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -68,8 +70,13 @@
 	 * @param newPassword
 	 * @return
 	 */
-	ResultBody updatePassword(Long id, String oldPassword, String newPassword);
-
+	ResultBody updatePassword(Long id, String oldPassword, String newPassword,Boolean isdefault) throws Exception;
+	/**
+	 * 更新手机号
+	 * @param params
+	 * @return
+	 */
+	ResultBody updateUserTel(Map<String,Object> params) throws Exception ;
 	/**
 	 * 用户列表
 	 * @param params
@@ -105,4 +112,72 @@
 	 * 删除用户
 	 */
 	boolean delUser(Long id);
+
+	ResultBody findAll(Map<String, Object> map);
+
+	ResultBody getThisUserOrganizationUser(HttpServletRequest request);
+
+	ResultBody findCountByMap(Map<String, Object> map);
+
+    ResultBody passwordByPhone(Map<String, Object> map) throws Exception;
+
+	ResultBody registerByPhone(Map<String, Object> map);
+
+    ResultBody updatePhone(Map<String, Object> map,SysUser sysUser);
+
+	/**
+	 * 查询指定角色用户
+	 * @param type:0销售,1运维
+	 * @return
+	 */
+	ResultBody findAppointUsers(Integer type);
+	/**
+	 * 获取登录用户的其它信息
+	 * @param userId
+	 * @return
+	 */
+	ResultBody findDoctorUserAllData(Long userId);
+
+	/**
+	 * H端用户注册  管理员添加用户
+	 * @param userRegVo
+	 * @return
+	 */
+	ResultBody doctorUserReg(UserRegVo userRegVo,SysUser sysUser) throws Exception;
+	/**
+	 * 获取医院科室下的所有有效的医生
+	 * @param hospitalId
+	 * @param departmentId
+	 * @return
+	 */
+	ResultBody hospitalDoctorList(Long hospitalId, Long departmentId,Boolean isdel);
+	/**
+	 * 获取医院科室下的所有有效的医生
+	 * @param userTel
+	 * @return
+	 */
+	ResultBody isRegUser(String userTel);
+
+	/**
+	 * 检查手机号是否已经注册 true存在  false不存在
+	 * @param phone
+	 * @return
+	 */
+	boolean phoneIsUsed(String phone);
+
+	ResultBody jiaMipython(String password);
+
+	/**
+	 * 根据科室id反查医院id
+	 * @param departmentId  科室id
+	 * @return
+	 */
+	Long HospitalIdByDepartmentId(Long departmentId);
+
+	/**
+	 * 删除用户  不删除关系表 ,role_user 表  和 用户组织
+	 *
+	 * @param id
+	 */
+    boolean deleteNoContact(Long id);
 }
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
new file mode 100644
index 0000000..a6e6b6e
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysAreaServiceImpl.java
@@ -0,0 +1,73 @@
+package com.kidgrow.usercenter.service.impl;
+
+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;
+import com.kidgrow.usercenter.service.ISysAreaService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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 SysAreaServiceImpl extends SuperServiceImpl<SysAreaMapper, SysArea> implements ISysAreaService {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<SysArea> findList(Map<String, Object> params){
+        List<SysArea> list  =  baseMapper.findList(params);
+        return PageResult.<SysArea>builder().data(list).code(0).count((long) list.size()).build();
+    }
+
+    /**
+   * 根据SysArea对象当做查询条件进行查询
+   * @param sysArea
+   * @return SysArea
+   */
+    @Override
+    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("更新失败");
+    }
+
+    @Override
+    public ResultBody getListByMap(Map<String, Object> params) {
+        List<SysArea> sysAreas = baseMapper.selectByMap(params);
+        return ResultBody.ok().data(sysAreas);
+    }
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysCompanyServiceImpl.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysCompanyServiceImpl.java
new file mode 100644
index 0000000..68a14e4
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysCompanyServiceImpl.java
@@ -0,0 +1,81 @@
+package com.kidgrow.usercenter.service.impl;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.usercenter.model.SysArea;
+import com.kidgrow.usercenter.service.ISysAreaService;
+import com.kidgrow.usercenter.vo.SysCompanyVo;
+import org.springframework.beans.factory.annotation.Autowired;
+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.List;
+import java.util.Map;
+import org.apache.commons.collections4.MapUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import com.kidgrow.usercenter.model.SysCompany;
+import com.kidgrow.usercenter.mapper.SysCompanyMapper;
+import com.kidgrow.usercenter.service.ISysCompanyService;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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 SysCompanyServiceImpl extends SuperServiceImpl<SysCompanyMapper, SysCompany> implements ISysCompanyService {
+    @Autowired
+    private ISysAreaService sysAreaService;
+    @Autowired
+    private SysRoleOrganizationServiceImpl SysRoleOrganizationServiceImpl;
+    private final  Integer SHENG=1;
+    private final  Integer SHI=2;
+    private final  Integer XIAN=3;
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult findList(Map<String, Object> params, SysUser user){
+        Page<SysCompany> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        SysRoleOrganizationServiceImpl.getRoleOrg(params, user);
+        List<SysCompany> list  =  baseMapper.findList(page, params);
+        return PageResult.<SysCompany>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据SysCompany对象当做查询条件进行查询
+   * @param sysCompany
+   * @return SysCompany
+   */
+    @Override
+    public SysCompany findByObject(SysCompany sysCompany){
+        return baseMapper.findByObject(sysCompany);
+    }
+
+    @Override
+    public ResultBody updateEnabled(Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        if (id != null) {
+            SysCompany sysCompany = baseMapper.selectById(id);
+            if (sysCompany != null) {
+                Boolean enabled = MapUtils.getBoolean(params, "enabled");
+                sysCompany.setEnabled(enabled);
+                baseMapper.updateById(sysCompany);
+            }
+        }else {
+            return ResultBody.failed("请选择一条数据");
+        }
+        return ResultBody.ok();
+    }
+}
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
new file mode 100644
index 0000000..215534d
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDepartmentServiceImpl.java
@@ -0,0 +1,94 @@
+package com.kidgrow.usercenter.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.usercenter.mapper.SysDepartmentMapper;
+import com.kidgrow.usercenter.model.SysDepartment;
+import com.kidgrow.usercenter.model.SysHospital;
+import com.kidgrow.usercenter.service.ISysDepartmentService;
+import com.kidgrow.usercenter.service.ISysHospitalService;
+import com.kidgrow.usercenter.service.ISysOrganizationService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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 SysDepartmentServiceImpl extends SuperServiceImpl<SysDepartmentMapper, SysDepartment> implements ISysDepartmentService {
+
+    @Autowired
+    private ISysOrganizationService iSysOrganizationService;
+    @Autowired
+    private ISysHospitalService iSysHospitalService;
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<SysDepartment> findList(Map<String, Object> params){
+        Page<SysDepartment> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<SysDepartment> list  =  baseMapper.findList(page, params);
+        return PageResult.<SysDepartment>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据SysDepartment对象当做查询条件进行查询
+   * @param sysDepartment
+   * @return SysDepartment
+   */
+    @Override
+    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);
+    }
+
+    @Override
+    public String checkDepartmentName(Long hosId, String departmentName) {
+        String departName=baseMapper.checkDepartmentName(hosId,departmentName);
+        return departName;
+    }
+}
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
new file mode 100644
index 0000000..56ef37f
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDictionariesServiceImpl.java
@@ -0,0 +1,88 @@
+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.SysDictionariesMapper;
+import com.kidgrow.usercenter.model.SysDictionaries;
+import com.kidgrow.usercenter.service.ISysDictionariesService;
+import com.kidgrow.usercenter.vo.SysDictionariesVo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.cglib.beans.BeanCopier;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @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 SysDictionariesServiceImpl extends SuperServiceImpl<SysDictionariesMapper, SysDictionaries> implements ISysDictionariesService {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    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);
+        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())){
+                Map<String, Object> paramsTemp=new HashMap<>();
+                paramsTemp.put("dictionaries_key",dictionaries.getDictionariesClassId());
+                List<SysDictionaries> dicList = baseMapper.selectByMap(paramsTemp);
+                if(dicList!=null&&dicList.size()>0){
+                    sysDictionariesVo.setDictionariesClassName(dicList.get(0).getDictionariesName());
+                }
+            }
+            listvo.add(sysDictionariesVo);
+        }
+        return PageResult.<SysDictionariesVo>builder().data(listvo).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据SysDictionaries对象当做查询条件进行查询
+   * @param sysDictionaries
+   * @return SysDictionaries
+   */
+    @Override
+    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
new file mode 100644
index 0000000..6be917c
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysDoctorServiceImpl.java
@@ -0,0 +1,535 @@
+package com.kidgrow.usercenter.service.impl;
+
+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.model.*;
+import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.common.utils.StringUtils;
+import com.kidgrow.redis.util.RedisConstant;
+import com.kidgrow.redis.util.RedisUtils;
+import com.kidgrow.usercenter.mapper.*;
+import com.kidgrow.usercenter.model.SysDepartment;
+import com.kidgrow.usercenter.model.SysDoctor;
+import com.kidgrow.usercenter.model.SysHospital;
+import com.kidgrow.usercenter.model.SysRoleUser;
+import com.kidgrow.usercenter.service.ISysDoctorService;
+import com.kidgrow.usercenter.service.ISysUserOrgService;
+import com.kidgrow.usercenter.service.ISysUserService;
+import com.kidgrow.usercenter.vo.SysDoctorDto;
+import com.kidgrow.usercenter.vo.SysDoctorVo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+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 org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © 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>
+ */
+@Slf4j
+@Service
+public class SysDoctorServiceImpl extends SuperServiceImpl<SysDoctorMapper, SysDoctor> implements ISysDoctorService {
+    /**
+     * 列表
+     *
+     * @param params
+     * @return
+     */
+    @Autowired
+    private ISysUserService iSysUserService;
+    @Autowired
+    private SysUserMapper sysUserMapper;
+    @Autowired
+    private PasswordEncoder passwordEncoder;
+    @Autowired
+    private ISysUserOrgService sysUserOrgService;
+    @Autowired
+    private RedisUtils redisUtils;
+    @Autowired
+    private SysRoleOrganizationServiceImpl SysRoleOrganizationServiceImpl;
+    @Autowired
+    private SysRoleMapper sysRoleMapper;
+    @Autowired
+    private SysHospitalMapper sysHospitalMapper;
+    @Autowired
+    private SysDepartmentMapper sysDepartmentMapper;
+    @Autowired
+    private SysUserRoleMapper sysUserRoleMapper;
+    @Autowired
+    private SysUserServiceImpl sysUserServiceImpl;
+
+//    private final String HOSPITAL_ADMIN="hospital_admin";
+
+    @Override
+    public PageResult<SysDoctorDto> findList(Map<String, Object> params, SysUser user) {
+        Page<SysDoctor> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        //添加权限
+        SysRoleOrganizationServiceImpl.getRoleOrg(params, user);
+        List<SysDoctor> list = baseMapper.findList(page, params);
+        List<SysDoctorDto> listvo = new ArrayList<>();
+        list.forEach(e -> {
+            SysDoctorDto vo = new SysDoctorDto();
+            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());
+                }
+                QueryWrapper queryWrapper = new QueryWrapper();
+                queryWrapper.eq("user_id", e.getUserId());
+                List<SysRoleUser> roleUserList = sysUserRoleMapper.selectList(queryWrapper);
+                List<Long> collect = roleUserList.stream().map(roleUser -> roleUser.getRoleId()).collect(Collectors.toList());
+                vo.setRoles(collect);
+            }
+            listvo.add(vo);
+        });
+        return PageResult.<SysDoctorDto>builder().data(listvo).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+     * 根据SysDoctor对象当做查询条件进行查询
+     *
+     * @param sysDoctor
+     * @return SysDoctor
+     */
+    @Override
+    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.deleteNoContact(sysDoctor.getUserId());
+        }
+        sysDoctor.setIsDel(true);
+        int i = baseMapper.updateById(sysDoctor);
+        return true;
+    }
+
+    /**
+     * 根据userid删除医生数据
+     *
+     * @param userId
+     * @return
+     */
+    @Override
+    public int deleteByUserId(Long userId) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("userId", userId);
+        return baseMapper.deleteByMap(params);
+    }
+
+    /**
+     * 统计医生的数量
+     *
+     * @param datatype 业务类型
+     *                 0 自注册医生
+     *                 1 签约医生
+     *                 2 医答医生
+     *                 3 C端医生
+     *                 4 H端医生
+     *                 5 待审核医生
+     * @return
+     */
+    @Override
+    public int chartDoctor(int datatype) {
+        return baseMapper.chartDoctor(datatype);
+    }
+
+    @Override
+    public ResultBody enable(Map<String, Object> params) {
+        Long aLong = MapUtils.getLong(params, "id");
+        SysDoctor sysDoctor = baseMapper.selectById(aLong);
+        Boolean enabled = MapUtils.getBoolean(params, "enabled");
+        if (sysDoctor != null && sysDoctor.getUserId() != null) {
+            SysUser byId = iSysUserService.getById(sysDoctor.getUserId());
+            if (byId != null) {
+                byId.setEnabled(enabled);
+                iSysUserService.updateById(byId);
+            }
+        }
+        if (sysDoctor != null) {
+
+            sysDoctor.setEnabled(enabled);
+            baseMapper.updateById(sysDoctor);
+        } else {
+            return ResultBody.failed("禁用失败");
+        }
+        return ResultBody.ok(0, "禁用成功");
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public ResultBody saveOrUpdateSer(SysDoctorDto sysDoctor, HttpServletRequest request, SysUser user) {
+        String id = request.getHeader(SecurityConstants.USER_ID_HEADER);
+        if (null == sysDoctor) {
+            return ResultBody.failed("请填写信息");
+        } else {
+            Boolean flag = false;
+            if (sysDoctor.getDoctorType() != 2) {
+                if (sysDoctor.getRoles() == null || sysDoctor.getRoles().size() <= 0) {
+                    return ResultBody.failed("选择一个角色");
+                }
+            }
+
+            /**
+             * 限制只有创建医生的个数
+             *
+             */
+            if (sysUserServiceImpl.departmetAccountsCount(sysDoctor.getDepartmentId()) <= 0) {
+                return ResultBody.failed("该部门创建人数已经达到上限");
+            }
+            SysHospital sysHospital = sysHospitalMapper.selectById(sysDoctor.getHospitalId());
+            SysDepartment sysDepartment = sysDepartmentMapper.selectById(sysDoctor.getDepartmentId());
+            if (sysDoctor.getId() == null) {
+                Long sysUserId = null;
+                //保存部门信息
+                ResultBody resultBody = this.saveFenjiekou(sysDoctor, id, sysHospital, sysDepartment, null);
+                if (resultBody.getCode() == 0) {
+                    sysUserId = (Long) resultBody.getData();
+                } else {
+                    return resultBody;
+                }
+                //保存doctor的数据
+                SysDoctor sysDoc = new SysDoctor();
+                BeanCopier beanCopier = BeanCopier.create(SysDoctorDto.class, SysDoctor.class, false);
+                beanCopier.copy(sysDoctor, sysDoc, null);
+                sysDoc.setUserId(sysUserId);
+                if (user.getOrganizations() != null) {
+                    List<SysOrganization> organizations = user.getOrganizations();
+                    sysDoc.setCreateUserOrgCode(organizations.get(organizations.size() - 1).getOrgCode());
+                }
+                baseMapper.insert(sysDoc);
+            } else {
+                //更新
+                SysDoctor getOne = baseMapper.selectById(sysDoctor.getId());
+                if (getOne.getDoctorType() != 2 && sysDoctor.getDoctorType() != 2) {
+                    QueryWrapper queryrole = new QueryWrapper();
+                    queryrole.eq("user_id", getOne.getUserId());
+                    List<SysRoleUser> list = sysUserRoleMapper.selectList(queryrole);
+                    //如果是本来是管理员的话,不用走判读管理员的方法
+                    if (!list.isEmpty()) {
+                        List<Long> collect = list.stream().map(e -> e.getRoleId()).collect(Collectors.toList());
+                        if (!collect.contains(CommonConstant.HOSPITAL_ADMIN_ID)) {
+                            /**
+                             * 管理员只有一个
+                             */
+                            if (isSupperRole(sysDoctor)) {
+                                return ResultBody.failed("该部门已经有管理员");
+                            }
+                        }
+                    } else {
+                        /**
+                         * 管理员只有一个
+                         */
+                        if (isSupperRole(sysDoctor)) {
+                            return ResultBody.failed("该部门已经有管理员");
+                        }
+                    }
+                    Map<String, Object> columnMap = new HashMap<>();
+                    columnMap.put("user_id", sysDoctor.getUserId());
+                    boolean b = sysUserOrgService.removeByMap(columnMap);
+                    //保存将sys_user_org
+                    SysUserOrg sysUserOrg = new SysUserOrg();
+                    sysUserOrg.setUserId(getOne.getUserId());
+                    sysUserOrg.setEnabled(false);
+                    sysUserOrg.setFromId(sysDoctor.getDepartmentId());
+                    sysUserOrg.setFromLevel(CommonConstant.SYSTEM_ORG_DEP_LEVEL);
+                    sysUserOrg.setOrgId(sysDepartment.getOrgId());
+                    sysUserOrg.setCreateTime(new Date());
+                    sysUserOrgService.saveOrUpdate(sysUserOrg);
+                    SysUserOrg sysGongsi = new SysUserOrg();
+                    sysGongsi.setUserId(getOne.getId());
+                    sysGongsi.setOrgId(sysHospital.getOrgId());
+                    sysGongsi.setFromId(sysDoctor.getHospitalId());
+                    sysGongsi.setFromLevel(CommonConstant.SYSTEM_ORG_DEP_LEVEL);
+                    sysUserOrgService.saveOrUpdate(sysGongsi);
+                    baseMapper.updateById(sysDoctor);
+                    if (redisUtils.hHasKey(RedisConstant.USER_ORGANIZATION, getOne.getUserId().toString())) {
+                        redisUtils.hdel(RedisConstant.USER_ORGANIZATION, getOne.getUserId().toString());
+                    }
+                    redisUtils.hset(RedisConstant.USER_ORGANIZATION, getOne.getUserId().toString(), sysUserOrg);
+                    //角色更换
+                    QueryWrapper queryWrapper = new QueryWrapper();
+                    queryWrapper.eq("user_id", getOne.getUserId());
+                    int delete = sysUserRoleMapper.delete(queryWrapper);
+                    sysDoctor.getRoles().forEach(e -> {
+                        SysRoleUser sysRoleUser = new SysRoleUser();
+                        sysRoleUser.setRoleId(e);
+                        sysRoleUser.setUserId(getOne.getUserId());
+                        int insert = sysUserRoleMapper.insert(sysRoleUser);
+                    });
+                } else if (getOne.getDoctorType() == 2 && sysDoctor.getDoctorType() != 2) {
+                    /**
+                     * 管理员只有一个
+                     */
+                    if (isSupperRole(sysDoctor)) {
+                        return ResultBody.failed("该部门已经有管理员");
+                    }
+                    ResultBody resultBody = this.saveFenjiekou(sysDoctor, id, sysHospital, sysDepartment, getOne);
+                    Long sysUserId = null;
+                    if (resultBody.getCode() == 0) {
+                        sysUserId = (Long) resultBody.getData();
+                    } else {
+                        return resultBody;
+                    }
+                    sysDoctor.setUserId(sysUserId);
+                    baseMapper.updateById(sysDoctor);
+                } else if (getOne.getDoctorType() != 2 && sysDoctor.getDoctorType() == 2) {
+                    //将组织删除
+                    Map<String, Object> columnMap = new HashMap<>();
+                    columnMap.put("user_id", getOne.getUserId());
+                    boolean b = sysUserOrgService.removeByMap(columnMap);
+                    SysUser byId = iSysUserService.getById(getOne.getUserId());
+                    //将角色删除
+                    QueryWrapper queryWrapper = new QueryWrapper();
+                    queryWrapper.eq("user_id", getOne.getUserId());
+                    int delete = sysUserRoleMapper.delete(queryWrapper);
+                    if (byId != null) {
+                        byId.setDel(true);
+                        boolean b1 = iSysUserService.updateById(byId);
+                    }
+                    redisUtils.hdel(RedisConstant.USER_ORGANIZATION, getOne.getUserId().toString());
+                    sysDoctor.setUserId(null);
+                    baseMapper.updateById(sysDoctor);
+                    //将用户删除
+                    SysUser sysUser = new SysUser();
+                    sysUser.setId(getOne.getUserId());
+                    sysUser.setDel(true);
+                    sysUserMapper.deleteById(sysUser);
+                } else if (getOne.getDoctorType() == 2 && sysDoctor.getDoctorType() == 2) {
+                    baseMapper.updateById(sysDoctor);
+                }
+            }
+        }
+        return ResultBody.ok();
+    }
+
+    //是否可以使是超管角色
+    public Boolean isSupperRole(SysDoctorDto sysDoctor) {
+        Boolean flag = false;
+        /**
+         * 限制管理员只有一个
+         */
+        if (sysDoctor.getDoctorType() != 2) {
+            if (sysDoctor.getRoles().contains(CommonConstant.HOSPITAL_ADMIN_ID)) {
+                //查询一个部门下的所有医生
+                QueryWrapper wrapper = new QueryWrapper();
+                wrapper.eq("is_del", 0);
+                wrapper.eq("enabled", 1);
+                wrapper.eq("department_id", sysDoctor.getDepartmentId());
+                List<SysDoctor> doctoerList = this.baseMapper.selectList(wrapper);
+                if (doctoerList.size() > 0) {
+                    //查询role——user
+                    List<Long> collect = doctoerList.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+                    wrapper = new QueryWrapper();
+                    wrapper.in("user_id", collect);
+                    List<SysRoleUser> list = this.sysUserRoleMapper.selectList(wrapper);
+                    for (SysRoleUser sysRoleUser : list) {
+                        if (sysRoleUser.getRoleId().equals(CommonConstant.HOSPITAL_ADMIN_ID)) {
+                            flag = true;
+                        }
+                    }
+                }
+            }
+        }
+        return flag;
+    }
+
+    //保存的分接口
+    public ResultBody saveFenjiekou(SysDoctorDto sysDoctor, String id, SysHospital sysHospital, SysDepartment sysDepartment, SysDoctor getOne) {
+        Long sysUserId = null;
+        /**
+         * 管理员只有一个
+         */
+        if (isSupperRole(sysDoctor)) {
+            return ResultBody.failed("该部门已经有管理员");
+        }
+        if (sysDoctor.getDoctorType() != 2) {
+            SysUser sysUser = new SysUser();
+            //保存
+            sysUser.setUsername(sysDoctor.getUsername());
+            sysUser.setPassword(passwordEncoder.encode(sysDoctor.getPassword()));
+            sysUser.setNickname(sysDoctor.getDoctorName());
+            sysUser.setHeadImgUrl(sysDoctor.getDoctorLogo());
+            sysUser.setMobile(sysDoctor.getDoctorTel());
+            sysUser.setType(UserType.DOCTOR.name());
+            sysUser.setTenantId(CommonConstant.H_TENANT);
+            sysUser.setCreateTime(new Date());
+            SysUser byId = iSysUserService.getById(id);
+            if (byId != null) {
+                sysUser.setCreateUserId(byId.getId());
+                sysUser.setCreateUserName(byId.getUsername());
+            }
+            //做判断是否注册过手机号;
+            QueryWrapper queryWrapper = new QueryWrapper();
+            queryWrapper.eq("username", sysDoctor.getDoctorTel());
+            queryWrapper.eq("enabled", 1);
+            queryWrapper.eq("is_del", 0);
+            Integer integer = sysUserMapper.selectCount(queryWrapper);
+            if (integer > 0) {
+                return ResultBody.failed("该手机号已经注册");
+            }
+            if (getOne != null && getOne.getUserId() != null) {
+                Map<String, Object> map = new HashMap<>();
+                map.put("id", getOne.getUserId());
+                map.put("enabled", 1);
+                map.put("is_del", 1);
+                List<SysUser> sysUsers = sysUserMapper.selectByMap(map);
+                if (sysUsers != null && !sysUsers.isEmpty()) {
+                    sysUser.setId(sysUsers.get(sysUsers.size() - 1).getId());
+                }
+            }
+            if (sysUser.getId() != null) {
+                //更新
+                sysUser.setDel(false);
+                iSysUserService.updateById(sysUser);
+            } else {
+                //保存
+                iSysUserService.save(sysUser);
+            }
+            sysUserId = sysUser.getId();
+            //保存一个角色
+            sysDoctor.getRoles().forEach(e -> {
+                SysRoleUser sysRoleUser = new SysRoleUser();
+                sysRoleUser.setRoleId(e);
+                sysRoleUser.setUserId(sysUser.getId());
+                int insert = sysUserRoleMapper.insert(sysRoleUser);
+            });
+            //保存将sys_user_org 保存部门
+            SysUserOrg sysUserOrg = new SysUserOrg();
+            sysUserOrg.setUserId(sysUser.getId());
+            sysUserOrg.setFromId(sysDoctor.getDepartmentId());
+            sysUserOrg.setFromLevel(CommonConstant.SYSTEM_ORG_DEP_LEVEL);
+            sysUserOrg.setOrgId(sysDepartment.getOrgId());
+            //保存公司
+            sysUserOrgService.saveOrUpdate(sysUserOrg);
+            SysUserOrg sysGongsi = new SysUserOrg();
+            sysGongsi.setUserId(sysUser.getId());
+            sysGongsi.setOrgId(sysHospital.getOrgId());
+            sysGongsi.setFromId(sysDoctor.getHospitalId());
+            sysGongsi.setFromLevel(CommonConstant.SYSTEM_ORG_DEP_LEVEL);
+            sysUserOrgService.saveOrUpdate(sysGongsi);
+            //保存到Redis
+            boolean hset = redisUtils.hset(RedisConstant.USER_ORGANIZATION, sysUserOrg.getUserId().toString(), sysUserOrg);
+        }
+        return ResultBody.ok().data(sysUserId);
+    }
+
+    @Override
+    public List<SysDoctor> findByMap(Map<String, Object> map) {
+        map.put("enabled", 1);
+        map.put("is_del", 0);
+        return baseMapper.selectByMap(map);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public ResultBody setAdminDoctor(Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        Long adminId = MapUtils.getLong(params, "adminId");
+        if (id > 0 && adminId > 0) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("user_id", adminId);
+            map.put("is_admin_user", 1);
+            map.put("is_del", 0);
+            map.put("enabled", 1);
+            List<SysDoctor> sysDoctors = baseMapper.selectByMap(map);
+            if (sysDoctors == null || sysDoctors.size() <= 0) {
+                return ResultBody.failed("当前操作用户不是管理员");
+            }
+            SysDoctor sysDoctor = sysDoctors.get(0);
+            //先检查操作用户是否管理员
+            if (sysDoctor != null) {
+                if (sysDoctor.getIsAdminUser()) {
+                    //将超级管理员的角色设为普通角色
+                    SysRoleUser sysRoleUser = new SysRoleUser();
+                    sysRoleUser.setUserId(adminId);
+                    sysRoleUser.setRoleId(CommonConstant.HOSPITAL_DOCTOR_ID);
+                    QueryWrapper queryWrapper = new QueryWrapper();
+                    queryWrapper.eq("user_id", adminId);
+//                    queryWrapper.eq("role_id", CommonConstant.HOSPITAL_ADMIN_ID);
+                    int delete = sysUserRoleMapper.delete(queryWrapper);
+                    int update = sysUserRoleMapper.insert(sysRoleUser);
+                    //现将操作人员设为非管理角色
+                    sysDoctor.setIsAdminUser(false);
+                    if (baseMapper.updateById(sysDoctor) > 0) {
+                        //再将新用户设为管理
+                        sysDoctor = baseMapper.selectById(id);
+                        if (sysDoctor != null) {
+                            if (!sysDoctor.getIsAdminUser()) {
+                                //现将普通人员设为管理角色
+                                sysRoleUser = new SysRoleUser();
+                                sysRoleUser.setUserId(sysDoctor.getUserId());
+                                sysRoleUser.setRoleId(CommonConstant.HOSPITAL_ADMIN_ID);
+                                queryWrapper = new QueryWrapper();
+                                queryWrapper.eq("user_id", sysDoctor.getUserId());
+//                                queryWrapper.eq("role_id", CommonConstant.HOSPITAL_DOCTOR_ID);
+                                sysUserRoleMapper.delete(queryWrapper);
+                                sysUserRoleMapper.insert(sysRoleUser);
+                                sysDoctor.setIsAdminUser(true);
+                                if (baseMapper.updateById(sysDoctor) > 0) {
+                                    return ResultBody.ok().data(true).msg("管理员设置成功!");
+                                } else {
+                                    return ResultBody.failed("设为管理失败!").data(false);
+                                }
+                            } else {
+                                return ResultBody.failed("设为管理失败,改用户就是管理员!").data(false);
+                            }
+                        } else {
+                            return ResultBody.failed("用户信息有误!").data(false);
+                        }
+                    } else {
+                        return ResultBody.failed("设为管理失败!").data(false);
+                    }
+                } else {
+                    return ResultBody.failed("当前操作用户不是管理员!").data(false);
+                }
+            } else {
+                return ResultBody.failed("用户信息有误!").data(false);
+            }
+
+        } else {
+            return ResultBody.failed("业务参数有误!").data(false);
+        }
+    }
+
+    /**
+     * 判断用户名是否管理员
+     *
+     * @param userName
+     * @return
+     */
+    @Override
+    public ResultBody userIsAdmin(String userName) {
+        if (StringUtils.isNotBlank(userName)) {
+            SysDoctor sysDoctor = baseMapper.userIsAdmin(userName);
+            if (sysDoctor != null) {
+                return ResultBody.ok().data(sysDoctor.getIsAdminUser());
+            } else {
+                return ResultBody.failed().data(false);
+            }
+        } else {
+            return ResultBody.failed("用户名不能为空!").data(false);
+        }
+    }
+}
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..799c9b4 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,18 +1,29 @@
 package com.kidgrow.usercenter.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.model.SysOrganization;
+import com.kidgrow.common.model.SysUser;
 import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.common.utils.StringUtils;
+import com.kidgrow.usercenter.mapper.SysDepartmentMapper;
+import com.kidgrow.usercenter.mapper.SysHospitalMapper;
+import com.kidgrow.usercenter.mapper.SysOrganizationMapper;
+import com.kidgrow.usercenter.model.SysDepartment;
+import com.kidgrow.usercenter.model.SysHospital;
+import com.kidgrow.usercenter.service.ISysHospitalService;
+import com.kidgrow.usercenter.vo.HospitalListVo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.MapUtils;
-import lombok.extern.slf4j.Slf4j;
-
-import com.kidgrow.usercenter.model.SysHospital;
-import com.kidgrow.usercenter.mapper.SysHospitalMapper;
-import com.kidgrow.usercenter.service.ISysHospitalService;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -25,6 +36,12 @@
 @Slf4j
 @Service
 public class SysHospitalServiceImpl extends SuperServiceImpl<SysHospitalMapper, SysHospital> implements ISysHospitalService {
+    @Resource
+    private SysDepartmentMapper departmentMapper;
+    @Autowired
+    private SysRoleOrganizationServiceImpl SysRoleOrganizationServiceImpl;
+    @Autowired
+    private SysOrganizationMapper sysOrganizationMapper;
     /**
      * 列表
      * @param params
@@ -33,8 +50,24 @@
     @Override
     public PageResult<SysHospital> findList(Map<String, Object> params){
         Page<SysHospital> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+
         List<SysHospital> list  =  baseMapper.findList(page, params);
         return PageResult.<SysHospital>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<HospitalListVo> findHospitalList(Map<String, Object> params, SysUser user) {
+        Page<HospitalListVo> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        SysRoleOrganizationServiceImpl.getRoleOrg(params, user);
+        if(params.get("roleOrg")==null){
+            return PageResult.<HospitalListVo>builder().data(null).code(0).count(page.getTotal()).build();
+        }
+        List<HospitalListVo> list  =  baseMapper.findHospitalList(page, params);
+        return PageResult.<HospitalListVo>builder().data(list).code(0).count(page.getTotal()).build();
     }
 
     /**
@@ -46,4 +79,160 @@
     public SysHospital findByObject(SysHospital sysHospital){
         return baseMapper.findByObject(sysHospital);
     }
+
+    @Override
+    public ResultBody<SysHospital> findAll(Map<String, Object> params) {
+        params.put("is_del",0);
+        params.put("enabled",1);
+        List<SysHospital> sysHospitals = baseMapper.selectByMap(params);
+        return  ResultBody.ok().data(sysHospitals).msg("查询成功");
+    }
+    /**
+     * 根据医院名称模糊查询医院数据列表
+     * @param hospitalName
+     * @return
+     */
+    public ResultBody<SysHospital> findByName(String hospitalName){
+        return ResultBody.ok().data(baseMapper.findByName(hospitalName)).msg("查询成功");
+    }
+    /**
+     * 根据id和启用禁用值更新数据
+     * @param params
+     * @return ResultBody
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultBody updateEnabled(Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        Long departmentId = MapUtils.getLong(params, "departmentId");
+        Boolean enabled = MapUtils.getBoolean(params, "enabled");
+        //科室数据
+        SysDepartment sysDepartment=departmentMapper.selectById(departmentId);
+        //医院数据
+        SysHospital sysHospital = baseMapper.selectById(id);
+        //医院下的所有数据
+        Map<String,Object> columnMap=new HashMap<String,Object>();
+        columnMap.put("is_del",0);
+        columnMap.put("enabled",(enabled)?0:1);
+        columnMap.put("org_parent_id",sysHospital.getOrgId());
+        List<SysOrganization> sysOrganizationList=sysOrganizationMapper.selectByMap(columnMap);
+        if (sysHospital == null) {
+            return ResultBody.failed("医院数据不存在!");
+        }
+        if (sysDepartment == null) {
+            return ResultBody.failed("科室数据不存在!");
+        }
+        //如果这个医院下有多个科室,禁用只对当前科室有效,否则也要禁用医院
+        if(sysOrganizationList.size()==1)
+        {
+            sysHospital.setEnabled(enabled);
+            baseMapper.updateById(sysHospital);
+            SysOrganization sysOrganizationH=sysOrganizationMapper.selectById(sysHospital.getOrgId());
+            if (sysOrganizationH != null) {
+                sysOrganizationH.setEnabled(enabled);
+                sysOrganizationMapper.updateById(sysOrganizationH);
+            }
+        }
+        sysDepartment.setEnabled(enabled);
+        int j=departmentMapper.updateById(sysDepartment);
+        //更新组织数据
+        SysOrganization sysOrganizationD=sysOrganizationMapper.selectById(sysDepartment.getOrgId());
+        if (sysOrganizationD != null) {
+            sysOrganizationD.setEnabled(enabled);
+            sysOrganizationMapper.updateById(sysOrganizationD);
+        }
+        return (j > 0) ? ResultBody.ok().data(sysHospital).msg("更新成功") : ResultBody.failed("更新失败");
+    }
+
+    /**
+     * 删除医院科室信息
+     * @param params
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultBody delete(Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        Long departmentId = MapUtils.getLong(params, "departmentId");
+        //科室数据
+        SysDepartment sysDepartment=departmentMapper.selectById(departmentId);
+        //医院数据
+        //SysHospital sysHospital = baseMapper.selectById(id);
+//        if (sysHospital == null) {
+//            return ResultBody.failed("医院数据不存在!");
+//        }
+        if (sysDepartment == null) {
+            return ResultBody.failed("科室数据不存在!");
+        }
+        //医院下的所有科室数据
+//        Map<String,Object> columnMap=new HashMap<String,Object>();
+//        columnMap.put("org_parent_id",sysHospital.getOrgId());
+//        columnMap.put("is_del",0);
+//        columnMap.put("enabled",1);
+//        List<SysOrganization> sysOrganizationList=sysOrganizationMapper.selectByMap(columnMap);
+//        //如果这个医院下有多个科室,删除只对当前科室有效,否则也要删除医院
+//        if(sysOrganizationList.size()==1)
+//        {
+//            sysHospital.setIsDel(true);
+//            baseMapper.updateById(sysHospital);
+//            SysOrganization sysOrganizationH=sysOrganizationMapper.selectById(sysHospital.getOrgId());
+//            if (sysOrganizationH != null) {
+//                sysOrganizationH.setIsDel(true);
+//                sysOrganizationMapper.updateById(sysOrganizationH);
+//            }
+//        }
+        sysDepartment.setIsDel(true);
+        int j=departmentMapper.updateById(sysDepartment);
+        //删除组织数据
+        SysOrganization sysOrganizationD=sysOrganizationMapper.selectById(sysDepartment.getOrgId());
+        if (sysOrganizationD != null) {
+            sysOrganizationD.setIsDel(true);
+            sysOrganizationMapper.updateById(sysOrganizationD);
+        }
+        return (j>0) ? ResultBody.ok().data(sysDepartment).msg("科室删除成功") : ResultBody.failed("科室删除失败");
+    }
+
+    /**
+     * 更新医院logo
+     * @param params
+     * @return
+     */
+    @Override
+    public ResultBody updateLogo(Map<String, Object> params) {
+        Long hospitalId = MapUtils.getLong(params, "hospitalId");
+        String hospitalLogo=MapUtils.getString(params, "hospitalLogo");
+        String hospitalLitLogo=MapUtils.getString(params, "hospitalLitLogo");
+        if (StringUtils.isNotBlank(hospitalId.toString())&&StringUtils.isNotBlank(hospitalLogo)&&StringUtils.isNotBlank(hospitalLitLogo)) {
+            SysHospital sysHospital=baseMapper.selectById(hospitalId);
+            if (sysHospital != null) {
+                sysHospital.setHospitalLogo(hospitalLogo);
+                sysHospital.setHospitalLitLogo(hospitalLitLogo);
+                int u=baseMapper.updateById(sysHospital);
+                return ResultBody.ok().data(u>0);
+            }
+            else
+            {
+                return ResultBody.failed("医院数据有误!");
+            }
+        }
+        else
+        {
+            return ResultBody.failed("修改数据有误!");
+        }
+    }
+
+
+    /**
+     * 统计医院数量
+     * @param datatype  医院类型
+     *                 0 试用医院
+     *                  1 正式医院
+     *                  11 筛查医院
+     * @return
+     */
+    @Override
+    public ResultBody chartHospital(int datatype) {
+        int hospitalCount=baseMapper.chartHospital(datatype);
+        return ResultBody.ok().data(hospitalCount).msg("获取数据成功");
+    }
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysMenuServiceImpl.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysMenuServiceImpl.java
index e5c747a..9c95f74 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysMenuServiceImpl.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysMenuServiceImpl.java
@@ -1,6 +1,7 @@
 package com.kidgrow.usercenter.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.kidgrow.common.constant.CommonConstant;
 import com.kidgrow.common.context.ClientContextHolder;
 import com.kidgrow.common.model.ResultBody;
 import com.kidgrow.common.model.SysMenu;
@@ -67,7 +68,11 @@
 
 	@Override
 	public List<SysMenu> findByRoleCodes(Set<String> roleCodes, Integer type) {
-		return roleMenuService.findMenusByRoleCodes(roleCodes, type, ClientContextHolder.getClient());
+		String tentid=ClientContextHolder.getClient();
+		if (roleCodes.contains(CommonConstant.SYSTEM_ADMIN_ROLE_CODE)) {
+			tentid="";
+		}
+		return roleMenuService.findMenusByRoleCodes(roleCodes, type,tentid);
 	}
 
     /**
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysOrganizationServiceImpl.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysOrganizationServiceImpl.java
new file mode 100644
index 0000000..3d06eac
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysOrganizationServiceImpl.java
@@ -0,0 +1,276 @@
+package com.kidgrow.usercenter.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.common.utils.StringUtils;
+import com.kidgrow.redis.util.RedisConstant;
+import com.kidgrow.redis.util.RedisUtils;
+import com.kidgrow.usercenter.mapper.SysOrganizationMapper;
+import com.kidgrow.usercenter.mapper.SysUserOrgMapper;
+import com.kidgrow.usercenter.service.ISysOrganizationService;
+import com.kidgrow.usercenter.vo.SysOrganizationVo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cglib.beans.BeanCopier;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 组织架构表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-03-31 11:01:35 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@Service
+public class SysOrganizationServiceImpl extends SuperServiceImpl<SysOrganizationMapper, SysOrganization> implements ISysOrganizationService {
+    @Autowired
+    RedisUtils redisUtils;
+    @Autowired
+    SysUserOrgMapper sysUserOrgMapper;
+
+    /**
+     * 列表
+     *
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<SysOrganization> findList(Map<String, Object> params) {
+        Page<SysOrganization> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<SysOrganization> list = baseMapper.findList(page, params);
+        return PageResult.<SysOrganization>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+     * 根据SysOrganization对象当做查询条件进行查询
+     *
+     * @param sysOrganization
+     * @return SysOrganization
+     */
+    @Override
+    public SysOrganization findByObject(SysOrganization sysOrganization) {
+        return baseMapper.findByObject(sysOrganization);
+    }
+
+    /**
+     * 根据用户  获取组织
+     *
+     * @param userId
+     * @return
+     */
+    @Override
+    public List<SysOrganization> findListByUserId(Long userId) {
+        return baseMapper.findListByUserId(userId);
+    }
+
+    /**
+     * 根据map  查询,  将参数中的  access_token 去掉
+     *
+     * @param params
+     * @return
+     */
+    @Override
+    public ResultBody getListByMap(Map<String, Object> params) {
+        //将access_token  参数去掉
+        params.remove("access_token");
+        List<SysOrganization> sysOrganizations = baseMapper.selectByMap(params);
+        List<SysOrganizationVo> sysOrganizationVos = new ArrayList<>();
+        sysOrganizations.forEach(e -> {
+            if (e.getOrgParentId() != null) {
+                SysOrganizationVo sysOrganizationVo = new SysOrganizationVo();
+                BeanCopier beanCopier = BeanCopier.create(SysOrganization.class, SysOrganizationVo.class, false);
+                beanCopier.copy(e, sysOrganizationVo, null);
+                SysOrganization sysOrganization = baseMapper.selectById(e.getOrgParentId());
+                if (sysOrganization != null) {
+                    sysOrganizationVo.setOrgParentName(sysOrganization.getOrgName());
+                }
+                sysOrganizationVos.add(sysOrganizationVo);
+            }
+        });
+        return ResultBody.ok().data(sysOrganizationVos);
+    }
+
+    /**
+     * 更新状态
+     *
+     * @param params
+     * @return
+     */
+    @Override
+    public ResultBody updateEnabled(Map<String, Object> params) {
+        Long id = MapUtils.getLong(params, "id");
+        if (id == null) {
+            return ResultBody.failed("请选取一条数据");
+        }
+        SysOrganization sysOrganization = baseMapper.selectById(id);
+        if (sysOrganization != null) {
+            sysOrganization.setEnabled(MapUtils.getBoolean(params, "enabled"));
+            int i = baseMapper.updateById(sysOrganization);
+            redisUtils.hdel(RedisConstant.ORGANIZATION, sysOrganization.getId().toString());
+            redisUtils.hset(RedisConstant.ORGANIZATION, sysOrganization.getId().toString(), sysOrganization);
+            if (i > 0) {
+                return ResultBody.ok();
+            } else {
+                return ResultBody.failed("更新失败");
+            }
+        } else {
+            return ResultBody.failed("更新失败");
+        }
+    }
+
+    /**
+     * 获取树状图
+     *
+     * @param params
+     * @return
+     */
+    @Override
+    public ResultBody getTree(Map<String, Object> params) {
+        List<SysOrganization> sysOrganizations = baseMapper.selectByMap(params);
+        //查询 ,父类为-1的;即顶级父类
+//        params.put("org_parent_id",Long.valueOf("-1"));
+//        List<SysOrganization> sysOrgs=baseMapper.selectByMap(params);
+//        if (sysOrgs.isEmpty()) {
+//            return ResultBody.ok().data(null);
+//        }
+        List<Map<String, Object>> treeData = getTreeData(Long.valueOf("-1"), sysOrganizations);
+        return ResultBody.ok().data(treeData);
+    }
+
+    @Override
+    public int deleteByUserId(Long userId) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("user_id", userId);
+        return sysUserOrgMapper.deleteByMap(params);
+    }
+
+    /**
+     * 将数据  封装成  tree   (递归方式)
+     *
+     * @param MyId
+     * @param sysOrganizations
+     * @return
+     */
+    public List<Map<String, Object>> getTreeData(Long MyId, List<SysOrganization> sysOrganizations) {
+        List<Map<String, Object>> listMap = new ArrayList<>();
+        Map<Long, SysOrganization> collect = sysOrganizations.stream().collect(Collectors.toMap(SysOrganization::getId, SysOrganization -> SysOrganization));
+        List<Long> idList = sysOrganizations.stream().filter(e -> MyId.equals(e.getOrgParentId())).map(e -> e.getId()).collect(Collectors.toList());
+        for (Long id : idList
+        ) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", "" + id);
+            map.put("name", collect.get(id).getOrgName());
+            map.put("level", collect.get(id).getOrgLevel());
+            map.put("parentId", collect.get(id).getOrgParentId());
+            List<Long> childs = sysOrganizations.stream().filter(e ->
+                    id.equals(e.getOrgParentId())
+            ).map(e -> e.getId()).collect(Collectors.toList());
+            if (childs.size() > 0) {
+                List<Map<String, Object>> treeData = getTreeData(id, sysOrganizations);
+                map.put("children", treeData);
+            }
+            listMap.add(map);
+        }
+        return listMap;
+    }
+
+    /**
+     * 保存或者更新
+     *
+     * @param sysOrganization
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean saveOrUpdateSer(SysOrganization sysOrganization) {
+        //获取code
+
+        if (sysOrganization.getId() == null) {
+            //保存
+            String code = this.getCode(sysOrganization);
+            sysOrganization.setOrgCode(code);
+            baseMapper.insert(sysOrganization);
+        } else {
+            //更新
+            SysOrganization sysOrg = baseMapper.selectById(sysOrganization.getId());
+            if (sysOrg.getOrgParentId() != sysOrganization.getOrgParentId()) {
+                String code = this.getCode(sysOrganization);
+                sysOrganization.setOrgCode(code);
+            }
+            int i = baseMapper.updateById(sysOrganization);
+        }
+        redisUtils.hdel(RedisConstant.ORGANIZATION, sysOrganization.getId().toString());
+        redisUtils.hset(RedisConstant.ORGANIZATION, sysOrganization.getId().toString(), sysOrganization);
+        return true;
+    }
+
+
+    /**
+     * 获取自己组织的code
+     *
+     * @param sysOrganization
+     * @return
+     */
+    public String getCode(SysOrganization sysOrganization) {
+        //获取父级
+        Long orgParentId = sysOrganization.getOrgParentId();
+        if (orgParentId == null) {
+            return null;
+        }
+        SysOrganization sysOrg = baseMapper.selectById(orgParentId);
+        if (sysOrg != null) {
+            String orgCode = sysOrg.getOrgCode();
+            //查询
+            QueryWrapper queryWrapper = new QueryWrapper();
+            queryWrapper.eq("org_parent_id", sysOrg.getId());
+            queryWrapper.orderByDesc("org_code");
+            queryWrapper.last("limit 1");
+            List<SysOrganization> list = baseMapper.selectList(queryWrapper);
+            if (list.size() > 0) {
+                SysOrganization sysOrganizationLast = list.get(list.size() - 1);
+                if (sysOrganizationLast.getOrgLevel() >= 2) {
+                    String orgCodeLast = sysOrganizationLast.getOrgCode();
+                    if (StringUtils.isNotBlank(orgCodeLast)) {
+                        //取前部分
+                        String orgCodeLastQianZhui = orgCodeLast.substring(0, orgCodeLast.length() - 3);
+                        //取后部分
+                        Integer codenum = Integer.valueOf(orgCodeLast.substring(orgCodeLast.length() - 3));
+                        String str = "00";
+                        str += (codenum + 1);
+                        String substring = str.substring(str.length() - 3);
+                        return orgCodeLastQianZhui + substring;
+                    }
+                } else {
+                    String orgCodeLast = sysOrganizationLast.getOrgCode();
+                    if (StringUtils.isNotBlank(orgCodeLast)) {
+                    //取前部分
+                    String orgCodeLastQianZhui = orgCodeLast.substring(0, orgCodeLast.length() - 7);
+                    //取后部分
+                    Integer codenum = Integer.valueOf(orgCodeLast.substring(orgCodeLast.length() - 7));
+                    String str = "0000000";
+                    str += (codenum + 1);
+                    String substring = str.substring(str.length() - 7);
+                    return orgCodeLastQianZhui + substring;
+                    }
+                }
+            } else {
+                String fucode = sysOrg.getOrgCode();
+                String str = "01";
+                return fucode + str;
+            }
+        }
+        return null;
+    }
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysRoleOrganizationServiceImpl.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysRoleOrganizationServiceImpl.java
new file mode 100644
index 0000000..03a39e7
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysRoleOrganizationServiceImpl.java
@@ -0,0 +1,213 @@
+package com.kidgrow.usercenter.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.model.*;
+import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.usercenter.dto.SysRoleOrganizationDto;
+import com.kidgrow.usercenter.dto.SysRoleOrganizationMybatisDto;
+import com.kidgrow.usercenter.mapper.SysRoleMapper;
+import com.kidgrow.usercenter.mapper.SysRoleOrganizationMapper;
+import com.kidgrow.usercenter.model.SysRoleOrganization;
+import com.kidgrow.usercenter.service.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 角色对应的   部门<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-04-21 14:24:41 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@Service
+public class SysRoleOrganizationServiceImpl extends SuperServiceImpl<SysRoleOrganizationMapper, SysRoleOrganization> implements ISysRoleOrganizationService {
+
+
+    private final Integer TYPE_ZI_DING_YI = 2;//自定义数据权限
+    @Autowired
+    private ISysOrganizationService iSysOrganizationService;
+    @Autowired
+    private ISysRoleService iSysRoleService;
+    @Autowired
+    private ISysRoleUserService iSysRoleUserService;
+    @Autowired
+    private ISysUserOrgService iSysUserOrgService;
+    @Autowired
+    private SysOrganizationServiceImpl sysOrganizationService;
+    @Autowired
+    private SysRoleMapper sysRoleMapper;
+
+    /**
+     * 列表
+     *
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<SysRoleOrganization> findList(Map<String, Object> params) {
+        Page<SysRoleOrganization> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<SysRoleOrganization> list = baseMapper.findList(page, params);
+        return PageResult.<SysRoleOrganization>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+     * 根据SysRoleOrganization对象当做查询条件进行查询
+     *
+     * @param sysRoleOrganization
+     * @return SysRoleOrganization
+     */
+    @Override
+    public SysRoleOrganization findByObject(SysRoleOrganization sysRoleOrganization) {
+        return baseMapper.findByObject(sysRoleOrganization);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean saveOrUpdateSer(SysRoleOrganizationDto sysRoleOrganizationDto, SysUser user) {
+        if (sysRoleOrganizationDto.getRoleId() != null) {
+            SysRole sysRole = iSysRoleService.getById(sysRoleOrganizationDto.getRoleId());
+            sysRole.setType(sysRoleOrganizationDto.getType());
+            boolean b = iSysRoleService.updateById(sysRole);
+        }
+        SysRoleOrganization sysRoleOrganization = new SysRoleOrganization();
+        sysRoleOrganization.setRoleId(sysRoleOrganizationDto.getRoleId());
+        //先清除数据
+        if (sysRoleOrganizationDto.getRoleId() != null) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("role_id", sysRoleOrganizationDto.getRoleId());
+            map.put("is_del", 0);
+            List<SysRoleOrganization> sysRoleOrganizations = baseMapper.selectByMap(map);
+            List<Long> collect = sysRoleOrganizations.stream().map(e -> e.getId()).collect(Collectors.toList());
+            if (collect.size() > 0) {
+                int i = baseMapper.deleteBatchIds(collect);
+            }
+        }
+        //2自定义数据权限
+        if (sysRoleOrganizationDto.getType() == TYPE_ZI_DING_YI) {
+            List<Long> orgIds = sysRoleOrganizationDto.getOrgIds();
+            orgIds.forEach(e -> {
+                sysRoleOrganization.setId(null);
+                sysRoleOrganization.setOrgId(e);
+                SysOrganization byId = iSysOrganizationService.getById(e);
+                if (byId != null) {
+                    sysRoleOrganization.setOrgCode(byId.getOrgCode());
+                }
+                baseMapper.insert(sysRoleOrganization);
+            });
+        }
+        return true;
+    }
+
+    @Override
+    public ResultBody getTree(Map<String, Object> params, SysUser user) {
+        List<SysOrganization> sysOrganizations = sysOrganizationService.listByMap(params);
+        QueryWrapper queryWrapper = new QueryWrapper();
+        List<Long> roleIdList = user.getRoles().stream().map(e -> e.getId()).collect(Collectors.toList());
+        queryWrapper.in("role_id", roleIdList);
+        List<SysRoleOrganization> list = baseMapper.selectList(queryWrapper);
+        List<Long> collect = list.stream().map(e -> e.getOrgId()).collect(Collectors.toList());
+        List<Map<String, Object>> treeData = getTreeData(Long.valueOf("-1"), sysOrganizations, collect);
+        return ResultBody.ok().data(treeData);
+    }
+
+    /**
+     * 将数据  封装成  tree   (递归方式)
+     *
+     * @param MyId
+     * @param sysOrganizations
+     * @return
+     */
+    public List<Map<String, Object>> getTreeData(Long MyId, List<SysOrganization> sysOrganizations, List<Long> col) {
+        List<Map<String, Object>> listMap = new ArrayList<>();
+        Map<Long, SysOrganization> collect = sysOrganizations.stream().collect(Collectors.toMap(SysOrganization::getId, SysOrganization -> SysOrganization));
+        List<Long> idList = sysOrganizations.stream().filter(e -> e.getOrgParentId() .equals(MyId)).map(e -> e.getId()).collect(Collectors.toList());
+        for (Long id : idList
+        ) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", "" + id);
+            map.put("name", collect.get(id).getOrgName());
+            map.put("level", collect.get(id).getOrgLevel());
+            map.put("checked", col.contains(id));
+            List<Long> childs = sysOrganizations.stream().filter(e -> e.getOrgParentId().equals(id)).map(e -> e.getId()).collect(Collectors.toList());
+            if (childs.size() > 0) {
+                List<Map<String, Object>> treeData = getTreeData(id, sysOrganizations, col);
+                map.put("children", treeData);
+            }
+            listMap.add(map);
+        }
+        return listMap;
+    }
+
+    /**
+     * 将权限 分装到map对像
+     *
+     * @param params
+     * @param user
+     */
+
+    public void getRoleOrg(Map<String, Object> params, SysUser user) {
+        //获取角色接口
+        List<SysRole>  roles = iSysRoleUserService.findRolesByUserId(user.getId());
+        List<SysOrganization> listUser = iSysUserOrgService.getListUser(user.getId());
+        List<Map<Integer, Object>> listroleOrg = new ArrayList<>();
+        if(listUser!=null){
+            if (!roles.isEmpty()) {
+                int index=0;
+                for (SysRole e : roles) {
+                    Map<Integer, Object> rolemap = new HashMap<>();
+                    SysRoleOrganizationMybatisDto dto=new SysRoleOrganizationMybatisDto();
+                    if(e.getType() == 1){
+                        dto.setFlag(index==0);
+                        dto.setObject(user.getId());
+                        rolemap.put(e.getType(), dto);
+                    }else if (e.getType() == 2) {
+                        Map<String, Object> map = new HashMap<>();
+                        map.put("role_id", e.getId());
+                        List<SysRoleOrganization> sysRoleOrganizations = baseMapper.selectByMap(map);
+                        if (sysRoleOrganizations.size() > 0) {
+                            dto.setFlag(index==0);
+                            dto.setObject(sysRoleOrganizations);
+                            rolemap.put(e.getType(), dto);
+                        }
+                    } else if (e.getType() == 3) {
+                        dto.setFlag(index==0);
+                        dto.setObject(user.getOrganizations().get(user.getOrganizations().size() - 1).getOrgCode());
+                        rolemap.put(e.getType(), dto);
+                    } else if (e.getType() == 4) {
+                        dto.setFlag(index==0);
+                        dto.setObject(user.getOrganizations().get(user.getOrganizations().size() - 1).getOrgCode());
+                        rolemap.put(e.getType(), dto);
+                    } else if (e.getType() == 5) {
+                        dto.setFlag(index==0);
+                        dto.setObject(user.getId());
+                        rolemap.put(e.getType(), dto);
+                    }
+                    index+=1;
+                    listroleOrg.add(rolemap);
+                };
+            }
+        }
+        //添加权限控制
+        params.put("roleOrg", listroleOrg);
+    }
+
+    @Override
+    public Map<String, Object> getRoleOrgMap(SysUser user) {
+        Map<String, Object> map = new HashMap<>();
+        getRoleOrg(map, user);
+        return map;
+    }
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysRoleServiceImpl.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysRoleServiceImpl.java
index d1ba0b1..f6c2c54 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysRoleServiceImpl.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysRoleServiceImpl.java
@@ -70,7 +70,7 @@
     }
 
     @Override
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public ResultBody saveOrUpdateRole(SysRole sysRole) {
         if (sysRole.getId() == null) {
             this.saveRole(sysRole);
@@ -85,6 +85,12 @@
         return baseMapper.findAll();
     }
 
+    @Override
+    public List<SysRole> findByMap(Map<String, Object> params) {
+        params.put("is_del",0);
+        params.put("enabled",1);
+        return baseMapper.selectByMap(params);
+    }
 
     @Override
     public ResultBody updateEnabled(Map<String, Object> params) {
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserLogsServiceImpl.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserLogsServiceImpl.java
index 80af120..891c2dc 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserLogsServiceImpl.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserLogsServiceImpl.java
@@ -1,24 +1,23 @@
 package com.kidgrow.usercenter.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.service.impl.SuperServiceImpl;
+import com.kidgrow.usercenter.mapper.SysUserLogsMapper;
+import com.kidgrow.usercenter.model.SysUserLogs;
+import com.kidgrow.usercenter.service.ISysUserLogsService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.MapUtils;
-import lombok.extern.slf4j.Slf4j;
-
-import com.kidgrow.usercenter.model.SysUserLogs;
-import com.kidgrow.usercenter.mapper.SysUserLogsMapper;
-import com.kidgrow.usercenter.service.ISysUserLogsService;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
  * @Description: 系统用户登录日志表<br>
  * @Project: 用户中心<br>
- * @CreateDate: Created in 2020-03-09 10:13:23 <br>
+ * @CreateDate: Created in 2020-04-02 18:32:36 <br>
  * @Author: <a href="4345453@kidgrow.com">liuke</a>
  * @version 1.0
  */
@@ -36,4 +35,14 @@
         List<SysUserLogs> list  =  baseMapper.findList(page, params);
         return PageResult.<SysUserLogs>builder().data(list).code(0).count(page.getTotal()).build();
     }
+
+    /**
+   * 根据SysUserLogs对象当做查询条件进行查询
+   * @param sysUserLogs
+   * @return SysUserLogs
+   */
+    @Override
+    public SysUserLogs findByObject(SysUserLogs sysUserLogs){
+        return baseMapper.findByObject(sysUserLogs);
+    }
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserOrgServiceImpl.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserOrgServiceImpl.java
new file mode 100644
index 0000000..291870e
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysUserOrgServiceImpl.java
@@ -0,0 +1,88 @@
+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.SysOrganization;
+import com.kidgrow.common.model.SysUserOrg;
+import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.usercenter.mapper.SysUserOrgMapper;
+import com.kidgrow.usercenter.service.ISysOrganizationService;
+import com.kidgrow.usercenter.service.ISysUserOrgService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 用户和组织关系表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-03-31 11:01:35 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version 1.0
+ */
+@Slf4j
+@Service
+public class SysUserOrgServiceImpl extends SuperServiceImpl<SysUserOrgMapper, SysUserOrg> implements ISysUserOrgService {
+    @Autowired
+    private ISysOrganizationService iSysOrganizationService;
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<SysUserOrg> findList(Map<String, Object> params){
+        Page<SysUserOrg> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<SysUserOrg> list  =  baseMapper.findList(page, params);
+        return PageResult.<SysUserOrg>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+   * 根据SysUserOrg对象当做查询条件进行查询
+   * @param sysUserOrg
+   * @return SysUserOrg
+   */
+    @Override
+    public SysUserOrg findByObject(SysUserOrg sysUserOrg){
+        return baseMapper.findByObject(sysUserOrg);
+    }
+
+    /**
+     * 根据自定义对象查询
+     * @param params
+     * @return
+     */
+    @Override
+    public List<SysUserOrg> getListByMap(Map<String, Object> params) {
+        List<SysUserOrg> sysUserOrg = baseMapper.selectByMap(params);
+        return sysUserOrg;
+    }
+    /**
+        根据用户id ,查询组织
+     */
+    @Override
+    public List<SysOrganization> getListUser(Long userId) {
+        List<SysOrganization> list=new ArrayList<>();
+        Map<String,Object> map=new HashMap<>();
+        map.put("user_id",userId);
+        map.put("is_del",0);
+        map.put("enabled",1);
+        List<SysUserOrg> sysUserOrgs = baseMapper.selectByMap(map);
+        if (!sysUserOrgs.isEmpty()) {
+            //查询组织
+            sysUserOrgs.forEach(e ->{
+                SysOrganization byId = iSysOrganizationService.getById(e.getOrgId());
+                if (byId!=null) {
+                    list.add(byId);
+                }
+            });
+        }
+        return list;
+    }
+}
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 9df44c3..8a1dd0e 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
@@ -1,19 +1,33 @@
 package com.kidgrow.usercenter.service.impl;
 
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 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.DictionariesConstants;
+import com.kidgrow.common.constant.SecurityConstants;
 import com.kidgrow.common.context.ClientContextHolder;
 import com.kidgrow.common.lock.DistributedLock;
+import com.kidgrow.common.model.SysMenu;
+import com.kidgrow.common.model.SysRole;
+import com.kidgrow.common.model.SysUser;
 import com.kidgrow.common.model.*;
 import com.kidgrow.common.service.impl.SuperServiceImpl;
-import com.kidgrow.usercenter.mapper.SysRoleMenuMapper;
-import com.kidgrow.usercenter.mapper.SysUserMapper;
-import com.kidgrow.usercenter.model.SysRoleUser;
-import com.kidgrow.usercenter.model.SysUserExcel;
-import com.kidgrow.usercenter.service.ISysRoleUserService;
-import com.kidgrow.usercenter.service.ISysUserService;
+import com.kidgrow.common.utils.AesUtils;
+import com.kidgrow.common.utils.DateUtils;
+import com.kidgrow.common.utils.Pinyin4jUtil;
+import com.kidgrow.oprationcenter.feign.ProductOrderService;
+import com.kidgrow.redis.util.RedisUtils;
+import com.kidgrow.sms.feign.SmsChuangLanService;
+import com.kidgrow.sms.model.ConstantSMS;
+import com.kidgrow.usercenter.mapper.*;
+import com.kidgrow.usercenter.model.SysDoctor;
+import com.kidgrow.usercenter.model.*;
+import com.kidgrow.usercenter.service.*;
+import com.kidgrow.usercenter.vo.HospitalDoctorListVo;
+import com.kidgrow.usercenter.vo.UserRegVo;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.ObjectUtils;
@@ -26,8 +40,10 @@
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.util.*;
 import java.util.stream.Collectors;
+
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -40,26 +56,52 @@
 @Slf4j
 @Service
 public class SysUserServiceImpl extends SuperServiceImpl<SysUserMapper, SysUser> implements ISysUserService {
-    private final static String LOCK_KEY_USERNAME = CommonConstant.LOCK_KEY_PREFIX+"username:";
-
+    private final static String LOCK_KEY_USERNAME = CommonConstant.LOCK_KEY_PREFIX + "username:";
     @Autowired
     private PasswordEncoder passwordEncoder;
 
     @Resource
     private ISysRoleUserService roleUserService;
-
+    @Resource
+    private ISysDictionariesService sysDictionariesService;
     @Resource
     private SysRoleMenuMapper roleMenuMapper;
 
-
-
+    @Autowired
+    private ISysOrganizationService organizationService;
+    @Autowired
+    private ISysHospitalService hospitalService;
+    @Autowired
+    private ISysDepartmentService departmentService;
+    @Autowired
+    private ISysUserOrgService iSysUserOrgService;
+    @Autowired
+    private RedisUtils redisUtils;
+    @Autowired
+    private SmsChuangLanService smsChuangLanService;
     @Autowired
     private DistributedLock lock;
+    @Autowired
+    private SysDoctorMapper sysDoctorMapper;
+
+    @Autowired
+    private SysRoleMapper sysRoleMapper;
+    @Autowired
+    private SysUserRoleMapper sysUserRoleMapper;
+    @Autowired
+    private SysOrganizationMapper sysOrganizationMapper;
+    @Autowired
+    private ProductOrderService productOrderService;
+
 
     @Override
     public LoginAppUser findByUsername(String username) {
         SysUser sysUser = this.selectByUsername(username);
-        return getLoginAppUser(sysUser);
+        if (sysUser == null) {
+            return null;
+        } else {
+            return getLoginAppUser(sysUser);
+        }
     }
 
     @Override
@@ -74,12 +116,25 @@
         return getLoginAppUser(sysUser);
     }
 
+    /**
+     * 获取登录用户的一系列信息 hrj 06-04修改
+     *
+     * @param sysUserNew
+     * @return
+     */
     @Override
-    public LoginAppUser getLoginAppUser(SysUser sysUser) {
+    public LoginAppUser getLoginAppUser(SysUser sysUserNew) {
+        LoginAppUser loginAppUser = new LoginAppUser();
+        SysUser sysUser = this.baseMapper.selectById(sysUserNew);
         if (sysUser != null) {
-            LoginAppUser loginAppUser = new LoginAppUser();
             BeanUtils.copyProperties(sysUser, loginAppUser);
-
+            //获取用户所属组织机构列表
+            loginAppUser.setDefaultAuth(sysUser.getDefaultAuth());
+            List<SysOrganization> sysOrganizations = organizationService.findListByUserId(sysUser.getId());
+            //设置组织机构集合
+            if (sysOrganizations != null) {
+                loginAppUser.setOrganizations(sysOrganizations);
+            }
             List<SysRole> sysRoles = roleUserService.findRolesByUserId(sysUser.getId());
             // 设置角色
             loginAppUser.setRoles(sysRoles);
@@ -95,14 +150,21 @@
                 }
             }
 
-            return loginAppUser;
+            //医院信息
+            DoctorUserAll doctorUserAllVo = baseMapper.findDoctorUserAllData(sysUser.getId());
+            if (doctorUserAllVo != null) {
+                loginAppUser.setDoctorUserAllVO(doctorUserAllVo);
+                //是否医院管理员
+                loginAppUser.setHAdminUser(doctorUserAllVo.getIsAdminUser());
+            }
         }
-        return null;
+        return loginAppUser;
     }
 
 
     /**
      * 根据用户名查询用户
+     *
      * @param username
      * @return
      */
@@ -110,13 +172,15 @@
     public SysUser selectByUsername(String username) {
         String clientId = ClientContextHolder.getClient();
         List<SysUser> users = baseMapper.selectList(
-                new QueryWrapper<SysUser>().eq("username", username).eq("tenant_id",clientId)
+                //new QueryWrapper<SysUser>().eq("username", username).eq("tenant_id", clientId)
+                new QueryWrapper<SysUser>().eq("username", username)
         );
         return getUser(users);
     }
 
     /**
      * 根据手机号查询用户
+     *
      * @param mobile
      * @return
      */
@@ -130,6 +194,7 @@
 
     /**
      * 根据openId查询用户
+     *
      * @param openId
      * @return
      */
@@ -168,23 +233,92 @@
         }
     }
 
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     @Override
-    public ResultBody updatePassword(Long id, String oldPassword, String newPassword) {
+    public ResultBody updatePassword(Long id, String oldPassword, String newPassword, Boolean isdefault) throws Exception {
+
         SysUser sysUser = baseMapper.selectById(id);
         if (StrUtil.isNotBlank(oldPassword)) {
+            oldPassword = AesUtils.desEncrypt(oldPassword).trim();
             if (!passwordEncoder.matches(oldPassword, sysUser.getPassword())) {
-                return ResultBody.failed("旧密码错误");
+                return ResultBody.failed("旧密码错误!");
             }
         }
         if (StrUtil.isBlank(newPassword)) {
-            newPassword = CommonConstant.DEF_USER_PASSWORD;
+            newPassword = com.kidgrow.common.utils.RandomValueUtils.getRandom(6);
+        } else {
+            newPassword = AesUtils.desEncrypt(newPassword).trim();
         }
         SysUser user = new SysUser();
         user.setId(id);
         user.setPassword(passwordEncoder.encode(newPassword));
+        if (isdefault) {
+            user.setDefaultAuth(true);
+        } else {
+            user.setDefaultAuth(false);
+        }
         baseMapper.updateById(user);
-        return ResultBody.ok().msg("修改成功");
+        if (isdefault) {
+            return ResultBody.ok().msg("密码重置成功!").data(newPassword);
+        } else {
+            return ResultBody.ok().msg("密码修改成功!").data(true);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public ResultBody updateUserTel(Map<String, Object> params) throws Exception {
+        Long id = MapUtils.getLong(params, "id");
+        String oldTel = MapUtils.getString(params, "oldTel");
+        String newTel = AesUtils.desEncrypt(MapUtils.getString(params, "newTel")).trim();
+        String authCode = AesUtils.desEncrypt(MapUtils.getString(params, "authCode")).trim();
+        String userPassword =MapUtils.getString(params, "userPassword");
+
+        if (id > 0 && StringUtils.isNotBlank(oldTel) && StringUtils.isNotBlank(newTel) && StringUtils.isNotBlank(authCode) && StringUtils.isNotBlank(userPassword)) {
+            //检查验证码
+            if (CheckVerificationCode(ConstantSMS.PHONE_SMS, newTel, authCode)) {
+                //查询手机号是否已经存在
+                Map<String, Object> selectMap = new HashMap<>();
+                selectMap.put("mobile", newTel);
+                List<SysUser> sysUsersList = baseMapper.selectByMap(selectMap);
+                if (sysUsersList.size() > 0) {
+                    return ResultBody.failed("该手机号已经存在!");
+                } else {
+                    //验证旧手机号和密码
+                    SysUser sysUser = baseMapper.selectById(id);
+                    userPassword = AesUtils.desEncrypt(userPassword);
+                    if (passwordEncoder.matches(userPassword, sysUser.getPassword()) && sysUser.getMobile().equals((oldTel))) {
+                        //验证通过,修改手机号
+                        SysUser user = new SysUser();
+                        user.setId(id);
+                        user.setMobile(newTel);
+                        user.setUsername(newTel);
+                        //修改doctor表
+                        com.kidgrow.usercenter.model.SysDoctor sysDoctorModel = findDoctorByUserId(user.getId());
+                        com.kidgrow.usercenter.model.SysDoctor newsysDoctorModel = new com.kidgrow.usercenter.model.SysDoctor();
+                        if (sysDoctorModel != null) {
+                            //理论上只有一个,如果有多个 只取第一个
+                            sysDoctorModel.setId(sysDoctorModel.getId());
+                            sysDoctorModel.setDoctorTel(newTel);
+                            sysDoctorMapper.updateById(newsysDoctorModel);
+                        }
+                        if (baseMapper.updateById(user) > 0) {
+                            //将Redis清除
+                            redisUtils.hdel(ConstantSMS.PHONE_SMS, newTel);
+                            return ResultBody.ok().msg("手机号修改成功!");
+                        } else {
+                            return ResultBody.failed("手机号修改失败!");
+                        }
+                    } else {
+                        return ResultBody.failed("用户信息验证失败,请提供正确的手机号和密码!");
+                    }
+                }
+            } else {
+                return ResultBody.failed("无效的验证码");
+            }
+        } else {
+            return ResultBody.failed("必须参数有误!");
+        }
     }
 
     @Override
@@ -196,6 +330,9 @@
             List<Long> userIds = list.stream().map(SysUser::getId).collect(Collectors.toList());
 
             List<SysRole> sysRoles = roleUserService.findRolesByUserIds(userIds);
+
+//            Map<String, Object> map = new HashMap<String, Object>();
+//            List<SysOrganization> sysOrganizationList=organizationService.fin();
             list.forEach(u -> u.setRoles(sysRoles.stream().filter(r -> !ObjectUtils.notEqual(u.getId(), r.getUserId()))
                     .collect(Collectors.toList())));
         }
@@ -228,17 +365,18 @@
     @Transactional(rollbackFor = Exception.class)
     @Override
     public ResultBody saveOrUpdateUser(SysUser sysUser) {
+        String defaultPassWord = com.kidgrow.common.utils.RandomValueUtils.getRandom(6);
         if (sysUser.getId() == null) {
             if (StringUtils.isBlank(sysUser.getType())) {
                 sysUser.setType(UserType.BACKEND.name());
             }
-            sysUser.setPassword(passwordEncoder.encode(CommonConstant.DEF_USER_PASSWORD));
+            sysUser.setPassword(passwordEncoder.encode(defaultPassWord));
             sysUser.setEnabled(Boolean.TRUE);
         }
         String username = sysUser.getUsername();
         boolean result = super.saveOrUpdateIdempotency(sysUser, lock
-                , LOCK_KEY_USERNAME+username, new QueryWrapper<SysUser>().eq("username", username)
-                , username+"已存在");
+                , LOCK_KEY_USERNAME + username, new QueryWrapper<SysUser>().eq("username", username)
+                , username + "已存在");
 //        boolean result=true;
         //更新角色
         if (result && StrUtil.isNotEmpty(sysUser.getRoleId())) {
@@ -250,13 +388,28 @@
                 roleUserService.saveBatch(roleUsers);
             }
         }
+        sysUser.setPassword(defaultPassWord);
         return result ? ResultBody.ok().data(sysUser).msg("操作成功") : ResultBody.failed("操作失败");
     }
 
+    /**
+     * 删除用户
+     *
+     * @param id
+     * @return
+     */
     @Transactional(rollbackFor = Exception.class)
     @Override
     public boolean delUser(Long id) {
+        //删除角色数据
         roleUserService.deleteUserRole(id, null);
+        //删除组织对应数据
+        organizationService.deleteByUserId(id);
+        //删除医生数据
+        Map<String, Object> params = new HashMap<>();
+        params.put("user_id", id);
+        sysDoctorMapper.deleteByMap(params);
+        //删除用户数据
         return baseMapper.deleteById(id) > 0;
     }
 
@@ -272,4 +425,698 @@
         }
         return sysUserExcels;
     }
+
+    @Override
+    public ResultBody findAll(Map<String, Object> map) {
+        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.stream().distinct().collect(Collectors.toList()));
+                    sysUsers = baseMapper.selectList(sysUserQueryWrapper);
+                }
+            }
+        } else {
+            return ResultBody.failed("暂无数据");
+        }
+        return ResultBody.ok().data(sysUsers);
+    }
+
+    @Override
+    public ResultBody findCountByMap(Map<String, Object> map) {
+        map.put("enable", 1);
+        map.put("isDel", 0);
+        Integer integer = baseMapper.selectCountByMap(map);
+        return ResultBody.ok().data(integer);
+    }
+
+    /**
+     * 验证手机验证码
+     *
+     * @param constantSMS
+     * @param phone
+     * @param inputCode
+     * @return
+     */
+    public boolean CheckVerificationCode(String constantSMS, String phone, String inputCode) {
+        //获取缓存中的验证码对象
+        Object hget = redisUtils.hget(constantSMS, phone);
+        if (hget != null) {
+            //序列化验证码
+            JSONObject redisJson = JSON.parseObject(JSON.toJSONString(hget));
+            //拿取验证码
+            String verificationCodeObject = redisJson.get("verificationCode").toString();
+            //核对验证码
+            if (inputCode.equals(verificationCodeObject)) {
+                Object date = redisJson.get("endTime");
+                long time = DateUtils.parseDate(date.toString()).getTime();
+                Date dateNow = new Date();
+                long timeNow = dateNow.getTime();
+                return (timeNow <= time);
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 通过手机号  修改密码
+     *
+     * @param map
+     * @return
+     */
+    @Override
+    public ResultBody passwordByPhone(Map<String, Object> map) throws Exception {
+        //手机号,type,验证码,新密码
+        String phone = MapUtils.getString(map, "phone");
+        if (phone == null || "".equals(phone.trim())) {
+            return ResultBody.failed("请输入手机号");
+        }
+        String verificationCode = MapUtils.getString(map, "verificationCode");
+        if (verificationCode == null || "".equals(verificationCode.trim())) {
+            return ResultBody.failed("请输入验证码");
+        }
+        String newPass = MapUtils.getString(map, "newPass");
+        if (newPass == null || "".equals(newPass.trim())) {
+            return ResultBody.failed("请输入正确的密码");
+        }
+        phone = AesUtils.desEncrypt(phone.trim());
+        verificationCode = AesUtils.desEncrypt(verificationCode.trim());
+        newPass = AesUtils.desEncrypt(newPass.trim());
+        if (CheckVerificationCode(ConstantSMS.PASSWORD_SMS, phone, verificationCode)) {
+            //查询表
+            Map<String, Object> selectMap = new HashMap<>();
+            selectMap.put("mobile", phone);
+            List<SysUser> sysUsers = baseMapper.selectByMap(selectMap);
+            if (sysUsers.size() > 0) {
+                SysUser user = new SysUser();
+                user.setId(sysUsers.get(0).getId());
+                user.setPassword(passwordEncoder.encode(newPass));
+                baseMapper.updateById(user);
+                //将Redis  清除
+                redisUtils.hdel(ConstantSMS.PASSWORD_SMS, phone);
+                return ResultBody.ok();
+            } else {
+                return ResultBody.failed("暂无该手机号信息");
+            }
+        } else {
+            return ResultBody.failed("无效的验证码");
+        }
+    }
+
+    /**
+     * 通过手机号 注册验证
+     *
+     * @param map
+     * @return
+     */
+    @Override
+    public ResultBody registerByPhone(Map<String, Object> map) {
+        //手机号,type,验证码,新密码
+        String phone = MapUtils.getString(map, "phone");
+        if (phone == null || "".equals(phone.trim())) {
+            return ResultBody.failed("请输入手机号");
+        }
+        if (phoneIsUsed(phone)) {
+            return ResultBody.failed("该手机号已经注册");
+        }
+
+        Map<String, Object> mapDto = new HashMap();
+        mapDto.put("phone", phone);
+        mapDto.put("type", ConstantSMS.REGISTER_SMS);
+        return smsChuangLanService.sendVerificationCode(mapDto);
+    }
+
+    /**
+     * 通过手机号修改 手机号
+     *
+     * @param map
+     * @return
+     */
+    @Override
+    public ResultBody updatePhone(Map<String, Object> map, SysUser sysUser) {
+        String password = MapUtils.getString(map, "password");
+        if (StringUtils.isBlank(password)) {
+            return ResultBody.failed("请输入密码");
+        }
+        String phone = MapUtils.getString(map, "phone");
+        if (StringUtils.isBlank(phone)) {
+            return ResultBody.failed("请输入新手机号");
+        }
+        if (!sysUser.getMobile().equals(password)) {
+            return ResultBody.failed("请输入原手机号");
+        }
+        String verificationCode = MapUtils.getString(map, "verificationCode");
+        if (StringUtils.isBlank(verificationCode)) {
+            return ResultBody.failed("请输入验证码");
+        }
+        if (!passwordEncoder.matches(sysUser.getPassword(), password)) {
+            return ResultBody.failed("密码错误");
+        }
+        Object hget = redisUtils.hget(ConstantSMS.PHONE_SMS, map.get("phone").toString());
+        if (hget != null) {
+            JSONObject redisJson = JSON.parseObject(JSON.toJSONString(hget));
+            Object verificationCodeObject = redisJson.get("verificationCode");
+            if (verificationCode.equals(verificationCodeObject)) {
+                Object date = redisJson.get("endTime");
+                long time = DateUtils.parseDate(date.toString()).getTime();
+                Date dateNow = new Date();
+                long timeNow = dateNow.getTime();
+                if (timeNow <= time) {
+                    //查询表
+                    Map<String, Object> selectMap = new HashMap<>();
+                    selectMap.put("mobile", phone);
+                    List<SysUser> sysUsers = baseMapper.selectByMap(selectMap);
+                    if (sysUsers.size() > 0) {
+                        return ResultBody.failed("该手机号已经注册");
+                    } else {
+                        SysUser user = new SysUser();
+                        user.setId(sysUser.getId());
+                        user.setMobile(phone);
+                        baseMapper.updateById(user);
+                        //将Redis  清除
+                        redisUtils.hdel(ConstantSMS.PHONE_SMS, phone);
+                        return ResultBody.ok();
+                    }
+                } else {
+                    return ResultBody.failed("验证码超时");
+                }
+            } else {
+                return ResultBody.failed("验证码错误");
+            }
+        } else {
+            return ResultBody.failed("该手机号没有验证码");
+        }
+    }
+
+    @Override
+    public ResultBody findAppointUsers(Integer type) {
+        List<SysUser> list = baseMapper.findAppointUsers(type);
+        return ResultBody.ok().data(list);
+    }
+
+    /**
+     * 根据userid获取用户其它信息
+     *
+     * @param userId
+     * @return
+     */
+    @Override
+    public ResultBody findDoctorUserAllData(Long userId) {
+        if (userId > 0) {
+            return ResultBody.ok().data(baseMapper.findDoctorUserAllData(userId));
+        }
+        return ResultBody.ok().data(null);
+    }
+
+    /**
+     * H端用户注册  管理员添加用户
+     *
+     * @param userRegVo
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public ResultBody doctorUserReg(UserRegVo userRegVo, SysUser sysUserd) throws Exception {
+        if (sysUserd.getId() == null) {
+            sysUserd = this.baseMapper.selectById(userRegVo.getUserId());
+        }
+        userRegVo.setPassword(AesUtils.desEncrypt(userRegVo.getPassword()).trim());
+        userRegVo.setUsername(AesUtils.desEncrypt(userRegVo.getUsername()).trim());
+        //检查手机号是否已经注册 H端登录名和手机号存一样的值
+        if (phoneIsUsed(userRegVo.getMobile())) {
+            return ResultBody.failed("该手机号已经注册");
+        }
+        //创建人id
+        Long createUserId = CommonConstant.CREATE_USER_ID;
+        //创建人名称
+        String createUserName = CommonConstant.CREATE_USER_NAME;
+        //销售服务人员
+        SysUser sysUserSale = baseMapper.selectById(CommonConstant.SALE_USER_ID);
+        //运营服务人员
+        SysUser sysUserOpration = baseMapper.selectById(CommonConstant.OPRATION_USER_ID);
+        //是否注册用户
+        Boolean isReg = false;
+        //业务成功
+        Boolean isSuccess = true;
+        //业务失败提示信息
+        String expMsg = "";
+        //系统内置的注册医院和科室的组织数据
+        Long organizationHos = 0L;
+        Long organizationDep = 0L;
+        //检查判断是注册 还是添加用户,注册用户先走基本数据建设 医院/科室
+        SysUserOrg sysUserOrgH = new SysUserOrg();
+        SysUserOrg sysUserOrgD = new SysUserOrg();
+        SysDictionaries sysDictionaries = new SysDictionaries();
+        SysDoctor sysDoctor = new SysDoctor();
+        if (userRegVo.getHospitalId() == null) {
+            isReg = true;
+            if (CheckVerificationCode(ConstantSMS.REGISTER_SMS, userRegVo.getMobile(), userRegVo.getVerification())) {
+                userRegVo.setDoctorState(true);
+                //写医院组织数据
+                SysOrganization sysOrganizationH = new SysOrganization();
+                sysOrganizationH.setOrgLevel(1);
+                sysOrganizationH.setOrgAttr(1);
+                sysOrganizationH.setOrgParentId(CommonConstant.ORG_PARENT_ID);
+                sysOrganizationH.setOrgName(userRegVo.getHospitalName());
+                sysOrganizationH.setCreateUserId(createUserId);
+                sysOrganizationH.setCreateUserName(createUserName);
+                if (organizationService.save(sysOrganizationH)) {
+                    //写科室组织数据
+                    SysOrganization sysOrganizationD = new SysOrganization();
+                    sysOrganizationD.setOrgLevel(2);
+                    sysOrganizationD.setOrgAttr(2);
+                    sysOrganizationD.setOrgParentId(sysOrganizationH.getId());
+                    sysOrganizationD.setOrgName(userRegVo.getDepartmentName());
+                    sysOrganizationD.setCreateUserId(createUserId);
+                    sysOrganizationD.setCreateUserName(createUserName);
+                    if (organizationService.save(sysOrganizationD)) {
+                        //写医院组织数据
+                        SysHospital sysHospital = new SysHospital();
+                        sysHospital.setHospitalName(userRegVo.getHospitalName());
+                        sysHospital.setOrgId(sysOrganizationH.getId());
+                        //注册的用户所在医院默认是试用状态
+                        sysHospital.setHospitalState(0);
+                        sysHospital.setCreateUserId(createUserId);
+                        sysHospital.setCreateUserName(createUserName);
+                        if (hospitalService.save(sysHospital)) {
+                            userRegVo.setHospitalId(sysHospital.getId());
+                            //保存科室数据
+                            SysDepartment sysDepartment = new SysDepartment();
+                            sysDepartment.setOrgId(sysOrganizationD.getId());
+                            sysDepartment.setDepartmentName(userRegVo.getDepartmentName());
+                            sysDepartment.setSaleUserId(sysUserSale.getId());
+                            sysDepartment.setAccountsCount(1);
+                            sysDepartment.setSaleUserName(sysUserSale.getNickname());
+                            sysDepartment.setSaleUserTel(sysUserSale.getMobile());
+                            sysDepartment.setServerUserId(sysUserOpration.getId());
+                            sysDepartment.setServerUserTel(sysUserOpration.getMobile());
+                            sysDepartment.setServerUserName(sysUserOpration.getNickname());
+                            sysDepartment.setCreateUserId(createUserId);
+                            sysDepartment.setCreateUserName(createUserName);
+                            if (departmentService.save(sysDepartment)) {
+                                userRegVo.setDepartmentId(sysDepartment.getId());
+                                //自动充入系统指定的试用套餐
+                                if (!saveProductDetail(sysHospital.getId(),
+                                        sysDepartment.getId(),
+                                        sysHospital.getHospitalName(),
+                                        sysDepartment.getDepartmentName())) {
+                                    isSuccess = false;
+                                    expMsg = "试用套餐充值失败";
+                                }
+                            } else {
+                                isSuccess = false;
+                                expMsg = "科室数据写入失败";
+                            }
+                        } else {
+                            isSuccess = false;
+                            expMsg = "医院数据写入失败";
+                        }
+                    } else {
+                        isSuccess = false;
+                        expMsg = "科室组织数据写入失败";
+                    }
+                } else {
+                    isSuccess = false;
+                    expMsg = "医院组织数据写入失败";
+                }
+            } else {
+                return ResultBody.failed("无效的验证码");
+            }
+        }
+
+        //业务执行中途出错
+        if (isReg && !isSuccess) {
+            //注册过程失败
+            return ResultBody.failed(expMsg);
+        }
+        if (!isReg && departmetAccountsCount(userRegVo.getDepartmentId()) < 1) {
+            return ResultBody.failed("当前科室可创建账户数量已满");
+        }
+        //添加用户数据  如果没有输入密码,将会创建一个默认密码返回
+        String defaultPassWord = "";
+        SysUser sysUser = new SysUser();
+        sysUser.setUsername(userRegVo.getMobile());
+        sysUser.setMobile(userRegVo.getMobile());
+        if (StringUtils.isBlank(userRegVo.getPassword())) {
+            defaultPassWord = com.kidgrow.common.utils.RandomValueUtils.getRandom(6);
+            sysUser.setPassword(passwordEncoder.encode(defaultPassWord));
+            userRegVo.setPassword(defaultPassWord);
+        } else {
+            sysUser.setPassword(passwordEncoder.encode(userRegVo.getPassword()));
+        }
+        sysUser.setNickname(userRegVo.getNickname());
+        sysUser.setSex(userRegVo.getSex());
+        sysUser.setEnabled(true);
+        if (StringUtils.isNotBlank(userRegVo.getType())) {
+            sysUser.setType(userRegVo.getType());
+        } else {
+            sysUser.setType(UserType.DOCTOR.name());
+        }
+        sysUser.setHAdminUser(false);
+        sysUser.setDefaultAuth(false);
+        sysUser.setOpenId(userRegVo.getOpenId());
+        sysUser.setDel(false);
+        sysUser.setTenantId(CommonConstant.H_TENANT);
+        boolean u = this.save(sysUser);
+        SysRoleUser sysRoleUser = new SysRoleUser();
+        if (u) {
+            //保存角色用户绑定信息  sys_role_user
+            Map<String, Object> map = new HashMap<>();
+            map.put("code", CommonConstant.HOSPITAL_DOCTOR_CODE);
+            map.put("enabled", 1);
+            map.put("is_del", 0);
+            List<SysRole> sysRoles = sysRoleMapper.selectByMap(map);
+            if (sysRoles.size() > 0) {
+                //保存角色和用户绑定关系数据
+                SysRole sysRole = sysRoles.get(0);
+                sysRoleUser.setRoleId(sysRole.getId());
+                sysRoleUser.setUserId(sysUser.getId());
+                int insert = sysUserRoleMapper.insert(sysRoleUser);
+                if (insert > 0) {
+                    //写入职务数据
+                    if (StringUtils.isNotBlank(userRegVo.getDoctorRank())) {
+                        //检查医生职务是否存在
+                        Map<String, Object> selectMap = new HashMap<>();
+                        selectMap.put("dictionariesNameAll", userRegVo.getDoctorRank().trim());
+                        List<SysDictionaries> dictionariesList = sysDictionariesService.findAll(selectMap);
+                        boolean dicBool = false;
+                        if (dictionariesList.size() > 0) {
+                            for (int i = dictionariesList.size() - 1; i >= 0; i--) {
+                                if (dictionariesList.get(i).getDictionariesName().trim().equals(userRegVo.getDoctorRank().trim())) {
+                                    userRegVo.setDoctorRankId(dictionariesList.get(i).getId());
+                                    dicBool = true;
+                                    break;
+                                }
+                            }
+                        }
+                        else {
+                            //创建字典数据
+                            sysDictionaries.setDictionariesClassId(DictionariesConstants.DOCTOR_RANK);
+                            //将名称汉字转为拼音
+                            String keyStr=Pinyin4jUtil.makeStringByStringSet(Pinyin4jUtil.getPinyin(userRegVo.getDoctorRank(), true));
+                            if (keyStr.length()>50) {
+                                keyStr=keyStr.substring(0,49);
+                            }
+                            sysDictionaries.setDictionariesKey(keyStr);
+                            sysDictionaries.setDictionariesName(userRegVo.getDoctorRank());
+                            sysDictionaries.setCreateUserId(createUserId);
+                            sysDictionaries.setCreateUserName(createUserName);
+                            dicBool = sysDictionariesService.save(sysDictionaries);
+                            if (dicBool) {
+                                userRegVo.setDoctorRankId(sysDictionaries.getId());
+                            }
+                        }
+
+                        if (dicBool) {
+                            //写用户组织关系表
+                            List<SysUserOrg> sysUserOrgList = new ArrayList<SysUserOrg>();
+                            sysUserOrgH.setUserId(sysUser.getId());
+                            sysUserOrgH.setOrgId(organizationHos);
+                            sysUserOrgH.setFromLevel(CommonConstant.SYSTEM_ORG_HOS_LEVEL);
+                            sysUserOrgH.setFromId(userRegVo.getHospitalId());
+                            sysUserOrgH.setCreateUserId(isReg ? createUserId : sysUserd.getId());
+                            sysUserOrgH.setCreateUserName(isReg ? createUserName : sysUserd.getUsername());
+                            sysUserOrgList.add(sysUserOrgH);
+
+                            sysUserOrgD.setUserId(sysUser.getId());
+                            sysUserOrgD.setOrgId(organizationDep);
+                            sysUserOrgD.setFromId(userRegVo.getDepartmentId());
+                            sysUserOrgD.setFromLevel(CommonConstant.SYSTEM_ORG_DEP_LEVEL);
+                            sysUserOrgD.setCreateUserId(isReg ? createUserId : sysUserd.getId());
+                            sysUserOrgD.setCreateUserName(isReg ? createUserName : sysUserd.getUsername());
+                            sysUserOrgList.add(sysUserOrgD);
+                            boolean uOrg = iSysUserOrgService.saveBatch(sysUserOrgList);
+                            if (uOrg) {
+                                //写入医生数据
+                                sysDoctor.setUserId(sysUser.getId());
+                                sysDoctor.setHospitalId(userRegVo.getHospitalId());
+                                sysDoctor.setHospitalName(userRegVo.getHospitalName());
+                                sysDoctor.setDepartmentId(userRegVo.getDepartmentId());
+                                sysDoctor.setDepartmentName(userRegVo.getDepartmentName());
+                                sysDoctor.setDoctorRank(userRegVo.getDoctorRank());
+                                sysDoctor.setDoctorRankId(userRegVo.getDoctorRankId());
+                                sysDoctor.setDoctorType(CommonConstant.H_DOCTOR_TYPE);
+                                sysDoctor.setCreateUserId(isReg ? createUserId : sysUserd.getId());
+                                sysDoctor.setCreateUserName(isReg ? createUserName : sysUserd.getUsername());
+                                sysDoctor.setDoctorState(!isReg);
+                                sysDoctor.setDoctorTel(userRegVo.getMobile());
+                                sysDoctor.setDoctorName(userRegVo.getNickname());
+                                sysDoctor.setServerUserId(isReg ? sysUserSale.getId() : sysUserd.getId());
+                                sysDoctor.setServerUserName(isReg ? sysUserSale.getNickname() : sysUserd.getUsername());
+                                sysDoctor.setIsAdminUser(false);
+                                sysDoctor.setDoctorCcie(userRegVo.getDoctorCcie());
+                                sysDoctor.setEnabled(true);
+                                if (sysDoctorMapper.insert(sysDoctor) == 1) {
+                                    //非自主注册的 返回信息带密码
+                                    if (!isReg) {
+                                        sysUser.setPassword(userRegVo.getPassword());
+                                    } else {
+                                        sysUser.setPassword("");
+                                    }
+                                } else {
+                                    isSuccess = false;
+                                    expMsg = "医生数据写入失败";
+                                }
+                            } else {
+                                isSuccess = false;
+                                expMsg = "用户组织数据写入失败";
+                            }
+                        } else {
+                            isSuccess = false;
+                            expMsg = "职称数据写入失败";
+                        }
+                    } else {
+                        //没有职务数据
+                        isSuccess = false;
+                        expMsg = "没有职称数据";
+                    }
+                } else {
+                    isSuccess = false;
+                    expMsg = "角色绑定数据写入失败";
+                }
+            } else {
+                isSuccess = false;
+                expMsg = "对应角色没有数据";
+            }
+        } else {
+            isSuccess = false;
+            expMsg = "用户数据写入失败";
+        }
+        /***返回数据***/
+        if (!isSuccess) {
+            return ResultBody.failed(expMsg);
+        } else {
+            return ResultBody.ok().data(sysUser);
+        }
+    }
+
+    /**
+     * feign客户端调用写入试用套餐
+     *
+     * @param hospitalId
+     * @param departmentId
+     * @param hospitalName
+     * @param departmentName
+     * @return
+     */
+    private boolean saveProductDetail(Long hospitalId, Long departmentId, String hospitalName, String departmentName) {
+        Map<String, Object> params = new HashMap<String, Object>();
+        params.put("hospitalId", hospitalId);
+        params.put("departmentId", departmentId);
+        params.put("hospitalName", hospitalName);
+        params.put("departmentName", departmentName);
+        ResultBody resultBody = productOrderService.saveProductDetail(params);
+        return (boolean) resultBody.getData();
+    }
+
+    /**
+     * 获取医院科室下的所有H端有效的医生
+     *
+     * @param hospitalId
+     * @param departmentId
+     * @return
+     */
+    @Override
+    public ResultBody hospitalDoctorList(Long hospitalId, Long departmentId, Boolean isIncluddel) {
+        if (hospitalId > 0 && departmentId > 0) {
+            List<HospitalDoctorListVo> listVoList;
+            if (isIncluddel) {
+                listVoList = baseMapper.hospitalDoctorListAndDel(hospitalId, departmentId, CommonConstant.HOSPITAL_DOCTOR_ID, CommonConstant.HOSPITAL_ADMIN_ID);
+            } else {
+                listVoList = baseMapper.hospitalDoctorList(hospitalId, departmentId, CommonConstant.HOSPITAL_DOCTOR_ID, CommonConstant.HOSPITAL_ADMIN_ID);
+            }
+            listVoList.sort((e1,e2)->
+                e2.getUserId().compareTo(e1.getUserId())
+            );
+            return ResultBody.ok().data(listVoList);
+        } else {
+            return ResultBody.failed("医院数据有误");
+        }
+    }
+
+    /**
+     * 检查手机号是否已经注册 true存在  false不存在
+     *
+     * @param phone
+     * @return
+     */
+    public boolean phoneIsUsed(String phone) {
+        Map<String, Object> selectMap = new HashMap<>();
+        selectMap.put("mobile", phone);
+        selectMap.put("is_del", 0);
+        selectMap.put("tenant_id", "hospital");
+        List<SysUser> sysUsers = baseMapper.selectByMap(selectMap);
+        return (sysUsers.size() > 0);
+    }
+
+    /**
+     * 检查科室有效剩余账户数量
+     *
+     * @param depatmentId
+     * @return
+     */
+    public Integer departmetAccountsCount(Long depatmentId) {
+        SysDepartment sysDepartment = departmentService.getById(depatmentId);
+        if (sysDepartment == null) {
+            return 0;
+        } else {
+            Long sysHospitalId = HospitalIdByDepartmentId(depatmentId);
+            if (sysHospitalId > 0) {
+                List<HospitalDoctorListVo> hospitalDoctorListVos = baseMapper.hospitalDoctorList(sysHospitalId, depatmentId, CommonConstant.HOSPITAL_DOCTOR_ID, CommonConstant.HOSPITAL_ADMIN_ID);
+                if (hospitalDoctorListVos != null) {
+                    int doctorCount = hospitalDoctorListVos.size();
+                    int accountCount = sysDepartment.getAccountsCount().intValue();
+                    int liveCount = accountCount - doctorCount;
+                    return liveCount;
+                } else {
+                    return 0;
+                }
+            } else {
+                return 0;
+            }
+        }
+    }
+
+    /**
+     * 根据部门的id获取所属医院id
+     *
+     * @return
+     */
+    public Long HospitalIdByDepartmentId(Long departmentId) {
+        Long hospitalId = -1L;
+        SysDepartment sysDepartment = departmentService.getById(departmentId);
+        if (sysDepartment != null) {
+            //先获取科室的组织数据
+            SysOrganization sysOrganization = sysOrganizationMapper.selectById(sysDepartment.getOrgId());
+            if (sysOrganization != null) {
+                //获取上级组织id
+                sysOrganization = sysOrganizationMapper.selectById(sysOrganization.getOrgParentId());
+                if (sysOrganization != null) {
+                    //根据组织id获取上级医院id
+                    Map<String, Object> selectMap = new HashMap<>();
+                    selectMap.put("org_id", sysOrganization.getId());
+                    List<SysHospital> sysHospitalList = hospitalService.listByMap(selectMap);
+                    if (sysHospitalList != null && sysHospitalList.size() > 0) {
+                        //取第一个
+                        hospitalId = sysHospitalList.get(0).getId();
+                    }
+                }
+            }
+        }
+        return hospitalId;
+    }
+
+    /**
+     * 检查用户登录名是否已经注册 true存在  false不存在
+     *
+     * @param userName
+     * @return
+     */
+    private boolean userNameIsUsed(String userName) {
+        Map<String, Object> selectMap = new HashMap<>();
+        selectMap.put("username", userName);
+        List<SysUser> sysUsers = baseMapper.selectByMap(selectMap);
+        return (sysUsers.size() > 0);
+    }
+
+    public com.kidgrow.usercenter.model.SysDoctor findDoctorByUserId(Long userId) {
+        Map<String, Object> doctorMap = new HashMap<>();
+        doctorMap.put("user_id", userId);
+        doctorMap.put("enabled", 1);
+        doctorMap.put("is_del", 0);
+        List<com.kidgrow.usercenter.model.SysDoctor> sysDoctorList = sysDoctorMapper.selectByMap(doctorMap);
+        if (sysDoctorList.size() > 0) {
+            return sysDoctorList.get(0);
+        }
+        return new com.kidgrow.usercenter.model.SysDoctor();
+    }
+
+    /**
+     * 检查手机号是注册用户还是正式用户
+     *
+     * @param userTel
+     * @return
+     */
+    public ResultBody isRegUser(String userTel) {
+        if (StringUtils.isNotBlank(userTel)) {
+            List<SysUser> users = baseMapper.selectList(
+                    new QueryWrapper<SysUser>().eq("username", userTel)
+            );
+            if (users != null && users.size() == 1) {
+                SysUser sysUser = users.get(0);
+                if (sysUser.getCreateUserId() == CommonConstant.CREATE_USER_ID && sysUser.getCreateUserName().equals(CommonConstant.CREATE_USER_NAME)) {
+                    return ResultBody.ok().data(true);
+                }
+                return ResultBody.ok().data(false);
+            } else {
+                return ResultBody.failed("用户数据有误!");
+            }
+        } else {
+            return ResultBody.failed("必要参数有误!");
+        }
+    }
+
+    @Override
+    public ResultBody jiaMipython(String password) {
+        String encode = passwordEncoder.encode(password);
+        return ResultBody.ok().data(encode);
+    }
+
+    @Override
+    public boolean deleteNoContact(Long id) {
+        //删除医生数据
+        QueryWrapper<SysDoctor> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", id);
+        List<SysDoctor> sysDoctors = sysDoctorMapper.selectList(queryWrapper);
+        if (!sysDoctors.isEmpty()) {
+            sysDoctors.forEach(e -> {
+                e.setIsDel(true);
+                sysDoctorMapper.updateById(e);
+            });
+        }
+        //删除用户数据
+        return baseMapper.deleteById(id) > 0;
+    }
 }
\ 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
new file mode 100644
index 0000000..b9271bd
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysAreaMapper.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--省市区数据表-->
+<mapper namespace="com.kidgrow.usercenter.mapper.SysAreaMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.areaName != null and p.areaName !=''">
+                and area_name = #{p.areaName}
+            </if>
+            <if test="p.areaParentId != null and p.areaParentId !=''">
+                and area_parent_id = #{p.areaParentId}
+            </if>
+            <if test="p.areaShortname != null and p.areaShortname !=''">
+                and area_shortname = #{p.areaShortname}
+            </if>
+            <if test="p.areaLeveltype != null and p.areaLeveltype !=''">
+                and area_leveltype = #{p.areaLeveltype}
+            </if>
+            <if test="p.areaCitycode != null and p.areaCitycode !=''">
+                and area_citycode = #{p.areaCitycode}
+            </if>
+            <if test="p.areaZipcode != null and p.areaZipcode !=''">
+                and area_zipcode = #{p.areaZipcode}
+            </if>
+            <if test="p.areaLng != null and p.areaLng !=''">
+                and area_lng = #{p.areaLng}
+            </if>
+            <if test="p.areaLat != null and p.areaLat !=''">
+                and area_Lat = #{p.areaLat}
+            </if>
+            <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>
+
+    <!--定义根据-SysArea当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.usercenter.model.SysArea">
+        select
+        <include refid="Column_List"/>
+        from sys_area
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-SysArea当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.usercenter.model.SysArea">
+        select
+        <include refid="Column_List"/>
+        from sys_area
+        <include refid="where"/>
+        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/SysCompanyMapper.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysCompanyMapper.xml
new file mode 100644
index 0000000..c8f04ea
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysCompanyMapper.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--公司信息表-->
+<mapper namespace="com.kidgrow.usercenter.mapper.SysCompanyMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   DISTINCT *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.orgId != null and p.orgId !=''">
+                and org_id = #{p.orgId}
+            </if>
+            <if test="p.companyName != null and p.companyName !=''">
+                and company_name like  '%${p.companyName}%'
+            </if>
+            <if test="p.companyArea != null and p.companyArea !=''">
+                and company_area = #{p.companyArea}
+            </if>
+            <if test="p.companyTel != null and p.companyTel !=''">
+                and company_tel = #{p.companyTel}
+            </if>
+            <if test="p.companyAdress != null and p.companyAdress !=''">
+                and company_adress = #{p.companyAdress}
+            </if>
+            <if test="p.companyLogo != null and p.companyLogo !=''">
+                and company_logo = #{p.companyLogo}
+            </if>
+            <if test="p.companyAbout != null and p.companyAbout !=''">
+                and company_about = #{p.companyAbout}
+            </if>
+            <if test="p.tenantId != null and p.tenantId !=''">
+                and tenant_id = #{p.tenantId}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <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>
+            <include refid="com.kidgrow.usercenter.mapper.SysRoleOrganizationMapper.Role_Organization"></include>
+        </where>
+    </sql>
+
+    <!--定义根据-SysCompany当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.usercenter.model.SysCompany">
+        select
+        <include refid="Column_List"/>
+        from sys_company
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-SysCompany当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.usercenter.model.SysCompany">
+        select
+        <include refid="Column_List"/>
+        from sys_company
+        <include refid="where"/>
+        order by id desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDepartmentMapper.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDepartmentMapper.xml
new file mode 100644
index 0000000..181b0a0
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDepartmentMapper.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--科室表-->
+<mapper namespace="com.kidgrow.usercenter.mapper.SysDepartmentMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.departmentName != null and p.departmentName !=''">
+                and department_name = #{p.departmentName}
+            </if>
+            <if test="p.orgId != null and p.orgId !=''">
+                and org_id = #{p.orgId}
+            </if>
+            <if test="p.serverUserId != null and p.serverUserId !=''">
+                and server_user_id = #{p.serverUserId}
+            </if>
+            <if test="p.serverUserName != null and p.serverUserName !=''">
+                and server_user_name = #{p.serverUserName}
+            </if>
+            <if test="p.departmentAbout != null and p.departmentAbout !=''">
+                and department_about = #{p.departmentAbout}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <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>
+            <if test="p.accountsCount != null and p.accountsCount !=''">
+                and accounts_count = #{p.accountsCount}
+            </if>
+        </where>
+    </sql>
+
+    <!--定义根据-SysDepartment当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.usercenter.model.SysDepartment">
+        select
+        <include refid="Column_List"/>
+        from sys_department
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-SysDepartment当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.usercenter.model.SysDepartment">
+        select
+        <include refid="Column_List"/>
+        from sys_department
+        <include refid="where"/>
+        order by id desc
+    </select>
+    <select id="checkDepartmentName" resultType="string">
+        SELECT org_name FROM sys_organization
+WHERE org_parent_id =( SELECT org_id FROM sys_hospital WHERE id = #{hosId} )
+AND org_name = #{departmentName}
+    </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
new file mode 100644
index 0000000..cccb3d5
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDictionariesMapper.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--系统字典表-->
+<mapper namespace="com.kidgrow.usercenter.mapper.SysDictionariesMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.dictionariesName != null and p.dictionariesName !=''">
+                and dictionaries_name like  '%${p.dictionariesName}%'
+            </if>
+            <if test="p.dictionariesNameAll != null and p.dictionariesNameAll !=''">
+                and dictionaries_name= #{p.dictionariesNameAll}
+            </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}
+            </if>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <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>
+        </where>
+    </sql>
+
+    <!--定义根据-SysDictionaries当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.usercenter.model.SysDictionaries">
+        select
+        <include refid="Column_List"/>
+        from sys_dictionaries
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-SysDictionaries当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.usercenter.model.SysDictionaries">
+        select
+        <include refid="Column_List"/>
+        from sys_dictionaries
+        <include refid="where"/>
+        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
new file mode 100644
index 0000000..04094cf
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysDoctorMapper.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!---->
+<mapper namespace="com.kidgrow.usercenter.mapper.SysDoctorMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	  DISTINCT *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.userId != null and p.userId !=''">
+                and user_id = #{p.userId}
+            </if>
+            <if test="p.hospitalId != null and p.hospitalId !=''">
+                and hospital_id = #{p.hospitalId}
+            </if>
+            <if test="p.hospitalName != null and p.hospitalName !=''">
+                and hospital_name like '%${p.hospitalName}%'
+            </if>
+            <if test="p.departmentId != null and p.departmentId !=''">
+                and department_id = #{p.departmentId}
+            </if>
+            <if test="p.departmentName != null and p.departmentName !=''">
+                and department_name = #{p.departmentName}
+            </if>
+            <if test="p.doctorName != null and 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 like concat('%',#{p.doctorTel},'%')
+            </if>
+            <if test="p.doctorRankId != null and p.doctorRankId !=''">
+                and doctor_rank_id = #{p.doctorRankId}
+            </if>
+            <if test="p.doctorRank != null and p.doctorRank !=''">
+                and doctor_rank = #{p.doctorRank}
+            </if>
+            <if test="p.doctorOtherLink != null and p.doctorOtherLink !=''">
+                and doctor_other_link = #{p.doctorOtherLink}
+            </if>
+            <if test="p.doctorEmail != null and p.doctorEmail !=''">
+                and doctor_email = #{p.doctorEmail}
+            </if>
+            <if test="p.doctorAbout != null and p.doctorAbout !=''">
+                and doctor_about = #{p.doctorAbout}
+            </if>
+            <if test="p.isAnswer != null and p.isAnswer !=''">
+                and is_answer = #{p.isAnswer}
+            </if>
+            <if test="p.isSigning != null and p.isSigning !=''">
+                and is_signing = #{p.isSigning}
+            </if>
+            <if test="p.isTop != null and p.isTop !=''">
+                and is_top = #{p.isTop}
+            </if>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.doctorState != null and p.doctorState !=''">
+                and doctor_state = #{p.doctorState}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <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>
+            <include refid="com.kidgrow.usercenter.mapper.SysRoleOrganizationMapper.Role_Organization"/>
+        </where>
+    </sql>
+
+    <!--定义根据-SysDoctor当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.usercenter.model.SysDoctor">
+        select
+        <include refid="Column_List"/>
+        from sys_doctor
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-SysDoctor当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.usercenter.model.SysDoctor">
+        select
+        <include refid="Column_List"/>
+        from sys_doctor
+        <include refid="where"/>
+        order by id desc
+    </select>
+
+    <select id="userIsAdmin" parameterType="string" resultType="com.kidgrow.usercenter.model.SysDoctor">
+		SELECT
+		is_admin_user
+		FROM
+			sys_doctor
+		WHERE
+		user_id IN (
+		SELECT
+			id
+		FROM
+			sys_user
+		WHERE
+		username = #{userName}
+		OR mobile = #{userName})
+	</select>
+    <select id="chartDoctor" resultType="int" parameterType="int">
+        select count(id) doctorCount from sys_doctor where is_del=0 and enabled=1
+        <if test="datatype==0">
+            -- 自注册医生
+            and (doctor_type=0 or doctor_type=1) and doctor_state=0
+        </if>
+        <if test="datatype==1">
+            -- 签约医生
+            and is_signing=1 and doctor_state=1
+        </if>
+        <if test="datatype==2">
+            -- 医答医生
+            and is_answer=1 and doctor_state=1
+        </if>
+        <if test="datatype==3">
+            -- C端医生
+            and (doctor_type=2 or doctor_type=0) and doctor_state=1
+        </if>
+        <if test="datatype==4">
+            -- H端医生
+            and (doctor_type=1 or doctor_type=0) and doctor_state=1
+        </if>
+        <if test="datatype==5">
+            -- H端医生
+            and (doctor_type=1 or doctor_type=0) and doctor_state=0 and enabled=0
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysHospitalMapper.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysHospitalMapper.xml
index 90980cc..a46fb44 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysHospitalMapper.xml
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysHospitalMapper.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<!---->
+<!--医院基础信息表-->
 <mapper namespace="com.kidgrow.usercenter.mapper.SysHospitalMapper">
     <!--定义查询列-->
     <sql id="Column_List">
@@ -12,48 +12,114 @@
         <where>
             <!--查询条件自行添加-->
             is_del=0
-            <if test="id != null">
-                and id = #{id}
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
             </if>
-            <if test="hospitalName != null and hospitalName !=''">
-                and hospital_name = #{hospitalName}
+            <if test="p.hospitalName != null and p.hospitalName !=''">
+                and hospital_name =#{p.hospitalName}%
             </if>
-            <if test="createUserId != null and createUserId != ''">
-                and create_user_id = #{createUserId}
+            <if test="p.orgId != null and p.orgId !=''">
+                and org_id = #{p.orgId}
             </if>
-            <if test="createUserName != null and createUserName !=''">
-                and create_user_name = #{createUserName}
+            <if test="p.hospitalShortName != null and p.hospitalShortName !=''">
+                and hospital_short_name = #{p.hospitalShortName}
             </if>
-            <if test="updateUserId != null and updateUserId != ''">
-                and update_user_id = #{updateUserId}
+            <if test="p.hospitalCode != null and p.hospitalCode !=''">
+                and hospital_code = #{p.hospitalCode}
             </if>
-            <if test="updateUserName != null and updateUserName !=''">
-                and update_user_name = #{updateUserName}
+            <if test="p.hospitalTypeId != null and p.hospitalTypeId !=''">
+                and hospital_type_id = #{p.hospitalTypeId}
             </if>
-            <if test="createTime != null and createTime !=''">
-                and create_time = #{createTime}
+            <if test="p.hospitalTypeName != null and p.hospitalTypeName !=''">
+                and hospital_type_name = #{p.hospitalTypeName}
             </if>
-            <if test="updateTime != null and updateTime !=''">
-                and update_time = #{updateTime}
+            <if test="p.hospitalTel != null and p.hospitalTel !=''">
+                and hospital_tel = #{p.hospitalTel}
             </if>
-            <if test="isDel != null">
-                and is_del = #{isDel}
+            <if test="p.hospitalArea != null and p.hospitalArea !=''">
+                and hospital_area = #{p.hospitalArea}
             </if>
-            <if test="tenantId != null">
-                and tenant_id = #{tenantId}
+            <if test="p.areaCode != null and p.areaCode !=''">
+                and area_code = #{p.areaCode}
             </if>
-            <if test="enabled != null">
-                and enabled = #{enabled}
+            <if test="p.hospitalAdress != null and p.hospitalAdress !=''">
+                and hospital_adress = #{p.hospitalAdress}
             </if>
+            <if test="p.latitude != null and p.latitude !=''">
+                and latitude = #{p.latitude}
+            </if>
+            <if test="p.longitude != null and p.longitude !=''">
+                and longitude = #{p.longitude}
+            </if>
+            <if test="p.hospitalQualifiedId != null and p.hospitalQualifiedId !=''">
+                and hospital_qualified_id = #{p.hospitalQualifiedId}
+            </if>
+            <if test="p.hospitalQualifiedName != null and p.hospitalQualifiedName !=''">
+                and hospital_qualified_name = #{p.hospitalQualifiedName}
+            </if>
+            <if test="p.hospitalLitLogo != null and p.hospitalLitLogo !=''">
+                and hospital_lit_logo = #{p.hospitalLitLogo}
+            </if>
+            <if test="p.hospitalLogo != null and p.hospitalLogo !=''">
+                and hospital_logo = #{p.hospitalLogo}
+            </if>
+            <if test="p.hospitalAdimage != null and p.hospitalAdimage !=''">
+                and hospital_adimage = #{p.hospitalAdimage}
+            </if>
+            <if test="p.hospitalAbout != null and p.hospitalAbout !=''">
+                and hospital_about = #{p.hospitalAbout}
+            </if>
+            <if test="p.isScreen != null and p.isScreen !=''">
+                and is_screen = #{p.isScreen}
+            </if>
+            <if test="p.serverUserId != null and p.serverUserId !=''">
+                and server_user_id = #{p.serverUserId}
+            </if>
+            <if test="p.serverUserName != null and p.serverUserName !=''">
+                and server_user_name = #{p.serverUserName}
+            </if>
+            <if test="p.hospitalState != null and p.hospitalState !=''">
+                and hospital_state = #{p.hospitalState}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.tenantId != null and p.tenantId !=''">
+                and tenant_id = #{p.tenantId}
+            </if>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <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>
+
         </where>
     </sql>
 
     <!--定义根据-SysHospital当作查询条件返回对象-->
-    <select id="findByObject"  resultType="com.kidgrow.usercenter.model.SysHospital">
+    <select id="findByObject" resultType="com.kidgrow.usercenter.model.SysHospital">
         select
         <include refid="Column_List"/>
         from sys_hospital
-        <include refid="where"></include>
+        <include refid="where"/>
+        order by id desc
+        limit 1
     </select>
 
     <!--定义根据-SysHospital当作查询条件返回对象集合-->
@@ -61,7 +127,170 @@
         select
         <include refid="Column_List"/>
         from sys_hospital
-
+        <include refid="where"/>
         order by id desc
     </select>
+    <sql id="whereList">
+        <where>
+            hosisdel = 0
+            <if test="p.isScreen != null and p.isScreen !=''">
+                and is_screen = #{p.isScreen}
+            </if>
+            <if test="p.isAnswer != null and p.isAnswer !=''">
+                and is_answer = #{p.isAnswer}
+            </if>
+            <if test="p.hospitalState != null and p.hospitalState !=''">
+                and hospital_state = #{p.hospitalState}
+            </if>
+            <if test="p.hospitalProvince != null and p.hospitalProvince !=''">
+                and hospital_province = #{p.hospitalProvince}
+            </if>
+            <if test="p.hospitalCity != null and p.hospitalCity !=''">
+                and hospital_city = #{p.hospitalCity}
+            </if>
+            <if test="p.hospitalArea != null and p.hospitalArea !=''">
+                and hospital_area = #{p.hospitalArea}
+            </if>
+            <if test="p.hospitalName != null and p.hospitalName !=''">
+                and hospital_name LIKE concat('%',#{p.hospitalName},'%')
+            </if>
+            <if test="p.roleOrg != null and p.roleOrg.size>0">
+
+                <foreach item="item" collection="p.roleOrg" index="">
+                    <foreach item="itemto" collection="item" index="inx">
+
+                        <choose>
+                            <when test="inx == 1">
+                                <if test="itemto.flag">
+                                </if>
+                                <if test="!itemto.flag">
+                                    or ( hospitals.hosisdel = 0 and hospitals.hosenabled=1)
+                                </if>
+                            </when>
+                            <when test="inx==2">
+                                <if test="itemto.flag">
+                                    AND
+                                    <foreach item="itemtoto" collection="itemto.object" separator="or" open="("
+                                             close=")"
+                                             index="">
+                                        create_user_org_code = #{itemtoto.orgCode}
+                                    </foreach>
+                                </if>
+                                <if test="!itemto.flag">
+                                    or (
+                                    <foreach item="itemtoto" collection="itemto.object" separator="or" open="("
+                                             close=")"
+                                             index="">
+                                        create_user_org_code = #{itemtoto.orgCode}
+                                    </foreach>
+                                    and hospitals.hosisdel = 0 and hospitals.hosenabled=1
+                                    )
+                                </if>
+                            </when>
+                            <when test="inx == 3">
+                                <if test="itemto.flag">
+                                    AND
+                                    create_user_org_code = #{itemto.object}
+                                </if>
+                                <if test="!itemto.flag">
+                                    or (create_user_org_code = #{itemto.object} and hospitals.hosisdel = 0 and hospitals.hosenabled=1)
+                                </if>
+                            </when>
+                            <when test="inx == 4">
+                                <if test="itemto.flag">
+                                    AND
+                                    create_user_org_code like '${itemto.object}%'
+                                </if>
+                                <if test="!itemto.flag">
+                                    or (create_user_org_code like '${itemto.object}%' and hospitals.hosisdel = 0 and
+                                    hospitals.hosenabled=1)
+                                </if>
+                            </when>
+                            <when test="inx == 5">
+                                <if test="itemto.flag">
+                                    AND
+                                    hospitals.create_user_id = #{itemto.object}
+                                </if>
+                                <if test="!itemto.flag">
+                                    or (hospitals.create_user_id = #{itemto.object} and hospitals.hosisdel = 0 and hospitals.hosenabled=1)
+                                </if>
+                            </when>
+                            <otherwise>
+                                AND id is null
+                            </otherwise>
+                        </choose>
+
+                    </foreach>
+                </foreach>
+            </if>
+            <!--                        <include refid="com.kidgrow.usercenter.mapper.SysRoleOrganizationMapper.Role_Organization"></include>-->
+        </where>
+    </sql>
+    <select id="findHospitalList" resultType="com.kidgrow.usercenter.vo.HospitalListVo">
+        SELECT
+        DEP.department_name,
+        DEP.id department_id,
+        DEP.server_user_name,
+        DEP.server_user_id,
+        DEP.org_id,
+        DEP.is_del,
+        DEP.enabled,
+        hospitals.*
+        FROM
+        sys_department DEP
+        LEFT JOIN sys_organization DEORG ON DEP.org_id = DEORG.id and DEP.is_del=0
+        LEFT JOIN (
+        SELECT
+        HOS.id hospital_id,
+        HOS.hospital_name,
+        HOS.hospital_code,
+        HOS.hospital_province,
+        HOS.hospital_city,
+        HOS.hospital_area,
+        HOS.hospital_tel,
+        HOS.hospital_state,
+        HOS.hospital_link,
+        HOS.org_id hospital_org_id,
+        HOS.is_screen,
+        HOS.is_answer,
+        HOS.tenant_id,
+        HOS.area_code,
+        HOS.create_time,
+        HOS.is_del hosisdel,
+        HOS.enabled hosenabled,
+        ORG.id AS hosorgid,
+        HOS.create_user_id
+        FROM
+        sys_hospital HOS
+        LEFT JOIN sys_organization ORG ON HOS.org_id = ORG.id and ORG.is_del=0
+        ) AS hospitals ON DEORG.org_parent_id = hospitals.hosorgid
+        <include refid="whereList"/>
+        order by create_time desc
+    </select>
+    <select id="findByName" resultType="com.kidgrow.usercenter.model.SysHospital">
+        select id,
+        hospital_name
+        from sys_hospital
+        where is_del=0 and enabled=1 and hospital_name LIKE concat('%',#{hospitalName},'%')
+        order by hospital_name desc
+    </select>
+    <select id="chartHospital" resultType="int" parameterType="int">
+        SELECT
+        count( DISTINCT hospital_name ) hospitalCount
+        FROM
+        sys_hospital
+        WHERE
+        <if test="datatype==0">
+            hospital_state =0
+        </if>
+        <if test="datatype==1">
+            hospital_state =1
+        </if>
+        <if test="datatype==11">
+            is_screen =1 and
+            hospital_state =1
+        </if>
+        AND is_del = 0
+        AND enabled = 1;
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysLoggerMapper.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysLoggerMapper.xml
new file mode 100644
index 0000000..c97d41d
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysLoggerMapper.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!---->
+<mapper namespace="com.kidgrow.usercenter.mapper.SysLoggerMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.applicationName != null and p.applicationName !=''">
+                and application_name = #{p.applicationName}
+            </if>
+            <if test="p.className != null and p.className !=''">
+                and class_name = #{p.className}
+            </if>
+            <if test="p.methodName != null and p.methodName !=''">
+                and method_name = #{p.methodName}
+            </if>
+            <if test="p.userId != null and p.userId !=''">
+                and user_id = #{p.userId}
+            </if>
+            <if test="p.userName != null and p.userName !=''">
+                and user_name = #{p.userName}
+            </if>
+            <if test="p.clientId != null and p.clientId !=''">
+                and client_id = #{p.clientId}
+            </if>
+            <if test="p.operation != null and p.operation !=''">
+                and operation = #{p.operation}
+            </if>
+            <if test="p.timestamp != null and p.timestamp !=''">
+                and timestamp = #{p.timestamp}
+            </if>
+        </where>
+    </sql>
+
+    <!--定义根据-SysLogger当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.usercenter.model.SysLogger">
+        select
+        <include refid="Column_List"/>
+        from sys_logger
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-SysLogger当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.usercenter.model.SysLogger">
+        select
+        <include refid="Column_List"/>
+        from sys_logger
+        order by id desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysOrganizationMapper.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysOrganizationMapper.xml
new file mode 100644
index 0000000..749a853
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysOrganizationMapper.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--组织架构表-->
+<mapper namespace="com.kidgrow.usercenter.mapper.SysOrganizationMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.orgLevel != null and p.orgLevel !=''">
+                and org_level = #{p.orgLevel}
+            </if>
+            <if test="p.orgAttr != null and p.orgAttr !=''">
+                and org_attr = #{p.orgAttr}
+            </if>
+            <if test="p.orgParentId != null and p.orgParentId !=''">
+                and org_parent_id = #{p.orgParentId}
+            </if>
+            <if test="p.orgName != null and p.orgName !=''">
+                and org_name like '%${p.orgName}%'
+            </if>
+            <if test="p.orgOrder != null and p.orgOrder !=''">
+                and org_order = #{p.orgOrder}
+            </if>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <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>
+        </where>
+    </sql>
+
+    <!--定义根据-SysOrganization当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.common.model.SysOrganization">
+        select
+        <include refid="Column_List"/>
+        from sys_organization
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-SysOrganization当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.common.model.SysOrganization">
+        select
+        <include refid="Column_List"/>
+        from sys_organization
+        <include refid="where"/>
+        order by id desc
+    </select>
+
+    <!--根据用户ID查询用户所属组织机构列表-->
+<!--        <select id="findListByUserId" resultType="com.kidgrow.common.model.SysOrganization">-->
+<!--        SELECT-->
+<!--            org.id,-->
+<!--            org.org_parent_id,-->
+<!--            org.org_name ,-->
+<!--            org.org_attr,-->
+<!--            org.org_level-->
+<!--        FROM sys_user_org uo-->
+<!--        LEFT JOIN sys_organization org ON uo.org_id = org.id-->
+<!--        AND (uo.enabled = TRUE AND uo.is_del = FALSE) AND (org.is_del = FALSE AND org.enabled = TRUE)-->
+<!--        where uo.user_id=#{userId}-->
+<!--        order by org_level-->
+<!--        </select>-->
+    <select id="findListByUserId" resultType="com.kidgrow.common.model.SysOrganization">
+         SELECT
+            org.*
+            FROM
+            sys_user_org uo
+            LEFT JOIN sys_organization org ON uo.org_id = org.id
+            WHERE
+            org.is_del = FALSE
+            AND org.enabled = TRUE
+            AND uo.enabled = TRUE
+            AND uo.is_del = FALSE
+            and  uo.user_id=#{userId}
+            ORDER BY
+            org_level
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysRoleMapper.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysRoleMapper.xml
index 949796b..85e28cc 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysRoleMapper.xml
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysRoleMapper.xml
@@ -10,7 +10,8 @@
 			update_time,
 			is_del,
 			enabled,
-			tenant_id
+			tenant_id,
+			type
 	</sql>
 
 	<sql id="where">
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysRoleMenuMapper.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysRoleMenuMapper.xml
index f4ef3b9..8ef4b39 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysRoleMenuMapper.xml
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysRoleMenuMapper.xml
@@ -3,7 +3,7 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.kidgrow.usercenter.mapper.SysRoleMenuMapper">
 
-	<update id="delete">
+	<delete id="delete">
 		delete from sys_role_menu
 		<where>
 			<if test="roleId != null">
@@ -13,7 +13,7 @@
 				and menu_id = #{menuId}
 			</if>
 		</where>
-	</update>
+	</delete>
 
 	<select id="findMenusByRoleIds" resultType="com.kidgrow.common.model.SysMenu">
 		select distinct t.* from sys_menu t
@@ -30,22 +30,42 @@
 		ORDER BY sort ASC
 	</select>
 
-    <select id="findMenusByRoleCodes" resultType="com.kidgrow.common.model.SysMenu">
-		select distinct t.* from sys_menu t
-		inner join sys_role_menu r on r.menu_id = t.id
-		inner join sys_role rl on rl.id = r.role_id and rl.tenant_id=#{tenantId} and rl.enabled=1
-		where
-		rl.code in
-		<foreach collection="roleCodes" index="index" item="roleCode"
-				 open="(" separator="," close=")">
-			#{roleCode}
-		</foreach>
-		<if test="type != null">
-			and t.type = #{type}
-		</if>
-		and t.hidden = 0
-		and t.tenant_id = #{tenantId}
-		and t.enabled = 1
-		ORDER BY sort ASC
-	</select>
+<!--    <select id="findMenusByRoleCodes" resultType="com.kidgrow.common.model.SysMenu">-->
+<!--		select distinct t.* from sys_menu t-->
+<!--		inner join sys_role_menu r on r.menu_id = t.id-->
+<!--		inner join sys_role rl on rl.id = r.role_id and rl.tenant_id=#{tenantId} and rl.enabled=1-->
+<!--		where-->
+<!--		rl.code in-->
+<!--		<foreach collection="roleCodes" index="index" item="roleCode"-->
+<!--				 open="(" separator="," close=")">-->
+<!--			#{roleCode}-->
+<!--		</foreach>-->
+<!--		<if test="type != null">-->
+<!--			and t.type = #{type}-->
+<!--		</if>-->
+<!--		and t.hidden = 0-->
+<!--		and t.tenant_id = #{tenantId}-->
+<!--		and t.enabled = 1-->
+<!--		ORDER BY sort ASC-->
+<!--	</select>-->
+	    <select id="findMenusByRoleCodes" resultType="com.kidgrow.common.model.SysMenu">
+			select distinct t.* from sys_menu t
+			inner join sys_role_menu r on r.menu_id = t.id
+			inner join sys_role rl on rl.id = r.role_id  and rl.enabled=1
+			where
+			rl.code in
+			<foreach collection="roleCodes" index="index" item="roleCode"
+					 open="(" separator="," close=")">
+				#{roleCode}
+			</foreach>
+			<if test="type != null">
+				and t.type = #{type}
+			</if>
+			<if test="tenantId != null and tenantId !=''">
+				and t.tenant_id = #{tenantId}
+			</if>
+			and t.hidden = 0
+			and t.enabled = 1
+			ORDER BY sort ASC
+		</select>
 </mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysRoleOrganizationMapper.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysRoleOrganizationMapper.xml
new file mode 100644
index 0000000..fa9564d
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysRoleOrganizationMapper.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--角色对应的   部门-->
+<mapper namespace="com.kidgrow.usercenter.mapper.SysRoleOrganizationMapper">
+
+    <!--定义数据权限的查询-->
+    <sql id="Role_Organization">
+        <if test="p.roleOrg != null and p.roleOrg.size>0">
+            <foreach item="item" collection="p.roleOrg" index="">
+                <foreach item="itemto" collection="item" index="inx">
+                    <choose>
+                        <when test="inx == 1">
+                            <if test="itemto.flag">
+
+                            </if>
+                            <if test="!itemto.flag">
+                                or ( is_del = 0 and enabled=1)
+                            </if>
+                        </when>
+                        <when test="inx==2">
+                            <if test="itemto.flag">
+                                AND
+                                <foreach item="itemtoto" collection="itemto.object" separator="or" open="(" close=")"
+                                         index="">
+                                    create_user_org_code = #{itemtoto.orgCode}
+                                </foreach>
+                            </if>
+                            <if test="!itemto.flag">
+                                or (
+                                <foreach item="itemtoto" collection="itemto.object" separator="or" open="(" close=")"
+                                         index="">
+                                    create_user_org_code = #{itemtoto.orgCode}
+                                </foreach>
+                                and is_del = 0 and enabled=1
+                                )
+                            </if>
+                        </when>
+                        <when test="inx == 3">
+                            <if test="itemto.flag">
+                                AND
+                                create_user_org_code = #{itemto.object}
+                            </if>
+                            <if test="!itemto.flag">
+                                or (create_user_org_code = #{itemto.object} and is_del = 0 and enabled=1)
+                            </if>
+                        </when>
+                        <when test="inx == 4">
+                            <if test="itemto.flag">
+                                AND
+                                create_user_org_code like '${itemto.object}%'
+                            </if>
+                            <if test="!itemto.flag">
+                                or (create_user_org_code like '${itemto.object}%' and is_del = 0 and enabled=1)
+                            </if>
+                        </when>
+                        <when test="inx == 5">
+                            <if test="itemto.flag">
+                                AND
+                                create_user_id = #{itemto.object}
+                            </if>
+                            <if test="!itemto.flag">
+                                or (create_user_id = #{itemto.object} and is_del = 0 and enabled=1)
+                            </if>
+                        </when>
+                        <otherwise>
+                            AND id is null
+                        </otherwise>
+                    </choose>
+                </foreach>
+            </foreach>
+        </if>
+    </sql>
+
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.type != null and p.type !=''">
+                and type = #{p.type}
+            </if>
+            <if test="p.roleId != null and p.roleId !=''">
+                and role_id = #{p.roleId}
+            </if>
+            <if test="p.orgId != null and p.orgId !=''">
+                and org_id = #{p.orgId}
+            </if>
+            <if test="p.orgCode != null and p.orgCode !=''">
+                and org_code = #{p.orgCode}
+            </if>
+        </where>
+    </sql>
+
+    <!--定义根据-SysRoleOrganization当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.usercenter.model.SysRoleOrganization">
+        select
+        <include refid="Column_List"/>
+        from sys_role_organization
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-SysRoleOrganization当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.usercenter.model.SysRoleOrganization">
+        select
+        <include refid="Column_List"/>
+        from sys_role_organization
+        <include refid="where"/>
+        order by id desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserLogsMapper.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserLogsMapper.xml
index f941c96..cf63278 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserLogsMapper.xml
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserLogsMapper.xml
@@ -2,8 +2,65 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <!--系统用户登录日志表-->
 <mapper namespace="com.kidgrow.usercenter.mapper.SysUserLogsMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.loginTime != null and p.loginTime !=''">
+                and login_time = #{p.loginTime}
+            </if>
+            <if test="p.loginIp != null and p.loginIp !=''">
+                and login_ip = #{p.loginIp}
+            </if>
+            <if test="p.loginAgentBrowser != null and p.loginAgentBrowser !=''">
+                and login_agent_browser = #{p.loginAgentBrowser}
+            </if>
+            <if test="p.loginAgentSystem != null and p.loginAgentSystem !=''">
+                and login_agent_system = #{p.loginAgentSystem}
+            </if>
+            <if test="p.loginNums != null and p.loginNums !=''">
+                and login_nums = #{p.loginNums}
+            </if>
+            <if test="p.loginType != null and p.loginType !=''">
+                and login_type = #{p.loginType}
+            </if>
+            <if test="p.userid != null and p.userid !=''">
+                and userid = #{p.userid}
+            </if>
+            <if test="p.username != null and p.username !=''">
+                and username = #{p.username}
+            </if>
+            <if test="p.clientId != null and p.clientId !=''">
+                and client_id = #{p.clientId}
+            </if>
+        </where>
+    </sql>
+
+    <!--定义根据-SysUserLogs当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.usercenter.model.SysUserLogs">
+        select
+        <include refid="Column_List"/>
+        from sys_user_logs
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
     <!--定义根据-SysUserLogs当作查询条件返回对象集合-->
     <select id="findList" resultType="com.kidgrow.usercenter.model.SysUserLogs">
-        select * from sys_user_logs t
+        select
+        <include refid="Column_List"/>
+        from sys_user_logs
+        <include refid="where"/>
+        order by id desc
     </select>
 </mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserMapper.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserMapper.xml
index dfb7a15..07d25a1 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserMapper.xml
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserMapper.xml
@@ -2,42 +2,209 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.kidgrow.usercenter.mapper.SysUserMapper">
-	<sql id="where">
-		<where>
-			t.is_del=0
-			<if test="u.id != null and u.id != ''">
-				and t.id like concat('%', #{u.id}, '%')
-			</if>
-			<if test="u.username != null and u.username != ''">
-				and t.username like concat('%', #{u.username}, '%')
-			</if>
-			<if test="u.nickname != null and u.nickname != ''">
-				and t.nickname like concat('%', #{u.nickname}, '%')
-			</if>
-			<if test="u.enabled != null and u.enabled != ''">
-				and t.enabled = #{u.enabled}
-			</if>
-			<if test="u.type != null and u.type != ''">
-				and t.type = #{u.type}
-			</if>
-			<if test="u.searchKey != null and u.searchKey != '' and u.searchKey=='user_id'">
-				and t.id  like concat('%', #{u.searchValue}, '%')
-			</if>
-			<if test="u.searchKey != null and u.searchKey != '' and u.searchKey=='username'">
-				and t.username  like concat('%', #{u.searchValue}, '%')
-			</if>
-			<if test="u.searchKey != null and u.searchKey != '' and u.searchKey=='nick_name'">
-				and t.nickname  like concat('%', #{u.searchValue}, '%')
-			</if>
-			<if test="u.searchKey != null and u.searchKey != '' and u.searchKey=='mobile'">
-				and t.mobile  like concat('%', #{u.searchValue}, '%')
-			</if>
-		</where>
-	</sql>
+    <sql id="where">
+        <where>
+            t.is_del=0
+            <if test="u.id != null and u.id != ''">
+                and t.id like concat('%', #{u.id}, '%')
+            </if>
+            <if test="u.username != null and u.username != ''">
+                and t.username like concat('%', #{u.username}, '%')
+            </if>
+            <if test="u.nickname != null and u.nickname != ''">
+                and t.nickname like concat('%', #{u.nickname}, '%')
+            </if>
+            <if test="u.enabled != null and u.enabled != ''">
+                and t.enabled = #{u.enabled}
+            </if>
+            <if test="u.type != null and u.type != ''">
+                and t.type = #{u.type}
+            </if>
+            <if test="u.searchKey != null and u.searchKey != '' and u.searchKey=='user_id'">
+                and t.id like concat('%', #{u.searchValue}, '%')
+            </if>
+            <if test="u.searchKey != null and u.searchKey != '' and u.searchKey=='username'">
+                and t.username like concat('%', #{u.searchValue}, '%')
+            </if>
+            <if test="u.searchKey != null and u.searchKey != '' and u.searchKey=='nick_name'">
+                and t.nickname like concat('%', #{u.searchValue}, '%')
+            </if>
+            <if test="u.searchKey != null and u.searchKey != '' and u.searchKey=='mobile'">
+                and t.mobile like concat('%', #{u.searchValue}, '%')
+            </if>
+        </where>
+    </sql>
+    <sql id="where_map">
+        <where>
+            <if test="u.isDel != null">
+                and t.is_del = #{u.isDel}
+            </if>
+            <if test="u.id != null and u.id != ''">
+                and t.id like concat('%', #{u.id}, '%')
+            </if>
+            <if test="u.username != null and u.username != ''">
+                and t.username = #{u.username}
+            </if>
+            <if test="u.nickname != null and u.nickname != ''">
+                and t.nickname like concat('%', #{u.nickname}, '%')
+            </if>
+            <if test="u.enabled != null and u.enabled != ''">
+                and t.enabled = #{u.enabled}
+            </if>
+            <if test="u.type != null and u.type != ''">
+                and t.type = #{u.type}
+            </if>
+            <if test="u.searchKey != null and u.searchKey != '' and u.searchKey=='user_id'">
+                and t.id like concat('%', #{u.searchValue}, '%')
+            </if>
+            <if test="u.searchKey != null and u.searchKey != '' and u.searchKey=='username'">
+                and t.username like concat('%', #{u.searchValue}, '%')
+            </if>
+            <if test="u.searchKey != null and u.searchKey != '' and u.searchKey=='nick_name'">
+                and t.nickname like concat('%', #{u.searchValue}, '%')
+            </if>
+            <if test="u.searchKey != null and u.searchKey != '' and u.searchKey=='mobile'">
+                and t.mobile like concat('%', #{u.searchValue}, '%')
+            </if>
+        </where>
+    </sql>
 
-	<select id="findList" resultType="com.kidgrow.common.model.SysUser">
-		select * from sys_user t
-		<include refid="where" />
-		order by t.id desc
+    <select id="findList" resultType="com.kidgrow.common.model.SysUser">
+        select * from sys_user t
+        <include refid="where"/>
+        order by t.id desc
+    </select>
+    <select id="selectCountByMap" parameterType="map" resultType="integer">
+        select count(*) from sys_user t
+        <include refid="where_map"/>
+    </select>
+
+    <select id="findAppointUsers" parameterType="integer" resultType="com.kidgrow.common.model.SysUser">
+        SELECT
+        USERS.id,
+        USERS.nickname,
+        USERS.mobile
+        FROM
+        `sys_role_user` RU
+        LEFT JOIN sys_user USERS ON RU.user_id = USERS.id
+        LEFT JOIN sys_role ROLE ON RU.role_id = ROLE.id
+        WHERE
+        USERS.is_del = 0
+        <if test="type == 0">
+            AND ROLE.`code` IN (
+            'salemanager',
+            'sale')
+        </if>
+        <if test="type == 1">
+            AND ROLE.`code` IN (
+            'oprationmanager',
+            'opration')
+        </if>
+    </select>
+
+    <select id="findDoctorUserAllData" parameterType="long" resultType="com.kidgrow.common.model.DoctorUserAll">
+		SELECT sysuser.id,
+		sysdoctor.doctor_name,
+		sysdoctor.id doctor_Id,
+		sysdoctor.doctor_ccie,
+		sysdoctor.doctor_tel,
+		sysdoctor.doctor_rank,
+		sysdoctor.doctor_email,
+		sysdoctor.is_answer docanswer,
+		sysdoctor.is_signing docsign,
+		sysdoctor.is_admin_user,
+		sysdoctor.doctor_state,
+		sysdoctor.doctor_logo,
+		sysdoctor.enabled docenabled,
+		sysdoctor.is_del docdel,
+
+		syshos.id hospital_id,
+		syshos.hospital_name,
+		syshos.hospital_short_name,
+		syshos.hospital_type_name,
+		syshos.hospital_tel,
+		syshos.hospital_province,
+		syshos.hospital_city,
+		syshos.hospital_area,
+		syshos.area_code,
+		syshos.hospital_qualified_name,
+		syshos.hospital_lit_logo,
+		syshos.hospital_logo,
+		syshos.is_screen hosisscreen,
+		syshos.is_answer hosisanswer,
+		syshos.hospital_state,
+		syshos.enabled hosenabled,
+		syshos.is_del hosdel,
+
+		sysdep.id department_id,
+		sysdep.department_name,
+		sysdep.server_user_name,
+		sysdep.server_user_tel,
+		sysdep.sale_user_name,
+		sysdep.sale_user_tel,
+		sysdep.enabled depenabled,
+		sysdep.accounts_count,
+		sysdep.is_del depdel
+		FROM sys_user sysuser
+		left JOIN sys_doctor sysdoctor on sysuser.id=sysdoctor.user_id
+		left JOIN sys_hospital syshos on sysdoctor.hospital_id=syshos.id
+		left JOIN sys_department sysdep on sysdoctor.department_id=sysdep.id
+		where sysuser.id=#{userId}
+		and sysuser.is_del=0 and sysuser.enabled=1
+		and syshos.is_del=0 and syshos.enabled=1
+		and sysdep.is_del=0 and sysdep.enabled=1
 	</select>
+    <select id="hospitalDoctorList" parameterType="long" resultType="com.kidgrow.usercenter.vo.HospitalDoctorListVo">
+        SELECT
+        dc.create_time,
+        dc.department_name,
+        dc.hospital_name,
+        dc.doctor_name,
+        dc.doctor_rank,
+        dc.doctor_tel,
+        dc.id,
+        dc.user_id,
+        dc.is_admin_user,
+        dc.doctor_state,
+        us.mobile,
+        us.username,
+        us.default_auth,
+        us.enabled,
+		roleuser.role_id,
+		dc.is_del
+        FROM
+        sys_doctor dc
+        LEFT JOIN sys_user us ON dc.user_id = us.id
+        LEFT JOIN sys_role_user roleuser
+        ON roleuser.user_id=us.id
+        where  dc.is_del=0 and dc.enabled=1  and us.enabled=1
+        and dc.hospital_id=#{hospitalId} and dc.department_id=#{departmentId}  and (role_id=#{roleId1} or role_id=#{roleId2})
+    </select>
+    <select id="hospitalDoctorListAndDel" parameterType="long" resultType="com.kidgrow.usercenter.vo.HospitalDoctorListVo">
+        SELECT
+        distinct
+        dc.create_time,
+        dc.department_name,
+        dc.hospital_name,
+        dc.doctor_name,
+        dc.doctor_rank,
+        dc.doctor_tel,
+        dc.id,
+        dc.user_id,
+        dc.is_admin_user,
+        dc.doctor_state,
+        us.mobile,
+        us.username,
+        us.default_auth,
+        us.enabled,
+-- 		roleuser.role_id,
+		dc.is_del
+        FROM
+        sys_doctor dc
+        LEFT JOIN sys_user us ON dc.user_id = us.id
+        LEFT JOIN sys_role_user roleuser
+        ON roleuser.user_id=us.id
+        where   dc.enabled=1  and us.enabled=1
+        and dc.hospital_id=#{hospitalId} and dc.department_id=#{departmentId}  and (role_id=#{roleId1} or role_id=#{roleId2})
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserOrgMapper.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserOrgMapper.xml
new file mode 100644
index 0000000..96c67b0
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysUserOrgMapper.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--用户和组织关系表-->
+<mapper namespace="com.kidgrow.usercenter.mapper.SysUserOrgMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+            is_del=0
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.userId != null and p.userId !=''">
+                and user_id = #{p.userId}
+            </if>
+            <if test="p.orgId != null and p.orgId !=''">
+                and org_id = #{p.orgId}
+            </if>
+            <if test="p.enabled != null and p.enabled !=''">
+                and enabled = #{p.enabled}
+            </if>
+            <if test="p.isDel != null and p.isDel !=''">
+                and is_del = #{p.isDel}
+            </if>
+            <if test="p.createUserId != null and p.createUserId !=''">
+                and create_user_id = #{p.createUserId}
+            </if>
+            <if test="p.createUserName != null and p.createUserName !=''">
+                and create_user_name = #{p.createUserName}
+            </if>
+            <if test="p.updateUserId != null and p.updateUserId !=''">
+                and update_user_id = #{p.updateUserId}
+            </if>
+            <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>
+        </where>
+    </sql>
+
+    <!--定义根据-SysUserOrg当作查询条件返回对象-->
+    <select id="findByObject" resultType="com.kidgrow.common.model.SysUserOrg">
+        select
+        <include refid="Column_List"/>
+        from sys_user_org
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
+
+    <!--定义根据-SysUserOrg当作查询条件返回对象集合-->
+    <select id="findList" resultType="com.kidgrow.common.model.SysUserOrg">
+        select
+        <include refid="Column_List"/>
+        from sys_user_org
+        <include refid="where"/>
+        order by id desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/Dockerfile b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/Dockerfile
new file mode 100644
index 0000000..80fee4b
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-Xms64m","-Xmx400m","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/pom.xml b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/pom.xml
index 77db52d..1d7ac6a 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/pom.xml
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/pom.xml
@@ -51,6 +51,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
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
new file mode 100644
index 0000000..69ae1b9
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysAreaController.java
@@ -0,0 +1,142 @@
+package com.kidgrow.usercenter.controller;
+
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.usercenter.model.SysArea;
+import com.kidgrow.usercenter.service.ISysAreaService;
+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.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 java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 省市区数据表
+ * @Project: 用户中心
+ * @CreateDate: Created in 2020-04-02 18:32:36 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/sysarea")
+@Api(tags = "省市区数据表")
+public class SysAreaController  extends BaseController{
+    @Autowired
+    private ISysAreaService sysAreaService;
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @GetMapping("/findAlls")
+    public PageResult<SysArea> findAlls(@RequestParam Map<String, Object> params) {
+        return sysAreaService.findList(params);
+    }
+    @ApiOperation(value = "查询列表")
+    @GetMapping("/getListByMap")
+    public ResultBody getListByMap(@RequestParam Map<String, Object> params) {
+        return sysAreaService.getListByMap(params);
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        SysArea model = sysAreaService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据SysArea当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据SysArea当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody SysArea sysArea) {
+        SysArea model = sysAreaService.findByObject(sysArea);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody SysArea sysArea, BindingResult bindingResult) {
+        List<String> errMsg= new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            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("保存成功");
+            }
+            else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v= sysAreaService.removeById(id);
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            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/SysCompanyController.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysCompanyController.java
new file mode 100644
index 0000000..d468069
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysCompanyController.java
@@ -0,0 +1,129 @@
+package com.kidgrow.usercenter.controller;
+
+import com.kidgrow.common.annotation.LoginUser;
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.usercenter.model.SysCompany;
+import com.kidgrow.usercenter.service.ISysCompanyService;
+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.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 java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 公司信息表
+ * @Project: 用户中心
+ * @CreateDate: Created in 2020-04-02 18:32:36 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/syscompany")
+@Api(tags = "公司信息表")
+public class SysCompanyController  extends BaseController{
+    @Autowired
+    private ISysCompanyService sysCompanyService;
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping
+    public PageResult list(@RequestParam Map<String, Object> params, @LoginUser SysUser user) {
+        if(params.size()==0){
+            params.put("page",1);
+            params.put("limit",10);
+        }
+        return sysCompanyService.findList(params,user);
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        SysCompany model = sysCompanyService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据SysCompany当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据SysCompany当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody SysCompany sysCompany) {
+        SysCompany model = sysCompanyService.findByObject(sysCompany);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody SysCompany sysCompany, BindingResult bindingResult, @LoginUser SysUser user) {
+        List<String> errMsg= new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        } else {
+            List<SysOrganization> organizations = user.getOrganizations();
+            if (organizations.size()>0) {
+                sysCompany.setCreateUserOrgCode(organizations.get(organizations.size()-1).getOrgCode());
+            }
+            boolean v= sysCompanyService.saveOrUpdate(sysCompany);
+            if(v) {
+                return ResultBody.ok().data(sysCompany).msg("保存成功");
+            }
+            else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v= sysCompanyService.removeById(id);
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            return ResultBody.failed().msg("删除失败");
+        }
+    }
+    /**
+     *修改状态
+     */
+    @ApiOperation(value = "修改状态")
+    @GetMapping("updateEnabled")
+    public ResultBody updateEnabled(@RequestParam Map<String, Object> params) {
+        return sysCompanyService.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
new file mode 100644
index 0000000..5586df4
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDepartmentController.java
@@ -0,0 +1,189 @@
+package com.kidgrow.usercenter.controller;
+
+import com.kidgrow.common.annotation.LoginUser;
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.common.utils.StringUtils;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.usercenter.model.SysDepartment;
+import com.kidgrow.usercenter.service.ISysDepartmentService;
+import com.kidgrow.usercenter.service.ISysOrganizationService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 科室表
+ * @Project: 用户中心
+ * @CreateDate: Created in 2020-04-02 18:32:36 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/sysdepartment")
+@Api(tags = "科室表")
+public class SysDepartmentController extends BaseController {
+    @Autowired
+    private ISysDepartmentService sysDepartmentService;
+    @Autowired
+    private ISysOrganizationService sysOrganizationService;
+
+    /**
+     * 列表
+     */
+    @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(sysDepartmentService.findList(params));
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        SysDepartment model = sysDepartmentService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据SysDepartment当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据SysDepartment当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody SysDepartment sysDepartment) {
+        SysDepartment model = sysDepartmentService.findByObject(sysDepartment);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 检查科室名是否存在
+     */
+    @ApiOperation(value = "检查科室名是否存在")
+    @GetMapping("/checkName")
+    public ResultBody checkDepName(Long hospitalId,String departmentName) {
+        if (departMentNameIsUsed(hospitalId,departmentName)) {
+            return ResultBody.failed().msg(String.format("该医院下已经存在科室 %s", departmentName));
+        }
+        return ResultBody.ok().msg("");
+    }
+
+    /**
+     * 检查科室名是否存在
+     * @param hosId
+     * @param departmentName
+     * @return
+     */
+    private Boolean departMentNameIsUsed(Long hosId,String departmentName)
+    {
+        String departName=sysDepartmentService.checkDepartmentName(hosId,departmentName);
+        return StringUtils.isNotBlank(departName);
+    }
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping("/{hosId}")
+    @Transactional(rollbackFor = {Exception.class})
+    public ResultBody save(@Valid @RequestBody SysDepartment sysDepartment,@PathVariable Long hosId, BindingResult bindingResult,@LoginUser SysUser sysUser) {
+        List<String> errMsg = new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        } else {
+            //先检查该医院该科室是否已经存在
+            if (sysDepartment.getId() == null) {
+
+                if (departMentNameIsUsed(hosId,sysDepartment.getDepartmentName())) {
+                    return ResultBody.failed().msg(String.format("该医院下已经存在科室 %s", sysDepartment.getDepartmentName()));
+                }
+            }
+            //先检查是否存在组织信息
+            SysOrganization sysOrganization = new SysOrganization();
+            if (sysDepartment.getOrgId() != null) {
+                sysOrganization.setId(sysDepartment.getOrgId());
+            } else {
+                sysOrganization.setOrgName(sysDepartment.getDepartmentName());
+                //临时暂用其它字段承载数据
+                sysOrganization.setOrgParentId(sysDepartment.getUpdateUserId());
+            }
+            sysOrganization = sysOrganizationService.findByObject(sysOrganization);
+            if (sysOrganization == null) {
+                //创建一个组织
+                sysOrganization = new SysOrganization();
+                sysOrganization.setOrgName(sysDepartment.getDepartmentName());
+                sysOrganization.setOrgAttr(2);
+                sysOrganization.setOrgLevel(2);
+                //临时暂用其它字段承载数据
+                sysOrganization.setOrgParentId(sysDepartment.getUpdateUserId());
+                if(!sysUser.getOrganizations().isEmpty()){
+                    sysOrganization.setCreateUserOrgCode(sysUser.getOrganizations().get(1).getOrgCode());
+                }
+            } else {
+                sysOrganization.setOrgName(sysDepartment.getDepartmentName());
+            }
+            boolean org = sysOrganizationService.saveOrUpdateSer(sysOrganization);
+            sysDepartment.setOrgId(sysOrganization.getId());
+            boolean v = sysDepartmentService.saveOrUpdate(sysDepartment);
+            if (v) {
+                return ResultBody.ok().data(sysDepartment).msg("保存成功");
+            } else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v = sysDepartmentService.removeById(id);
+        if (v) {
+            return ResultBody.ok().msg("删除成功");
+        } else {
+            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
new file mode 100644
index 0000000..4fc3002
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDictionariesController.java
@@ -0,0 +1,144 @@
+package com.kidgrow.usercenter.controller;
+
+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.*;
+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.usercenter.model.SysDictionaries;
+import com.kidgrow.usercenter.service.ISysDictionariesService;
+import com.kidgrow.common.model.*;
+
+import org.springframework.validation.BindingResult;
+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;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 系统字典表
+ * @Project: 用户中心
+ * @CreateDate: Created in 2020-04-02 18:32:36 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/sysdictionaries")
+@Api(tags = "系统字典表")
+public class SysDictionariesController  extends BaseController{
+    @Autowired
+    private ISysDictionariesService sysDictionariesService;
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping
+    public PageResult list(@RequestParam Map<String, Object> params) {
+        if(params.size()==0){
+            params.put("page",1);
+            params.put("limit",10);
+        }
+        return sysDictionariesService.findList(params);
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @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("查询成功");
+    }
+
+    /**
+     * 根据SysDictionaries当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据SysDictionaries当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody SysDictionaries sysDictionaries) {
+        SysDictionaries model = sysDictionariesService.findByObject(sysDictionaries);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody SysDictionaries sysDictionaries, BindingResult bindingResult) {
+        List<String> errMsg= new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        } else {
+            boolean v= sysDictionariesService.saveOrUpdate(sysDictionaries);
+            if(v) {
+                return ResultBody.ok().data(sysDictionaries).msg("保存成功");
+            }
+            else {
+                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 = "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 = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v= sysDictionariesService.removeById(id);
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            return ResultBody.failed().msg("删除失败");
+        }
+    }
+}
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
new file mode 100644
index 0000000..728e7e6
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysDoctorController.java
@@ -0,0 +1,167 @@
+package com.kidgrow.usercenter.controller;
+
+import com.kidgrow.common.annotation.LoginUser;
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.usercenter.model.SysDoctor;
+import com.kidgrow.usercenter.service.ISysDoctorService;
+import com.kidgrow.usercenter.vo.SysDoctorDto;
+import com.kidgrow.usercenter.vo.SysDoctorVo;
+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;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 
+ * @Project: 用户中心
+ * @CreateDate: Created in 2020-04-02 18:32:36 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/sysdoctor")
+@Api(tags = "医生表")
+public class SysDoctorController  extends BaseController{
+    @Autowired
+    private ISysDoctorService sysDoctorService;
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping
+    public PageResult<SysDoctorDto> list(@RequestParam Map<String, Object> params,@LoginUser  SysUser user) {
+        if(params.size()==0){
+            params.put("page",1);
+            params.put("limit",10);
+        }
+
+        return sysDoctorService.findList(params,user);
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        SysDoctor model = sysDoctorService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+    /**
+     * 判断用户名是否管理员
+     */
+    @ApiOperation(value = "判断用户名是否管理员")
+    @GetMapping("/userName")
+    public ResultBody findById(@RequestParam String userName) {
+        return sysDoctorService.userIsAdmin(userName);
+    }
+    /**
+     * 根据 Map 查询
+     */
+    @ApiOperation(value = "查询")
+    @PostMapping("/findByMap")
+    public ResultBody findByMap(@RequestBody Map<String,Object> map) {
+        List<SysDoctor> models = sysDoctorService.findByMap(map);
+        return ResultBody.ok().data(models).msg("查询成功");
+    }
+    /**
+     * 根据SysDoctor当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据SysDoctor当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody SysDoctor sysDoctor) {
+        SysDoctor model = sysDoctorService.findByObject(sysDoctor);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody SysDoctorDto sysDoctor, BindingResult bindingResult, HttpServletRequest request,@LoginUser SysUser user) {
+        List<String> errMsg= new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        } else {
+            return sysDoctorService.saveOrUpdateSer(sysDoctor,request,user);
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v= sysDoctorService.delete(id);
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            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);
+    }
+    /**
+     * 设为管理
+     */
+    @ApiOperation(value = "设为管理员")
+    @PostMapping("setadmin")
+    public ResultBody setAdmin(@RequestBody Map<String, Object> params) {
+        return sysDoctorService.setAdminDoctor(params);
+    }
+    /**
+     * 统计医生的数量
+     * @param datatype 业务类型
+     *                 0 自注册医生
+     *                 1 签约医生
+     *                 2 医答医生
+     *                 3 C端医生
+     *                 4 H端医生
+     * @return
+     */
+    @ApiOperation(value = "统计医生的数量")
+    @GetMapping("chartDoctor")
+    public ResultBody chartDoctor(int datatype) {
+        int counts= sysDoctorService.chartDoctor(datatype);
+        return ResultBody.ok().data(counts).msg("数据获取成功");
+    }
+}
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 00e3687..090a6ec 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
@@ -1,44 +1,67 @@
 package com.kidgrow.usercenter.controller;
 
-import java.util.Map;
+import com.kidgrow.common.annotation.LoginUser;
+import com.kidgrow.common.constant.DictionariesConstants;
 import com.kidgrow.common.controller.BaseController;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.usercenter.model.SysHospital;
+import com.kidgrow.usercenter.service.ISysHospitalService;
+import com.kidgrow.usercenter.service.ISysOrganizationService;
+import com.kidgrow.usercenter.vo.HospitalListVo;
 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.usercenter.model.SysHospital;
-import com.kidgrow.usercenter.service.ISysHospitalService;
-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;
 
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
- * @Description: 
+ *
+ * @Description: 医院基础信息表
  * @Project: 用户中心
- * @CreateDate: Created in 2020-03-11 16:15:31 <br>
+ * @CreateDate: Created in 2020-04-02 18:32:36 <br>
  * @Author: <a href="4345453@kidgrow.com">liuke</a>
  * @version: 1.0
  */
 @Slf4j
 @RestController
 @RequestMapping("/syshospital")
-@Api(tags = "")
-public class SysHospitalController  extends BaseController{
+@Api(tags = "医院基础信息表")
+public class SysHospitalController extends BaseController {
     @Autowired
     private ISysHospitalService sysHospitalService;
+    @Autowired
+    private ISysOrganizationService organizationService;
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表/单表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping("/findOne")
+    public PageResult<SysHospital> listOne(@RequestParam Map<String, Object> params) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        return sysHospitalService.findList(params);
+    }
 
     /**
      * 列表
@@ -49,12 +72,28 @@
             @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
     })
     @GetMapping
-    public PageResult list(@RequestParam Map<String, Object> params) {
-        if(params.size()==0){
-            params.put("page",1);
-            params.put("limit",10);
+    public PageResult<HospitalListVo> list(@RequestParam Map<String, Object> params, @LoginUser SysUser user) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
         }
-        return sysHospitalService.findList(params);
+        return sysHospitalService.findHospitalList(params, user);
+    }
+
+    @PostMapping("findAll")
+    @ApiOperation(value = "查询所有列表")
+    public ResultBody<SysHospital> findAll(@RequestBody Map<String, Object> params) {
+        if (params.get("hospitalName") != null) {
+            return sysHospitalService.findAll(params);
+        } else {
+            return ResultBody.ok().data(null);
+        }
+    }
+
+    @PostMapping("findAllByMap")
+    @ApiOperation(value = "查询所有列表")
+    public ResultBody<SysHospital> findAllByMap(@RequestBody Map<String, Object> params) {
+        return sysHospitalService.findAll(params);
     }
 
     /**
@@ -68,6 +107,19 @@
     }
 
     /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/findByName")
+    public ResultBody findByName(@RequestParam String hospitalName) {
+        if (!hospitalName.isEmpty()) {
+            return ResultBody.ok().data(sysHospitalService.findByName(hospitalName).getData()).msg("查询成功");
+        } else {
+            return ResultBody.ok().data(null).msg("");
+        }
+    }
+
+    /**
      * 根据SysHospital当做查询条件进行查询
      */
     @ApiOperation(value = "根据SysHospital当做查询条件进行查询")
@@ -78,16 +130,65 @@
     }
 
     /**
+     * 修改医院logo
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping("/updateLogo")
+    public ResultBody updateLogo(@RequestBody Map<String, Object> params) {
+        return sysHospitalService.updateLogo(params);
+    }
+
+    /**
      * 新增or更新
      */
     @ApiOperation(value = "保存")
     @PostMapping
-    public ResultBody save(@Valid @RequestBody SysHospital sysHospital, BindingResult bindingResult) {
+    public ResultBody save(@Valid @RequestBody SysHospital sysHospital, BindingResult bindingResult, @LoginUser SysUser sysUser) {
+        List<String> errMsg = new ArrayList<>();
         if (bindingResult.hasErrors()) {
-            return ResultBody.failed().msg(bindingResult.getFieldError().getDefaultMessage());
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
         } else {
-            sysHospitalService.saveOrUpdate(sysHospital);
-            return ResultBody.ok().data(sysHospital).msg("保存成功");
+            //先检查该医院是否存在组织信息
+            SysOrganization sysOrganization = new SysOrganization();
+            if (sysHospital.getOrgId() != null) {
+                sysOrganization.setId(sysHospital.getOrgId());
+            } else {
+                sysOrganization.setOrgName(sysHospital.getHospitalName());
+                sysOrganization.setOrgParentId(DictionariesConstants.ORG_PARENT_ID);
+            }
+            sysOrganization = organizationService.findByObject(sysOrganization);
+            if (sysOrganization == null) {
+                //创建一个组织
+                sysOrganization = new SysOrganization();
+                sysOrganization.setOrgName(sysHospital.getHospitalName());
+                sysOrganization.setOrgAttr(1);
+                sysOrganization.setOrgLevel(1);
+                sysOrganization.setOrgParentId(DictionariesConstants.ORG_PARENT_ID);
+                if(!sysUser.getOrganizations().isEmpty()){
+                    sysOrganization.setCreateUserOrgCode(sysUser.getOrganizations().get(1).getOrgCode());
+                }
+            } else {
+                sysOrganization.setOrgName(sysHospital.getHospitalName());
+            }
+            boolean org = organizationService.saveOrUpdateSer(sysOrganization);
+            sysHospital.setOrgId(sysOrganization.getId());
+            List<SysOrganization> organizations = sysUser.getOrganizations();
+            if (organizations.size() > 0) {
+                sysHospital.setCreateUserOrgCode(organizations.get(organizations.size() - 1).getOrgCode());
+            }
+            //运营平台添加的医院默认就是正式的
+            if (sysHospital.getHospitalState()==null) {
+                sysHospital.setHospitalState(1);
+            }
+            boolean v = sysHospitalService.saveOrUpdate(sysHospital);
+            if (v) {
+                return ResultBody.ok().data(sysHospital).msg("保存成功");
+            } else {
+                return ResultBody.failed().msg("保存失败");
+            }
         }
     }
 
@@ -95,9 +196,49 @@
      * 删除
      */
     @ApiOperation(value = "删除")
-    @DeleteMapping("/{id}")
-    public ResultBody delete(@PathVariable Long id) {
-        sysHospitalService.removeById(id);
-        return ResultBody.ok().msg("删除成功");
+    @GetMapping("/delete")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "departmentId", value = "departmentId", required = true, dataType = "Integer")
+    })
+    public ResultBody delete(@RequestParam Map<String, Object> params) {
+        if (params.size() == 0) {
+            return ResultBody.failed().msg("参数异常!");
+        }
+        return sysHospitalService.delete(params);
+    }
+
+    /**
+     * 修改状态
+     *
+     * @param params
+     * @return
+     */
+    @ApiOperation(value = "修改反馈数据状态")
+    @GetMapping("/updateEnabled")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "departmentId", value = "departmentId", 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 sysHospitalService.updateEnabled(params);
+    }
+
+    /**
+     * 统计医院数量
+     * @param datatype  医院类型
+     *                 0 试用医院
+     *                  1 正式医院
+     *                  11 筛查医院
+     * @return
+     */
+    @ApiOperation(value = "统计医院数量")
+    @GetMapping("/chartHospital")
+    public ResultBody chartHospital(int datatype) {
+        return sysHospitalService.chartHospital(datatype);
     }
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysMenuController.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysMenuController.java
index 8ae640b..fb113aa 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysMenuController.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysMenuController.java
@@ -15,7 +15,6 @@
 import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cache.annotation.Cacheable;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.*;
@@ -41,7 +40,7 @@
     @Autowired
     private ISysMenuService menuService;
 
-    /**
+    /**current
      * 两层循环实现建树
      *
      * @param sysMenus
@@ -64,9 +63,6 @@
         }
         return menus;
     }
-
-
-
 
     /**
      * 修改菜单状态
@@ -117,9 +113,9 @@
 
         for (SysMenu sysMenu : allMenus) {
             Map<String, Object> authTree = new HashMap<>();
-            authTree.put("id", sysMenu.getId());
+            authTree.put("id", sysMenu.getId().toString());
             authTree.put("name", sysMenu.getName());
-            authTree.put("pId", sysMenu.getParentId());
+            authTree.put("pId", sysMenu.getParentId().toString());
             authTree.put("open", true);
             authTree.put("checked", false);
             if (roleMenusMap.get(sysMenu.getId()) != null) {
@@ -132,7 +128,7 @@
 
     @ApiOperation(value = "根据roleCodes获取对应的权限")
     @SuppressWarnings("unchecked")
-    @Cacheable(value = "menu", key ="#roleCodes")
+//    @Cacheable(value = "menu", key ="#roleCodes")
     @GetMapping("/{roleCodes}")
     public List<SysMenu> findMenuByRoles(@PathVariable String roleCodes) {
         List<SysMenu> result = null;
@@ -202,7 +198,8 @@
         if (CollectionUtil.isEmpty(roles)) {
             return ResultBody.ok().data(Collections.emptyList());
         }
-        List<SysMenu> menus = menuService.findByRoleCodes(roles.parallelStream().map(SysRole::getCode).collect(Collectors.toSet()), CommonConstant.MENU);
+        Set<String> collect = roles.stream().map(e -> e.getCode()).collect(Collectors.toSet());
+        List<SysMenu> menus = menuService.findByRoleCodes(collect, CommonConstant.MENU);
         return ResultBody.ok().data(treeBuilder(menus));
     }
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysOrganizationController.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysOrganizationController.java
new file mode 100644
index 0000000..d28083a
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysOrganizationController.java
@@ -0,0 +1,152 @@
+package com.kidgrow.usercenter.controller;
+
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.usercenter.service.ISysOrganizationService;
+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.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 java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 组织架构表
+ * @Project: 用户中心
+ * @CreateDate: Created in 2020-04-10 15:21:10 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/sysorganization")
+@Api(tags = "组织架构表")
+public class SysOrganizationController extends BaseController {
+    @Autowired
+    private ISysOrganizationService sysOrganizationService;
+
+    /**
+     * 列表
+     */
+    @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(sysOrganizationService.findList(params));
+    }
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "模糊查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping("/listByName")
+    public ResultBody listByName(@RequestParam Map<String, Object> params) {
+        if (params.size() == 0) {
+            params.put("page", 1);
+            params.put("limit", 10);
+        }
+        if (params.get("orgName") != null) {
+            return ResultBody.ok().data(sysOrganizationService.findList(params).getData());
+        } else {
+            return ResultBody.ok().data(null);
+        }
+    }
+
+    @ApiOperation(value = "查询列表by MAP")
+    @GetMapping("getListByMap")
+    public ResultBody getListByMap(@RequestParam Map<String, Object> params) {
+        return sysOrganizationService.getListByMap(params);
+    }
+
+    @ApiOperation(value = "获取tree")
+    @GetMapping("getTree")
+    public ResultBody getTree(@RequestParam Map<String, Object> params) {
+        return sysOrganizationService.getTree(params);
+    }
+
+    @ApiOperation(value = "更新状态")
+    @GetMapping("updateEnabled")
+    public ResultBody updateEnabled(@RequestParam Map<String, Object> params) {
+        return sysOrganizationService.updateEnabled(params);
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        SysOrganization model = sysOrganizationService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据SysOrganization当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据SysOrganization当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody SysOrganization sysOrganization) {
+        SysOrganization model = sysOrganizationService.findByObject(sysOrganization);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody SysOrganization sysOrganization, BindingResult bindingResult) {
+        List<String> errMsg = new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        } else {
+            boolean v = sysOrganizationService.saveOrUpdateSer(sysOrganization);
+            if (v) {
+                return ResultBody.ok().data(sysOrganization).msg("保存成功");
+            } else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v = sysOrganizationService.removeById(id);
+        if (v) {
+            return ResultBody.ok().msg("删除成功");
+        } else {
+            return ResultBody.failed().msg("删除失败");
+        }
+    }
+}
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysRoleController.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysRoleController.java
index 16f9b80..65168fa 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysRoleController.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysRoleController.java
@@ -71,6 +71,16 @@
         List<SysRole> result = sysRoleService.findAll();
         return ResultBody.ok().data(result);
     }
+    /**
+     * 用户管理根据条件查询角色
+     * @return
+     */
+    @ApiOperation(value = "后台管理查询角色")
+    @GetMapping("/findByMap")
+    public ResultBody<List<SysRole>> findByMap(@RequestParam Map<String, Object> params) {
+        List<SysRole> result = sysRoleService.findByMap(params);
+        return ResultBody.ok().data(result);
+    }
 
     /**
      * 角色新增或者更新
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysRoleOrganizationController.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysRoleOrganizationController.java
new file mode 100644
index 0000000..ed5f2fc
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysRoleOrganizationController.java
@@ -0,0 +1,137 @@
+package com.kidgrow.usercenter.controller;
+
+import java.util.Map;
+
+import com.kidgrow.common.annotation.LoginUser;
+import com.kidgrow.common.constant.SecurityConstants;
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.usercenter.dto.SysRoleOrganizationDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+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.usercenter.model.SysRoleOrganization;
+import com.kidgrow.usercenter.service.ISysRoleOrganizationService;
+import com.kidgrow.common.model.*;
+
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+
+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;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ * @Description: 角色对应的   部门
+ * @Project: 用户中心
+ * @CreateDate: Created in 2020-04-21 14:24:41 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ * @version: 1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/sysroleorganization")
+@Api(tags = "角色对应的   部门")
+public class SysRoleOrganizationController  extends BaseController{
+    @Autowired
+    private ISysRoleOrganizationService sysRoleOrganizationService;
+
+    /**
+     * 列表
+     */
+    @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(sysRoleOrganizationService.findList(params));
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        SysRoleOrganization model = sysRoleOrganizationService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据SysRoleOrganization当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据SysRoleOrganization当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody SysRoleOrganization sysRoleOrganization) {
+        SysRoleOrganization model = sysRoleOrganizationService.findByObject(sysRoleOrganization);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody SysRoleOrganizationDto sysRoleOrganizationDto, BindingResult bindingResult, @LoginUser SysUser user, HttpServletRequest request) {
+        List<String> errMsg= new ArrayList<>();
+        String header = request.getHeader(SecurityConstants.USER_ORG_ID_HEADER);
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        } else {
+            boolean v= sysRoleOrganizationService.saveOrUpdateSer(sysRoleOrganizationDto,user);
+            if(v) {
+                return ResultBody.ok().data(sysRoleOrganizationDto).msg("保存成功");
+            }
+            else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
+    }
+    @ApiOperation(value = "获取tree")
+    @GetMapping("getTree")
+    public ResultBody getTree(@RequestParam Map<String, Object> params,@LoginUser SysUser user) {
+        return sysRoleOrganizationService.getTree(params,user);
+    }
+    @ApiOperation(value = "获取数据权限的map")
+    @PostMapping("getRoleOrg")
+    public Map<String, Object> getRoleOrgMap(@RequestBody List<SysRole> list) {
+        SysUser user=new SysUser();
+        user.setRoles(list);
+        return sysRoleOrganizationService.getRoleOrgMap(user);
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        boolean v= sysRoleOrganizationService.removeById(id);
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            return ResultBody.failed().msg("删除失败");
+        }
+    }
+}
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 2076cbf..2151dda 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
@@ -7,6 +7,7 @@
 import com.kidgrow.common.context.ClientContextHolder;
 import com.kidgrow.common.model.*;
 import com.kidgrow.common.utils.ExcelUtil;
+import com.kidgrow.common.utils.StringUtils;
 import com.kidgrow.log.annotation.AuditLog;
 import com.kidgrow.searchcenter.client.service.IQueryService;
 import com.kidgrow.searchcenter.model.LogicDelDto;
@@ -15,6 +16,7 @@
 import com.kidgrow.usercenter.model.SysUserExcel;
 import com.kidgrow.usercenter.model.SysUserLogs;
 import com.kidgrow.usercenter.service.ISysUserService;
+import com.kidgrow.usercenter.vo.UserRegVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -24,7 +26,6 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.CachePut;
-import org.springframework.cache.annotation.Cacheable;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -47,6 +48,7 @@
 @Api(tags = "用户模块api")
 public class SysUserController {
     private static final String ADMIN_CHANGE_MSG = "超级管理员不给予修改";
+
 
     /**
      * 全文搜索逻辑删除Dto
@@ -72,7 +74,10 @@
      */
     @ApiOperation(value = "根据access_token当前登录用户")
     @GetMapping("/users/current")
-    public ResultBody<LoginAppUser> getLoginAppUser(@LoginUser(isFull = true) SysUser user) {
+    public ResultBody<LoginAppUser> getLoginAppUser(@LoginUser(isFull = true) SysUser user,HttpServletRequest request) {
+        if(user!=null){
+            loginLogs(user, request);
+        }
         return ResultBody.ok().data(appUserService.getLoginAppUser(user));
     }
 
@@ -81,9 +86,8 @@
      */
     @GetMapping(value = "/users/name/{username}")
     @ApiOperation(value = "根据用户名查询用户实体")
-    @Cacheable(value = "user", key = "#username")
+//    @Cacheable(value = "user", key = "#username")
     public SysUser selectByUsername(@PathVariable String username) {
-
         return appUserService.selectByUsername(username);
     }
 
@@ -92,26 +96,24 @@
      */
     @GetMapping(value = "/users-anon/login", params = "username")
     @ApiOperation(value = "根据用户名查询用户")
-    public LoginAppUser findByUsername(String username,HttpServletRequest request) {
-
-        LoginAppUser loginAppUser =appUserService.findByUsername(username);
-        if(loginAppUser!=null){
-            loginLogs(loginAppUser,request);
-        }
+    public LoginAppUser findByUsername(String username) {
+        LoginAppUser loginAppUser = appUserService.findByUsername(username);
         return loginAppUser;
     }
 
     /**
      * 用户登录日志
+     *
      * @param sysUser
      * @return
      */
-    private int loginLogs(LoginAppUser sysUser,HttpServletRequest request){
+    private int loginLogs(SysUser sysUser, HttpServletRequest request) {
         SysUserLogs sysUserLogs = new SysUserLogs();
         sysUserLogs.setClientId(ClientContextHolder.getClient());
         sysUserLogs.setLoginAgentSystem(request.getHeader(CommonConstant.USER_AGENT_SYSTEM));
         sysUserLogs.setLoginAgentBrowser(request.getHeader(CommonConstant.USER_AGENT_BROWSER));
         sysUserLogs.setLoginIp(request.getHeader(CommonConstant.USER_AGENT_IP));
+        sysUserLogs.setLoginSystemScreen(request.getHeader(CommonConstant.USER_AGENT_SYSTEM_SCREEN));
         sysUserLogs.setLoginTime(new Date());
         sysUserLogs.setUserid(sysUser.getId());
         sysUserLogs.setUsername(sysUser.getUsername());
@@ -152,7 +154,7 @@
      * @param sysUser
      */
     @PutMapping("/users")
-    @CachePut(value = "user", key = "#sysUser.username", unless="#result == null")
+    @CachePut(value = "user", key = "#sysUser.username", unless = "#result == null")
     @AuditLog(operation = "'更新用户:' + #sysUser")
     public ResultBody updateSysUser(@RequestBody SysUser sysUser) {
         appUserService.updateById(sysUser);
@@ -196,9 +198,22 @@
     })
     @GetMapping("/users")
     public PageResult<SysUser> findUsers(@RequestParam Map<String, Object> params) {
-//        log.info("租户ID:"+ TenantContextHolder.getTenant());
-//        log.info("IP:"+request.getHeader(CommonConstant.USER_AGENT_IP));
         return appUserService.findUsers(params);
+    }
+    /**
+     * 获取医院科室下的所有有效的医生
+     * @param hospitalId
+     * @param departmentId
+     * @return
+     */
+    @ApiOperation(value = "用户查询列表")
+    @GetMapping("/users/HDoctorusers")
+    public ResultBody hospitalDoctorList(@RequestParam Long hospitalId, Long departmentId,boolean isIncluddel) {
+        if (StringUtils.isNotBlank(hospitalId.toString()) && StringUtils.isNotBlank(departmentId.toString())) {
+            return appUserService.hospitalDoctorList(hospitalId, departmentId,isIncluddel);
+        } else {
+            return ResultBody.failed("查询参数有误");
+        }
     }
 
     /**
@@ -223,29 +238,79 @@
 
     /**
      * 管理后台,给用户重置密码
+     * 重置密码后,会将新密码返回到data字段。
      *
      * @param id
      */
     @PutMapping(value = "/users/{id}/password")
     @AuditLog(operation = "'重置用户密码:' + #id")
-    public ResultBody resetPassword(@PathVariable Long id) {
+    public ResultBody resetPassword(@PathVariable Long id) throws Exception{
         if (checkAdmin(id)) {
             return ResultBody.failed(ADMIN_CHANGE_MSG);
         }
-        appUserService.updatePassword(id, null, null);
-        return ResultBody.ok().msg("重置成功");
+        return appUserService.updatePassword(id, null, null, true);
+    }
+
+    /**
+     * 返回给Python加密密码
+     */
+    @GetMapping(value = "/users/python")
+    public ResultBody jiaMipython(@RequestParam("password") String password)  {
+        if (password==null||"".equals(password)) {
+            return ResultBody.failed().msg("请输入密码");
+        }
+        ResultBody resultBody = appUserService.jiaMipython(password);
+        return resultBody;
     }
 
     /**
      * 用户自己修改密码
      */
     @PutMapping(value = "/users/password")
-    public ResultBody resetPassword(@RequestBody SysUser sysUser) {
+    public ResultBody resetPassword(@RequestBody SysUser sysUser) throws Exception {
         if (checkAdmin(sysUser.getId())) {
             return ResultBody.failed().msg(ADMIN_CHANGE_MSG);
         }
-        appUserService.updatePassword(sysUser.getId(), sysUser.getOldPassword(), sysUser.getNewPassword());
-        return ResultBody.ok().msg("重置成功");
+        ResultBody resultBody = appUserService.updatePassword(sysUser.getId(), sysUser.getOldPassword(), sysUser.getNewPassword(), false);
+        return resultBody;
+    }
+
+    /**
+     * 用户自己修改密码-后端以外
+     */
+    @PutMapping(value = "/users/resetpassword")
+    public ResultBody resetClientPassword(@RequestParam Map<String, Object> params) throws Exception {
+        Long id = MapUtils.getLong(params, "id");
+        String oldPassword = MapUtils.getString(params, "oldPassword");
+        String newPassword = MapUtils.getString(params, "newPassword");
+        String refPassword = MapUtils.getString(params, "refPassword");
+        if (id > 0 && !oldPassword.isEmpty() && !newPassword.isEmpty() && !refPassword.isEmpty()) {
+            if (refPassword.equals(newPassword)) {
+                return appUserService.updatePassword(id, oldPassword, newPassword, false).data(true).msg("密码修改成功!");
+            } else {
+                return ResultBody.failed("两次新密码输入不一致!").data(false);
+            }
+        } else {
+            return ResultBody.failed("必须参数有误!").data(false);
+        }
+    }
+
+    /**
+     * 用户修改自己的手机号
+     *
+     * @param params
+     * @return
+     */
+    @PutMapping(value = "/users/updateusertel")
+    public ResultBody updateUserTel(@RequestParam Map<String, Object> params,@LoginUser SysUser sysUser) throws Exception  {
+        String oldTel = MapUtils.getString(params, "oldTel");
+        if (oldTel==null){
+            return ResultBody.failed("请输入原账号");
+        }
+        if(!sysUser.getUsername().equals(oldTel)){
+            return ResultBody.failed("请输入正确的原账号");
+        }
+        return appUserService.updateUserTel(params);
     }
 
     /**
@@ -259,10 +324,23 @@
         if (checkAdmin(id)) {
             return ResultBody.failed(ADMIN_CHANGE_MSG);
         }
-        appUserService.delUser(id);
-        return ResultBody.ok().msg("删除成功");
+        boolean v = appUserService.delUser(id);
+        return ResultBody.ok().msg("删除成功").data(v);
     }
-
+    /**
+     * 删除用户  不删除关系表 ,role_user 表  和 用户组织
+     *
+     * @param id
+     */
+    @DeleteMapping(value = "/users/deleteNoContact/{id}")
+    //@AuditLog(operation = "'删除用户:' + #id")
+    public ResultBody deleteNoContact(@PathVariable Long id) {
+        if (checkAdmin(id)) {
+            return ResultBody.failed(ADMIN_CHANGE_MSG);
+        }
+        boolean v = appUserService.deleteNoContact(id);
+        return ResultBody.ok().msg("删除成功").data(v);
+    }
 
     /**
      * 新增or更新
@@ -275,6 +353,18 @@
     @AuditLog(operation = "'新增或更新用户:' + #sysUser.username")
     public ResultBody saveOrUpdate(@RequestBody SysUser sysUser) {
         return appUserService.saveOrUpdateUser(sysUser);
+    }
+
+    /**
+     * 用户注册,添加用户
+     * @param userRegVo 注册信息
+     * @param sysUser  当前登录用户
+     * @return
+     */
+    @PostMapping("/users/doctorUserReg")
+    @AuditLog(operation = "'注册/添加用户:' + #userRegVo.mobile")
+    public ResultBody doctorUserReg(@RequestBody UserRegVo userRegVo,SysUser sysUser) throws Exception {
+        return appUserService.doctorUserReg(userRegVo,sysUser);
     }
 
     /**
@@ -294,7 +384,7 @@
     @PostMapping(value = "/users/import")
     public ResultBody importExcl(@RequestParam("file") MultipartFile excl) throws Exception {
         int rowNum = 0;
-        if(!excl.isEmpty()) {
+        if (!excl.isEmpty()) {
             List<SysUserExcel> list = ExcelUtil.importExcel(excl, 0, 1, SysUserExcel.class);
             rowNum = list.size();
             if (rowNum > 0) {
@@ -309,7 +399,7 @@
                 appUserService.saveBatch(users);
             }
         }
-        return ResultBody.ok().msg("导入数据成功,一共【"+rowNum+"】行");
+        return ResultBody.ok().msg("导入数据成功,一共【" + rowNum + "】行");
     }
 
     @ApiOperation(value = "用户全文搜索列表")
@@ -327,9 +417,79 @@
     }
 
     /**
-     * 是否超级管理员
+     * 根据map查询
      */
     private boolean checkAdmin(long id) {
-        return id == 1L;
+        return id == CommonConstant.ADMIN_USER_ID;
+    }
+
+    @PostMapping("/users/findAll")
+    public ResultBody findAll(@RequestBody Map<String, Object> map) {
+        return appUserService.findAll(map);
+    }
+
+    /**
+     * 根据map查询   总个数
+     *
+     * @param map
+     * @return
+     */
+    @PostMapping("/users/findCountByMap")
+    public ResultBody findCountByMap(@RequestBody Map<String, Object> map) {
+        return appUserService.findCountByMap(map);
+    }
+
+    /**
+     * 获取当前用的 组织下的所有人员
+     */
+    @GetMapping("users/getThisUserOrganizationUser")
+    public ResultBody getThisUserOrganizationUser(HttpServletRequest request) {
+        return appUserService.getThisUserOrganizationUser(request);
+    }
+
+    /**
+     * 通过手机修改密码
+     */
+    @PutMapping(value = "/users/passwordByPhone")
+    public ResultBody passwordByPhone(@RequestBody Map<String, Object> map) throws Exception {
+        return appUserService.passwordByPhone(map);
+    }
+
+    /**
+     * 通过手机号注册 新用户
+     */
+    @PutMapping(value = "/users/registerByPhone")
+    public ResultBody registerByPhone(@RequestBody Map<String, Object> map) {
+        return appUserService.registerByPhone(map);
+    }
+
+    /**
+     * 更换手机号
+     */
+    @PutMapping(value = "/users/updatePhone")
+    public ResultBody updatePhone(@RequestBody Map<String, Object> map, @LoginUser SysUser sysUser) {
+        return appUserService.updatePhone(map, sysUser);
+    }
+
+    /**
+     * 获取指定用户信息(销售人员和服务人员)
+     */
+    @GetMapping("users/getAppointUser")
+    public ResultBody getAppointUser() {
+        String type = request.getParameter("type");
+
+        return appUserService.findAppointUsers(Integer.parseInt(type));
+    }
+    /**
+     * 检查该手机号是否注册 false 未注册  true已经注册
+     */
+    @GetMapping("users/isRegUser")
+    public ResultBody isRegUser(String userTel) {
+
+        if(appUserService.phoneIsUsed(userTel))
+        {
+            return ResultBody.ok().data(true);
+        }
+        return ResultBody.failed().data(false);
     }
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserLogsController.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserLogsController.java
index 4bee7c6..94c704b 100644
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserLogsController.java
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserLogsController.java
@@ -1,32 +1,31 @@
 package com.kidgrow.usercenter.controller;
 
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import com.kidgrow.common.controller.BaseController;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.usercenter.model.SysUserLogs;
+import com.kidgrow.usercenter.service.ISysUserLogsService;
 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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.*;
 
-import com.kidgrow.usercenter.model.SysUserLogs;
-import com.kidgrow.usercenter.service.ISysUserLogsService;
-import com.kidgrow.common.model.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+import javax.validation.Valid;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
  * @Description: 系统用户登录日志表
  * @Project: 用户中心
- * @CreateDate: Created in 2020-03-09 10:13:23 <br>
+ * @CreateDate: Created in 2020-04-02 18:32:36 <br>
  * @Author: <a href="4345453@kidgrow.com">liuke</a>
  * @version: 1.0
  */
@@ -34,7 +33,7 @@
 @RestController
 @RequestMapping("/sysuserlogs")
 @Api(tags = "系统用户登录日志表")
-public class SysUserLogsController {
+public class SysUserLogsController  extends BaseController{
     @Autowired
     private ISysUserLogsService sysUserLogsService;
 
@@ -47,8 +46,12 @@
             @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
     })
     @GetMapping
-    public PageResult list(@RequestParam Map<String, Object> params) {
-        return sysUserLogsService.findList(params);
+    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(sysUserLogsService.findList(params));
     }
 
     /**
@@ -56,8 +59,18 @@
      */
     @ApiOperation(value = "查询")
     @GetMapping("/{id}")
-    public ResultBody findUserById(@PathVariable Long id) {
+    public ResultBody findById(@PathVariable Long id) {
         SysUserLogs model = sysUserLogsService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
+     * 根据SysUserLogs当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据SysUserLogs当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody SysUserLogs sysUserLogs) {
+        SysUserLogs model = sysUserLogsService.findByObject(sysUserLogs);
         return ResultBody.ok().data(model).msg("查询成功");
     }
 
@@ -66,9 +79,22 @@
      */
     @ApiOperation(value = "保存")
     @PostMapping
-    public ResultBody save(@RequestBody SysUserLogs sysUserLogs) {
-        sysUserLogsService.saveOrUpdate(sysUserLogs);
-        return ResultBody.ok().msg("保存成功");
+    public ResultBody save(@Valid @RequestBody SysUserLogs sysUserLogs, BindingResult bindingResult) {
+        List<String> errMsg= new ArrayList<>();
+        if (bindingResult.hasErrors()) {
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
+        } else {
+            boolean v= sysUserLogsService.saveOrUpdate(sysUserLogs);
+            if(v) {
+                return ResultBody.ok().data(sysUserLogs).msg("保存成功");
+            }
+            else {
+                return ResultBody.failed().msg("保存失败");
+            }
+        }
     }
 
     /**
@@ -77,7 +103,12 @@
     @ApiOperation(value = "删除")
     @DeleteMapping("/{id}")
     public ResultBody delete(@PathVariable Long id) {
-        sysUserLogsService.removeById(id);
-        return ResultBody.ok().msg("删除成功");
+        boolean v= sysUserLogsService.removeById(id);
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            return ResultBody.failed().msg("删除失败");
+        }
     }
 }
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserOrgController.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserOrgController.java
new file mode 100644
index 0000000..2ad67ee
--- /dev/null
+++ b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysUserOrgController.java
@@ -0,0 +1,200 @@
+package com.kidgrow.usercenter.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.kidgrow.common.annotation.LoginUser;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.common.model.SysUserOrg;
+import com.kidgrow.usercenter.model.SysDepartment;
+import com.kidgrow.usercenter.model.SysHospital;
+import com.kidgrow.usercenter.service.ISysOrganizationService;
+import com.kidgrow.usercenter.service.ISysUserOrgService;
+import com.kidgrow.usercenter.service.impl.SysDepartmentServiceImpl;
+import com.kidgrow.usercenter.service.impl.SysHospitalServiceImpl;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping("/sysuserorg")
+@Api(tags = "用户与部门")
+public class SysUserOrgController {
+    @Autowired
+    private ISysUserOrgService sysUserOrgService;
+    @Autowired
+    private ISysOrganizationService sysOrganizationService;
+    @Autowired
+    private SysDepartmentServiceImpl sysDepartmentService;
+    @Autowired
+    private SysHospitalServiceImpl sysHospitalService;
+
+    @PostMapping("getListByMap")
+    public List<SysUserOrg> getListByMap(@RequestParam Map<String, Object> map) {
+        List<SysUserOrg> sysUserOrgs = sysUserOrgService.listByMap(map);
+        return sysUserOrgs;
+    }
+
+    /**
+     * 根据条件查询列表
+     *
+     * @param map
+     * @return
+     */
+    @ApiOperation(value = "根据条件查询列表")
+    @GetMapping
+    public ResultBody listByMap(@RequestParam Map<String, Object> map) {
+        return ResultBody.ok().data(sysUserOrgService.listByMap(map)).msg("查询成功");
+    }
+
+    /**
+     * 新增or更新
+     */
+    @ApiOperation(value = "保存")
+    @PostMapping
+    public ResultBody save(@Valid @RequestBody SysUserOrg sysUserOrg, BindingResult bindingResult, @LoginUser SysUser sysUser) {
+        if (bindingResult.hasErrors()) {
+            return ResultBody.failed().msg(bindingResult.getFieldError().getDefaultMessage());
+        } else {
+            if (sysUserOrg.getUserId() != null) {
+                String createUserOrgCode = "";
+                List<SysOrganization> userOrgData = new ArrayList<>();
+                SysOrganization byId = sysOrganizationService.getById(sysUserOrg.getOrgId());
+                if(byId==null){
+                    return ResultBody.failed().data(null).msg("该组织id异常");
+                }
+                SysOrganization parentId = sysOrganizationService.getById(byId.getOrgParentId());
+                userOrgData.add(parentId);
+                userOrgData.add(byId);
+                if(parentId==null){
+                    return ResultBody.failed().data(null).msg("该组织id异常");
+                }
+                if (userOrgData != null) {
+                    if (userOrgData.size() == 2) {
+                        createUserOrgCode = userOrgData.get(1).getOrgCode();
+                    }
+                }
+                if (!createUserOrgCode.isEmpty()) {
+                    //查出用户的所有组织关系数据
+                    Map<String, Object> map = new HashMap<String, Object>();
+                    map.put("user_id", sysUserOrg.getUserId());
+                    List<SysUserOrg> userOrgList = sysUserOrgService.getListByMap(map);
+                    if (userOrgList.size() > 0) {
+                        for (int i = 0; i < userOrgList.size(); i++) {
+                            if (sysUserOrg.getId().equals(userOrgList.get(i).getId())) {
+                                userOrgList.get(i).setOrgId(sysUserOrg.getOrgId());
+                                userOrgList.get(i).setFromLevel(2);
+
+                                //查询  科室
+                                QueryWrapper queryWrapper = new QueryWrapper();
+                                queryWrapper.eq("org_id", sysUserOrg.getOrgId());
+                                queryWrapper.eq("is_del", 0);
+                                queryWrapper.eq("enabled", 1);
+                                List<SysDepartment> list = sysDepartmentService.list(queryWrapper);
+                                if (!list.isEmpty()) {
+                                    userOrgList.get(i).setFromId(list.get(0).getId());
+                                } else {
+                                    userOrgList.get(i).setFromId(null);
+                                }
+                            } else {
+                                QueryWrapper queryWrapper = new QueryWrapper();
+                                queryWrapper.eq("org_id", sysUserOrg.getUpdateUserId());
+                                queryWrapper.eq("is_del", 0);
+                                queryWrapper.eq("enabled", 1);
+                                List<SysHospital> listHospital = sysHospitalService.list(queryWrapper);
+                                if (!listHospital.isEmpty()) {
+                                    userOrgList.get(i).setFromId(listHospital.get(0).getId());
+                                }
+                                userOrgList.get(i).setFromLevel(1);
+                                userOrgList.get(i).setOrgId(sysUserOrg.getUpdateUserId());
+                            }
+                            userOrgList.get(i).setEnabled(sysUserOrg.getEnabled());
+                            userOrgList.get(i).setCreateUserOrgCode(createUserOrgCode);
+                        }
+                    } else {
+                        userOrgList = new ArrayList<>();
+                        //查出来的上级组织信息建立用户关系
+                        //借用字段承载数据
+                        SysOrganization sysOrganization = sysOrganizationService.getById(sysUserOrg.getUpdateUserId());
+                        if (sysOrganization != null) {
+                            SysUserOrg sysUserOrgTemp = new SysUserOrg();
+                            sysUserOrgTemp.setOrgId(sysOrganization.getId());
+                            sysUserOrgTemp.setUserId(sysUserOrg.getUserId());
+                            sysUserOrgTemp.setEnabled(sysUserOrg.getEnabled());
+                            sysUserOrgTemp.setCreateUserOrgCode(createUserOrgCode);
+                            sysUserOrgTemp.setFromLevel(2);
+
+                            //查询  科室
+                            QueryWrapper queryWrapper = new QueryWrapper();
+                            queryWrapper.eq("org_id", sysUserOrg.getOrgId());
+                            queryWrapper.eq("is_del", 0);
+                            queryWrapper.eq("enabled", 1);
+                            List<SysDepartment> list = sysDepartmentService.list(queryWrapper);
+                            if (!list.isEmpty()) {
+                                sysUserOrgTemp.setFromId(list.get(0).getId());
+                            }
+                            userOrgList.add(sysUserOrgTemp);
+                            //查询 医院
+                            queryWrapper = new QueryWrapper();
+                            queryWrapper.eq("org_id", sysUserOrg.getUpdateUserId());
+                            queryWrapper.eq("is_del", 0);
+                            queryWrapper.eq("enabled", 1);
+                            List<SysHospital> listHospital = sysHospitalService.list(queryWrapper);
+                            if (!listHospital.isEmpty()) {
+                                sysUserOrg.setFromId(listHospital.get(0).getId());
+                            }
+                            sysUserOrg.setFromLevel(1);
+//                            sysUserOrg.setUpdateUserId(0L);
+                            sysUserOrg.setOrgId(sysOrganization.getOrgParentId());
+                            sysUserOrg.setCreateUserOrgCode(createUserOrgCode);
+                            userOrgList.add(sysUserOrg);
+                        } else {
+                            return ResultBody.failed().data(null).msg("该组织的上级组织数据异常!");
+                        }
+                    }
+                    //查询
+                    boolean v = sysUserOrgService.saveOrUpdateBatch(userOrgList);
+                    if (v) {
+                        return ResultBody.ok().data(sysUserOrg).msg("保存成功");
+                    } else {
+                        return ResultBody.failed().data(null).msg("数据保存失败!");
+                    }
+                } else {
+                    return ResultBody.failed().data(null).msg("该组织数据不完整!");
+                }
+            } else {
+                return ResultBody.failed().data(null).msg("该组数据不完整!");
+            }
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除")
+    @DeleteMapping("/{id}")
+    public ResultBody delete(@PathVariable Long id) {
+        sysUserOrgService.removeById(id);
+        return ResultBody.ok().msg("删除成功");
+    }
+
+    /**
+     * 查询
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ResultBody findById(@PathVariable Long id) {
+        SysUserOrg model = sysUserOrgService.getById(id);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+}
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 c4801ad..1a52ffd 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
@@ -10,10 +10,10 @@
   application:
     name: usercenter-server
   datasource:
-    url: jdbc:mysql://${kidgrow.datasource.ip}:3306/user_center?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
+    url: jdbc:mysql://${kidgrow.datasource.ip}:3306/user_center_${spring.profiles.active}?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
     username: ${kidgrow.datasource.username}
     password: ${kidgrow.datasource.password}
-    driver-class-name: com.mysql.jdbc.Driver
+#    driver-class-name: com.mysql.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
     druid:
       aop-patterns: com.kidgrow.usercenter.controller.*,com.kidgrow.usercenter.mapper.*
@@ -55,6 +55,7 @@
   tenant:
     enable: true
     #多租户隔离字段
+
     tenantid: tenant_id
     ignoreTables:
       - sys_user
@@ -63,7 +64,17 @@
       - sys_role
       - sys_menu
       - sys_user_logs
+      - sys_organization
+      - sys_user_org
+      - sys_dictionaries
+      - sys_hospital
+      - sys_doctor
+      - sys_department
+      - sys_area
+      - sys_company
+      - sys_role_organization
     ignoreSqls:
       - com.kidgrow.usercenter.mapper.SysRoleMapper.findAll
+      - com.kidgrow.usercenter.mapper.SysUserMapper.findAppointUsers
 
 
diff --git a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/test/java/com/kidgrow/usercenter/HospitalMapperTest.java b/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/test/java/com/kidgrow/usercenter/HospitalMapperTest.java
deleted file mode 100644
index 74bcbf0..0000000
--- a/kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/test/java/com/kidgrow/usercenter/HospitalMapperTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.kidgrow.usercenter;
-
-import com.kidgrow.usercenter.mapper.SysHospitalMapper;
-import com.kidgrow.usercenter.model.SysHospital;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-/**
- * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
- *
- * @Description: <br>
- * @Project: <br>
- * @CreateDate: Created in 2020/3/10 14:25 <br>
- * @Author: <a href="4345453@kidgrow.com">liuke</a>
- */
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class HospitalMapperTest {
-
-    @Autowired
-    private SysHospitalMapper sysHospitalMapper;
-
-    @Test
-    public void addHospital(){
-        SysHospital sysHospital = new SysHospital();
-
-        sysHospital.setEnabled(1);
-        sysHospital.setHospitalName("喜高医院");
-        sysHospital.setIsDel(0);
-        sysHospital.setTenantId("hospital");
-        sysHospital.setCreateUserId(1);
-        sysHospital.setCreateUserName("admin");
-
-        sysHospitalMapper.insert(sysHospital);
-    }
-}
diff --git a/kidgrow-business/pom.xml b/kidgrow-business/pom.xml
index 765fb98..7fd6f29 100644
--- a/kidgrow-business/pom.xml
+++ b/kidgrow-business/pom.xml
@@ -27,5 +27,6 @@
         <module>kidgrow-mqcenter</module>
         <!--WebSocket中心-->
         <module>kidgrow-websocket-center</module>
+        <module>kidgrow-opration-center</module>
     </modules>
 </project>
\ No newline at end of file
diff --git a/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/properties/RenewProperties.java b/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/properties/RenewProperties.java
index dd4e2e8..5e67d57 100644
--- a/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/properties/RenewProperties.java
+++ b/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/properties/RenewProperties.java
@@ -35,5 +35,5 @@
     /**
      * 续签时间比例,当前剩余时间小于小于过期总时长的50%则续签
      */
-    private Double timeRatio = 0.5;
+    private Double timeRatio = 1D;//0.5
 }
diff --git a/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/service/impl/DefaultPermissionServiceImpl.java b/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/service/impl/DefaultPermissionServiceImpl.java
index 279610d..4f544db 100644
--- a/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/service/impl/DefaultPermissionServiceImpl.java
+++ b/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/service/impl/DefaultPermissionServiceImpl.java
@@ -91,12 +91,43 @@
 //                    break;
 //            }
 //            TenantContextHolder.setTenant(tenantId);
+
             ClientContextHolder.setClient(clientId);
             String roleCodes = grantedAuthorityList.stream().map(SimpleGrantedAuthority::getAuthority).collect(Collectors.joining(", "));
             List<SysMenu> menuList = findMenuByRoleCodes(roleCodes);
+            /*
+             *需求:h端   没有进行配置url的通过,剩下的进行验证
+             *
+             */
+            //根据h端进行验证
+            if("hospital".equals(clientId)){
+                if(!menuList.isEmpty()){
+                    List<String> collect = menuList.stream().map(SysMenu::getUrl).collect(Collectors.toList());
+                    if(collect.contains(requestURI)){
+                        for (SysMenu menu : menuList) {
+                                if (StringUtils.isNotEmpty(menu.getUrl()) && antPathMatcher.match(menu.getUrl(), requestURI)) {
+                                    if (StrUtil.isNotEmpty(menu.getPathMethod())) {
+                                        if(!requestMethod.equalsIgnoreCase(menu.getPathMethod())){
+                                            continue;
+                                        }
+                                        return requestMethod.equalsIgnoreCase(menu.getPathMethod());
+                                    }
+                                }
+                        }
+                    }else {
+                        //不在配置menu集合里面的放行
+                        return true;
+                    }
+                }else{
+                    return true;
+                }
+            }
             for (SysMenu menu : menuList) {
                 if (StringUtils.isNotEmpty(menu.getUrl()) && antPathMatcher.match(menu.getUrl(), requestURI)) {
                     if (StrUtil.isNotEmpty(menu.getPathMethod())) {
+                        if(!requestMethod.equalsIgnoreCase(menu.getPathMethod())){
+                            continue;
+                        }
                         return requestMethod.equalsIgnoreCase(menu.getPathMethod());
                     } else {
                         return true;
diff --git a/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/store/CustomRedisTokenStore.java b/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/store/CustomRedisTokenStore.java
index 0976a50..f47a4a9 100644
--- a/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/store/CustomRedisTokenStore.java
+++ b/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/store/CustomRedisTokenStore.java
@@ -291,12 +291,12 @@
             }
             conn.rPush(clientId, serializedAccessToken);
             if (token.getExpiration() != null) {
-                int seconds = token.getExpiresIn();
-                conn.expire(accessKey, seconds);
-                conn.expire(authKey, seconds);
-                conn.expire(authToAccessKey, seconds);
-                conn.expire(clientId, seconds);
-                conn.expire(approvalKey, seconds);
+//                int seconds = token.getExpiresIn();
+//                conn.expire(accessKey, seconds);
+//                conn.expire(authKey, seconds);
+//                conn.expire(authToAccessKey, seconds);
+//                conn.expire(clientId, seconds);
+//                conn.expire(approvalKey, seconds);
             }
             //关闭Token刷新
 //            OAuth2RefreshToken refreshToken = token.getRefreshToken();
diff --git a/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/util/AuthUtils.java b/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/util/AuthUtils.java
index 176a9fa..426b1ec 100644
--- a/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/util/AuthUtils.java
+++ b/kidgrow-commons/kidgrow-authclient-spring-boot-starter/src/main/java/com/kidgrow/authclient/util/AuthUtils.java
@@ -2,14 +2,13 @@
 
 import com.kidgrow.common.constant.CommonConstant;
 import com.kidgrow.common.model.SysUser;
+import com.kidgrow.common.utils.AesUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.oauth2.common.OAuth2AccessToken;
 import org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException;
 
 import javax.servlet.http.HttpServletRequest;
-import java.nio.charset.StandardCharsets;
-import java.util.Base64;
 import java.util.Enumeration;
 
 /**
@@ -82,9 +81,12 @@
      * @param header header中的参数
      */
     public static String[] extractHeaderClient(String header) {
-        byte[] base64Client = header.substring(BASIC_.length()).getBytes(StandardCharsets.UTF_8);
-        byte[] decoded = Base64.getDecoder().decode(base64Client);
-        String clientStr = new String(decoded, StandardCharsets.UTF_8);
+        String clientStr = null;
+        try{
+            clientStr =  AesUtils.desEncrypt(header.substring(BASIC_.length()));
+        }catch(Exception w){
+            log.error("Header解密失败", w);
+        }
         String[] clientArr = clientStr.split(":");
         if (clientArr.length != 2) {
             throw new RuntimeException("Invalid basic authentication token");
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/Dockerfile b/kidgrow-commons/kidgrow-common-spring-boot-starter/Dockerfile
new file mode 100644
index 0000000..fef5f1e
--- /dev/null
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/pom.xml b/kidgrow-commons/kidgrow-common-spring-boot-starter/pom.xml
index a5c8617..778c34d 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/pom.xml
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/pom.xml
@@ -18,10 +18,10 @@
             <groupId>com.kidgrow</groupId>
             <artifactId>kidgrow-log-spring-boot-starter</artifactId>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>com.kidgrow</groupId>-->
-<!--            <artifactId>kidgrow-swagger2-spring-boot-starter</artifactId>-->
-<!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>com.kidgrow</groupId>-->
+        <!--            <artifactId>kidgrow-swagger2-spring-boot-starter</artifactId>-->
+        <!--        </dependency>-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-aop</artifactId>
@@ -114,7 +114,12 @@
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-openfeign</artifactId>
-<!--            <optional>true</optional>-->
+            <!--            <optional>true</optional>-->
+        </dependency>
+        <dependency>
+            <groupId>io.github.openfeign</groupId>
+            <artifactId>feign-okhttp</artifactId>
+            <version>10.1.0</version>
         </dependency>
         <!-- hystrix断路器 -->
         <dependency>
@@ -132,9 +137,53 @@
             <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
         </dependency>
         <!-- 消息总线rabbitMQ -->
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.cloud</groupId>-->
+<!--            <artifactId>spring-cloud-starter-bus-amqp</artifactId>-->
+<!--        </dependency>-->
+        <!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
         <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.4.0</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.4.0</version>
         </dependency>
     </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <!--跳过项目运行测试用例-->
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/annotation/DateValidator.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/annotation/DateValidator.java
new file mode 100644
index 0000000..85c607d
--- /dev/null
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/annotation/DateValidator.java
@@ -0,0 +1,52 @@
+package com.kidgrow.common.annotation;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/4/3 11:40 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+
+import com.kidgrow.common.utils.KidgrowDateValidator;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.*;
+
+@Documented
+// 指定该注解可以使用的地方
+@Target(value = {ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+// 指定实际进行校验的校验器,该校验器是自己写的且必须实现ConstraintValidator接口
+@Constraint(validatedBy = KidgrowDateValidator.class)
+public @interface DateValidator {
+    /**
+     * 时间不早于
+     * @return
+     */
+    String minDate() default "";
+
+    /**
+     * 时间不晚于
+     * @return
+     */
+    String maxDate() default "";
+
+    /**
+     * 时间格式定义
+     * @return
+     */
+    String pattern() default "yyyy-MM-dd";
+
+    /**
+     * 没加default给定默认值,使用注解的时候该属性必须赋值,否则报错
+     * @return
+     */
+    String message();
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+}
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/BaseConstants.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/BaseConstants.java
index 31ef395..3ab81b2 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/BaseConstants.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/BaseConstants.java
@@ -92,5 +92,10 @@
      * 动态数据库名前缀。  每个项目配置死的
      */
     public static final String DATABASE_NAME = "database_name";
+
+    /**
+     * 手机验证正则表达式
+     */
+    public static final String PHONE_REGEXP="/^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$/";
 }
 
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/CommonConstant.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/CommonConstant.java
index fd76c6f..1ae6ce1 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/CommonConstant.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/CommonConstant.java
@@ -35,6 +35,10 @@
      * 客户端IP
      */
     String USER_AGENT_IP="user_agent_ip";
+    /**
+     * 客户端屏幕分辨率
+     */
+    String USER_AGENT_SYSTEM_SCREEN="user_agent_system_screen";
 
     /**
      * 标签 header key
@@ -99,8 +103,11 @@
     /**
      * 超级管理员用户名
      */
-    String ADMIN_USER_NAME = "admin";
-
+    String ADMIN_USER_NAME = "admin-xg";
+    /**
+     * 超级管理的id
+     */
+    Long ADMIN_USER_ID=1000000000000000001L;
     /**
      * 公共日期格式
      */
@@ -110,11 +117,20 @@
     String SIMPLE_MONTH_FORMAT = "yyyyMM";
     String SIMPLE_DATE_FORMAT = "yyyyMMdd";
     String SIMPLE_DATETIME_FORMAT = "yyyyMMddHHmmss";
-
+    /**
+     * 默认密码
+     */
     String DEF_USER_PASSWORD = "123456";
 
     String LOCK_KEY_PREFIX = "LOCK_KEY:";
-
+    /**
+     * H端的 tenantid
+     */
+    String H_TENANT="hospital";
+    /**
+     * H端的 登录用户类型
+     */
+    String H_DOCTOR="doctor";
     /**
      * 租户id参数
      */
@@ -156,7 +172,7 @@
     /**
      * 默认超级管理员账号
      */
-    public final static String ROOT = "admin";
+    public final static String ROOT = "admin-xg";
 
     /**
      * 负载均衡策略-版本号 信息头
@@ -226,4 +242,119 @@
      * 签名结果 KEY
      */
     public static final String SIGN_SIGN_KEY = "sign";
+    /**
+     * logo缩略图默认宽
+     */
+    public static final Integer TH_IMG_WIDTH = 300;
+    /**
+     * logo缩略图默认高
+     */
+    public static final Integer TH_IMG_HEIGHT = 150;
+    /**
+     * 生成缩略图需要的图片暂存目录
+     */
+//    public static final String TEMP_IMAGE_PATH="D:/resources/images/";
+    public static final String TEMP_IMAGE_PATH="/root/kidgrow";
+    /**
+     * 普通医生角色ID
+     */
+    public static final Long HOSPITAL_DOCTOR_ID=1268826800663289858L;
+    /**
+     * 普通医生角色code标识`
+     */
+    public static final String HOSPITAL_DOCTOR_CODE="hospital_doctor";
+
+    /**
+     * 管理员医生角色ID
+     */
+    public static final Long HOSPITAL_ADMIN_ID=1238826800663299909L;
+    /**
+     * 管理员医生角色code标识
+     */
+    public static final String HOSPITAL_ADMIN_CODE="hospital_admin";
+
+    /**
+     * 自主注册医院的上级组织id
+     */
+    public static final Long ORG_PARENT_ID=15321234561L;
+
+    /**
+     * 自主注册的用户默认给的产品id
+     */
+    public static final Long REG_USER_PRODUCT_ID=1000000000000000001L;
+    /**
+     * 自主注册的用户合同时长 天
+     */
+    public static final Integer REG_USER_CONTRACT_DAY=15;
+    /**
+     * 自主注册的用户合同名
+     */
+    public static final String REG_USER_CONTRACT_NAME="注册用户免费合同";
+    /**
+     * 自主注册的创建人id
+     */
+    public static final Long CREATE_USER_ID= 0L;
+    /**
+     * 自主注册的创建人名称
+     */
+    public static final String CREATE_USER_NAME= "自动创建";
+    /**
+     * 管理员角色code标识
+     */
+    public static final String SYSTEM_ADMIN_ROLE_CODE="admin";
+    /**
+     * 自主注册的销售服务人员id
+     */
+    public static final Long SALE_USER_ID= 1289806543902457857L;
+    /**
+     * 自主注册的运营人员id
+     */
+    public static final Long OPRATION_USER_ID= 1289806733313032193L;
+
+    /**
+     * 销售主管角色code标识
+     */
+    public static final String SALE_MANAGER_ROLE_CODE="salemanager";
+    /**
+     * 用于标识存储最后一次诊断redis的key,用于防止最后一个读片后无法生成报告
+     */
+    public static final String SAAS_LAST_SERVER="saaslastserver";
+
+    /**
+     * 喜高PC高管角色code标识
+     */
+    public static final String PC_ADMIN_ROLE_CODE="pc_admin";
+    /**
+     * 喜高运营高管角色code标识
+     */
+    public static final String OPRATIONMANAGER_ROLE_CODE="oprationmanager";
+
+    /**
+     * 集团组织级别
+     */
+    public static final Integer SYSTEM_ORG_TOP_CODE=0;
+    /**
+     * 公司/医院组织级别
+     */
+    public static final Integer SYSTEM_ORG_HOS_LEVEL=1;
+    /**
+     * 科室部门组织级别
+     */
+    public static final Integer SYSTEM_ORG_DEP_LEVEL=2;
+    /**
+     * 医生类型 C+H
+     */
+    public static final Integer CH_DOCTOR_TYPE=0;
+    /**
+     * 医生类型 H
+     */
+    public static final Integer H_DOCTOR_TYPE=1;
+    /**
+     * 医生类型 C
+     */
+    public static final Integer C_DOCTOR_TYPE=2;
+    /**
+     * 一个科室能最大试用多少次
+     */
+    public static final Integer MAX_FREE_COUNT=5;
 }
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ConsumptionConstant.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ConsumptionConstant.java
new file mode 100644
index 0000000..7767134
--- /dev/null
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ConsumptionConstant.java
@@ -0,0 +1,86 @@
+package com.kidgrow.common.constant;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 全局公共常量<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/06/23 16:24 <br>
+ * @Author: <a href="4345453@kidgrow.com">houruijun</a>
+ **/
+public interface ConsumptionConstant {
+//记录类型
+//1:预扣费
+//2:退预扣费(需要关联预扣费编号)
+//3:退扣费(需要关联扣费编号)
+//4:扣费(需要关联预扣费编号)
+    /**
+     * 预扣费业务标识
+     */
+    int BEFORE_DEDUCTION = 1;
+    /**
+     * 退还预扣费业务标识
+     */
+    int RETURN_BEFORE_DEDUCTION = 2;
+    /**
+     * 扣费业务标识
+     */
+    int DEDUCTION = 4;
+    /**
+     * 退扣费业务标识
+     */
+    int RETURN_DEDUCTION = 3;
+
+//    业务返回结果
+//    bcode                 含义
+//---------------------------------
+//100                 余额充足
+//101                 余额不足
+//200                 已经预扣
+//201                 已经扣费
+//300                 退还预扣
+//301                 退还扣费
+//400                 业务执行出错
+//401                 参数为空异常
+//402                 业务失败
+    /**
+     * 余额充足
+     */
+    int BUSINESS_CODE_OK = 100;
+    /**
+     * 余额不足
+     */
+    int BUSINESS_CODE_FAIL = 101;
+    /**
+     * 已经预扣
+     */
+    int BUSINESS_CODE_IS_BEFORE_DEDUCTION = 200;
+    /**
+     * 已经扣费
+     */
+    int BUSINESS_CODE_IS_DEDUCTION = 201;
+    /**
+     * 退还预扣
+     */
+    int BUSINESS_CODE_RETURN_BEFORE_DEDUCTION = 300;
+    /**
+     * 退还扣
+     */
+    int BUSINESS_CODE_RETURN_DEDUCTION = 301;
+    /**
+     * 业务出错
+     */
+    int BUSINESS_CODE_ERROR = 400;
+    /**
+     * 参数为空异常
+     */
+    int BUSINESS_CODE_PARAMS_ERROR = 401;
+    /**
+     * 业务失败
+     */
+    int BUSINESS_RUN_FAIL = 402;
+
+    //MQ相关
+    String EXCHANGE_DATA="BICenter";
+    String ROUTINGKEY_DATA="kidgrow2033_";
+}
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/DictionariesConstants.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/DictionariesConstants.java
new file mode 100644
index 0000000..abd7fed
--- /dev/null
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/DictionariesConstants.java
@@ -0,0 +1,28 @@
+package com.kidgrow.common.constant;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 分类字典key值对定值 自行确保表内唯一<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/4/15 16:16 <br>
+ * @Author: <a href="411269194@kidgrow.com">hrj</a>
+ */
+public interface DictionariesConstants {
+    /**
+     * 医院分类
+     */
+    String HOSPITAL_TYPE = "HOSPITAL_TYPE";
+    /**
+     * 医院资质
+     */
+    String HOSPITAL_QUALIFIED = "HOSPITAL_QUALIFIED";
+    /**
+     * 医生职称分类名称
+     */
+    String DOCTOR_RANK = "DOCTOR_RANK";
+    /**
+     * 最高组织ID
+     */
+    Long ORG_PARENT_ID=15321234561L;
+}
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 e233512..a19375d 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
@@ -18,6 +18,10 @@
      * 用户信息头
      */
     String USER_HEADER = "x-user-header";
+    /**
+     * 医生id
+     */
+    String DOCTOR_ID_HEADER = "x-doctor-id-header";
 
     /**
      * 用户id信息头
@@ -25,6 +29,38 @@
     String USER_ID_HEADER = "x-userid-header";
 
     /**
+     * 用户所属组织
+     */
+    String USER_ORGS_HEADER="x-user-orgs-header";
+    /**
+     * 用户所属组织ID
+     */
+    String USER_ORG_ID_HEADER="x-user-org-id-header";
+
+    /**
+     * 用户所属组织名称
+     */
+    String USER_ORG_NAME_HEADER="x-user-org-name-header";
+
+    /**
+     * 用户医院id
+     */
+    String USER_HOSPITAL_ID_HEADER="x-user_hospital_id_header";
+
+    /**
+     * 用户所属部门ID
+     */
+    String USER_DEP_ID_HEADER="x-user-dep-id-header";
+
+    /**
+     * 用户所属部门名称
+     */
+    String USER_DEP_NAME_HEADER="x-user-dep-name-header";
+    /**
+     * 用户真实名信息头
+     */
+    String USER_REAL_NAME = "x-user-real-name-header";
+    /**
      * 角色信息头
      */
     String ROLE_HEADER = "x-role-header";
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ServiceNameConstants.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ServiceNameConstants.java
index bd604d7..5eb2550 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ServiceNameConstants.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/constant/ServiceNameConstants.java
@@ -14,6 +14,10 @@
      */
     String USER_SERVICE = "usercenter-server";
     /**
+     * 运营中心服务
+     */
+    String OPRATION_SERVER="oprationcenter-server";
+    /**
      * 搜索中心服务
      */
     String SEARCH_SERVICE = "searchcenter-server";
@@ -22,11 +26,45 @@
     /**
      * 商品Demo服务名
      */
-    String DEMO_PRODUCT_SERVICE="demo-product-server";
+    String DEMO_PRODUCT_SERVICE = "demo-product-server";
 
 
     /**
      * 订单Demo服务名
      */
-    String DEMO_ORDER_SERVICE="demo-order-server";
+    String DEMO_ORDER_SERVICE = "demo-order-server";
+    /**
+     * 诊断数据服务
+     */
+    String RECORD_CENTER_SERVICE = "recordcenter-server";
+    /**
+     * 短信服务名
+     */
+    String SMS_SERVICE_SERVER = "sms-service-server";
+    /**
+     * 文件服务名
+     */
+    String FILE_CENTER_SERVER="filecenter-server";
+
+
+    /**
+     * SmartBox服务名
+     */
+    String SMARTBOX_SERVER="smartbox-server";
+
+    /**
+     * 报告中心服务名
+     */
+    String REPORT_SERVER="report-server";
+
+    /**
+     * BI分析中心服务名
+     */
+    String BICENTER_SERVER="bicenter-server";
+
+    /**
+     * 骨龄评价中心服务名
+     */
+    String BONEAGE_EVALUATION_SERVER="boneage-evaluationcenter-server";
+
 }
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/BaseSupperModel.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/BaseSupperModel.java
new file mode 100644
index 0000000..2264493
--- /dev/null
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/BaseSupperModel.java
@@ -0,0 +1,65 @@
+package com.kidgrow.common.model;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 实体父类<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/4/7 16:28 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+public class BaseSupperModel <T extends Model<?>> extends Model<T>{
+    /**
+     * 主键ID,雪花算法类型
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableId(type = IdType.ASSIGN_UUID)
+    private String id;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(fill = FieldFill.INSERT)
+    private long createUserId;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String createUserName;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private long updateUserId;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateUserName;
+
+//    @TableField(fill = FieldFill.INSERT)
+//    private String createUserOrgCode;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+}
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/DoctorUserAll.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/DoctorUserAll.java
new file mode 100644
index 0000000..f9a1fe3
--- /dev/null
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/DoctorUserAll.java
@@ -0,0 +1,191 @@
+package com.kidgrow.common.model;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/06/04 13:54 <br>
+ * @Author: <a href="411269194@kidgrow.com">houruijun</a>
+ */
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class DoctorUserAll extends Model<DoctorUserAll> {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 医生姓名
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long doctorId;
+    /**
+     * 医生姓名
+     */
+    private String doctorName;
+    /**
+     * 医生的头像
+     */
+    private String doctorLogo;
+    /**
+     * 资质证书
+     */
+    private String doctorCcie;
+    /**
+     * 医生联系方式
+     */
+    private String doctorTel;
+    /**
+     * 职称
+     */
+    private String doctorRank;
+    /**
+     * 医生的email
+     */
+    private String doctorEmail;
+    /**
+     * 是否医答医生 0否1是
+     */
+    private Boolean docanswer;
+    /**
+     * 是否签约医生 0否1是
+     */
+    private Boolean docsign;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    private Boolean docdel;
+    /**
+     * 是否管理员 0否 1是
+     */
+    private Boolean isAdminUser;
+    /**
+     * 医生状态 1正常 0试用
+     */
+    private Boolean doctorState;
+    /**
+     * 启用禁用状态,1启用,0停用
+     */
+    private Boolean docenabled;
+
+
+    /**
+     * 医院id
+     */
+    private String hospitalId;
+    /**
+     * 医院名称 同组织名字
+     */
+    private String hospitalName;
+    /**
+     * 医院简称
+     */
+    private String hospitalShortName;
+    /**
+     * 医院编码
+     */
+    private String hospitalCode;
+    /**
+     * 医院类型 社区/儿保等等之类
+     */
+    private String hospitalTypeName;
+    /**
+     * 医院电话
+     */
+    private String hospitalTel;
+    /**
+     * 医院所在省
+     */
+    private String hospitalProvince;
+    /**
+     * 医院所在城
+     */
+    private String hospitalCity;
+    /**
+     * 医院所在地区
+     */
+    private String hospitalArea;
+    /**
+     * 区号
+     */
+    private String areaCode;
+    /**
+     * 资质(三甲医院)
+     */
+    private String hospitalQualifiedName;
+    /**
+     * 医院logo  缩略图
+     */
+    private String hospitalLitLogo;
+    /**
+     * 医院logo 原图
+     */
+    private String hospitalLogo;
+    /**
+     * 是否筛查医院 1是0否
+     */
+    private Boolean hosisscreen;
+    /**
+     * 是否筛查医院 1是0否
+     */
+    private Boolean hosisanswer;
+    /**
+     * 服务状态 0试用 1正式
+     */
+    private Integer hospitalState;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean hosenabled;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    private Boolean hosdel;
+    /**
+     * 帐号数量,默认6
+     */
+    private Integer accountsCount;
+
+    /**
+     * 科室/部门名称 同组织名称
+     */
+    private String departmentId;
+
+    /**
+     * 科室/部门名称 同组织名称
+     */
+    private String departmentName;
+    /**
+     * 销售代表的名字
+     */
+    private String serverUserName;
+    /**
+     * 销售代表电话
+     */
+    private String serverUserTel;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean depenabled;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    private Boolean depdel;
+    /**
+     * 销售代表的名字
+     */
+    private String saleUserName;
+    /**
+     * 销售代表电话
+     */
+    private String saleUserTel;
+}
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/LoginAppUser.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/LoginAppUser.java
index a08aa89..1d7d6d3 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/LoginAppUser.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/LoginAppUser.java
@@ -64,5 +64,9 @@
     public String getUserId() {
         return getOpenId();
     }
+//    @Override
+//    public List<SysOrganization> getOrganizations() {
+//        return getOrganizations();
+//    }
 }
 
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/PageResult.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/PageResult.java
index c7eeb59..563876f 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/PageResult.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/PageResult.java
@@ -7,6 +7,7 @@
 
 import java.io.Serializable;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -35,4 +36,21 @@
      * 当前页结果集
      */
     private List<T> data;
+
+    /**
+     * 接口请求参数,自定义返回
+     */
+    private Map<String,Object> map;
+    /**
+     * 访问当前页码
+     */
+    private Long page;
+    /**
+     * 页码容量
+     */
+    private Long limit;
+    /**
+     * 返回数据量
+     */
+    private Long pageCount;
 }
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SuperEntity.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SuperEntity.java
index 4bf3189..21c60c7 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SuperEntity.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SuperEntity.java
@@ -22,7 +22,8 @@
  * @Author: <a href="4345453@kidgrow.com">liuke</a>
  */
 @Data
-public class SuperEntity<T extends Model<?>> extends Model<T> {
+public class SuperEntity<T extends Model<?>> extends Model<T>  {
+
     /**
      * 主键ID,防止Long类型四舍五入
      */
@@ -54,6 +55,9 @@
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private String updateUserName;
 
+//    @TableField(fill = FieldFill.INSERT)
+//    private String createUserOrgCode;
+
     @Override
     protected Serializable pkVal() {
         return this.id;
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SuperModel.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SuperModel.java
index 5ab461a..3fa02ac 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SuperModel.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SuperModel.java
@@ -24,6 +24,8 @@
  */
 @Data
 public class SuperModel<T extends Model<?>> extends Model<T>{
+
+
     /**
      * 主键ID,雪花算法类型
      */
@@ -55,6 +57,9 @@
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private String updateUserName;
 
+//    @TableField(fill = FieldFill.INSERT)
+//    private String createUserOrgCode;
+
     @Override
     protected Serializable pkVal() {
         return this.id;
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysDoctor.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysDoctor.java
new file mode 100644
index 0000000..b2c50e4
--- /dev/null
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysDoctor.java
@@ -0,0 +1,131 @@
+package com.kidgrow.common.model;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © 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>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_doctor")
+public class SysDoctor extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 关联的登录帐号ID
+     */
+    private Long userId;
+    /**
+     * 所属医院ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "所属医院ID不能为空")
+    private Long hospitalId;
+    /**
+     * 医院名称
+     */
+    @NotEmpty(message = "医院名称不能为空")
+    private String hospitalName;
+    /**
+     * 科室ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long departmentId;
+    /**
+     * 科室名称
+     */
+    private String departmentName;
+    /**
+     * 医生姓名
+     */
+    @NotEmpty(message = "医生姓名不能为空")
+    private String doctorName;
+    /**
+     * 医生的头像
+     */
+    private String doctorLogo;
+    /**
+     * 医生联系方式
+     */
+    @NotEmpty(message = "医生联系方式不能为空")
+    private String doctorTel;
+    /**
+     * 职称ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long doctorRankId;
+    /**
+     * 职称
+     */
+    private String doctorRank;
+    /**
+     * 医生其它联系方式
+     */
+    private String doctorOtherLink;
+    /**
+     * 医生的email
+     */
+    private String doctorEmail;
+    /**
+     * 医生简介
+     */
+    private String doctorAbout;
+    /**
+     * 是否医答医生 0否1是
+     */
+    private Boolean isAnswer;
+    /**
+     * 是否签约医生 0否1是
+     */
+    private Boolean isSigning;
+    /**
+     * 是否置顶 0否1是
+     */
+    private Boolean isTop;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    @TableLogic
+    private Boolean isDel;
+    /**
+     * 医生状态 1正常 0试用
+     */
+    @NotNull(message = "医生状态 1正常 0试用不能为空")
+    private Boolean doctorState;
+    /**
+     * 启用禁用状态,1启用,0停用
+     */
+    private Boolean enabled;
+
+    /**
+     * 销售代表的id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long serverUserId;
+    /**
+     * 销售代表名称
+     */
+    private String serverUserName;
+    /**
+     * 创建者的部门
+     */
+    private String createUserOrgCode;
+}
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysOrganization.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysOrganization.java
new file mode 100644
index 0000000..bb44a24
--- /dev/null
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysOrganization.java
@@ -0,0 +1,70 @@
+package com.kidgrow.common.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotBlank;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 组织架构表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-03-31 11:01:35 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_organization")
+public class SysOrganization extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 节点级别取值 0-9
+     */
+    @NotNull(message = "节点级别取值 0-9不能为空")
+    private Integer orgLevel;
+    /**
+     * 节点属性(集团/公司/部门等,取值0,1,2,3,4)
+     */
+    private Integer orgAttr;
+    /**
+     * 上级组织ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgParentId;
+    /**
+     * 组织名称
+     */
+    @NotBlank(message = "组织名称不能为空")
+    private String orgName;
+    /**
+     * 排序
+     */
+    private Integer orgOrder;
+    /**
+     * 部门的code
+     */
+    private String orgCode;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    private Boolean isDel;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    private String createUserOrgCode;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean enabled;
+}
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysRole.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysRole.java
index 43d0f14..da1b7d8 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysRole.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysRole.java
@@ -30,4 +30,5 @@
     @JsonSerialize(using = ToStringSerializer.class)
     @TableField(exist = false)
     private Long userId;
+    private Integer type;
 }
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysUser.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysUser.java
index f10954c..8380373 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysUser.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysUser.java
@@ -32,7 +32,11 @@
     private String openId;
     @TableLogic
     private boolean isDel;
-
+    //是否默认密码
+    private Boolean defaultAuth;
+    //是否医院管理
+    @TableField(exist = false)
+    private boolean isHAdminUser;
     private String tenantId;
 
     @TableField(exist = false)
@@ -43,4 +47,8 @@
     private String oldPassword;
     @TableField(exist = false)
     private String newPassword;
+    @TableField(exist = false)
+    private List<SysOrganization> organizations;
+    @TableField(exist = false)
+    private DoctorUserAll doctorUserAllVO;
 }
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysUserOrg.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysUserOrg.java
new file mode 100644
index 0000000..c51622b
--- /dev/null
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysUserOrg.java
@@ -0,0 +1,67 @@
+package com.kidgrow.common.model;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @version 1.0
+ * @Description: 用户和组织关系表<br>
+ * @Project: 用户中心<br>
+ * @CreateDate: Created in 2020-03-31 11:01:35 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_user_org")
+public class SysUserOrg extends SuperModel {
+//    private static final long serialVersionUID = -2071565876962058344L;
+
+    /**
+     * 用户id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "用户id不能为空")
+    private Long userId;
+    /**
+     * 组织ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "组织ID不能为空")
+    private Long orgId;
+    /**
+     * 医院/科室表里面的id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "医院/科室表里面的id")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Long fromId;
+    /**
+     * 组织级别 0集团 1医院公司 2科室部门
+     */
+    private Integer fromLevel;
+    /**
+     * 数据权限code
+     */
+    private String createUserOrgCode;
+    /**
+     * 状态,1启用,0停用
+     */
+    private Boolean enabled;
+    /**
+     * 是否删除,1删除,0未删除
+     */
+    private Boolean isDel;
+}
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/UserType.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/UserType.java
index 6d8fdfc..186e5fb 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/UserType.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/UserType.java
@@ -28,6 +28,10 @@
     /**
      * 泊车管理运营平台用户
      */
-    PARKING_OPERATE
+    PARKING_OPERATE,
+    /**
+     * 医生
+     */
+    DOCTOR
 
 }
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/resolver/TokenArgumentResolver.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/resolver/TokenArgumentResolver.java
index c37a0d4..0cad4b3 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/resolver/TokenArgumentResolver.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/resolver/TokenArgumentResolver.java
@@ -1,11 +1,14 @@
 package com.kidgrow.common.resolver;
 
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
 import com.kidgrow.common.annotation.LoginUser;
 import com.kidgrow.common.constant.SecurityConstants;
 import com.kidgrow.common.feign.UserService;
+import com.kidgrow.common.model.SysOrganization;
 import com.kidgrow.common.model.SysRole;
 import com.kidgrow.common.model.SysUser;
+import com.kidgrow.common.utils.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.core.MethodParameter;
 import org.springframework.web.bind.support.WebDataBinderFactory;
@@ -64,6 +67,7 @@
         String userId = request.getHeader(SecurityConstants.USER_ID_HEADER);
         String username = request.getHeader(SecurityConstants.USER_HEADER);
         String roles = request.getHeader(SecurityConstants.ROLE_HEADER);
+        String organizations = request.getHeader(SecurityConstants.USER_ORGS_HEADER);
         if (StrUtil.isBlank(username)) {
             log.warn("resolveArgument error username is empty");
             return null;
@@ -75,14 +79,21 @@
             user = new SysUser();
             user.setId(Long.valueOf(userId));
             user.setUsername(username);
+//            List<SysRole> sysRoleList = new ArrayList<>();
+            if(StringUtils.isNotBlank(roles)){
+                List<SysRole> sysRoles = JSON.parseArray(roles, SysRole.class);
+//                Arrays.stream(roles.split(",")).forEach(role -> {
+//                    SysRole sysRole = new SysRole();
+//                    sysRole.setCode(role);
+//                    sysRoleList.add(sysRole);
+//                });
+                user.setRoles(sysRoles);
+            }
+            if(organizations!=null){
+                List<SysOrganization> sysOrganizations = JSON.parseArray(organizations, SysOrganization.class);
+                user.setOrganizations(sysOrganizations);
+            }
         }
-        List<SysRole> sysRoleList = new ArrayList<>();
-        Arrays.stream(roles.split(",")).forEach(role -> {
-            SysRole sysRole = new SysRole();
-            sysRole.setCode(role);
-            sysRoleList.add(sysRole);
-        });
-        user.setRoles(sysRoleList);
         return user;
     }
 }
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/AesUtils.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/AesUtils.java
new file mode 100644
index 0000000..9f13ad6
--- /dev/null
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/AesUtils.java
@@ -0,0 +1,102 @@
+package com.kidgrow.common.utils;
+
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * @Author: dougang
+ * @Description:
+ * @Date: create in 2020/6/19 10:44
+ */
+public class AesUtils {
+    /**
+     * 十六位密钥
+     */
+    private static final String KEY = "66XiGaoKeJi@COM6";
+    /**
+     * 十六位密钥偏移量
+     */
+    private static final String IV = "123#XIGAO.com456";
+
+    /**
+     * 加密方法
+     *
+     * @param data 要加密的数据
+     * @param key  加密key
+     * @param iv   加密iv
+     * @return 加密的结果
+     * @throws Exception
+     */
+    public static String encrypt(String data, String key, String iv) throws Exception {
+        try {
+
+            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+            int blockSize = cipher.getBlockSize();
+            byte[] dataBytes = data.getBytes();
+            int plaintextLength = dataBytes.length;
+            if (plaintextLength % blockSize != 0) {
+                plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
+            }
+            byte[] plaintext = new byte[plaintextLength];
+            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
+            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
+            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
+            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
+            byte[] encrypted = cipher.doFinal(plaintext);
+            return new Base64().encodeToString(encrypted);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 解密方法
+     *
+     * @param data 要解密的数据
+     * @param key  解密key
+     * @param iv   解密iv
+     * @return 解密的结果
+     * @throws Exception
+     */
+    public static String desEncrypt(String data, String key, String iv) throws Exception {
+        try {
+            byte[] encrypted1 = new Base64().decode(data);
+            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
+            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
+            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
+            byte[] original = cipher.doFinal(encrypted1);
+            String originalString = new String(original).trim();
+            return originalString;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 使用默认的key和iv加密
+     * @param data
+     * @return
+     * @throws Exception
+     */
+    public static String encrypt(String data) throws Exception {
+        return encrypt(data, KEY, IV);
+    }
+
+    /**
+     * 使用默认的key和iv解密
+     *
+     * @param data
+     * @return
+     * @throws Exception
+     */
+    public static String desEncrypt(String data) throws Exception {
+        return desEncrypt(data, KEY, IV);
+    }
+}
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/DateUtils.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/DateUtils.java
index 41f04b5..694b88b 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/DateUtils.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/DateUtils.java
@@ -483,5 +483,15 @@
         System.out.println(formatDate(getAfterDay(new Date()), "yyyy-MM-dd"));
         System.out.println(formatDate(getAfterWeek(new Date()), "yyyy-MM-dd"));
         System.out.println(formatDate(getAfterYear(new Date()), "yyyy-MM-dd"));
+        System.out.println(getSecondsNextEarlyMorning());
+
+    }
+    //(到今晚的秒数)
+    public static Long getSecondsNextEarlyMorning() {
+        Date afterDay = getAfterDay(new Date());
+        String s = formatDate(afterDay, null);
+        Date date = parseDate(s);
+        long second= (date.getTime()-System.currentTimeMillis())/1000;
+        return second;
     }
 }
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/KidgrowDateValidator.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/KidgrowDateValidator.java
new file mode 100644
index 0000000..645d186
--- /dev/null
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/KidgrowDateValidator.java
@@ -0,0 +1,62 @@
+package com.kidgrow.common.utils;
+
+import com.kidgrow.common.annotation.DateValidator;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/4/3 11:41 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class KidgrowDateValidator implements ConstraintValidator<DateValidator, Date> {
+    private DateValidator dateValidator;
+
+    @Override
+    public void initialize(DateValidator constraintAnnotation) {
+        this.dateValidator = constraintAnnotation;
+    }
+
+
+    @Override
+    public boolean isValid(Date value, ConstraintValidatorContext context) {
+        String pattern = dateValidator.pattern();
+        SimpleDateFormat df = new SimpleDateFormat(pattern);
+        String myMinDate = dateValidator.minDate();
+        String myMaxDate = dateValidator.maxDate();
+        // 为空可以放过
+        if (value == null){
+            return true;
+        }
+        try {
+            Date maxDate = null;
+            Date minDate = null;
+            if ("".equals(myMinDate)){
+                // 未设置最小时间
+                maxDate = df.parse(dateValidator.maxDate());
+                // compareTo方法, 1:后者大于前者;-1:后者小于前者;0:两个相同
+                return value.compareTo(maxDate) != 1;
+            } else if ("".equals(myMaxDate)){
+                // 未设置最大时间
+                minDate = df.parse(dateValidator.minDate());
+                return value.compareTo(minDate) >= 0;
+            } else {
+                // 设置了最大时间和最小时间
+                maxDate = df.parse(dateValidator.maxDate());
+                minDate = df.parse(dateValidator.minDate());
+                return value.compareTo(maxDate) != 1 && value.compareTo(minDate) >= 0;
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+
+        return false;
+    }
+}
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/MultipartFileUtils.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/MultipartFileUtils.java
new file mode 100644
index 0000000..e2b6702
--- /dev/null
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/MultipartFileUtils.java
@@ -0,0 +1,61 @@
+package com.kidgrow.common.utils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * MultipartFile转换帮助类
+ */
+public class MultipartFileUtils {
+    /**
+     * MultipartFile 转 File
+     *
+     * @param file
+     * @throws Exception
+     */
+    public static File multipartFileToFile(MultipartFile file) throws Exception {
+
+        File toFile = null;
+        if (file.equals("") || file.getSize() <= 0) {
+            file = null;
+        } else {
+            InputStream ins = null;
+            ins = file.getInputStream();
+            toFile = new File(file.getOriginalFilename());
+            inputStreamToFile(ins, toFile);
+            ins.close();
+        }
+        return toFile;
+    }
+
+    //获取流文件
+    private static void inputStreamToFile(InputStream ins, File file) {
+        try {
+            OutputStream os = new FileOutputStream(file);
+            int bytesRead = 0;
+            byte[] buffer = new byte[8192];
+            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
+                os.write(buffer, 0, bytesRead);
+            }
+            os.close();
+            ins.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 删除本地临时文件
+     *
+     * @param file
+     */
+    public static void delteTempFile(File file) {
+        if (file != null) {
+            File del = new File(file.toURI());
+            del.delete();
+        }
+    }
+}
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/Pinyin4jUtil.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/Pinyin4jUtil.java
new file mode 100644
index 0000000..dfccd2c
--- /dev/null
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/Pinyin4jUtil.java
@@ -0,0 +1,149 @@
+package com.kidgrow.common.utils;
+
+import net.sourceforge.pinyin4j.PinyinHelper;
+import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
+import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
+import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
+import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class Pinyin4jUtil {
+
+    /**
+     * getFirstSpellPinYin:(多音字的时候获取第一个). <br/>
+     * @param src  传入的拼音字符串,以逗号隔开
+     * @param isFullSpell 是否全拼,true:全拼,false:第一个汉字全拼(其它汉字取首字母)
+     * @return 第一个拼音
+     */
+    public static String getFirstSpellPinYin(String src , boolean isFullSpell) {
+        String targetStr = Pinyin4jUtil.makeStringByStringSet(Pinyin4jUtil.getPinyin(src, isFullSpell));
+        String[] split = targetStr.split(",");
+        if (split.length > 1) {
+            targetStr = split[0];
+        }
+        return targetStr;
+    }
+
+    /**
+     * makeStringByStringSet:(拼音字符串集合转换字符串). <br/>
+     * @param stringSet  拼音集合
+     * @return
+     */
+    public static String makeStringByStringSet(Set<String> stringSet) {
+        StringBuilder str = new StringBuilder();
+        int i = 0;
+        if (stringSet.size() > 0) {
+            for (String s : stringSet) {
+                if (i == stringSet.size() - 1) {
+                    str.append(s);
+                } else {
+                    str.append(s);
+                }
+                i++;
+            }
+        }
+        return str.toString().toLowerCase();
+    }
+
+    /**
+     * getPinyin:(获取汉字拼音). <br/>
+     * @param src   汉字
+     * @param isFullSpell  是否全拼,如果为true:全拼,false:首字全拼
+     * @return
+     */
+    public static Set<String> getPinyin(String src, boolean isFullSpell) {
+        if (src != null && !src.trim().equalsIgnoreCase("")) {
+            char[] srcChar;
+            srcChar = src.toCharArray();
+            // 汉语拼音格式输出类
+            HanyuPinyinOutputFormat hanYuPinOutputFormat = new HanyuPinyinOutputFormat();
+
+            // 输出设置,大小写,音标方式等
+            hanYuPinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
+            hanYuPinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
+            hanYuPinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
+
+            String[][] temp = new String[src.length()][];
+            for (int i = 0; i < srcChar.length; i++) {
+                char c = srcChar[i];
+                if (String.valueOf(c).matches("[\\u4E00-\\u9FA5]+")) {//中文
+                    try {
+                        temp[i] = PinyinHelper.toHanyuPinyinStringArray(
+                                srcChar[i], hanYuPinOutputFormat);
+                        if (!isFullSpell) {
+                            if (i == 0) {
+                                temp[i] = temp[i];
+                            } else {
+                                String[] tTemps = new String[temp[i].length];
+                                for (int j = 0; j < temp[i].length; j++) {
+                                    char t = temp[i][j].charAt(0);
+                                    tTemps[j] = Character.toString(t);
+                                }
+                                temp[i] = tTemps;
+                            }
+                        }
+                    } catch (BadHanyuPinyinOutputFormatCombination e) {
+                        e.printStackTrace();
+                    }
+                } else if (((int) c >= 65 && (int) c <= 90)
+                        || ((int) c >= 97 && (int) c <= 122)) {//英文
+                    temp[i] = new String[] { String.valueOf(srcChar[i]) };
+                } else {
+                    temp[i] = new String[] { "" };
+                }
+            }
+            String[] pingyinArray = exchange(temp);
+            Set<String> pinyinSet = new HashSet<String>();
+            for (int i = 0; i < pingyinArray.length; i++) {
+                pinyinSet.add(pingyinArray[i]);
+            }
+            return pinyinSet;
+        }
+        return null;
+    }
+
+    /**
+     * 递归
+     * @param strJaggedArray
+     * @return
+     */
+    public static String[] exchange(String[][] strJaggedArray) {
+        String[][] temp = doExchange(strJaggedArray);
+        return temp[0];
+    }
+
+    /**
+     * 递归
+     * @param strJaggedArray
+     * @return
+     */
+    private static String[][] doExchange(String[][] strJaggedArray) {
+        int len = strJaggedArray.length;
+        if (len >= 2) {
+            int len1 = strJaggedArray[0].length;
+            int len2 = strJaggedArray[1].length;
+            int newlen = len1 * len2;
+            String[] temp = new String[newlen];
+            int Index = 0;
+            for (int i = 0; i < len1; i++) {
+                for (int j = 0; j < len2; j++) {
+                    temp[Index] = strJaggedArray[0][i] + strJaggedArray[1][j];
+                    Index++;
+                }
+            }
+            String[][] newArray = new String[len - 1][];
+            for (int i = 2; i < len; i++) {
+                newArray[i - 1] = strJaggedArray[i];
+            }
+            newArray[0] = temp;
+            return doExchange(newArray);
+        } else {
+            return strJaggedArray;
+        }
+    }
+
+
+}
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/QRCodeUtil.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/QRCodeUtil.java
new file mode 100644
index 0000000..29762ba
--- /dev/null
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/QRCodeUtil.java
@@ -0,0 +1,138 @@
+package com.kidgrow.common.utils;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.WriterException;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import sun.misc.BASE64Encoder;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Hashtable;
+
+import static com.google.zxing.client.j2se.MatrixToImageConfig.BLACK;
+import static com.google.zxing.client.j2se.MatrixToImageConfig.WHITE;
+
+/**
+ * @Author: dougang
+ * @Description:
+ * @Date: create in 2020/6/19 10:02
+ */
+public class QRCodeUtil {
+
+    /**
+     * 生成二维码
+     *
+     * @param contents
+     * @param width
+     * @param height
+     * @param level    0:M,1:L,2:H,3:Q
+     * @return
+     */
+    public static String creatRrCode(String contents, int width, int height, int level) {
+        String binary = null;
+        Hashtable hints = new Hashtable();
+        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
+        switch (level) {
+            case 0:
+                hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
+                break;
+            case 1:
+                hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
+                break;
+            case 2:
+                hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
+                break;
+            case 3:
+                hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);
+                break;
+            default:
+                break;
+        }
+
+        try {
+            BitMatrix bitMatrix = new MultiFormatWriter().encode(
+                    contents, BarcodeFormat.QR_CODE, width, height, hints);
+            // 读取文件转换为字节数组
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+            BufferedImage image = toBufferedImage(bitMatrix);
+            //切白边
+            image = deleteWhite(bitMatrix);
+
+            //转换成png格式的IO流
+            ImageIO.write(image, "png", out);
+            byte[] bytes = out.toByteArray();
+
+            // 将字节数组转为二进制
+            BASE64Encoder encoder = new BASE64Encoder();
+            binary = "data:image/png;base64," + encoder.encodeBuffer(bytes).trim();
+        } catch (WriterException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return binary;
+    }
+
+    /**
+     * image流数据处理
+     *
+     * @author ianly
+     */
+    private static BufferedImage toBufferedImage(BitMatrix matrix) {
+        int width = matrix.getWidth();
+        int height = matrix.getHeight();
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                image.setRGB(x, y, matrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
+            }
+        }
+
+        return image;
+    }
+
+    /**
+     * 切白边
+     *
+     * @param matrix
+     * @return
+     */
+    private static BufferedImage deleteWhite(BitMatrix matrix) {
+        int[] rec = matrix.getEnclosingRectangle();
+        int resWidth = rec[2] + 1;
+        int resHeight = rec[3] + 1;
+
+        BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
+        resMatrix.clear();
+        for (int i = 0; i < resWidth; i++) {
+            for (int j = 0; j < resHeight; j++) {
+                if (matrix.get(i + rec[0], j + rec[1]))
+                    resMatrix.set(i, j);
+            }
+        }
+
+        int width = resMatrix.getWidth();
+        int height = resMatrix.getHeight();
+        BufferedImage image = new BufferedImage(width, height,
+                BufferedImage.TYPE_INT_RGB);
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                image.setRGB(x, y, resMatrix.get(x, y) ? BLACK : WHITE);
+            }
+        }
+        return image;
+    }
+
+    public static void main(String[] args) {
+        String binary = QRCodeUtil.creatRrCode("http://192.168.2.146:8089/upload/saasmobile.html?hospitolId=1&departmentId=1&doctorId=1278159153159888898&childid=3001&diagnosticId=300101&puuid=dbd8b1c0-bdc5-11ea-b37d-1b33e9f3fd18", 200, 200, 2);
+        System.out.println(binary);
+    }
+}
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/RandomValueUtils.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/RandomValueUtils.java
index 5b3f464..8f23665 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/RandomValueUtils.java
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/RandomValueUtils.java
@@ -157,5 +157,20 @@
         return no;
     }
 
+    /**
+     * 获取指定长度的随机数
+     * @param len
+     * @return
+     */
+    public static String getRandom(int len) {
+        String source = "0123456789";
+        Random r = new Random();
+        StringBuilder rs = new StringBuilder();
+        for (int j = 0; j < len; j++) {
+            rs.append(source.charAt(r.nextInt(10)));
+        }
+        return rs.toString();
+    }
+
 }
 
diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/resources/error.properties b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/resources/error.properties
index 0105e19..9872fad 100644
--- a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/resources/error.properties
+++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/resources/error.properties
@@ -19,4 +19,5 @@
 access_denied_updating=\u6B63\u5728\u5347\u7EA7\u7EF4\u62A4\u4E2D,\u8BF7\u7A0D\u540E\u518D\u8BD5!
 access_denied_disabled=\u8BF7\u6C42\u5730\u5740,\u7981\u6B62\u8BBF\u95EE!
 access_denied_not_open=\u8BF7\u6C42\u5730\u5740,\u62D2\u7EDD\u8BBF\u95EE!
-invalid_=\u65E0\u6548\u7684\u8BBF\u95EE\u4EE4\u724C
\ No newline at end of file
+invalid_=\u65E0\u6548\u7684\u8BBF\u95EE\u4EE4\u724C
+gateway_timeout=\u7F51\u5173\u8D85\u65F6\uFF01
diff --git a/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/DateMetaObjectHandler.java b/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/DateMetaObjectHandler.java
index 9f50db7..d24ee5c 100644
--- a/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/DateMetaObjectHandler.java
+++ b/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/DateMetaObjectHandler.java
@@ -1,12 +1,15 @@
 package com.kidgrow.db.config;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import com.kidgrow.common.constant.SecurityConstants;
+import com.kidgrow.common.model.SysOrganization;
 import org.apache.ibatis.reflection.MetaObject;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -23,10 +26,11 @@
 
     private final static String UPDATE_TIME = "updateTime";
     private final static String CREATE_TIME = "createTime";
-    private final static String CREATE_USER_ID="createUserId";
-    private final static String UPDATE_USER_ID="updateUserId";
-    private final static String CREATE_USER_NAME="createUserName";
-    private final static String UPDATE_USER_NAME="updateUserName";
+    private final static String CREATE_USER_ID = "createUserId";
+    private final static String UPDATE_USER_ID = "updateUserId";
+    private final static String CREATE_USER_NAME = "createUserName";
+    private final static String UPDATE_USER_NAME = "updateUserName";
+//    private final static String CREATE_USER_ORG_CODE = "createUserOrgCode";
 
     /**
      * 插入填充,字段为空自动填充
@@ -39,20 +43,28 @@
         Object updateUserId = getFieldValByName(UPDATE_USER_ID, metaObject);
         Object createUserName = getFieldValByName(CREATE_USER_NAME, metaObject);
         Object updateUserName = getFieldValByName(UPDATE_USER_NAME, metaObject);
-        if (createTime == null || updateTime == null || createUserId==null || updateUserId==null || createUserName==null || updateUserName==null) {
+//        Object createUserOrgCode = getFieldValByName(CREATE_USER_ORG_CODE, metaObject);
+        if (createTime == null || updateTime == null || createUserId == null || updateUserId == null || createUserName == null || updateUserName == null ) {
             Date date = new Date();
             if (createTime == null) {
                 setFieldValByName(CREATE_TIME, date, metaObject);
             }
 
-            if(request.getHeader(SecurityConstants.USER_ID_HEADER)!=null) {
+            if (request.getHeader(SecurityConstants.USER_ID_HEADER) != null) {
                 setFieldValByName(CREATE_USER_ID, Long.valueOf(request.getHeader(SecurityConstants.USER_ID_HEADER).toString()), metaObject);
             }
             if (createUserName == null) {
-                if(request.getHeader(SecurityConstants.USER_HEADER)!=null) {
+                if (request.getHeader(SecurityConstants.USER_HEADER) != null) {
                     setFieldValByName(CREATE_USER_NAME, request.getHeader(SecurityConstants.USER_HEADER), metaObject);
                 }
             }
+//            if (createUserOrgCode == null) {
+//                if (request.getHeader(SecurityConstants.USER_ORGS_HEADER) != null) {
+//                    //获取orgLevel等级高的
+//                    List<SysOrganization> sysOrganizations = JSON.parseArray(request.getHeader(SecurityConstants.USER_ORGS_HEADER), SysOrganization.class);
+//                    setFieldValByName(CREATE_USER_ORG_CODE,sysOrganizations.get(sysOrganizations.size()-1).getOrgCode() , metaObject);
+//                }
+//            }
 
         }
     }
@@ -65,8 +77,17 @@
     @Override
     public void updateFill(MetaObject metaObject) {
         //mybatis-plus版本2.0.9+
-        setFieldValByName(UPDATE_TIME, new Date(), metaObject);
-        setFieldValByName(UPDATE_USER_ID, Long.valueOf(request.getHeader(SecurityConstants.USER_ID_HEADER).toString()), metaObject);
-        setFieldValByName(UPDATE_USER_NAME, request.getHeader(SecurityConstants.USER_HEADER), metaObject);
+        Object updateTime = getFieldValByName(UPDATE_TIME, metaObject);
+        Object updateUserId = getFieldValByName(UPDATE_USER_ID, metaObject);
+        Object updateUserName = getFieldValByName(UPDATE_USER_NAME, metaObject);
+        if (updateTime == null) {
+            setFieldValByName(UPDATE_TIME, new Date(), metaObject);
+        }
+        if ((updateUserId == null) && (request.getHeader(SecurityConstants.USER_ID_HEADER) != null)) {
+            setFieldValByName(UPDATE_USER_ID, Long.valueOf(request.getHeader(SecurityConstants.USER_ID_HEADER).toString()), metaObject);
+        }
+        if ((updateUserName == null) && (request.getHeader(SecurityConstants.USER_HEADER) != null)) {
+            setFieldValByName(UPDATE_USER_NAME, request.getHeader(SecurityConstants.USER_HEADER), metaObject);
+        }
     }
 }
diff --git a/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/DefaultMybatisPlusConfig.java b/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/DefaultMybatisPlusConfig.java
index 2837969..6167526 100644
--- a/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/DefaultMybatisPlusConfig.java
+++ b/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/DefaultMybatisPlusConfig.java
@@ -57,7 +57,7 @@
         if (enableTenant) {
             TenantSqlParser tenantSqlParser = new TenantSqlParser()
                     .setTenantHandler(tenantHandler);
-
+            sqlParserList.add(tenantSqlParser);
             //动态表名解析器
             DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser();
             Map<String, ITableNameHandler> tableNameHanderMap = new HashMap<>();
@@ -76,10 +76,34 @@
                 dynamicTableNameParser.setTableNameHandlerMap(tableNameHanderMap);
                 sqlParserList.add(dynamicTableNameParser);
             }
-            sqlParserList.add(tenantSqlParser);
+
 //            paginationInterceptor.setSqlParserList(CollUtil.toList(tenantSqlParser));
             paginationInterceptor.setSqlParserList(sqlParserList);
             paginationInterceptor.setSqlParserFilter(sqlParserFilter);
+        } else {
+            //动态表名解析器
+            DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser();
+            Map<String, ITableNameHandler> tableNameHanderMap = new HashMap<>();
+
+            //通过配置文件获取需要动态解析的表名
+            List<String> dynamicTables = tenantProperties.getDynamicTables();
+            if(dynamicTables.size()>0){
+                dynamicTables.forEach(item->{
+                    tableNameHanderMap.put(item, new ITableNameHandler() {
+                        @Override
+                        public String dynamicTableName(MetaObject metaObject, String sql, String tableName) {
+                            return DynamicTableContextHolder.getDynamicTable();
+                        }
+                    });
+                });
+                dynamicTableNameParser.setTableNameHandlerMap(tableNameHanderMap);
+                sqlParserList.add(dynamicTableNameParser);
+                paginationInterceptor.setSqlParserList(sqlParserList);
+                paginationInterceptor.setSqlParserFilter(sqlParserFilter);
+            }
+
+//            paginationInterceptor.setSqlParserList(CollUtil.toList(tenantSqlParser));
+
         }
 
 
diff --git a/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/TenantAutoConfigure.java b/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/TenantAutoConfigure.java
index 28bb17b..a09d952 100644
--- a/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/TenantAutoConfigure.java
+++ b/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/config/TenantAutoConfigure.java
@@ -41,7 +41,7 @@
             @Override
             public Expression getTenantId(boolean where) {
                 String tenant = TenantContextHolder.getTenant();
-                log.info("租户ID:"+tenant);
+                //log.info("租户ID:"+tenant);
                 if (tenant != null) {
                     return new StringValue(TenantContextHolder.getTenant());
                 }
diff --git a/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/sharding/HashModTableSuffix.java b/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/sharding/HashModTableSuffix.java
index 7304b90..14a5d3d 100644
--- a/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/sharding/HashModTableSuffix.java
+++ b/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/sharding/HashModTableSuffix.java
@@ -13,17 +13,21 @@
 public class HashModTableSuffix implements TableSuffix {
 
     private String hash;
-    private static final int MOD = 100;
+    private Long tableSize = 64L;
+    private String tableSuffix="-000";
 
-    public HashModTableSuffix(String hash) {
+    public HashModTableSuffix(String hash,long tableSize, String tableSuffix) {
         if (StringUtils.isEmpty(hash)) {
             throw new IllegalArgumentException("hash should not be null or empty");
         }
         this.hash = hash;
+        this.tableSize=tableSize;
+        this.tableSuffix=tableSuffix;
     }
 
     @Override
     public String getSuffix() {
-        return String.format("_%d", hash.hashCode() / MOD);
+        String format = "%0" + (tableSuffix.length() - 1) + "d";
+        return "_"+String.format(format, Math.abs(hash.hashCode()) % tableSize);
     }
 }
diff --git a/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/sharding/TableSuffix.java b/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/sharding/TableSuffix.java
index b6f4c0f..216ce89 100644
--- a/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/sharding/TableSuffix.java
+++ b/kidgrow-commons/kidgrow-db-spring-boot-starter/src/main/java/com/kidgrow/db/sharding/TableSuffix.java
@@ -12,8 +12,8 @@
  */
 public interface TableSuffix {
 
-    static TableSuffix ofHash(String hash) {
-        return new HashModTableSuffix(hash);
+    static TableSuffix ofHash(String hash,long tableSize, String tableSuffix) {
+        return new HashModTableSuffix(hash,tableSize,tableSuffix);
     }
 
     static TableSuffix ofMonth(Date date) {
diff --git a/kidgrow-commons/kidgrow-log-spring-boot-starter/pom.xml b/kidgrow-commons/kidgrow-log-spring-boot-starter/pom.xml
index fd0e25e..2f43dc5 100644
--- a/kidgrow-commons/kidgrow-log-spring-boot-starter/pom.xml
+++ b/kidgrow-commons/kidgrow-log-spring-boot-starter/pom.xml
@@ -18,7 +18,7 @@
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot</artifactId>
+            <artifactId>spring-boot-starter</artifactId>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
@@ -29,8 +29,28 @@
             <artifactId>transmittable-thread-local</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.aspectj</groupId>
-            <artifactId>aspectjweaver</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
         </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git a/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/aspect/AuditLogAspect.java b/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/aspect/AuditLogAspect.java
index 3d5c02b..fdb2879 100644
--- a/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/aspect/AuditLogAspect.java
+++ b/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/aspect/AuditLogAspect.java
@@ -9,8 +9,10 @@
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Before;
 import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.core.DefaultParameterNameDiscoverer;
 import org.springframework.expression.EvaluationContext;
 import org.springframework.expression.Expression;
@@ -32,18 +34,20 @@
  */
 @Slf4j
 @Aspect
+@EnableConfigurationProperties(AuditLogProperties.class)
 @ConditionalOnClass({HttpServletRequest.class, RequestContextHolder.class})
 public class AuditLogAspect {
     @Value("${spring.application.name}")
     private String applicationName;
-
+    @Autowired
     private AuditLogProperties auditLogProperties;
+    @Autowired(required = false)
     private IAuditService auditService;
 
-    public AuditLogAspect(AuditLogProperties auditLogProperties, IAuditService auditService) {
-        this.auditLogProperties = auditLogProperties;
-        this.auditService = auditService;
-    }
+//    public AuditLogAspect(AuditLogProperties auditLogProperties, IAuditService auditService) {
+//        this.auditLogProperties = auditLogProperties;
+//        this.auditService = auditService;
+//    }
 
     /**
      * 用于SpEL表达式解析.
diff --git a/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/config/LogAutoConfigure.java b/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/config/LogAutoConfigure.java
index e2f6630..d33660e 100644
--- a/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/config/LogAutoConfigure.java
+++ b/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/config/LogAutoConfigure.java
@@ -1,7 +1,12 @@
 package com.kidgrow.log.config;
 
+import com.kidgrow.log.properties.AuditLogProperties;
+import com.kidgrow.log.properties.LogDbProperties;
 import com.kidgrow.log.properties.TraceProperties;
+import com.zaxxer.hikari.HikariConfig;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -11,6 +16,13 @@
  * @CreateDate: Created in 2020/2/4 16:05 <br>
  * @Author: <a href="4345453@kidgrow.com">liuke</a>
  */
-@EnableConfigurationProperties(TraceProperties.class)
+@EnableConfigurationProperties({TraceProperties.class, AuditLogProperties.class})
 public class LogAutoConfigure {
+    /**
+     * 日志数据库配置
+     */
+    @Configuration
+    @ConditionalOnClass(HikariConfig.class)
+    @EnableConfigurationProperties(LogDbProperties.class)
+    public static class LogDbAutoConfigure {}
 }
diff --git a/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/properties/AuditLogProperties.java b/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/properties/AuditLogProperties.java
index 3452628..0bc8bb2 100644
--- a/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/properties/AuditLogProperties.java
+++ b/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/properties/AuditLogProperties.java
@@ -1,6 +1,8 @@
 package com.kidgrow.log.properties;
 
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 
@@ -13,6 +15,8 @@
  * @Author: <a href="4345453@kidgrow.com">liuke</a>
  */
 @Data
+@NoArgsConstructor
+@AllArgsConstructor
 @ConfigurationProperties(prefix = "kidgrow.audit-log")
 @RefreshScope
 public class AuditLogProperties {
diff --git a/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/properties/LogDbProperties.java b/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/properties/LogDbProperties.java
new file mode 100644
index 0000000..2b7f2c0
--- /dev/null
+++ b/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/properties/LogDbProperties.java
@@ -0,0 +1,19 @@
+package com.kidgrow.log.properties;
+
+import com.zaxxer.hikari.HikariConfig;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 日志数据源配置
+ * logType=db时生效(非必须),如果不配置则使用当前数据源<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/3/25 17:01 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@ConfigurationProperties(prefix = "kidgrow.audit-log.datasource")
+public class LogDbProperties extends HikariConfig {
+}
diff --git a/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/service/impl/DbAuditServiceImpl.java b/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/service/impl/DbAuditServiceImpl.java
new file mode 100644
index 0000000..dd63124
--- /dev/null
+++ b/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/java/com/kidgrow/log/service/impl/DbAuditServiceImpl.java
@@ -0,0 +1,70 @@
+package com.kidgrow.log.service.impl;
+
+import com.kidgrow.log.model.Audit;
+import com.kidgrow.log.properties.LogDbProperties;
+import com.kidgrow.log.service.IAuditService;
+import com.zaxxer.hikari.HikariDataSource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.scheduling.annotation.Async;
+
+import javax.annotation.PostConstruct;
+import javax.sql.DataSource;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 审计日志实现类-数据库<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/3/25 16:58 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@ConditionalOnProperty(name = "kidgrow.audit-log.log-type", havingValue = "db")
+@ConditionalOnClass(JdbcTemplate.class)
+public class DbAuditServiceImpl implements IAuditService {
+    private static final String INSERT_SQL = " insert into sys_logger " +
+            " (application_name, class_name, method_name, user_id, user_name, client_id, operation, timestamp) " +
+            " values (?,?,?,?,?,?,?,?)";
+
+    private final JdbcTemplate jdbcTemplate;
+
+    public DbAuditServiceImpl(@Autowired(required = false) LogDbProperties logDbProperties, DataSource dataSource) {
+        //优先使用配置的日志数据源,否则使用默认的数据源
+        if (logDbProperties != null && StringUtils.isNotEmpty(logDbProperties.getJdbcUrl())) {
+            dataSource = new HikariDataSource(logDbProperties);
+        }
+        this.jdbcTemplate = new JdbcTemplate(dataSource);
+    }
+
+    @PostConstruct
+    public void init() {
+        String sql = "CREATE TABLE IF NOT EXISTS `sys_logger`  (\n" +
+                "  `id` int(11) NOT NULL AUTO_INCREMENT,\n" +
+                "  `application_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '应用名',\n" +
+                "  `class_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类名',\n" +
+                "  `method_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '方法名',\n" +
+                "  `user_id` int(11) NULL COMMENT '用户id',\n" +
+                "  `user_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '用户名',\n" +
+                "  `client_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '租户id',\n" +
+                "  `operation` varchar(1024) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '操作信息',\n" +
+                "  `timestamp` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '创建时间',\n" +
+                "  PRIMARY KEY (`id`) USING BTREE\n" +
+                ") ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;";
+        this.jdbcTemplate.execute(sql);
+    }
+
+    @Async
+    @Override
+    public void save(Audit audit) {
+        this.jdbcTemplate.update(INSERT_SQL
+                , audit.getApplicationName(), audit.getClassName(), audit.getMethodName()
+                , audit.getUserId(), audit.getUserName(), audit.getClientId()
+                , audit.getOperation(), audit.getTimestamp());
+    }
+}
+
diff --git a/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/resources/META-INF/spring.factories b/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/resources/META-INF/spring.factories
index a0fe053..24b3f75 100644
--- a/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/resources/META-INF/spring.factories
+++ b/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/resources/META-INF/spring.factories
@@ -2,4 +2,7 @@
 com.kidgrow.log.config.TtlMDCAdapterInitializer
 
 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
-com.kidgrow.log.config.LogAutoConfigure
+com.kidgrow.log.config.LogAutoConfigure,\
+com.kidgrow.log.service.impl.LoggerAuditServiceImpl,\
+com.kidgrow.log.service.impl.DbAuditServiceImpl,\
+com.kidgrow.log.aspect.AuditLogAspect
diff --git a/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/resources/logback-spring.xml b/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/resources/logback-spring.xml
index 7eee33f..f40f53f 100644
--- a/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/resources/logback-spring.xml
+++ b/kidgrow-commons/kidgrow-log-spring-boot-starter/src/main/resources/logback-spring.xml
@@ -4,6 +4,7 @@
     <springProperty name="APP_NAME" scope="context" source="spring.application.name"/>
     <springProperty name="LOG_FILE" scope="context" source="logging.file" defaultValue="../logs/application/${APP_NAME}"/>
     <springProperty name="LOG_POINT_FILE" scope="context" source="logging.file" defaultValue="../logs/point"/>
+    <springProperty name="LOG_AUDIT_FILE" scope="context" source="logging.file" defaultValue="../logs/audit"/>
     <springProperty name="LOG_MAXFILESIZE" scope="context" source="logback.filesize" defaultValue="50MB"/>
     <springProperty name="LOG_FILEMAXDAY" scope="context" source="logback.filemaxday" defaultValue="7"/>
     <springProperty name="ServerIP" scope="context" source="spring.cloud.client.ip-address" defaultValue="0.0.0.0"/>
@@ -64,21 +65,46 @@
                 <maxFileSize>${LOG_MAXFILESIZE}</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
         </rollingPolicy>
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>INFO</level>
-        </filter>
+    </appender>
+
+    <appender name="audit_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_AUDIT_FILE}/audit.log</file>
+        <encoder>
+            <pattern>%msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <!-- 基于时间的分包策略 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_AUDIT_FILE}/audit.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--保留时间,单位:天-->
+            <maxHistory>${LOG_FILEMAXDAY}</maxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${LOG_MAXFILESIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
     </appender>
 
     <appender name="point_log_async" class="ch.qos.logback.classic.AsyncAppender">
         <discardingThreshold>0</discardingThreshold>
         <appender-ref ref="point_log"/>
     </appender>
+    <appender name="file_async" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <appender-ref ref="FileAppender"/>
+    </appender>
+    <appender name="audit_log_async" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <appender-ref ref="audit_log"/>
+    </appender>
     <logger name="com.kidgrow.log.monitor" level="debug" addtivity="false">
         <appender-ref ref="point_log_async" />
+    </logger>
+    <logger name="com.kidgrow.log.service.impl.LoggerAuditServiceImpl" level="debug" addtivity="false">
+        <appender-ref ref="audit_log_async" />
     </logger>
 
     <root level="INFO">
         <appender-ref ref="StdoutAppender"/>
-        <appender-ref ref="FileAppender"/>
+        <appender-ref ref="file_async"/>
     </root>
 </configuration>
diff --git a/kidgrow-commons/kidgrow-rabbitmq-spring-boot-starter/pom.xml b/kidgrow-commons/kidgrow-rabbitmq-spring-boot-starter/pom.xml
new file mode 100644
index 0000000..f6e1267
--- /dev/null
+++ b/kidgrow-commons/kidgrow-rabbitmq-spring-boot-starter/pom.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kidgrow-commons</artifactId>
+        <groupId>com.kidgrow</groupId>
+        <version>1.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kidgrow-rabbitmq-spring-boot-starter</artifactId>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/kidgrow-commons/kidgrow-rabbitmq-spring-boot-starter/src/main/java/com/kidgrow/rabbitmq/config/RabbitConfig.java b/kidgrow-commons/kidgrow-rabbitmq-spring-boot-starter/src/main/java/com/kidgrow/rabbitmq/config/RabbitConfig.java
new file mode 100644
index 0000000..f26e939
--- /dev/null
+++ b/kidgrow-commons/kidgrow-rabbitmq-spring-boot-starter/src/main/java/com/kidgrow/rabbitmq/config/RabbitConfig.java
@@ -0,0 +1,195 @@
+package com.kidgrow.rabbitmq.config;
+
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.*;
+import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
+import org.springframework.amqp.rabbit.connection.ConnectionFactory;
+import org.springframework.amqp.rabbit.connection.CorrelationData;
+import org.springframework.amqp.rabbit.core.RabbitAdmin;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: RabbitMQ连接基本配置<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/3/23 17:14 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@ConfigurationProperties(prefix = "spring.rabbitmq")
+@Slf4j
+@Data
+@Configuration
+public class RabbitConfig {
+
+    /**
+     * RabbitMq服务器IP
+     */
+    private String host;
+    /**
+     * 端口
+     */
+    private int port;
+    /**
+     * 用户名
+     */
+    private String username;
+    /**
+     * 密码
+     */
+    private String password;
+    /**
+     * Virtual Hosts权限管理
+     */
+    private String virtualHost;
+    /**
+     * 交换机名称
+     */
+    private String exchangeName;
+    /**
+     * 队列名称
+     */
+    private String queueName;
+    /**
+     * routingKeyName名称
+     */
+    private String routingKeyName;
+
+    /**
+     * AI返回结果队列
+     */
+    private String AIEvaluationResults;
+
+    /**
+     * 骨龄评价统计
+     */
+    private String BoneAgeEvaluationData;
+
+    /**
+     * 档案统计
+     */
+    private String ChildRecordData;
+
+    /**
+     * 报告统计
+     */
+    private String ReportData;
+
+    @Bean
+    public ConnectionFactory connectionFactory() {
+        CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host,port);
+        connectionFactory.setUsername(username);
+        connectionFactory.setPassword(password);
+        connectionFactory.setVirtualHost(virtualHost);
+        connectionFactory.setPublisherConfirms(true);
+        connectionFactory.setPublisherReturns(true);
+        //当Channel数量大于缓存数量时,多出来没法放进缓存的会被关闭。
+        connectionFactory.setChannelCacheSize(10);
+        //2、CHANNEL模式,程序运行期间ConnectionFactory会维护着一个Connection,
+        // 所有的操作都会使用这个Connection,但一个Connection中可以有多个Channel,
+        // 操作rabbitmq之前都必须先获取到一个Channel,
+        // 否则就会阻塞(可以通过setChannelCheckoutTimeout()设置等待时间),
+        // 这些Channel会被缓存(缓存的数量可以通过setChannelCacheSize()设置);
+        connectionFactory.setCacheMode(CachingConnectionFactory.CacheMode.CONNECTION);   //设置CONNECTION模式,可创建多个Connection连接
+        //单位:毫秒;配合channelCacheSize不仅是缓存数量,而且是最大的数量。
+        // 从缓存获取不到可用的Channel时,不会创建新的Channel,会等待这个值设置的毫秒数
+        //同时,在CONNECTION模式,这个值也会影响获取Connection的等待时间,
+        // 超时获取不到Connection也会抛出AmqpTimeoutException异常。
+        connectionFactory.setChannelCheckoutTimeout(600);
+        //仅在CONNECTION模式使用,设置Connection的缓存数量。
+        connectionFactory.setConnectionCacheSize(3);
+        //setConnectionLimit:仅在CONNECTION模式使用,设置Connection的数量上限。
+        connectionFactory.setConnectionLimit(10);
+        return connectionFactory;
+    }
+
+
+    @Bean
+    public RabbitAdmin rabbitAdmin(@Autowired ConnectionFactory connectionFactory) {
+        return new RabbitAdmin(connectionFactory);
+    }
+
+
+    @Bean
+    public RabbitTemplate rabbitTemplate(@Autowired ConnectionFactory connectionFactory) {
+        RabbitTemplate template = new RabbitTemplate(connectionFactory);
+        template.setExchange(exchangeName);
+        //客户端开启confirm模式
+        template.setMandatory(true);
+        template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
+            @Override
+            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
+                log.info("消息发送成功:correlationData({}),ack({}),cause({})", correlationData, ack, cause);
+            }
+        });
+        template.setReturnCallback(new RabbitTemplate.ReturnCallback() {
+            @Override
+            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
+                log.info("消息丢失:exchange({}),route({}),replyCode({}),replyText({}),message:{}", exchange, routingKey, replyCode, replyText, message);
+            }
+        });
+        return template;
+    }
+
+    @Bean
+    public TopicExchange exchange() {
+        return new TopicExchange(exchangeName);
+    }
+
+    @Bean
+    public Queue KidgrowQueue() {
+        return new Queue(queueName);
+    }
+
+    @Bean
+    Binding bindingExchangeMessage(TopicExchange exchange) {
+        return BindingBuilder.bind(KidgrowQueue()).to(exchange).with(routingKeyName);
+    }
+
+    @Bean
+    public Queue AIEvaluation() {
+        return new Queue("AIEvaluation");
+    }
+
+    @Bean
+    public Queue AIEvaluationResults() {
+        return new Queue(AIEvaluationResults);
+    }
+
+    @Bean
+    public Queue BoneAgeEvaluationData() {
+        return new Queue(BoneAgeEvaluationData);
+    }
+
+    @Bean
+    public Queue ChildRecordData() {
+        return new Queue(ChildRecordData);
+    }
+
+
+    @Bean
+    public Queue ReportData() {
+        return new Queue(ReportData);
+    }
+
+
+    @Bean
+    Binding bindingExchangeAIEvaluation(TopicExchange exchange) {
+        return BindingBuilder.bind(AIEvaluation()).to(exchange).with(routingKeyName);
+    }
+
+    @Bean
+    public Queue AdvancedEvaluation() {
+        return new Queue("AdvancedEvaluation");
+    }
+
+    @Bean
+    Binding bindingExchangeAdvancedEvaluation(TopicExchange exchange) {
+        return BindingBuilder.bind(AdvancedEvaluation()).to(exchange).with(routingKeyName);
+    }
+}
diff --git a/kidgrow-commons/kidgrow-rabbitmq-spring-boot-starter/src/main/java/com/kidgrow/rabbitmq/model/MqMessage.java b/kidgrow-commons/kidgrow-rabbitmq-spring-boot-starter/src/main/java/com/kidgrow/rabbitmq/model/MqMessage.java
new file mode 100644
index 0000000..bba8936
--- /dev/null
+++ b/kidgrow-commons/kidgrow-rabbitmq-spring-boot-starter/src/main/java/com/kidgrow/rabbitmq/model/MqMessage.java
@@ -0,0 +1,31 @@
+package com.kidgrow.rabbitmq.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 消息主体信息<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/3/23 17:08 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class MqMessage {
+    /**
+     * 交换机
+     */
+    private String topic;
+    /**
+     * 匹配路由key,*匹配一个,#匹配多个
+     */
+    private String tags;
+    /**
+     * 消息主体对象内容
+     */
+    private Object body;
+}
diff --git a/kidgrow-commons/kidgrow-redis-spring-boot-starter/src/main/java/com/kidgrow/redis/util/RedisConstant.java b/kidgrow-commons/kidgrow-redis-spring-boot-starter/src/main/java/com/kidgrow/redis/util/RedisConstant.java
new file mode 100644
index 0000000..98b073b
--- /dev/null
+++ b/kidgrow-commons/kidgrow-redis-spring-boot-starter/src/main/java/com/kidgrow/redis/util/RedisConstant.java
@@ -0,0 +1,13 @@
+package com.kidgrow.redis.util;
+
+/**
+ * Redis  中的常量
+ */
+public  interface RedisConstant {
+    /**
+     * 用户与组织的关系
+     */
+    String USER_ORGANIZATION="USER_ORGANIZATION";
+
+    String ORGANIZATION="ORGANIZATION";
+}
diff --git a/kidgrow-commons/kidgrow-redis-spring-boot-starter/src/main/java/com/kidgrow/redis/util/RedisUtils.java b/kidgrow-commons/kidgrow-redis-spring-boot-starter/src/main/java/com/kidgrow/redis/util/RedisUtils.java
new file mode 100644
index 0000000..b2a7bd2
--- /dev/null
+++ b/kidgrow-commons/kidgrow-redis-spring-boot-starter/src/main/java/com/kidgrow/redis/util/RedisUtils.java
@@ -0,0 +1,658 @@
+package com.kidgrow.redis.util;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class RedisUtils {
+    @Autowired
+
+    private RedisTemplate<String, Object> redisTemplate;
+
+
+    // =============================common============================
+
+    /**
+     * 指定缓存失效时间
+     *
+     * @param key  键
+     * @param time 时间(秒)
+     * @return
+     */
+
+    public boolean expire(String key, long time) {
+
+        try {
+            if (time > 0) {
+                redisTemplate.expire(key, time, TimeUnit.SECONDS);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 根据key 获取过期时间
+     *
+     * @param key 键 不能为null
+     * @return 时间(秒) 返回0代表为永久有效
+     */
+
+    public long getExpire(String key) {
+        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+
+    }
+
+
+    /**
+     * 判断key是否存在
+     *
+     * @param key 键
+     * @return true 存在 false不存在
+     */
+
+    public boolean hasKey(String key) {
+
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 删除缓存
+     *
+     * @param key 可以传一个值 或多个
+     */
+
+    @SuppressWarnings("unchecked")
+
+    public void del(String... key) {
+
+        if (key != null && key.length > 0) {
+
+            if (key.length == 0) {
+                redisTemplate.delete(key[0]);
+            } else {
+                redisTemplate.delete(CollectionUtils.arrayToList(key));
+            }
+        }
+
+    }
+    // ============================String=============================
+
+    /**
+     * 普通缓存获取
+     *
+     * @param key 键
+     * @return 值
+     */
+
+    public Object get(String key) {
+        return key == null ? null : redisTemplate.opsForValue().get(key);
+    }
+
+    /**
+     * 普通缓存放入
+     *
+     * @param key   键
+     * @param value 值
+     * @return true成功 false失败
+     */
+
+    public boolean set(String key, Object value) {
+
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 普通缓存放入并设置时间
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
+     * @return true成功 false 失败
+     */
+
+    public boolean set(String key, Object value, long time) {
+
+        try {
+            if (time > 0) {
+                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
+            } else {
+                set(key, value);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+    /**
+     * 递增
+     *
+     * @param key   键
+     * @param delta 要增加几(大于0)
+     * @return
+     */
+
+    public long incr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("递增因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, delta);
+    }
+
+
+    /**
+     * 递减
+     *
+     * @param key   键
+     * @param delta 要减少几(小于0)
+     * @return
+     */
+
+    public long decr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("递减因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, -delta);
+    }
+
+
+    // ================================Map=================================
+
+    /**
+     * HashGet
+     *
+     * @param key  键 不能为null
+     * @param item 项 不能为null
+     * @return 值
+     */
+
+    public Object hget(String key, String item) {
+        return redisTemplate.opsForHash().get(key, item);
+    }
+
+
+    /**
+     * 获取hashKey对应的所有键值
+     *
+     * @param key 键
+     * @return 对应的多个键值
+     */
+
+    public Map<Object, Object> hmget(String key) {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+
+    /**
+     * HashSet
+     *
+     * @param key 键
+     * @param map 对应多个键值
+     * @return true 成功 false 失败
+     */
+
+    public boolean hmset(String key, Map<String, Object> map) {
+
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * HashSet 并设置时间
+     *
+     * @param key  键
+     * @param map  对应多个键值
+     * @param time 时间(秒)
+     * @return true成功 false失败
+     */
+
+    public boolean hmset(String key, Map<String, Object> map, long time) {
+
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key   键
+     * @param item  项
+     * @param value 值
+     * @return true 成功 false失败
+     */
+
+    public boolean hset(String key, String item, Object value) {
+
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key   键
+     * @param item  项
+     * @param value 值
+     * @param time  时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
+     * @return true 成功 false失败
+     */
+
+    public boolean hset(String key, String item, Object value, long time) {
+
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 删除hash表中的值
+     *
+     * @param key  键 不能为null
+     * @param item 项 可以使多个 不能为null
+     */
+
+    public void hdel(String key, Object... item) {
+        redisTemplate.opsForHash().delete(key, item);
+    }
+
+
+    /**
+     * 判断hash表中是否有该项的值
+     *
+     * @param key  键 不能为null
+     * @param item 项 不能为null
+     * @return true 存在 false不存在
+     */
+
+    public boolean hHasKey(String key, String item) {
+        return redisTemplate.opsForHash().hasKey(key, item);
+    }
+
+
+    /**
+     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
+     *
+     * @param key  键
+     * @param item 项
+     * @param by   要增加几(大于0)
+     * @return
+     */
+
+    public double hincr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, by);
+    }
+
+
+    /**
+     * hash递减
+     *
+     * @param key  键
+     * @param item 项
+     * @param by   要减少记(小于0)
+     * @return
+     */
+
+    public double hdecr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, -by);
+
+    }
+
+
+    // ============================set=============================
+
+    /**
+     * 根据key获取Set中的所有值
+     *
+     * @param key 键
+     * @return
+     */
+
+    public Set<Object> sGet(String key) {
+        try {
+            return redisTemplate.opsForSet().members(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 根据value从一个set中查询,是否存在
+     *
+     * @param key   键
+     * @param value 值
+     * @return true 存在 false不存在
+     */
+
+    public boolean sHasKey(String key, Object value) {
+
+        try {
+            return redisTemplate.opsForSet().isMember(key, value);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 将数据放入set缓存
+     *
+     * @param key    键
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+
+    public long sSet(String key, Object... values) {
+
+        try {
+            return redisTemplate.opsForSet().add(key, values);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+
+    /**
+     * 将set数据放入缓存
+     *
+     * @param key    键
+     * @param time   时间(秒)
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+
+    public long sSetAndTime(String key, long time, Object... values) {
+
+        try {
+            Long count = redisTemplate.opsForSet().add(key, values);
+            if (time > 0)
+                expire(key, time);
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+
+    /**
+     * 获取set缓存的长度
+     *
+     * @param key 键
+     * @return
+     */
+
+    public long sGetSetSize(String key) {
+        try {
+            return redisTemplate.opsForSet().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+
+    /**
+     * 移除值为value的
+     *
+     * @param key    键
+     * @param values 值 可以是多个
+     * @return 移除的个数
+     */
+
+    public long setRemove(String key, Object... values) {
+
+        try {
+            Long count = redisTemplate.opsForSet().remove(key, values);
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+
+    }
+
+    // ===============================list=================================
+
+
+    /**
+     * 获取list缓存的内容
+     *
+     * @param key   键
+     * @param start 开始
+     * @param end   结束 0 到 -代表所有值
+     * @return
+     */
+
+    public List<Object> lGet(String key, long start, long end) {
+
+        try {
+            return redisTemplate.opsForList().range(key, start, end);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+
+    }
+
+
+    /**
+     * 获取list缓存的长度
+     *
+     * @param key 键
+     * @return
+     */
+
+    public long lGetListSize(String key) {
+
+        try {
+            return redisTemplate.opsForList().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+
+    }
+
+
+    /**
+     * 通过索引 获取list中的值
+     *
+     * @param key   键
+     * @param index 索引 index>=0时, 0 表头, 第二个元素,依次类推;index<0时,-,表尾,-倒数第二个元素,依次类推
+     * @return
+     */
+
+    public Object lGetIndex(String key, long index) {
+
+        try {
+            return redisTemplate.opsForList().index(key, index);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+
+    }
+
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @return
+     */
+
+    public boolean lSet(String key, Object value) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+
+        }
+
+    }
+
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒)
+     * @return
+     */
+
+    public boolean lSet(String key, Object value, long time) {
+
+        try {
+
+            redisTemplate.opsForList().rightPush(key, value);
+
+            if (time > 0)
+
+                expire(key, time);
+
+            return true;
+
+        } catch (Exception e) {
+
+            e.printStackTrace();
+
+            return false;
+
+        }
+
+    }
+
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @return
+     */
+
+    public boolean lSet(String key, List<Object> value) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒)
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value, long time) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            if (time > 0)
+                expire(key, time);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 根据索引修改list中的某条数据
+     *
+     * @param key   键
+     * @param index 索引
+     * @param value 值
+     * @return
+     */
+    public boolean lUpdateIndex(String key, long index, Object value) {
+        try {
+            redisTemplate.opsForList().set(key, index, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 移除N个值为value
+     *
+     * @param key   键
+     * @param count 移除多少个
+     * @param value 值
+     * @return 移除的个数
+     */
+    public long lRemove(String key, long count, Object value) {
+        try {
+            Long remove = redisTemplate.opsForList().remove(key, count, value);
+            return remove;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+}
diff --git a/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/annotation/EnableFeignInterceptor.java b/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/annotation/EnableFeignInterceptor.java
index c328e2a..050ea98 100644
--- a/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/annotation/EnableFeignInterceptor.java
+++ b/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/annotation/EnableFeignInterceptor.java
@@ -13,7 +13,7 @@
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
  *
- * @Description: 开启feign拦截器传递数据给下游服务,包含基础数据和http的相关数据
+ * @Description: 开启feign拦截器传递数据给下游服务,包含基础数据,tenant信息和http的相关数据
  * @Project: <br>
  * @CreateDate: Created in 2020/2/21 13:31 <br>
  * @Author: <a href="4345453@kidgrow.com">liuke</a>
diff --git a/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/annotation/EnableFeignTenantInterceptor.java b/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/annotation/EnableFeignTenantInterceptor.java
new file mode 100644
index 0000000..6fb9192
--- /dev/null
+++ b/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/annotation/EnableFeignTenantInterceptor.java
@@ -0,0 +1,26 @@
+package com.kidgrow.ribbon.annotation;
+
+import com.kidgrow.ribbon.config.FeignHttpTenantInterceptorConfig;
+import com.kidgrow.ribbon.config.FeignTenantInterceptorConfig;
+import org.springframework.context.annotation.Import;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 开启feign拦截器传递数据给下游服务,包含基础数据和http的相关数据,不含tenant
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/21 13:31 <br>
+ * @Author: <a href="4345453@kidgrow.com">houruijun</a>
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Import({FeignTenantInterceptorConfig.class, FeignHttpTenantInterceptorConfig.class})
+public @interface EnableFeignTenantInterceptor {
+
+}
diff --git a/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignHttpInterceptorConfig.java b/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignHttpInterceptorConfig.java
index dbc03be..602ad88 100644
--- a/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignHttpInterceptorConfig.java
+++ b/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignHttpInterceptorConfig.java
@@ -30,14 +30,23 @@
     @PostConstruct
     public void initialize() {
         requestHeaders.add(SecurityConstants.USER_ID_HEADER);
+        requestHeaders.add(SecurityConstants.DOCTOR_ID_HEADER);
         requestHeaders.add(SecurityConstants.USER_HEADER);
+        requestHeaders.add(SecurityConstants.USER_DEP_ID_HEADER);
+        requestHeaders.add(SecurityConstants.USER_DEP_NAME_HEADER);
+        requestHeaders.add(SecurityConstants.USER_ORG_ID_HEADER);
+        requestHeaders.add(SecurityConstants.USER_ORGS_HEADER);
+        requestHeaders.add(SecurityConstants.USER_ORG_NAME_HEADER);
         requestHeaders.add(SecurityConstants.ROLE_HEADER);
         requestHeaders.add(SecurityConstants.CLIENT_HEADER);
         requestHeaders.add(SecurityConstants.TENANT_HEADER);
         requestHeaders.add(CommonConstant.KIDGROW_VERSION);
         requestHeaders.add(CommonConstant.USER_AGENT_BROWSER);
         requestHeaders.add(CommonConstant.USER_AGENT_IP);
+        requestHeaders.add(CommonConstant.USER_AGENT_SYSTEM_SCREEN);
         requestHeaders.add(CommonConstant.USER_AGENT_SYSTEM);
+        requestHeaders.add(SecurityConstants.USER_HOSPITAL_ID_HEADER);
+        requestHeaders.add(SecurityConstants.USER_REAL_NAME);
     }
 
     /**
diff --git a/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignHttpTenantInterceptorConfig.java b/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignHttpTenantInterceptorConfig.java
new file mode 100644
index 0000000..7f57d7e
--- /dev/null
+++ b/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignHttpTenantInterceptorConfig.java
@@ -0,0 +1,108 @@
+package com.kidgrow.ribbon.config;
+
+import com.kidgrow.common.constant.CommonConstant;
+import com.kidgrow.common.constant.SecurityConstants;
+import feign.RequestInterceptor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.PostConstruct;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: feign拦截器,只包含http相关数据
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/21 13:31 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+public class FeignHttpTenantInterceptorConfig {
+    protected List<String> requestHeaders = new ArrayList<>();
+
+    @PostConstruct
+    public void initialize() {
+        requestHeaders.add(SecurityConstants.USER_ID_HEADER);
+        requestHeaders.add(SecurityConstants.DOCTOR_ID_HEADER);
+        requestHeaders.add(SecurityConstants.USER_HEADER);
+        requestHeaders.add(SecurityConstants.USER_DEP_ID_HEADER);
+        requestHeaders.add(SecurityConstants.USER_DEP_NAME_HEADER);
+        requestHeaders.add(SecurityConstants.USER_ORG_ID_HEADER);
+        requestHeaders.add(SecurityConstants.USER_ORGS_HEADER);
+        requestHeaders.add(SecurityConstants.USER_ORG_NAME_HEADER);
+        requestHeaders.add(SecurityConstants.ROLE_HEADER);
+        requestHeaders.add(SecurityConstants.CLIENT_HEADER);
+        //requestHeaders.add(SecurityConstants.TENANT_HEADER);
+        requestHeaders.add(CommonConstant.KIDGROW_VERSION);
+        requestHeaders.add(CommonConstant.USER_AGENT_BROWSER);
+        requestHeaders.add(CommonConstant.USER_AGENT_IP);
+        requestHeaders.add(CommonConstant.USER_AGENT_SYSTEM_SCREEN);
+        requestHeaders.add(CommonConstant.USER_AGENT_SYSTEM);
+        requestHeaders.add(SecurityConstants.USER_HOSPITAL_ID_HEADER);
+        requestHeaders.add(SecurityConstants.USER_REAL_NAME);
+    }
+
+    /**
+     * 使用feign client访问别的微服务时,将上游传过来的access_token、clientid、tenantid、username、roles等信息放入header传递给下一个服务
+     */
+    @Bean
+    public RequestInterceptor httpFeignInterceptor() {
+        return template -> {
+            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
+                    .getRequestAttributes();
+            if (attributes != null) {
+                HttpServletRequest request = attributes.getRequest();
+                Enumeration<String> headerNames = request.getHeaderNames();
+                if (headerNames != null) {
+                    String headerName;
+                    String headerValue;
+                    while(headerNames.hasMoreElements()) {
+                        headerName = headerNames.nextElement();
+                        if (requestHeaders.contains(headerName)) {
+                            headerValue = request.getHeader(headerName);
+                            template.header(headerName, headerValue);
+                        }
+                    }
+                }
+
+                //传递access_token,无网络隔离时需要传递
+                /*
+                String token = extractHeaderToken(request);
+                if (StrUtil.isEmpty(token)) {
+                    token = request.getParameter(CommonConstant.ACCESS_TOKEN);
+                }
+                if (StrUtil.isNotEmpty(token)) {
+                    template.header(CommonConstant.TOKEN_HEADER, CommonConstant.BEARER_TYPE + " " + token);
+                }
+                */
+            }
+        };
+    }
+
+    /**
+     * 解析head中的token
+     * @param request
+     */
+    private String extractHeaderToken(HttpServletRequest request) {
+        Enumeration<String> headers = request.getHeaders(CommonConstant.TOKEN_HEADER);
+        while (headers.hasMoreElements()) {
+            String value = headers.nextElement();
+            if ((value.toLowerCase().startsWith(CommonConstant.BEARER_TYPE))) {
+                String authHeaderValue = value.substring(CommonConstant.BEARER_TYPE.length()).trim();
+                int commaIndex = authHeaderValue.indexOf(',');
+                if (commaIndex > 0) {
+                    authHeaderValue = authHeaderValue.substring(0, commaIndex);
+                }
+                return authHeaderValue;
+            }
+        }
+        return null;
+    }
+}
diff --git a/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignInterceptorConfig.java b/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignInterceptorConfig.java
index 2ca0d25..b2180b0 100644
--- a/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignInterceptorConfig.java
+++ b/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignInterceptorConfig.java
@@ -20,7 +20,7 @@
  */
 public class FeignInterceptorConfig {
     /**
-     * 使用feign client访问别的微服务时,将上游传过来的client、tenant、traceid等信息放入header传递给下一个服务
+     * 使用feign client访问别的微服务时,将上游传过来的client、traceid等信息放入header传递给下一个服务
      */
     @Bean
     public RequestInterceptor baseFeignInterceptor() {
diff --git a/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignTenantInterceptorConfig.java b/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignTenantInterceptorConfig.java
new file mode 100644
index 0000000..811439d
--- /dev/null
+++ b/kidgrow-commons/kidgrow-ribbon-spring-boot-starter/src/main/java/com/kidgrow/ribbon/config/FeignTenantInterceptorConfig.java
@@ -0,0 +1,46 @@
+package com.kidgrow.ribbon.config;
+
+import cn.hutool.core.util.StrUtil;
+import com.kidgrow.common.constant.CommonConstant;
+import com.kidgrow.common.constant.SecurityConstants;
+import com.kidgrow.common.context.ClientContextHolder;
+import feign.RequestInterceptor;
+import org.slf4j.MDC;
+import org.springframework.context.annotation.Bean;
+
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: feign拦截器,只包含基础数据
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/21 13:31 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class FeignTenantInterceptorConfig {
+    /**
+     * 使用feign client访问别的微服务时,将上游传过来的client、traceid等信息放入header传递给下一个服务
+     */
+    @Bean
+    public RequestInterceptor baseFeignInterceptor() {
+        return template -> {
+            //传递client
+            String client = ClientContextHolder.getClient();
+            if (StrUtil.isNotEmpty(client)) {
+                template.header(SecurityConstants.CLIENT_HEADER, client);
+            }
+
+//            //传递tenant
+//            String tenant = TenantContextHolder.getTenant();
+//            if (StrUtil.isNotEmpty(tenant)) {
+//                template.header(SecurityConstants.TENANT_HEADER, tenant);
+//            }
+
+            //传递日志traceId
+            String traceId = MDC.get(CommonConstant.LOG_TRACE_ID);
+            if (StrUtil.isNotEmpty(traceId)) {
+                template.header(CommonConstant.TRACE_ID_HEADER, traceId);
+            }
+        };
+    }
+}
diff --git a/kidgrow-commons/pom.xml b/kidgrow-commons/pom.xml
index 490f1a6..5096ebd 100644
--- a/kidgrow-commons/pom.xml
+++ b/kidgrow-commons/pom.xml
@@ -21,6 +21,7 @@
         <module>kidgrow-authclient-spring-boot-starter</module>
         <module>kidgrow-ribbon-spring-boot-starter</module>
         <module>kidgrow-sentinel-spring-boot-starter</module>
+        <module>kidgrow-rabbitmq-spring-boot-starter</module>
     </modules>
 
 
diff --git a/kidgrow-config/src/main/resources/application-dev.properties b/kidgrow-config/src/main/resources/application-dev.properties
index 485ad70..a0ce526 100644
--- a/kidgrow-config/src/main/resources/application-dev.properties
+++ b/kidgrow-config/src/main/resources/application-dev.properties
@@ -1,16 +1,28 @@
+#\u5F00\u53D1\u73AF\u5883
 ########################## \u7EDF\u4E00\u53D8\u91CF\u914D\u7F6E ##########################
 ##### \u6570\u636E\u5E93\u914D\u7F6E
 kidgrow.datasource.ip=192.168.2.240
 kidgrow.datasource.username=root
 kidgrow.datasource.password=kidgrow2020
-
+spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 ##### Redis\u914D\u7F6E
 # \u662F\u5426\u5F00\u542FRedis\u7F13\u5B58  true\u5F00\u542F   false \u5173\u95ED
 spring.redis.open=true
 spring.redis.host=192.168.2.240
+#spring.redis.host=127.0.0.1
 spring.redis.port=6379
 spring.redis.password=kidgrow
 spring.redis.timeout=5000
+
+#rabbitmq\u914D\u7F6E
+kidgrow.rabbitmq.host=192.168.2.240
+kidgrow.rabbitmq.port=5672
+kidgrow.rabbitmq.username=liuke
+kidgrow.rabbitmq.password=kidgrow2020
+kidgrow.rabbitmq.exchangeName=BoneAgeEvaluation
+kidgrow.rabbitmq.queueName=test_queue
+kidgrow.rabbitmq.routingKeyName=Kidgrow2020
+kidgrow.rabbitmq.virtual-host=kidgrow
 
 #\u963F\u91CCDruid\u914D\u7F6E
 kidgrow.druid.loginname=admin
@@ -35,6 +47,13 @@
 kidgrow.fdfs.web-url=127.0.0.1
 kidgrow.fdfs.trackerList=${kidgrow.fdfs.web-url}:22122
 
+####\u963F\u91CCOSS\u914D\u7F6E
+kidgrow.oss.access-key=LTAI4FennfcwZupz3B6hkK3N
+kidgrow.oss.accessKeySecret=NzBBGe8SS41qJlp0nA3tlJ3t74lBZM
+kidgrow.oss.endpoint=123.kidgrow.cloud
+kidgrow.oss.bucketName=kidgrow
+kidgrow.oss.domain=http://123.kidgrow.cloud/
+
 ##### \u65E5\u5FD7\u94FE\u8DEF\u8FFD\u8E2A
 kidgrow.trace.enable=true
 
@@ -42,4 +61,15 @@
 kidgrow.ribbon.isolation.enabled=false
 
 ##### mybatis-plus\u6253\u5370\u5B8C\u6574sql(\u53EA\u9002\u7528\u4E8E\u5F00\u53D1\u73AF\u5883)
-mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
\ No newline at end of file
+mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+
+##### \u5BA1\u8BA1\u65E5\u5FD7\u914D\u7F6E
+kidgrow.audit-log.enabled=true
+kidgrow.audit-log.log-type=db
+kidgrow.audit-log.datasource.driver-class-name=com.mysql.jdbc.Driver
+kidgrow.audit-log.datasource.jdbc-url=jdbc:mysql://${kidgrow.datasource.ip}:3306/logger_center_${spring.profiles.active}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
+kidgrow.audit-log.datasource.username=${kidgrow.datasource.username}
+kidgrow.audit-log.datasource.password=${kidgrow.datasource.password}
+
+##  appUrl \u9759\u6001\u6587\u4EF6\u4E0A\u4F20\u8DEF\u5F84
+appUrl=http://192.168.2.240/upload/
\ No newline at end of file
diff --git a/kidgrow-config/src/main/resources/application-fat.properties b/kidgrow-config/src/main/resources/application-fat.properties
index 158c74c..854f337 100644
--- a/kidgrow-config/src/main/resources/application-fat.properties
+++ b/kidgrow-config/src/main/resources/application-fat.properties
@@ -1 +1,54 @@
-# \u6D4B\u8BD5\u73AF\u5883
\ No newline at end of file
+# \u6D4B\u8BD5\u73AF\u5883
+########################## \u7EDF\u4E00\u53D8\u91CF\u914D\u7F6E ##########################
+##### \u6570\u636E\u5E93\u914D\u7F6E
+kidgrow.datasource.ip=rm-2ze84sb2l40k33a034o.mysql.rds.aliyuncs.com
+kidgrow.datasource.username=yingdawangluo
+kidgrow.datasource.password=Yingdawangluo2020
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+##### Redis\u914D\u7F6E
+# \u662F\u5426\u5F00\u542FRedis\u7F13\u5B58  true\u5F00\u542F   false \u5173\u95ED
+spring.redis.open=true
+spring.redis.host=182.92.99.224
+spring.redis.port=6379
+spring.redis.password=kidgrow
+spring.redis.timeout=5000
+
+#\u963F\u91CCDruid\u914D\u7F6E
+kidgrow.druid.loginname=admin
+kidgrow.druid.loginpwd=123456
+
+#eureka \u6CE8\u518C\u4E2D\u5FC3Url
+kidgrow.eureka.client.serviceUrl.defaultZone=http://182.92.99.224:9001/eureka/
+kidgrow.eureka.instance.hostname=182.92.99.224
+##eureka client\u53D1\u9001\u5FC3\u8DF3\u7ED9server\u7AEF\u7684\u9891\u7387
+eureka.instance.lease-renewal-interval-in-seconds=30
+#eureka client\u95F4\u9694\u591A\u4E45\u53BB\u62C9\u53D6\u670D\u52A1\u6CE8\u518C\u4FE1\u606F\uFF0C\u9ED8\u8BA4\u4E3A30\u79D2\uFF0C\u5BF9\u4E8Eapi-gateway\uFF0C\u5982\u679C\u8981\u8FC5\u901F\u83B7\u53D6\u670D\u52A1\u6CE8\u518C\u72B6\u6001\uFF0C\u53EF\u4EE5\u7F29\u5C0F\u8BE5\u503C\uFF0C\u6BD4\u59825\u79D2
+eureka.instance.lease-expiration-duration-in-seconds=30
+
+##### elasticsearch\u914D\u7F6E
+kidgrow.elasticsearch.cluster-name=kidgrow-es
+kidgrow.elasticsearch.cluster-nodes=123.57.164.62
+
+##### sentinel\u914D\u7F6E
+kidgrow.sentinel.dashboard=127.0.0.1:6999
+
+##### fastDFS\u914D\u7F6E
+kidgrow.fdfs.web-url=127.0.0.1
+kidgrow.fdfs.trackerList=${kidgrow.fdfs.web-url}:22122
+
+##### \u65E5\u5FD7\u94FE\u8DEF\u8FFD\u8E2A
+kidgrow.trace.enable=true
+
+##### \u8D1F\u8F7D\u5747\u8861\u9694\u79BB(version\u9694\u79BB\uFF0C\u53EA\u9002\u7528\u4E8E\u5F00\u53D1\u73AF\u5883)
+kidgrow.ribbon.isolation.enabled=false
+
+##### mybatis-plus\u6253\u5370\u5B8C\u6574sql(\u53EA\u9002\u7528\u4E8E\u5F00\u53D1\u73AF\u5883)
+mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+
+##### \u5BA1\u8BA1\u65E5\u5FD7\u914D\u7F6E
+kidgrow.audit-log.enabled=true
+kidgrow.audit-log.log-type=db
+kidgrow.audit-log.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+kidgrow.audit-log.datasource.jdbc-url=jdbc:mysql://${kidgrow.datasource.ip}:3306/logger_center?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
+kidgrow.audit-log.datasource.username=${kidgrow.datasource.username}
+kidgrow.audit-log.datasource.password=${kidgrow.datasource.password}
\ No newline at end of file
diff --git a/kidgrow-config/src/main/resources/application-open.properties b/kidgrow-config/src/main/resources/application-open.properties
new file mode 100644
index 0000000..8ad5957
--- /dev/null
+++ b/kidgrow-config/src/main/resources/application-open.properties
@@ -0,0 +1,74 @@
+# \u7EBF\u4E0A\u73AF\u5883
+########################## \u7EDF\u4E00\u53D8\u91CF\u914D\u7F6E ##########################
+##### \u6570\u636E\u5E93\u914D\u7F6E
+kidgrow.datasource.ip=rm-2ze84sb2l40k33a034o.mysql.rds.aliyuncs.com
+kidgrow.datasource.username=yingdawangluo
+kidgrow.datasource.password=Yingdawangluo2020
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+##### Redis\u914D\u7F6E
+# \u662F\u5426\u5F00\u542FRedis\u7F13\u5B58  true\u5F00\u542F   false \u5173\u95ED
+spring.redis.open=true
+spring.redis.host=182.92.99.224
+spring.redis.port=6379
+spring.redis.password=kidgrow
+spring.redis.timeout=5000
+
+#rabbitmq\u914D\u7F6E
+kidgrow.rabbitmq.host=182.92.99.224
+kidgrow.rabbitmq.port=5672
+kidgrow.rabbitmq.username=liuke
+kidgrow.rabbitmq.password=kidgrow2020
+kidgrow.rabbitmq.exchangeName=BoneAgeEvaluation
+kidgrow.rabbitmq.queueName=test_queue
+kidgrow.rabbitmq.routingKeyName=Kidgrow2020
+kidgrow.rabbitmq.virtual-host=kidgrow
+
+#\u963F\u91CCDruid\u914D\u7F6E
+kidgrow.druid.loginname=admin
+kidgrow.druid.loginpwd=123456
+
+#eureka \u6CE8\u518C\u4E2D\u5FC3Url
+kidgrow.eureka.client.serviceUrl.defaultZone=http://172.17.97.143:9001/eureka/,http://172.17.64.228:9001/eureka/
+kidgrow.eureka.instance.hostname=127.0.0.1
+##eureka client\u53D1\u9001\u5FC3\u8DF3\u7ED9server\u7AEF\u7684\u9891\u7387
+eureka.instance.lease-renewal-interval-in-seconds=30
+#eureka client\u95F4\u9694\u591A\u4E45\u53BB\u62C9\u53D6\u670D\u52A1\u6CE8\u518C\u4FE1\u606F\uFF0C\u9ED8\u8BA4\u4E3A30\u79D2\uFF0C\u5BF9\u4E8Eapi-gateway\uFF0C\u5982\u679C\u8981\u8FC5\u901F\u83B7\u53D6\u670D\u52A1\u6CE8\u518C\u72B6\u6001\uFF0C\u53EF\u4EE5\u7F29\u5C0F\u8BE5\u503C\uFF0C\u6BD4\u59825\u79D2
+eureka.instance.lease-expiration-duration-in-seconds=30
+
+##### elasticsearch\u914D\u7F6E
+kidgrow.elasticsearch.cluster-name=Kidgrow
+kidgrow.elasticsearch.cluster-nodes=192.168.2.240
+
+##### sentinel\u914D\u7F6E
+kidgrow.sentinel.dashboard=127.0.0.1:6999
+
+##### fastDFS\u914D\u7F6E
+kidgrow.fdfs.web-url=127.0.0.1
+kidgrow.fdfs.trackerList=${kidgrow.fdfs.web-url}:22122
+
+####\u963F\u91CCOSS\u914D\u7F6E
+kidgrow.oss.access-key=LTAI4FennfcwZupz3B6hkK3N
+kidgrow.oss.accessKeySecret=NzBBGe8SS41qJlp0nA3tlJ3t74lBZM
+kidgrow.oss.endpoint=oss-cn-beijing-internal.aliyuncs.com
+kidgrow.oss.bucketName=kidgrow
+kidgrow.oss.domain=http://open.oss.kidgrow.cloud/
+
+##### \u65E5\u5FD7\u94FE\u8DEF\u8FFD\u8E2A
+kidgrow.trace.enable=true
+
+##### \u8D1F\u8F7D\u5747\u8861\u9694\u79BB(version\u9694\u79BB\uFF0C\u53EA\u9002\u7528\u4E8E\u5F00\u53D1\u73AF\u5883)
+kidgrow.ribbon.isolation.enabled=false
+
+##### mybatis-plus\u6253\u5370\u5B8C\u6574sql(\u53EA\u9002\u7528\u4E8E\u5F00\u53D1\u73AF\u5883)
+mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+
+##### \u5BA1\u8BA1\u65E5\u5FD7\u914D\u7F6E
+kidgrow.audit-log.enabled=true
+kidgrow.audit-log.log-type=db
+kidgrow.audit-log.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+kidgrow.audit-log.datasource.jdbc-url=jdbc:mysql://${kidgrow.datasource.ip}:3306/logger_center_${spring.profiles.active}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
+kidgrow.audit-log.datasource.username=${kidgrow.datasource.username}
+kidgrow.audit-log.datasource.password=${kidgrow.datasource.password}
+
+##### \u79FB\u52A8\u7AEF\u4E0A\u4F20\u5149\u7247Web\u5E94\u7528URL
+appUrl=http://open.upload.kidgrow.cloud/
\ No newline at end of file
diff --git a/kidgrow-config/src/main/resources/application-pro.properties b/kidgrow-config/src/main/resources/application-pro.properties
index 6536071..7bd6070 100644
--- a/kidgrow-config/src/main/resources/application-pro.properties
+++ b/kidgrow-config/src/main/resources/application-pro.properties
@@ -1 +1,54 @@
-# \u7EBF\u4E0A\u73AF\u5883
\ No newline at end of file
+# \u7EBF\u4E0A\u73AF\u5883
+########################## \u7EDF\u4E00\u53D8\u91CF\u914D\u7F6E ##########################
+##### \u6570\u636E\u5E93\u914D\u7F6E
+kidgrow.datasource.ip=127.0.0.1
+kidgrow.datasource.username=root
+kidgrow.datasource.password=root
+spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+##### Redis\u914D\u7F6E
+# \u662F\u5426\u5F00\u542FRedis\u7F13\u5B58  true\u5F00\u542F   false \u5173\u95ED
+spring.redis.open=true
+spring.redis.host=127.0.0.1
+spring.redis.port=6379
+spring.redis.password=
+spring.redis.timeout=5000
+
+#\u963F\u91CCDruid\u914D\u7F6E
+kidgrow.druid.loginname=admin
+kidgrow.druid.loginpwd=123456
+
+#eureka \u6CE8\u518C\u4E2D\u5FC3Url
+kidgrow.eureka.client.serviceUrl.defaultZone=http://127.0.0.1:9001/eureka/
+kidgrow.eureka.instance.hostname=127.0.0.1
+##eureka client\u53D1\u9001\u5FC3\u8DF3\u7ED9server\u7AEF\u7684\u9891\u7387
+eureka.instance.lease-renewal-interval-in-seconds=30
+#eureka client\u95F4\u9694\u591A\u4E45\u53BB\u62C9\u53D6\u670D\u52A1\u6CE8\u518C\u4FE1\u606F\uFF0C\u9ED8\u8BA4\u4E3A30\u79D2\uFF0C\u5BF9\u4E8Eapi-gateway\uFF0C\u5982\u679C\u8981\u8FC5\u901F\u83B7\u53D6\u670D\u52A1\u6CE8\u518C\u72B6\u6001\uFF0C\u53EF\u4EE5\u7F29\u5C0F\u8BE5\u503C\uFF0C\u6BD4\u59825\u79D2
+eureka.instance.lease-expiration-duration-in-seconds=30
+
+##### elasticsearch\u914D\u7F6E
+kidgrow.elasticsearch.cluster-name=Kidgrow
+kidgrow.elasticsearch.cluster-nodes=192.168.2.240
+
+##### sentinel\u914D\u7F6E
+kidgrow.sentinel.dashboard=127.0.0.1:6999
+
+##### fastDFS\u914D\u7F6E
+kidgrow.fdfs.web-url=127.0.0.1
+kidgrow.fdfs.trackerList=${kidgrow.fdfs.web-url}:22122
+
+##### \u65E5\u5FD7\u94FE\u8DEF\u8FFD\u8E2A
+kidgrow.trace.enable=true
+
+##### \u8D1F\u8F7D\u5747\u8861\u9694\u79BB(version\u9694\u79BB\uFF0C\u53EA\u9002\u7528\u4E8E\u5F00\u53D1\u73AF\u5883)
+kidgrow.ribbon.isolation.enabled=false
+
+##### mybatis-plus\u6253\u5370\u5B8C\u6574sql(\u53EA\u9002\u7528\u4E8E\u5F00\u53D1\u73AF\u5883)
+mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+
+##### \u5BA1\u8BA1\u65E5\u5FD7\u914D\u7F6E
+kidgrow.audit-log.enabled=true
+kidgrow.audit-log.log-type=db
+kidgrow.audit-log.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+kidgrow.audit-log.datasource.jdbc-url=jdbc:mysql://${kidgrow.datasource.ip}:3306/logger_center?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
+kidgrow.audit-log.datasource.username=${kidgrow.datasource.username}
+kidgrow.audit-log.datasource.password=${kidgrow.datasource.password}
\ No newline at end of file
diff --git a/kidgrow-config/src/main/resources/application-uat.properties b/kidgrow-config/src/main/resources/application-uat.properties
index f969f4d..4f16308 100644
--- a/kidgrow-config/src/main/resources/application-uat.properties
+++ b/kidgrow-config/src/main/resources/application-uat.properties
@@ -1 +1,76 @@
-# \u9884\u4E0A\u7EBF\u73AF\u5883
\ No newline at end of file
+# \u9884\u4E0A\u7EBF\u73AF\u5883
+########################## \u7EDF\u4E00\u53D8\u91CF\u914D\u7F6E ##########################
+##### \u6570\u636E\u5E93\u914D\u7F6E
+kidgrow.datasource.ip=rm-2ze84sb2l40k33a034o.mysql.rds.aliyuncs.com
+kidgrow.datasource.username=yingdawangluo
+kidgrow.datasource.password=Yingdawangluo2020
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+##### Redis\u914D\u7F6E
+# \u662F\u5426\u5F00\u542FRedis\u7F13\u5B58  true\u5F00\u542F   false \u5173\u95ED
+spring.redis.open=true
+spring.redis.host=182.92.99.224
+spring.redis.port=6379
+spring.redis.password=kidgrow
+spring.redis.timeout=5000
+
+#rabbitmq\u914D\u7F6E
+kidgrow.rabbitmq.host=182.92.99.224
+kidgrow.rabbitmq.port=5672
+kidgrow.rabbitmq.username=liuke
+kidgrow.rabbitmq.password=kidgrow2020
+kidgrow.rabbitmq.exchangeName=BoneAgeEvaluation
+kidgrow.rabbitmq.queueName=test_queue
+kidgrow.rabbitmq.routingKeyName=Kidgrow2020
+kidgrow.rabbitmq.virtual-host=kidgrow
+
+
+#\u963F\u91CCDruid\u914D\u7F6E
+kidgrow.druid.loginname=admin
+kidgrow.druid.loginpwd=123456
+
+#eureka \u6CE8\u518C\u4E2D\u5FC3Url
+kidgrow.eureka.client.serviceUrl.defaultZone=http://172.17.97.143:9001/eureka/,http://172.17.64.228:9001/eureka/
+kidgrow.eureka.instance.hostname=127.0.0.1
+##eureka client\u53D1\u9001\u5FC3\u8DF3\u7ED9server\u7AEF\u7684\u9891\u7387
+eureka.instance.lease-renewal-interval-in-seconds=30
+#eureka client\u95F4\u9694\u591A\u4E45\u53BB\u62C9\u53D6\u670D\u52A1\u6CE8\u518C\u4FE1\u606F\uFF0C\u9ED8\u8BA4\u4E3A30\u79D2\uFF0C\u5BF9\u4E8Eapi-gateway\uFF0C\u5982\u679C\u8981\u8FC5\u901F\u83B7\u53D6\u670D\u52A1\u6CE8\u518C\u72B6\u6001\uFF0C\u53EF\u4EE5\u7F29\u5C0F\u8BE5\u503C\uFF0C\u6BD4\u59825\u79D2
+eureka.instance.lease-expiration-duration-in-seconds=30
+
+##### elasticsearch\u914D\u7F6E
+kidgrow.elasticsearch.cluster-name=kidgrow-es
+kidgrow.elasticsearch.cluster-nodes=123.57.164.62
+
+##### sentinel\u914D\u7F6E
+kidgrow.sentinel.dashboard=127.0.0.1:6999
+
+##### fastDFS\u914D\u7F6E
+kidgrow.fdfs.web-url=127.0.0.1
+kidgrow.fdfs.trackerList=${kidgrow.fdfs.web-url}:22122
+
+####\u963F\u91CCOSS\u914D\u7F6E
+kidgrow.oss.access-key=LTAI4FennfcwZupz3B6hkK3N
+kidgrow.oss.accessKeySecret=NzBBGe8SS41qJlp0nA3tlJ3t74lBZM
+kidgrow.oss.endpoint=123.kidgrow.cloud
+kidgrow.oss.bucketName=kidgrow
+kidgrow.oss.domain=http://123.kidgrow.cloud/
+
+
+##### \u65E5\u5FD7\u94FE\u8DEF\u8FFD\u8E2A
+kidgrow.trace.enable=true
+
+##### \u8D1F\u8F7D\u5747\u8861\u9694\u79BB(version\u9694\u79BB\uFF0C\u53EA\u9002\u7528\u4E8E\u5F00\u53D1\u73AF\u5883)
+kidgrow.ribbon.isolation.enabled=false
+
+##### mybatis-plus\u6253\u5370\u5B8C\u6574sql(\u53EA\u9002\u7528\u4E8E\u5F00\u53D1\u73AF\u5883)
+mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+
+##### \u5BA1\u8BA1\u65E5\u5FD7\u914D\u7F6E
+kidgrow.audit-log.enabled=true
+kidgrow.audit-log.log-type=db
+kidgrow.audit-log.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+kidgrow.audit-log.datasource.jdbc-url=jdbc:mysql://${kidgrow.datasource.ip}:3306/logger_center_${spring.profiles.active}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
+kidgrow.audit-log.datasource.username=${kidgrow.datasource.username}
+kidgrow.audit-log.datasource.password=${kidgrow.datasource.password}
+
+##### \u79FB\u52A8\u7AEF\u4E0A\u4F20\u5149\u7247Web\u5E94\u7528URL
+appUrl=https://upload.kidgrow.cloud/
\ No newline at end of file
diff --git a/kidgrow-config/src/main/resources/application.properties b/kidgrow-config/src/main/resources/application.properties
index 9e6ce7a..63ecf1e 100644
--- a/kidgrow-config/src/main/resources/application.properties
+++ b/kidgrow-config/src/main/resources/application.properties
@@ -16,19 +16,29 @@
 
 ##### feign\u914D\u7F6E
 feign.sentinel.enabled=true
-feign.hystrix.enabled=false
+#\u542F\u52A8\u7194\u65AD\u673A\u5236
+feign.hystrix.enabled=true
+#\u542F\u7528OkHttp \u66FF\u6362 URLConnection
 feign.okhttp.enabled=true
+#\u542F\u7528\u66FF\u6362JDK\u539F\u751FURLConnection
 feign.httpclient.enabled=false
 feign.httpclient.max-connections=1000
 feign.httpclient.max-connections-per-route=100
 feign.client.config.feignName.connectTimeout=30000
 feign.client.config.feignName.readTimeout=30000
+feign.client.config.default.connect-timeout=20000
+feign.client.config.default.read-timeout=20000
 ## \u5F00\u542FFeign\u8BF7\u6C42\u54CD\u5E94\u538B\u7F29
 feign.compression.request.enabled=true
 feign.compression.response.enabled=true
 ## \u914D\u7F6E\u538B\u7F29\u6587\u6863\u7C7B\u578B\u53CA\u6700\u5C0F\u538B\u7F29\u7684\u6587\u6863\u5927\u5C0F
 feign.compression.request.mime-types=text/xml,application/xml,application/json
-feign.compression.request.min-request-size=2048
+feign.compression.request.min-request-size=2048 
+# hystrix.command.default.execution.timeout.enabled: false
+#\u8D85\u65F6\u65F6\u957F
+hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 10000
+#\u9694\u79BB\u7EA7\u522B
+hystrix.command.default.execution.isolation.strategy: SEMAPHORE
 
 ##### Redis\u914D\u7F6E
 # \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
@@ -93,4 +103,8 @@
 mybatis-plus.global-config.db-config.logic-not-delete-value=0
 # \u539F\u751F\u914D\u7F6E
 mybatis-plus.configuration.map-underscore-to-camel-case=true
-mybatis-plus.configuration.cache-enabled=false
\ No newline at end of file
+mybatis-plus.configuration.cache-enabled=false
+#\u6587\u4EF6\u4E0A\u4F20\u5927\u5C0F\u8BBE\u7F6E
+spring.servlet.multipart.max-file-size=100MB
+spring.servlet.multipart.max-request-size=1000MB
+
diff --git a/kidgrow-config/src/main/resources/bootstrap.properties b/kidgrow-config/src/main/resources/bootstrap.properties
index 9eed521..4062430 100644
--- a/kidgrow-config/src/main/resources/bootstrap.properties
+++ b/kidgrow-config/src/main/resources/bootstrap.properties
@@ -7,4 +7,9 @@
 management.endpoint.health.show-details=always
 
 ##### \u5141\u8BB8bean\u8986\u76D6
-spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
+spring.main.allow-bean-definition-overriding=true
+
+#####\u5B57\u7B26\u7C7B\u578B#####
+spring.http.encoding.charset=UTF-8
+spring.http.encoding.enabled=true
+spring.http.encoding.force=true
\ No newline at end of file
diff --git a/kidgrow-demo/kidgrow-demo-order/Dockerfile b/kidgrow-demo/kidgrow-demo-order/Dockerfile
new file mode 100644
index 0000000..fef5f1e
--- /dev/null
+++ b/kidgrow-demo/kidgrow-demo-order/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-demo/kidgrow-demo-order/pom.xml b/kidgrow-demo/kidgrow-demo-order/pom.xml
index 3bb1d89..3038261 100644
--- a/kidgrow-demo/kidgrow-demo-order/pom.xml
+++ b/kidgrow-demo/kidgrow-demo-order/pom.xml
@@ -38,6 +38,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/BaseController.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/BaseController.java
new file mode 100644
index 0000000..8de9f32
--- /dev/null
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/BaseController.java
@@ -0,0 +1,30 @@
+package com.kidgrow.order.controller;
+
+import com.kidgrow.common.constant.SecurityConstants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/4/14 16:21 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Component
+public class BaseController {
+
+    @Autowired
+    private HttpServletRequest request;
+
+    private String userID;
+
+
+    public String getUserID(){
+        userID=request.getHeader(SecurityConstants.USER_ID_HEADER);
+        return userID;
+    }
+}
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/OrderDetailController.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/OrderDetailController.java
new file mode 100644
index 0000000..8b04c87
--- /dev/null
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/OrderDetailController.java
@@ -0,0 +1,49 @@
+package com.kidgrow.order.controller;
+
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.order.service.IOrderDetailService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/3/26 18:27 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@RestController
+@RequestMapping("/orderdetail")
+@Api(tags = "")
+public class OrderDetailController {
+    @Autowired
+    private IOrderDetailService orderDetailService;
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "查询列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "page", value = "分页起始位置", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "limit", value = "分页结束位置", required = true, dataType = "Integer")
+    })
+    @GetMapping
+    public PageResult list(@RequestParam Map<String, Object> params) {
+//        DynamicTableContextHolder.setDynamicTable("order_detail_2020");
+//        DynamicTableContextHolder.setDynamicTable("order_info_2020");
+
+        return orderDetailService.findList(params,"_2020");
+    }
+}
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/OrderInfoController.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/OrderInfoController.java
index f8becd5..0eb3286 100644
--- a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/OrderInfoController.java
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/OrderInfoController.java
@@ -37,7 +37,7 @@
 @RestController
 @Slf4j
 @RequestMapping("order")
-public class OrderInfoController {
+public class OrderInfoController  extends BaseController{
 
     @Autowired
     private OrderInfoMapper orderInfoMapper;
@@ -74,6 +74,8 @@
 
         log.info("用户ID:"+request.getHeader(SecurityConstants.USER_ID_HEADER));
 
+        log.info("用户ID:"+ getUserID());
+
         log.info("ClientID:"+request.getHeader(SecurityConstants.CLIENT_HEADER));
 
         log.info("TenantID:"+request.getHeader(SecurityConstants.TENANT_HEADER));
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/OrderTestController.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/OrderTestController.java
index b3b978a..fd401d5 100644
--- a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/OrderTestController.java
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/OrderTestController.java
@@ -12,9 +12,12 @@
 import lombok.extern.slf4j.Slf4j;
 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 java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 
@@ -63,16 +66,35 @@
     }
 
     /**
+     * 根据OrderTest当做查询条件进行查询
+     */
+    @ApiOperation(value = "根据OrderTest当做查询条件进行查询")
+    @PostMapping("/query")
+    public ResultBody findByObject(@RequestBody OrderTest orderTest) {
+        OrderTest model = orderTestService.findByObject(orderTest);
+        return ResultBody.ok().data(model).msg("查询成功");
+    }
+
+    /**
      * 新增or更新
      */
     @ApiOperation(value = "保存")
     @PostMapping
     public ResultBody save(@Valid @RequestBody OrderTest orderTest, BindingResult bindingResult) {
+        List<String> errMsg= new ArrayList<>();
         if (bindingResult.hasErrors()) {
-            return ResultBody.failed().msg(bindingResult.getFieldError().getDefaultMessage());
+            for (ObjectError error : bindingResult.getAllErrors()) {
+                errMsg.add(error.getDefaultMessage());
+            }
+            return ResultBody.failed().msg(errMsg.toString());
         } else {
-            orderTestService.saveOrUpdate(orderTest);
-            return ResultBody.ok().data(orderTest).msg("保存成功");
+            boolean v= orderTestService.saveOrUpdate(orderTest);
+            if(v) {
+                return ResultBody.ok().data(orderTest).msg("保存成功");
+            }
+            else{
+                return ResultBody.failed().msg("保存失败");
+            }
         }
     }
 
@@ -82,7 +104,12 @@
     @ApiOperation(value = "删除")
     @DeleteMapping("/{id}")
     public ResultBody delete(@PathVariable Long id) {
-        orderTestService.removeById(id);
-        return ResultBody.ok().msg("删除成功");
+        boolean v= orderTestService.removeById(id);
+        if(v) {
+            return ResultBody.ok().msg("删除成功");
+        }
+        else {
+            return ResultBody.failed().msg("删除失败");
+        }
     }
 }
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/WeiXinImportData.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/WeiXinImportData.java
new file mode 100644
index 0000000..b8dcafb
--- /dev/null
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/controller/WeiXinImportData.java
@@ -0,0 +1,30 @@
+package com.kidgrow.order.controller;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.order.utils.JsonUtils;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/4/4 12:50 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@RestController
+@RequestMapping("/importdata")
+public class WeiXinImportData {
+
+    @RequestMapping("/{fileName}")
+    public ResultBody importPersonData(@PathVariable String fileName) throws IOException {
+        Map<String,Object> wxFriendList = JsonUtils.getMap("personal/"+fileName+".json");
+        System.out.println(wxFriendList.toString());
+        return ResultBody.ok().data(wxFriendList);
+    }
+}
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/mapper/OrderInfoDetailMapper.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/mapper/OrderInfoDetailMapper.java
index bde544d..c19103a 100644
--- a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/mapper/OrderInfoDetailMapper.java
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/mapper/OrderInfoDetailMapper.java
@@ -1,7 +1,12 @@
 package com.kidgrow.order.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.kidgrow.order.entity.OrderInfoDetail;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * @author liuke
@@ -9,4 +14,13 @@
  * @date 2019/11/22
  */
 public interface OrderInfoDetailMapper extends BaseMapper<OrderInfoDetail> {
+    /**
+     * 分页查询列表
+     * @param page
+     * @param params
+     * @return
+     */
+    List<OrderInfoDetail> findList(Page<OrderInfoDetail> page, @Param("p") Map<String, Object> params,@Param("tableTag") String tableTag);
+
+    List<OrderInfoDetail> findListAll(Page<OrderInfoDetail> page, @Param("p") Map<String, Object> params);
 }
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/mapper/OrderTestMapper.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/mapper/OrderTestMapper.java
index a90588d..1e17979 100644
--- a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/mapper/OrderTestMapper.java
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/mapper/OrderTestMapper.java
@@ -24,4 +24,6 @@
      * @return
      */
     List<OrderTest> findList(Page<OrderTest> page, @Param("p") Map<String, Object> params);
+
+    OrderTest findByObject(@Param("p") OrderTest orderTest);
 }
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/model/OrderDetail.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/model/OrderDetail.java
new file mode 100644
index 0000000..8ea2e97
--- /dev/null
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/model/OrderDetail.java
@@ -0,0 +1,26 @@
+package com.kidgrow.order.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.kidgrow.common.model.SuperModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/3/26 18:17 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("order_detail_test")
+public class OrderDetail extends SuperModel {
+    private static final long serialVersionUID = 1L;
+
+    //
+    private Long testId;
+    //
+    private String name;
+}
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/model/OrderTest.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/model/OrderTest.java
index 2b0d278..8aa3f5e 100644
--- a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/model/OrderTest.java
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/model/OrderTest.java
@@ -1,10 +1,21 @@
 package com.kidgrow.order.model;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.kidgrow.common.annotation.DateValidator;
+import com.kidgrow.common.constant.BaseConstants;
 import com.kidgrow.common.model.SuperModel;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import org.hibernate.validator.constraints.*;
+import org.hibernate.validator.constraints.Email;
+import org.hibernate.validator.constraints.Length;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import java.util.Date;
+
 
 
 
@@ -24,11 +35,33 @@
     private static final long serialVersionUID = 1L;
 
     //
-    @NotBlank(message = "订单名不能为空")
+    @NotEmpty(message = "订单名不能为空")
     private String name;
     //
 
     @Length(min=5, max=10,message = "用户名长度为5-10")
-    @NotBlank(message = "用户名不能为空")
+    @NotEmpty(message = "用户名不能为空")
     private String namecn;
+
+    @DateValidator(minDate = "2019-01-01",message = "有效期限不能早于2019-01-01")
+    private Date addDate;
+
+
+    @NotEmpty(message = "邮箱不能为空")
+    @Email(message = "邮箱格式不正确")
+    private String mail;
+
+    @NotEmpty(message = "手机号不能为空")
+    @Pattern(regexp= BaseConstants.PHONE_REGEXP,message = "手机号格式不正确")
+    private String phone;
+
+    @NotNull(message = "年龄不能为空")
+    @Min(value = 0,message = "年龄必须大于等于0")
+    @Max(value = 200,message = "年龄不能大于200")
+    private Integer age;
+
+    @NotNull(message = "性别不能为空")
+    @Min(value = 0,message = "性别,1-男,2-女,0-未知")
+    @Max(value = 2,message = "性别,1-男,2-女,0-未知")
+    private Integer sex;
 }
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/model/WxFriend.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/model/WxFriend.java
new file mode 100644
index 0000000..0e06141
--- /dev/null
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/model/WxFriend.java
@@ -0,0 +1,24 @@
+package com.kidgrow.order.model;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/4/4 12:37 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+public class WxFriend implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String head_img;
+    private String nick_name;
+//    private String remark_name;
+    private String user_name;
+    private String wxid;
+}
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/IOrderDetailService.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/IOrderDetailService.java
new file mode 100644
index 0000000..97d4949
--- /dev/null
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/IOrderDetailService.java
@@ -0,0 +1,26 @@
+package com.kidgrow.order.service;
+
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.ISuperService;
+import com.kidgrow.order.entity.OrderInfoDetail;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/3/26 18:16 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public interface IOrderDetailService extends ISuperService<OrderInfoDetail> {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    PageResult<OrderInfoDetail> findList(Map<String, Object> params,String tableTag);
+
+    PageResult<OrderInfoDetail> findListAll(Map<String, Object> params);
+}
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/IOrderTestService.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/IOrderTestService.java
index bbf0c5d..03ecb48 100644
--- a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/IOrderTestService.java
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/IOrderTestService.java
@@ -21,5 +21,7 @@
      * @return
      */
     PageResult<OrderTest> findList(Map<String, Object> params);
+
+    OrderTest findByObject(OrderTest orderTest);
 }
 
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/impl/OrderDetailServiceImpl.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/impl/OrderDetailServiceImpl.java
new file mode 100644
index 0000000..0346302
--- /dev/null
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/impl/OrderDetailServiceImpl.java
@@ -0,0 +1,50 @@
+package com.kidgrow.order.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.kidgrow.common.model.PageResult;
+import com.kidgrow.common.service.impl.SuperServiceImpl;
+import com.kidgrow.order.entity.OrderInfoDetail;
+import com.kidgrow.order.mapper.OrderInfoDetailMapper;
+import com.kidgrow.order.service.IOrderDetailService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/3/26 18:21 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@Service
+public class OrderDetailServiceImpl extends SuperServiceImpl<OrderInfoDetailMapper, OrderInfoDetail> implements IOrderDetailService {
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<OrderInfoDetail> findList(Map<String, Object> params,String tableTag){
+        Page<OrderInfoDetail> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<OrderInfoDetail> list  =  baseMapper.findList(page, params,tableTag);
+        return PageResult.<OrderInfoDetail>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+
+    /**
+     * 列表
+     * @param params
+     * @return
+     */
+    @Override
+    public PageResult<OrderInfoDetail> findListAll(Map<String, Object> params){
+        Page<OrderInfoDetail> page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
+        List<OrderInfoDetail> list  =  baseMapper.findListAll(page, params);
+        return PageResult.<OrderInfoDetail>builder().data(list).code(0).count(page.getTotal()).build();
+    }
+}
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/impl/OrderTestServiceImpl.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/impl/OrderTestServiceImpl.java
index 8cc17bf..79cbbdc 100644
--- a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/impl/OrderTestServiceImpl.java
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/service/impl/OrderTestServiceImpl.java
@@ -1,18 +1,17 @@
 package com.kidgrow.order.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.service.impl.SuperServiceImpl;
+import com.kidgrow.order.mapper.OrderTestMapper;
+import com.kidgrow.order.model.OrderTest;
+import com.kidgrow.order.service.IOrderTestService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.MapUtils;
-import lombok.extern.slf4j.Slf4j;
-
-import com.kidgrow.order.model.OrderTest;
-import com.kidgrow.order.mapper.OrderTestMapper;
-import com.kidgrow.order.service.IOrderTestService;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -36,4 +35,9 @@
         List<OrderTest> list  =  baseMapper.findList(page, params);
         return PageResult.<OrderTest>builder().data(list).code(0).count(page.getTotal()).build();
     }
+
+    @Override
+    public OrderTest findByObject(OrderTest orderTest){
+        return baseMapper.findByObject(orderTest);
+    }
 }
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/utils/JsonUtils.java b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/utils/JsonUtils.java
new file mode 100644
index 0000000..20ce7d4
--- /dev/null
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/java/com/kidgrow/order/utils/JsonUtils.java
@@ -0,0 +1,50 @@
+package com.kidgrow.order.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.io.IOUtils;
+import org.springframework.core.io.ClassPathResource;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.Charset;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/4/4 12:48 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class JsonUtils {
+    public static JSONObject readJsonFromClassPath(String path) throws IOException {
+
+        ClassPathResource resource = new ClassPathResource(path);
+        if (resource.exists()) {
+            String areaData =  IOUtils.toString(resource.getInputStream(), Charset.forName("UTF-8"));
+            return (JSONObject)JSON.parse(areaData);
+        } else {
+            throw new IOException();
+        }
+    }
+
+    public static Map<String,Object> getMap(String path){
+        Map<String,Object> map = new LinkedHashMap();
+        try {
+            //路径
+            ClassPathResource classPathResource = new ClassPathResource(path);
+            //读取文件信息
+            String str = IOUtils.toString(new InputStreamReader(classPathResource.getInputStream(),"UTF-8"));
+            //转换为Map对象
+            map = JSONObject.parseObject(str, LinkedHashMap.class);
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+}
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/resources/application.yml b/kidgrow-demo/kidgrow-demo-order/src/main/resources/application.yml
index 77b0393..d0efb31 100644
--- a/kidgrow-demo/kidgrow-demo-order/src/main/resources/application.yml
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/resources/application.yml
@@ -11,10 +11,10 @@
   application:
     name: demo-order-server
   datasource:
-    url: jdbc:mysql://${kidgrow.datasource.ip}:3306/demo_order?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
+    url: jdbc:mysql://${kidgrow.datasource.ip}:3306/demo_order?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
     username: ${kidgrow.datasource.username}
     password: ${kidgrow.datasource.password}
-    driver-class-name: com.mysql.jdbc.Driver
+#    driver-class-name: com.mysql.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
     druid:
       aop-patterns: com.kidgrow.order.controller.*,com.kidgrow.order.mapper.*
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/resources/mapper/OrderInfoDetailMapper.xml b/kidgrow-demo/kidgrow-demo-order/src/main/resources/mapper/OrderInfoDetailMapper.xml
new file mode 100644
index 0000000..d9ee859
--- /dev/null
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/resources/mapper/OrderInfoDetailMapper.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!---->
+<mapper namespace="com.kidgrow.order.mapper.OrderInfoDetailMapper">
+    <!--定义根据-OrderDetail当作查询条件返回对象集合-->
+    <select id="findList"  resultType="com.kidgrow.order.entity.OrderInfoDetail">
+        select t.* from order_detail${tableTag} t,order_info${tableTag} s where t.order_id=s.order_id
+    </select>
+
+    <select id="findListAll" resultType="com.kidgrow.order.entity.OrderInfoDetail">
+        select t.* from order_detail t,order_info s where t.order_id=s.order_id
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/kidgrow-demo/kidgrow-demo-order/src/main/resources/mapper/OrderTestMapper.xml b/kidgrow-demo/kidgrow-demo-order/src/main/resources/mapper/OrderTestMapper.xml
index 20406f5..587b07e 100644
--- a/kidgrow-demo/kidgrow-demo-order/src/main/resources/mapper/OrderTestMapper.xml
+++ b/kidgrow-demo/kidgrow-demo-order/src/main/resources/mapper/OrderTestMapper.xml
@@ -2,8 +2,45 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <!---->
 <mapper namespace="com.kidgrow.order.mapper.OrderTestMapper">
+    <!--定义查询列-->
+    <sql id="Column_List">
+	   *
+	</sql>
+
+    <!--sql查询片段-->
+    <sql id="where">
+        <where>
+            <!--查询条件自行添加-->
+
+            <if test="p.id != null and p.id !=''">
+                and id = #{p.id}
+            </if>
+            <if test="p.name != null and p.name !=''">
+                and name = #{p.name}
+            </if>
+            <if test="p.namecn != null and p.namecn !=''">
+                and namecn = #{p.namecn}
+            </if>
+            <if test="p.phone != null and p.phone !=''">
+                and phone = #{p.phone}
+            </if>
+            <if test="p.sex != null and p.sex !=''">
+                and sex = #{p.sex}
+            </if>
+        </where>
+    </sql>
+
     <!--定义根据-OrderTest当作查询条件返回对象集合-->
     <select id="findList" resultType="com.kidgrow.order.model.OrderTest">
         select * from order_test t
     </select>
+
+    <select id="findByObject" resultType="com.kidgrow.order.model.OrderTest">
+        select
+        <include refid="Column_List"/>
+        from order_test
+        <include refid="where"/>
+        order by id desc
+        limit 1
+    </select>
 </mapper>
\ No newline at end of file
diff --git "a/kidgrow-demo/kidgrow-demo-order/src/main/resources/personal/\351\273\204\346\263\275\345\245\275\345\217\213\345\210\227\350\241\250.json" "b/kidgrow-demo/kidgrow-demo-order/src/main/resources/personal/\351\273\204\346\263\275\345\245\275\345\217\213\345\210\227\350\241\250.json"
new file mode 100644
index 0000000..2b54d0f
--- /dev/null
+++ "b/kidgrow-demo/kidgrow-demo-order/src/main/resources/personal/\351\273\204\346\263\275\345\245\275\345\217\213\345\210\227\350\241\250.json"
@@ -0,0 +1,842 @@
+[
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/AdESj3pAwEWk30ibunCdjLFrB2ACvyAw9eX8aszibleib64LqicqLYTknxBMWn7icxa0UlPIbsw0aZicwEIpefvFK1HpiavibwBs3KicYFzQsV5BcSNI/132",
+        "nick_name": "兰",
+        "remark_name": "西城卫生院郑仕兰",
+        "user_name": "",
+        "wxid": "wxid_dbvaokmws6e421"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/EiaDuibFia1XX8SdIxJPEPMpTnLN5Ql3rhpvbQaFJSy8t6hiaEHBw4XyialmgnT548Piceg3kcrNTNz6kEo266YeObLcwxSJoYBUBUjwaxyn8emCA/132",
+        "nick_name": "阿香",
+        "remark_name": "静海区妇儿保健中心王宝香",
+        "user_name": "axiang103",
+        "wxid": "wxid_c2toxdqqbl3822"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/o4GEZFhKCzj1hzJico4ZYq3UbTcCtXBtibRoLlgdVadGrZicFQicMljHRFliawcRc69QiaZEqQPwyic6G71arOXpokk7gV7jIcN0xTRdHArhA4ziblE/132",
+        "nick_name": "许飞17332979830",
+        "user_name": "",
+        "wxid": "wxid_1ii0scgkopq222"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/cAJec5V1bZTF7iaB2f4zAIbRXOtnhEaXEhibO5ib9mav4hpn1YuG4LINZ2flKmW1Dg6UjyT3lrh7YPL36mhiczsIMm85klhCsPmpS17vEnUnSZg/132",
+        "nick_name": "南",
+        "remark_name": "湖南省人民南庆玲",
+        "user_name": "NanQingling",
+        "wxid": "wxid_fl18g6qi8pbz22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/m11ZT3ozfibg7cnibqhq8SPPgxxzVmpVhCG5JH2DLDvCGcxkiayicibUmlsVBgxzhWictOyJRhKu46Tmd6QP502MHoUnicygdWKdC62Ue0R3vP3AqI/132",
+        "nick_name": "徐徐如升",
+        "remark_name": "龙岩第一医院徐钰荣",
+        "user_name": "wpxyr357",
+        "wxid": "wxid_43zn7qwfgigz21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/V0a0g0icYKCx3PibAibHC7e0OaoibKtNNMNkJIRBOhPNRBwk91KZmXUGxot1NBmW6Uc1o19csmVZss2lpLeiaENZnYgY8icgw7lENEtryicr980gSY/132",
+        "nick_name": "喜高骨龄软件赵雷17332977830",
+        "user_name": "zl1394725105",
+        "wxid": "wxid_xb8hp5izzpzj22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/YPHVpA6g30ib3hqEpP2XW5I7vzssRlicJV5FzwdeS0bWhZdoFdH0bL8u4TKI5mlFnvDaYgoE3QpbUlo5xnQNVMPWFnA0tCticwO1sVhg7z6nG4/132",
+        "nick_name": "cc33",
+        "remark_name": "丰城妇幼蔡淑玲",
+        "user_name": "",
+        "wxid": "wxid_64veofq0l8kq12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/OrGvUEia97ytU67naEcmhickesLqQJ7tLlBysD46QFSLnMKGu9fUfwMBaX1UiaJL5htaFVpvOAVMtiarlBOibMIia56k4WNZKHicBYjYIDb4hguZnk/132",
+        "nick_name": "周迎霞",
+        "user_name": "",
+        "wxid": "wxid_4v8vh8rp14lg21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/DsVY817PqAO2qO3oVYq8mkCVSXj34icEwHdFyJPIlM5JLJQCqUS5Er9R9wjsp2BibZ8L6V7oz0Q3u4jBhTafR1try81ibibD8yJLscWgfMUaa2c/132",
+        "nick_name": "🍄",
+        "remark_name": "娄星区妇幼李海红",
+        "user_name": "haihong1027",
+        "wxid": "wxid_lyg1lu3xv05d22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SdkWnagkjbhYZmhDocghgPOW28AHhicY1SNDt2z1leRC5qZaACRuRzB1IaibofuPlC201fAOkibCO0d2H0oKftunqxGQpKBQW4lbdhky0zrIJs/132",
+        "nick_name": "徐昭成",
+        "user_name": "xzz20030115",
+        "wxid": "wxid_bav9g0uwycj722"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iaxZyWNoM0hiatT9BFOzMZyia1TzsS66zTzunmnRNzoDQnXI8ya6CpZ4B1D69eg1eCT8TuOaEodhHRNO9VVU0vB3gV8BjON8FiasZok5IfyPXGY/132",
+        "nick_name": "ling",
+        "remark_name": "睿宝儿科董美玲",
+        "user_name": "",
+        "wxid": "wxid_2ikbwxzs8p6z22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/QJkIrle5LM1fG91KicGA0EBh05SYVQt7O0IibtGczTS2dBD5u9nicmX2c4990UYGBXhcRp03XcvafUv9meR2vMGasKvQsB9iceJd7mIcDGo1qYU/132",
+        "nick_name": "Healer",
+        "remark_name": "罗湖妇幼保健院谢舒茵",
+        "user_name": "xsybaby_",
+        "wxid": "wxid_02u9f428o6lp12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/S6BpIzRGPPepzBdmBuJ3xib7gn6NVGtNGUGEF8ibyZBRNqmaes0KBApNlYNUHWay9lu6ugLpI4grArQZ9GsgibpXKfY8XtoNHGygGwjibjK7NSQ/132",
+        "nick_name": "铭记",
+        "remark_name": "罗湖区妇幼张亚伟",
+        "user_name": "",
+        "wxid": "wxid_xghe0b645qa322"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/zLxmvEgEvz83ia9FYEOgaJX2O8dukhsdz3yPyv4iaAFFOoWkAyHLzYibYOFvibTlaN62501DC9BztZkUCrpuzFL99CprV5NIf4qZhqkMibLmnveI/132",
+        "nick_name": "菩提",
+        "remark_name": "西城街道社区张丽君",
+        "user_name": "zlj170872914",
+        "wxid": "wxid_zba56q1rg5n812"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/QDg90Jm7fQ2n4dSrTnEUS68v8umOknvay9qic3wRrgtrjEeFeEvCSgeLXSBeKujB4HofiaCVYLDiaU60IpmibvHt7ZOx7DaM673R6X5Z0fPFXQE/132",
+        "nick_name": "大手牵小手",
+        "remark_name": "广西自治区妇幼陈伟平",
+        "user_name": "",
+        "wxid": "wxid_06negsl45r5n21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/TgYeJOE9RrDZFn4wfNib4oIib36sd0LsGGxEPia5ibpycMdiarXfibB3ZoaLEZPDbT52H84gcvvmULpcdUw6rPN4JVcBPbzxZEYOLNdjdb9ymCcick/132",
+        "nick_name": "李雷雷James-儿科医生",
+        "remark_name": "李雷雷James-儿科医生睿宝儿科",
+        "user_name": "leiziaxgj1314",
+        "wxid": "wxid_l2cbl44189ut22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/lFxC1DYaA91YVxV0F5wcH3ak4LtVEIr5OAmciaVyT4XXFl3gBnDTGHaTzgvgFR6ibzm0jdlVSCrftvNibFcibvCZycGbOF3XrVvOL3H4x8pSnJU/132",
+        "nick_name": "Hua",
+        "remark_name": "长沙妇幼刘华",
+        "user_name": "lhlzfljw",
+        "wxid": "wxid_0c3daojto1mp21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/MRqutbwUbuUURfjAqAwXvMnGMGBV6OasNrd4qLUoXf9fBAfkHo3zIdX0ZX4cdvmmcQFfhEF1yAarqicbC9YYUdadyTxgnCSJaA1KeuZGCItA/132",
+        "nick_name": "珠珠",
+        "remark_name": "罗湖区妇幼素珠",
+        "user_name": "",
+        "wxid": "wxid_8v0eeornsa3821"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/CTntDv5mias94mo2Hp9XN3ph8ia1PDXicE7BEKYOWxgB9PdXabib0u6QOpK0fERKkDth0PHPr6EzvmXSvA6Vzk0aAhrFCD14fRplKqXhYJFgMP0/132",
+        "nick_name": "冬",
+        "remark_name": "信丰人民卢东英",
+        "user_name": "DongYing13766363599",
+        "wxid": "wxid_0dn5cwxzkr6w21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/5QxrgKpJIUD7LFN4Ca3VDQ6vMSy7zEe9a4q0lJSeu7xdWONZ2bJCmcbe9PCltCMZpgW3vicoXIUN1N43281YY9VzKLdCYlRKytT0SXrm0tic8/132",
+        "nick_name": "黄泽",
+        "user_name": "qdd5201314hz",
+        "wxid": "wxid_dtjifsd6wtcb22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SEzzPBe40oYZZIxCuQjAKariag6Y8kdbtr9KetKvtLiaZfRNeKcTDgoOmWicwu0QGu85brrp5GVHIAuXntQjt1Xfwh6MA4cDtAOgSYWCHzafC8/132",
+        "nick_name": "宁静致远",
+        "remark_name": "樊桂灵,河南西峡县人民医院",
+        "user_name": "zhxfglzjnzry",
+        "wxid": "wxid_34rqr6v6dvuz22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/0QGW6sEgmht8OcJxSibHlrOyncr2guOS5F4TzxIMqfXopTKxnzbibPtGxichx9tFCd9JRrRunK4dKuK7JsHnWibf81gPQa0hNBdQOW0XNfPwcpE/132",
+        "nick_name": "€**@",
+        "remark_name": "龙岗妇产医院钟霞",
+        "user_name": "",
+        "wxid": "wxid_rvjww6c2i5hi21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/I8tufUib9l3SqofRO5J3biaOeOEJQdG20orovY7wQbiaxZ5ChzLK38kefppVq2e8ymn3KxG6kwHcwD0ic9niaVImoczDL4UibmtHAhNNOGLpDVLKY/132",
+        "nick_name": "向阳而生",
+        "remark_name": "柳州妇幼儿童保健科潘艳明",
+        "user_name": "p1123379476",
+        "wxid": "wxid_pqxg72dy8na321"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/O2MO3rRQLsEDY58g1af4eCSsFJHXqpEPOeuvte1QOJ6FXbUYSoFiaviab4AeBKvPcBycqmK7iaAmY6e3pD4KXc0vY3KAtfJHJZGibALXP7xsKOc/132",
+        "nick_name": "一生拥有",
+        "remark_name": "李组建蓝山县妇幼",
+        "user_name": "lzj13787673938",
+        "wxid": "wxid_c11wrxkwnl5g12"
+    },
+    {
+        "head_img": "",
+        "nick_name": "刘东",
+        "user_name": "",
+        "wxid": "wxid_rabvfgpdk00022"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Dcficv3zaV4ib3sC6UaPFtydseVSj4Q93iaaUqxtEMoDRdpeEbOvxl9MjyjdZYTxicdZLx3dmsa5bQ3exygV9engzw/132",
+        "nick_name": "星光",
+        "remark_name": "信丰人民康桥英",
+        "user_name": "kqy15870717365",
+        "wxid": "wxid_ve0umzbu1cz322"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/mZhhmNl0dhkgA4FhYGCH1jR3sBlzbjTia4zYvqe8Yw8J5tmib6cn13EzBVF5iayMIcibu1HCg0ym7RSkJfNiaYDponIkcSJpVz4uAT3Xr9Sb0a44/132",
+        "nick_name": "喜高骨龄~刘瑞博",
+        "user_name": "",
+        "wxid": "wxid_y6km65u5hj1g22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/CQKQjIPyZcePoibgEQEJJw3iamUT9UlGZvQA21Hed0FuqYa8NiaRibzUblll99SibejzwCfQktkbB14Iz4XwUWYtkt0ESpcA3cDb6jXqexszXVZ0/132",
+        "nick_name": "....",
+        "remark_name": "夏梦琳邵阳二附院",
+        "user_name": "",
+        "wxid": "wxid_8iein2cdbhm221"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ibpO1Cjic329rN9jiaADA4RQRShgKiaGQJpkTbNXia1xY1OaoeDIib4HDJGuJt5SEVbFReOgoE5iafofMY1gD7gOzdF4ok1wqgScGOVOTfazE6a7HI/132",
+        "nick_name": "啊颖",
+        "remark_name": "柳州市妇幼保健院儿童保健科罗文颖",
+        "user_name": "luo1228ying",
+        "wxid": "wxid_vx9hrq0ojva921"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Rt7hnlIZ1HDtpsKdrmMh9SPZeib99eDXaBrGgJiauqfDtCVmJ2amZDK7lluSU5385SdjHh1LUkgvENCh4PjHF9zeic8mMlPyWTUYzBuvecpsbU/132",
+        "nick_name": "冰华",
+        "remark_name": "长汀妇幼郑冰华",
+        "user_name": "zbh15759017343",
+        "wxid": "wxid_ibuycxztyjbf22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gOz7TicRqFACRg7TGKno09M6aCTUjPZZkuN794VfagaLciaPbpJHXZJC592bgFmicPo7wvzHOQutLxOgn8HXblxOcTwgib8as1f1v1cKibRPDANw/132",
+        "nick_name": "梅子",
+        "remark_name": "梅子罗湖区",
+        "user_name": "",
+        "wxid": "wxid_7fbsrp6ompbp22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/JqOpuu9uC0ialpNBASwwjnaLaMCyjQ9oic5MbrxZwsaMPN7e5YMyqQ3qv3XkI5BIfEJV225TFqCvdGJic5ib8C0L0EcEJ3HD74sDxkUzZl7sR0A/132",
+        "nick_name": "Phebe🥕 W",
+        "remark_name": "睿宝儿科王姣",
+        "user_name": "joyoya",
+        "wxid": "artisitry"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/89s6s3QusqmmCicHI6oficU9y0icylooAhwyQD6raGCibGrsicGoeNFdyYtLYydZFMAJIG6xDnnMqWL9eiaknYYibsDfuHVJADEdxfK4hGEqWFn70nDjLWlNJGe735Nsh2zKFqk/132",
+        "nick_name": "麦素漫",
+        "remark_name": "罗湖妇幼麦",
+        "user_name": "",
+        "wxid": "wxid_j51ewe2gvv6s21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/OkQSKsce97HO8zxt5coNUTGIXCRFUroOnju2TantqZvQImfGX65jYRCe5KvOcbLmK1iaOLq4ibxllz0lzGOUcRyFqwjFC2eWq7ibetjnic69icPw/132",
+        "nick_name": "阿程",
+        "remark_name": "程庆武莆田涵江区医院",
+        "user_name": "",
+        "wxid": "acheng151786"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/kQGtic9f6u1oLwwVWiamxicFJRSkjztdHeAvMwVyHEnibbDzsHmQicGcltC4icYeJoaOiaBJ4lxhWCj1gZgLXV1GvrfgrjmnUzHSFWkxMP0gltic9Dg/132",
+        "nick_name": "长高助手",
+        "user_name": "xigaozhanggao",
+        "wxid": "wxid_6ylvo1smxhir22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/BvgpIjFCL2Pu2ruvBWb74uTKows1dbbqn65fjiamnF9lKHvWu4kGV7WS4xHSuUY9QGsFPKqicrZsR4MiavSnJewn82INxiae30UWQbwYEsbCuicE/132",
+        "nick_name": "Peter昊",
+        "remark_name": "上海睿宝儿科Peter昊",
+        "user_name": "luyihao514022",
+        "wxid": "wxid_ix4ko1pqyo0a21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/hPTsvnwA8xjaM7eoib8wR6SQNHaQciaIAnThb2vO0aFpdzCicb9Aq2ezvsuNAYVDhwicMo8yG4BoWwQ3z4KQpBwyiag/132",
+        "nick_name": "尤娜",
+        "user_name": "",
+        "wxid": "baby381793083"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Hqhhib2UPe1QmTJAKGkAia5K7tog6jAQFzHg7HW1QJsH485BjwAMCQHvlDicwGcRe07ClobXbKJBUhS7GqUvMI92vhbowo4lYaxxGmRMmgJFbg/132",
+        "nick_name": "曦晖",
+        "remark_name": "曦晖睿宝儿科",
+        "user_name": "popgeng1211",
+        "wxid": "wxid_8nzwzkxjky4x12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/wr8gJuRfmBv8E1asLjaTr1HZL8t03QgxOwtvxdQHibaNjF132mYruK7RoelDBiaOfNJH1kyiaHoQBWic21UibTXdibYUEicgmk6JfbRiceibic8C1Pgick/132",
+        "nick_name": "山楂",
+        "remark_name": "天津中医药附一张珊",
+        "user_name": "ZS18322263273",
+        "wxid": "wxid_ozqn9dob413822"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/olw8GfYRaGThyjqe47pg1aCngLyXiaASRRV0asfNppgZoXtXJpguVAKpuI9dVBzghq1yUtiaEoW6XTEKFk8yQ4DwdD63ZHeyFXCt8G6KwAVhQ/132",
+        "nick_name": "筛查助手",
+        "user_name": "xigao4006008865",
+        "wxid": "wxid_t8c7433dkp8b22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/N2aemibeE1uyibhYibtrK6GuiaZ2VQ0Q5I8MSb2ypw6ctrQU4lW7MLNqs8bpkdhr8MadNJLOC2rreVPnfgwNHtM6K1omnSfkmzCp8z3FK1aSYZY/132",
+        "nick_name": "黄美金",
+        "remark_name": "德保妇幼黄美金",
+        "user_name": "",
+        "wxid": "wxid_sr1oj7020hso21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ZiaYaI9gPy8KBDZU8nc5gIiamNbvYqibITjWFJXMXWjiaWtGibeib0jo4hwleS3Qh6xHsrdd9OEDOxvI3mguuLwURJcQUKPqk2KW1q4JkATZa4Xlo/132",
+        "nick_name": "胡淑萍",
+        "user_name": "",
+        "wxid": "wxid_p7zxv4j2yj9n12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Lp6WXwqVRic97TPib4VzYzKibmjSEk4o4pGfOW7DUIogSHWric3okQm7aoGW4IN7CQM0tYeicnB63xeHNskorYzicUcn93dtt2Sc6lCCTia221woBM/132",
+        "nick_name": "蓝金金",
+        "remark_name": "龙岩第一医院蓝金金",
+        "user_name": "LJJ13850649885",
+        "wxid": "wxid_xuq7tmjkum522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Oyv8Qcz3gPO5icp58SGSiaWXX9b4iaH491ibUGib10KxwXOBMPWK5vehRvK4W2bfop0fStAk2SoQyrFKWcMoD7kmZ5vPXes8guficibjhYvVZ97ib0k/132",
+        "nick_name": "汤医生",
+        "remark_name": "天津妇儿汤喆滢",
+        "user_name": "Tang_zheying",
+        "wxid": "wxid_ng2zxmex19wy22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8nxQibxl0cPtzk4tkdtAmkHIY5t3I7XgrMaACHQBSUbfaMI6nX1AZnKHjKHOIXEHVueibLWIFEP4vlAIfvA8ia5wJKicU3ZtaSG5nIW5icWolicicc/132",
+        "nick_name": "葡萄糖",
+        "remark_name": "信丰中医院袁宜禄",
+        "user_name": "",
+        "wxid": "KuCha111888"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8BBteSrMxMicagwSicKE4bpkJOxgnq6AwyCXMnLOx3tYX8N8QsF9k2Y0Hlqic3p7Kaic6nLYGF6pLUgSNtibKbLF1pPVluL97e5kibibibVBU9gtbv4/132",
+        "nick_name": "虾米",
+        "remark_name": "罗妇幼保健院刘利虾",
+        "user_name": "",
+        "wxid": "wxid_zylu6d7tfsxo12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/C9KibaqsN1ljic8N66M4EBZxIbRDoJHE85L55MFTp3YN130XocF3Pp1zPk7R2H07ibTx7VnMoKP6CzqrGL8F831An0Ml2uAQGbOraBFwRS4OTg/132",
+        "nick_name": "子津²º²º",
+        "remark_name": "黄子娟柳州妇幼",
+        "user_name": "ZJ200059",
+        "wxid": "wxid_4176981769812"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/pjvJR74upW9AD66mnmljKEZHddjySbq07DR4Et5gjdvuSyW3MssHeMYyHTpATEBa3QqfIdVYTic9ZOZKBat1H2ibCyoBNiaLwYUXqHnGThiahib8/132",
+        "nick_name": "云高",
+        "remark_name": "唯嘉儿科段云高",
+        "user_name": "",
+        "wxid": "Thinkduanduan"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/USY6Js1bMAwPhw16ib28zuRQMPuBVJftjQX6oLmHh411oCTbJibyMrJqEVnxgxick3PFJgD3Ub7Y9OCYLW1Wnepo0up8vbiaLtnh0y8icsFb1ibSw/132",
+        "nick_name": "依品绣窗帘-刘建红",
+        "remark_name": "建阳区妇幼刘建红",
+        "user_name": "",
+        "wxid": "wxid_7r8w4ioy0igw22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/XG3jknFUfwUv26jKMIc9MljXGTkwEnYtSDHyABIuDzYSEwhCUmGX9cjjKDv0AWicIWKb8vHfN9lBKabQrOBDpU8AiakcTlIU54LhDoiau2dAog/132",
+        "nick_name": "叶丰权",
+        "remark_name": "尤溪县妇幼保健院叶丰权",
+        "user_name": "",
+        "wxid": "wxid_vgvoig1xa23l22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Y6nt7mqq6dL122OaOkia3yBfDlHuuGicAibJPJPeMuOCNic9ULeE5XaKYqxBcvZU6lqh8KLyicdRoWfnzoneH0VGmyCcEcCHCFiajC1ibWiafktibJTs/132",
+        "nick_name": "肖爱",
+        "remark_name": "肖爱景德镇第三",
+        "user_name": "",
+        "wxid": "wxid_1pcvhjaqm1wp21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/F6uhNYjDcX7sZfeXsa2RoGO6YZb36ia85Ab1uhwicXft3V25osFo6MV5fDFOWBu4gsekOVT40yOdpicybwGCibwfbWqOR1viciaTvibFXG8XrTRXxo/132",
+        "nick_name": "娃娃鱼",
+        "remark_name": "湖南省人民马王堆院区张金花",
+        "user_name": "",
+        "wxid": "wxid_qphdtkdh8g6t22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iaHvII2bXKQjxGhSYKY5KUNC0ASVyrMuK1ia0tnf4j0ibYbKOm7y82NA8hjRLvIFRFHvEN1PunYsczrgViabyDeBWb1BtUTjXLfh7cy71YDMKPU/132",
+        "nick_name": "岚",
+        "remark_name": "吴薇岚广西妇幼",
+        "user_name": "",
+        "wxid": "herro1115"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/KTKZIDUTichPUvmgMgGiaYZqRPV54mNrsydDVoX80CUZ9DhEibEnicSLG7ibkDdYg81b8hJjn0V95DABaDA7F07xQUJglzVZ0RaJia6dwnbLg25vc/132",
+        "nick_name": "mini    梁燕婷",
+        "remark_name": "广西自治区妇幼   梁燕婷",
+        "user_name": "minilyt",
+        "wxid": "wxid_xe3o49y5106t21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/doxLpIdAazIiaT3dCfynuKpdDjeJZX6BqjbZibsSCl2paEjplLK8Tic90Emuflpiap7WfdzDPwlvha6ic8ZtjyRgKWA/132",
+        "nick_name": "翰麒",
+        "remark_name": "李淑芬南昌三院",
+        "user_name": "",
+        "wxid": "hanqi170207"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/5fzLwEn47H1u3WHwiayn9XEv7hjlD7xyib4lJcas647lbnMMqhibCQBlq9uUv2tzTUjHRMBhakKnGyFCcLGkkzibDKTvhiaRRricU21ibv6jU8vtXA/132",
+        "nick_name": "秀芳",
+        "remark_name": "尤溪妇幼邱秀",
+        "user_name": "qxf13850871561",
+        "wxid": "wxid_gtmstvuoldf022"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/1ghV5yjHNlkYAGP5kTCOeDwKlgcJ3qYeJgbBx1Q0gvjjZObou9oUVsCOrtqvyVe6yACP4ibA0NlBwLuh8JOpDlicRXIibs5rBP4ciawoGwLrSCI/132",
+        "nick_name": "hjl",
+        "remark_name": "新丰中医院胡金莲",
+        "user_name": "hjl67786806",
+        "wxid": "wxid_dn2rnatgpzp922"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Ez2YDYDoJjKQzHV8YKDU0Lz8JricTiaoTTTctSwe3PZaMkhkq27vFUQ6JK23kAhxfaqM5stkafRF54Nw2bdKsTaw/132",
+        "nick_name": "F肽",
+        "user_name": "",
+        "wxid": "happy273"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/1DkFmRiaJJodcxXib4jAPXVdAz4icfO5RKaDh7YibVPMn1ZL4TasWW7iavicUGlzbPoCZNXVH0owoJNIETODqOR0PAUX2GHqY9QZb15fGOVicv3DGs/132",
+        "nick_name": "郭靖",
+        "remark_name": "石城县人民医院郭靖",
+        "user_name": "a5792606",
+        "wxid": "wxid_87pilazksfoh21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/PUMm9O5UzU17jWCfqT685gT2ic6Qo2XJQJkaicflgsGaslGf2WdK01HANQpiau9TcpYZv1MBqxOrXKYyJHuiclFVibyDk4RiaKBibDDrPov9p10Zxw/132",
+        "nick_name": "G WZhen  ",
+        "remark_name": "罗湖区妇幼古维珍",
+        "user_name": "Nicole_33_",
+        "wxid": "Nicole-33000"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jmANGUOXJFEib2B7AWFYmerMb5bM7f0ALa3HtAr6KXdwkwUmgEBaOv6Kl0pW1swdCUTBVsvZgqJSURLme7CW0m6Z1UFomFicwH8NWicZVOUBTQ/132",
+        "nick_name": "骨龄软件梁磊17332962837",
+        "user_name": "woai_sp",
+        "wxid": "thll19881220"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2nLGy7GwibzsuFicIJeSYsS6GwhfEnMrV5e9vScsfsbSqB2jicSWw3Fea9dX0YCCx3FXNev8uKaUTiaEhcrs4H9023I5VnqBVDWeC9JkyNvR1aU/132",
+        "nick_name": "悠悠佳",
+        "remark_name": "罗湖区妇幼罗佳",
+        "user_name": "luojiawb159",
+        "wxid": "luojiawb13548571189"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/lr2RQ1mpn6ibLs78I4JWB2wOEBaSicWiaHbIM5hgQMHZRwkwZibVD8rD1jlDXeGuLsJVd3GMEO26IMp49ibstG2OoogkKdQzEwNJrWDJVJsO9iaPc/132",
+        "nick_name": "Nodeal",
+        "remark_name": "忻州儿童班郝越",
+        "user_name": "bhy779924",
+        "wxid": "wxid_g9oxlfw7ajen22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/cYkcBkart0rmLYvhbhrkYib38vA6HQsyQJ4xwEjicmQIe2xXXNyu3pjWELwwVbg2iaYOkRDiczZohcMkxYibS5ib1phoHLlslOIrVjm3VLRFvAic1c/132",
+        "nick_name": "宁静致远",
+        "remark_name": "罗湖区戴华英",
+        "user_name": "haoma13296190168",
+        "wxid": "wxid_eumcnizagx2l22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/cRdKKKHLTqRd7O0CwpfTcFgGpib4VVTwActKtpKjSvXuIrHtfouZia4TmOsGWcP9lonOvwcM1hFjTrqAxaSzGMMdnzkSWNGZ8mmw7wrna4jYk/132",
+        "nick_name": "月黄昏",
+        "remark_name": "新罗白沙镇卫生院邱啊柳",
+        "user_name": "qalxnn",
+        "wxid": "wxid_dodad7fnl9mi31"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/BOsvPa3cHRIFm0UbYCLvdgHLmxpJTwuLBGLGpHD4S0J58wsiaI4Fb4cmTlMXsHjJlicic9fxGBsSErs0VftSLyJFkMUap9PeibsvNw4MaiaiczqnE/132",
+        "nick_name": "古月🎀",
+        "remark_name": "建阳区妇幼胡洁睿",
+        "user_name": "fjwyshjr",
+        "wxid": "wxid_7656536573812"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/5ESHgOHlMTcDMKt4yaMnk410VFicKMhTnTEicK1fatMZeEHag1O2eARSkD01TsCyR33fLxaT4u21ZKd5l53aHmycawXDiaLicx3DibBs4t5orA20/132",
+        "nick_name": "戴眼镜的小虎牙",
+        "remark_name": "罗湖区李凯欢",
+        "user_name": "",
+        "wxid": "wxid_7lmqcdkpq0so22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/y1WWunFzAN9sr0glhsaxLROPrsffMibuj4CSRickFBwZfH3d26RF82NE53lialrCjucjONEmOFMOZx8eawTM1PheQXp41iaHjnXpEjeRwpdickho/132",
+        "nick_name": "芹英",
+        "remark_name": "龙岩红纺社区翁芹英",
+        "user_name": "ly2210055",
+        "wxid": "wxid_c7fw8qyz7tuz12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/dCwZch2TF8diauwKd4u1xpxtSH7FOACqueCjalcaCtwsaxDwqfXepoAHFSd49Z2U2icC141emz9bjuN5pVicLgxbQDR0AQBwlht3ogib6rxxutc/132",
+        "nick_name": "3",
+        "remark_name": "上杭妇幼",
+        "user_name": "",
+        "wxid": "llly-520"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/LFAgyRMNfXpoA6PIhuby2PLJ7cYrQOVSibGLCOrcCUklicrYN8NcsNicpibkwm6Ul8x8mMaf9GnMmB1FqTHF3PBSicstRcqBHFGZGiaENj7RvqZhg/132",
+        "nick_name": "半夏",
+        "remark_name": "上杭妇幼郭智威",
+        "user_name": "guo-zhui",
+        "wxid": "wxid_26nxjpfjkdjh22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ic9KicUIFlf65Riak03LkcribJiciaJ38y0ic2spLJtAV0RjJtskRkJibTYVegicydlk61Qf91zzGISmZqRwmeI72RdcEYylTb6VlC7dHvEuLIibbWfCI/132",
+        "nick_name": "天命",
+        "remark_name": "上饶人民夏国波",
+        "user_name": "",
+        "wxid": "bobo546086"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/sib0Q81ficiciaaBxSglFXLLvhLUt5WDWPsXYoQE7su8DZWNeia9wnCctHZ1tlL0icRrapeqaBYpZQoxNCIxTq6g0ItJ9WW6LMmvjHMZYd1kNzJaw/132",
+        "nick_name": "WRX🦋",
+        "remark_name": "罗湖区妇幼吴瑞霞",
+        "user_name": "wuruixia239",
+        "wxid": "wxid_3114791147412"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/oJibbFq1DSHcRHHlqBTIZpcDwIa9d6jQVx9BraOCibjPFPlLd9iaD9tCpA2Ao81YuwyZawsXKqDa0S6UyfGxJOPwDC0qjIW0GrpolznrVB5AEI/132",
+        "nick_name": "🍒小丸子👼",
+        "remark_name": "张护士罗湖区",
+        "user_name": "zhangshizhen890",
+        "wxid": "wxid_5t2qgc68calm22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/JNdGGjJ4XZibytqa1qwuJygzCSUBtvne5xkRVcU9cV1mHsUScdfnlcTicYOeaU1atxIjAppK8qyujvgxnPfkfEWQ/132",
+        "nick_name": "梁力",
+        "user_name": "",
+        "wxid": "lxglxg"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jclCGPQs7d7SRp9sibS2TSzfrobroLjrw5v8h5nfsKbJ2vN6gbTRWQibmw53WXQpF1mRIhbr9sXo2LGywbNpwk5pibGhpF84gLZlSstTkkcVvM/132",
+        "nick_name": "刘小慧",
+        "user_name": "",
+        "wxid": "wxid_wtwqq1xvfntq22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gEBSBoAXWrkFJsJqkWMeCRpibWcCzFibpf7ebOsEKaeDn5icvhx6E4erTmzWDAp0DJDGH1maUJGbdwqyYicwGP0LsstkHjL5dQ6caLKAFdR4Znk/132",
+        "nick_name": "佼佼",
+        "remark_name": "吉安罗英姣",
+        "user_name": "LYJ130219",
+        "wxid": "AMANNIforever"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2Rk4rFrwmZVcHpUnUZFvhicQdK77HOl8R2Sib2Vg8HicJJDevTyic2bEQjksBd2Ja5aMOJzqB5WQGz8jcjFV9xXNYmJECkVELxcl52PQoXTOOsE/132",
+        "nick_name": "Holly",
+        "remark_name": "上饶市人民李俊",
+        "user_name": "junlj0804",
+        "wxid": "wxid_5912lh60gka021"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ib8qib2OSkucshrXrPlQH2gKUKPhvoictRDzGth61CwrEJgSwpoIyic7umRpjkVnlpDNYDWuoWTmH1Rd6ZruP4oNQRiaFHXuzYKEu8DPOgfEbBmM/132",
+        "nick_name": "李莉",
+        "remark_name": "李莉信丰县中医院",
+        "user_name": "aml12140218",
+        "wxid": "wxid_frokm2mo7eek22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/udAicfgT834aPOwvTDMaTiaNwGiciaibjR5ccicdH3zUVtczGYrf0eJ1eSWYtNlmibNgCcQBFaM1OEHDFJ6ktlkjMTGJWdq6jM9GICbGibiaCeXJj8Es/132",
+        "nick_name": "KUMA",
+        "remark_name": "罗湖区妇幼叶子",
+        "user_name": "Ae_Aering",
+        "wxid": "wxid_wfaqa0hgzjg922"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jXxsib8q5OSzK3Cdic4jyfiaqCyV2zgTgicqmwm8HVWgfRmiaibeOqSWZUlMFJxgwDmTiakq2pUQZgIbUyp8oUs1Qdc2uUv3ohm0Snm0snyPb7pwSs/132",
+        "nick_name": "@_@余钦(=^_^=)",
+        "remark_name": "@_@余钦(=^_^=)织金县医院",
+        "user_name": "yuqin02160302",
+        "wxid": "wxid_9j29hmnvh01t21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/qZBVeLHmLZgOMDic5y9eXgxZicae9ibiap5c3RZ4t7gOg7rDawe0cOUm6xM2v0tIuN6ekOCHCgSWfXKg1fRbAudtnXWCWhQXMPZoL4iaKVWXllJg/132",
+        "nick_name": "Naduynauy",
+        "remark_name": "龙岗妇产医院袁钰丹",
+        "user_name": "D2278707656",
+        "wxid": "wxid_ocbf2p2asiv222"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2kiap6NMT9ZUaYo8EYr79y3ic1DCP8uw8b7fSaFVnEzGJJhURSkibLkq9TY5KZlrjbhGYB2Qn0pmvZK6zonDHsib9EIzibxtL0U2j22bNfFZ3T3U/132",
+        "nick_name": "兰心素竹",
+        "remark_name": "广西妇幼保健院儿保科李映",
+        "user_name": "L0455025009",
+        "wxid": "wxid_uhz5oqm72tn122"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/rcZRq9EYREUzic4ibdbO4wPzpxHItAaehZws26fRN10vqFr70KVNkd22yzQicWh3ByVp7ic397FucwFbTLKeC6Z6dVRia1PIj8GLP5oMmB1ve8nQ/132",
+        "nick_name": "秋梅",
+        "remark_name": "罗湖区谢秋梅",
+        "user_name": "xqm310107588",
+        "wxid": "wxid_r840x36qn9j422"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/3sAiaedicJGUbkDEoJdL4R13jDOgMrrZIic2uxDjX3EcEHUjeIfujPABYyDttb8JcksR8Nhtiaq9ccNMmmJM6nSQh5BfdicNiaLciaib9ic2BX6dm9hU/132",
+        "nick_name": "依諾",
+        "remark_name": "刘朝云玉林第一人民",
+        "user_name": "zhaoyun-liu",
+        "wxid": "wxid_uqaie0h7kfk322"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SYTPksok8piaGlRLQObBJMrPhKIjVgJqlL22CwtibrKu94Lw0Ro0g4eAm5W3BR0l9rCK9LVG4BQicYVwS0JSKJRickCn4QYc3NwJHbSSuibHdjSE/132",
+        "nick_name": "艳宇",
+        "remark_name": "天津中医药附一王艳宇",
+        "user_name": "zhezhe37658",
+        "wxid": "wxid_cs3zttebg38522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ZNokSJ5sxap512wlYfJiaKSUtgM6QRBfZM5zo19IftmCDLpCGekcrecXEJIDbeNgciapmxo10oyBZkuwsZduVyN7qqPndzbWmRoy9y9UE1Xj0/132",
+        "nick_name": "李远芳织金县妇幼保健院",
+        "user_name": "LyF18985361908",
+        "wxid": "wxid_x2v50nmopkhi22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/riaaQE9xLHZyjl6npERpiaBLzC28E9HqsT4JGe22fmYZ9fzdNaBuYZwpPG0ic7W7CibhGcgMyXUibib1NicsrwxvDQbibC0DuEIyDPcuHpZNDaeONVE/132",
+        "nick_name": "Aileen",
+        "remark_name": "赣州人民肖宜春",
+        "user_name": "allen523712",
+        "wxid": "wxid_6505085051021"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/AmaGcBNypoUKDxA0r42ibSLcMEJGRNy2K0MOK84oA73L1qrW9xiaZdKzQypnfrqvt3icIXDqmcsUCEliaMmRBoQq6cFuuTtS33Q0ibFLibuuYMe8o/132",
+        "nick_name": "李淑芬",
+        "remark_name": "李淑芬新疆二附院",
+        "user_name": "li15276629889",
+        "wxid": "wxid_7451154510912"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gvibiavRjNPRVH9ibtOxWTkxsBeGYIzquJDZwPiasvo8gNKXX6geyEanTt1DJQqgoPQJBmoY2mA6kicyFZrrFSCGeZiatwkFh2yn6jWicBCoFaTeeM/132",
+        "nick_name": "高洁",
+        "user_name": "",
+        "wxid": "j943679308"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/LfwH2dyiaek7WZQicdofs3lx62TWYkq46I3TkSwCFWqXVkqr0xUnRWgIJtkUzdoTY2DwJ39VZQ2Yr5rM1zVZdGDJTWmeN7XQgyHcWK1iaMfIS8/132",
+        "nick_name": "caddieju鞠",
+        "remark_name": "睿宝儿科鞠慧群",
+        "user_name": "caddieju629",
+        "wxid": "wxid_e41bh42unlvj12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/xpicSia7zjsSIRAouflxxU9qgYQ5lqUFianCl0REKZcHgbicQbBIIasNut7OezicNHqPgyyzmSgQ8HhlfePrNs9rbP3NRiaibPs4QT7gRYlqcrT5GE/132",
+        "nick_name": "qingzi",
+        "remark_name": "玉林第一人民覃莹莹",
+        "user_name": "ying18977572761",
+        "wxid": "wxid_f2j0dr0uorzq21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/6Mbvoyr3B8rgk6GV9mfOx9YfXVQTb2TOGGvz7pndib2oxcBWXhnLCAS5yJAics3IB3SQswouyw3pDA3KyHUXPOicMibH7KDqBs9upMF6NichJWDE/132",
+        "nick_name": "浅.躬",
+        "remark_name": "晋江市医院赵其书",
+        "user_name": "ZQS13960453125",
+        "wxid": "wxid_7861208612211"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8GglOt5xiaL69LhU3FuCkfFZ53joB1nESHEH5jEfISbTYKA3XYfh0PeoMbZmn9uvtZAytARCt4zCiaweoDJhSkqg/132",
+        "nick_name": "骨龄软件李建坡17332972683",
+        "user_name": "ljp124153964",
+        "wxid": "a124153964"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/U4rTlCsqbOv77t1ojxey0CcCGnbchicMgXk3GRLiapuH1gnauHHPFyYsP6V8k9G5fb7KPjMiafIEMBaiaaCqEklkcwWb9Lh0cRoerZ7hk0Mb5ck/132",
+        "nick_name": "Deep、深爱",
+        "remark_name": "沅江市妇幼秦沙",
+        "user_name": "qins1312",
+        "wxid": "qinsha891073"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ljWgrn47vO0P9yeVuMYVS1fial8tcKXNrBaFnCatDgxH5zpxWA1cXAPtz8ot5BW1DaHKszwz7w34QdusM5n1FicA/132",
+        "nick_name": "陈铭",
+        "remark_name": "新罗区妇幼陈铭",
+        "user_name": "",
+        "wxid": "chairmanone"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/PLOE7Ou27LYdvcaPfyMJlNeryZsNpe8SBI8PnOArW6UNIKAnDuApsy44RIYMDBJiaibz8eiahhyLCDtCBWibJOnBiaMc2sRxTWSCHSvN7iaPpunHM/132",
+        "nick_name": "秋叶",
+        "remark_name": "浏阳妇幼黄秋红",
+        "user_name": "",
+        "wxid": "wxid_rwed2v1ve89h21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/WkT6cSfVVry5JOxCianuAA5fx6ibSM4XzqibP64AianQo4vfNtc0AKwBzdiaKkeQJWl69FmEAO6Kv3rX9WDWqXVVyyXTyYb38vF4dUfo4thLcECE/132",
+        "nick_name": "WZ",
+        "remark_name": "茂名人民吴珍",
+        "user_name": "wz13686769298",
+        "wxid": "wxid_lcymf0gmk5tk12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/hdOmr1mia3o0uSqupahNWHqAWvtdkj14OdiaoYBllZQ2B5swz0wSVsJbx0HOoeGn0PgZ5gP8EmTL6Xib0W32OdUpg/132",
+        "nick_name": "童秀凤",
+        "remark_name": "童秀凤连城妇幼",
+        "user_name": "feng8929685",
+        "wxid": "wxid_y3j4kaqi1rdh22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Y5G7nodukoBOEzv50CJhRBT2iavviaic0Mnlt4frMq1NbYtibFqPbN6KcdHO5Y9q6CUPwSgLWib62QYSnFQSFBoex4w/132",
+        "nick_name": "陈小青",
+        "remark_name": "睿宝儿科陈小青",
+        "user_name": "",
+        "wxid": "cxq0368"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/VNbesJsoBjm8CxEB0jdDEBP1yNGpMPoP6aPSQhXOb6eR48V8rlqCaIsZRvranibN8jL4icFEITMNgKCEzfwUrn3kibqVMDZPHiczlnesc4ib2U3A/132",
+        "nick_name": "宁静致远",
+        "remark_name": "刘碧静柳州妇幼",
+        "user_name": "zzy20050220",
+        "wxid": "wxid_g93tbmzz1nud21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/NbEVznicOKuGu03WzIPaIcxSZQiayRamogDYN7RfDxicNyicf9smbfElfeCwoMZvd5RkQZBSdZHqUibGVib1nVzhagIl49VNxlCGPyy6r9UxqYHs0/132",
+        "nick_name": "圆脸天儿~",
+        "remark_name": "天津中医药附一单笑天",
+        "user_name": "shanxiaotian0721",
+        "wxid": "wxid_n8x4gkig0bb922"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/18CvJPDn3O8iaoc3WDyFncGsBGdUX8lZichS5Rcchr88Qicoqrf0micgQrY3ZZOLFp0MLOaqVlX0QLF1NFc5zsQorK1XpxKlSs487ypN42x6AqI/132",
+        "nick_name": "秋水连天",
+        "remark_name": "泰宁市妇幼邱水连",
+        "user_name": "qsl198630",
+        "wxid": "wxid_c7qy15tia82s21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/St3p02fVia5thtpvIkvj7xefKiaZre3VnoGSib7OqiatJHQhBCJQ6fic3uLkfMGMr5FMK3M5mpXKqjZaN7SSIxzKzI0e7gwVCvrmfv2x0Rfia8MtE/132",
+        "nick_name": "絮飞晴雪",
+        "remark_name": "邵阳县妇幼王卓珍",
+        "user_name": "zhuozheng305",
+        "wxid": "wxid_ds43tpjaf40k21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/eLmMChOfVUXIa0r0CEZsrDN6k1106coHdzqiaD6VPRa4lgdI9lLPUMCRGrCN8c6dzqsZxbbFK6EHsATWa3tWr6N02As6yPK8SHdP1MKPItgs/132",
+        "nick_name": "海波",
+        "user_name": "bp0913",
+        "wxid": "wxid_mf8j4486ofbc21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/655MqYOiciacvEYT3T7URV8G0EILqUD9SWanfGlQ7gEBEIQ5AHRmqPIpJ2wL74sTy9RyPiceOUHsJ9kVhV8mRccDlDC44XvZJiciclzquO1EAJR8/132",
+        "nick_name": "傅月芳",
+        "remark_name": "傅月芳西城社区",
+        "user_name": "",
+        "wxid": "wxid_dctkyy3womut22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/KmTUqpicmR2wVaref1nxjmxxnV0CImIlmVhFMR4nJliaL8XfiadeJ63KIt0pfFicB5R8P8M9GbqzbgbEH5mT8heq6EZQcN4ySzY6rhaWibShMFgI/132",
+        "nick_name": "傻妪",
+        "remark_name": "苏华珍尤溪妇幼",
+        "user_name": "wx2969shz",
+        "wxid": "wxid_yi0wofdswluj22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/HetnrxkRxn7b9w06oeFjjy5Q4wx3t4Y1w2OBY7oRuD4bq9EzlhRb33IxwmO2RgBqnUJyqTyuHuDMicCU4dZ1yvIALfK4Ru6JfhDt9gLnKAIw/132",
+        "nick_name": "距离",
+        "remark_name": "远东龙岗妇产医院段国巧",
+        "user_name": "",
+        "wxid": "wxid_h4jyavlq0ppg22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/FFJOFyjFHD2ibgVW2joenHNDNPeGXPibQeQl38PibfUtJy1IVKwFmLjzWv9etiad7cwQkcI0qWORKIHictAElIFoEVYQg1VWVFw1f8QmxHc4hUn4/132",
+        "nick_name": "鲁漫馒头",
+        "remark_name": "广西区妇幼儿童保健科刘露蔓",
+        "user_name": "",
+        "wxid": "lulumanman914741057"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/BvycJbPsaLAwQwZYIwCebJdnO8Dr13jOlMvdmc1SJS6srZvHyzHrN62qzAM4BxPT9TqrU1ic4CXTlIE0M1vW3GFfJ0JmsmMkyzYLjYF3thhI/132",
+        "nick_name": "鉊簰働鈼",
+        "remark_name": "德保妇幼梁忠兴",
+        "user_name": "satur0111",
+        "wxid": "wxid_qcbmi6xce98o21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/icp3hzmJ5WfibNxqYfpT08cfIs1RXZBk7UJ7r5Whyb8FQ5b6WoeLyoibdqsFib62wYg3ddKumy9Hh0hicSAZBYW1dcAXoeK6Fn4yLf1SevU3zJxs/132",
+        "nick_name": "summer  Ouyang",
+        "remark_name": "睿宝儿科欧阳书林",
+        "user_name": "",
+        "wxid": "ouyangshulin2012"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/EKgLL1D7kHiag0k75LDj7KMVL1gIXMdlr2aeZnian3xYIRQERRfo01kBehc4yAwFkKbRBic8u2icA8LhfEYlPNR8q3ptA35bqvibRN3KG0GxOwdo/132",
+        "nick_name": ".NET开发工程师兼维护-赵兵亮",
+        "user_name": "",
+        "wxid": "wxid_hv7ghpmaos5612"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/DfdFR6liaHjv7ywfMbGMCYj7RqH7CHCAn7O37kxWL1jFE8t91Dl2RHehfB6x4p6I7n9X70ia5Suic3iak772K6kyL72bkziaxgYoYcZibMdRey21E/132",
+        "nick_name": "彧",
+        "remark_name": "上杭妇幼龚佩丰",
+        "user_name": "g1360455993",
+        "wxid": "wxid_xqtzmkejf0no21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ZIUvs1R9vEzHu7GMGaoDKmrzJSFxySSt7TS9cMHJz802d3oR4XMgoA22z09D0uMvYMapLEZo7ARCCSNxZCVtXibicW95UPTlBvbicGGpbB4Qss/132",
+        "nick_name": "云行叶小",
+        "remark_name": "寿宁县医院叶明生",
+        "user_name": "yms15587604225",
+        "wxid": "wxid_tosxodt9zc1322"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/p4TlZNqIia3Yx0K8qGj2zCrLSsX3BCWVXOvXYXCWLrSsxKDrcJNQfKPjxxK4agKPibLLQHhhRmMtCuUcI7JFfhiawuEAxPiaCfnPhUTfmP0hYUA/132",
+        "nick_name": "五子",
+        "remark_name": "湖南省妇女儿童伍永娥",
+        "user_name": "",
+        "wxid": "wuzi514922"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/H6rDRgSiarU8l6mtDtseibiaV4QDYt2I27Tm1qJ0zq0F762Jpf91p4SeK5jY7hPDeJlzaHehmR87X0e5ibrqYPsj0B12RDAJr3dE0KkLLHGJZR8/132",
+        "nick_name": "一寸光阴",
+        "remark_name": "袁主任新会妇幼",
+        "user_name": "ysy051",
+        "wxid": "wxid_1zihlij5ftx122"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/dGrpr3DibWKTRQzpdroIcbKxlSH1XEITNLISYNxE0iaYtW7hNPQYoxH9TJHSJ0RVggUxkLqerV9srWeEU1XcOCUQ/132",
+        "nick_name": "才鸟",
+        "remark_name": "龙岩市中医院蔡清霞",
+        "user_name": "",
+        "wxid": "shrimp-water"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ibL2g9GQD1SvHpJaCDHEYrQZfxGIZ1jjWqFot0FJ1EKibszPrYJwbOnRuqkicSZQvnvcnGlajicA6Av48aibbBzuznyibSIzEzHBGugL4U5iaebqPk/132",
+        "nick_name": "(岩芳)仙游妇幼儿童保健",
+        "user_name": "cyf13859889670",
+        "wxid": "wxid_708qqcscba9r11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/DeYW0eunzjsc9sibbBiaE21wibgVhdKuAVwZWbqXM3oibnvLCGibs4WLd1xicyoeY3ksTGjKvibyT90PNAXcs0my7LA5icWp2J4PpKG3vhhcxQW159k/132",
+        "nick_name": "小粒粒",
+        "remark_name": "广西妇幼儿保张力",
+        "user_name": "zli50846",
+        "wxid": "wxid_bi547cai5snu21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iaSSlMTG5NuFNUnxVJAibRH61SYuib2O0Bic6PHBV2BTz4TJia6PFDgstsdrv1d7t9uib33bNH523k89YddnM16KO7OqVzxQZd0AcCTSbwTY76Nf4/132",
+        "nick_name": "小洛米",
+        "remark_name": "陈飞邵阳学院二附院",
+        "user_name": "",
+        "wxid": "z214977460"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/NycrRcXDaKnIiaAZ4xpJQVYoPC8CfUibQPWvGJTXQOdlv8gnzhtNtJDD0icoH07oHXCxsrbvEujzD9Y2h73EE4sVComXGCribHcrM5BeLic89I1Y/132",
+        "nick_name": "亩@阳光 桂林",
+        "remark_name": "于都人民徐桂林",
+        "user_name": "",
+        "wxid": "wxid_d0d28icduspm22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/74GGNiaGHoWrA0LBK2fdbVvPwTGAicsCiaGns1jhuJNpTE5ylWibaN34VqpiaKJBoJL6ATDSUbic5WyGRHiasGLS12BcpSG4KBCmRC2X7GS5tG7yIc/132",
+        "nick_name": "Hcher",
+        "remark_name": "上杭妇幼胡翠华",
+        "user_name": "Hch1124746420",
+        "wxid": "wxid_kaqq7yo35grl41"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jZJVib27fhZVJz7LMwUduiaS1LSURWdkAU6J7fTD4jQ80agibCSruyYwLbdmInNqDPibHD6hGwd1HUTWwN1zbmiaeJnk2F1zqNicHrXQPqVkR3A2c/132",
+        "nick_name": "闫淑媛",
+        "remark_name": "长沙妇幼闫淑媛",
+        "user_name": "",
+        "wxid": "wxid_b3fnq1mxzk3y11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ECLejjWmd0lmricBfUqZCb9UeAmhIxIuNXMUiasqHLk8xoUICNLxFeGpyZBPN4nux3SZMzPOjmicuyU6j36HF88kY986Ro2s9Zux4EjRxyQGM8/132",
+        "nick_name": "雪",
+        "remark_name": "广西妇幼陈雪",
+        "user_name": "",
+        "wxid": "wxid_q03krzjs2s1221"
+    }
+]
diff --git "a/kidgrow-demo/kidgrow-demo-order/src/main/resources/personal/\351\273\204\346\263\275\345\245\275\345\217\213\345\210\227\350\241\2502.json" "b/kidgrow-demo/kidgrow-demo-order/src/main/resources/personal/\351\273\204\346\263\275\345\245\275\345\217\213\345\210\227\350\241\2502.json"
new file mode 100644
index 0000000..eca54ee
--- /dev/null
+++ "b/kidgrow-demo/kidgrow-demo-order/src/main/resources/personal/\351\273\204\346\263\275\345\245\275\345\217\213\345\210\227\350\241\2502.json"
@@ -0,0 +1,4973 @@
+[
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/5ESY2hoSiaSjEzPricHbMNy5kOBtnbSjJCiblBvuMYWe0JWLFzYeSVlQMvphWjcg7O0mWHwMqhZ61UZAcHia9O5rzw8o21ibhDzjbiaialQ802qicaI/132",
+        "nick_name": "子曰",
+        "user_name": "ypyc13707309687",
+        "wxid": "wxid_hl7ohgrkc49421"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ppWuia4DCrL7jfh5q9z5RS43JibUicCvQwIRpmlvFLjhWshlKxlGQyUO4yibDPaOdT1dsoicYYKzUQx54Z964Z8C5wz55bgPUBCc5nqChibibBzetI/132",
+        "nick_name": "不知道",
+        "remark_name": "高安妇幼卢静",
+        "user_name": "",
+        "wxid": "wxid_6dmgcy6yx46621"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ovzBhnU4LJiaXzYab56lCvjBiaKu9jpBC3qv0QE10Cib6qqeTPiaYCXCUy822Ds2FDlnJCG4DHOonKr5ViaNm50d34RVNBdQX2TfOzSickmVXNic2E/132",
+        "nick_name": "晨(Thoma$)",
+        "user_name": "thomas_bao",
+        "wxid": "wxid_8007500075111"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/CJqcgQrtgsAs8gODxHnqdaP1sHNOfDWd30CYDuQ9bI53A6ZqbcPwVyh9vcVOmjRcm8U4zaDFuqcXTZpOwsTOOWXAmYZmX4tCbVaWwSGiaQ84/132",
+        "nick_name": "金程教育CFA,FRM-祝老师",
+        "user_name": "zhuxunxiangxintuo",
+        "wxid": "wxid_bn4a89wwtvz922"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/O7dW3QUHyCpKVibg8WxNbVUK2vMRHkH2vrlKhhcbiaCdys1iaGdIzfM7drHAmjHfIS7OynS7LQZ8mW1oKLHzeSZQfO7w8JCnNqR1ibtuGvFIRfo/132",
+        "nick_name": "nnn",
+        "remark_name": "刘凤丹",
+        "user_name": "Vita_L_fd",
+        "wxid": "wxid_u18hnbjvnjmf22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/29icibZgVW0ePNGuF6ZlI2264dhgNuvCv2cZFBjZU0vJrYG3vEFTIcc89jNLUvOlUtPvp3Ramw2DuEKicxwdJ8CLzr6GXibJnZHl21iavmjhkbF8/132",
+        "nick_name": "鲁北",
+        "remark_name": "邢台市第一医院放射鲁北",
+        "user_name": "xingtailubei",
+        "wxid": "wxid_6ap2o02lvldh22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/wNP2PbTMicLJuvSrS0lcyHyIibFF2Fa8ZPOmOUNPuIG1mN1S0DtIBCvGQEpu2QNyia1xXpSKibqbRELia87UD1KG3u6eroDcQEAL1ccbNUfe0rwQ/132",
+        "nick_name": "田田",
+        "remark_name": "北大医院桑田",
+        "user_name": "",
+        "wxid": "sangtian957643"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/mtfxiasB3icqIssXVOXbZuYkZz0WOXWeaonUgibx0mxJ2dOcpX1aWzEjMlNZ8ea68nTHz9YQDLibibMyAJ5KOicYGG2NnjIc5FiaUjhI0mjADoibxqs/132",
+        "nick_name": "嘟王嘟",
+        "remark_name": "酉阳县人民儿科陈长会",
+        "user_name": "",
+        "wxid": "wxid_xri34jtbd91w22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/3ic2E1qVNOrSvxJiakZEyjE2mv2gDE7iczFHKHb0PGliaDUB1l2NsWvUA6OBLDRNzicYHj47PkWeVuoEibq1tQibSFodicJIlapEickzQqN8miaW9L2ng/132",
+        "nick_name": "本色",
+        "remark_name": "二伯",
+        "user_name": "",
+        "wxid": "wxid_8xc725i9n3ye22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Xic5ny9rTDdlPicwPPia2zRBphEvsF95ooeVwk24Bekk8pO92PyJxz5fKUAgdWZThqHicqxSMQptIibX12FSSIN86jKVU6Tibmzuk0XgQBOdoyKY0/132",
+        "nick_name": "Joyce",
+        "remark_name": "Joyce猎头",
+        "user_name": "",
+        "wxid": "wxid_9b8k3xwq2u0j22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jK55HBHjT3R4zcVM2D2QrahG579vJVb7ag7iauC7EmmmfFvNooOURBQH9NuW0fawkic6olZvSUib3GsicoOOFia5owEJjNTTEdT0b3H1YPyAgicdk/132",
+        "nick_name": "黄嘉俊",
+        "remark_name": "黄嘉俊长宁区妇幼信息科",
+        "user_name": "hjj100629",
+        "wxid": "wxid_ynvpyoermnsr11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/RAwClRLbFia5r4DMIjPM6xfnOn2ccugegczpuMPd9UIad81qgXOVuVVFrSibLCnr8VYvGfvcw6RxnkgnTicWJ0O1J42GBBoRMNDLeLSSj8ricVg/132",
+        "nick_name": " Cathy Wu",
+        "user_name": "CathyWu0734",
+        "wxid": "cathywu909694"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7RJW9z5WBKPeXdJdcMnKeics3T4A38hQvA0kR1hBSxEH8iaf4x4RrHXdabOiceAbeqdy3qSIzD1XPVt993OJGmHXmc46zxzp0bRBC7s30yqj9Y/132",
+        "nick_name": "青山绿水",
+        "remark_name": "漳州市妇幼刘主任",
+        "user_name": "",
+        "wxid": "wxid_qg01troxrgl922"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ANIiabZHyAV25HmTiamqAyWdtCpwibgK1R8ibwPcd0sXzeUafpNvqOtqqMI1aLmqg9Bk6Ww0MfbjezTxia22FHVVq0O7ickz3xaNsqPuIXn3e45CE/132",
+        "nick_name": "陈国松",
+        "remark_name": "莆田市中医院陈国松",
+        "user_name": "GuosongChen999",
+        "wxid": "wxid_fd6qb593rmb922"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/4MtH72UiaIlo32VoSXqj54b7oiaTGk4PoQD0v4tvKdHC2OJqelBpqpHFgFic1LawSXN9bpAYlSlVxB7ABWkibElXKRiayKK86OZSQNY7PYic0aReE/132",
+        "nick_name": "💨",
+        "user_name": "Miuhan_Chan",
+        "wxid": "MadisonChan"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/WFciaqozohqibWVao2oqwSTfGxBTKmMSicDCFfRsMiajL29OsXhS16eZCS6lHnpF7gHOXg79sKCcIXWrkDh6bkxWbGF4XoicnYH05PNS29AaBibHo/132",
+        "nick_name": "清風笙箫默",
+        "remark_name": "邵阳妇幼唐龙军",
+        "user_name": "",
+        "wxid": "tlj11013"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/BuUOcaiawLRvU13ybSR8aulOmcichykyoyrHEOcfljEajIlD1ibu3hblsw7EPFxXgGrYWcTVPyuRCIXmlIJicw4FLA/132",
+        "nick_name": "童秀凤",
+        "remark_name": "连城妇幼童秀凤",
+        "user_name": "feng8929685",
+        "wxid": "wxid_y3j4kaqi1rdh22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/qFue49fglBw7qyUBuvnjibPic7txCHURtrxDrhJyiaLh1RJKvB3sF5ZUTKN1dgicqPr5eJ1JRuvsEUhLsGLZXo6dicGqnicpx934yx1NE3BIgvx0o/132",
+        "nick_name": "涛声依旧",
+        "remark_name": "罗湖区中医院吴涛",
+        "user_name": "wt18823166862",
+        "wxid": "wxid_mbyvq1fzt0mc22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/aKFmoBR19kC75qrMyyO7sbUbIqqn3301vJf2t6ZAHxcHC1UoLo4nktngDpJfqYXHlsEd3rxMXoB1sNW7F38m3WclKKRqIibGZBYISpzSJHLI/132",
+        "nick_name": "朱丽帆",
+        "user_name": "bvp165",
+        "wxid": "wxid_bq0mypnoloh522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/hktIibKnpvyPBb2TEiciaMv4W8lvwEsyDusYq7X07a8F9LVot9xGPfgj9sGYUQnePNcWTcJXxL0feQZGLojCwa5xJvXCI7p69QLEHR4xbDlC2A/132",
+        "nick_name": "你是否一直在",
+        "remark_name": "健身小马",
+        "user_name": "love52013140806",
+        "wxid": "wxid_drnrnpwvhvc222"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/kowt4H3Qy7hc2PdUTrQLgt0iaW8KhicpviaDMFevjFnfc7tPba4o0eSAb1tcEr3Bg4FT2hJibrlHTncmOIkBzKia46l7dF5av0Z3z3U4nibP7u8Ks/132",
+        "nick_name": "Ms.C ",
+        "remark_name": "崔凤",
+        "user_name": "fengdiyixiao",
+        "wxid": "wxid_8slrv89l752s21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/g9jKrTOIdRfzoLhO5C8RTLAwvI7XtQpVvliblQaH32mnH3OSZeHoKFpN0CqRxQqFjxxz2xQFaJD4ED4U6jB04OA/132",
+        "nick_name": "初见 、",
+        "remark_name": "丹丹",
+        "user_name": "",
+        "wxid": "Jasmine1209"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/wBUialAyF5PfErId14uebYeSQiaKfs3WZNOm3ULVPB2ndPciayDcoPVS9NOjCgdT2OMpRUvZ0icIIicbZElryF4LAE1e8BSyVibaiaIXz80Yhg3JFU/132",
+        "nick_name": "low姐姐🐾",
+        "user_name": "zhx390533724",
+        "wxid": "wxid_trd4rthds7z621"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/5PaicBIqa6pSsTViaWK9QdhWelWduON5Go4qYD6b1wdlkp8an3KuZNcibYpcia7ibzUJSeYYGNibSUMNwsFLgm2ezOnqNlVaqDpZcicwibjXk2VngIE/132",
+        "nick_name": "蕾姐🥰",
+        "user_name": "yanzi1776076421",
+        "wxid": "wxid_j5gagi3mhjzz22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/qZghricciaKv8bj0atEhJCFaQ9utsfdryGlfSxtq84GrcNHt44vepdRyNAd3INc09uI76AH6iaj5XuBnCa6UeNEgg/132",
+        "nick_name": "。",
+        "user_name": "",
+        "wxid": "wxid_o9u79xon738y22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/VVZWBWDuxJCMHjdmS5xkF6PAMYA3So5qjxujtlXHV6qFzibTP1Nb9lmcuhq4x3y90dsvKI8aqZicMreYfcVOyrSlhLtO4BGkTSNx4l4UXicQZI/132",
+        "nick_name": "古月胡",
+        "user_name": "hu9963",
+        "wxid": "wxid_mopo93ffdzaj21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Zrv5NNvYYqwIzyoRD2u0sqT3yoy8eb5VQzgpXAsbIHE18APL9ed9tmd3Agticd5jWrXK2c7z1uBBM4STKIsk87ZOSyZTytdGn9aLZdnRAgdY/132",
+        "nick_name": "周柏香",
+        "remark_name": "怀化市第一人民医院周柏香",
+        "user_name": "zbx13874599188",
+        "wxid": "wxid_la8r7gazxyf622"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/qxR1UUmnibWBVoeynPdBS6K2jzCfyXGvmnAURHXAnFEtNRZCghSE0Ot9VEvQCeLTNrqql4nlj5guXiaZATWEU9Ze5gS2mmmw8R1hO3icMc7mKQ/132",
+        "nick_name": "葭月廿三",
+        "remark_name": "李云梦",
+        "user_name": "mf11061123",
+        "wxid": "wxid_426rt3lk66wc21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/AZOLiaWicxKXtnj0c5ZYiaYWicKKC415LsZPo08gorgjTsiaXvdDzTj4LrYlTibsLhuUDXWqYlRt3Ys4VtP6vM8yyMnoeTBRK8wmiaq3KIL3e8Tkbo/132",
+        "nick_name": "Black🐱Vivian",
+        "remark_name": "迈瑞总部人事卫然",
+        "user_name": "",
+        "wxid": "anran8348"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Sh2jr4YpB1Ls6J1mkvvoNdpvWfEUG0FwbMUB2ZuJiaeAEDNYORaA62WVC42micS80sAGtjHcQARJBNO1iayTCpVja4zeibOrTrS4eefYWthp47M/132",
+        "nick_name": "ω",
+        "remark_name": "世迪刘梦珍",
+        "user_name": "z15028638872",
+        "wxid": "wxid_n3q5emj5g99x22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/DZHuNbPRg0xnQVtLkwhyYTHu9M3UzauOx8aDPic5S4qKQ1UsNQm4BGe5j7633z3Pxq5w2jrj2qy0pj3VvPJerW1X16OkSFia00hLQY9edBW9o/132",
+        "nick_name": "x",
+        "remark_name": "恒晨源高霄",
+        "user_name": "",
+        "wxid": "xiaoxiao880202"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/bxwfgY34IcFHs1PvI2yHVpujKxFenXhOiaGbyI29oHo5fzRLsW4aqlxaWDmGGqeU4RSk2Q1WWTaVHg9uflhqv8Upbgp0ibIQUAOPajrJibrQKw/132",
+        "nick_name": "云卷云舒",
+        "remark_name": "黔南州妇幼白云老师",
+        "user_name": "y13885408690",
+        "wxid": "wxid_15y6f2hhwb0k22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SyYCMLdtkk0PAaNQb9Fd0EvicremSgrHMb2RvQIwQJIjb7rcI2EB2AacuBSPI1SS94jMlriaEoYdJZZInSFmA9QrfcoJuI40DstTEOuo0METg/132",
+        "nick_name": "鄢喻生",
+        "remark_name": "迈瑞全国放射总监鄢喻生",
+        "user_name": "",
+        "wxid": "ylang312"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/wlOuPAW7ZpWH6ewst3rxPvNly4WTKK1KT1Ay2I46sezyhiaRVSn3Mqtq6rMTIQeEo8ZBVSKfPqTSwEqKWUXia6ian1YdK5elp7XH7lklz7qib80/132",
+        "nick_name": "柯南",
+        "remark_name": "赵科楠",
+        "user_name": "zkn294536207",
+        "wxid": "Y223424"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/1xn2QQjlPjXNVPlXJV5BDOPRltdPgibNNm81oPJGdFKeE7PcfibTObYD7CO9RPqxZKuJGHkX3B8rz3hkc0knsUwibeBVfeBuaa8A7n8ibbELicnc/132",
+        "nick_name": "8号",
+        "remark_name": "邢台矿务局杨主任",
+        "user_name": "",
+        "wxid": "wxid_oyu38fg6qp3422"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/9BicKV79oqPunvNicpiawg4iavFoXOnSibMjrKQlpV9oYp2L6FkvF7YtIgavRDibsk8GdJ9QuYCzsicLc088kJiastVlJic3kjOUNe0alibiahAUcRzblY/132",
+        "nick_name": "一寸光阴",
+        "remark_name": "新会市妇幼保健院袁主任",
+        "user_name": "ysy051",
+        "wxid": "wxid_1zihlij5ftx122"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/nWARUgGzO6CRPwzxIxLjqcQl0kZwjonwicTaVTVQzPibQUl53bm0T7RZRicfXpwjnaN4ZsCbBcgzsfSXy6tqIfvSQR2z7eGtM85I38x4jsLhaw/132",
+        "nick_name": "刘芳",
+        "remark_name": "刘芳上海东方医院儿科",
+        "user_name": "liufangsh30",
+        "wxid": "wxid_jrztbr1uqadb21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7vex2E0dWjbNeq9uYqyicmcDBtLEb32I4s07iaeHcOtYRMOZKqspyibeZwWH7tRXO6Aia4FXKVsic0VksWrMb0QrSWw/132",
+        "nick_name": "青",
+        "remark_name": "衡水市人民医院张主任",
+        "user_name": "q1962018897",
+        "wxid": "wxid_ax4yfubbgwok42"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/56lKr3roZr8HekVcXOzaCialowkrkE6y60FPibsicxSMIX7ad3YJQtQnEyblRqO4b3X0HEUjMqIHRnXBcZYiaGlE9S56qlopR0npPORM92ibYvNY/132",
+        "nick_name": "Project director 李总",
+        "user_name": "wlz15235350501",
+        "wxid": "wxid_at3drv3cc66622"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/6Z53IuiarejakvYJxpQ3W0aZcwKK3d6Mvbq27Qe2lxZ83o7lm7k3rYDsBxY7xN7z6RkLwVNlUTctVCLptcAefrw/132",
+        "nick_name": "木木",
+        "remark_name": "迈瑞陈建斌",
+        "user_name": "LJB9991",
+        "wxid": "lijianbin1986"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/198QGt08vkMSmwHIxvoNuhkcoOICPGfKpp8hIMgTw9ttexeCkHnJbMaqcmgqvAPGUosXVCVAYSGvZV0AT4xbJicnhibefRRgsYQTjee4ibP3wg/132",
+        "nick_name": "星募客平台顾问-小周",
+        "user_name": "fulloflife89",
+        "wxid": "wxid_94wi21pi3bod22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/kmiakVwW010NAXuEVicLJbTWgSrHgqdkMbMVCAfC6b4X1G004LAMGVpfa3by0MAKoaia3nuCARK1h4fM6a3GpCJHT4OX6JX6EXJrOkqy72ITqc/132",
+        "nick_name": "佳美",
+        "remark_name": "三峡中心妇幼罗佳美",
+        "user_name": "",
+        "wxid": "wxid_jieg7mwgz9lw12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/IKCv8pNS0WqkonJlAufm0bIQKEZDEnXhzlrTuMLlCl3EmiaT95VlhBbT6nhSsUDKNYDhdPYqo0mtTaS8fyibpSdw/132",
+        "nick_name": "霞美",
+        "user_name": "lxm1120_",
+        "wxid": "lxm364134262"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/PiajxSqBRaELetBnY7ebXvPibCibSGSrwECFpDWN2I4xZctxFBZhO1S5w/132",
+        "nick_name": "weixin",
+        "remark_name": "王炜欣",
+        "user_name": "",
+        "wxid": "crazy-eyes"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/3B9o1Hh1tF516tegENtwBtD8BDIPv2Jg8lUbfcDoR6DUwmUU2lxDPXzWTU6W6xvLABd5xxIj5L763VTTlKxRUDZfJAsnNOKc0LkZhgyBzZo/132",
+        "nick_name": "董懂",
+        "remark_name": "德庆县妇幼保健院董懂",
+        "user_name": "djq687898",
+        "wxid": "wxid_5mb37nj7piml22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2UDBuqcbhCBAbTfNvOnCgib6iaICyWunic67sBsVsu6BsTnVdlkntOwzianJqTrdsTZCVFHBBMiaRal5Y32V4RFibBFFeF2Ldhibwnd90BovLFicyCw/132",
+        "nick_name": "虎斑贝",
+        "remark_name": "长海县妇幼王君",
+        "user_name": "",
+        "wxid": "wxid_1ven3ikqdmiu22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/c9Nwlnajw0qxItVLwKa1bQazQNZCJcPwNdU6lxMblX9ian5qL7e1ZYDvnCTiaQaQHFlK1J7z0kPyOzgGvwWichlXw/132",
+        "nick_name": "走路去纽约",
+        "user_name": "",
+        "wxid": "Kk20111007"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/k8ZFiaeubKkdkebCsH2tEAzXkXHJOFER9Oodoa5MYvuqjIWKhgexbdWbpleLWYoQtHQYKWyJibcaRgIGdkuibRrhTzEa1g3kN0x1TPGbIB6JvM/132",
+        "nick_name": "余艳艳",
+        "remark_name": "南昌三院余艳艳",
+        "user_name": "yyy030512",
+        "wxid": "wxid_fpprywic58mv22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/VBpeZWsDQuSS6NE9Ae0Ul4888kQwez4NibkZIV4JJZX8t1eZkBLLiacibPJfIw2KpGjCOicMicvFkpy38ptDfDmlZAkpZ3QJISM1sMLxNC48piaibc/132",
+        "nick_name": "手机批发商",
+        "user_name": "MISSUETZ",
+        "wxid": "wxid_hb7o0y71lgwp22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/k3ibiawxZNIRafua9Zicu1RQ43KiamicM0znvQYcZtf3umGxluNVpgm8XuWzlV6iaibXQjxTVtw5UAh8h7o5RO2JQ2977PhCKnX6oYlds6dZ4ggER0/132",
+        "nick_name": "Naduynauy",
+        "remark_name": "深圳远东龙岗妇产医院检测员",
+        "user_name": "D2278707656",
+        "wxid": "wxid_ocbf2p2asiv222"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/EicPXfP6N93MSd6VaMNiaZOicrJUT4CxCqweG9ydVFZsn0ibic1K7vMuZYJU6A4eoXcVjXxFvXaDxtdtTSs1iaUj5UX7XgjQovUB2ASAdB1Jyy8Bg/132",
+        "nick_name": "华为胡朋",
+        "user_name": "",
+        "wxid": "hupeng0809"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/tvTN6Vib7G7CeUSfZ2N2tJGeMVWylibRunpPeTJTp0o4klQFJ70icgD1Tbp4guhD15yaFD4eXPGuaNwlLIv48O8ibKRWXjnGSo1OIz5USfwuicoU/132",
+        "nick_name": "Karry 医药领域猎头",
+        "user_name": "yanglixin0820",
+        "wxid": "wxid_yyge5c7g8pe022"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/olibxjpqyXp6LsWCDWiawEzicomQm3aJYdGemj8Y0Tef4Gj7KuZfCibBG5uteiaSBSf7w6zUPYfqbeFrofyLlvCOGKQ/132",
+        "nick_name": "极品",
+        "remark_name": "上犹县妇幼胡主任",
+        "user_name": "",
+        "wxid": "wxid_29i1gm35gcen21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/mCTBYV08iciacTKss6btKU53kNDw58qDhzoz6r7mluQr2iaycqNSX7ib0v1RD0I1jkJerkKb2IHNX40mee2CrgG1KQLFuvxic8yuZ5LiaDONWQPAI/132",
+        "nick_name": "君子兰",
+        "remark_name": "乳源族自治县妇幼王主任",
+        "user_name": "",
+        "wxid": "wxid_1v327lrx3ift21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gYZpG2u7dWiaoxnhRcnqica0N9kVnxH35Wde1IJCaN0BKrdTwRgM6zFOy6vf5TAg0uPFJSHIwTt06kLA5icvOJf25haYtyVuGEGosslZ6DKxAg/132",
+        "nick_name": "Zy^",
+        "remark_name": "黔东南州人民医院曾莹",
+        "user_name": "",
+        "wxid": "zengying0607"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/4hnV81VerIAiaDOApHFiakZIpicsqWYt06wgyHs19iarKJQcliaFble6I19tDdqrzliac35H0jiaTCcV2oHoJ0ibqrRe4qmvBSZQLZk6iacswfY63Fb0/132",
+        "nick_name": "郑红帅",
+        "remark_name": "郑红帅岛津",
+        "user_name": "",
+        "wxid": "wxid_sqeh6tceal5d12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ep2QEe4RG5pl00SC2gicjK3bs6z8wwB9OiatKZdn24CN3XTcdeyo6Wtsew1OK3mIke0otoAJjQmFAqO3pUicUyfrg/132",
+        "nick_name": "蓝小良",
+        "remark_name": "于都县人民蓝小良",
+        "user_name": "",
+        "wxid": "wxid_1orwat9c0ddr21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/qan4Zn2wGEUv0PDXzV3r6njSnc1icqFlz1vqYBpVEgQ89dZmlmFD07kODLlib9JkcjJ1LmL4LIUChns70Sdc3qtGrVOQ9VW01v3Ak2urUYuJI/132",
+        "nick_name": "梦涵 Tina",
+        "user_name": "z1823304175",
+        "wxid": "wxid_5z6h1wxvxt2v22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/mEZmpoo199zXpbic75yTdKibGGpOG185yMoRbXLWBAm9JJibKia4m7wZ3QMZlicW3jutFKyZLt6kHN4X8wzdqelibJ3LPGicEMAR79tf7D9GNsTDyo/132",
+        "nick_name": "今昔何昔",
+        "remark_name": "上海东方医院吉安医院李老师",
+        "user_name": "",
+        "wxid": "lixing395506"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ibCcpOBsQcqZOMHK5DaQI0LVJFgJSgiccmP0qx9AM3g7ibZy1CibdIO4gvSwLt2j45HVqHMf7vuOhMl3R0EUxBo8X2BrIodkX4MTeDLTm8dd1r4/132",
+        "nick_name": "静等花开",
+        "remark_name": "兴义市人民夏静",
+        "user_name": "",
+        "wxid": "wxid_wh6nf1ntdmxu22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/icIqNupeb4MHUAicpfhkvJOpyicP3rTneIibo7ZEic34bNk6wxhSbeDbYL5v1RTOxic9MW3mlLYBz81OBtU9aot3PnqBPph0bz9cQqMwXNYk4vtnw/132",
+        "nick_name": "石头",
+        "remark_name": "金赛药业",
+        "user_name": "",
+        "wxid": "jth1020"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/mSqUg4vS5YkD6VrCSDuB2MFodRKEo13MSbXYk52nyvzW7kCLpTtl2AR22vvT08wkmRdpJFsmBfuqWDiamRrDMiaezRkyDFibpmDz6n4j7iaoCUk/132",
+        "nick_name": "DANIEI",
+        "user_name": "ZAM-0513",
+        "wxid": "q1w2e3r4t5qian"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/RuLwwKQIOYo2FRiaE63gh0zIuxptMRiciaFv0GDarrxLTYu9EGHnxmNLpsL5JdxMORckRl8hOINYou0EfkmaGxWxQ/132",
+        "nick_name": "H万科高晓红",
+        "user_name": "",
+        "wxid": "gaoxiaohong9415"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Fjg6PIYWP2hfFnm5VMUN2QAcNKBYZSX9lNcGcyiaicibATibrAcgO18a4taKTgSN36BtHFgw7icNMSl8BMa3G0SKHDoVNax3KzKYPGEYbCN31hCo/132",
+        "nick_name": "深圳艾利特-严庆明康复&儿保设备",
+        "user_name": "",
+        "wxid": "wxid_7umkz4ymvnr522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/fIP5tEr9qlfGElzibZRSuYfEJ5RLSAibjgLThsoq3bDMHbQuf5G7PNOySfDL6n9XiaWCACpdeTFXTiapcFav4qLfAJ1QiaKUIeiamSzCriaq8LkPlA/132",
+        "nick_name": "小船儿",
+        "remark_name": "先锋街道社区谢舟",
+        "user_name": "",
+        "wxid": "xiezhou198604"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/nMibJdPibYSE3Ymx6rFeDfLaK22vK0skHicG992Wibr3Kmp6qdxZ2m1Mbmz5drLPjrMM4DPZR15tIqAtryfJU1OYeWRdUUoopjG02GtTK7fWNyw/132",
+        "nick_name": "简.爱",
+        "remark_name": "邯郸李明霞",
+        "user_name": "",
+        "wxid": "limingxia9606"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/tgCA6aibr0lyX6GAPJJvXanVCKWYhsPgeRY7v9jaZQWZFqDj0Y859dk1ut1dAayQxoy60wTPhT5GvIQPzktdSVuGRL54KV1iaiaKrtS2e2SJFo/132",
+        "nick_name": "远山",
+        "user_name": "libs-1234",
+        "wxid": "wxid_ts4e3skkhrtq21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/pevwK87OUiaYtQL0LeJNuVpmnrRNSAIGQvNeQZ2CEVhXxHVRJ7p3n5dZ9ztyG57mwnupZrmHbOnahWTibcXnmxdfWLVQr4Z0icXfRmXiaT3f9TM/132",
+        "nick_name": "边蛟龙",
+        "remark_name": "迈瑞用服工程师边蛟龙",
+        "user_name": "bianjiaolong123",
+        "wxid": "wxid_joad8apwjzvf22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/31wnwatF9Ug7oXPniciaEDwA1EPnvvUnQ9aLZ4JkiafpeBQGjk01O1EkjIMichUIv1OBJvVI5lQniaxia6AGUTrPpiaiaVe7aKeZla4UiaBvrViccHYYE/132",
+        "nick_name": "dearme",
+        "remark_name": "陈灿",
+        "user_name": "",
+        "wxid": "wxid_1ujnsiy32lbm21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ecsHOV1oc8icEpHzicrdfllz234nwMKhKBX4UastuX6g0Qibo8ZgkjfnnUjibRp6mcQwv15oG71Scfpg8kLNWCass8T6Q6QhCEbnzP9NsiaVdhK8/132",
+        "nick_name": "泉",
+        "remark_name": "鹰潭市妇幼杨泉根",
+        "user_name": "Y070166666688888888",
+        "wxid": "wxid_n0jrj5yrwmdr22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/mx4l6wg1ibuOEINORXUkQmY8Ia4ibWyZQ84lZJNCmf1Bia0SSn0ibQ0UWbUwZiapZXiaqgjGwnNKH7qx9QEtxFdeGqojYlp7BZXiae6HgibwfMq71HA/132",
+        "nick_name": "天天见",
+        "remark_name": "义县妇幼陈主任",
+        "user_name": "",
+        "wxid": "wxid_6u3b2ji8i00n22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ic9w1D36EChpyQlJytJdFbuJ8J0gnklc186icF6PelF67FwficnzLU0x21spECDzC2YwOjL1ZTZS1qMX5picIGmDsMEuuKFCc3ctoficy0KicuBzw/132",
+        "nick_name": "云帆浅影",
+        "remark_name": "马松",
+        "user_name": "Yeah-MaSong",
+        "wxid": "masongblue"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/T1fHM2zZbb6gamImzUwJ6BJtfawib9mlsrwmlvSLRC1nqEp324sBnqt2LXxUDotRMFzbtwgjldv8UjbnT0aboJ9RmuhVnqmntxql7BkqLWfk/132",
+        "nick_name": "媛媛",
+        "user_name": "",
+        "wxid": "yuanyuan8157"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/wTf86yCNGCPtEtEZLG6ntFsmiaL4KmxVx5pGEeptPal3ibMibia4MlQ7ByZ9cxvibT0ibmiaMNeTIGx8IpL1FZ1ficG9BF22MFJhvZANjkOV1Td0k9M/132",
+        "nick_name": "567",
+        "user_name": "gwjiwll",
+        "wxid": "wxid_w2sh5a6sgqm522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/4H6YQv05Cumu4j7rTb0pRHNEEECZCupZ8sl9FdNOJsiaNibm0p07EvY8eS43UicfQDRVRE28dibUsma5rwANzfLlJ8PDjicnjJc7dVo8gEUcVIA0/132",
+        "nick_name": "瑛瑛",
+        "remark_name": "衡阳市妇幼",
+        "user_name": "ct8588898",
+        "wxid": "wxid_6589305893012"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/slNk4fwyJrhaj5qHxgEHSdFdNdS7UlVsffPUa2wHVRTSGGL4iao7uvibxZLMMe8hSGuiacROKrkyouIlV7sYK5g4A/132",
+        "nick_name": "Dr.zhangyi",
+        "user_name": "jimmyzhang20050921",
+        "wxid": "q79065226"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/icEFibNh63GEueouHOKNmTnC8ibrTicVDlZzwga7H6Aia1b6LvRaeYgIOyOaAxGedicQytiaWbqXaAj943LlU5p19I4XE3pJ2IicCWIOxic7xZiaTvcAE/132",
+        "nick_name": "渺渺",
+        "remark_name": "惠州市第一人民医院魏苗苗",
+        "user_name": "",
+        "wxid": "wdm224225553"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/AiamWslVHeYp2vfbBwvgKC5XMB7CVaBqrwGmQ8iawNb7ibITAOSOQkzribuxbTh3nUtR4JvD9wgXYsremkb0NH84jg/132",
+        "nick_name": "🌱 擺渡人",
+        "remark_name": "张健",
+        "user_name": "",
+        "wxid": "qq393775834"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2eovFjz20WMLuxDzVC30yhSCo3gGV7oWRwWWmibyuSibhl9vIw9kGHujzHGlgNUbXogPHWxNibyZvVUWOCqP967ddJt23sKY6kxEY2s41SaPRw/132",
+        "nick_name": "缪长新",
+        "remark_name": "寿宁县医院儿科缪长新",
+        "user_name": "",
+        "wxid": "wxid_02hp674xomad12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ib3hEGAESPibMSNcAqLUMIHMHrFMrduHx7LDxibP17DvIRsOhClTP6dWMsuIovGDicxNbpibZgfdIicz3CkPAbOgEvDNgHYUwfnRfxEcSLwtCcfz8/132",
+        "nick_name": "夏际雪",
+        "remark_name": "上饶县人民夏际雪",
+        "user_name": "xjx5519",
+        "wxid": "wxid_gntwxbd4gihf12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/CN5uyL1xEUUVTwrxcvJib7HibNDCs5Jwf9C5VRLe4JtiaKibicIk646pb1vicwX3Ahmw9gHNiayddDRsUFdn0P8O1lPiaCZBTFtRlDTYvgqafqXJdMQ/132",
+        "nick_name": "Lydia",
+        "remark_name": "睿宝Lydia",
+        "user_name": "salvadordalee",
+        "wxid": "wxid_r8qpnvjeh8ie52"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/57mQGRlt6oI7prb6zYRtDicia64OoicEVEdNGQd4GqfgM4m7Ib3icnHlLD5BNUaODArKOaYd0OYZC6ibh0VZLiafNqia5v9gb6kW6FCEDBpl6Wkqxw/132",
+        "nick_name": "王🌻🌻",
+        "remark_name": "王爽",
+        "user_name": "wangshuang1717",
+        "wxid": "wxid_4118441184912"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/sEub7wICvLsPg7bL2VJhHKYVUuiclh2Ek4vGwT9xr2uyLnISPOaO7UA3O2AfHnQnFZQQPzHnmQeymFdEawXJfdw/132",
+        "nick_name": "林萍",
+        "remark_name": "芦溪县妇幼林萍",
+        "user_name": "",
+        "wxid": "wxid_n7zzb4o0m6f321"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Ft50ACsLUKyKC7dxXnee8ibr0mpdo94ytpujSpw84CB4c81IvA7sGvktLuw4DZWJ9VB3ywCxXib9NMdg7KZ1OP1ib3hz2DNRFictCpl7OMzfocE/132",
+        "nick_name": "业精于勤荒于嬉",
+        "remark_name": "北京业精勤商贸有限公司的苑玉婷",
+        "user_name": "",
+        "wxid": "wxid_dewjgvegyzbs22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/RibkTjYdOx9mDCgKZVdrdvAMHibH3vIDs6OXISv9fvqSv1eE9Uf9UiazpsrQiaTuNvN3cLHRLqaZw6P21TRic2ytblscic0qRAaAD2nPL6Me7vTh4/132",
+        "nick_name": "贝拉",
+        "remark_name": "会昌妇幼刘丽萍",
+        "user_name": "caiyubeila",
+        "wxid": "wxid_dkibfs2ik4ka22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/oKEDic86KpeKrRyNK4DVVzmnXMWlpDaTgyXHOzabcbY8YTC8buXRguRjgKzamg6J6f0QapppfqLTVahK0V39h8ibGZDZiat76Pt4yN2b0cP9jY/132",
+        "nick_name": "A阳光与叶子",
+        "remark_name": "倩姐",
+        "user_name": "",
+        "wxid": "haoyaqian2007"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/4B93HOeq5ibcUibVa9LKREhtqiamY79sVwC8mPFY6BwxSc2LHYriajq6RhmjS6DafxvAsUO3S2spfPQSFOb5rJR7ibEDIEIN9V9fmlgH5uxZt8cI/132",
+        "nick_name": "LewTran3",
+        "user_name": "wxid_LiuChuan",
+        "wxid": "wxid_3621456214712"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/DVzN169GUxnyD0NM59fsvzacYuEKia5WwlDJLZ9iaicXrpb4W34zMGls2ialIiaJXCPYweTgehNI8R9ZibZeGictAKPOQ/132",
+        "nick_name": "于是",
+        "remark_name": "占民",
+        "user_name": "",
+        "wxid": "wo41881"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/4NHz8MNkTfGhvYHdXQvYPSiccM4yBpL7bBUkTZv9K9F1icicoYvNichdHCDe2sLZsHIPr9WjjCddJX6Im43v7SvibibXNUF37OUCBEd9s1p6ETiaHw/132",
+        "nick_name": "🇨🇳R9宝沃店",
+        "user_name": "",
+        "wxid": "yizhongjiyi"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Uyx2zFjMVBBmVfIEwySxqSTicpxhR9AVVncckFYZPxVOuWmcQ4gnWfDAJhMIK9fQntQDEVKl9ltV7FbGskse920sfdAggUtSrUgo8H7kCedI/132",
+        "nick_name": "一见误终身",
+        "remark_name": "龙岗妇产医院胡护士",
+        "user_name": "HMTWYF00",
+        "wxid": "wxid_x1iaduvz4j3122"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/obsaHib3uQF5pqtRHx4rpoW6hZob0iczyia7dXZh9osvGdlgpmOmsQDKQ65Xc1jredCdWwfVSDTys1qabkxrXXhMbZZrUkZLN09w3WwmmDbBQY/132",
+        "nick_name": "杨芳",
+        "remark_name": "湘潭市妇幼杨芳护士长",
+        "user_name": "",
+        "wxid": "wxid_ugwbwi2hq9at12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/GUianFnibG1gzLgstIoj8QV8Jaf4ge9aTZILlxAgDQ6jhrnneib4EAeErOlVVNgAGx5Mmku7RSz9ZzGgo02IwNSgw/132",
+        "nick_name": "Lp",
+        "remark_name": "万载县妇幼儿科彭志超",
+        "user_name": "",
+        "wxid": "pzc8821966"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Iaxvetg1NE1YAll8ib41zMMDERXficSmiaHic4fTAicyB6FlCDsKrYsbX3bXDsxXt69TaaoocA7ALh6M7ibOAicPlictpRENd50cQvhDqTSoS0PHlvU/132",
+        "nick_name": "李淑华",
+        "remark_name": "宜丰县妇幼李淑华",
+        "user_name": "",
+        "wxid": "wxid_hwl8b2nrwqsr22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7KBpxnOwUk5S5SrZnZ5XKHmEpOrACcwV3rs5c2Etg8CpTTxHHyUV7YdhfWqvBia5w5iaTTibZz6ZaZvq64BkrJwWqgKL2BhV5ricwR9z4SjJEAk/132",
+        "nick_name": "嗜血的蚂蚁",
+        "user_name": "li15230135040",
+        "wxid": "wxid_sl9auwjof75d22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ib03sIgUoCj8fFyzRAFzJgibFrhewbzQWj0M0CEtnRoyaD15ibicExgtGBwx5y2Z1Z9ibKc2BTGmfayPugqIqiajfTicg/132",
+        "nick_name": "茜茜摄影13930111191",
+        "user_name": "",
+        "wxid": "wxid_1iq8bklfk1gz22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Pqa2IfX7pZaGL1RRW9f96D1VkYBONPEdQy088LavXj62VAJAOHRc2dKLkpCCv7iaxhsvDGEricVjjAJx2ibrCC2yhUgkt9y0ClUJUSsUY9ZJBY/132",
+        "nick_name": "贱贱贱🧐",
+        "remark_name": "柠檬,小蕊",
+        "user_name": "RZ61861",
+        "wxid": "wxid_694vvlfdn1eo22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SKtDhPandMT5OXAn5rN0JOEU9XiazYibx7tiacssxHtwTZtthKgZdFnOp7jABF7cdy4Cp1xpDmUA0F7Uur4ZmBiaJg/132",
+        "nick_name": "dai",
+        "remark_name": "福建厦门经销商戴经理",
+        "user_name": "",
+        "wxid": "dai2706"
+    },
+    {
+        "head_img": "",
+        "nick_name": "",
+        "user_name": "CHANEL0036",
+        "wxid": "wxid_0te5ohqeh2rc22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/tkdM7nPiaIRuZ7UYDicaAaia1hjM8X3HoDyyCK7fWaHsUAmZRHnHBS5bsdunvibic7rgS3ibTrUgAND4HZicCYicAB2VaB789QBhIyVA79n0QnaTu4E/132",
+        "nick_name": "金帝",
+        "user_name": "",
+        "wxid": "mrking99"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/pCWKmic7cCST1C2UIlTlhYEynqXcc8ib5L6Rh0SNIglEgMXIRmqXq5ZlJiabvYh4hwpa1c0jlz6KLdG7icrWWOzHpuIf5jZ31OgCMia5Sm5TCFB4/132",
+        "nick_name": "黑夜的白羊",
+        "remark_name": "宁夏中宁中医院陈启亮",
+        "user_name": "cql85670",
+        "wxid": "wxid_3475724757312"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/YFcalG1VVB69CQduv5Imy4RyURVxWFicCEhkbiaiad8S92W0zeSmy1nwLBSWMf3rHTujPyOgcfLxHfxpJNrQFvnZLmvWWOSojK4iabRgwrfujnY/132",
+        "nick_name": "Lucky💋婷",
+        "user_name": "",
+        "wxid": "qt1275330570"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ZV2VdexCIXCV3YHqMR8IxXeNfS9bFqReuZTBp9jibHS9kGEFpjO29Mxpo139dicgcZ9bte6Vy1VScxIcI5PDnCpdjZoXYKyECibIBxha855HLk/132",
+        "nick_name": "侍者",
+        "remark_name": "侍者京东",
+        "user_name": "z1479099152",
+        "wxid": "wxid_ldj85ive8a9712"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/dZQaXhmmicF0lv4f637hoMvyQGwlm0xQeAwxbZvo0ibpJAE42bgrUsD56jdWjHwnzWGaEgmefo06EPichZwQrL2NYF6apxk5TE1204icDuYibUSk/132",
+        "nick_name": "我",
+        "remark_name": "织金妇幼保健院李院长",
+        "user_name": "wazj0228",
+        "wxid": "wxid_sieemhkmvclc12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Yvqj9TTDeXKN0e56R3XPUJwMU0ZE1OsDEfKZ7qrQJpS0y0JLtkZoK1OMJicqN1qXwEdATHmDkcQNiaicz8e8iaFA7Q/132",
+        "nick_name": "风",
+        "remark_name": "迈瑞超声李坤",
+        "user_name": "",
+        "wxid": "likun1986"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/VtbWCmouqmMskutibSicicXtGDCHPXI9eApshiaoVMicyOI2uHgGpwNicg9nx3NVdRicHWPKicoicK9aUjiaEEIJP7DLfw31M0YMAr9p7pmqpt35269Mg/132",
+        "nick_name": "杨姿荣",
+        "remark_name": "张家界市人民医院儿保杨姿荣",
+        "user_name": "",
+        "wxid": "zhangshicixian"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/uVAhF2FsVhPnicV4RtiaMHiaS2HvQpK4ibldWibLwmZGMpLkRRMia05KB3f2OO9taawuu7QenmIX1eqP5smnzfmH66nK5Hvk5Ot63DPe3s9NEhmLw/132",
+        "nick_name": "Emily严🤖",
+        "user_name": "",
+        "wxid": "emily_yyl"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/StSwicoBpRICnibyxn2BRGsZzH4Ru34vlesF5y1wZ1caEuFjh8FvNThb5ttONvLzv2Ouz4PUksU37A1YxogiacNN3SQPtReTeJXPeKu5F2MxkI/132",
+        "nick_name": "六一爹",
+        "remark_name": "省中医院技师长刘业伟",
+        "user_name": "",
+        "wxid": "wxid_3c89ld1wgbd422"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jIrojIicr2wRUHGLe4d3rTpLV9KicIoQOFMATeSR9uROtjRKNcYtmhrg3zTgKibhd3Acx6br0smXMNKOfUTjvyqzyPDJzszb7gKs34aYYPxRCc/132",
+        "nick_name": "陈富强",
+        "remark_name": "陈富强湖南航天医院放射科",
+        "user_name": "",
+        "wxid": "chenfq2129"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Nia9hq4icNO7CSaDJRIoIu9YnbIAkcfUQkA9koY0IPRicrb9OAwK8VCYNBp5wC7Il8Vc6souaemzqwKDxicQU6SooWsJnTYliamaKvm5M3U8ZGTE/132",
+        "nick_name": "海波",
+        "remark_name": "喜高高海波",
+        "user_name": "bp0913",
+        "wxid": "wxid_mf8j4486ofbc21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/sdom6dNqeXnDA0ic8e60WkRATCosfsMWU3zwP2Y64U7tsbGiaZgibwxCubVkncSMKS1kNXNsd1HKoaaf54x2Jp7ntgpQxibJmMdhJmoWlK3iaRpg/132",
+        "nick_name": "金晶~天瑞康复13366835211",
+        "user_name": "",
+        "wxid": "wxid_sduey44esg0x22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/YRbhSTuWqjfLLLBF8dUHqj6KTEdG2ricFm9fMut740rs3iac4UXGzYtyUHxc6zicc7WqO6ViabTyCNGxmPAq39JJhw/132",
+        "nick_name": "dr.liu",
+        "remark_name": "娄底市中心医院刘老师",
+        "user_name": "",
+        "wxid": "vivi_little"
+    },
+    {
+        "head_img": "",
+        "nick_name": "🍑",
+        "user_name": "jy1314999k",
+        "wxid": "wxid_bt0vyxuzsukj22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/LKsvV0okNoXibaYLnF5icInqd6WnF84ko05NZyh5XxGX6iaemv2ksu3G6DWKPibSyZia273fYF7tJhW336e4WE1TqVQ/132",
+        "nick_name": "丫&头",
+        "remark_name": "静海设备科勒会计",
+        "user_name": "benben11121112",
+        "wxid": "jinyanxiang001"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/C8fBLhd6GNxJ325tI1JOHibTiaUeC58QaTRa2pyCAcBo78CAYMdqNum1368UIZWJANNsIeFpccAYW3AnlqfPrOrrI9mnADYZUnXCARaw66vlY/132",
+        "nick_name": "菲菲",
+        "remark_name": "安徽代理,安徽省妇幼徐经理",
+        "user_name": "AA1814418543",
+        "wxid": "wxid_3mo5rarzqq7f21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/icBtQ916ME9dkPLTCGywQCMonpl6UL3FjUfhicIiaS1GIoAw0WKU6k4uo1Mvye5baG62DIhM4UCFTo3xOJ2Yppt5ODc3OjLxxVOwzzIUQmqtfU/132",
+        "nick_name": "孟生华",
+        "remark_name": "孟生华青海妇婴医院",
+        "user_name": "",
+        "wxid": "wxid_qvvzj4p2q73822"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/uRCJfV7kJbiaLVmuII84EZLWpYFE7BUIo2lq7avbt1uoKNibCa8Gp0FNJKVNusribn0TgdXXicDibYAGIeUShdJnryvO7oJ37NuswLx1YO4c71xM/132",
+        "nick_name": "心平气和☞定力",
+        "remark_name": "晋江第二人民医院张主任",
+        "user_name": "zhy20131009",
+        "wxid": "wxid_3dq5ze8g4n8422"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/KuV9MZwYjyeYeytiaiakoJcj87nKQGVXdX8VJY09gzf7U3eeRwWib3icsOXsmEdDxXJQ5MFgb8eMayibp2Ofnn06qyg/132",
+        "nick_name": "老男孩",
+        "remark_name": "旺旺医院王钢老师",
+        "user_name": "wwboy1106019",
+        "wxid": "wxid_1403654040211"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/DdE8NFZBwtGKIH6jBZHrx9SUVpfBIyhNKsRPxNQE5suMSxGLPYVreCedNiakfoDjrTjib5JkpqL5BMkFF5l3HblA/132",
+        "nick_name": "华科泰 王春怡",
+        "user_name": "",
+        "wxid": "wxid_zwvl9g8gccd122"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ThvmLwGeVzVjYJCvhkKfL6ag9L7nOHGG7wATnoib7J9MEyX8gNTj5UAEputPDLGSwJb6hYS7Rws6dtDxJfvA7zs386nejFBMKhhQJ9SM20TM/132",
+        "nick_name": "土豆",
+        "remark_name": "毕节市人民医院王宏立",
+        "user_name": "w13885709080",
+        "wxid": "wxid_jbk2rqtld1eh22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/e2fGhibM4iampCRKbpibCNrkbMlAsCHAHqCdw5Uiawod3icvWSYCKR5icaXIk5mLRXAMHhpcsOvWibevVW0ovepUcroeejfphbPicgBFKtHao0n7ncE/132",
+        "nick_name": "唐渊·诗奇",
+        "remark_name": "唐渊茂名人民",
+        "user_name": "Tycoon_teng",
+        "wxid": "wxid_zxwfkrd8umxr22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/LkRfE7ECwBBQET5RxHGqicibVygpVOpibw8S9bJALUIqvyACcndAnGAn6XAVc3nlHPpkWepgJ8r5sVC3ic76f6zTFEibjxLBUvMicficjVetPKyqVg/132",
+        "nick_name": " 琴",
+        "remark_name": "上犹县妇幼儿保戴主任",
+        "user_name": "daiqin13576787684",
+        "wxid": "wxid_0ledpfjxjrum12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/offDjL13ETbJBib7pRB5TFaQSWVjkpDHDSibVgPR4RFp8aAqk3mckSJI9KSQsqibc6sJhdo1jib9XZIZJ75G4KjvgnJDeGtgx5jicUJflKboM5Xs/132",
+        "nick_name": "Memory",
+        "remark_name": "达州市中心医院",
+        "user_name": "L698844",
+        "wxid": "wxid_1lj918gfeef621"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/F8kVHwIjA3CvwqEPhcbG7BOicSM7wlaPBrRZyicYiaqy8N53UgUt5kKXtUfAquFMb4UBIPDSpOAibSnEqQSOocUG36sUcb01qIGruU9SvlZ8iaHM/132",
+        "nick_name": "青芒果",
+        "remark_name": "呼吸机谢",
+        "user_name": "",
+        "wxid": "xie19790413"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/QKbebx1t5pzre4g4LjDicH7HwnBkWdfJOrmkV2XxzaEoQVY7MOQ4gZlzK3jOJaGVGgcqwLHkCRIicmmGxF3IRq2bnWpbic6eE4VPoC1DbqaofE/132",
+        "nick_name": "summer  Ouyang",
+        "remark_name": "睿宝儿科欧阳经理",
+        "user_name": "",
+        "wxid": "ouyangshulin2012"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gaENzcT6AZjBaFgXPltTu7qmIuMv2pES2qKz2qPpxVrdrnice0ShqibOGdMxOuCmC8QJazsGEGrlI4MGZcKs1OveJgiagVCfqZkAm6jjhdefQw/132",
+        "nick_name": "丫丫",
+        "remark_name": "马小雅",
+        "user_name": "",
+        "wxid": "wxid_0rpx0qljkcou22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/IE5KkFS3oh3bqicynZQcIIpDoBbmoiczib7nHC3tH1SoYTbc8ry3zEqZI0zibIj4OUpjnNl9iccR9gISRR8c4LibsRrY3bIkAcrrUzR4icGySsToYk/132",
+        "nick_name": "小楠。",
+        "user_name": "ji-ya-nan",
+        "wxid": "xiaolong_____nv"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/pBdHZ6mN56mWZnwYNUQnUkwHoepMibLtnkNS0hD6KjB4Wzn1v6spxHVYO4tTLhEpySUncl7Pdw5icg3Kp2PKy99gDMvTGj8wC6YhaMWt46L6w/132",
+        "nick_name": "简单",
+        "remark_name": "宜章县人民吴主任",
+        "user_name": "wzx13873598568",
+        "wxid": "wxid_rwcyij4ocg8112"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iadBc6Kwj3vJ0bp6iboFSEXx9VKoB2FYHQFic4NcicXDRWxGiaVBKU0c3M3uf6zicqbY4wbQNFEfAHYicoXdg8ibasF0mKTka52JFYpe4O9wyUF8sLQ/132",
+        "nick_name": "徐总",
+        "user_name": "jgakq8",
+        "wxid": "wxid_jodo47da5yz622"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/0bjibfcZCGESGGZ645y9YNNibwYcO3usBmfeaJjBPyGSfmiaHZp1ZyvnoXyviaDfs9IvmEicVq0ojvQScT4VcFjaahw/132",
+        "nick_name": "wh",
+        "remark_name": "茂名人民儿保李玮菡",
+        "user_name": "",
+        "wxid": "Weihan924222"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/hrjThSZFlpLksCicbhb5WibPicewdkslPA8Wk04txI9a9JvibKiaA02tJ5ogd1S2PMJFojQgk1sqPXoZBI0rmG91q9mtGyZOPJwNhvnRGbZn01ZA/132",
+        "nick_name": "蝴蝶",
+        "remark_name": "王藏钦",
+        "user_name": "wcq15933803600",
+        "wxid": "wxid_tm2v3efm5mm522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jrXjOucR8TtbdeP6vxlq7pQSlCrPic45I6orW85HVq4smPXnQLXYUxlYHD06sLKjZPopVIhBJdwXvK9cFJiaGPEbxfeYfNG7A2MhhhLiasdLnI/132",
+        "nick_name": "PP",
+        "remark_name": "皮亚雷省二院儿科遗传免疫,内分泌",
+        "user_name": "",
+        "wxid": "wxid_kw0no4ps38h522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/YyWBt0fTLzaHGiaCibx3T7dVbicgPsAuLf2qZ3YQibkHBJG05ictRA2IOtqs3viaQC1NwsKUst4bhkp8sbZdTyLqQkXNkY2ia4mIRlKf2N0c2xOFKE/132",
+        "nick_name": "南华城置业顾问王飞",
+        "remark_name": "新南大区十七区王玉飞18233158392",
+        "user_name": "ff93712",
+        "wxid": "wxid_frfhie95uwc822"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/CLato2etp4x5e01ZZMPCjEodOYLruNNwZLrNItk4KjibPSGVI7X3ofpZlWVQLGaBFOaKgLTWhpS6VctX9z6JI4I7IcRyhMGEOhMTOKdkgfIk/132",
+        "nick_name": "无梦",
+        "user_name": "sjzzym158",
+        "wxid": "wxid_bop75xaesqv222"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/98bUzCnubCibM3Uw9CNKJF4vQyXsHpntT62JEXQp4QUKjyASbfB2C4Oe3D5Wv8eQenSbFibJMVDhdV3icoKfUVQuvx9iahPl21jDoMfeyWIU9Z4/132",
+        "nick_name": "优惠助手(查券得返利)",
+        "user_name": "lucky1666888nice",
+        "wxid": "wxid_qzz697e8886622"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/B7ibsAMWqGGm81ZvL9GRLXiaGbACC0sgs5pPzTbGvqEicp68ZYXPvI4jPCy9zyzR7XmXIMibrvfbyPiaUl4hlrf68AnLNdZg125iaAy1REuLzTFGo/132",
+        "nick_name": "王鑫",
+        "user_name": "xinwangqrq",
+        "wxid": "wxid_k7vg1ou6yrbz22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Uh1oGeEKJNJprgJ7ujbib2jyaW9QMGEb3AbwAEaQ5kFn2xgb3cDfh8L5E57CSnhssG3U3z1kWibLHAloqZwARf7Mt3N0YBgXUjg64mFBtGJWM/132",
+        "nick_name": "37摄氏度",
+        "remark_name": "宁德市妇幼吴主任",
+        "user_name": "yhs7707j",
+        "wxid": "wxid_nhg3a52xzf6622"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7btmyqgRobLpHic2VkMHbQice9AQZicf4ibmScuuz8Darc0Adoic6GlqUl2Ric8PbkJTkhl4OoFia0qiaHfAiaYwcn8tDkPicad7GY7sL6lzWicsqREVxQ/132",
+        "nick_name": "冰冰",
+        "remark_name": "喜高科技赵冰亮",
+        "user_name": "my_cloud_win",
+        "wxid": "wxid_dqxf4mg0a38522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/fOiaicsTxO7Xd61Y3XSQUulqDicibWFXFib138v5vialicd2PZ76X6ZDqVkRMrPwZUMj6Qics8qDWiaSnedicUTQ757RVNhg/132",
+        "nick_name": "A乐邦房产 武英凯",
+        "remark_name": " 武英凯",
+        "user_name": "kai-1992-10-23",
+        "wxid": "wxid_9xtzzkckm6ut22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ibSRTbVjrSzXSiaIhgWsL8FhQZvpyfRr7PLibHyvD318hyib703JgwsPM5zVFBSSE5xo2HRnUjmDGCzfq9dSlnHPsTCWOxUvia5gtJKPoNPJa5Vs/132",
+        "nick_name": "hewen保健",
+        "user_name": "HEWEN901205",
+        "wxid": "wxid_3008790086521"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/dRc5lYz2sf1ibUkeyHozm1nXf1Ja121PNib6icHNrdgeE7qjjCUibHkbdLYDC408dAyJgASvhkGiaTonZqQ6jQ6yxhQ/132",
+        "nick_name": "无所畏惧",
+        "remark_name": "太平洋保险叶爱丽",
+        "user_name": "aili870504",
+        "wxid": "ai156137"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/5EAAuvUFmElpKYeDROLYkBsQNdUQJG1hYMoFL2MVDtwmNXlkPYXVhUGdc97tw7k9N5ImmSebKRATxSib2c6IkkQ/132",
+        "nick_name": "ZH",
+        "user_name": "",
+        "wxid": "linanzhiai"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/pdSN6jF4uYxe7ZTIHITatF77ENYavIZfTGMf1iaGAv5AfUqKzeyqrulqibOzicTWTJEp3ojJLJClzHfbicJQicRC8GQzYvBI2SfjMCbNqTbVdGUE/132",
+        "nick_name": "joy🐳",
+        "remark_name": "福安市民族医院周老师",
+        "user_name": "sbbinihao",
+        "wxid": "wxid_filb0gvkw78i22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/6ZU0wsRGw8ubiaQKhNHR4DqtjLA2tAbIrqfPISR6gDOicExrK7lZiayq3wIkM6iaLBVNepGOHAmJEO0sNZjccZcTNiaPppNmZ5mULCdjb7WmsS98/132",
+        "nick_name": "清清",
+        "remark_name": "福安市妇幼陈老师",
+        "user_name": "",
+        "wxid": "wxid_mk9dlqz8e80k21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/uHAnYj2M3fuLl6d42sI7f9Xr0EaoiauQ2pdrvdlMwibAwNhPUvhBrMyfPgLpYkorBLDsBIAOHicbF8M6rj2Eolu25wFaKAt4DcrYHiczV2lOGib4/132",
+        "nick_name": "沐念",
+        "remark_name": "睿宝儿科沐念",
+        "user_name": "Ustinian-yy",
+        "wxid": "wxid_m4azlg7j34o721"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SPUibcgukHBPDa1GUVA7rnHyqbfROSzMqXdjRETnLNlutOsMEtpicw2g5zqgXhBYIoTPB6HaByrIjzGbQxS1YljRFFEicWtXIQoHDWg2d3iaSn8/132",
+        "nick_name": "Sophia🍒梦搁浅",
+        "user_name": "Sophia7682",
+        "wxid": "wxid_m4z1mndfhblm22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/FPp84zt1DNbBQ1AUQNzLXibkicmZbxu0via4rh1N846KmbpTK6Xk8NJN4ic8emZ9wYLcPNzxElf4kFfF47AM998Mjg/132",
+        "nick_name": "敬,请期待",
+        "remark_name": "开普医疗李敬",
+        "user_name": "",
+        "wxid": "lijing8805024403"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/TWS9nb1tXfQlGDA1u08mjvOJAxfWd5dlMce4fFYicMGhzibRWG6VjxoMhpgH9kbYe9QibcAPxLk5YbOB7QkHh4tq0VtJUzgPbdibbFYrVjrWxd0/132",
+        "nick_name": "一生拥有",
+        "remark_name": "蓝山县妇幼李主任",
+        "user_name": "lzj13787673938",
+        "wxid": "wxid_c11wrxkwnl5g12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Ranyia77mp3nZB5VYL6s5WwtNRUnlsI1ySSKnWg1RErqa7K6iaiaqpWT7icw3pQrr2s0GQwUtmlH6ianG1kfvsicT0OSadecRExc9PQPCevwQzz3Y/132",
+        "nick_name": "娟儿",
+        "remark_name": "西宁妇幼任启娟",
+        "user_name": "",
+        "wxid": "juaner9902"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/h6bCKFF5ZIRoVich9hp6bHMaEW7rhWPV5ouRFq6BbHUu2s4hAhRTrJWmuqdaUkaUAmUVM7agG6aYTibjRSc23NtzIWPiacAC4ctz2ryRBKhjPI/132",
+        "nick_name": "墙面装饰材料--泰诗尔肌理壁膜",
+        "remark_name": "石头",
+        "user_name": "",
+        "wxid": "HK0727"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8Sy0dm2onCnxbsiaAIrO5xemuZSib2Ygy6UwajjjEibZodBgXrw7Ben24RAuuXWrOcWVGhzFprbxwMALpqsib3y23g/132",
+        "nick_name": "小赵",
+        "remark_name": "迈瑞石家庄分公司财务赵小娇",
+        "user_name": "",
+        "wxid": "jiaojiaozhao"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/mcQN0tLtbVeJBnfnL7uKhsibavjSSIdLx1Kt2xKxO8mW5qqpibxu7WXEX9qeeHFTibGDT5Qhdj3KeUP7vicyGdrL5pGVx6fhE8sm1F2VIV5h98E/132",
+        "nick_name": "董锋℡¹³⁵⁸¹⁰²⁹⁰⁹⁷",
+        "user_name": "",
+        "wxid": "dongfeng9097"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/vw91ATxDibFMFZF9529nsdh7OVYVxADnibxvghrsEtZSHibczVvMHicgPaLKxAKgicLFGYm33PcE4zaFuuxgnZMqe0bWiceuLoNhQ7iaekAFUaOq0c/132",
+        "nick_name": "暴力小肉圆",
+        "user_name": "muchxiaoyou110",
+        "wxid": "qq114568456"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/tgmtfYoGpJSWMdibic1Xpqe5v2dKtbiaTAS4e6Ly2lKKfXmTbu6ITFkriaaH4iahPqpncAJNeXDoIPGdut96Tnm55bdVQZJ7QuRGYKMDTLzuicqick/132",
+        "nick_name": "傲雪",
+        "remark_name": "惠来县慈云中医院张主任",
+        "user_name": "Mei69228",
+        "wxid": "wxid_ieavqf87safq11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/xNfSZ7icu1SbmDj2Yvh8EUH0hn6FZC2iajH8EvjqFhqCPxZwfFdaQ6pJibafFkclO1oG9B92c8Rpt3OhOleqcwzgrnszookMOTgLOU1UichBmJc/132",
+        "nick_name": "素心(温志红)",
+        "user_name": "yinshuisiyuan777",
+        "wxid": "wxid_oay4573ps7zt12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/O3uoOVnIc74BDsVnVnuh8iaAc23MrVdYUYePibICxIfdia5X7GARvebuCS6picecaSMSN6CgHwiccSp85Q4bVLRoBvoTzzUlt4ROp5uNpBRPFFlc/132",
+        "nick_name": "长高助手",
+        "user_name": "xigaozhanggao",
+        "wxid": "wxid_6ylvo1smxhir22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/85sSgVP0ibq79EcSU25xhMnc8lXUmRUFhiaW5LpOfuMGCpjh0juvjlMC0YL3aVs3cvTiaeS4wdyyJtQqcjT5JmuTw/132",
+        "nick_name": "娇洛妮护士鞋",
+        "user_name": "lishaocheng81",
+        "wxid": "wxid_kryzd6tq2irv22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/RJpS7tsoWxxwa0E0laV5Y6E7J2ZHKpHU54icBxagSicDRsc7U2SaialOkibqyqtvicibdNHibhPuUfc7RuzAZeoK7tr3VqiaJdlwPdwQmEqfDhbG4qM/132",
+        "nick_name": "辣婆婆总店(檀晓哲)",
+        "user_name": "CB846366657521",
+        "wxid": "wxid_zbpclq6mhf5n22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/EqoSh4qx5L8FmEEGLmwJ553ztbjgmjSxwGopGSC0VxPgkYu6whph7ZrBZuSKVjBIckQbJePOfCmcr9enSlyNLOeiaK9xVkibvF65JgOZSDj4k/132",
+        "nick_name": "天使",
+        "remark_name": "静海区医院采购吴老师",
+        "user_name": "YWGL1964",
+        "wxid": "wxid_48vlsexoihy721"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/v2hBMu5a2Ihpq360Xw0OjWaHbRd4SG8ZLu9ibFzxib0b4ibgZKAs7sMdgKFGV4ZqOrflzHJWYXq3E2wo8Zv9xU4ibg/132",
+        "nick_name": "小菁",
+        "remark_name": "中日友好许小菁",
+        "user_name": "",
+        "wxid": "clairexxj"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/YWic0HXeGWgH9jOaS0XNBggNdkWFn70ZNfSQmFQ5UpcKzxu9ibuOTvxFc9RfiaV1tJppQp0PQTOyfyKBhmyhJv5GofK11P3L1OhLAT4doDJSJM/132",
+        "nick_name": "相信",
+        "remark_name": "迈瑞民营田冀晋",
+        "user_name": "tian819058914",
+        "wxid": "wxid_x90um34pn5pd12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8EYt5gg7WOxONpiaMx2a3Iiat00nxm3SRkcWahv8vXN4Piaqt5sGPhZAJejxOc07Trtce8KXOX2DrQ2FkvVqIhVzZNsEibXe7DpOZ8IYCev1jHk/132",
+        "nick_name": "郭壮壮",
+        "remark_name": "洪江区妇幼郭主任",
+        "user_name": "",
+        "wxid": "xiaoyu833780"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ViaburOE8t1nqCq2LrVzB8eaz4lUTdFqj4jB1UabjWPUNHrFSkuThZjbBhOeKwG6ndfgMqsx4F0icWAADZEvOo8N19kzKyTudRibLuUTSiayhc8/132",
+        "nick_name": "吴晓栋",
+        "user_name": "FT998F4",
+        "wxid": "wxid_t17kqw0jfngj22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/WgXDpoGLD2jNSc1crosyI5u9EQT5jOOjo2Jz6Y38vpGLHXWHLA1B5zzW82NA2lHWZgkiaQyXpnTVmsheGcXqnFnQ5rQNVDhwia6heApym6Hfw/132",
+        "nick_name": "小小",
+        "remark_name": "罗源县妇幼辛老师",
+        "user_name": "xxm36910",
+        "wxid": "wxid_2p8stq9y849122"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/HoVUWzWE4cdzPFhNia6J5iaxNVrBuuwX982U9iaN4CLwVh2fjqwydRfG1elYSu7TP66oHgKAfiaYKoc201RmJf3sWQ/132",
+        "nick_name": "白丽云~猎头",
+        "user_name": "Bailiyun0728",
+        "wxid": "wxid_xtej3ucf993o21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/JcFlicca5CWDDpxfIRLtmALSFR5oQwZ3w8qb89LXo2NIMyCiaic5oZyB0OIjkKoibSA2MvGtmoGt5nNPy52cwicO1Yw/132",
+        "nick_name": "m",
+        "user_name": "",
+        "wxid": "m754000601"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/DsicBfYTCHRh1jQUWxa4pRmUia3FjevkR4YD1LSUM1ZhuwKbVHSPLExqBO0dXBYbV8HSaG6OmSNbL8nI2F9MHRGWQ9zN7BXnGDTva28avkEBY/132",
+        "nick_name": "徐昭成",
+        "remark_name": "常宁县妇幼徐昭成",
+        "user_name": "xzz20030115",
+        "wxid": "wxid_bav9g0uwycj722"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/9XbBB0ZNN2xkS4zRA0zx5XtZG2G0FlRfrl9ZzZ7PiaVfa7pIznaGNwoIHJ0dCKLlDyWZbsRzKowWH18xDJALbZhfEMMDNTCFs0lpZoturiaII/132",
+        "nick_name": "殷少龙",
+        "remark_name": "张家口第一医院放射主任殷少龙",
+        "user_name": "yinshaolong35",
+        "wxid": "wxid_j4gx8rbovrc222"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iap4ZO1eKLyOw1BG8JwepV9wOqO1CHKk2LcbNcOh0yiary6r8MUJ4LibiaVG6acPc3PNeeq4icBgcFZy0DicicWyFG3nfgLfMvmvmhpgHUF3DAk0FM/132",
+        "nick_name": "金阙",
+        "remark_name": "山东周恒",
+        "user_name": "zh879236557",
+        "wxid": "wxid_9159661596112"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/dcP408BaGYAfribsTNhuP9IxPozRwiaY9kyc46zQuRicbbZaondibyPtXjyQKt4bWxibrLTbcPff0CthIdeyHTZzAianPWqNSqp5HW1pcI56oAal4/132",
+        "nick_name": "凤毛麟角",
+        "remark_name": "江西信丰县黄主任",
+        "user_name": "",
+        "wxid": "wxid_6m0ib5jsuq6622"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jncvvQlKOdSNKrlLNg7MGrfBNgqMI90Gq6Ku6gROKMhh3pcp0q7wlWib6jBSgvZU6RU6ozBWSBp35nsvHRM2ZZTdYTHuy65BMAUfQQ3UUibR4/132",
+        "nick_name": "点点ღ",
+        "user_name": "ddz0409",
+        "wxid": "wxid_570g1kw8m2bd22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/OyhpF14Xpq5udwibNrqvaha9Eybzm6lRHibJSbBABz7NpuxpA5V4Xen9OvyfNA3TVsItcpoPJ0aibmhG5FF1xRERvmNuhzCy5Zh88kyLpZyZOw/132",
+        "nick_name": "Dara韩晶",
+        "user_name": "wx_hjjfly21",
+        "wxid": "wxid_bmwuetrbc01q21"
+    },
+    {
+        "head_img": "",
+        "nick_name": "Eav",
+        "remark_name": "琳茹发小郭永策",
+        "user_name": "honey36645858",
+        "wxid": "wxid_n3o33kg83e1p21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/BfaL4ol8zcERwClibGPpxXvApGOxyriabKlicW7aUfaGibFdHuUgcGpE8SJKLotrTqWG0OEoL3DfFEYt1E1OuianBy7zUpFDkgTk1KnGtLdjOzZU/132",
+        "nick_name": "张太公钓鱼",
+        "remark_name": "常宁县妇幼设备科张科长",
+        "user_name": "",
+        "wxid": "wxid_0etghx1d2zm122"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/cLalhvHBhX5iacYMlnSaeXrQ29rE4icDqzkVicjEaWt85yB8dyBXVlqKQ5wbRibDc1zrJJczHo74HJBZlqD1gKWeZDicicIqy5lQ1YMB9aWxVpkGE/132",
+        "nick_name": "快乐米虫",
+        "remark_name": "长汀县城关医院邱老师",
+        "user_name": "yuan_man_ji_qing",
+        "wxid": "wxid_vob0t3jlq2v621"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/lIGQGiapiat5sibXxubt66PM41NcJBcT1lFEuDdCfe0kv3Xy9aztcD8Mr8QDgsD8Q9F7hcf24SzrjOicrvDeWTQk5Y7e5EzBCglaFlf3dBd8uY8/132",
+        "nick_name": "丹丹",
+        "remark_name": "广州桥南街道中心卫生院何海丹",
+        "user_name": "H1113069115",
+        "wxid": "wxid_2ls6o4v08cdl22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/hb8xpW0OibG4xXYoNZibWwq8NvYb2HgXtTPyngibuibAgt72o4oOGEyZV3Oek2iaxa6LE26OhF7V060kSFnVgRVOJBnXGEBo43EwYPykICwPdzG4/132",
+        "nick_name": "冰冻的刺猬",
+        "remark_name": "秦皇岛睦友陈婷",
+        "user_name": "",
+        "wxid": "chenting349897"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/uic7Ansiah6RNHd0UicibBP8HzqbNAadQyyRBDHKCMjvl7TDybwDA9trx9gyB4nk1cYxeEvOPwCRNCa3nX9rvRGQhg/132",
+        "nick_name": "杜成 18630233557",
+        "user_name": "",
+        "wxid": "duchenglove"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/X44lXcr4t7GNoqWId89WEbnfFJcanPZ45PIxicpmrfTmt5icYeue2cebibu4xicBjNW8iar4PUaV52OtTHrliaAzCpLg/132",
+        "nick_name": "Nina",
+        "user_name": "ninashang1",
+        "wxid": "wxid_0e3aih8sms8o22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ZtenfBdalyz6OIHPqo4dGjiaEyVauzsfLymN0TlrkOvniaCbK2pl2WYichu1daXZQibBPrgjBqnxGTunb9vo8kKBh431pJicaibLomeoCV5bxiasiaY/132",
+        "nick_name": "授人玫瑰手有余香",
+        "remark_name": "上海市浦东区公利医院郭艳芳",
+        "user_name": "",
+        "wxid": "wxid_r9v4043q1v0q12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/rj3lMJcsJZ4icvUMjX9spJd8eEr6BGtx0TtSKY6SRt4INAsO0NSyDelI9Gz8qIb1T4PicOC7tgQAK2kzH268pj2tmCrV1kgYLxXu6HKUbRWv4/132",
+        "nick_name": "内涵小哥",
+        "user_name": "",
+        "wxid": "wxid_vj98uvii7dde22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/9O2X8fS1EaYwXKUtia4GJzl8icQ3g1xHSFYtgIVQro7qW4fEiciacFiaA2ySJQT45ialS9axa0mrlibHpiboVDsNYYI6VA/132",
+        "nick_name": "丢了尾巴的小鱼儿",
+        "remark_name": "迈瑞工程师于学坤",
+        "user_name": "yuxk007",
+        "wxid": "yuxuekun007"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/upSszaY9RhOoXPRrXA2b3iaic7Sgm89X3B2jLvIwGEGn84V4DxibUstEgn4suf3Ql2ic82BKy5nmWbOGpX0pSGnPVCX6dQX4BcNBPM5q9DE9a0w/132",
+        "nick_name": "chocolate",
+        "user_name": "",
+        "wxid": "wxid_bclj0zl0wjh212"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/DoluUaWss55sfP9umlaWhdBicTctbBFx4UB37ICxQU5OhcyL8ibcCqhibJcnQPlSNHJJVILxfVmxCSjzyUcZhQCUA/132",
+        "nick_name": "喜高科技-张淼",
+        "remark_name": "喜高张淼",
+        "user_name": "",
+        "wxid": "jssoftware"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/JEyfLS6kDL7KeajSySdsSUZI40DghkKBcj4WvAbPvqibdPjNcN8AkJ54MibKibpyMWN3ynNic12peHZexuOXXRLl9U2uwQ5N96wCGXcdYLoIYLM/132",
+        "nick_name": "野山雀",
+        "remark_name": "重庆北碚区妇幼吴主任",
+        "user_name": "",
+        "wxid": "t309414529"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/kiaHGicUdLd1CZibXDSv4ciaMk2IKTCaHQG8gMkZTgjUiaxAPK32iaFz6ZYm2kST92sLPUKKaSBPQzs1pwn8s70N1JtyvXupHicGCiaUBI3tUel0FQ8/132",
+        "nick_name": "施小米michelle",
+        "remark_name": "睿宝施小米michelle",
+        "user_name": "ming790204",
+        "wxid": "a29033699"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7eNIjZZoHW4PMWqrCeMnmIQLA8DcUPbWVJzZrb7rdjlsv7Q4CVGXJUk4QmT1oJ8jw5Rjr2pACUteuQf2OSxtgSPukrfwic46hB69xbIOUFhU/132",
+        "nick_name": "妙妙喵",
+        "remark_name": "湖南省人民医院马王堆院区雷老师",
+        "user_name": "",
+        "wxid": "leijing441676689"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/1D15mD4hr5cqlYnJjl4k7AiarR5OwR3N2ZrVtaKEcvsicJeZ7JLy2gHVoZFybEh3ibAu7rqLzbBb8Xic8tb15Mib3GOWIk92RUasu8TNuCI6Jo80/132",
+        "nick_name": "罗13879556505",
+        "remark_name": "宜丰中医院罗主任",
+        "user_name": "",
+        "wxid": "wxid_orwmyi8a2tvp22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/nVN4sjCPCQIucR8roQic910FiaPF2rH5RqnHDUXKUDsezs5HAFWD4fSm4z1kep9cH6ic0CQia2I94DstRrYbBZO7QtTqxedzeuOw9MY1CDdl2NQ/132",
+        "nick_name": "jie",
+        "remark_name": "上海长妇幼王洁",
+        "user_name": "",
+        "wxid": "w121818121818"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/PdUub7cmMVwuOVehyFPcJAp2O3eD3rGnEtarwqIibndGcVMnO1fl9zLI3gDegVH21PwgS4VXQCTboDJEBJG2f5A/132",
+        "nick_name": "菜菜",
+        "remark_name": "莆田市第一医院蔡琴燕",
+        "user_name": "caiqinyan1985",
+        "wxid": "wxid_vspeqealh0n122"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/HXuDIm9S9mYSibYOPMR5ZYxJl5fT5YUOyJXJibiaJJGcuRPSNjvPXwkL51OBkEGKGWKP7iaEFEXu3KOIkSKRGPsVK8tlYib2c4BE3W84JzPYLu5E/132",
+        "nick_name": "成宇",
+        "remark_name": "迈瑞超声POC成宇",
+        "user_name": "hhht1110070",
+        "wxid": "wxid_qb52vgywsd3e12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/d3Vh3YxgQ3YbUdD6peDwb8hME4ibneLuhibMb6elmVyN2XLzt9iapflH0vI2wmbrWYB32zHrFicacXgcxibg4kbmrG2BIayudgaVfoicI7EFlovC4/132",
+        "nick_name": "Fa娜🔛",
+        "user_name": "",
+        "wxid": "Sun3261011"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/xj3qxt8mEANQolkKibyK7rlpQMRDPqX4KC3SibBkBibIULoiabJIHfZ1pHKAZBYGoTrPfoJ38JXaAa8f6MoV2vIT62cY2Ial32tYpydnXC3Tgvw/132",
+        "nick_name": "张娟",
+        "remark_name": "吉安市妇幼保健院张娟",
+        "user_name": "",
+        "wxid": "zhangjuan896253"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/kg1JBMm5VowGv7zXuvp7twSlVwBeBicXuoib2WDpQBLTC3ccyc7KMgenWQcUnkiaLlxsMce1rxO4Lx6j6c6jZt7ug/132",
+        "nick_name": "朱焕然",
+        "remark_name": "迈瑞检验朱焕然",
+        "user_name": "",
+        "wxid": "zhuhuanran"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/LVzl0ruEnicYGEZmDib1CXicwbtIbAj9hWHThoO4KoEmNOiaI6EicpVHYXO3pbpDUSCKuLGzQcicF8GCrYwficbqmrDYbXJ2vwdpz6icYOedxr3xsaU/132",
+        "nick_name": "陈红刚~13603095160",
+        "user_name": "chg15949115343",
+        "wxid": "wxid_1g5pgaqisdud22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/icUdt5NjPd8tQbFs2GOlAqpDE61l42IDr7MzpPLXFyLghOOZ662YPHib3VVIO5o7OIAFfiaoP7mwPFRB6OuO4ZQNRIFAE9qplRTIdbINCrhHMg/132",
+        "nick_name": "优路教育*郭老师 17041694903",
+        "user_name": "yljy1365",
+        "wxid": "wxid_w470vfxv41er12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/69TJjPYFzTRarCH9ldoibRI1Cqkv1IxOnbG9ZVkW2HxrcEYEAmxsicV3ZhB96h69hWhpM8Mibicld1ibsCUzicrsy89HUj4zOTheczINDNoCR5Jjk/132",
+        "nick_name": "qiao",
+        "remark_name": "漳州市妇幼林巧云",
+        "user_name": "",
+        "wxid": "wxid_se25ubyfjj6w21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Gtm8S5DVMOVibGB0yicefkNVA3ibM2Tn6mu6BfKcStibk90dtZLlSibO36B2TmqlI34bM83oaOfC9gFRkwB9calV2IN0KVXvSKeB0YEy3HKMQqNA/132",
+        "nick_name": "王清清",
+        "user_name": "",
+        "wxid": "cz88939358"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ln86SMSSsPdNpZkH3Tluc6HrXdibUbTOFG9ibicDm6T1l1BEe0zZVeyEh3JIdibCaBxBEcr2aeX8TGqq9Wr2YSxZ536Na3Ubeu82fwEMmSCQBvs/132",
+        "nick_name": "佼佼",
+        "remark_name": "吉安县妇幼罗瑛佼",
+        "user_name": "LYJ130219",
+        "wxid": "AMANNIforever"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/1ichIztjLibicTCia2AGKPial9AMMY0Vh0J5HIPfTGjvLKQJ7lfVVL4ZD6qzMWe25Du765cl72DVtichiaP9Z48RCZ1MFGYLiaHxP0Yic9d9XibOYzKYg/132",
+        "nick_name": "Nothing👑",
+        "remark_name": "赵锦",
+        "user_name": "zj1314only",
+        "wxid": "wxid_mp16pl3aez9321"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/M6RIlJOiaAj7SLPGh1nRaZkyd8Eyy7xrhHKMyTdph1LIBtricdPjqA0icfT3DqnYmyasKicScAkeflVCtuMbLbgosAGtzELBKACQyibxGlXIv4Ns/132",
+        "nick_name": "优路小甘老师",
+        "user_name": "",
+        "wxid": "wxid_4p8r5hpvi3rv22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/PZI7pLaVibDNOnkiatQkRnx8yMxdCWGpTaWIpNVgpYquRj8rCXqVJnTw/132",
+        "nick_name": "Erica",
+        "remark_name": "迈瑞商务孟琳琳",
+        "user_name": "Erica5400",
+        "wxid": "wxid_v09q3z3mzl2i22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/y6qJ1AYFVWh9nWpwKVicJPjtW4JL8TENE1nngKuaAHQaoZTHfZI7iauIZCK9WD4cN5Owpetp3Ks2PiaDSmvGREuNQ/132",
+        "nick_name": "儿科董医生",
+        "remark_name": "信丰妇幼董淳",
+        "user_name": "",
+        "wxid": "wxid_9ab7h6fsb4mf11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iaDN25ooawRTeJz5sPYaapK4N22Rjh5PYoQ2URXXIygURw4Wg8U0kSD2FLfVLQn85kANxpGRIXavX5xWQ6eFXZQ/132",
+        "nick_name": "RYNA",
+        "user_name": "zhang199505265533",
+        "wxid": "wxid_208exn5oek4a22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/cniaDzDbqO7fvr2ibSsic1EGlTicicAaw24PicGjesZyfGO5sV0cFyk5eFdeDHGdf2Y2NxtKaEfdonhWicgGJFZsicUZfrV62kHHrsxRYf1WLPHwViag/132",
+        "nick_name": "三叶草",
+        "remark_name": "小碧乡社区卫生院陈菊",
+        "user_name": "syc996105220",
+        "wxid": "wxid_ivy1i3sqd1iv21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/yKNG13tM0aAsD5XD7F99hLJpNSW71VbN3jBF7L428ibPPCPJBicicAzYCOTWYYArEQQdC98250uvkxTZlR8p4p9XquYahcM0CecojnxfWe1zVA/132",
+        "nick_name": "莉",
+        "remark_name": "王莉",
+        "user_name": "",
+        "wxid": "wxid_1qzmymfrmyoa22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/E1j2roxYHL2bAfvsLMUWpanCCM8z0uJiaiaiaJicHR60Gr418zHkEJh2kJNUc11kcbZGWgNRuiaqZSSzfXxOyYIPqiaw/132",
+        "nick_name": "芳",
+        "user_name": "",
+        "wxid": "wxid_1xfb9q7btf7s22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gpFUntwicY3CEP69Lq4ryiaedUmDmiaDDibIjlcSN0pcRWmfCrbSOWDpKfiapmT33C239ELCsZ0hicqXyrc8zBRsib9EVca0AKwwTWABXGj4mmuZkI/132",
+        "nick_name": "放飛青春菜鸟驿站",
+        "user_name": "pf459706646",
+        "wxid": "pengfei365884"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/wBAj6hoib20tyqavpZ4F4gWRStydAichd3Ty2n4ib5bzvReWBaHjoKricN7yBlW7wAwibb6ENZxKrQgYibbvYSG9qZFnXtuoCpu68awyWS82WEica4/132",
+        "nick_name": "STAR",
+        "remark_name": "张星星湘雅二院",
+        "user_name": "",
+        "wxid": "zhangxingxing462197"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/yXVU8M7qsofITkm9cW6kLDzC9hWYyhiaepsVvpCw9BGNDDuUuJl3pNkxUeibfw2VVjX7FyAo1vMOeTPH6HIibgibHw/132",
+        "nick_name": "杨锋",
+        "remark_name": "迈瑞杨锋",
+        "user_name": "yangfeng888888666666",
+        "wxid": "wxid_1657496573814"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/caxZia07mpgfkqBdxwSaO1avibUAfibbCYlOlX4TLGHeNJIxsEhVz2rMxPAKsWgL7oic3ibqqzW3MGD9QNuXSjzu8cMTZibFEImYvn7Ye9KCb1aXU/132",
+        "nick_name": "a .朱潘娜",
+        "user_name": "",
+        "wxid": "panna469165011"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ibPQ9G2zSjUYM4GWfzia61PomZxJibCxFKXAln0Hgc34tR1WOPCx3xBlSP8WU3nichibQYNkXU8N4iaxRAUBazmbrEIicgibK76dHBib7gpmnheZKLHA/132",
+        "nick_name": "小城故事",
+        "remark_name": "长汀县妇幼谢主任",
+        "user_name": "",
+        "wxid": "wxid_mq5m76w8fpc812"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gESQMze4vnqqibJHbAybmksusroMZgDYgNobEzL1YIncBibdYvTfWezGjEHc3siauZEQwiazNGGEpdsfVBFBXia4RUA/132",
+        "nick_name": "美承吴礼佰",
+        "user_name": "",
+        "wxid": "q36985704"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ltjdQWicEMKCceticlkt7duB1MPPHvbaj7zZpBq16ygIeohWhvBdtMqqZtnicBQP99leiapDMYiaFx2zcQmeMhgia5iaa8CQRLjVDxFWE5Iqoic9tyg/132",
+        "nick_name": "陈华",
+        "remark_name": "福田长乐妇幼陈华",
+        "user_name": "",
+        "wxid": "wxid_pcuoicsui2yn12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/IVibnUgxaCJCeyYtibd6v95tbiaIWsCPZicaxb34shFyZjyZLu39QOvnBSwDsKpLGY2LXlvToVtQJaxicqJ0to17ribpluZICFd6adTaEXdbtZ4Wo/132",
+        "nick_name": "不以物喜,不以己悲!",
+        "remark_name": "奉节县妇幼陈娜",
+        "user_name": "cn19810314xt",
+        "wxid": "wxid_nj5x207b32bj22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/b3AjUMtoFlQx7l8MtuLRbeXc50uoJ6DpPjFpYFhh1WAl98wksxoDM6P0SNe5xbeM2wBHiazIay7BXvCq0Jf5HRYyZVd8x62Da0iboRYoYqU2o/132",
+        "nick_name": "Lim_Tong",
+        "user_name": "Tong_lin1010",
+        "wxid": "wxid_d4vbjkdai0mi22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/NZVqBBsmm0CiaNC0zibo6eLldbG6ge1SJAcicfwbdiaxm3FMXy2DbYL8ItUdDw6O6yJSiaZTxYe4mavAFxYLdXbgWqoVBUGQqtXV7jR6t10qD81Q/132",
+        "nick_name": "泡芙",
+        "remark_name": "梁转",
+        "user_name": "LZ1612865053",
+        "wxid": "wxid_5udd5iebno9k22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jjlaoAiaKk8pNIRsnYB1ZrvS2Hsp20icEGJIUULgYnlaYFVsvzCRDWE1EtgGuZBUlG6raUy5P86zPXx7vwDT9N3w/132",
+        "nick_name": "俏凝",
+        "remark_name": "朱俏凝天津中医药二附院",
+        "user_name": "qnnzhu",
+        "wxid": "qq75074235"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/HrPaprF53KdeG99CZAv43dibzGrxahczFsXPGb42d1oaCPdvicr8N30icic8yEFGmnfqFZ8YHGtdGcY3ts7DDqd6lO739BXPknsYcib6XF140SZc/132",
+        "nick_name": "王楠Emily",
+        "user_name": "wongnan1234",
+        "wxid": "wxid_89xu2dnxidh821"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ib0TX4Jo5C3hF5uA70ugqXewGUWGQokQ8xiaYy9TnsUEgkiaIq6g3OtNQNMh3japuHpecb1Dd4c4ibh1q7E7DxicDnsa4ic2ANNusu6mNmTw9FbkQ/132",
+        "nick_name": "湘儿",
+        "remark_name": "台山市妇幼刘主任",
+        "user_name": "",
+        "wxid": "ivy136368"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/rNAiaTvFYhdvPNjibkOxDgtqibu1xs0wian4icHgwjd57eAR1sicrPoW4mBx7VdlhMqfbLibnpRLEcfTz27Hn0k7yev6sBxJjjZichHTc8DIbibugxsk/132",
+        "nick_name": "蓝",
+        "remark_name": "石阡县妇幼胡晓",
+        "user_name": "",
+        "wxid": "xiao315897831"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/bv7hbql69t1J194xicWr2aKJ8xlQPX5zc1aicFjmhpzWBiakUD9phx2eia882pEyDMMv2QT82iaaIPiaw2SqaVE1sAX6DClgxVWVa90Djiaj6dnqhY/132",
+        "nick_name": "好大一棵树",
+        "remark_name": "迈瑞放射牛树",
+        "user_name": "",
+        "wxid": "liushu8666"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/E3Y7VJKMmJZyIXqMe7Zgv9TrHSAqWNKJxJ3icibbLL7k8vwclmFleREFoibMyhp2C8I4lFnbAHV2dTFqSO3iaEU9ibw/132",
+        "nick_name": "李晓龙",
+        "remark_name": "迈瑞基础医疗李晓龙",
+        "user_name": "lxlxixi1213",
+        "wxid": "wxid_8wwxjtpt24fk12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7fHHgKbG0EHgoWVa32gLSK111a28kW8LkwftTcuUNslmFsbkrGQTicJ3hHujlMDj3JqIgRwzy18QNJsS19z67Oyb8hnBriaVrJQU3nicYLgWH0/132",
+        "nick_name": "(李乃峰)天道酬勤",
+        "user_name": "",
+        "wxid": "wxid_vucedldtv5jr22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/HOZWENhvDjUe6AXlVPicvVdBcOCuB4IZYlRRE8zzV5ohjrr0D1Nog7icgWVlDHRJECkhsC2T3UKHR4E1SA1uE8Th6wM8Z4VV54IiaiahxhjEUxU/132",
+        "nick_name": "你的男孩儿",
+        "remark_name": "宝策",
+        "user_name": "",
+        "wxid": "gengbaoce"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/zB4wokjND0bGRSVWdqSMibrjCHupuJbED2fOUziaErYPCGyWUTFX360NhsoPiaoN4zKPb7iaxNrndWkE8VibWDzpLbtXnekXl5Lzk8HxLFVRCuwM/132",
+        "nick_name": "铃兰",
+        "remark_name": "长沙芙蓉区妇幼张铃兰",
+        "user_name": "",
+        "wxid": "wxid_7cho36qgoz3u22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gaMeICNk56E85XmicBezXVBtAfE4I2BcVKD09EvKiaKuQnPFf7ulhBGIKOud5jGUmjHAoPp0icUq1xMIS3VrtRjJA/132",
+        "nick_name": "越恒",
+        "user_name": "zwf104",
+        "wxid": "wxid_iumcdt0j7j3521"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/RHavN1mLxjYJ5Njpq8La3g7VhxIptY71lYl3iblcXCKKQU3zLcomx5VfAFb6wXfubUQ4xkMx5VhNFiaN2iax12hCPRK1NPUGr4SfqnrxAUy0cc/132",
+        "nick_name": "杨钰烽",
+        "user_name": "iamyangyufeng",
+        "wxid": "wxid_1364813648321"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/kW9bgsyhZnuibVHpJZeAfbJ5eZJbyVmQYJbuxwlHxOjFia37Zs8ibFTjyqiaodrENq1BMPJpqWydNNHylUS9duwX5N9n9kIib5cBEWf5M102TicWM/132",
+        "nick_name": "陈莲",
+        "remark_name": "高州市妇幼陈莲",
+        "user_name": "",
+        "wxid": "wxid_c3eieo3l8try22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/LX1uVGdOY83Y8Kk1c4OIL5mVMFuoTKGg9IxXEJhqHIJEtsXBOndYaRibiajeniak8ianpaeuCa9cmcZtKyiaNicygxIEVfNPoTCN7SsQicvjPRZPFE/132",
+        "nick_name": "大表哥",
+        "user_name": "zhangzihao0624",
+        "wxid": "wxid_8u6qfx4zszpj12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/VWWMxEfDmlCNK4Bc1GgkZ8dibG6XrAn3a8LJLJVJK8IpuWdiaILkGuaO0I4fhxIdNUFydbr8NFWMep5HKHo6Z1T7kxhpppw84QctmqVp585OU/132",
+        "nick_name": "邱灿",
+        "remark_name": "汉寿县妇幼邱灿",
+        "user_name": "qiucan0609",
+        "wxid": "wxid_poubcltdpghi21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/s7ic47Pl15dulN7lqQhxVvuRuLBZOmFbWJZCByL4N593g0UTjsvTZKIq3GvrSKumGtyR8CkXYsXMLRYrq95Vchkjp8jicLl1SVgD8MqQpeya8/132",
+        "nick_name": "阿真~❣",
+        "user_name": "",
+        "wxid": "happy1106qqcom"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jibO1WhoYOO2kEB4sNEia05PWBRcp4hMBxLy6ovhRA6JiaH3LuoTREGGib9ZORxiaAZBT5vNmTnwj2WqyjNSslrg7waHXyK0iaSciaeJ6jgTI4pNy0/132",
+        "nick_name": "蒋春艳",
+        "remark_name": "邵阳县妇幼财务蒋春艳",
+        "user_name": "JL38375",
+        "wxid": "wxid_fp2vbx7szeon22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/MybchNCPH6sxCzEusFBxzmct3icKQCrAtdvgVP9icu7DyNrAGibgibhevGwZ8OHl1iaAY81SQbvibS3h27F7Yp31icStLPmGb3DGAicM0KZjou7tHfg/132",
+        "nick_name": "似水流年",
+        "remark_name": "长宁his工程师高",
+        "user_name": "gao52ran",
+        "wxid": "wxid_scvnyjzgm2ft22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/kPL0w0bzQ4BoyNr6QYR0siaBwbcbQhpUGYOSwNRxGW6JpGKzEeicIiciaD1IUibfSksNLuUw88BNcdMTdheoDCPBvSzZr3uaxCFvk1BU33orQoOo/132",
+        "nick_name": "Cy",
+        "user_name": "cy117298",
+        "wxid": "wxid_9865588655921"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/yqrtpg4DptkbHKDG8ibSxPlGAuUbialf7t51ldAe6EZy2CtOnMcO4E3UUPvqAJ02WtmPbVL4YKqdSezKe2M0B2Kiaic4Tc1XKpRiaqGY4QiadTLrc/132",
+        "nick_name": "张雪峰",
+        "remark_name": "邢台医专二院张雪峰",
+        "user_name": "",
+        "wxid": "wxid_5hok2ibmfg2p21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/NTpzRSjDXSdcnGHGYFJeRKUic4aLwibFfl8cera5TIrkmvj6uMRjIGTuQH0C9AsevibMR8ibEtHJvGO8xXq19tXnKw/132",
+        "nick_name": "张正",
+        "remark_name": "浦东公利医院张正",
+        "user_name": "zhangzheng3949",
+        "wxid": "wxid_8pee3694df7v12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ic7tQAUjdV7MosiakC0eogAAKCUxBtyayHJfjAic8SA3ibDoKWPZgqu1XYSjiaqvzJTrjianXEwOlRTHPXrTpBViaEPqOL5be6Wnps8930Hk6ZLy7Q/132",
+        "nick_name": "周勇18973382419",
+        "remark_name": "周勇18973382419海王集团",
+        "user_name": "kk16688zy",
+        "wxid": "wxid_1awv1c5zhn4422"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/YB9l73Kibn3sibBqcwNJ13X5VV30yc6a0eZGl2uyg45yCDbmMHcuFg7OAc5ic5CtgXxmo2E2MQicCk5ZCBuw6haFyumz6Cq0ElVAGVZdxKT8Y7s/132",
+        "nick_name": "骨龄软件梁磊17332962837",
+        "user_name": "woai_sp",
+        "wxid": "thll19881220"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/zJw8QsHD0QtichjgQLKSQyAibwhHyib5cttxaMLdXSqOIh1YksIdKzcjjqSRqpZcCScXkbleuTAtljzYBY1f03eTGFrFJX9TF71z3XxUr77bM8/132",
+        "nick_name": "Ji",
+        "remark_name": "酉阳县人民医院儿保纪霞",
+        "user_name": "",
+        "wxid": "wxid_qfsr54gzgmsk21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/xvKqGq7MXkFPiaSLDnT1FhfcV3IDY7pGyqBCWcMRhJ33SyPyribFLztAmCQhXJ0CV2PjrFp6f2jw9pDacr6wo9jQ/132",
+        "nick_name": "白滨",
+        "user_name": "baibin_214",
+        "wxid": "wxid_g6ic0rwhvb9721"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/GspVbDIuulwTGdYfFic8hFXLZUj32bbT1gibqgg3LnTeCfnZFibiafwOca4DHsHxzXQEth2FzGUwYygYtV1V8Oia8ibA/132",
+        "nick_name": "风儿 🐝",
+        "user_name": "fengwei22034472",
+        "wxid": "qq22034472"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/m7nEWicRAANVyLLvKRywHUy6he8b0ibHxmLxeIGichia1fHSBzkmoevNicj2OblM9Q6OYykXthfbJc2Ax07cJuLyqoQ/132",
+        "nick_name": "尤娜",
+        "user_name": "",
+        "wxid": "baby381793083"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SkwouZgllDJZxEbF4EBYy6FmdicK9Qr2ATu0pOZYLZjl348DFhYXFpqX78PgUyxwB8Nye8PXRPUBWfBSTr2MichWltCxaar4YxJcolD50p36w/132",
+        "nick_name": "大卫",
+        "remark_name": "河北工程大学附属医院李保卫",
+        "user_name": "hdmclbw",
+        "wxid": "wxid_14osgoc21pj722"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/CvnzYhMtACHckv79LdkL3QqsyIR1FHialqn0zRricyqlZOzWtDSyoCoGozkVIyQwNEtPOXdE3IO7iaibhSqjGliaG8BCdmjfZkA8K1Br5W0ibPjxE/132",
+        "nick_name": "金色年华",
+        "remark_name": "上杭县妇幼张金华",
+        "user_name": "nishiwodeciaopinguo",
+        "wxid": "wxid_07g1f2ya1z421"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/YVGaurK4Axnia8Jp0ZeQave1HRV672plHb6BulPmFsVTN2pEjYnbkSibwwk1BvN0EXxLxw5mggeyYKvta75RezmeUX7YjdRst2dhPfjPeGVbc/132",
+        "nick_name": "胡晓莲",
+        "user_name": "",
+        "wxid": "wxid_ty5vk3htl5wv22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/pyaFdNjlHnm2X8L8zGgKVm99D00geFn6h3mXcRib2ajpUL3kttKDjRdGW7G2tDxibHwp7H5ibaPMz1sgf3npXFNHiblWlEvNBGNRWxbbLrc3Myw/132",
+        "nick_name": "荭珊炻",
+        "remark_name": "张家口市第一医院设备科张主任",
+        "user_name": "zhyxh1012",
+        "wxid": "wxid_wov8to31g70k12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/l9Gr4zJd0ktQ2vwVhiaUgYCUXkfyPNzicJoBI2RDSQSB1XbcjuWZUYv3B6ab3Y42S5Mt7rX9QJb6mwwX4wFKcdJp9ABfFgQXic7olFxIgKK7q4/132",
+        "nick_name": "最美的风景",
+        "remark_name": "静海区医院薄慧",
+        "user_name": "linlin200856",
+        "wxid": "wxid_vx348biul88l22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/zvo93DTQqKMEGQSzLic87icb2UhMLpIEd0hh5b3LRnIsVtT1MjsG7oTcGwOdhibAFrx9rab7coXZtMK243nk4zXvssVvPk3Gq977WtCW1ibXvAU/132",
+        "nick_name": "tmxkcgl",
+        "remark_name": "芦溪妇幼陈光礼",
+        "user_name": "jxpxlxcgl",
+        "wxid": "wxid_qc5i0eugfht022"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/nibYlgj4iaeapuZDBWU4pEahXrkc1Uwgk8qRV2ibIJZu9U3r2yLpFqlTiaFLDibVvre113FdUia0PQbWVLNbyhvbjm1BEP0gsoKwa2ibnaSSichDdWQ/132",
+        "nick_name": "明明",
+        "remark_name": "湖南邵阳医学院附属第一医院曾明民",
+        "user_name": "zengmin01",
+        "wxid": "wxid_r8207apexo4u21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/wy5HCCg0kibibULSjaLD7IZQGEjG5qvhvwZYn7aKgiahCvXicR5SdU3KGNU0qSuuY5RuJicvC2nuU14biaiasvIHrCChP56TicpVfEDfQ643cQkRmNs/132",
+        "nick_name": "isabel",
+        "remark_name": "影迈人事骆经理",
+        "user_name": "Isabel-is-beautiful",
+        "wxid": "wxid_6320143201311"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/uoB33SmVqA7C80k2n8ckVHbc6XmLJjqgicp9d7TN6zMiaS0SlwKG5gv9VnptNd3kBOt6z077emrYibF4vSoibFEbEw/132",
+        "nick_name": "Ellie",
+        "remark_name": "魏娴",
+        "user_name": "weixianNO1",
+        "wxid": "wxid_qzl4wa85nuox22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iaZ9tyM5SgC2VBDg1O6Y7hzt9zMfAozfzjRuKUGEtpTicFPCnMEyRahKskcGdEfPTO7gzlvqMJsPquB3PzRj7TABzKKbSFzZbZ7OXnEwHCdYg/132",
+        "nick_name": "琅窝工程机械租赁13784865332",
+        "remark_name": "耿佳宁",
+        "user_name": "ninggenuo1sheng",
+        "wxid": "wxid_pirvzvzyacqc22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/3qn6icGpMWqBr0sFcwKp2Y1d0zNA6GE0mia8SChFzmZuRczBLnftcsgfK42SLjDs6tXJydcpvRK02O8mpyGua3lzxaGickf8XK71vYcLe4gj7I/132",
+        "nick_name": "田海波",
+        "remark_name": "汝城县妇幼田海波主任",
+        "user_name": "mjzx_2018",
+        "wxid": "wxid_pgvxl0sgvaxy22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SQN9QgCSdTm3k0nqYfd7z1qsUzhsdvPtBLRViaCsrIWexViaGhEqrVzGTNK02UFoMdqIXuibziboV5pbgTL7239G2w/132",
+        "nick_name": "袆总",
+        "user_name": "jj15833213527",
+        "wxid": "wxid_253ribd5768b11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/0R4WicX0HzMU81ibQpsGYCZwJPLR15gUncaqMhYgibvV522AFo2z8az06g8LJucatc6wQzy3uBbF1U5icdpl4ZXBQEbQPWkYbsDl2oiaADxUvcX4/132",
+        "nick_name": "李旭红",
+        "remark_name": "李旭红Katherine",
+        "user_name": "lxh583435013",
+        "wxid": "wxid_6tuqnqqy0gih22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/lGxrurxVaRPulBUVp1hcSsIIzDEDL4JECibqlS4oLH5gQNytmlAueBMgQbpkE2oLSrd7p3gs9rEhagZCHg0biaHFQjliatt7tUeykBbleB6jqs/132",
+        "nick_name": "龙女",
+        "remark_name": "黔东南州人民龙胜敏",
+        "user_name": "",
+        "wxid": "wxid_wk9ufd6xvgo421"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/CpOMbXF1NxyL5FVnDlng53yo7rZIl8Vgcib5jx6mMDib3GChkrnlYzoEgv3zkdm5BzlpmOyht38uiavYRPT71BxaHkpYibUjpq4liaQtnI9DphsU/132",
+        "nick_name": "……珊",
+        "remark_name": "睦友刘珊",
+        "user_name": "",
+        "wxid": "t3460296062008"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iaXNiaux69icRWqAicI3TxODhnBejnCrVrcBEY87CvBNN2FGLg7FFzV4FmAn93yHLyFVduhdDHW90YXnYSkiaTn15B30ibhKCHoib1zevnb2xqEdHs/132",
+        "nick_name": "揭阳康祥医疗器械有限公司",
+        "remark_name": "揭阳康祥医疗器械有限公司刘经理",
+        "user_name": "",
+        "wxid": "wxid_pilgvlrt7vlc22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/n7tEHV4d8tAxEPpmTZbS8aO55nM5HKcnk6nr0maSibBE3DksREicUCkLwJJ10RuVBLiaSWNAlS58mmS8KWMDkqMW6WDZcI1MFg63zibwDkhAR68/132",
+        "nick_name": "xj",
+        "remark_name": "绵阳市中心医院儿科谢坚",
+        "user_name": "jian62955",
+        "wxid": "wxid_q5ep7j7pcc6g22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ExjUcEBG3vPr92pshZ8k0DYGNCbJic7g6PxMdV2wDVdrsXwv873EzriacLDibvb4AHcGUxbzTqndEn4mkK1DbHPqbHXw5UVSrcuyu8x7ia7llps/132",
+        "nick_name": "王腾",
+        "remark_name": "安联王腾 15176116086",
+        "user_name": "",
+        "wxid": "wangteng927518"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/HwbjraJsVIYXYibfnYmU7jqGpLm5kR3M0D7pwURHNQf6nzU0e1omKf4BcqRkCrWmv9ib1eaFDeaic8VRDReQrc9YcBtV5llBTiaDJSGjxVmPzYk/132",
+        "nick_name": "琥珀",
+        "remark_name": "火星街道社区医院徐慧荣",
+        "user_name": "xhr59881386",
+        "wxid": "wxid_zgyjwf5br2hs21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Mg7SwKWFlQvqmaqnXic1Uy85u3MEGuY0TvQ44y3FZuv5icGmO3d1uwfWyiacp67hnlVgjkLd85Vmib5IvyEUVnlibwROZbsylh9PfFMZGK4SpgCo/132",
+        "nick_name": "小草",
+        "user_name": "qq910152320",
+        "wxid": "wxid_8038550384911"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SaJ10L858aVSG0cw8UoLVUff8WAe0y1t4a6PbdsCXiaMicGOG8rt3RQQgtUo2zKLUu0myujkSL8upKDoZ8SU8BULevQTU5YZPJ4EZictWUc8Sc/132",
+        "nick_name": "宠儿",
+        "user_name": "NloVe1993714",
+        "wxid": "wxid_8jfwsmma8jzw31"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/y6icI3LhBwc9ORyZicCfeqibee1iaeJUd0uD3NibzHqiavicpCzkJJqFQ43ylJu83D9PIy0yrNvwJRgqicUhp1f2zXYKLncCkooO6MRLmIqkuxicF5oo/132",
+        "nick_name": "💭晴天有时会下猪",
+        "remark_name": "Demi 邓溧煊",
+        "user_name": "x-20135889",
+        "wxid": "wxid_3ocsvfalzddo22"
+    },
+    {
+        "head_img": "",
+        "nick_name": "天亮了",
+        "remark_name": "刘先生",
+        "user_name": "hh826827",
+        "wxid": "wxid_w9o9l59zdrjn22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/5ibSjAq57XGQfDqn2hxRJAjviaDazy8qEG4fBe8VflBVMhWFHpdiabia1x7un3hhgdunIAXQ8dBw6ZvR3y0nW6OVQw/132",
+        "nick_name": "风生水起",
+        "remark_name": "晨主",
+        "user_name": "",
+        "wxid": "zcz1548293299"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/EjD6Rhe1VByHdGDj8FXQOibckibFSia0SXHVqTBNjZz8I2BnMePwrTvricbUwWXiantlicNTMwE5mZ3xFcwHaH92JwtAeMygocicI0ibMbUpfdWNbMc/132",
+        "nick_name": "开心果^_^",
+        "remark_name": "马坡岭中心医院王美容",
+        "user_name": "w304727859",
+        "wxid": "wxid_xzzm7sau1ssu22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/P1yVhAnyhqIPJmLxhlibXED07FfZibibcCGxQmWLjq6JWMnHH5c7iccia38qgHofghZAORLicBiaBHsuYYu8ZCEDZPtYwrq6lIticiacfrhf4h09nib80/132",
+        "nick_name": "梁惠怡",
+        "remark_name": "从化市妇幼梁惠怡",
+        "user_name": "",
+        "wxid": "wxid_wywjc6t4vvuz21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/I6PHkmUDl6V6MibtnnpXUfzAibIHa8iaLB7xJze3TMCaWbH9qTib6eyQXNJI7w6MJ6OrTZKyMQyjLX3mEBCibSpyxblaqKENViaGNsdZfdTlmo5m8/132",
+        "nick_name": "熊英杰",
+        "remark_name": "超声模拟训练熊英杰",
+        "user_name": "XYJ961220",
+        "wxid": "wxid_u2a5pljvckdb22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/o90cggC1Az9Qwt2q9I50n2qAauQ97oMD1ibqWqibibV2PWOLQGXyZ0CkFNDrHLHd3Gbicd6DX5Pn51g8S1TPqHZfZib4zGUbDgHJN6gTD0PXAsaQ/132",
+        "nick_name": "孟岩",
+        "remark_name": "孟岩北京301医院",
+        "user_name": "",
+        "wxid": "wxid_m10q9fhy0wwo12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/cAAricyluLGVY45n7LgPwlOKRWrhISZjTgF3V73LjnPdZ1qoPtlXENwFTFudQaZBJHdxWnj780tnEefvt1bmQbQDDVPQibPs7ty72u3AeCaqw/132",
+        "nick_name": "埃摩森猎头|Adela韩雪",
+        "user_name": "",
+        "wxid": "hanxuejiayou125"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/rKVNcZ1mpIbSUVxsp4V9hdr0WCqtSiahTwC5t1Mgj0m2kibTqgPQ7heshwr5QjBDZd1jJDaBgDgaGlRj0BtQyetg/132",
+        "nick_name": "姜伟",
+        "remark_name": "万东姜伟",
+        "user_name": "",
+        "wxid": "jiangwei954418"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/huI7LRQ6atHP0hX4fg4WhptogpHEWBB4vvoMcJGmFojg0tLyZdxTOlF1DpygDlAjuQ84p6F6cqssdnBzTtspM4EZW5Bzc0slZLNJWlKiaZYs/132",
+        "nick_name": "晓搅搅",
+        "remark_name": "广东少儿机构魏经理",
+        "user_name": "weixiaojing995",
+        "wxid": "wxid_y7079n30d6ta11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2xSUGe28Qbh7zWsFdxRpFCuANea9SSIJAFCxLQS0ERhMknxVuowEp47kJiau844QlZbwAnpaVYvqT9bbEB4XUAApXGFgUDGmpT0jFuhLiaMj4/132",
+        "nick_name": "Joanna",
+        "user_name": "joannazwz",
+        "wxid": "wxid_6oisisf4zxk622"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7xKY9dnNKvlPSgz1icpfJ6uBvjpMcCIiaBgib3ib37pHSn1Ebov6C7KibAdTpY7yXYSZf248cGRcfFxPRbdyLhyI8EkE1AvibE2vtlT5Y46HIybCs/132",
+        "nick_name": "蔡柳新",
+        "remark_name": "宜丰县人民医院蔡柳新",
+        "user_name": "",
+        "wxid": "wxid_bd1x7pc8a1j422"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jfMKlLxbial3jHgg0kgK5icnguU2fSJ8tk11uibZU3x8t2XvCzCEWa95qxw58w32H1AUibLVicxiaib6QGF2lrZU39gTA/132",
+        "nick_name": "张红艳18633929264🍑",
+        "remark_name": "海外部张红艳",
+        "user_name": "",
+        "wxid": "ilu1234567"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Mjoql7MqwFByHq1XnRCTA8reSK6DmF6RKiajf6s8IGBZ6LDdNP1Cf96iaRmHZfCVtD6crhgjice9qkgEiazHDBewVmbFABwd3Jpocr84qK98nibA/132",
+        "nick_name": "康辉国旅樊玉琪",
+        "user_name": "dorafanyuqi",
+        "wxid": "wxid_k771kq6at1cz22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/YibxTwc0DiaoecCiaTDJ6arofdIzJGoAicmrTsic7EBWvZfo9AQ4ugwiahricYHib7Mvg0nrxJbnrXpiaMoJiaJe9GPz5NZQ/132",
+        "nick_name": "不离不弃",
+        "remark_name": "石家庄出租车",
+        "user_name": "",
+        "wxid": "wxid_4138711385614"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/EicabekODVibHYRnwkAFcu1Fgn4B9og8889dMstMdhQ9Lv8VicyfLTpuzEAnWudKJy6CeGibEE8JlYbgYaVE1hDmjUZffr9f2425MPm5HZo6LYg/132",
+        "nick_name": "佳鑫广告.复印照相",
+        "user_name": "",
+        "wxid": "xl460696281"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/zgzPcY7ibbogJKDAPVmU3DGdCpakUe8P0ranuByZY6GaXKkggLxV5Tzo8cpvuuibjpUMlEDqOJicQdN0Rj7fCYfqg/132",
+        "nick_name": "不忘初心",
+        "remark_name": "于文涛金赛生长激素",
+        "user_name": "YWT904327447",
+        "wxid": "wxid_14y7ddsjz9wc1"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gZ7EgOu4ibP78m3mia3On6gMlias5fy6BboPb8ibuOx4k9kunQIQUQEIBd0KFnSGCMiac1VIH5jibsIGfcMJ3oeJI1nuodQBcYH0riaLTqV6Hx7yRk/132",
+        "nick_name": "Rain",
+        "user_name": "lcybingbang",
+        "wxid": "wxid_q1jnr2cbctfq22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/fMDKaHk1w8nSNqUXRGuhCpIbzXiarOhIWqaBmurmmzbnT2iamPHp5F87OPwsQzx6vuBMPcojQXsyjdQtyVV3nYLcZQ9akbsDib3hXkibxPTbTpQ/132",
+        "nick_name": "王素花",
+        "user_name": "",
+        "wxid": "wxid_mgxv3mrr5i8r21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/If13yeVTic9XJCSbLjtF0SKJOD1fSd926uWmvoC1icduLxYKGFibyAvPUfVzeicwNMObk7Gf2KjlzBrHhRzwkmQO9Qc46qc6cx6Utm4ibRkpurVY/132",
+        "nick_name": "张贵杰",
+        "user_name": "IshoesZhang",
+        "wxid": "zhangguiji3785"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/zSZuz796G4zuTEkx7hETrOCGUYXCrzb1S3QWAOjqjduLE2sLoNoxJPqQfBTFRfqIZ1KFxFUHBnicsFP0Bvbgs6oib11ibx243q9v0WY57IHQjg/132",
+        "nick_name": "晨曦",
+        "remark_name": "分宜县人民医院陈平兰",
+        "user_name": "",
+        "wxid": "wxid_6o7e8z9axzgp22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/L93Rtwv5fGjl6bPgCgt4SuhsKm2uRShkiczy9geFkVDq50JMXG7hZE6Q7y7jnQZeibDHIrPhBxjc6gHk0v4rlMTOWY7ReibYP2k1vP1hZCvlibQ/132",
+        "nick_name": "Jessica",
+        "remark_name": "迈瑞熊娅",
+        "user_name": "JessicaXiong123456",
+        "wxid": "wxid_1m3vg5s8b8t421"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/cNfUnBU5mxN8TKXD5lUa0RRmhNt15t1mllByE62mkjfOH0uXydxibia8OyyQGd3M9lSPMH4gTwnEZnxIBQj5b8XDaoGHYZZ5jBXxFn4S5huX4/132",
+        "nick_name": "臧国辉",
+        "user_name": "",
+        "wxid": "woaini_1307"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/57TZUViaLrF8cGdlyDhnRISX1ia89nkdnTr0xibhlzj7R17OVsLXco7f5FrwcnXic96cQrqYLGf0zvCA57TEaiaPaOss8BF4cIDUvX7woXdmP1WM/132",
+        "nick_name": "忆如凡尘",
+        "remark_name": "创联刘兵",
+        "user_name": "",
+        "wxid": "liubing5212008"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/IlJgfWfVqkQCOtibISAuibQzMibI1RXSIUnzerLUm4b7xCn3d25XWKOkng8QD8LIIicXef7kNkJibmetZicTiauvkkqib8ADo5PuBicqvLmdc3z14aVU/132",
+        "nick_name": "找风也等风",
+        "remark_name": "杨高涵",
+        "user_name": "wx88888h",
+        "wxid": "wxid_1tfe980pqycb21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/3HULTiawGYFhYsBSPib3OL8N1THGudXyl2CSgoQJmticiceSDHLjcibQic5SmMzn1Uzk51QnRp8G9DU9qtHicy3ZRkR3231cmXrHmKJ5KFiaWa4cuJw/132",
+        "nick_name": "李星",
+        "user_name": "",
+        "wxid": "wxid_hz0kt1xxvy6c22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8B38Ug9Ox6mod81dscgoLv69Uql3icUSu5qVNF5xVfFJntO5s2nrYLYD2OFyjd9S5gsHoHpr7TMIgbgPRTSicDh365wiaICr4K6Qmu5LAl5whM/132",
+        "nick_name": "王天孝",
+        "user_name": "",
+        "wxid": "wxid_tdrw7qg4xj4722"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/c2uflJJicyhbVKsWVjxdXFLjYJXepXqIrv5CvI562YuWEZ6Ia0XXe2b9ncODNoibAZZzuuFFFjQKaicBPM1npAjt70L0ibre6V13FkHibPd6viaibE/132",
+        "nick_name": "许飞17332979830",
+        "user_name": "",
+        "wxid": "wxid_1ii0scgkopq222"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iaS81xaF3uic13qh6Q82NYMcxlgvR1x9icVWY07ps1hOUTLib2sAiac92XZ27HjpibaVVJWIye4cPJLV7N4ibmSwYvRfA/132",
+        "nick_name": "Lucky",
+        "user_name": "yong154902059",
+        "wxid": "wxid_9ze7sf4q7ftq12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/eswStsVbBjt8qIBUAmGKPtX8bbvuMXDAtibZXicicSbUyaogFibuBEdSYPdiaRxSyd0XCXPkkpandh3jVsmEYa0SMbFJqIibia7iaCxtZ8w4BXfSUE8/132",
+        "nick_name": "步行者",
+        "user_name": "jy103027",
+        "wxid": "wxid_1jnrgabiv56t22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/A2ibxvEkehvOFtwX71aZsibTjo0zaaYZUkQiaNwkRBuWWnPQJFVYTbAkdYyeKI1kGG0HAgGhIiaEDicowhobt4W0MDtMWoliaGdQJ9cEdqgCA6ZXA/132",
+        "nick_name": "丽娟",
+        "remark_name": "建阳妇幼郑丽娟",
+        "user_name": "",
+        "wxid": "zhenglijuan255246"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SrfbcdtI13HII4RrQm17pmv1icRv7ubmvQvCiaFmicZVDzY4CibvB2STRGTetia4iacbAKibIypkZ5VoSlhQda6yvm0Dw0CzrJYkongmkbURpekDac/132",
+        "nick_name": "AAA中国移动(营销部)",
+        "user_name": "",
+        "wxid": "wxid_lmenlc14m38v22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/4icOicvaT49RIlrRdMRZdkI0kMIkblicmwOGzZFKpVcQ1Om62yZ9eKwKxPdBdnRNrAYNUdQzMO5fvJbe3XKMMfLiaA/132",
+        "nick_name": "光",
+        "remark_name": "邯郸魏治光",
+        "user_name": "wei18231032273",
+        "wxid": "wxid_93qneltipegm12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/BDGcHmMM5WicgabMXewRLz2cPm5Yib4faXaicFgQHfnznvU2ecgqfyzQJkkqZVW1iaesaKg0qJxhcvryScoocDJr8W9Ryia40xlk5zJ3tPYpNO3E/132",
+        "nick_name": "留下回忆",
+        "remark_name": "蒋光祥揭阳康祥医疗器械",
+        "user_name": "",
+        "wxid": "wxid_wuypdj3rd5tx22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/qic0lc6OBkI31e3DgZ4coXdGJ5WKQDpvJbMw1MmzbYGjOGFjrN2J8cjRD5Z3gtW8ElbkLQYtfS4dia7dke3I2TI5Giap1an7icavuq0OmflhKFk/132",
+        "nick_name": "浮萍",
+        "remark_name": "株洲醴陵市妇幼保健院冯南萍",
+        "user_name": "",
+        "wxid": "wxid_wskkovof87ut12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/JkMmdejicnBFSbkib7OrVtKjFBOCESUBnnkZia1VxXiclS2A2ce0ed2xf03ib9UU8CB2KPIMcbxdKAye3yFq8GOS7a072lxjCktYsAUs2ibwXme4I/132",
+        "nick_name": "🍩",
+        "remark_name": "仙游妇幼郑老师",
+        "user_name": "zhengxinyi1994",
+        "wxid": "wxid_9105621058811"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/oMNPicSxCE7nNxU204XWbGRLY38a8yuQu4wibdP7TRpFmqhJzE2ZpD1TEAhWeC2slicBCBuIZBOCp6ygrvnWiblmDibdvnA9QhzJLFBzMugHr4XM/132",
+        "nick_name": "姜闪闪",
+        "remark_name": "姜珊锐仕方达",
+        "user_name": "shan1995528",
+        "wxid": "wxid_rq56ynbwee9h21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/B5jchqetwTBgryIEXv1NfVUsnNrRHVssfJG6VibqLyJgkwmnEsplsfuIGmLdGrNpiahdfIXmeIQvAVgaDNXVua3uVPByMxcRD4fvOrQibV3Bmg/132",
+        "nick_name": "Cherry",
+        "remark_name": "于亚",
+        "user_name": "YYDJlushangyoumi",
+        "wxid": "wxid_fahtd9wy2mmf21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/JcCJvDic6ibmyp4KlNibDIFO2WdXAxWPZTaDN6dD6thZErOUam1bqfXOAlAfPPYYStYMCXo3rQYMJyUJuL6z3hhkOaPlwG1VwgX4pXDe7bla0I/132",
+        "nick_name": "李可欣",
+        "user_name": "",
+        "wxid": "wxid_935ykaisuuzq12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ChqlctAjRoBoNJAY2b4TF8RlGviaNBPjibqHMRcpeib98zTZ3vQiahX9GVnFcBXMXAdY5lzxlToFJ5iaO6Z4RNPCvOvRHCy3gQNZ2k3vtzKBTQicI/132",
+        "nick_name": "朱🍀",
+        "user_name": "zly20040224",
+        "wxid": "wxid_iwojztm6zfgw21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Yod7xTOG1Bnb6T6qCeKkDKW1W171IJ8ibN8zJCOicwr4XlNicHLiab9MLSMuBAAgicYYHRGoNjaWG5d1nFdqngo20fAdVuSibpGMfd8iblszp4ul8Q/132",
+        "nick_name": "A.馫優龗爔",
+        "user_name": "",
+        "wxid": "wxid_t2l93k4hw6fg22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/xcAztYsIgtdIiajjJicU5vJb7wmoIkaZZSPebsX36n4Z2IHSOwcne0ongkwDdtCqZB8rIRXYZY7C3G3qskLzVwoA/132",
+        "nick_name": "任开乐",
+        "user_name": "R372387",
+        "wxid": "ren372387389"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/zCOvc42U72a2nvM8eAIecpumicEBibVUzvnq9n0q0phRev3LsEHKq9KDGdkcWUZyjQEuISAvdHyU7Kl5wdicht7lQ/132",
+        "nick_name": "梁力",
+        "user_name": "",
+        "wxid": "lxglxg"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2Utoibblr6kFqe7eaN7RIQXXF1phBe5SGwszvEs6W2MnnLPGRyYtBIht3c5RMsicUibGAydL7Kj8Al8aOrScNuV6qwxBajYMPTA3EWDWHQRevM/132",
+        "nick_name": "十三画也",
+        "user_name": "",
+        "wxid": "wxid_8cdp7f0qus6922"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/EH7oFjYVZQzVoh4zMcyRfibMDxa3ribJNFXWvhktiakIzIB1wl2BnNb2Ndz92ZVia5rFK7nrvHUtEMicnko8guLr1Aw/132",
+        "nick_name": "郑二胖",
+        "remark_name": "郑冠宇",
+        "user_name": "Mingzhu_sky",
+        "wxid": "wxid_5t22vvht51rs22"
+    },
+    {
+        "head_img": "",
+        "nick_name": "高山预防",
+        "remark_name": "高山预防茂南区人民医院儿保",
+        "user_name": "",
+        "wxid": "wxid_jv1thx57ze6m22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/lFt9H0kXCIxdP6MHuJSIEmQdqbgbZpLu3jfUJzfeoxJDzETIjt941Eb5q7BKPrcMcNiciafCqosXW2yHOsdIeeR5mjots8W27OWBnTaQQyqqI/132",
+        "nick_name": "于胜利15933809195",
+        "user_name": "",
+        "wxid": "wxid_yrzvrb0s45do22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/4KQeWibmsKIzibSNdILeicPhsticq5rFQp8bbUZDUOJ0ibKLPCYYibfdLA0S3papFIkTxEpWmZz1yIsH49hCrgia4YXKg/132",
+        "nick_name": "动听小雨",
+        "remark_name": "岳阳楼区妇幼张红英",
+        "user_name": "",
+        "wxid": "wxid_uljwhm39y0612"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Cu7u3zVNteclXLAqfgfrL40B8uIhibTNTS7op0Rp09FC6txOKibFA1ibgicUFjMiaUxicZvOic0AO1dqMB7EfT1Qia8jDA/132",
+        "nick_name": "才鸟",
+        "remark_name": "龙岩市中医院蔡清霞",
+        "user_name": "",
+        "wxid": "shrimp-water"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Y3Kshphxh9RzOx8ic8A2JC03GeRVbiaYBzznxgTk6pjpC53b6m7eZblREzSiaP2a7Ric9HYk8IvH8jL35Y1kiaDYkiauqhX6NU3NxvBxibvTozHAXU/132",
+        "nick_name": "小雄",
+        "remark_name": "宁都县妇幼郭小雄",
+        "user_name": "",
+        "wxid": "wxid_aiaqvmycpeib22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/YUSibGzmyqLeOnEVH3rVuFQFC75ZC2q8DouAicJwbGGHhYv1GqzFibGlPEtHuKOkZkrDCz50yM5vMab2xTCwRGOSgk1ic22f6AbgPA6svBgKaDA/132",
+        "nick_name": "于湄",
+        "user_name": "Cqzdym",
+        "wxid": "wxid_p62o0mz3d5ok12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gh7cnT5mVmt7X6VicfxyS9yViaoKUp3hF4ogmhs9d54hibJmHqjCwGibIshnlEc2g1iayph5vX7PmYxtZ8IzHaPziaGy2oR532Dfibg8GBzcAB1yDs/132",
+        "nick_name": "锦绣",
+        "remark_name": "重庆五院儿保金秀兰",
+        "user_name": "Jxl617650882",
+        "wxid": "wxid_d8ty5ls66xj021"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iaj2lDgHBdSDEyPZdKfqL1SMAWw3nAGjX64PNmeZUVCyzInYkUZCMmrZCgIJQLOCJRhEG5KrBbTOTIo7gYCNicbg/132",
+        "nick_name": "活在当下",
+        "remark_name": "张友",
+        "user_name": "",
+        "wxid": "wxid_81la592kdwso22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/RsdxJCBmiayVAiawX9UBfJB3hV2PQaa8Bs2QuiaRyjopsFFaFPkwN3oRh5jTibTfhUCZVaVHt80LH9BnzSAg6gOs8otW361cx5obbqpuvIaiapSE/132",
+        "nick_name": "小希",
+        "remark_name": "谭希艳雷锋街道社区卫生服务中心",
+        "user_name": "xixi253",
+        "wxid": "wxid_bl471qllw1ee21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/uxIAowzNU3GeyrVp2TCWZG1wGIP5nVbPVjwjV2Plt2KiaCclEfibDibpGYPX7M3nKNweG7Ons4Ir9tVic0taS23qxxtsDyBs9DRSEiaNicjhEB1cY/132",
+        "nick_name": "啦啦啦",
+        "user_name": "hy-huiyuan",
+        "wxid": "wxid_cbq4urxt9zea22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Bo4Jca5p9qgKJ5AkpGCICfkh4ibVEr27tD2JHudVribHiaV4CgB3Xmdia09oSa5oqDSdM3WQODF10viaQiaFfXIXlWGUeFbT246k0gtPmv7nETWMM/132",
+        "nick_name": "赖利红",
+        "remark_name": "新田县妇幼赖利红",
+        "user_name": "llh13874784556",
+        "wxid": "wxid_erbnsjpllw3h22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/yorvghx7WXaZN4n0XzPdl4VouwX7ibKaZNbEWMibsGGEBrLSdt14hFk2ICSIY9GekibgqJbynEQmxXA6kBh43ibhgxpichjQIHcA7skLrzDUS7TU/132",
+        "nick_name": "阿耕",
+        "remark_name": "龙岩永定区医院张河贞",
+        "user_name": "zhzhtag",
+        "wxid": "wxid_ngy2ds1f220022"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ibU6wBW8iaQPgYiaOdEk7LD75UDbGD2dpOXEdiaQVQJJsLT8IdWo17RRr1vWvmRQ6vZichNQ8csW5mjLfnDL8RModibhoNWwnuic1MlGIF9QeYpxlE/132",
+        "nick_name": "美团团购李云梦",
+        "remark_name": "李云梦",
+        "user_name": "mf815108897",
+        "wxid": "wxid_2eza1uf4h5q622"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/fEZgMuQmth7gSosD3U163l5G6k5dFJZTkR5gRjPqpnQE5L0E7lgwVNAjmHjxQcqxia7qKhEoFyhhNhjiboMw4bycEFaVEvqsLzMXibVMIKk1bs/132",
+        "nick_name": "古月🎀",
+        "remark_name": "建阳区妇幼古月",
+        "user_name": "fjwyshjr",
+        "wxid": "wxid_7656536573812"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ChTx3r7NQKjibNVPYfLicB5BZRF4XMfkVsr6B00AftPaklXJU4CaibibBTuIBicnTcd95zbpMFtB0EKyNuyCANhugrx7bKlyiaxBRTSwzvq2BB9RA/132",
+        "nick_name": "洋洋🎈✨",
+        "user_name": "yangyang2013xie",
+        "wxid": "a37179269"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/TvrTj4CmPpw8ggIbToUoWxksElmGeQCj0JtXofFzZMa9TIOCSkK83f9icUrKLNDhc3jBiazicSZibd9Evibp2SzjrHHj4h9YTkuxtJDygPIIXVEU/132",
+        "nick_name": "卢立强",
+        "user_name": "neululiqiang",
+        "wxid": "wxid_mlfsfdqmelvc21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/WrpxmLPLdThL7j9CtAys4E0zIPLS37xVUTKCYrbV0DiaE8HK68F61WiaicYleoFECylCjQUlk1LNpFssRFvMz0zcA/132",
+        "nick_name": "★欢ㄅ",
+        "remark_name": "王晓欢",
+        "user_name": "",
+        "wxid": "wang900213"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/12BDpzSDBPodSYQxxy7H9dXlwjDXbsmZOOLqvpvreNcsgxibBbP4UzjeT2GxLn0h96MpIwoxQd2T261BtJotoOKPXgFBDGlyUquDBnPLWLTo/132",
+        "nick_name": "〆丶青ㄦつ",
+        "remark_name": "王〆丶青ㄦつ",
+        "user_name": "ffyyyyddnnzz",
+        "wxid": "wxid_9vg97xiuky9322"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/0bDLqtLTiaLMjHJGNuav0YkthLOuf1XpTsh1d5aeriaicKf7XFrqpqg7BNTMIWvfrW1KBUtbiaiaCM4BOCiaJKPID3Zg/132",
+        "nick_name": "保利城🌞张玉伟",
+        "remark_name": "张玉伟15081895335",
+        "user_name": "yatouzyw",
+        "wxid": "wxid_zw237bmtxzm521"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/FcQ7jeFmYLrvlHIdKqzN0vlSFzrru2GIv2OlkO1zX4AfziaYO0JwdccTtKuv9SoEjsIS4Jg9vS6iczMJiaTIhyVIlXhGWa0EMXkuTyYnPvvLLE/132",
+        "nick_name": "九月猫🎩",
+        "remark_name": "高浩然",
+        "user_name": "Joanna-CZY",
+        "wxid": "wxid_buc9bdvfdwat21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/GLfuHBMcVzmTRW1Z1OIficn8BAOsEibPFoK6WsicM9jqK6pBG2Yia7oIicu6ibticDiaXhws2W1HGdCFt9Fg2W1cibt7DRCicjibz7KU1ruwSTKmVHRZ5c/132",
+        "nick_name": "王孟君",
+        "user_name": "wmj_633",
+        "wxid": "wxid_rfzp9k4fbwiu21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/TzBibnfBh1BVtp1A3VzJNe0k6OPJQM9drusXYYMt6M4CARQfhb6Ry6wmz0x6XcsTjGde899KEjWXvDgEShRVSvecgcptKiaG24uCFrZMokfK0/132",
+        "nick_name": "专招医药代表 小Q",
+        "user_name": "MsEva9",
+        "wxid": "wxid_p0uvly5ez75312"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Yl5k9Gcxb418VBQVtmFDbBpcA3C5eibBQW9jsaS9wfbyXwICO0VX9YMJGbibC5p5Ofxa55uI791XPsY3qRhUovUzd07dYwHC1r2ibDfWIatrWE/132",
+        "nick_name": "A泰诗尔肌理壁膜,墙面壁材",
+        "remark_name": "亚鹏",
+        "user_name": "baobei3405970",
+        "wxid": "wxid_nknmkjl7rl4a22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/3vN4et3UjbTu8a5Z0ZBakz9mrZBkMeRXI9e6Krk1jEEWd2X8xTnNGrOpviceDHH5VyibhJwl7J4TUo7ZXIp221qoARb9OrdicVgzjNwDXMMtG8/132",
+        "nick_name": "依依不舍服饰🌹宋晴",
+        "remark_name": "宋情润德",
+        "user_name": "qq00891205",
+        "wxid": "wxid_5457834578112"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/oTHTibPzfiaIia8Ism8MichJ3KQCHh5YtvllkZfs4ZPUBlGdQsSPticYtV2e9VZ6pjXfGMJpzaSmTeibYdq2qfMng09g/132",
+        "nick_name": "袁姗",
+        "remark_name": "湖南省妇幼袁姗",
+        "user_name": "corayuan1206",
+        "wxid": "qq136469057"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/wnzwMdzicKY1HQCjJ6UX5PRRJEEmfA2SpiavYffubYyQQIVqjfsnPyR5kEZuTsd2xFCh7xxOM5UuriayibyeUZYnmgUpDlk3guZYibXcia6wTA8ibg/132",
+        "nick_name": "郑",
+        "remark_name": "郑牙医",
+        "user_name": "yey0404",
+        "wxid": "wxid_7j2ftdq0dkq922"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/B9ZFuaUdzuicqrGuBJTazU0xZZpUHuictuNglEGnmXfyerd4npuY0Tboiaek8GumCLVibrKIXuMmatOTKic1DkuU3QA5RpHkHKu1K0EI7rFAPZa8/132",
+        "nick_name": "billy young",
+        "remark_name": "喜高刘杨悦",
+        "user_name": "deadbilly1015",
+        "wxid": "wxid_dir80mqg67db31"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/pXDngduNzreASAdmsOgXFA2M2knY4M33icJ1dGUbdHgpdM1Nhja5ZvJWlpbMxh5JSZZuyEQOP53ZeKQNOd8fbJQKs0Tua27uQJ2ic8ia4J5gia0/132",
+        "nick_name": "没名字🕶 👠",
+        "remark_name": "邵阳医科大学附属第二医院石玉兰",
+        "user_name": "",
+        "wxid": "syl0423"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/zCibF7RsbqpoMatbC4zQibEYmk3AuCv8xlA77Aoic8doL09vaYYJ68VaMHuD69DhfrmspFR5Bv1MgGrzzAWTiaVicMBdTicAdlrZvLVSMJBtcnfFw/132",
+        "nick_name": "梁芙蓉一北大儿科",
+        "remark_name": "北大医院梁芙蓉",
+        "user_name": "BDEKliangfurong",
+        "wxid": "wxid_8du81a92ialg22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/yyRxJ5oNPVNTf0FR6CUsav8JwchLgYvFD2DpgLEBcYPSDvZjLNyqQC85R4XdEuribLc33oqjib54tX76qzoKdn6ZUWm8PonxJq3iafCAzNd1b8/132",
+        "nick_name": "妹砣",
+        "remark_name": "黄爱文。唯嘉儿科",
+        "user_name": "huangmeinv125",
+        "wxid": "wxid_g9ymoqb4mlxo21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/dyaKgibWJbxmjO7t0OQSlYZeH86jLnxhiam3nYkt98AUauJTwfPRTD0NC9picWsWsvUUILjCIc1lGuNQkXPTu7BJiaOt7qGfNuQSTH2m70CAr24/132",
+        "nick_name": "张颖",
+        "remark_name": "睿宝儿科张颖",
+        "user_name": "",
+        "wxid": "zhangying089765"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/qMZyUteJj7VFqb6DFuk0lf8vvJZy5qib5pib72YREic9gibkqDMcEhj0o8sQB4fs6wicQuHKX3LbbSeUWgSDwHGU4gQhibNtUiaY6L4OPvp80ZR3Fg/132",
+        "nick_name": "吴慧钊",
+        "user_name": "w13931121132",
+        "wxid": "wxid_3335593354022"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gE2DgAvLcwUibExazN8IsZaIoyRibTT3Sia49ty2ibW72Ou88JSlnF188bX5Eg954JV1yvC3S9mSFUh6FwoTpo4v4Bscoz55qvFJe7nDicO3o1sw/132",
+        "nick_name": "五院  杨军",
+        "remark_name": "张家口第五医院  杨军",
+        "user_name": "awumang8301",
+        "wxid": "wxid_nk5w03l3h4t422"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/atoDeRKicCawKRtMXD8cicniaiczfy9IicSfX0pQuY46rHO7queChK0G9rIkQwGDDne0n2vIf0VFOPBg77P9iaY3ibiay3nZ5GL1ySCFEib3e3rfhrmk/132",
+        "nick_name": "无语",
+        "user_name": "bhy780302",
+        "wxid": "wxid_ki8fsrlqswwr22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gib5icibn7cmPKI5EY9XAy2b5ib0TZXkAVhTcib8Wv52drUr5bLRuYEQ2CeQNkm7cUKcgic3ABojcF6YZy8BpR7UWBpw/132",
+        "nick_name": "陈潇",
+        "user_name": "",
+        "wxid": "xxllxxll"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ESqHrt11PEFokN7Yf23XDXuRwr5Lks77wLC3FxGIZUxgKvEY1NZnmotNCNAjjDVviaT9X5AAicicViajVibFnh11JYHC4Yj3ibqyhXAJHIU9ibLeJ0/132",
+        "nick_name": "高青山ⁿ",
+        "user_name": "gao_qingshan",
+        "wxid": "g834863745"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/mfQmrU699cJwE8EULnjOsRolBDWe7SXFkwqDL7tUiaS7XpVWibPgaoib7hZgibn8tQeAHKomt7LQ687X3xFcs1eOaBQnueVoemHbr0jWmiaSIncc/132",
+        "nick_name": "暖云",
+        "remark_name": "杜红云贵阳六院",
+        "user_name": "",
+        "wxid": "wxid_sr55hmnt9fmi51"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/h24QnUog3UJOdD1Iv4a2eW8AUeDiciacRE0vXZkmMPHwWH8et6ibAVEsD8nzR9om8jRasTRWMXzP53EXFMR0WtVeOyzhLbicJx4noCHVpumLPnI/132",
+        "nick_name": "莲花(曦曦)",
+        "remark_name": "南岸区妇幼保健院章静",
+        "user_name": "",
+        "wxid": "wxid_algi4prf62bg22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/KftA3rRoYqxlEJy8k5EzTGTlEolwx4p5yDGF6Fibt3zpC3rXNUqSQ9bZ0PsUS8Gdsy93Via9Dxc2OafEUHLaj9jSmwDvk7ibc386z3iaxaeOf8M/132",
+        "nick_name": "没有如果",
+        "remark_name": "建阳区妇幼儿保毛翔",
+        "user_name": "",
+        "wxid": "mao125415"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/LDkFC5z0qKn62agTAbibLial29sDb27Ys187qIQSI6F4wVKO0ibCxYqJQ7O20PXbm3sXUQQUOAUqibynZHlkBMcq5ntax1UFgQg7NYWpVkWAYrw/132",
+        "nick_name": "。Sharon",
+        "remark_name": "垫江县妇幼熊繁",
+        "user_name": "sharon_wp_xf",
+        "wxid": "wxid_lkjuy0odk5ny21"
+    },
+    {
+        "head_img": "",
+        "nick_name": "刘东",
+        "remark_name": "景德镇第三医院刘东",
+        "user_name": "",
+        "wxid": "wxid_rabvfgpdk00022"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/nibJmSUD0AkCPeUrYUJ8icSREKjB2TFYucg3nplwhxVaU8ibkMVnmhIzoQbIcTicVibxNbkMjdtEzeSxkiaib2ibNHwuDQ/132",
+        "nick_name": "孙沛",
+        "remark_name": "揭阳红十字会医院信息科孙沛",
+        "user_name": "",
+        "wxid": "pei0920"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/wfic8kuwb9WPgYb8cgzDDYxPmoSYJqjuvwWll4ffUH49jiaLYu8brRd8AQvrHuQ0F4bcVTYR8FM601qngPEdE8ficXopsmu5ZZzMibVTnP867Fw/132",
+        "nick_name": "倩女王",
+        "remark_name": "杨倩贵阳护理职业学院",
+        "user_name": "",
+        "wxid": "yq112198475"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ibvVhbBIG2poNzmPfRSWJRicV8MyyMnEaguL3Icht7F1q7X8bPOBnoSlIFlJlYrwibEYrqa1iaTRnV8UzFN0IhtDHqLeeu1QOjtZ3nicfPAGhGdw/132",
+        "nick_name": "霞",
+        "remark_name": "番禺区第二人民医院儿保韦主任",
+        "user_name": "",
+        "wxid": "wxid_p714970zqdwb22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/DbRkgvA4bntWQo7qpAyaiccxNVnibov6nrEbX6OpbFSj0hPFpWhG42L6qJMFebYYPNME6q0d0ED5a8RYXapEUV8rBDYJCpfsXVbVHeJSruhiaU/132",
+        "nick_name": "孟锦",
+        "remark_name": "迈瑞行政孟锦",
+        "user_name": "m13739745747",
+        "wxid": "wxid_nhahxyv7cnod22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/wuDXbkicHKAbPV8RicQ3I8wx13z3wU0Kz5vTqLzQPAGzsStydrnibsYc0EZU2h76mDMkqzLo4MPPsTsWTRDOq9MQUatEictWLj4lMGvArIBGHjs/132",
+        "nick_name": "小西伯",
+        "remark_name": "唯嘉儿科赵经理",
+        "user_name": "",
+        "wxid": "z11816"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/dVNhN6T76LeViaY4Ppsv80RgJ40Qfujyr37Ba2B02srm8uTwWk85R4rRKdPEew2iclibgjeEliazZO2Mjda2EnEV78kFZLlL7YxJhk5Pe9C4J9E/132",
+        "nick_name": "坚强的心",
+        "remark_name": "喜高刘瑞博",
+        "user_name": "",
+        "wxid": "wxid_9nzviiatkiwb22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/dHn3gCwbxibArkE6uMS1DdtkZFTtibkjArVKc4w0AQ9YMic8pM16nqEdWBTrdibkh6TFGcdWF0E2YO3QmvZcy2XBF9lDsltLIRIMVO9BZT1hrrM/132",
+        "nick_name": "coco",
+        "remark_name": "四川绵阳市中心医院吴翼君",
+        "user_name": "coco57coco",
+        "wxid": "wxid_03d6xjx4lekg22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/zMalwPBQRu2PlRykYclibI98Vpd0EPvutfJAVZ0GGxnt81icibu4wYqrCL6QUd40qGvLSicjw7TfYFd9nnqbb56X6Q/132",
+        "nick_name": "黄成友",
+        "remark_name": "玉山博爱医院黄成友",
+        "user_name": "TE13576398108",
+        "wxid": "wxid_li9hvp890wie22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/BYGLfOarUDJuhdaAFsrFwuLETMtoZnxScIpRgsg44ZIc9qCQzic7IGtVYLvS50v1gAxg0scefaQ2qxTjCNYibnJG6QMaKE5oYKXQtB5RwANtY/132",
+        "nick_name": "刘砡圻(天道酬勤)",
+        "remark_name": "佛山顺德区均安社区刘志华",
+        "user_name": "jiangyugugu",
+        "wxid": "liuhuawa"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SR7SYw7rKdXhkAic7CE93qVjIDNCDtZ6JwLL4jCYkgaZN7KhNnKcia1odxQq17H4BTEzhyCtUCrMuLjQp43ERFNJ3VOwrVVXoAL1lwetxOVyQ/132",
+        "nick_name": "心岚",
+        "remark_name": "佛山市南海区人民医院 汤玉妍",
+        "user_name": "Beckynh",
+        "wxid": "wxid_0791647916522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/GV8WGqBPgeBQ6JzlHdpGLGsrmSpCDJeEO7hZyJibLUaAxSxic9YaegzCu15oTHyveicOMOqluaX4pacyibC1jLKweA/132",
+        "nick_name": "迷失瞳話",
+        "remark_name": "鹤岗人民医院马老师",
+        "user_name": "ting553729",
+        "wxid": "mayanting553729"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SVvCJ3LqWuRD2AsnoHpluoFa3NyDibqW9IHHw0CSRsz1PcuS2gSibFNo9yRVCsUU8X9CdOjytAR4pkORvzvrYMNG3m8ZOcXcU5TsAoU5enpkE/132",
+        "nick_name": "吕梦瑶",
+        "remark_name": "迈瑞影像临床吕梦瑶",
+        "user_name": "",
+        "wxid": "lvmengyao823257931"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/f5JcuklG9AHiaN4EDIO4MBlh5bZAemucHq5wdicYZMZkYtSATVkmVza3QONoEv0oXYIiaPelmib9JVY6ToKDoLCCow/132",
+        "nick_name": "十指紧扣",
+        "user_name": "",
+        "wxid": "wxid_3013360132712"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/arzdHhjzajfR6AEYam0nhDffV4xQtJV25TwTNh2uhIOtOcp2CnkGGiaQgOFNx2huYR2MS5VIapm7J3SmWEwpOIQvwJCpTWic07XyWVhSfiaFb8/132",
+        "nick_name": "郭哲",
+        "remark_name": "省三技师长郭哲",
+        "user_name": "",
+        "wxid": "wxid_3qyoeikuq45352"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/dW1iaOzABRXWqc423frttHClXS2KjicNfrUh1sibhSgvmjRxBcV15IiczzazNZ7591XGibn5SrjkPvtw3V3MCXrYyoOgDTajianwPmUiaVbav6eDx4/132",
+        "nick_name": "王",
+        "remark_name": "高安妇幼王涛",
+        "user_name": "",
+        "wxid": "wxid_opxwxmjfou6921"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Dw6yGczPdlTb0fEgEygSrpiaVyk4dGAJeefvCAibDQZdoojYhlsjdAeANwflFfYwoaOOGW9V0Cvja3ckVurpgkrQ09U8gEBx8Wlp1ktMpX6IQ/132",
+        "nick_name": "君君最爱",
+        "user_name": "",
+        "wxid": "wxid_r3ryumplbpbj21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/R5VWx4yaG1YS85EwmsB1pibQDHEG7leyQw4dxNcJrgFdX51n5BewvHvvVd98PmXzDIysuy4yZPJUicHCuxEmfDoHicu8oSvukrbnM3Kdf2QDZY/132",
+        "nick_name": "*A 小返精灵5【淘宝京东拼多多】",
+        "user_name": "pyd546",
+        "wxid": "wxid_kpsclv5ubwri22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/T19MaJBKpWe6Y7Oqj6wAK1hVHEc7A49Zr88YGgDBPicvQpKTHjUbwTMSib4aEu83VXhpYAhecnTr16nrP49icMt7HGdPzodaSqt9SuDh71zQac/132",
+        "nick_name": "吕松林",
+        "user_name": "and042013",
+        "wxid": "wxid_0o97kbbpd5cz22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/I0wo65Sv2ZOIGxSS62v4XV9vNPcYWTiatwKQBcueNDVD0u6usA8lj6syRUBS83IvmhvIICbNhxhxl3dHchNTZTMkMWU2vWPzqrgvTBlxlp2M/132",
+        "nick_name": "李玉倩",
+        "user_name": "liyuqian4514081",
+        "wxid": "wxid_n0t3mzyd08l921"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/vOpM42UESmBKxicjmwNBf5MpCAcAABWvtqeQ3uJ4zgOS0vazXWth6vspxbkAMeu2ia50um0NpOmDxFZsvuyJJ1JQ/132",
+        "nick_name": "Celia💃 赵媛",
+        "user_name": "ZHENAITONGYAN",
+        "wxid": "wxid_nb7jjhi8iw1m22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ovE0edcXa8C1ibkYZOogCrF5p0fQLgOBnLRDjMmTn8ia72krDXNO6pV0a8ToWjgeAwOV1oezy0eFgTdXEFVOGFOQ/132",
+        "nick_name": "郭志强",
+        "remark_name": "迈瑞放射新疆郭志强",
+        "user_name": "gzqwx1128",
+        "wxid": "q442192992"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/fsgFUvgJyfpl95xajE6yhia4rknjcyQv41icICvrT42niaPaCMWlYSuNSiaLuQM6NwBAGket55Z4vs63nicrARWrxrA/132",
+        "nick_name": "飞舞心灵",
+        "remark_name": "漳州市妇幼许德南",
+        "user_name": "xdn383535921",
+        "wxid": "wxid_cu8auh7ulnbf21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/EI2MMW5dAn3Sfx4zuS0ibM25My36X1X8FicJeNiaSQEvmnA4AJFkHicTELSKJEu3B6p4J204OPpCrOweiaC2n68naicVUbkNiax6IzicGtN5RdiaH1Ec/132",
+        "nick_name": "Echo",
+        "remark_name": "Echo  GE",
+        "user_name": "eoen2018",
+        "wxid": "wxid_4n8b7h85n9d822"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/EicPgtZfmiaGyh7ealTzJ1ZoAvKKQHZoxeCoibFgD9uPQ1U9ibXpUlMJOXSAqoicmWDkPuYppmmGspTkqYscriatiaUkqoiasxTcvJVL7ZsSMmStFac/132",
+        "nick_name": "秋兰",
+        "remark_name": "福州儿童医院儿保李护士长",
+        "user_name": "lql870901",
+        "wxid": "wxid_c6hfhf8r150t11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/KZCCSfF4Qs0pHrXzxCgqibbAUQyI6VHRc1dAn92bg6EGS3CtwvTIZyXTu52FhCW0ico6lfuXEE21MDiaGSJn9EMbibNBbhd0TbrDOIeRDXLPpoM/132",
+        "nick_name": "于州",
+        "remark_name": "四川达州妇幼邹瑜",
+        "user_name": "",
+        "wxid": "wxid_29desk3r4gcs21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/hXDAfHbExse6ZkndkJgs29S4HKBPLWQfkNeLSQrjeVc3N9s0JFRa3jSKMXBAmugotRDZwIXg31x5nKAZb3fLFtpOPJWEowEz99doGj3l3XM/132",
+        "nick_name": "MyQueen*~",
+        "remark_name": "程雪",
+        "user_name": "aa905620409",
+        "wxid": "wxid_9k987lt7d03i12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/TibSNsDFbodeu4VEzP0qr2srxAGOq5w7DHaxuyua7J1zfnUI1O6Hh6LYd45uGzLfrQyofQibXt5Vr5qjSwvL7JhurVYwRDR4zibPwAwjBnfpjo/132",
+        "nick_name": "饭特稀",
+        "remark_name": "睦友翟姐",
+        "user_name": "z396287301",
+        "wxid": "zhai158751"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/xo4pfATmjm1xm2mloVyNicqXRAkP7jTdyEM7CKxGZLkfKPm5nuiaGTEM0TxoQmpAkicVJnUaaxcxROrjEsPAwMmsVHaz4KBptRq1gBOibtv6acQ/132",
+        "nick_name": "佳儿康~李医生",
+        "user_name": "Dr_Li-15989087528",
+        "wxid": "wxid_dtx1kgk2g00n21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/kEAXicVqmxRkkLBiaaoaLrKUCxLT852ibIdRcFYHP4MjSe2jialqG90HuJ3fxjtu5FRv8ia5axBEvJIuOMIibaIibuXG0BFudo6iaUrzcmnOfudqaTE/132",
+        "nick_name": "雷美丹",
+        "user_name": "",
+        "wxid": "meidan1122"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/YbZttnUELyKs9D9lasagTXpWG8lv1zRrI5Hkbhiabela2xBodiaBLoGZ2Y9DTbQX2UQh28V9SkbK44eMBfVUcReQ/132",
+        "nick_name": "崇禾萌",
+        "user_name": "chmm0821",
+        "wxid": "wxid_hu075aelpibf22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/rTIM6r3T8NRAhUuIvfFsvicSKnOILPgVfUknHicRP7fydohKGP6wMkJSM5McfliaXs6hA3lnlTX1YKjpD7RR1DzgvZWiak4wvB6l0PYiaSdCiaLKI/132",
+        "nick_name": "杜银华",
+        "remark_name": "潼南妇幼杜主任",
+        "user_name": "dyh069",
+        "wxid": "wxid_gk1p81k2wbee12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/YgRVKp740FibBXcNywOFSsE3E8yQnlpIzS7lqrJzMojqcgsL1Jib6g4JbLiaszaic6pQ2UgcPQTXhibxibOLgJuxox1uPwzlkJZswYJFC5vUJGork/132",
+        "nick_name": "蕙质兰心",
+        "remark_name": "安远县妇幼杜老师",
+        "user_name": "",
+        "wxid": "wxid_9850268503612"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/lcXw4qnBTic5bGqRRKa3POpBzZhL4FiczA1b0AODg9UQwoOH44ViaodkhLrqeSPYicNy5ERy8Hul1sTPh9zM9q4FnPYxZIIF69LH3eCA9B8l0fU/132",
+        "nick_name": "喜盈盈",
+        "user_name": "r18132186892",
+        "wxid": "wxid_ecasfo7xn84422"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/pxgnbpExwAmCYwBhguELMzoEkibepL7H95vTkXq9VESp3n2PNtfb1KleZ31ic09YvHgu0KcTboZAolmZmRCr1ltT0eeic1rfliaxxaqiaX2TEKq4/132",
+        "nick_name": "吴世",
+        "user_name": "",
+        "wxid": "wxid_t0g0113iwoci22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Bt6gxQuZ5KqdSv6Kl5XpUbTfrMTLOcicgKbfdW7Qwe9bOCygicogGnAaKP0cEeOyh4WNxiahuof9hBwTX2TCOMyg6KByO8KNQiar9JWPDP9FGZ0/132",
+        "nick_name": "清凉江之子~宋登浩省二院",
+        "remark_name": "宋登浩省二院",
+        "user_name": "",
+        "wxid": "wxid_snrmwa8cyubc21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/IWA8SBTwxz9W9xfTEdBibtsAXJefVCSAh5gODaYEU35BSiaCB4DTUBia26OBNvlCtTZgUvic47uiby5iaWFG5zodjIicEOvMrSZhvwkCNcDD7gP0K8/132",
+        "nick_name": "肖湘",
+        "remark_name": "湘雅二院龚潇湘",
+        "user_name": "shylah212",
+        "wxid": "wxid_sslydv5xc2t721"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/fMSRiaCjaZaY6vUkDE17sBr9E6me6AbzsgxT9zjErJsicaTDckA1CjrT0muDibRsWxWY7h1gma9lQ1shMMibKGAQyQ/132",
+        "nick_name": "L.",
+        "user_name": "a-1126682204",
+        "wxid": "xiaogediao"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/B5S8OG9E53nBThMpIIpa0svKYdQiaowDdErPPSwk7Bdb1Q0bIEyYRhCqtjQdzLiaM7eHc7EJnOymIF0VkejE2aHw/132",
+        "nick_name": "韩谨檑",
+        "user_name": "",
+        "wxid": "pnimala1"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/kesYbncVYxUibyliawjZedLTzEh7AicHzHNKNX2ZIbRictsdYvEDtXweP827MGTAO0mDsGqBXVlEkcDNG5nWQKreAXh2UXVF5hsClYWe8DDSPYM/132",
+        "nick_name": "G.L.R",
+        "remark_name": "林如",
+        "user_name": "",
+        "wxid": "wxid_p731mhypi2f721"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/DXQIo0XVpmOA7o2mrO7bEGQCuicI4dlqPzNve44oQeLuzjhS5agYeOc9qsyHXqC3KJBHaq35y3mHqWcvZqJxpow/132",
+        "nick_name": "史洋",
+        "user_name": "shiyangaini1314",
+        "wxid": "ainiyisheng1314"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/djsDTqmLib4ibnQhRHkEPnhAibXrzibH3icibmMCoTsHystzpqp32DvJ3yTKl1HAIzgTyLokbTrZM790ESsR0TybGKR87yqicbFA8JCdFiaNIOcnddc/132",
+        "nick_name": "楽多",
+        "user_name": "wxid_genggeng123",
+        "wxid": "wxid_zsy0drcawhxu41"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/WI5tM8IzcMHIrAB7sBLnJctWhn4vegjHWMkQ4lNvmjyejVgULAKllLWFucg7gWQ8ibqibpAufo2775nLt4Gibu1a5FydGQD3VyMx8lkrrqdMko/132",
+        "nick_name": "张三疯",
+        "remark_name": "张倩",
+        "user_name": "ZQ1995Laugh",
+        "wxid": "wxid_4vnuwrg5095g42"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/lKUGehu4DQZLaBkn4m2vUPgiciau1nIcwS9J6EwSUJZvPT25XI3ZCRJFmibjntzYw8loLhs0NJwJB2lsFqJ0ibdfYQ/132",
+        "nick_name": "在路上",
+        "remark_name": "迈瑞赵俊松",
+        "user_name": "",
+        "wxid": "zhaojunsong003"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/NXKzibHicK7Ga12aRyrtMl95OByPicVqb5MKjBMSCF0ap3ribam4a5lxyfbibg7Ca9ncvzElToE36XYwIFhicYdxSBDA/132",
+        "nick_name": "潇潇暮雨",
+        "remark_name": "陈潇潇省二",
+        "user_name": "",
+        "wxid": "chenxiaoxiao935"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/5dsZGNNlSCN1yvgr8VGBuMQ0I57icpfsBY3GP5MIQ2anlCNK4B7FBekBe2qicCRgYZHLwA25xoHMf5GpfYp4gibWhrjAeqaWhyxHQBBrVS0VPY/132",
+        "nick_name": "待待",
+        "remark_name": "益阳市妇幼夏待临",
+        "user_name": "",
+        "wxid": "wxid_5q7zqdlkif2522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/RHJpE47MJoDwXgG10NLosZKJ6vbFUcXGnNKs7H7pk0gtBhGKPia49L9ib4ia1tKWccW6uRibtdiaU4ChbEUx7UwUR8lRrGia7kPJiazTXoVcL1qb6o/132",
+        "nick_name": "吴旭",
+        "user_name": "z8802241519z",
+        "wxid": "wxid_0jxsmhedp8p22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ViaxJicN2BOs39Lm0gPxTNX0x4l7n3YOkX0Omlt0ia6szjvVgZlqLLoNPO9nz8YicsjIlq4vL4AUYTjBCxjibHnTTBW5wsw4ouKFibRIBOXicCXCm4/132",
+        "nick_name": "Zoe~",
+        "user_name": "woshi18721225351",
+        "wxid": "wxid_z390euvdsv0q22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/3ybb7tWfj1jgA8hSbTx2HA0ibH9k4dPVVKxZ8Em5HTtmeknudDYh2TuH9yJaf5XTWulIhJYxlpeEibEP9ByxnjItfdCZDZLXzzIbrpwgNoDHY/132",
+        "nick_name": "桃子",
+        "remark_name": "贵阳云岩区社区卫生院罗肇桃",
+        "user_name": "lzt_20140616",
+        "wxid": "wxid_ibz0ql3d6mbm22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/zKhGCqAr5vQkkqGWibDjW1RW0Y3QWFx0rKKeQH3u8c35Y1jWdHXZbvNVEgK4XASt7MMcho0dMalxjq2pDdUq14nszbA8Fq4PdWPEicF9mMh1E/132",
+        "nick_name": "庞燕毅",
+        "remark_name": "高州妇幼庞燕毅",
+        "user_name": "p13824888511",
+        "wxid": "wxid_ivu70043c63v22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Nucn5yuGu66PvVgYiaI0WSyPlo9wndrN3dDhSKoJWMPnArfa6laIib3XibHOdqQNThGGwmiaj1M3L1LE5oyYiaM7LUicW8uc1shbtIuy0y7vJpcUI/132",
+        "nick_name": "可可西里",
+        "remark_name": "大足区妇幼保健院杨郑放射科",
+        "user_name": "",
+        "wxid": "wxid_bxmuuodngdwi21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/f0eMM1ibFOuibpiaicVUBh83IUQFIyusjTiaqricIbGJHYLibrgCG63hdDSKb63Z6phicRdvdZenZF5MEpfchtueNGKnGjzpH3CkUamBdKUeWt148QI/132",
+        "nick_name": "大江东去",
+        "remark_name": "爸爸",
+        "user_name": "",
+        "wxid": "wxid_5crs59hscony22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ibd7iaoI3dOrecvEYJictSKzVHAoPQ31LWWyDaLe1kChB01ew0E7fG2uehjeOrgdf6nsnuqTtOAZIxfcnjOqpqRuuNZ0KnaMwlPcTuzicSQKtww/132",
+        "nick_name": "谭哓",
+        "remark_name": "贵州毕节市第一人民医院谭晓丽",
+        "user_name": "Tanxiao721209",
+        "wxid": "wxid_w3soylvtjjdo21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/z0aW143mjVftg30GrianpClG6vCUeDaV36QkDyru3lfvd7os31JYLJzzKjicX2QPFxrrcMn2DKLShUdT1ZY674RQ/132",
+        "nick_name": "Mandy🍒",
+        "remark_name": "刘铭",
+        "user_name": "maoxiaosi0908",
+        "wxid": "wxid_996jwclehs5i"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/01MbtB1Sic6LkKKUm8zW5ibzYs1XJjQeTP3dAqic5JpAW4kmD7RmFUzwJJ4oxkreyNlr3YDTajGUPB1S01Nc6O1SDibibkM69JaG2umRNnH4gVxM/132",
+        "nick_name": "乔老师百合网",
+        "user_name": "bhbgd09",
+        "wxid": "wxid_avpjgcym7v5j22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/U4LuQcNuDk5xjsLc83mxf8EwcZTvDicllpjYY5O7UcfNicD6VKC4W4BPe2swR0kIc8o0MlS2Q1xfupJoJYfCiccU4hMrUxRcLMBoOukwN1rwME/132",
+        "nick_name": "木头",
+        "remark_name": "李国胜",
+        "user_name": "wx328672867",
+        "wxid": "wxid_xqyq3ooi9ey721"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/3nRiaSEGiaQMfw6jAHX47Pb4h0v53BcOPRAPIFW2N7WlKpacXW8UEPg0240zuoydajfCsayBYZ1OTiap6aRlfQ2wvMhWdrCWicpt6GHpLRQYtAk/132",
+        "nick_name": "'A001126返利小淘[全网返利最高]",
+        "user_name": "tb0463",
+        "wxid": "wxid_2apbj1zr1cci22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/CGJqxIa2GNd6UJbq3zpmW4QnUsjIoXLWclI7OWbZKDT37oH1d9ICJxDEpdfDeBpQvKiaQIlF9Ir7phyJqF6duJw/132",
+        "nick_name": "myl",
+        "user_name": "",
+        "wxid": "zhimo687033"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Xa4pgf11HSGlzBCGpYHXKbEVhyepYKgtsT9zxiamktLvPGAhL7sZGxTJdDr6NSzbMg1GFpPMx2ZK2RbcpClfjKyUmuWEcaSQtHUyeHCeIpc8/132",
+        "nick_name": "健康管理平台003",
+        "user_name": "andinggaoer",
+        "wxid": "wxid_y98nqpryum0d22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/LuOT6tzCpYe5eUtdIpTKpfTXL2Wltnwicgsuf2rrGmm2c2HP0A6wKr33XDoNm3ciaqyMcnJPyboB3qboveVT3gBA/132",
+        "nick_name": "L",
+        "remark_name": "刘嘉新",
+        "user_name": "JhosonBaBy",
+        "wxid": "liupanzgwj"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ZRN2mRSr2RwV0Qu6TUp0dwZLaP764kXTFCWkB4LQxQAhjClg6RPPvlRmwicDUFmMxNVmia01N8aZpeQf4LcdyYyVibqeIPHLckpGzgxRbiadFdg/132",
+        "nick_name": "小兽 公主购邀请码 10194090",
+        "user_name": "XS17326416778",
+        "wxid": "wxid_wy8ijpvsv4ta22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/0pzEUyE0uHFFa1wewmdtawpRymMqJDsib6OVf9wFrTHW3GxI5DiaUuvZVNH5eEZzsOgEARa2mtmboRrjXBJFzTruUK3UGY0sC2tzlvY73VVzA/132",
+        "nick_name": "风中百合",
+        "remark_name": "马王堆医院护士长马颂东",
+        "user_name": "fzbh19980411",
+        "wxid": "wxid_j5rfybashzbp22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/yp0BPsw165Riaibibl3qcOicAib7luByb5Fs5uDshdzxteePNOnsEC3Jicp9NCW74FYw5FFJjdWgFcuM776kuCZL0T014vXT3xI7kITsGUVRLeIL4/132",
+        "nick_name": "繁星",
+        "remark_name": "迈瑞河北分公司人事徐萍",
+        "user_name": "",
+        "wxid": "wxid_aw2bhhaeg8nu21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Afqzw9Jac0UbwR08LibLbflKclYmZiageHUJicmB8N28N2wuqwtFAUZ5r8vLPcBiamHOQnoOyZrsicOX1Oxk38VzlYLlYtgOx83xH8EWl6Yl7DhQ/132",
+        "nick_name": "Zenith",
+        "user_name": "",
+        "wxid": "zhangysxf"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Gu0CEVeOUdGK9sSPUAib0ia5QTictErUjJUEZdc0bwrfr6JXjr9s2AnKEucY3ibuQxvg5aAj4VYLtPs7LFkDzMR5tF2MG3w5YN5VSRkP9YumtDI/132",
+        "nick_name": "水中花",
+        "remark_name": "福鼎妇幼卓老师",
+        "user_name": "",
+        "wxid": "wxid_k17hh7dke1x821"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/NJqoTZdPUAlAMzBS49elQQuIY3oMO1xOyDCdlpojLNGfcHzPTPMv4fz71JicLC1wOicEx6Eo3oLoEh7iciaQRKxKPDalBrk1C9atPAQGEEANfts/132",
+        "nick_name": "刘阳域",
+        "remark_name": "长沙雨花区雨花亭社区刘小庆",
+        "user_name": "woodylhc",
+        "wxid": "wxid_o67lkxacys8e21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ZFmxaopHxUg76GUicCCOqvl5TCghknnkjeibHVhVApr8lW7ZiaDUhS56udWFIYc7nJFOMvbJKfM0FicDUUGtUIrelQ/132",
+        "nick_name": "翁开红",
+        "remark_name": "光泽县医院儿科翁开红",
+        "user_name": "",
+        "wxid": "wxid_f1hrqz2o5nju22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gowpxs4Uo9icuehaHJfrmHXXNrfic4qGiaAaWovKyfl4c706py6vn4LInbF5cRBJybaKx5QrQnJHK6QGSGlmib9VDm5UenXvmQheWav57RHFS28/132",
+        "nick_name": "汪建华",
+        "user_name": "qq_34121310",
+        "wxid": "qq_834121310"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ufd1Lu7icDhIrZ3K0sRdANMHNAn3PmLJP1990phlTIicBRfPp6lgND54BpQkx8ibccTQ8MW0qWNS4WsQJaY3JEmjFP3iayPwMiaLTMvFMu4FzaCc/132",
+        "nick_name": "小闺爱小蜜",
+        "remark_name": "上海浦东公利医院",
+        "user_name": "qq758308954",
+        "wxid": "wxid_fk12xir3yx1g"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ze2hgw7QlUQPj29mclAapWa0nDl1PHRRQOadZ3cm2qUDtouNsZ4KfWllqs5tQPA7Btxe5qGDnZh8iapW0vsQmoJkQW7h0fksH5DInIPS94KI/132",
+        "nick_name": "大猫",
+        "user_name": "",
+        "wxid": "wxid_9mbj61gy2xw121"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/0VoxDSwj00f6w0XvVQzFGEj6XM3lRo6CWWZPCAQiaFTVcUrfmZm2ZfIODm87juX8xt23M0hN4Dcf1iaqTWicwyef5NiaNicPd8mQAQUTibMXw3GJA/132",
+        "nick_name": "VG 张浩",
+        "user_name": "zhedongluofu",
+        "wxid": "wxid_my3q802a86sb12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SyOATvHSKw18ZDS1PicqMOnJhg71vgUxJoxfyFQF8ib9ypIcars8HPApSsg3U6Qc7OZCTnkz5ecswZ7atKp3WY8TcLwWe3ncSqGVUl8TXh0Rc/132",
+        "nick_name": "睦友医疗订货热线1张丹18833983668",
+        "user_name": "MYYLSH001",
+        "wxid": "wxid_jzijwqblli3y22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/HO3A1VLaXibfputb2DzkbdcUwxxC76Hbs97YTApWViaWOpCr2B48ez5RM3qeUiaE48TRBVj3lsRXEXtrD5porkgZA/132",
+        "nick_name": "蛇盘兔",
+        "remark_name": "迈瑞临床徐丽",
+        "user_name": "",
+        "wxid": "shepantu-xs"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/OeibN5fjT17Io8vibbgyjoDLSPamZ5m7ianUDF3YzjdlTEHicAS1ZEIY3tliaPx1DVLMFHs7hb6AjyFyOlxh1nun7fLyNibyh8x6U3l4XoTEc9zrQ/132",
+        "nick_name": "秦伟广",
+        "user_name": "",
+        "wxid": "qwg399193166"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/JLbvyZMibaWsxOG4ibEdQCpWe3NCczK1SCcwo2MIqlbicSfUj9UnYl8fEz5vOEwibUIcEgBVzialeeM1BzwTiaGxEYHg/132",
+        "nick_name": "深石拼车良15131895614",
+        "user_name": "guotian521521",
+        "wxid": "wxid_r3qwb4hwjquj21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/vklicBU3ZZw9uadVhZSon1Zzia2xbBc8BfNc9L3gFl8YRQy7TezibTXveOibII4ia7yHodRcSfOFdf8zcsfeNR5cZyCsibuHajuYurLC1cZrNoHUE/132",
+        "nick_name": "于是,就",
+        "remark_name": "于兴培",
+        "user_name": "yu13896036521",
+        "wxid": "wxid_uxt2gwosh59k22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/fFgUJknhibCze5a1JVtsFScgNUeo63icES8wQekM6dXyP0ErHpjiac0EA/132",
+        "nick_name": "章含欣",
+        "user_name": "Frank_Zhang_KFBS",
+        "wxid": "wxid_1928629286021"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/BdaKibAbsQKBoCR0KSQoP1OowicKD5aVZvrXu3JQeawHks4oibicyXDKhcwuJUibFyKmbDJpSHib5mPdWFL04rp0h5Ow/132",
+        "nick_name": "biubiu",
+        "remark_name": "喜高柳海平",
+        "user_name": "sweet-milk6",
+        "wxid": "cuiliuliu"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/poBno0iagrNqzsKrdHxXc1EnBMiaiaRoQt9MEOekvHr1qxt6iaZJScWQ1icM8dicIeTKgQdeaE9jYWjQAjcVCR6lHKxjEaoIYsSOGic08kUB3u3rQs/132",
+        "nick_name": "腿儿腿儿",
+        "remark_name": "王建伟",
+        "user_name": "jian1422248791",
+        "wxid": "wxid_kb79x6b2vv2i22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ShIKDvv3aSaKzLa9c4mSpQLoanOCzqqqZfgbBCpkbBPwuI7gQB56j9s08vE2MDI0a1HIwM6YgiaHsibSEibaGjgdbYibGfX3feQo3q4iaZKtjvs4/132",
+        "nick_name": "桃子enjoy🍒",
+        "user_name": "wangxinhuan0206",
+        "wxid": "wxid_5939259394612"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/psJRvjyWn59ib3bZhf2nJ3l6iaSEbO3QjDb2ibO1u0ClicjtE15byIaTtjKqLr4TWJ8gOpAUsbDKTWFPxHx8vTjTYeQLu6hTYABIcpRe0MicZnMc/132",
+        "nick_name": "王萍丽",
+        "user_name": "pingliapple12",
+        "wxid": "wxid_t1wetho9evr822"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/VSXQnibibJ9uB51pCaM7aXZvfv1OJNQeJchXLicIHuftgNCNtaibSIQjmz8cmEenc8RNzlRvXElQkdl7zsVhicHkstq5rNvMUoozyMP8uBpR4dcM/132",
+        "nick_name": "董滨",
+        "user_name": "q67118503",
+        "wxid": "wxid_k07a13eleksh11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/14wbAp4Fhu1R1sFH6GuwKwUBXL5xEsh8ibspwEFQ7G9QWWxLAk7ttBhSaicEWQKliaibChQXVcW8KXmicfA7DiaYLveK1C0XaB4IS7xY291FsFoo4/132",
+        "nick_name": "张杰",
+        "user_name": "langxingtianxia44",
+        "wxid": "wxid_qkvn6e6cwxag11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ef1wTgdIiamNSTIQDAvhibaTriavUYmtqY7gibm9ibia7CjPYwI6To62S2TANBUcdRdkVnTOLvNywRm5D0Lrs7Zdh5bl78uxeW0PqJ23BreibQ50qg/132",
+        "nick_name": "张春龙",
+        "remark_name": "迈瑞放射张春龙",
+        "user_name": "linglong0319",
+        "wxid": "wxid_jz0xb03ynp9k21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/91PmjrrEccqxGYX6LK1cvDVjDpWooqjJnWsfT3iaSxzchYe6SAdTSNiadtn1bQcPibjqobeibrS6Ooru0pseFCTzcBTKmNcnpcFDibxia2erT8Uv0/132",
+        "nick_name": "阿因•Isis",
+        "remark_name": "睿宝阿因•Isis",
+        "user_name": "Own1313",
+        "wxid": "wxid_suewkt81xysu31"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/rXtEaC8ZA6FVEBAicptA9hIbibejQxPGXgQTbDIsYxicU7IhGMHF7rRbXiaBMWGXXcNr6GicNRiaqo3MsvoGCLQ0ugWA/132",
+        "nick_name": "RenauLt",
+        "remark_name": "迈瑞监护任乐",
+        "user_name": "waitRSY",
+        "wxid": "linchan_43"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Piciba1NGhricyQ3fv54wc0UtYQwVF98y5qPYhbViaZ8ObRJvdLHTVALTAvIGpZlQKnQVyQA8BDCiabwU2417xKCK1A/132",
+        "nick_name": "。",
+        "user_name": "",
+        "wxid": "a23534455"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Qg6NibB58OAsic0GCkrztk3SickTGGEibxu0nvYn86ZoTlWQgZfUTdHHwW1xyxBLrXFPaibM6032z0g25KdMtlI4EbjfH5MZBAhFccIdE4rnuvibw/132",
+        "nick_name": "Janet😊",
+        "remark_name": "Janet猎头",
+        "user_name": "C2janetli",
+        "wxid": "wxid_fm8zagub53n522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/k3RJLochn6pP68VTnW1EAlDlP7wdicB0ZOUuen9ic9icq4F0Fsngw2tmJbKKIcxwtlzsGPD0V52CJas2s26x45qUIOtbiap6tgicmaicbg9dibAnVo/132",
+        "nick_name": "Jly",
+        "remark_name": "省中医院贾主任",
+        "user_name": "",
+        "wxid": "wxid_8rk928txoxjt22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/A7FVJTOiagteXbKqysEMvVQfvjc89xicLicLuLiaias2hiblCvKSwUJlSUGfCGzftyq6MaHhY1oBK6wniav7MML3csjcZkNzziaOnou67bE9HgAjGSA/132",
+        "nick_name": "黄潇15032186963",
+        "user_name": "",
+        "wxid": "xiao100227"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8ro2nVmpOA0RUWRM2m1fluBkQ6icodpJNGQQKliayMrzFP21AFS3dQyUbh3dkm5wQHBwKPZ9GtdS3ksbTuoBheOL49tYniaaKTT8mAiabQzsLk4/132",
+        "nick_name": "月亮山",
+        "remark_name": "重庆南川区妇幼鲜光洁",
+        "user_name": "",
+        "wxid": "wxid_9eoniuu3z04u22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/mmW0wMia7fE6jub8l5ia2QKMRqvXIMaDyX7fm4Tef92yN0sL5OdGOiciccw6ibPMMAxCtvlyCnddsw5KrCFuY3ia6RZUDEn8wNhIrdkYic1ia5umCdE/132",
+        "nick_name": "Pansy Qiu",
+        "user_name": "",
+        "wxid": "pansy_qxm"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/xFuLKEYNbn2ZALC0gWVhSLeBbubibmwsu1nKrAc7FbicR1T7Uy2MMSic8rjNSlFcYIxFyPZAew6obQ0HKbS9GDktFBRQDmRM6ds1p6nL67JRpY/132",
+        "nick_name": "黄医生",
+        "remark_name": "泉州妇幼黄医生",
+        "user_name": "",
+        "wxid": "wxid_o3v3hx8g4f3o21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/AATxKt01jGBlaV52UFuATwzjjQtWkKHrtmScOAC8ckrE9HzXZPgLAwVC4KthSiaLsnU7knp4bmB14TZCibAFPdHn5wAXBxPV6Ld3D39Sv1rCA/132",
+        "nick_name": "自然醒",
+        "remark_name": "陈飞",
+        "user_name": "f738177928",
+        "wxid": "wxid_uyt057twu0r522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/YUnibAXW96vKAgMrYnOsJSPkvj9G7byoicyiaMicQZUjt7aBh1qEiblRHpMVCHUANvzJR9pH84YV3l0KXjkLmxlsSToApXAVxvFBegSpexJeYCaw/132",
+        "nick_name": "程真华",
+        "remark_name": "鹰潭妇幼程真华",
+        "user_name": "",
+        "wxid": "wxid_1xl591kwchxe22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7OhkTuFd3Pe31icA01putIrakia1hG7NOvibcaFcT1pKqpA8iapRm02jL8Wwib7eRFOBRhRXBic9FIXyq1XWfonpPNTiaLKDM1VicYictBvQvn3Uez0g/132",
+        "nick_name": "面向大海",
+        "remark_name": "广东东营谢岗卫生院叶老师",
+        "user_name": "",
+        "wxid": "wxid_m10lxrzs6lio12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ITqxgOicicDG7FSo2QIIYUjKBWQEiaZiamVtt5iaXdc42p6pzbYNY1Tu49vXbKwia12MIibiblWnROLRq0PhTpEwRAdgNcoAJo3k29KEusVwb1wjkicU/132",
+        "nick_name": "一切",
+        "remark_name": "漳州市妇幼刘文煌",
+        "user_name": "lyw73961",
+        "wxid": "wxid_k5o9goldqvsh22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/09k3jeUQOR8T91gLTqymQ7YTMbOaOVFCMJAn1jHoJmPnpGMgGHIrz92bw1L708ibDhCXmOvcGLYG9CgU6LnsokjTCWBLpvXmaaJ6ocIW7yEM/132",
+        "nick_name": "Englishlong",
+        "remark_name": "宜春浙赣友好医院龙主任",
+        "user_name": "L13576577080",
+        "wxid": "wxid_sz6cpgpqtbcs22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/W5PVmtCkeRBibsCvqPUSgXYNwaKvfcfzueuEpqDuJpao258zBc3khj7XSVr3lZ5lZHQ9icPfWbOWwibCgQR5BYapPOlHqeUbsoVWxFOIf7Cvkw/132",
+        "nick_name": "文大夫",
+        "remark_name": "龙川县人民文主任",
+        "user_name": "g13825338555",
+        "wxid": "wxid_c5z1tpv2hkqs22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/XLfP9kiaQ0UISVdiaVZNrwVBsu89zMibgPrwE5rXupGxlUcHoiaVvAEXQ1jvty5dVZiccq9dmoVqRC6peLHZWibm8pZUa8gNSynX1aaiaoabGTibcPY/132",
+        "nick_name": "娜",
+        "remark_name": "大田妇幼杨林娜",
+        "user_name": "yln941275340",
+        "wxid": "wxid_bj6ryksg690x11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/KVe375muKczbRx9Z0F3O6wHl7NBJ16vQzd7VHSgS9Abdul2bWXnFNdxzq5zAe5HvmPJVQnsCwKBw11AzRbNibVmNMQKKL6gRwfB4BbONXbXM/132",
+        "nick_name": "学无止境",
+        "user_name": "chx1033036880",
+        "wxid": "wxid_njf2ti9u5wkc12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/bxNqM1Fm8s76CdL4UicxqBfVFVxIxOVBXJsb2L2HpqR6d1gGdOiavFes6zPNpWqlsvBm5kca14yYmrwmaTAqaHqo9lppVxafU3LzkNv3DhEHc/132",
+        "nick_name": "波",
+        "remark_name": "闵行区妇幼保健院刘波信息科",
+        "user_name": "",
+        "wxid": "kittybobosama"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/pNp1eONHgTnW3VFFbSyIFatHjZCNicrjicUOnnDyibpo8WWgd6FGP7hAKWJxib7MUxdewX9ncXZ2fCH7VgT2ZN0SibUj6FwbtriaIaHAN7qIRfluc/132",
+        "nick_name": "宜",
+        "remark_name": "广州越秀区妇幼林主任",
+        "user_name": "",
+        "wxid": "wxid_qeu3qwb9337s21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/B5eg0jia6f59JMx1IYMUOcia3FZmIc817M3s4bqC4mpyako847AicSZZpxuw65BCzibIlTFauh3eCgEA4icgia6wMGr0numkicSjOKvDxjk1wbyO5c/132",
+        "nick_name": "张继敏 V",
+        "user_name": "Keibinn",
+        "wxid": "cct-xian"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gicBRZOKxRRH6Dn0TLYrrrK70ibeP7QFoRXHbIxrdBJIlIzW0838MRzdmKwicAVL4icmHMVKzaiamtiaBnPBqOQ41WhsOlT6lic66LMIFIWXl3bRibE/132",
+        "nick_name": "杨晓宁",
+        "remark_name": "恒晨源-杨晓宁",
+        "user_name": "yangxiaoning9728",
+        "wxid": "wxid_i7fiyrvp351g22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jOXBCEbibNQbibjJ2gRHyyeBVogEaA8OnzgklgLZSicJfEwIeMoxPxC2lkSM6wK4OfFP5G9fJicuJdibs0d1EsFMxO7cScL9NmmiaIPxCodyVEmvc/132",
+        "nick_name": "消防班主任-邓老师",
+        "user_name": "DLW220",
+        "wxid": "wxid_cpvcy910fkaq22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/UicEkTuhkt54BYXeqp0No6icMGug4BTUicEZdLP8snKoY5IYVIHXRtDqwic5qYevDAP7fafKFDrJNicZGcz9Lbs5HsA/132",
+        "nick_name": "Doctor.Tang",
+        "remark_name": "重庆巴南区人民医院汤主任",
+        "user_name": "cqumstl",
+        "wxid": "wxid_xuww5bd4rloh21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/xnMEngO4B8NXP1z0Z48ZZRLxg7gjYpdBtpIF2UMElAicYqA900o1BNL9zdicc36aGwiasPevruskP7GQ5eUw2lcBKOhUic98DayStTicb42R7KBA/132",
+        "nick_name": "Vinson 辉",
+        "user_name": "",
+        "wxid": "VinsonWang001"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/g3YEUabSEIUCT8Manfibfg8obRmRyeibao0krZ22iaByxlSPmtMllZeoJ1Yv8fibkVtV6mm2iaZt5zlnJF2YfIuxojou0FInibYCySu0BOicjYD8lE/132",
+        "nick_name": "小二",
+        "user_name": "",
+        "wxid": "wxid_au4osxsdz5aq22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/STazsM39NicWnGfvCVS9LasUlTscBvicyuhWlic9q96RzVPdnsBeAjI05ZXApHMnFgzvgUHq61jl0GBOsx3N7zckfmS0jIXW852DQgvhuS1kxI/132",
+        "nick_name": "落花有情",
+        "remark_name": "重庆北碚区妇幼刘珊",
+        "user_name": "ls1062554045",
+        "wxid": "wxid_pf0imds4gz9x22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/AicsqKwhNgaG7HprRpELgqicJTdm2RdMLmR5hIWrCicvL2uz7JQ9qDCDnqcaFV3xXzYFfYjdEGX2SCZdiawlCx4C18ricwibXVKOpq8YQvo3a6agc/132",
+        "nick_name": "蔡蔡",
+        "remark_name": "蔡蔡长沙市妇幼",
+        "user_name": "cc978093161",
+        "wxid": "wjy52013142314"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/OYiccvd1Wicg5nsvibPm7ICdiapicc1dJuz7jSo2epO4k2zgLDL5lfhc3wibLib1jp4RcVvYE3urKDpklovLw7nHFnJpqSiaLibEwCq5DBOSCsiaFUteY/132",
+        "nick_name": "娟子(新邦医疗)18507360122",
+        "user_name": "",
+        "wxid": "wanglijuan9995"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/oPicWrbia4LFtOVhcBMnQGlTKay8mvKXf47ePOmKcut7aFTS5QDXticzZaRN7JnHQCkEThzSqCnniaTUKBp2m5ySN2XibtRSechOzQQSGOgozBvE/132",
+        "nick_name": "刘巧",
+        "remark_name": "湘阴县人民儿保刘巧",
+        "user_name": "liuqiao8810",
+        "wxid": "wxid_3gyizr6bi9xh21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/9jib0nWpWIwDltYPB808DPoQRM26amZkD11NnIt2P4ddlCBg3gicdHicAc2Nmia51rf46B49LlVOhm2p0Ijne4k6lQ/132",
+        "nick_name": "Amy 朱烨婷",
+        "remark_name": "睿宝儿科Amy 朱烨婷",
+        "user_name": "",
+        "wxid": "jpran19881115"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/VfnpVHMeeMxGIqLZhFvjKnLyoJ3MUnAe09tPeSmQ3tfbOialPNR1ecHUuhZpHW4UvqKPYBGm2PEhykklLgf27Ptnj8JxmFCQSg6GdeXWjQ2E/132",
+        "nick_name": "YES.W",
+        "remark_name": "金赛酉阳人民陈永旺",
+        "user_name": "",
+        "wxid": "ccyywww"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/uwqaAMS2CQ0TOv6jVkrlJBsa0dD7LWazaRnffV5CstjkbsxuCVckwg8JYou5Q5JPI82BnAC53af2NzKNib467LXbIH6QXkpFYzeJc4Wmld4A/132",
+        "nick_name": "陈春梅",
+        "remark_name": "靖安县医院陈春梅",
+        "user_name": "",
+        "wxid": "wxid_7wnwvtryb00a12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ibV4GAo0icADwccVLC5ku4hIcpVdKnHeNHCbmgeQZ9HyaqM7E4NNFsvgZ9ibR4TNHoeg2Rz4wh8Y46mVRuhHv6ZqmLCOSViagUkC7zIgtYWMItA/132",
+        "nick_name": "WPF",
+        "user_name": "Fang1993313-K",
+        "wxid": "wxid_ci5isuaxhn4d21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/NcPkOCb03bFRHxT5MdtOQ4ZFpTZuPz5S6GiaY1MCWceYRNPwNcjxecSEWiaO8q7uFrBNYZ1ay3mLlloqa8uKqXQyu22QEmlCNhL5iaRaIGjIIs/132",
+        "nick_name": "宝妈",
+        "remark_name": "省二东裘大夫",
+        "user_name": "",
+        "wxid": "wxid_ipy9gtcypcfd22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ftPv6fdFIfgq6yau8ibaBemWdNEWpGt7IeicdiaibjeYvMTB3tibHkYbe9oBmToibrIVenPv41MvAZhCMiagdlW25U89ibJqsx0QEzSRCKL0wObUsXA/132",
+        "nick_name": "区医院王医生",
+        "user_name": "s13011620021",
+        "wxid": "wxid_rah8kxs79io412"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/UmYX27iaqBcibgLUEXhUkx8uQr1x1IGy3ibkpCibrKQQaCLibufcmuwNoLG0mtEqOOaPLukNJU9sOO9w4DkdEjT1Tiaw/132",
+        "nick_name": "红尘",
+        "user_name": "",
+        "wxid": "wxid_ckcs7e36r9cs22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7HO0W40dg19V6Cv8pCibFibNKW7dEZgwxBxYRhjKB15QExqBlpLnxpoIktM4kBYvicjOeNoJpWc2L4xH7A5IUYFtKIibCnj9BKdZne77G3bygEM/132",
+        "nick_name": "李强男",
+        "remark_name": "李强男楼区妇幼",
+        "user_name": "lqn13973009228",
+        "wxid": "wxid_bw14r5tugc3e12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jvmPZmYQWeWicAHFqCbPY0P9Km6OlqORyxdvS9jKAiaBPvzv70sAQ3wvswlJqicnAGGyavKnC2HlBjltyDSwrQHkiayqiaOlk2zmW9gnMPibRTgoY/132",
+        "nick_name": "老鷹",
+        "remark_name": "龙岩新罗区妇幼谢建英",
+        "user_name": "",
+        "wxid": "wxid_gxdvk9149gr522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/yoyRwx9bNwaHXnmFiaicP9Q4JsWrQHbLsgUydmlzeWGNbDZ6buEXdjynkYlbptXZmbP328wlVQnpawo0LgNjWQCA/132",
+        "nick_name": "杨辉",
+        "user_name": "",
+        "wxid": "sement"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/JuYkHX8iceQ47Hpc01WbJHu57PTWRjsNiao9xnlCL3PgHbG8p8P5HfBphjsF89LfMKXqbXjNaOXDDqsxTRTIrTEU848Uuc94KyvErLaGEXUr8/132",
+        "nick_name": "雅妍",
+        "user_name": "ch555898",
+        "wxid": "wxid_aob9jnd2m4ya22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8FQA20QGytMHJ4zUufibEcMXuYaeMepzU9myn7LOqSsNb04ia37Ria5mibdjuwBQuFzhaW5DxyIcg6LjYDcib8ldppQ/132",
+        "nick_name": "丰光庆",
+        "remark_name": "上饶县医院丰光庆",
+        "user_name": "music9591981",
+        "wxid": "wxid_3778227776012"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/0kKzGWoYlaEl5kaLxo9f30FVWPTPV8NPBXJymakIN0mjAjVux15Ze4vicvbA2ERhx4Vqum806jic1wxibd62Qt0ibYiazuFkVVia4iafEpibdThgyhY/132",
+        "nick_name": "伍艾橙橙",
+        "remark_name": "顺昌妇幼林主任",
+        "user_name": "lc15105099309",
+        "wxid": "wxid_s1bm28o06nvc21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/QI1yKOWF4n0T58w6TxJUMnU0BwX8E0DTV6ia2UlutxRYG6gU7r0kl5qGsEj17154M5t2yjqUOWwuQVic0DeX4Mt08ZrdZBPFxg08gKRibhdEXk/132",
+        "nick_name": "刘倩",
+        "remark_name": "硕氏医疗超声模拟刘倩",
+        "user_name": "shaliliu",
+        "wxid": "wxid_9r7xo1g2q8eu21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/PEhx0iaeX409MvCscGfGpxcJHKFv6VAN8YfYiaON9oBmjzpRsPcX2Kzt8p3ezsOHYREquTUeKOVG544yNOCqOvp2c1ynCckeBj4djCRdsNe48/132",
+        "nick_name": "那么",
+        "remark_name": "张纳",
+        "user_name": "znndzlp",
+        "wxid": "wxid_6ci9v3z8aicl21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/UxL5sJ0NrZQR6T7KTdicw1xJPKYz6vUic4L1oicNjibMtrvjX0UoqzZRctQgkD25PBlDPRFG0QlRQWZhJDVhexdjdIbkFibMPH1pibJJ0b61YL81E/132",
+        "nick_name": "马世广",
+        "remark_name": "顺风小哥马世",
+        "user_name": "m01118758",
+        "wxid": "wxid_qv0nu2s49yg921"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/VsOw4J4pyXhoF79DI6hY70ib60lIAN5U2ngELAiaWXz48I0m5M9SNpjU7YPQ41SUJYDPEzhFibTwtbld4qE6TbbyAg82kKfgIazvLhX7afUQbw/132",
+        "nick_name": "心有所属",
+        "user_name": "c13970506559",
+        "wxid": "wxid_l8jw9wtd1rt322"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gbVVrpYknfOTickU5icSfYGE3UDQsBP1LOyqCzk2NYlEBgfG9kLcuBkS3roo4wkicoGzp5nGTRcorkb0j9ic1BC0tAhUu7HP7U9Cl3Y43ib8ibIAc/132",
+        "nick_name": "高艳红",
+        "user_name": "",
+        "wxid": "wxid_aall6dxip8a321"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/mtEWhRvE7j1zia4BiaWMpO5gZkOTNwAicUHNNBQ1y5BG1MNictdZTsYH9z5jAKibD0CIdBtXniaPkx9XTibuAeQwaYwkmHHKkdu9KkcToxhibjOibMhg/132",
+        "nick_name": "汤医生",
+        "remark_name": "天津妇儿汤医生",
+        "user_name": "Tang_zheying",
+        "wxid": "wxid_ng2zxmex19wy22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ZLPDpAbypKaGpPU9nC7gQbnOyB7TYTU3Yryv7lnRZHpnzbBZKv58F1xDdTQpFzqcP7wZj58LBMo8r2t5gcquXbegrIO3q6xwibQa2Fdo0BAk/132",
+        "nick_name": "^ - ^",
+        "user_name": "",
+        "wxid": "libaihenxian"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/hbReDb89AG9hGGFwQSlNACEKYvUdvRmrLlmeQLXgHvHw7wSolqz6UDrarlkGgrMFfQLnicSgrEw1b6DoRIHoa1ia2e0vkZnuqqHd7Wwb20ll8/132",
+        "nick_name": "高洁",
+        "user_name": "",
+        "wxid": "j943679308"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/yoFCtK4OFdYnrbEhWf8btbd8QDc9SrYuPicsGglg3ibaQict6nB4cnavHYc4r7GojYX9oe6BzZkibpoKtA3p58Bv38VO4EPJ1icKpFcSZK2BHc0c/132",
+        "nick_name": "*   A深圳花荣🌈满人+9553094",
+        "user_name": "Lil4666",
+        "wxid": "wxid_eubj8vigmhgp12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2HNdsh5N9E4dZFbqtpm5NgzPkILiccNncryYb5S0nTEZLibgAicXUKr1b43pQaGYCBCIrZAeJ1OicFvJ8KVHYyYHjaQsF6cict50OCzxicH1FyLDs/132",
+        "nick_name": "七个季节",
+        "remark_name": "硕和杨经理",
+        "user_name": "",
+        "wxid": "qigejijie"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ZtblZcWDR4QoVyCDIvOUUJDOW8OLW8sARkyE6RnbIvC7xJvX0icRcyQRFv7z9N8bDTDjgIJvvemTHqXlicxgicv7ia43iajDpMDBXtZaYutNgwLE/132",
+        "nick_name": "张霞",
+        "remark_name": "贵阳钢厂职工医院张霞",
+        "user_name": "",
+        "wxid": "wxid_r6c9j6nyuw2v22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Jiava7YhRPSjCjH01P8VTSTQ3diblS17ADhk9pqHrgN9qibcYW6OCUmk8jInxmgiaaiaHb6W4eg8qdmia0IHwZnfOzqw4icjQUgnau4ADyIucb4Xc8/132",
+        "nick_name": "晶晶",
+        "remark_name": "宁德市医院王晶晶",
+        "user_name": "",
+        "wxid": "wxid_25ivlotyl5vm21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/GtQ22x8pxhKic9aETf4zmY3RHic3JOPVr7VicatyQQqnCmzaejf8Rw4ibjViakYGzu4uhWdz741iaic5tkfwxDYGujLdsUEQetQjZq0GicmJoPR68TA/132",
+        "nick_name": "玮玮原创设计",
+        "user_name": "",
+        "wxid": "wxid_9jm0qn4j66ye12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/lfc2vX4O3Oezb0T39CNNWYP3lEHOv3dAXzyLPDNj2m9IApPHLRdPKzPypiaEdicrMut7mnTicRtMfgoGgxWsXADs7Ptx9HW49cbdJQYwmpEZVs/132",
+        "nick_name": "梦落星晨",
+        "remark_name": "迈瑞临床胡亚洲",
+        "user_name": "hmasia707",
+        "wxid": "wxid_t96vihptm6o721"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gJ7zOfASNxnsdtyr9VdjUaqmyqqCd56lwKgjoPB4nwyic3eqkKqR2GhIUicuR2kn3bAMQbdSdicJbRY309ib2bia9xmQUxQyZXFfBxJicN7RE6TGg/132",
+        "nick_name": "巨鲨医疗HR",
+        "remark_name": "您好!我是巨鲨医疗HR",
+        "user_name": "jushazhaopin",
+        "wxid": "wxid_jikw0kfbkap322"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ficQEOus2VumT7IJkfESfS4aPZZFrMiciaKdcPbfa0yf8etg5NmIJibVaAbmZic8BGubCHic1qQCURyvBlrKuFFrGicorVNcE18olRRxEMsPicorJIg/132",
+        "nick_name": "Ritchie Li",
+        "remark_name": "Ritchie Li猎头",
+        "user_name": "stephen199541",
+        "wxid": "wxid_da3wk9oho0s812"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ibhMT2u6KxUwmViat3iceKuxUdpQOoDcnpa4IDeHwMBHEFuibLzjSO2LLqqpVY166zIEqdj7hbpb5yLiaiaPbZc2kxHbCTNt2uRcw1icxBAMDsgBYM/132",
+        "nick_name": "liumingqing",
+        "remark_name": "长妇幼卫宁厂家刘明清",
+        "user_name": "Liumingqing198703",
+        "wxid": "wxid_z2s4sc20pnfg12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/lkHYQhPhfBOohVpXIWfgJW4r5ARWId7hC7WsMMeg5ux3GMib79E1EcslmZWSSUC9zicK5tW6ZxVHsmemSUlTqhibA/132",
+        "nick_name": "凯龙",
+        "remark_name": "邯郸市第一医院孟凯龙",
+        "user_name": "",
+        "wxid": "wxid_2k55j44jel5w22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ryjG33VnW0Ddrvn33CyukQESErq1OFicCvSyMDNCnYBg76Giag01aUx9AyLT4Zyj5Rib04REOmibY40picVjv5WPm59vW7R9z1vtk3uIbWj7WEbg/132",
+        "nick_name": "666",
+        "remark_name": "耿少朋",
+        "user_name": "g291330093",
+        "wxid": "gengshaopeng002"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Wv7ojo3lSILNMqibNNbLUkCDl7h4OrovuCMAunmnrXvf043vtZysqEn5FdBmk8ZGJJh59STNY2pEULtfx6KtqmKgRNJznJSsZ7icEoCWAWSP0/132",
+        "nick_name": "悠悠_指引导师(联系Q:511369029)",
+        "user_name": "PMY121302",
+        "wxid": "wxid_dukdk53w48h522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/u7ibjDU7geI2bC2zf0sxRWuHHzurc8ZNL97rjlMDIjpeyMXLY4nU58yu4IWyHh0lbtF4tA6tvay4gRv0nDpKeA0uVRFticibB9XY1icNR5Aib2n0/132",
+        "nick_name": "Y卐Q",
+        "user_name": "",
+        "wxid": "shenfeng0217"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/cK7gkRhAovQbTJsC4rSUtJSxyHjA7LykC1ZygMZibGIiagqgpSqib55679Q5SY1MibAicibomotm3AbSw7WzibmsbiaYeXp1ia82kbI8bbPHAwo4K204/132",
+        "nick_name": "fighting!😌",
+        "remark_name": "诺亚孙超",
+        "user_name": "",
+        "wxid": "chao977812328"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2RgnNZia1mqmRTrKVCR83DAVeO5V0MSnl5YWjclEF2FeK9KIyejjjjAm9Po7mJrTW8oZcb0tMW3owtCBZfBiaicTbtzX2c3iahCfyWE1qjxqY0s/132",
+        "nick_name": "睦友陈婷内勤18833983510",
+        "user_name": "",
+        "wxid": "wxid_5ya0k9g2odxe22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ibWGtZBccgUOcC1VQEIicDibv6Xjtdc2fsyE2U1DJs0XdNEvCEV2vO9EmETKgFSm1204HOqmdxOQ8Vzm6F3WBia8MCTrP3SbHXSAcYjiaN7OowU8/132",
+        "nick_name": "王秀霞",
+        "user_name": "wangxiuxia868",
+        "wxid": "wxid_7cwok5s0k8s422"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/lWFJtBDns0bNuWyJTIyXYD1Vy8qqYxibHp7WOkn6vmfXdlGFr7ibCiaMibNia3u4ibC7qeqnDXK6Qwv41ibMtkW9APRqic4SJBDBswwuzjwHgG9yk3s/132",
+        "nick_name": "三水人民医院 李焕琼",
+        "user_name": "",
+        "wxid": "wxid_0s8ogudda79k22"
+    },
+    {
+        "head_img": "",
+        "nick_name": "SOULMATE",
+        "remark_name": "郭永策",
+        "user_name": "WlHGH123GD",
+        "wxid": "wxid_r1ytx3ylm43122"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iak11cY1kIiaib2EhIgicIQA5PmDjQa5OUzAibeaYy0ceib46DiccU4x1JPiaD9CRe9RDWG4HaZBOvRGm2fDaESNjzsbKDmfwqZxug2OesOjdCdgBgs/132",
+        "nick_name": "炳生",
+        "remark_name": "寿宁县妇幼叶炳生主任",
+        "user_name": "y15160198919",
+        "wxid": "wxid_bzowi922me7i22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/hZXnxpIkc5XYeicEfR3UMfNaJJtQ02afg68YBFP7CyC49FD6YBibukeZLibfOrxaYkcNjeKoQp8HXaCWGO2ICf8wI6s5M2DjlLxc3Z6PC59IyE/132",
+        "nick_name": "董焱",
+        "remark_name": "上海交大第九人民医院董焱",
+        "user_name": "dy18701901885",
+        "wxid": "wxid_oscjyvni2lzw12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/L08E0TIU38bXNP21HT7Uq8qJZW5IicUrAl32ozGiac6WepWXh84rsfrsFXicA5HOO8661eo3ogXHCibr4SPzOicFpnd0NlbdWviahO2QO9SrmldJo/132",
+        "nick_name": "Alisa",
+        "user_name": "abcd26733",
+        "wxid": "wxid_2pp080v34u8r21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7IOwyDs8oz2yPUnOqPezrRiaOzmqSrUA9m9TZCeKAyyKZNUOJnBA6DiaWXCxxrLicAwNS0Q39WCPJqdYA8Wzsv6FbgCXxtsxOlH9vDUuP0ibziaM/132",
+        "nick_name": "shelly",
+        "user_name": "",
+        "wxid": "wxid_gxdgts87ytfj22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/TSpibapC1b6eoNyOdbQFOoPawR0koZkq4miazMLTAq0lMrUrLias9WVoPthxTLeb5nBlMzPicaFXiaL67rHlicRWoGpg/132",
+        "nick_name": "张冬平",
+        "user_name": "",
+        "wxid": "fantasyzdp"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/OLpd0dibOWF8rUtrMB2HWLIiagpIww99vF9Z2J2npNmepN40JlcoMUSOacp2XpHr24YjJTMGabmatFIFYoWvAjCw/132",
+        "nick_name": "種華",
+        "user_name": "LXY18049506468",
+        "wxid": "wxid_tzvi2rkunpry21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/StJxBrNZ54Oavibs95npA8yrFMcqJGrTGxzwJhsPqMg1ibLoNOJP6PxXcYicqibuPiaXhiaPaibFLJvWV6FeUFDrKFPrQ/132",
+        "nick_name": "🐯Stephanie小霸王🐯",
+        "remark_name": "睿宝🐯Stephanie小霸王🐯",
+        "user_name": "stephanie911205",
+        "wxid": "stephanie9627"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/VdIRuouU6wTyiauibaqxKGRiaq3C8QJBPoNwdRtiaWdu3QBq06tPNX0A4FZe65JMLeESu6QYnQicC9Beag6xpX5BYCZUVOnRkvrs3LeGAV1h1zro/132",
+        "nick_name": "晨曦",
+        "remark_name": "岳阳楼区妇幼保健院刘老师",
+        "user_name": "",
+        "wxid": "wxid_ewomw7l8y57v22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iaMekdJl4yXUrnrbrYfp46CvAA6n7z7Rmwy0nqCJbs1JggPHlCBuEtOzR51bpicgRBH3tyH4nMzwTOp2tKhORiaNOcnEoM5j7Xaic1PNl3hI6Y8/132",
+        "nick_name": "晓马",
+        "remark_name": "古港中心卫生院马",
+        "user_name": "lwmxflwn",
+        "wxid": "wxid_jfvo0t6e7no21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/0EvLBZvnnibMjb6JFksqicYgtVlE50oOy4YXGoM86Q7GdJzYM7Bmx4K6SIibzQJbiamhBM39nL1h4P7IibLJLBKtnOtw6SaWibzEjrQdkhZM3ibpBw/132",
+        "nick_name": "々怀念青春",
+        "remark_name": "迈瑞超声主管刘晓刚",
+        "user_name": "",
+        "wxid": "xiaogang007liu"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Hg19LljtCstbG3pj5EOI9FZfI0FPFTTKUOgySp02Eoj04z5zkejam5ufs3zXgS2RJJIDYQZia6j0oNdUvESicgOzvytq1icB673enzKTEf7RFY/132",
+        "nick_name": "徐....",
+        "remark_name": "渝水区妇幼徐小丽",
+        "user_name": "",
+        "wxid": "xu4925967"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/lwsUbboBBNopY3epCRHUaZgN3LxTMJ0BtzNAAKbszmNnT12gfVjzCrpfD84rR3bXtGcAqnBAXyNN6rB1wPTlyjWKhic8trP0yu4NYHm1p6ibY/132",
+        "nick_name": "白小春",
+        "remark_name": "抚州市妇幼白小春",
+        "user_name": "",
+        "wxid": "bai393434836"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/o6GAiclQKyYGIobOTJ7btLHLt03EULDJXIWBnNdoB3glR8kTiaFKp13nwFrwlXibUX1D44OKAGXYtqDvkc43xZpDQ/132",
+        "nick_name": "黄跃华",
+        "remark_name": "湘潭市妇幼黄跃华",
+        "user_name": "",
+        "wxid": "hangyuehua3057"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/BonlXWOtQEnvywvq5SSW0CzZia0QVAthXsRRF3eDSRmr4FXGLnhHBDvPNGOxd2WhWDIAmxgOAhJ4NqvdQLEXuhglhnGc24VsSPG9OCJ6W0Jg/132",
+        "nick_name": "Tiffany",
+        "remark_name": "喜高仝芳芳",
+        "user_name": "",
+        "wxid": "wxid_15tjnw4ycjzd22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/DLia94wMUXicJGINYmEAKNiasAFPv47KFFGCgjsvMukPNialrEEcSQx6iaPia2oAdKP9HCsxkBuOCBBLciaZTaQjO959huqCDznFrWpgzQEQfwvbbs/132",
+        "nick_name": "小小兜",
+        "user_name": "ZH20120813",
+        "wxid": "wxid_nem6xggnqaek21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/lcC0XJvquU75gCTicWbS0geCtjAVgg4ttMOHGddQNxQaORr2ALibtJMml6ZwVAWlFJvuW7FGVfbTComNHtvlMUpjqkE5GPUEvCffRibBMKobfg/132",
+        "nick_name": "赵朋飞|欧派高端全屋定制",
+        "user_name": "ZPF97135331DW",
+        "wxid": "john97135331XIII"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/5yxnFDOc5pFZSBBdFCxxefXHiarbIicC9BTUJktKLqzsNVLxEkZKfDuKsgibByT9Y3PJG7qpcHJTmoD3W7TEXFX5XfG3pAfF8tyh2fHgLicGN1k/132",
+        "nick_name": "亩@阳光 桂林",
+        "remark_name": "于都县徐医生",
+        "user_name": "",
+        "wxid": "wxid_d0d28icduspm22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/uAib6ZVFvEZ3oxcBiakYm4HgmOGNCswwcAa0Lpe4zHK7mQSN0ZD5OotUib1jSHejGN87fibYcUERRpSP77LMsBoFk4ypZ4NJKgTcJoELCcusRLo/132",
+        "nick_name": "岁月静好",
+        "user_name": "svaboy",
+        "wxid": "wxid_xdkmsr1f6tl222"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/MXtQQyMibrmz55pBgPp2zcXyeMlyFU8NvKsrGjYFVgs7yTZfK2QhjhU6HiaweVCLbo2jvNibefkDPPrkDqc5pb9tH6wBhedsPdOKs4yLaHyycE/132",
+        "nick_name": "最初的梦想",
+        "remark_name": "漳州三院",
+        "user_name": "",
+        "wxid": "wxid_z6v1c6rahkek22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/EU8FWcKjrJJoEicYIfthJ64jul4UGONJRGMt5IfbiaYar9F71whicbYr7PotFFxQawR8ZibQEmQSF25IlpyeEL2NhA/132",
+        "nick_name": "庞海",
+        "user_name": "",
+        "wxid": "panghai918"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/9z36LTpAhEeqKRzxqhQcGaqcaOseibhVLDk6jQ8YxUPgfulzv7QsItuATapEiaibK2yV6ibLgJjdJR5okAoxq2xKCA/132",
+        "nick_name": "叶国祥",
+        "user_name": "",
+        "wxid": "yin571975"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/UwKUibMcDcMXPGqdEvHKCDepEQXJdbQulAQ3LdYLJ93jzQy6gZuAK551Mhf2DqThLW6r5lJfAE3TkDCufl7ib5lQ/132",
+        "nick_name": "ZYL",
+        "remark_name": "会昌人民周主任",
+        "user_name": "A13870779909",
+        "wxid": "wxid_5idaw8h95xx122"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/PuEMQ2J2wAyWfa1PN6hSEFOvBY6Vkcj1gl1Cjicr7zSNwy8icMguic4oFCcVEObwm6Qog13XUiamNg18zoLIcq3GgWBoe1WepFjvmUxXOAFMrdI/132",
+        "nick_name": "米兰",
+        "remark_name": "新疆医科大学第五附属医院高新",
+        "user_name": "XJG28698",
+        "wxid": "wxid_0bcj4o3zw86922"
+    },
+    {
+        "head_img": "",
+        "nick_name": "心静",
+        "remark_name": "龙岩第一医院儿科邱斌伟",
+        "user_name": "",
+        "wxid": "wxid_nytmt40k0k7v12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/nAhCscYuwUvLC5iaKcE1f8cqgZv2SJNoZTW97HDgYicqZbqNJrMAnXGuboO0qUcStoibdzAia2p3dEJk1fn5b3PIVuiby1tlazUWugLC9SDYkicIk/132",
+        "nick_name": "YFJ+零",
+        "remark_name": "杨凤娟",
+        "user_name": "YF123456Juan",
+        "wxid": "wxid_9969469694512"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/4e2cniaYDaHDiaP0uAJsdTacRibmSgiaqTcPqkDZm0f7w2KX0ibBiaU5FZVZTMaFw7o5yjRJLActK9koMMvRBia9VucMM79Y810wL2SOHkzfibVkhicI/132",
+        "nick_name": "小七",
+        "remark_name": "硕姐",
+        "user_name": "",
+        "wxid": "huang_shuo2011"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/o1ZDrOX7nD7WdU8f5gCUTk9ofgK6z2VvqbbQIhJxtD72BibrqtjrQPfCLfnFnfQPfzVltKf0h4cq8IWh14wpAX7Ey3Ek5Lmp5KhfveJ8qkicA/132",
+        "nick_name": "张丹",
+        "remark_name": "湘潭市妇幼保健院张丹",
+        "user_name": "",
+        "wxid": "wxid_u2pdny27qvri22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/sLIR1upjmJaeUeNWvcS2tXhTyZOUvoZhWNWyVorYsAd47mvc4vMlvyiaeNg21rolbrYT2nBMcbW4ia5HjX9eib6vvPUpDbRJcv785uTbDibI4cc/132",
+        "nick_name": "GLG",
+        "user_name": "Guo_Linggui",
+        "wxid": "teatea77"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/n1kDhtgZyNOSLk2mjoA6o450riccUkKqCkz14WrUnoNUcUGbfYDqGdNceNKWNJDP9g4Uo1sP5gD6pqGnnYYyrqoLeSqAt91SRflxNuLOSZ1c/132",
+        "nick_name": "许桦(aimee)",
+        "remark_name": "睿宝许桦(aimee)",
+        "user_name": "",
+        "wxid": "aimee0413"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/6h7cn0VnEpYW09Nvfbia9hE8yyU7G96vDgmF3UCUAqgc7nIglt3VZQ2dD4UM3uJyKfpKMFQPXvgRPBmLNMGSzX2rJzufZvpJxznc2ecdpahM/132",
+        "nick_name": "楠楠",
+        "user_name": "zyn13313213592",
+        "wxid": "wxid_pkvczpdglu8b21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/HUNbxOo7FGScmg5Y6AB2fGibcMJaZovL4GRRIzt2In2lKhZhtrkeZ4pdwHqZnhsVeurPKUq2icrq3MS50pNTlyyqqKDhcaia81ZcEpTzzRgD5o/132",
+        "nick_name": "浪子回头",
+        "user_name": "yangjiaao100",
+        "wxid": "wxid_itceimxa1lfj22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Q02d4c9uiaOia7tXp4LYqAWCYVuWpbk06ZViacw3Fiarpib28u095cdvHpunz2sh6fywhEJkQloseiaUiapGQNWwXdbvM5awFXKl6OHOuJwia4wCWSU/132",
+        "nick_name": "陈芳",
+        "remark_name": "陈芳省儿童神经内科",
+        "user_name": "",
+        "wxid": "cc895571"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Y43LuXUwZzfs0DnHGDL8lAyjdPTEibNSicpJD5Zzm6NaNGLCSA2xyhZfVnZnqU1xGuiapBJDFH4qpDOwAx0w1662Ij426u7pCz0QiabQA6qCviao/132",
+        "nick_name": "马里亚纳",
+        "remark_name": "永州第三人民张主任",
+        "user_name": "zgjatwy1314",
+        "wxid": "wxid_go17nucnqrq221"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8LoYxWnqhb2wEXaIJKibmK5SVrQCtgb2afyRiafT58THggswRvywgCErOiaYqo4h1XVkyGu6ic5yWcu4srs67EdwROehqO6pbDfEibpsHt3oHb7k/132",
+        "nick_name": "miya 陈",
+        "user_name": "chenxiaohua5555",
+        "wxid": "chen18955737960"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/e9HMfxf8LGh9BNsMkOpxTZK1SrDTvVia3I3AEXia622Efmd6bOQB7jWXScwgc9h45svbLGpwibGGxwGDXuDXJobNiap8L8RmsY8ScQMD7wU8nsA/132",
+        "nick_name": "王飞",
+        "user_name": "",
+        "wxid": "wxid_nm87yhy88blp22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/Ib5852jAybicOXwuIoODP6VZqhaVhINOiaqY0q9s7iaqWQ70XLgW74IxA/132",
+        "nick_name": "黄丽君",
+        "remark_name": "贝特令黄丽君",
+        "user_name": "",
+        "wxid": "wxid_rn3h9184v4zt22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/WyibEjRzPCv8Cmiaebye1evV7dyNQ2ydARBjYWavwcQicMNicxIxdJ6GTkubtXc6UEBwDz8UHcYq99xpuibvvKemfX8VHzoDkBEk4A5jDT9jX8JY/132",
+        "nick_name": "注册消防工程师报考老师",
+        "user_name": "lin18435602462",
+        "wxid": "wxid_nku5zn8ngfpj22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/pSVNPnmzfWd42hYooBQfAwuuQw2T5fBxbnictz3dbKtSp4tAcphdnpN8u2icrFZDpuib1U4mdMPs8CEW6HNz4yGnA/132",
+        "nick_name": "🐍 🐮 🐍 🇨🇳",
+        "remark_name": "睿宝儿科秦老师",
+        "user_name": "",
+        "wxid": "qinli0131"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/FUQQLNMrOIhBfpWMpMegic0NmkKj2Z1z6tfUBu2cuTmtcnOHCrmGAKhScdQ1tRViaIibE5SjnPGiczOEoZUDNW8SMg/132",
+        "nick_name": "真诚",
+        "remark_name": "二大娘",
+        "user_name": "",
+        "wxid": "wxid_8qa4vq1a61g322"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/fgJXZzV3uKicPmvE63bibqybftaU6cicMyiavWVVMw0o7gpPHO2j0tiahict9O7ub0OCGChwbZftfmUdIhEzLPPqSLDibI61eor5muN93BzctAOBCI/132",
+        "nick_name": "腾龙",
+        "remark_name": "长阳妇幼曹钦忠",
+        "user_name": "",
+        "wxid": "wxid_gy2ht5jivhsh22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/JgJBgj27fV2Ujp2uXpxZScia7dGKjSXxEEibkjIRrr8vNuZgK9AHic0YlbvPnD4AedJs0gIW9lxrNojdfiaNnXhiamW6PoHY8TzcIUrQBqyfSLsA/132",
+        "nick_name": "绿色草坪",
+        "remark_name": "迈瑞民营山文广",
+        "user_name": "lvsecaoping19880912",
+        "wxid": "shuaige344387"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/qL5EFRoXVKeibHNknwPtyMICSIrOPGyicTY67uF4028JmtKOBDyxt5Y2EYstoPIORUcbjeoGASoMA1BVTxWdkBujq7jezYRlyWsfZIMh013rc/132",
+        "nick_name": "Steve 刘",
+        "user_name": "Stevelmc",
+        "wxid": "wxid_4ipevyuwcs8r21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/W6t3IO4zO8aRI4gSgqtV3oYKiaic48pU6bJk3NbsjrxXGMj6YOqfn3BiaZ31balkIbichEAiaAJS46ia0cUejjBL4wAVhHQ7OQ7tl5S9YiawprIdZU/132",
+        "nick_name": "喵co",
+        "user_name": "hx012256",
+        "wxid": "wxid_zz72sunpqmtx22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ibDe3b3vMIGBrECEiaHG8M8Cdao1EibDfdnRH6tf0nIn0JYEOdwYSYdwsKZqTC40bVNZKc6sUrHE6MKH9aJia7Zib7rvvs5L8FW6NervLAjJCC8A/132",
+        "nick_name": "潘丽",
+        "remark_name": "潘丽湖南省人民马王堆院区",
+        "user_name": "",
+        "wxid": "panli900797"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2NcYT6ToNBuRVia2XZ2xicZW5iax1V19iaAbXSn6NtGMib1FERt4YjsRfCRXyqPKo1KChgKyv9eLpIad7qra5tVpsibr2OYaR8DiasvCgqKqGIJAfE/132",
+        "nick_name": "。。。",
+        "remark_name": "刘",
+        "user_name": "wryg255",
+        "wxid": "wxid_xnll7zh3i9t422"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SFLafmfkI3LmdtNL6x3KVicV0a0eABMaSSkn9jh5XcPe463J81xd45iaEia176xvx4yzpN2M9fFkWpbGSxy5oLWow9LurRBQUWFiclE4S4n67q0/132",
+        "nick_name": "小荷",
+        "remark_name": "芙蓉区五星牌社区何凡",
+        "user_name": "h15274893866",
+        "wxid": "wxid_cecq5lsp2x7v21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/wicFLPribzNibDAvS1pZfRoGzrO2Yob66oKke99q7qvLoiaE3DiaTnDibUScg7qaSMAdRfqDibbefNULWdZGcmpDXkf2qwicqxJcOlR2rtZ4nCINhd8/132",
+        "nick_name": "Danni(张少丹)",
+        "user_name": "zhangerke60",
+        "wxid": "wxid_9bhusq4kp0yk11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/tyhk3vQko4Z0BI5yH4vp4HLlJeGHgohmhc4gtBR9YrHaZB5YEv7FMaZbYLaGnqKGsG94uVL11efmZBRokrjEaicasR0A2Zia0iczGb8c9T1Xh0/132",
+        "nick_name": "刘飞",
+        "remark_name": "玛特刘飞",
+        "user_name": "matelfi",
+        "wxid": "wxid_t9xmre0j59se11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ZSy3uqWibjCTV7JcLDjzzOlfNAMDQc7lfSPdE0ZN0lsnCyD0avAYUrNusKpfbzA8IEqw0ic1gOImO7mc6nDdp79icbgAgCIfBVLOHr2EErg3dk/132",
+        "nick_name": " ",
+        "user_name": "l6262066",
+        "wxid": "wxid_ooel4myl88aa22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/4VgHNfuhILF0TDJ2JKureQ1BgbH9J5Sib9aguiaIyxpDyibtcNJY7cAbu78eeJV6KE1oiaCuxH6qBJsdra18pHLf3Q/132",
+        "nick_name": "Bruce(一修)",
+        "user_name": "",
+        "wxid": "bruce266"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/shzsZXKf8XO4895AIPQYH9iaPskQXW2iaeagQkt0GT8kVRnGzDpyrRzq4aUntwjlx9NUDp2Sibfm7BKQfIzmCYmAslajb3Oyia9Bs6abD26noIw/132",
+        "nick_name": "唐美玲",
+        "remark_name": "衡阳南华医院唐美玲",
+        "user_name": "Qtangmeiling",
+        "wxid": "wxid_7551685518312"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SIIwtia4xr21XnZV6MwsB9EzPaibz0fw888JUSVbNFNhiaiaKOiaiaH1TjwT6aK3ExjfM8b2GZicBulgiaympwjmBcUTadrzBTBBg5yYicib4NJWBDAO8/132",
+        "nick_name": "燕子",
+        "remark_name": "梅州市妇幼吴景燕",
+        "user_name": "Wjy13560961949",
+        "wxid": "wxid_4234232318312"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/REXujWqTFTBCK0vzmOPtSrEgSvfco3OU92DQEXN3z0aPjP92g4sF4XcXDAhveLyUoTnpzXGrNThic92VJsicicfOQ/132",
+        "nick_name": "超爱🍬糖💓菓🍬",
+        "remark_name": "恒晨源杨超",
+        "user_name": "",
+        "wxid": "Emma--yang"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ym2ngtNxkPjYCAt3RhCiacwBQA4B7XkEOLYM4lHpHkKRUDHpQrDB0FoDXocIzAibHA34OJHJxncLbliabnFkaxotBd3MDFp6s979jGEZib3vMpM/132",
+        "nick_name": "水18374782477",
+        "remark_name": "常宁市妇幼医生欧艳红",
+        "user_name": "ou18374782477",
+        "wxid": "wxid_ejlq1st1r7hc22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ql0iaqgAqzjg5VLus4V6nvgxneDyebrEjVvMgicy8gTj3fYzJaSr78sb6CNqOTzIDcfMjkF8Dop6ibpqgg94AZXDYuRicXicCOMhViboyVmibqG88o/132",
+        "nick_name": "(岩芳)仙游妇幼儿童保健",
+        "remark_name": "仙游妇幼儿童保健蔡岩芳",
+        "user_name": "cyf13859889670",
+        "wxid": "wxid_708qqcscba9r11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7aQDPsPaCZKmozNXo96ErpYEVN3ibA51OBZVaIibhdicz6LA9rNSunm5HZdib98YV6O0u7JFIbQemPwrU2AxRWXR1XLRV5CFcVfRFVqLxZ0xPfc/132",
+        "nick_name": "喜高骨龄软件赵雷17332977830",
+        "user_name": "zl1394725105",
+        "wxid": "wxid_xb8hp5izzpzj22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Q622bDQbbXKRtT1AW844cJBpHsyzLVodtDNLj21b4vvIibiaQOaIzceflYuq2DVJ5AlmhOicAOgrr9bXTOSWvmLxg/132",
+        "nick_name": "甲天下",
+        "remark_name": "省二王勇",
+        "user_name": "wangyonghaoyang",
+        "wxid": "wxid_vycv5a12eqmf22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/RYR0TEHol2Gsns1MKoGsibm0OriaicibaIAW7ABeiby7dxYAB1HI2ux0nHuh4GDp7l5fQcJUt952iaaDff2Lenowl0Tw/132",
+        "nick_name": "王亚徽15130001278(迈瑞超声)",
+        "remark_name": "迈瑞王亚微",
+        "user_name": "",
+        "wxid": "wyhxiazhi"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iaiaBTshLNNJ2sA8rtYRuX1TFJtfhibOFkMCHpviabtt2cjaWLI1QmKmAs9J85ZqX8ziayWrhcQsMFbTjlssibp76Xia570uLmXvSUgORWGq9XIZ6Y/132",
+        "nick_name": "Stella",
+        "remark_name": "迈瑞ISO陈星星",
+        "user_name": "xxingchen126",
+        "wxid": "wxid_0d8wty5ivu4a22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/044MrNztIqT7uqIlMLMq9OwzrgJwUzHZ0sgSbqMkajtTHL1hIjEbiaGBvFK2xcn7VTqWbKBKVtNBSdugg2Ncf7l7tibe2z23CVlIVZm3g9vZ0/132",
+        "nick_name": "大牛",
+        "user_name": "oumihao",
+        "wxid": "wxid_mu9lh69fs7cl22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/mibEQOKcKTtlehXU4p64IIkTYgEibAWUPKIRSLx2mlq0b0nvZXxBEibhazm23icD3oo8gTcJzo6H3ibicTEJgiaNdaUdd1C3e4RZ2xk97KceZhgibEI/132",
+        "nick_name": "悠伊",
+        "remark_name": "喜高吕洁",
+        "user_name": "youyouv521",
+        "wxid": "wxid_vk0fw3dpi5jr22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7wr0zTKCFxLgR6dcjczia1DsjnuGAqkguE6icGlaOTjyibQ2lRD8Kc6uQ7W4LqLZGvrjTgbmaImoTviaKicmVr6iblovnZNZAJNOns4JWdb7z2XeA/132",
+        "nick_name": "邂逅依琳商贸有限公司(曾庆凯)",
+        "remark_name": "庆凯",
+        "user_name": "Who_is_my_baby_zqk",
+        "wxid": "wxid_06nox0zyy12m21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/hMJf3cDcmU4ziaVfgcb46tIE21pbPIPiblT7zcSS34JFCRxZfpe3zAJ2kXv2TIBib8dOYIkWz8ARvPbAknfbdwjhu28meibfIzBaf6jhYUhEJfY/132",
+        "nick_name": "邓生13510943838",
+        "user_name": "",
+        "wxid": "jiangziya3838"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/HibfFegsoRL3qficLtmRTSK6ayeOhQRhkjRCkKfLQOPOIBaL1Y7w3ibKvoce3CCFZicJRJWwniaN6kibJtj6EB6L3LDNraz8aL9edJW9pXFrJ3mWw/132",
+        "nick_name": "娜~",
+        "user_name": "hn1253188589",
+        "wxid": "hn215421"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/WIeMn5A7lpyOic88cQibgWTPjqDQ5SbXRWtJHrW1pSXby0SicfPFfIlTOyLjn9KFZKHTVZMwOLVCuMqqGKvqdscfcA8rWibDmproXQw85r9aH50/132",
+        "nick_name": "琳玲",
+        "remark_name": "于都县人民温琳玲",
+        "user_name": "",
+        "wxid": "wxid_31fw3mzbkmio22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/tEqzBVVkjibbOp8zauEr87wXYoYiaAibesdZBOzN7cM00ywIdiadRbHRmr912JbSH4NuEK8x0el06Af3PKPpVTa7tw/132",
+        "nick_name": "杜悦新",
+        "remark_name": "天津妇女儿童中心杜悦新",
+        "user_name": "dyx13920787049",
+        "wxid": "wxid_f7hp01brvwqz12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/P5kBy2NY4k3lB7Hn95eXLUlEsynVfLfujCeBXwgpN9Q1SnNFpVcvGO9CdZvPI2hTHFZIK5TFvUfQKh0HX4QugQ/132",
+        "nick_name": "欢姐小花园",
+        "user_name": "nawlh1314",
+        "wxid": "wxid_27o1kqf3dsfw22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/vBR7p70YhtgtMhM35aibnoQvkj2fibU6pxgRjf7NTjnvqNWGicyrfbIibvRNDuYUOS9vHRdd8ps8zSXTPyVlicPIDxg/132",
+        "nick_name": "周倩",
+        "user_name": "",
+        "wxid": "zhouqian1532"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iaqfC2N9yQSN1GFuicmYPqaqlWe7W70GnNpvSqdohJmFYOHZR2QnBSSXK3ic2ftcvFSbOluGvHDnc9qvrXHJD1K8A/132",
+        "nick_name": "冯兆锋",
+        "remark_name": "影迈冯兆锋",
+        "user_name": "micro_dream",
+        "wxid": "fengzhaofeng003"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jLKRWCzKZmauaT3ab99oPbQmjXPPvkb1ZvNvLZQA8mBTZCgiba7Y3zAgKiamqbDMzFQsnvxZOXxZa9qACxPmEsvCKQSYhHWy9nbVmibg2Qh3Lk/132",
+        "nick_name": "🍓妞妞&扭扭🍓",
+        "remark_name": "马瑞雪",
+        "user_name": "",
+        "wxid": "wxid_qoiw7wxb2ce722"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/IHh3h8sZ47JuOcZaacrAXZ8Bk7sQIwOLyDrroM1GcavycL7GEx4SRr9LKaviboyDxLyrXMqpjibeWSs261iaqGqMkfEbC1WhSLyFqJImHfJCMI/132",
+        "nick_name": "葛志成",
+        "remark_name": "葛志成",
+        "user_name": "gzc17879523215",
+        "wxid": "wxid_5mh5recbyv1w22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/29syCzibNL6S1jdwIE19afzmOQ6eMiaQaW3AcyCtfhgM7J6A2p9y8l5jFiadjbm8GxoqWM1ZcZa4a1KjX6KJrzP5OzUaznW5HFTsAL3gpJdicUA/132",
+        "nick_name": "丹丹",
+        "user_name": "",
+        "wxid": "wxid_a8sc91mk4fcp22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/WofTu0TWlXgITB9a0xbvMsOEsRQEmuU1BpINbWhlwjnx27La5h3mibeVKHzqWJ8lXp0G0ib8uFbngiawcAMy1PAoQ/132",
+        "nick_name": "酒酿圆子要不要吃",
+        "user_name": "hollycandy",
+        "wxid": "wxid_c00r2n34sdrc22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2EoNjn4d9ayxZic8ocxFz5l8oEica7lRALiaqOthERhv6qwICZZZrPbZlqlxsSB8AK62MM4c4z4K6SlgZnLypc8f4yLEmQDGRk9m73qGrFTZGU/132",
+        "nick_name": "春风杨柳",
+        "remark_name": "省四院技师长王宏光",
+        "user_name": "whg18531116207",
+        "wxid": "wxid_w54ax3xi2nie22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/kDQkAp5WtkUdA8jYO9hWTZx0195micOO0ALWp2DNicBibJgTR2QxFuv7RWgMmH2UfvPLiakajbIz9Jzcz4G1ddgNOFKibRib13sbRUdibXVVEFcibkM/132",
+        "nick_name": "心静如水(李华)",
+        "remark_name": "邯郸中心医院李华",
+        "user_name": "lh13313308996",
+        "wxid": "wxid_j75k51b68i3u21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/X8p8VEm3fmrzqRGchRSbIMqB63b5ic3yqZR6XJRiaekeG0HbCe9fQpJ6yOOiaicoZF1eB44xl8wXm53qibIFqflmW2Q/132",
+        "nick_name": "老李",
+        "user_name": "",
+        "wxid": "SpiderEast"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/HB721HxnqDyvrLhzgA17tCibdIgHoibCtRwwLhLK47ib6bgw8POJ824zaqHVMV05bxyS7K4iciapD003HbBn7zkJlYFibcqeW0u11apS7JXFJPSIQ/132",
+        "nick_name": "杨琪",
+        "remark_name": "杨琪奕真",
+        "user_name": "",
+        "wxid": "wxid_7fu0oor7tmn121"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/H10TgPepXWGyAyS2z1skN12nNlL9hgso00EopKDu0SrqPBhVo3gmBRy7muic7VAwpSgrnjNK4zzwwyIibib1xoLvOLAiaHfD5JM0USjfEicgBmpw/132",
+        "nick_name": "风平浪静",
+        "remark_name": "市四院产前诊断主任张静",
+        "user_name": "zjhbmu",
+        "wxid": "wxid_ldec5siawz2v22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/mewcNQfJBLq4HUkPN3bIu7xp2GIzE6uKVa4XTEBLWXPdKSLcyCyZgQ5WvkgxpuiagL0Zz7vLVwe1zKic51MRQnhdx8N56vtUqjqxkfL10sgibI/132",
+        "nick_name": "黄荣輝",
+        "remark_name": "渝水区妇幼黄荣輝",
+        "user_name": "",
+        "wxid": "wxid_m7os5viqfhl912"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/bIib752eHoTNvH682MptsxNH8814FgkaSEbDdyRK4uxGpEIgCp6WJBhkRklW1c0NUssKV4N98icqDa8fyfxMIia8CaGEKuk52rQNehm3KSPpA0/132",
+        "nick_name": "歲月靜好",
+        "remark_name": "刘俊",
+        "user_name": "",
+        "wxid": "liujianj123"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/pG1NDJ2AOgoGiaXzHgQetx3JfPydIbb4sV03fV03j68DJc0UIuPiaicicW7dQIIJ6aInLt5wmpiczWk99KTHhT9KcHDRQOHDpict7rdcQawbbRq9s/132",
+        "nick_name": "雪花漫漫",
+        "remark_name": "邢台市第一医院柴天昌",
+        "user_name": "",
+        "wxid": "wxid_egdpwc4i0b4721"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/5ngpBYGn0kpkpIjA722x0GUKYANqtQALdXHDxdWgIzOrK0gRzEjp6QN1N1dHK7DssGxtwqMJgBfkPlkMsA7n6tyXnGoDyvw5zsN5OwGxHEc/132",
+        "nick_name": "@_@余钦(=^_^=)",
+        "remark_name": "贵州织金县人民医院余钦(=^_^=)",
+        "user_name": "yuqin02160302",
+        "wxid": "wxid_9j29hmnvh01t21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/PGiasjt6tT05TnRqpkvTnMnv6wImiapHNgX7YXyLiaTTia3DW21mbR9vLpmVuqVPicQnIchPlJDF7pussQShExS48BwbZL4zJlp2z0J7Ivlxqf0s/132",
+        "nick_name": "鑫",
+        "remark_name": "永安市妇幼邢",
+        "user_name": "",
+        "wxid": "xin3kejin"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gRicb7YXpQPUrcN4HicZYFfHu5vuUiab5gcPjk7mf8HCY5jVKGZ0glJK5XU1mMx0icSn0tnTsxVggeibjTZIHYs4bib84BmzHmW7cBFEX2Od0vRU8/132",
+        "nick_name": "李远芳织金县妇幼保健院",
+        "remark_name": "织金县妇幼保健院李远芳",
+        "user_name": "LyF18985361908",
+        "wxid": "wxid_x2v50nmopkhi22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/0ibnCeZqHtvBL9DiawvVjF35D4acoKu1kjnFevbZRkqFQmS6BEAD1mlJRYF3bvO2cP0cDib2FFHkJF28mH3bYvibibfftRD0IaWfaWxQWJfSrYD0/132",
+        "nick_name": "A明悦租车小文13688411319li",
+        "user_name": "",
+        "wxid": "w541012460"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7mpH7e4iaTWDv4X10BGVF7CsuCIKzIFeWXd36tyCicNWLKJDOdB5Iwje0uNlqxZNQ6tcbEJ73QhFicb45wBkK7bOg/132",
+        "nick_name": "剑峰🇨🇳自律即自由",
+        "user_name": "",
+        "wxid": "ngljf_ff"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ENZrpP15pov5W7JFAoCd9z9B3ibicxT3ynJBDslzLSdCc98nxqTDDo3KaGR87vicdyfw2RdtyLceeC4TLzNhPvHlSL3OBhwzKw2mQE1e538c30/132",
+        "nick_name": "燕子",
+        "user_name": "",
+        "wxid": "wxid_i5mrl8y0cwjd21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/63p48zw07omMk95ciamhW8QC9aTSHFohd9fVFnicH2R2Nk8lUfDpRBJxAha7Oib467Hf7M5fumIXRyVVAicK3JIdQ52Z3NJvUKPnlllicV9kUdtc/132",
+        "nick_name": "迈瑞放射张磊",
+        "remark_name": "迈瑞全国放射市场经理张磊",
+        "user_name": "crazyant1231",
+        "wxid": "wxid_6428154280111"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ibbQmH39GNR4nmt3ZPYGiaP7gUbxFvQ8CNdEEZVBS4kvRZHeAOaX7qkepBbMhhz1gX6nj11ribSF9JzAla9srbXHg/132",
+        "nick_name": "宝",
+        "remark_name": "鹤岗人民袁娜娜",
+        "user_name": "",
+        "wxid": "baoer0618"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/tGKJhWxsn7XjLpPo1ksvZa0CxzIUHgvnF87C2wYibglXic0xibdWI4cjvwNAUaOE3BhXYibwwID6LicjWcLt5hia8DPWTD75OtUU73ceYEpeb0VEo/132",
+        "nick_name": "杨慧--半岛医疗",
+        "user_name": "P13927470358",
+        "wxid": "wxid_trlhhbiuinci22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ZgAficNjIZfWr556RSuLaAUuxbwFTDCOr63HF64QAEnNF8jfZwQujVgKd5MOJL5heGBhHywEEVljfhibU2wcuNiaUs7PJAxJX9xPicyta19mpNg/132",
+        "nick_name": "冰糖葫芦",
+        "remark_name": "刘婧",
+        "user_name": "lj-03-03",
+        "wxid": "wxid_wm8nk8rlny7821"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Bx8DMLdho37Td1Q6eVVcdMAFIOeRmUbp5uGg32KfKf8x8E6jWIUnOPQd7yibVDIqRKPtNmF9PgSicvb5uo17Fb8j5qTW4zOEVp29V8664DD44/132",
+        "nick_name": "Allen",
+        "user_name": "",
+        "wxid": "doudou834752"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/sR83sxaGUW5WibkaLAfGQ9OmlqnUuglmvnnMrEoo8pX6MKbqOHwlL3ejheMjW7RDchYSTkRYVKECzRSVwcIYXyQRIYPcX74x7QHQU5yuaK0E/132",
+        "nick_name": "Shirley",
+        "user_name": "Shirley515515",
+        "wxid": "wxid_2b4ljqqlue0k21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/qZCwzQZYZeT3HicMEWq1z0V0xgtHLLicx3Ybwmibc8epBC8pSJQooP4yWgQonl2DibdeDuZWIxW0iaWfK71d9KopH9ibT9icT3HIRdibXHpE3kArNwM/132",
+        "nick_name": "同道菌",
+        "user_name": "uknow_small_sun",
+        "wxid": "wxid_g601odx2it4h12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/o7UEg89M9u2zjZ6p5ibx5iaibeqiaargliaRw2w6YWMyPU3E9wdepkEzmVrjTdBWD6QQFicw1gfotJqI2Hv1was0ZhhdBNibOMqfTdxQticvVy5m7Zo/132",
+        "nick_name": "Daisy",
+        "remark_name": "Daisy 张小嫣",
+        "user_name": "",
+        "wxid": "xiaoyan10070808"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/bPanzQCE3r5Y0UPKOMgKtf9s2aSrImBJiajdJNgZK7WWWpcBgMjNTLZNX3shvHIWLpSicWqVMoILPcGcF0qhjOOYugGRz06Q605x8r03n8TNs/132",
+        "nick_name": "助理-佳晨",
+        "user_name": "ccwnxgcu4",
+        "wxid": "wxid_j1g3mljalaq222"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/GyQlwyDqXjLdLxseYdSibHctg8W1ibjuicMEEtfibwzMCps71drI3tETBtWPWmM4zzic61S7w88jDyJw1voPIsyegDH6lNta1Jynl6jAW2OMYRkQ/132",
+        "nick_name": "Dr.Chen",
+        "remark_name": "番禺区第二人民医院陈老师儿科",
+        "user_name": "chenweihua7810",
+        "wxid": "wxid_u04smzunvfnr21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/P2uV6GicztosxicbicLScIkwC7c8qXDL0dgza8QgzFGksDjUUSj3h7DpgnJ7CdOS0NQnSymIbYMlDpMkp9S4Vuibj7DSH6LXticWcNTckHRu7heA/132",
+        "nick_name": "张玉春",
+        "remark_name": "寿宁县妇幼护士长张玉春",
+        "user_name": "",
+        "wxid": "huaci846525"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jgDeJO5OG8qxtgnSibmaKZyg8CQh9z0DLZ3Vvic1bxCiaNdRwGJ8JuI1uVACjzibmVMn1qsFlLSgOW2Ficn3f2nzEGDibKKMWAmdeHF4icaDIGX81o/132",
+        "nick_name": "茹",
+        "remark_name": "惠州市第一人民医院护士长张慧茹",
+        "user_name": "",
+        "wxid": "wxid_7wm8dkjma5k322"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/hiaX5PWicFeDydZYuNiap2e8TLKFyBuqrHBvbib5Mia2icC0vZXhQjp6TrCE3Okee2o7OoibQLyQIoa177ibBr9wWfw3EDBv1nzRibqCRasrGYvc1kdg/132",
+        "nick_name": "卢克纳尔",
+        "remark_name": "南城县人民医院黄主任",
+        "user_name": "",
+        "wxid": "wxid_3kvsph97eteu22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/0KibxIgIJWc6DFB27GmaprOvrb5hotvvYBiaTPKV2xAgFPvz2iaTCq4xBMOEaibYHuTGHOyIbJju1KE0GsDfghuZbvX1WBCFalTluaMYsowLDJw/132",
+        "nick_name": "丫丫",
+        "remark_name": "梅州市人民医院温主任",
+        "user_name": "",
+        "wxid": "wxid_7dwcx8jcnyyk22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/pic4FzLia6ez6hktOK0f8ySApJkibczYs68Im0YohbQibbFHiaGyuSbiby3Hl8d5sNIj8RNiaRcutoL9aczgvamlXCjdCILiaibmsvSBpHVdVVW0SxSI/132",
+        "nick_name": "何雪雁",
+        "remark_name": "瑞昌市妇幼何雪雁",
+        "user_name": "",
+        "wxid": "wxid_ggnfy623a69k21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/kt6ic2WLDuic1P6QZCiaX9ctc6icdAnUvy3tbArx3uRTKOqKWODU8icvfgpzkcHRUCBT5fmics2fhvJkWHb7yyEQ21KjFvMt5bFic76UA4EM0MiceA8/132",
+        "nick_name": "李李李大刚🐢",
+        "user_name": "kkk2121666",
+        "wxid": "wxid_aerq9bilnnlw12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/k7wWtSAAdB6licm713PECjdtaWp6eEQAKCgO3Rf8PZ8Zru6aNaZLKKAicrDh7XSRanMv6txahESB2icKB6KLV2oyk2FgjLrLYj96vqcWh1fAibU/132",
+        "nick_name": "南",
+        "user_name": "gn-hoo",
+        "wxid": "wxid_20a0yeqoyk9x12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Lpu2xOQTKxNNI4jaLhQicRez5Txbgs2GPxkRagOpIBVUWlpkjKpbD4iagorf3iaia3zrTfPoiav35ZoXOXFQhsgoztSvB6meoM0t7sm4dX7pAvC4/132",
+        "nick_name": "有间花店 (和平店)",
+        "user_name": "",
+        "wxid": "wxid_8lgt9dxrunsb22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/y8fXTLibO4rIvxjnOicM8G5F5Axe4yPaT9miacLaYX7fbV5ZfpW5iavlkzn0syaJ6Dlu122KwyTZkF17t2kLMOpPGHLPTmueZlxXiaLys0wia5fgY/132",
+        "nick_name": "秀",
+        "remark_name": "厦门代理陈经理",
+        "user_name": "xiuli1018",
+        "wxid": "wxid_5zn6mj6u85rl21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Ek5nLrnoNDa7Ws7jm9s9yn0IjBX7Q2fibmA8SpLDuMJdSHUtIfejfIXGSyWGLKma0AJibrEuHUwFJBAqd5ib9l5gg/132",
+        "nick_name": "David",
+        "user_name": "Duoduo19840105",
+        "wxid": "qq57741039"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/NGBLrNr4k40ehr8hOe0V5y6PSYGbaibK8jrvM0lFdFvjYouYmox93SbNaibgxGSRqaTvVyuT2wTT0QNahib5m2jibw/132",
+        "nick_name": "心品",
+        "user_name": "",
+        "wxid": "xinpin007"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/9bALTq7sYxwlwxUm0Mx3FdzPjRqPLSibib9fXJe2FBWHeau0v2YY5mJiauU57nSS0TTc8M80rDs9eHvMXgNPmtKRCZR7yrFzezxjySjWju7mv4/132",
+        "nick_name": "逸尘",
+        "remark_name": "睦友张兵",
+        "user_name": "",
+        "wxid": "bing391930"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/hbf3CnQVFZ5RXuM5FgQgc387QgCIxs3g08WQhToZZjHYOXKrzM2bq1mpI44xZzc0rv5pFOMfA700lIBf98MlHTibhEz5zry6mdgnXEiaIyTbY/132",
+        "nick_name": "fan",
+        "remark_name": "南昌市第三医院吴凡",
+        "user_name": "",
+        "wxid": "wufan447348"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/d1O3XBTT5xkabQl9qfW4nKHQ5B8VPhiav19hzkdYNuIPSX8z89DNVrZOs6V7tQ6ON6RYAXE3cyJIibUOQRBBHs0hgOrzRbRZAIXvnd6AFUxC4/132",
+        "nick_name": "Bobby 臧一佳",
+        "user_name": "baopibaopiFD",
+        "wxid": "a787050438"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/sFtHT0BUTfzHF92FbrIdZwIeuFxicG9vOQy5oteOiaEjiaNcmdeYodicW3klib2fNnZ9WibOFLh1Xb8BUEueYWZdtxBzljpVW55oicGic2e2gAjDibjA/132",
+        "nick_name": "~小仙女~",
+        "user_name": "c18031932635",
+        "wxid": "wxid_i19we1paoq0322"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/jYcxzWMDq0bnQibFBXguGWbuicQu7icgrdRx9AQ6lXEcvTlAvm6RO3tyP5eYncxcJeXv4xkwU033O4hlOiadC1ttcVulhCicjvSNnM2Qs50cgQIc/132",
+        "nick_name": "念1抹微笑",
+        "remark_name": "18522208582李宣睿安科",
+        "user_name": "l924495861",
+        "wxid": "wxid_4ecr4heaqyzm22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iaLed7O5mrEffDGicicZFMlTHtLZmeGib5EFhRMSibiaf8s08DpmYVxX3AQiaQyWmibiajjI7ElucjjxWgyuwicljpjYDj6wt0VJ9T9YlEib0kV4AFwMtk/132",
+        "nick_name": "蓝",
+        "remark_name": "常宁县妇幼",
+        "user_name": "",
+        "wxid": "wxid_mbozb1meckr821"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/5GljtqtIiaLAEN0ugMgt4iapJjqyCpia1y7yicjh1NboVDniamfcicoMBHI8uVrLYeoIVK3lft6eKudS2gxoQqiarPlAibqtvVUhE5YIJBeC96USASw/132",
+        "nick_name": "骆洛",
+        "remark_name": "喜高张莹",
+        "user_name": "smileluoluo129",
+        "wxid": "wxid_c9ll6z3bp07p21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/bkGCEoXqwxJ7ueKpyg19vjD6nljLWBaj6HpLibwe8uZRRaU9DscNYa7zRnu9cm5Dpv4fkuWhDZpQic2HmaFXP7lwoqmViaR0vh6Sf783Hia2wgc/132",
+        "nick_name": "🐵ིྀAi呀小二黑U",
+        "remark_name": "高银妹",
+        "user_name": "gym0318",
+        "wxid": "huameixi715935"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Gib42RyW3lv2NFttwS2BKsSJiasjvmYKFDejnsJvRNjG3iaAyBicX8X4mpaE5HZswicJlISnXj34UdwXG19kSGcMwyA/132",
+        "nick_name": "E米阳光",
+        "remark_name": "迈瑞放射西安李虎",
+        "user_name": "",
+        "wxid": "ymyg3210"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/MWR5RVbfpbWw1lWuNOBLsNVINeDOrCH4HIOVmoIiac65Ff2zZmu2RT8KEZj0IIibUJBkiaZ8EgXCAianXn21RXnDRSQ9akZVT0PAYeUe5VHvTl0/132",
+        "nick_name": "段慧芳",
+        "remark_name": "段慧芳常宁县妇幼",
+        "user_name": "dhf13762439246",
+        "wxid": "wxid_f068u7012tb222"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/xs0H0dyWb9JeV6jpzZ0VCrYe6n06yIYKnXEKsmzh23RtjIS8ZjAaFc1nXun9PibpQm7j1YS0v6ibDODDCs1OX9Qt8IgRicILWF3JDiayl04fcrM/132",
+        "nick_name": "菩提大师",
+        "remark_name": "玉鉴",
+        "user_name": "sjzyj2010",
+        "wxid": "wxid_avaoewhr3ilm51"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/rxhhyk4MWIJQeAM427zEQbgvJZBrtdar3Zlj1LkncdrmWwN1lbLoy21C7a7hKHcw1icnreXHXlYuic2s1jJDZxeEvCgDAAaWhV4cHDuKfF1BE/132",
+        "nick_name": "随缘",
+        "remark_name": "大大娘",
+        "user_name": "",
+        "wxid": "wxid_rfy81mjtdcml22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/BibQ26bHjFfDoa9Dj7rMqlAKpnC8JmMQwFozb1ydeayxPDTwjqgibCyvac3BqWNaiaEw99KibrL6KVAH2ibYW5LIQj0NugRdYuVbiaaXicpXJ49TXs/132",
+        "nick_name": "天津后字二七二部队野狼",
+        "remark_name": "史先生吴世介绍",
+        "user_name": "syl525300",
+        "wxid": "wxid_k8ke099vgaft22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/rBjHAT8Pl9hzKzZQBN264sWnUsvMOntuJpTwvxcibia4KzaZCW7dA4jgHGdpAujibsdRGXPicicjZQicBIqwQhiagcUSy5icEv10Pmib4fhTOjOHd9WM/132",
+        "nick_name": "侯总-Director of Operations",
+        "user_name": "gugugun",
+        "wxid": "wxid_ioac5lxstd0321"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/pIJRwSqkBq1Tib27F4ak8S2d8Z4ECH0YTEELw0VBSicUzeuD3VJSbyooYODD7Qa6Hl8966psymYicvXiaHFZOW6icRyCDyrujpfavia9kiaMFEFRYE/132",
+        "nick_name": "jone",
+        "remark_name": "惠阳区人民医院",
+        "user_name": "caiqiongfang6609",
+        "wxid": "wxid_ktwghvayrtc821"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/S6ebCsG5Hdhnw5v8rttUz2uia21CXNAA9B1PuXXBjEmj7cMLFRtOsgbYIaMu75cBEXZTiakGlcumt3qnXiaWgsrL64vam05JbHGnOPM7XiaT0BA/132",
+        "nick_name": "★⊙﹏⊙★",
+        "user_name": "ssw96514",
+        "wxid": "wxid_yf26kt4q9zjt21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/F2GsWDTlkSW6d5bFe36ZLk4ZHTqZCCVDkGJTiaFs6026b572ib7jFeEfE6vvde4HDj9AfDCtJhkicW7L74ly8QR72OKF1DcBvyYCfQJF5xMUcs/132",
+        "nick_name": "勤快人(宋利宏)",
+        "remark_name": "邯郸中心医院宋利宏",
+        "user_name": "",
+        "wxid": "qinkuairen653442"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8yJsBeEap5wPNs5PneWzae4rMwI07wQMIicheRUfAFw0icc6icAXcQInnuC7zOHWYv2VbNpxPWF1tdaIsmcDChouFiajEM2EjXtBBe2HsqVn0Ck/132",
+        "nick_name": "janyna",
+        "remark_name": "芙蓉区东岸社区唐主任",
+        "user_name": "tjn23168657",
+        "wxid": "wxid_vn5kiajdhsp351"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/WzEicl9SAkD0l5YxHNfTgOia1vLWRbY1eNBEuT1l7grk2vZDPewJxoUWBEpd4ESTx64Py3YP2cWjjoBRhfA8GAgWcGIOaoKvmsx8NEIKKw868/132",
+        "nick_name": "🌙",
+        "user_name": "",
+        "wxid": "wxid_3ttltb9wxahp22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/3kuickMhYMS4dFa7pibJsXSeT4ysf33YXMDruRzY79j0S0lZkFRtTibiaoziaKDwDgpdXvq4JEHzWpVS3OAKaI5ricJztKTnUXIR4lPnXZHiblQWTg/132",
+        "nick_name": "Anne",
+        "user_name": "sjjdz1314",
+        "wxid": "wxid_wxzxjlxandzq11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/T5LBOePOfofT5B9kARic8nFMah1TFoTXdg2pByxNguvJfwXHnicmX8uq75KjV4fFu04CmamwiarPibiaraMxlqP1gNfgObpXQm2Hr2AtcGYsLKjg/132",
+        "nick_name": "Tina Zhu",
+        "user_name": "",
+        "wxid": "zdq0114"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/hsbrYckjHoFPgAYGV752KNGrLbPoXNFia6yicAqclS1PuR7VaKMSD6kiaAMmJwN4rEVrAueOj2YjwQzicq3ibNdULQYdJfx6IA93TxkpYm3Of8kc/132",
+        "nick_name": "小草",
+        "remark_name": "浙江龙游县人民医院玉",
+        "user_name": "Yyj13857031478",
+        "wxid": "wxid_7pry4e60ihfg22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/uBib8MgreCO4nkOEkuIfKh4ibgTIgzibMmm7m4tZIpfk0v4Z3Mqscml9qA3LiaELosC8mMNPzV0D6l5glNN1ticck9Ock2o5E1K09t3T8cYyddeE/132",
+        "nick_name": "姚安县医院儿科倪永军",
+        "user_name": "Nyj13987073426",
+        "wxid": "wxid_qm9wqwtf03nb21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/LTUaia4IUKvlvMDvSBb96jX9QvN507mT91obG5bCKicqbNYTqZM7VNI99Mc0oQWUt448BnzmGuzfEMYkYEibBIzbLeibxWJz2qJzkQfbyKtf2xs/132",
+        "nick_name": "意境美",
+        "remark_name": "金亚茹天山人事",
+        "user_name": "ru1678610280",
+        "wxid": "wxid_punnmetmyf4h21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/sCWmVe8TMHYElIJZad6Gsh5CWibMcib5OCPXX5w0tScZ7OoiaMPORZNeEOowjRSDn7JHUFYG7FAyO5o55WA5Bx3Ay9KTLss7K0cibdRhBe5YdHM/132",
+        "nick_name": "迈瑞DR|温忠文18617168025",
+        "user_name": "",
+        "wxid": "wenshanyi"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/b44QvJnEnac4jwyN4fI0mjU7U4mBbZRupeib4z8pJgMxhApbPh2XDzsyEktO2jUj43mCGfN1SlmXjf9UspTuzXA/132",
+        "nick_name": "骨龄软件李建坡17332972683",
+        "user_name": "ljp124153964",
+        "wxid": "a124153964"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/GFzUdcnwjqWctkobtPg2TY1h4vc0920ptUiaHgVr99ZoPiawTzS0G6biaXy37KZfQsP2CI4TX6bYjXmxc8oa39J0rmsWw9Cfz9jgGnmCeqb9r0/132",
+        "nick_name": "胡新菊",
+        "remark_name": "南昌三院胡新菊",
+        "user_name": "DOCTOR-hxj",
+        "wxid": "wxid_frhlp8ac6q5t22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2V1v5Zg23sV4YiaGdOIwNlofkWyGc8h90xNChxJ9YrssI2SvhshcUMwea2DDXSKpVZia7ygUKvrnjJhh5QV4HRYGdf5qHaic7dpAoJYuOusObk/132",
+        "nick_name": "那年,那梦",
+        "user_name": "",
+        "wxid": "hgy19911003"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/u07uHTnnrKv047L2AGFrr5x7VWCVdy7a7GkVcusQyDeazCUkZE8ZQhf78DcibC4V8h42DkWhTuiaUR5LZRcm0ibSqz68P3y362pt9ic94cKB2g4/132",
+        "nick_name": "周杰Jcneou",
+        "user_name": "Q453300064",
+        "wxid": "wxid_1497804978224"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/eShQ2SghdvT5AQVCLBkbcCHQC6Fz9vof3uUzASSP5qcSD0OI3hasguicG7RDCPWthrsJxq9gZAcXDhpwiazibJLSz0ZEf6yvX6feBXDOwK3G9U/132",
+        "nick_name": "厚德载物",
+        "remark_name": "迈瑞朱军",
+        "user_name": "jun19870210",
+        "wxid": "fukua014412"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/5dsW230jveRo0icsYZM38BnZKgM91sDvAXiakO6Fekn1xGUW05ic4VFCQUIbT7rpicb0vuBecHYN7HzanVYg5ZKHIrpibGmpia5m3hUdc0tcCPicOw/132",
+        "nick_name": "心&若安好",
+        "remark_name": "宜丰县妇幼施娜",
+        "user_name": "",
+        "wxid": "wxid_vjymqc8dt76m22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/4nFQ6kTKsjrr6NzByWDiamCb4WyoWCvNYiaV9cBicPFnmDyYGtJxSnXcR4KxeCstPKP2ulp7XmgfXuVlH3EaRbkJjGlVxxqZvTaBVtb3SSyibsQ/132",
+        "nick_name": "jzb",
+        "remark_name": "尤溪县妇幼蒋正炳",
+        "user_name": "",
+        "wxid": "wxid_0318133181514"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ibIaPjvHKRU67WraluMSWv3s2w7I5opIX0Qo9AMY8AOzhtAXp45GxoDnWmbJuRHkuiccuStyIadYhic57aZWZGLy9fmeuY7ic3ibQ3heA5oSMsVc/132",
+        "nick_name": "范明朵",
+        "user_name": "",
+        "wxid": "wxid_pxvdn3i7evzt22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/kESfySjQGYS809mL7GqGZDFA0ib9ANW1TPZlicfzXzmLjcN4v7cyeku4QLIrJSPiapWzTEAM51sceGPPJS1uSzGT7wbDLfhV15ITibONH7iakfSE/132",
+        "nick_name": "min",
+        "remark_name": "长沙先锋街道社区服务中心周敏敏",
+        "user_name": "",
+        "wxid": "m1n120"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/vAzsvVjAV4ujq6BXceZhcFvIdDYXYp2lEic6N3iaypB8z6YCMWFvP3OAKWu1VUYw7VDbJeM3ffzBcponAMQelIe9nY57sFSGDGwMaH9K1Z2y0/132",
+        "nick_name": "zzz",
+        "remark_name": "张彦萱",
+        "user_name": "",
+        "wxid": "wxid_k3l4ejdjfgil22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/uiaq0K5QVRQ2IuiciaqAhTRn1q0Kicy9TslEZY5ial6NKWqFHkWFia9YleHxJo0Ic9stbvM12uoOW9V7TRXIz7c2bicibXxzEkYx5jagSJepVDmUMDo/132",
+        "nick_name": "亮",
+        "remark_name": "呼吸机",
+        "user_name": "linwenliang311",
+        "wxid": "wxid_0542755427622"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7cyZ8eBTwnlndcrqAbhyKo1cCYSDpAEOQwVdpKnjrNoQaoeppNN4ULgjvUicH9JNgDwwFcDhnXOIBQWZanwicmGwMONPfUuatPepPOtkDXUBg/132",
+        "nick_name": "兰",
+        "remark_name": "上海市长宁区妇幼保健院王兰",
+        "user_name": "erlan1981",
+        "wxid": "wxid_7m9kzeo5foj412"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ONKnvCUoSLrGxm9UHoNPjhG9Btib1lpPJvBKqyXrxJfnU8bic2kiad2w9lK5nSqeDI833PjB9mZnmeibUuqHtDIqby0tAjpWZ16Gus0ZibQwhVB8/132",
+        "nick_name": "炮灰逆袭",
+        "user_name": "",
+        "wxid": "liuwenlong477215"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7LjPBcTlNcYMtcGgej6YeR1yeKZNLbSQic83x4SS7sLI7ELMbe81WqaonM1Paunb4E4WP1zuGeiaLBukF1np8drLX3eIVCrUrhm3dafGaMnL8/132",
+        "nick_name": "小小粥",
+        "remark_name": "瑞宸徐莉",
+        "user_name": "tufeizhuer",
+        "wxid": "wxid_dts59rmi8vod21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/L6Rddus9j1sJ5uhiaHiauawwDibNEJChmHbgibtRao2941uYJI8SdAStlAN88IDQpNR3L1Tv5VAymoUoYsiacMRtlKg/132",
+        "nick_name": "琅窝小孩",
+        "user_name": "hz215421815",
+        "wxid": "wxid_fp0g6d4tjy9k22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/32UZIibBRlKeic2D5emuIRmQlj9U4sVIncMsrcCSoH046YNaNsRYg5iapERkqllkUTXyBFUgTAYG1Eh6tGXYtT3A7F4zlgIHrf4Rx1ZZ3W9ezc/132",
+        "nick_name": "黄雪松16633809175",
+        "remark_name": "黄雪松rf18010020672",
+        "user_name": "z30800849",
+        "wxid": "wxid_hv22mwu20f6g22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/9J14m3thxmnX6EkxIZZxWy1c2PbSIicBe9lUD5gzbLBhybAcpGh7AiaHEpOrMSOwGSaicWwRc3au2b6CvkicwQpMnA/132",
+        "nick_name": " candy",
+        "user_name": "",
+        "wxid": "gao231171"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/yn01hTcB0sSRZmeiaict5WrCsiazF9yfzCpQAv5xJ6OPLVtX58vwJPpup8eGicOfbrK2JFicacHVtDlR7MgaQibM2Lpq7DU0iaZcJiblCrEONZXIcd8/132",
+        "nick_name": "ZHXP",
+        "remark_name": "青海省妇幼赵玺玭",
+        "user_name": "Joy-Bruce",
+        "wxid": "wxid_ubrs9cikjjd121"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Tdia6ENPVeKOVy9PPy2aTdQcDrF06edIlmn986a3jD7icajHoEIGtedmjOg4dv3PQnGYeKxBI6jm1nP6icK4T64zuppmPK05VxiavDQq59aSicGc/132",
+        "nick_name": "儿科生长发育群管理",
+        "user_name": "",
+        "wxid": "wxid_48xxy1014uqs22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/xSgleKLk1hffN47MrMIUib6vvPYUTOFTfBcPHbppUa1xqMdsicKmkmqEeNBZ1vDhPxHtRny0too8HdpCCYzj0Jt4mfTxFDgAOqia4JPRqicFfiaE/132",
+        "nick_name": "妇幼保健朱大夫",
+        "remark_name": "北京大兴区中西医妇幼保健朱大夫",
+        "user_name": "Rosycloud7702",
+        "wxid": "wxid_dgikwllvcomv11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/mqvnkkMRgXKHz0qibY3BvgJehWFk6lTz3IFHI8oK0wgRvyqqiaBmodGCb7yf8neDXrIqUic5GC7KCTtKWJnpI1jPn6H40vP8iaaulkCIvNbGicgQ/132",
+        "nick_name": "邓荣",
+        "remark_name": "湖南光琇医院邓荣",
+        "user_name": "",
+        "wxid": "wxid_by0w5bg6si8l21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2CU9Ecv468t1dibx0HVQ7tLN5YN52ShAP5cTBAfWkJXxhfAgy9KXyWxYKVicfTUI4RMflHiac6YazU3LBVOh1IJQoicZt1MP4bCOTxHBWueTXow/132",
+        "nick_name": "陈泽众·John",
+        "remark_name": "Risfond_John(陈泽众)猎头",
+        "user_name": "John194521",
+        "wxid": "wxid_awfnwch4ek5j22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/LFnkzy5qRxnKMoW6JpEEcT5TFxbOEnnQEed1GAs4AFXecibpuriaMVxAsRbKAawPhv2ib3B2JnTnhqSjH6lgHa8LrpCXt7xH92aA6rkJe9A4Cg/132",
+        "nick_name": "DF",
+        "remark_name": "巨鲨医疗人力资源部张巧",
+        "user_name": "",
+        "wxid": "wxid_pdg97qa7u23s21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2wySU7T3eHCskpJtxrEVm4dIkPxpA69OxbSPq0LfgDMKyOTm8ttLezypOIjasK8Q6cSFibpjQg8l2PefZBjgO2q1IRtXFhUVZu8KqTS4aLJ4/132",
+        "nick_name": "hellen",
+        "remark_name": "hellen猎头",
+        "user_name": "Hellen_XA",
+        "wxid": "wxid_uvxa1e0k55xh22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/UyQcZV04gB6l0AKYNHic6DVGekgyR9xSBUtxPLgHSeZVb8LNL6HS6KibYzMAQViawo6MQHHS6LR4c2MP5nWFE1ovI76nciaoC0KK3Vov8uDBALY/132",
+        "nick_name": "环宇-乐捷康-彭斌",
+        "user_name": "",
+        "wxid": "flashbinbin"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/GxA65nE8Yx449n5lZq7eRcHuzicJV8ksZicDQMnhAuHqGW2ONEXQjTYR2YKnHuLC3nZL3LwfsVQaibHu18f5buDEyibAWyU0tUmzicWpl4ibuVJj0/132",
+        "nick_name": "刘崇燕",
+        "remark_name": "江西赣州大余县妇幼保健院刘主任",
+        "user_name": "",
+        "wxid": "wxid_wrzo3iklukjx22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Eb2thWkiaNN9o9hr7KhSKbpIiauwDOvhgqucpwMygLIoBuic0Xt5tLplWiaQdfoHfPe6hI6TibIcZmibODpy1TRz2CVw/132",
+        "nick_name": "豪猪",
+        "remark_name": "福建医科大学二院胡老师",
+        "user_name": "WhoShoutsHow",
+        "wxid": "haozhu6711"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/JHQoKjNj7adicZpyBahCucgUxsnKZlxbEr7PicgMA8Sp8efO3Bh7TkNBcl0MVibZEQkpibzK2setZNuFv1fsnic8oqtKvP0rmsJQNqc8ASkxduPI/132",
+        "nick_name": "品寻",
+        "user_name": "pinjingwenxun",
+        "wxid": "wxid_th30h4pzt5q921"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/5uOFesiamMyzodI3jwKqNeroKLOKAvPWRde8b4hHzdtgoQlglK9GZZmLiavhJ2iaz47WoFSY8hWpcmK8OGa5B2SVTQSMkAgbOj2UrH0Vp0Yh1I/132",
+        "nick_name": "鱼",
+        "remark_name": "湛江人民医院吴医生",
+        "user_name": "",
+        "wxid": "wxid_tvdtqeala61322"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/NzC6S5xxjs5E2U6fmjXMff7kCfLhdicYcof37Ul52REYK8XGdbDc2r9QDWW23omTaNjPXuqN7QqeDqmkuk53spw/132",
+        "nick_name": "徐丙章",
+        "remark_name": "恒晨源邢台邯郸徐丙章",
+        "user_name": "laoxu0008",
+        "wxid": "yutai688888"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/XzAnGXcJjtcdVDBjXwZY3XibEHmWVO0AFYt5vGWnnqE5WK4L4sFd5zWRiaUt6hRe9xeaLfp28zbFdF8HEp7H0zGA/132",
+        "nick_name": "小氵原㍿",
+        "user_name": "",
+        "wxid": "yuanren1011"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/f8eearEic5AzHunBlV3CkgYbshtlK84NRTquAbjjEhldbDE7aVApdAvoQq7ibyTbXKGTzpnNYIy9RrOcSHkR8zgympm2tlQUxsa0x6NicQvIlI/132",
+        "nick_name": "广告部-登报中心",
+        "user_name": "baoshe0065",
+        "wxid": "wxid_m2d9ujhdzzpz22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/GAp7LdMeJnVnoE4lvEHZKp1DyL5YIeaQetVAZVqlIvYlH0h0p8Nhb2A8yevPl95Tw3SPnlrgNiaDhwXbXppggpw/132",
+        "nick_name": "谋道不谋食",
+        "remark_name": "少康",
+        "user_name": "",
+        "wxid": "shouji132072651958"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Cu0EIo1fa1vUXpRaMrHn9aMaCkOibUoXribu54GgwFHqLqP6ByVwyFl7SRh4q7V2orgAzrmkqUwqccR91hQN9BaX5vOwepFeG5ymz48DSmWjs/132",
+        "nick_name": "5+5",
+        "remark_name": "解放军九十二医院吴主任",
+        "user_name": "w73653",
+        "wxid": "wxid_2lk2r0appemf22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/b8ibgkbBDibKmXk1RcNcydubH7aSiaKShkiaXQj7G2ADiaUB6ryG8dUzc9LgsRnqPt0RZr58e5ho0s23EibqWu6RMZibZWLAxYfvrukmbUicnNpqXqE/132",
+        "nick_name": "红",
+        "remark_name": "惠安县惠北华侨医院儿保庄老师",
+        "user_name": "ZXH090130",
+        "wxid": "wxid_vlw4a73dgdvz21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/unToEFXXcQSh0RnQ0BvWpLrJIXvl31bpn6frNtqAFNWOZVicKV9yD1kqhEr63xYaqgkzkjm2fv1GuXFgdKibqaawVOcKCgNgWyiam1gCejeDeA/132",
+        "nick_name": "A.        奋斗",
+        "user_name": "",
+        "wxid": "dandan419394692"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/JP7OlJEx82HTThOX8401RGGVFAibSEfib6LBcfta0eaqBJI9puLVNPMjGj9wPKFUJDibOqEZyfWUkFbHNqMLupYD6bfavrr6C0oO4lFu1BoLkM/132",
+        "nick_name": "叶碧禄",
+        "remark_name": "叶碧禄寿宁县医院设备科",
+        "user_name": "",
+        "wxid": "wxid_drgyi3k3zr5t22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/KMNtPTJACU6PcfuSHlYP2Hnkdgga5p60E87X6Oiadac45P53YWZGlc57Tk7DpTqvYTCadfphL7eCX45rIQQQ0cOlre6P1eFJDVlT0XzMKc6w/132",
+        "nick_name": "李二生  邢台市第一医院介入治疗科",
+        "user_name": "feichengwurao9867",
+        "wxid": "wxid_4tj5wytou8ie22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/gYZ5Y6eJA4g1KPaUaTLC0weV1Dd8UKN46PzRjR8lmicgzRQVSV9wNiaibrqaLFh9GOdHrN8P9pkdQEN5hCpK6CjFKibH3ibLlZG5d6t6DAfzrYtA/132",
+        "nick_name": "雪霞",
+        "remark_name": "阳江市妇幼儿保林雪霞",
+        "user_name": "",
+        "wxid": "wxid_pi6eoirz3sx422"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/xPL6cADdNXDoNGvNoiaNM1VpX3NotgXXTpNbbShTCj9kys6UkAv7aOUkyb52XC5HqOnqMhfTP38M2Dic8NXhHfLEQ5O4avJiagLgTrl8ZAgNgQ/132",
+        "nick_name": "monorun",
+        "remark_name": "益阳市妇幼陈偲",
+        "user_name": "",
+        "wxid": "wxid_48kgmmiqk69421"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/KrlrOuAwiaPSt816vNu71lA76PAlh5UEaCmxs53iaX6Dbgz48bibTexbenAVCLmZNArZ7ppzwBESvE5vlV7NABvtNJtAiaQtGURbnRXuCbpfe2M/132",
+        "nick_name": "医疗Cathy",
+        "user_name": "Cathy_Medical",
+        "wxid": "wxid_wbrrjymrtn6622"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/4FpIpYtyc7XTcD5Richj5qR4BAIWSyhiabAn9CVEeN2FGtYnRibvvugVDzI0a1katzTAFJnO3L7rWHxSYqmfnaXMQ/132",
+        "nick_name": "金-Parker",
+        "remark_name": "睿宝金-Parker",
+        "user_name": "thejokerfan0",
+        "wxid": "qq413291194"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/HrufPcMeGW0pkRuBbaOJqGT7CicsBlMuz3Z8aD8pic6gkWOA66D9KiaTzSe4WYDdNGeaqS1YiaTFNQEogzHZUa7Eyw/132",
+        "nick_name": "王震",
+        "user_name": "",
+        "wxid": "timepill"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/LT71I4UOrT6G05tWPewkdkuGSvrTbIXfqCEyMicH03BoYdsneNcOnY9ZVo6kxTX7giafp0sl2ViaARtBMJrBicYX5uZ0yDdHmgNudYzjXlvicZEY/132",
+        "nick_name": "。。。。。。。",
+        "user_name": "zgj20020903",
+        "wxid": "wxid_k3or71clmsk922"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/weG2e5mLSX2JHBoqA4iaJ8050qbu0fjsasrcnDVGeYbXxEDOQTUXO3kUW9xRfGibde3ANYic6GdCW8nGOib1HIALelNcLgvcKDhjuvGC3yY1NAI/132",
+        "nick_name": "武林",
+        "remark_name": "迈瑞超声武林",
+        "user_name": "",
+        "wxid": "wxid_8720977210012"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8prgiatzDicXzKXA9M81ThTE1SR6ibuMbqDPEbeFNX6jlApepvOXJJuGKeovibNib40jflLET9500jeWpCZOicJTzGzOqvf6YYia2QoEIiaNo4e6K8U/132",
+        "nick_name": "梦的边缘",
+        "remark_name": "恒晨源赵亚楠",
+        "user_name": "weiyi160818",
+        "wxid": "wxid_2vr0heke4rea22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8O6QhU4SYGyxjLpUZ5Qp12icXoMCNRly5ViaRF3clJfz5tlDhjcJoL9MmhQR4jMw8x1wEhAXSMuicmvPSTk3eOFdKVcDSUNjoLgicWGjBRfdSZ0/132",
+        "nick_name": "冰蓝",
+        "remark_name": "贵阳铜仁人民医院杨瑶",
+        "user_name": "",
+        "wxid": "wxid_vexs8bv1d5yu21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/5rJcCibIIOat3PC7Fk12cRHlkCUjkNjmhMHnkm9nXPFTU4shf8Gqm1FVTC5OGpjhsjfZzpKaq1mXl9lpQu7gOfw/132",
+        "nick_name": "Kathy (赵恺)&ZWHR",
+        "user_name": "kathyzhaokai",
+        "wxid": "wxid_ksmkxbstn41g11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ntPWnmB1kNB6zOibFNuJEQCrMoLjVpXPYicQzdrtN9mx72N1h3OsbfuUSywENgnQK03Nu8RbauaqlPjNggjk9FLdC8CxsyErkz4dElO4rbzCo/132",
+        "nick_name": "AA 武强康辉旅行社15028774894",
+        "user_name": "ying13102769221",
+        "wxid": "wxid_byx3yjsplmgz22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/NiagmyDzBYmhsn38XU2L1s5Hoia4Iu9nqX3BTibPIK3r9SSsibl9TqgdjrP49U3DcJuTNvjchHsXwWAiaDkiauChBicng/132",
+        "nick_name": "陈妲",
+        "remark_name": "湖南武冈市妇幼陈妲",
+        "user_name": "",
+        "wxid": "wxid_3495mavg792v21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/YXVKkpQNgWmN3CxtevmfIicaxcMWJDCkXNPa23SwP3tibHPdicRoGM1m3K6gOwofqMuQlZd9hDVXCyOTbCSogicDEQ/132",
+        "nick_name": "🎭",
+        "user_name": "woshifengshang69",
+        "wxid": "wxid_1wxj1a6u96cz21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/1gkFjLBM79T1IBuG4oY6k7YuVtlJUqsHOTlMpC9owTxMZ0ImicRiaSOsIYRHcorPKfn3fc45OfYxhJStFYGceGCpntMgxhUPwOl1NB6gTb0rI/132",
+        "nick_name": "米奇蛋糕15903185091",
+        "user_name": "",
+        "wxid": "wxid_nn6x79gb66ib22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2Sdgevw63htHrJ7U4WRibyl51GmPsnocFX2Z1v1BO3ib40y5aGJwqHYeecjiabyccKvnW1NlG0N8LL9HuDOhROLZw/132",
+        "nick_name": "迎风起飞",
+        "remark_name": "王丁",
+        "user_name": "",
+        "wxid": "yingfengyuanfei"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/VFwhg800ylCtQVOMGrFob2TRmfldfy6vHlicA7OtvPYd9qefym2EnibDCVpLgulODwfZJeCxjicvoPt7fmTt3Ew9KHtfgrRWicDae6CETB4CzEY/132",
+        "nick_name": "自然",
+        "remark_name": "三河市妇幼",
+        "user_name": "Liliang20158",
+        "wxid": "wxid_tcy3b9kevm0d22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Ya2TEzqx2fzSRbU91lxw6NFYZ2encZp7VjQudf8nE0MbSsicvEKRrFMcAE4ImSXkdRJHxyMH3zCy9libxfQmzxcLakI7VKWTticpsZK5RDQo9g/132",
+        "nick_name": "^0^新^0^",
+        "user_name": "zyxzzy20160504",
+        "wxid": "wxid_dv39kjah54x122"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/FKwjHdSlDoMYql1CZjF57gjmh6kPy9dWDHz3smUmKichHD7MJSc7dqF4ABw5xE3ezmOekGpIOicn9O5GxBbDWvRBNsMTgAMyaIOEPO8HGlODU/132",
+        "nick_name": "一世安",
+        "remark_name": "云鹤猎头",
+        "user_name": "JanYuki",
+        "wxid": "wxid_ri0glf1g9o2821"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/oMdezhuqgYRUvh91YqC9G2qFOf20D5icFYaO8vrVzDxR0evUb6FwhHYTnm5K8ZmfQSshBVQ0cU7uusor6NGfOmQ/132",
+        "nick_name": "小散",
+        "remark_name": "代理商李总(连城妇幼)",
+        "user_name": "",
+        "wxid": "lzjazll"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/fZcMFkOgZPwKTbHiaLv35p8lrjPJFq8e0nzn9zibm4FQezBOEkrftuL444V0D0TD9FOQXXnqiaPhficDIwA2Fse7CoVToLc9q6T1kBzD36MW3Z8/132",
+        "nick_name": "董瑞℡¹⁵²¹⁰⁷⁴¹⁰²⁶",
+        "user_name": "",
+        "wxid": "guoquxianzai962470"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/GVLMm5w3tDDpubmwkkHm9eCBuRkaYrg8NVrbrTB5XqdxQZ1hlSAZLeUseBYQVgYWReZIicNa1KscibsaHQQOBmfsJsdvweGuZ0yKM7Uicp8BN4/132",
+        "nick_name": "李镇雄",
+        "user_name": "LZX18318817701",
+        "wxid": "wxid_pejn8nwl0we022"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/j2F9kbOwvbm6cRoZUiaiaWQexib8snU8CqCPWTbZ1qIliaic0ibo0wzyicsIaCZ4uCtufoU9B7dmicsT1gJNA7ohaQSiathuRMiaJznOI1ibkt5Tf4Z1gA/132",
+        "nick_name": "莹莹😘",
+        "user_name": "s1203026",
+        "wxid": "wxid_0f97y85ibrvc21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ccjd1YRsYBfmticVicEvNLib99iaciaXF1yNjZ2rzj9WKiav6dgMe9xtElId6uySCEFmpVhdukOqG69pzSuKEXoBT7VD9gKZwtq2sPnjuIRpykbVc/132",
+        "nick_name": "熬夜会死星人🐼",
+        "user_name": "csq--277",
+        "wxid": "wxid_23n622lguskt22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/RE895RfsjND2UCuzHuCBvkXQa6cY9tENLEqibxG1BDKmGQ4JvgXbO6ZVY8YBZ1w0vDA2cylZd0ibeicYGvL52rOYSjicqx3DDDaI9hdCFclZGBo/132",
+        "nick_name": "🐽",
+        "user_name": "qdd520717",
+        "wxid": "wxid_chhqahd01r0d22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/LaMqjggS9giaRhib3WPCHls6DOTRNU11cAy1ns1w3ABSGofqdzVjbohwO8Wlp09HwQmq4ucibe8l6W2na0P7Vx69AoOn8FcxfgtJYE3MzAyuKo/132",
+        "nick_name": "不合时宜",
+        "remark_name": "彭水妇幼张春兰",
+        "user_name": "",
+        "wxid": "wxid_j85d7qcr1n2512"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ESsgrgqRyEd75iaHRNDFxliaXNWdm2soDFbbG7yYibVFJicgXzYWqicEmUeuE2XwOo7fVy35WsfWtXF6dC1D0PlMiaVYPLib2C1xnmpc9Yn30TkLiaQ/132",
+        "nick_name": "姚瑶",
+        "user_name": "yaoyao8946",
+        "wxid": "wxid_jgatq5rnuz7i22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/FnSTjG9ctRMBibyFVH0nRyibNdtJT2XYUib2TCvZKZ3jgyz5TpibibRMtMDf8t2lZqTT81bIic1LpZclCVzXZFIELtsw/132",
+        "nick_name": "苗",
+        "user_name": "LM727055069",
+        "wxid": "wxid_a51jkku4mr8o22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ASAJSFHlhwnFSD8qftbBfVTPrWdGmkY6M0vY9D8KR083xwzU73VbibGZhSN9Uhic0aluY1B9cQUibIAkrOiaWiccgM0DaiaibF0d13YkrorZLoYZcs/132",
+        "nick_name": "沈勇",
+        "remark_name": "文山县医院沈勇",
+        "user_name": "",
+        "wxid": "wxid_tky6h6cx4vuz22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/NyAEMV4gsp4ibChWfC9EyApL80PVqHFYHqtEtvuZNHx0hY80ODWrMdm0c5xEZoKbwUgv0aFvQeJrYFvd4eoQYm28UcfDKXhc5d2bm6FIJx9A/132",
+        "nick_name": "晓倩",
+        "user_name": "",
+        "wxid": "wxid_0650906514912"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/RbKKTHicAkFibqibqaibck8yDqiaoKL4SliclhpUQWwax5I6EszbXu9HIrXlb2a1qT9hibWc134Q6tkcHHnoKwV5CLvAvaje7IzUicuuE2lDCbBocYc/132",
+        "nick_name": "踏马平川",
+        "remark_name": "二手电车",
+        "user_name": "yanxiaodong851",
+        "wxid": "wxid_x9xq33is7i9441"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/hljrHPOWOShVpdZGrponWBE7VpMzJibm3qADvyktRJTBaeU5gYngduJoWTic8yCWVmAtuRKugZnl9RvicLK2JDlvw/132",
+        "nick_name": "April",
+        "remark_name": "迈瑞战略崔彦",
+        "user_name": "cuiyan_april",
+        "wxid": "wxid_3844908449311"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ekUQyDga1ppfx5jv5ZtVtusIibrdcmS7geLHaH3fzMhzgZXaBlXXCVzCotZFWIqYLODDfjlxqTLgicJ0xrsHWcA9KXsq22Rvkn91VqhvqksXE/132",
+        "nick_name": "永恒",
+        "user_name": "hongxie668",
+        "wxid": "wxid_wlyb3kqq7noq12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ZveBUmrhGSyxibfyPe3E4SKlg88XCXXAbnJuOf1ibMicM57HvknN4EudXqj9LADN0PQtDlKJZQA8foQTr2BP199BbdCpoT67rjXxNc56APP8YE/132",
+        "nick_name": "林华",
+        "remark_name": "尤溪县妇幼主任林华",
+        "user_name": "yx18960509810",
+        "wxid": "wxid_8h6uvq9pfkfg22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/ljx6ojM22auPrVSDSvHtlicGbqmb6C3xqNdZ7zL4mQ4Pq1k880OInALRJZm7lz71O3diaTv3AWaInzwfNLtTXn0oNiajkA22GPZMibNic1BVzU14/132",
+        "nick_name": "周燕",
+        "remark_name": "信阳妇幼周燕",
+        "user_name": "zhw197412",
+        "wxid": "wxid_fl6t97zy6x2522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/yL6NNbxp7zP19srtHWUu6XJA2pOdkan6glFue4tJOAU0tLCGG9XGfX4jgq5cXgRWw6NSjuehoIoVT1By5MLO5r1qGT90o4cmMjcnWYaRDfw/132",
+        "nick_name": "刘光远",
+        "user_name": "",
+        "wxid": "wxid_01lfpz345u5q12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/KrUHXOP9PM9ayJ0Z6s7JbGxeicREWAv93XTbVdTPXibKjGicP94yZPzy5HWeUOgbLgm5zfp5MSKJZM0ue7iaupzTtFvSmGyWUxw12Rbia3K5Vwl8/132",
+        "nick_name": "L",
+        "remark_name": "李哥",
+        "user_name": "Lv-8-8-8-8-8",
+        "wxid": "wxid_8bqx7zhcc4hp11"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8MtsBn3XQ5wpfEibQeDuBQzRCRbPq2XkSAuLRavXW4MJRUEkgd6kicurLZtASia0bGcggYt0WCkGtbEQZLKdnJzhW1amjG7XKjmDxaM5ibmJ8icE/132",
+        "nick_name": "喜高科技黄泽",
+        "user_name": "",
+        "wxid": "wxid_bqgnusnoh6lp22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/0MwReckBhkCtXk7vxkaYUgYw5bwZg4JYFuKBcbcO1xficoxqZoWWrLQXmumC5Faic36LzKOEcQlxjvReyu8GKvibg/132",
+        "nick_name": "小王呀😋😋",
+        "remark_name": "小王湖南航空医院",
+        "user_name": "wei1988814",
+        "wxid": "wangweifu"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8Rj2yF6icDDe7dGicEILwNiaQRp2X0BibR28RHhdKdqibVZ03FmOUG1WLbiaLU6ibrOYFT7yNFVr9GfvHe0hanonlFzQJ3OdMGchQPTjptlYse1CJg/132",
+        "nick_name": "Linda(猎头顾问)",
+        "user_name": "kxp190",
+        "wxid": "wxid_594u57oyneg312"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/WZlrKW9fkN9TBZVIPvR158ibEsBdJjib7hPOwoJsNbUrewMgUWWj1jKuhf1nf3uMzpsmqhcXxuxS5IE8nHtbUc5MDnZKExUzv9uJKukniaDgD0/132",
+        "nick_name": "儿科.郭海亭揭阳市慈云医院",
+        "user_name": "ght15915617866",
+        "wxid": "wxid_chwv2iimovcy22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/OpCGVfA26u8Kgl2Eu7zk8kg5aWZ8BdwUNzID9qEyibSNXiapNNyBg2RdkfOh8mW7u7pF0zcNUJvjsIJ6Y12s0WvaohkO5y0RS4kJ6cCa0Qkxs/132",
+        "nick_name": "FSK",
+        "remark_name": "邢台市第三医院齐主任",
+        "user_name": "FSK-QS",
+        "wxid": "wxid_z8oi60z1tgir41"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/BZw6Wwy4CE9ryia6hYgXAUuwIRrMh7fyRgXE9RLN24ETvSTyAZbVIyiatJ3I2v89ASDibcGkjRjeqfYQ0fPicaoF0g/132",
+        "nick_name": "阿哲",
+        "remark_name": "顺风小哥吴哲",
+        "user_name": "",
+        "wxid": "wuzhe900605"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7vFvu12ROzq6GeAuvjyD9nWFDURb0oIDCDfhExNS8BuR5vJhPWVE13YjFOiaSicXHNTh10xYdNoSPpMibzfzAOynvxv5Prjdxfs3SMbv7B2fbk/132",
+        "nick_name": "白衣渡我",
+        "remark_name": "华容县妇幼李靖",
+        "user_name": "",
+        "wxid": "kuk4001"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/OwicibicC3piafHaWxcpT3icS01ajlO5pyDT9VGWePnibwwRXVM98RNrDgchpWHjyHfV7FhSeibQostNsCg5mXD2UJoFLrSMmUhsJrIlx59YNX49AI/132",
+        "nick_name": "敏",
+        "remark_name": "漳浦县中医院薛主任",
+        "user_name": "xzm496692183",
+        "wxid": "wxid_3etpx6tajvhv22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/SYDRZf4W46icbAqiaZpSUmL6ljv2t8mKGeYtxmgKLDLf1jsa3C70ut8t9YIYUtOwIARqpia7X9YSs0aeDwld8JypeZhFwKibpK8MyowaicH6j6mo/132",
+        "nick_name": "礻羊",
+        "remark_name": "织金妇幼信息科殷科长",
+        "user_name": "B-_-_-_-_-B",
+        "wxid": "binbin6777"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8iaCCxOjqrY5IiabJNlHFlYejC9YzIWZOqp88SExJv3RicrtZmRozvwliaXlzTA6t6Nic4vvFTEqOiaZUFSjiaDv0zzQdLibImagwEa8RFLpf3F0BVE/132",
+        "nick_name": "鑫源商贸   17630246907",
+        "user_name": "wpf9313",
+        "wxid": "wxid_bgr6w1vh8ex122"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/hVbheQE59ggVoKwHnibBj2KGr4yWNAcaLVXDibE0LIP0GhB9qYVFia2zFUNWBNroWyacHX2xewpgB1iciabheGt0dVIFyKRpVsqegspkyaQgQzGU/132",
+        "nick_name": "雷海峰",
+        "remark_name": "桂阳县妇幼雷海峰",
+        "user_name": "lhf13549512013",
+        "wxid": "wxid_1neygulw4kj422"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/P7qO3ggibANVGwoSCnSDriaGcq2hbcwKurSlE5HbklnfNwpsT4mRJHUNiafpBKXNvz1rFaOzRrD8ycKic8eBQWGAUTZH80ylO08ichlWngc9btJw/132",
+        "nick_name": "estoy aquí !",
+        "user_name": "",
+        "wxid": "hjl214237001"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/HvBibcCcT18orXduS1PUfLibc8eB1nTE4nxv0gFch7iaR1IjicbiaQFGkfzjHXYoeBARPUE2kqzWCt6FpIuy2QfjlNl7T6icvRpMLvurxR33wouEc/132",
+        "nick_name": "罗冰",
+        "remark_name": "湖南航天医院罗冰",
+        "user_name": "",
+        "wxid": "luobing154356"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/PF6D8LsE1p3jXBgBziaGwygLgLhFmBjRyvF3rWgfcA39YqT26p5lxiaut1cusNVX7HK8uMKa7uW4BPUwbzrMEaFzjJC0kry6Cf0F7cKmTv0Zc/132",
+        "nick_name": "阳春白雪",
+        "remark_name": "常宁县妇幼",
+        "user_name": "",
+        "wxid": "wxid_7zmh0dqxznfg22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/8icibgQvMWPbAyQSaYGhbx6mMol1XvBEYDq4EVJcYLo4R76MHewiaeKN2d5gzmCscaAS8PMw2XkwTCy2fmkTf8CnYvniaEiajwnq8BDYuribPNG9w/132",
+        "nick_name": "丁珂",
+        "remark_name": "湘潭市妇幼保健院丁珂",
+        "user_name": "",
+        "wxid": "qq57695863"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/2KbxMNVdGN08RyRaHfdpcXrNia3qosjbg2v7lrMXs5SeOKciahDuKibeTE5rxPvGpw9iabyHspPQJ2sHxvIv2Fbd4A/132",
+        "nick_name": "小学毕业",
+        "remark_name": "福清市妇幼林老师",
+        "user_name": "lsls1122334455",
+        "wxid": "wxid_escwvmmmn7ta22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/CiayASFpGORfchqDkXyfjbdJcPicD5XlVZEGEg0Y0eNQvnzkHiayGCfJiaWAZmoMsoIPB3krjs4RD4OHS91tlPY5QpNWhtGy0fSRIGLmEgUVVU4/132",
+        "nick_name": "🌼铁锤妹妹🌈早十点到晚六点",
+        "remark_name": "张丹",
+        "user_name": "bd17330252795",
+        "wxid": "wxid_ay6pqhjqwha312"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/YFI14RKfQnfOxW1OpGxTJbs5hTqfOYJ8iclyDgSy33s8ogzko17NgcclpFyQPibm89U2ric1Vovnx3KaOviaeIDGxdfGKQkocRyZINCxuD80ibME/132",
+        "nick_name": "李家小三子",
+        "remark_name": "余干县妇幼保健院",
+        "user_name": "",
+        "wxid": "h742954668"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/PGUIickLMgYtVbWaSCQQVR1jq6LCJSauG2q8icR3HHHibdIbJZ1bb988iavHCgU2PttVicuZxRDQ8NVNblLwwc3YfyZiaFusUG0st49L8kXicvJIM4/132",
+        "nick_name": "田会谦",
+        "user_name": "youda888888888",
+        "wxid": "wxid_i7uxa99cpd8i22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/cOYn9pWYI0stww64oznjStdFoKUwfsNluM82ChT1xI5Et153gKTHCYgkMChqYN9mDfSptZ50baChJiaNQSaLkvnm9BWxj3xM6JZdacnCLyAg/132",
+        "nick_name": "李淑芬",
+        "remark_name": "李淑芬新疆二附院",
+        "user_name": "li15276629889",
+        "wxid": "wxid_7451154510912"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/d5fEA0ce3uskBdhmEVV5ia9kwsf2iceNL0HNU3D7jgiagE5wX59GuECDGmJicZRvbpLOicEIKK1mZ9I1AUw1rvu7lkPeibKicoIywKsoiaNRJMiba6Zk/132",
+        "nick_name": "轩辕·暖晴光",
+        "remark_name": "奕真运营黄雯",
+        "user_name": "awen-confident",
+        "wxid": "aa0646218"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/x0aqF70hiaLKcC02W1hFrpgg6WdOOX9olyR5bzYrwVJnBLRN14SfmI1UsXGmMdAGtUJGoicWgEXWkRibabx60zFSjIuqjrHcJYCek2aaQjPZjs/132",
+        "nick_name": "高安阳",
+        "user_name": "a_1239057395",
+        "wxid": "wxid_kqm16t5rd00d12"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/7hUm2UU7x1DhWoiahUUWJDQmT6lnVeYFMNFqia4BZZWD5jp7a1D8bd67xibo0tLa9ZefrvyyqyFhVyjicZwM5bHsGcPJHaTqqhUdpkaPZsjsqw4/132",
+        "nick_name": "美景",
+        "remark_name": "高闪",
+        "user_name": "",
+        "wxid": "sisixindon2727"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/VVU222bK8st8XFliaprbsvjoZfarMRhibOl9jbdbCnnlibTicQk2HLUqfSz5iaXwM66VdibZNDjGGwqgcNS47dKDzJm6rzU41BpiczkA950xeIKuEc/132",
+        "nick_name": "AAa高勇",
+        "user_name": "Gy613001",
+        "wxid": "wxid_pkyaxmr0zcwb22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/dF8WHStIhvI5e56xlbrYlicXicWf35KjAib6zDyIh0HSIPX1tvrss6c5ibtP1J1HPNlDBX2GHgW9IqfhHKkK3TnxJG090FPAcgoGvGb5IpoEo0c/132",
+        "nick_name": "立红",
+        "user_name": "rui_and_hong",
+        "wxid": "wxid_10jhh4tvuehb22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/nv8f4P8XiatVHWP5MZEiaozicsBtcjx1NcFkRgXoX50MNx8RvVdbGfPdLZibibYGkJiaJKJGqzMRCib0ZBRGhveG6tkepVyRlQRjc3jU53BJEu8P40/132",
+        "nick_name": "雍立宁",
+        "user_name": "yong1101986",
+        "wxid": "wxid_ytxhgo3twzlv22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/k32ExVeEWMbKIFTy4BUGs9QjYAAghrGr79Rc46u66iaRm2AInEupmdovO5WkIatPVPbZ5yWxLEW0ujJlQjmLQE36esyGf7DKOb78QM0nfBso/132",
+        "nick_name": "王子",
+        "remark_name": "王艳芹邯郸市第四医院",
+        "user_name": "w13613109984",
+        "wxid": "wxid_iuzuale8vp1w21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/Qd37u5NGlp6TicIK2QibHYibBRqD2SzoiajqTzMlTztpzundXdzofeB8UDxdqFTCh5ibedFxOVog1KUQRIEh1LUlA32h5fEcYYwsa8Kicx1HBSlD0/132",
+        "nick_name": "Jane",
+        "remark_name": "迈瑞郭菁",
+        "user_name": "",
+        "wxid": "guojing8075"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/UrAwzR2L2KNmYNymOmEfpyse8PbxNyDk7dxtQnmncJBfTNnaHaxSQRib2kpYFJiawjeuHP5lcInjMcUkWF2wUSick4gcsptFRSzFxic768ZNOUs/132",
+        "nick_name": "冰华",
+        "remark_name": "长汀县妇幼郑老师",
+        "user_name": "zbh15759017343",
+        "wxid": "wxid_ibuycxztyjbf22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/bYSsfOY6ECTFkzFp4m0paM6oXH6TgXFdtWT99FUGfGZc3yup9E1iaNNiaNXCsO1pd4hoBQZpwC5GZuFq5QicKoh7ibbLSySaYUrCpWaWlb1g2wA/132",
+        "nick_name": "距离",
+        "remark_name": "远东龙岗妇产医院段老师",
+        "user_name": "",
+        "wxid": "wxid_h4jyavlq0ppg22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/MCuuzsQ5J5FQWXqicefRlszM7dZHMrdROyju9OalibMj4eQVJiagNvjJuZdvWR8VeYzbLBKz2Hhh0xlKHDTm69BicQ/132",
+        "nick_name": "潭人",
+        "remark_name": "平潭县医院高青",
+        "user_name": "",
+        "wxid": "wxid_k7vsbkvvcngz21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/HyKgooCRHdK9Kc1ibQoqj87u4Gc0Php2rWE1Fqibbv74NUHicxUPtvAINJiaHOuoqAa0KVDCHde2DroZnImOTicNGZMU0BfvwH7MfrVLouURq9lI/132",
+        "nick_name": "Dingfeng",
+        "remark_name": "惠州第一人民医院儿保科丁主任",
+        "user_name": "df-13680715550",
+        "wxid": "wxid_u2alwrd1owyd21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/3to56Kz4zl5GCRpH8qpK8ib1zjcECOAM6HvODufPyEuC9rqoDD3A8Y4TFM5u9ibUnmEhL13CIlv8sfLucmrDyCYg/132",
+        "nick_name": "佳",
+        "user_name": "Majia137",
+        "wxid": "lybMJ137"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/GBPuxeNawXkkjecuqPPibd26CobLKV3DmloXmdyEtucNMKT8dkiawoL9ViaYr0VV2qcPbCia5nAA0njPiaCKIl2GAxK0No0wFMPsicKgyt54ibrNZk/132",
+        "nick_name": "罗莉",
+        "remark_name": "南昌西湖区妇幼罗莉",
+        "user_name": "cyradg",
+        "wxid": "wxid_1dfow150fks111"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/g0iataC6q7tbVSjM02IicSYhx2gHYyVBWXPce8bZsicWJ6tXn5gNbx6cTdv3obLkljwDPqhGjHIrqp76AicticlBxKuccKRyAAJe3bCB8x7plQQk/132",
+        "nick_name": "鹤叔",
+        "remark_name": "茂名人民信息科陈科长",
+        "user_name": "man215333159",
+        "wxid": "wxid_6276462764112"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/RrxOrbm6WoibKdhibDM6RbOQnsl7AKJdwbjPiabTECNiaxoz7B3Dvib7HjChr6Y3pAjqzvmibgGtLvPO36kSK1uoiasDA5mwGXAUx4xM1KfpIY90Yk/132",
+        "nick_name": "大雪",
+        "remark_name": "王天雪",
+        "user_name": "",
+        "wxid": "wangtianxue828801"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/q8ILwYpXjianAgZJViaUh2VLOy7gsMfwVFdb80C9t5EqwGWXWibwK0aWwuUmiaNhGs46SqPdpIwu4oTjFXxhKQuQpA/132",
+        "nick_name": "张艳华",
+        "user_name": "zyh13333383258",
+        "wxid": "wxid_zfx17i8isuv521"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/E1lopyk8HhDTmuc8dGFKk6jgBBp5E41kVYMcwt6xKxXHWlJfJvA1UBGMlsNyg7HTf9T3FjPQeDib9Nd3ibzicm4WYtj7au1U2JpNp0KH64MDUQ/132",
+        "nick_name": "严少昆",
+        "user_name": "",
+        "wxid": "wxid_uujs656b61kt22"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/rjVWm9Kog6XggZ5E1cTwApnEXIjrMFxmWhOiamdr3icrE3fffI6JhibaTQ1xsYzBQcDaHoqrgXOox16cE1ic8Hl70pbdCZm1P7OICbasp0LxyAQ/132",
+        "nick_name": ".NET开发工程师兼维护-赵兵亮",
+        "user_name": "",
+        "wxid": "wxid_hv7ghpmaos5612"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/iaP2FyLCU5ynTEkbibBKke8GJK7u8P6SaPl4E0QTY4TkjEyBFVunypvZbkMWdoeEzZv7ibNRnfzf6EiapJbrx39seYV3k85DK5rhYRWluTcNvPc/132",
+        "nick_name": "皓靖然",
+        "remark_name": "王文慧西宁市妇幼保健院",
+        "user_name": "",
+        "wxid": "wxid_me882tnva05n21"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/j6oNzub2ick1pGDF44Sk2libbOUK5tmUVoScVxoIeR1NXMgD3xMetPFic06Pw20jxVIoTzdsntggup2TvSiboj1POlFLwpicrXSCzXjMc5dLlalQ/132",
+        "nick_name": "伍亚辉",
+        "remark_name": "伍亚辉东方医院吉安医院",
+        "user_name": "",
+        "wxid": "wxid_oxfwzc32e38522"
+    },
+    {
+        "head_img": "http://wx.qlogo.cn/mmhead/ver_1/10gJjCbKY9icIlVNGmhSQmAbLhDPYicysetSwkic8Kc0Gq4z6P8BAsWupCpW13icfZ8h0OyCKicebmV4U7j9qVibHUsFNpRfMRmtTYSjaFfgNHq9U/132",
+        "nick_name": "静静",
+        "remark_name": "李静17736938330",
+        "user_name": "jing118713",
+        "wxid": "wxid_ck86txpysgad22"
+    }
+]
diff --git a/kidgrow-demo/kidgrow-demo-order/src/test/java/com/kidgrow/order/mapper/OrderInfoMapperTest.java b/kidgrow-demo/kidgrow-demo-order/src/test/java/com/kidgrow/order/mapper/OrderInfoMapperTest.java
index 1c9f0d9..3ed0936 100644
--- a/kidgrow-demo/kidgrow-demo-order/src/test/java/com/kidgrow/order/mapper/OrderInfoMapperTest.java
+++ b/kidgrow-demo/kidgrow-demo-order/src/test/java/com/kidgrow/order/mapper/OrderInfoMapperTest.java
@@ -1,7 +1,10 @@
 package com.kidgrow.order.mapper;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.kidgrow.common.context.DynamicTableContextHolder;
+import com.kidgrow.db.sharding.TableSuffix;
 import com.kidgrow.order.entity.OrderInfo;
+import com.kidgrow.order.service.IOrderDetailService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -9,6 +12,7 @@
 import org.springframework.test.context.junit4.SpringRunner;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -23,11 +27,13 @@
 public class OrderInfoMapperTest {
     @Autowired
     private OrderInfoMapper orderInfoMapper;
+    @Autowired
+    private IOrderDetailService orderDetailService;
 
     @Test
-    public void getOrderInfo(){
+    public void getOrderInfo() {
 
-        OrderInfo orderInfo= orderInfoMapper.selectById("111");
+        OrderInfo orderInfo = orderInfoMapper.selectById("111");
 
         System.out.println(orderInfo);
 
@@ -35,9 +41,9 @@
 
 
     @Test
-    public void orderInfoSelectList(){
-        List<OrderInfo> list= orderInfoMapper.selectList(new QueryWrapper<OrderInfo>()
-                .eq("order_id","111"));
+    public void orderInfoSelectList() {
+        List<OrderInfo> list = orderInfoMapper.selectList(new QueryWrapper<OrderInfo>()
+                .eq("order_id", "111"));
 
         System.out.println(list);
 
@@ -45,4 +51,26 @@
 
 
     }
+
+    @Test
+    public void orderDetail() {
+        Map<String, Object> params = null;
+        params.put("page", 1);
+        params.put("limit", 10);
+        DynamicTableContextHolder.setDynamicTable("order_detail_2020");
+        DynamicTableContextHolder.setDynamicTable("order_info_2020");
+        orderDetailService.findList(params, "");
+
+        System.out.println(orderDetailService.findList(params, ""));
+
+
+    }
+
+
+
+    @Test
+    public void hashTest() {
+        String tableTag = TableSuffix.ofHash("1236847735607631873",64,"-000").getSuffix();
+        System.out.println(tableTag);
+    }
 }
\ No newline at end of file
diff --git a/kidgrow-demo/kidgrow-demo-product/Dockerfile b/kidgrow-demo/kidgrow-demo-product/Dockerfile
new file mode 100644
index 0000000..fef5f1e
--- /dev/null
+++ b/kidgrow-demo/kidgrow-demo-product/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-demo/kidgrow-demo-product/pom.xml b/kidgrow-demo/kidgrow-demo-product/pom.xml
index 3a334b2..c0df818 100644
--- a/kidgrow-demo/kidgrow-demo-product/pom.xml
+++ b/kidgrow-demo/kidgrow-demo-product/pom.xml
@@ -38,6 +38,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-demo/kidgrow-demo-product/src/main/resources/application.yml b/kidgrow-demo/kidgrow-demo-product/src/main/resources/application.yml
index bd9cd39..9ed8fe8 100644
--- a/kidgrow-demo/kidgrow-demo-product/src/main/resources/application.yml
+++ b/kidgrow-demo/kidgrow-demo-product/src/main/resources/application.yml
@@ -12,7 +12,7 @@
     url: jdbc:mysql://${kidgrow.datasource.ip}:3306/demo_order?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false
     username: ${kidgrow.datasource.username}
     password: ${kidgrow.datasource.password}
-    driver-class-name: com.mysql.jdbc.Driver
+#    driver-class-name: com.mysql.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
     druid:
       aop-patterns: com.kidgrow.order.controller.*,com.kidgrow.order.mapper.*
diff --git a/kidgrow-jobs/kidgrow-jobs-admin/src/main/resources/application-dev.properties b/kidgrow-jobs/kidgrow-jobs-admin/src/main/resources/application-dev.properties
index 7614e91..61d79d6 100644
--- a/kidgrow-jobs/kidgrow-jobs-admin/src/main/resources/application-dev.properties
+++ b/kidgrow-jobs/kidgrow-jobs-admin/src/main/resources/application-dev.properties
@@ -3,7 +3,7 @@
 kidgrow.datasource.username=root
 kidgrow.datasource.password=root
 
-spring.datasource.url=jdbc:mysql://${kidgrow.datasource.ip}:3306/xxl_job?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
+spring.datasource.url=jdbc:mysql://${kidgrow.datasource.ip}:3306/xxl_job?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
 spring.datasource.username=${kidgrow.datasource.username}
 spring.datasource.password=${kidgrow.datasource.password}
 
diff --git a/kidgrow-jobs/kidgrow-jobs-admin/src/main/resources/application-test.properties b/kidgrow-jobs/kidgrow-jobs-admin/src/main/resources/application-test.properties
index 7614e91..61d79d6 100644
--- a/kidgrow-jobs/kidgrow-jobs-admin/src/main/resources/application-test.properties
+++ b/kidgrow-jobs/kidgrow-jobs-admin/src/main/resources/application-test.properties
@@ -3,7 +3,7 @@
 kidgrow.datasource.username=root
 kidgrow.datasource.password=root
 
-spring.datasource.url=jdbc:mysql://${kidgrow.datasource.ip}:3306/xxl_job?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
+spring.datasource.url=jdbc:mysql://${kidgrow.datasource.ip}:3306/xxl_job?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
 spring.datasource.username=${kidgrow.datasource.username}
 spring.datasource.password=${kidgrow.datasource.password}
 
diff --git a/kidgrow-plugin/kidgrow-plugin-email/Dockerfile b/kidgrow-plugin/kidgrow-plugin-email/Dockerfile
new file mode 100644
index 0000000..fef5f1e
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-email/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-plugin/kidgrow-plugin-email/pom.xml b/kidgrow-plugin/kidgrow-plugin-email/pom.xml
index 0a5449f..913259f 100644
--- a/kidgrow-plugin/kidgrow-plugin-email/pom.xml
+++ b/kidgrow-plugin/kidgrow-plugin-email/pom.xml
@@ -47,6 +47,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/pom.xml b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/pom.xml
new file mode 100644
index 0000000..35cf848
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/pom.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kidgrow-plugin-sms</artifactId>
+        <groupId>com.kidgrow</groupId>
+        <version>1.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kidgrow-plugin-sms-api</artifactId>
+
+
+</project>
\ No newline at end of file
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/feign/SmsChuangLanService.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/feign/SmsChuangLanService.java
new file mode 100644
index 0000000..a82b647
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/feign/SmsChuangLanService.java
@@ -0,0 +1,29 @@
+package com.kidgrow.sms.feign;
+
+import com.kidgrow.common.constant.ServiceNameConstants;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.sms.feign.fallback.SmsChuangLanServiceFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/27 22:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@FeignClient(value = ServiceNameConstants.SMS_SERVICE_SERVER,
+        fallbackFactory = SmsChuangLanServiceFallbackFactory.class, decode404 = true)
+public interface SmsChuangLanService {
+    /**
+     * feign rpc访问远程 接口
+     */
+    @PostMapping(value = "/smsChangLan/send")
+    ResultBody sendVerificationCode(@RequestBody Map map);
+
+}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/feign/fallback/SmsChuangLanServiceFallbackFactory.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/feign/fallback/SmsChuangLanServiceFallbackFactory.java
new file mode 100644
index 0000000..521e47e
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/feign/fallback/SmsChuangLanServiceFallbackFactory.java
@@ -0,0 +1,31 @@
+package com.kidgrow.sms.feign.fallback;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.sms.feign.SmsChuangLanService;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/27 22:05 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@Component
+public class SmsChuangLanServiceFallbackFactory implements FallbackFactory<SmsChuangLanService> {
+    @Override
+    public SmsChuangLanService create(Throwable throwable) {
+        return new SmsChuangLanService() {
+            @Override
+            public ResultBody sendVerificationCode(Map ma) {
+                return ResultBody.failed("短息调用失败");
+            }
+        };
+    }
+}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/model/ConstantSMS.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/model/ConstantSMS.java
new file mode 100644
index 0000000..86f32f2
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/model/ConstantSMS.java
@@ -0,0 +1,9 @@
+package com.kidgrow.sms.model;
+
+import com.kidgrow.common.constant.CommonConstant;
+
+public interface ConstantSMS {
+    String PASSWORD_SMS = "PASSWORD_SMS";//修改密码 短信验证的type值
+    String REGISTER_SMS = "REGISTER_SMS";//注册 短信验证的type值
+    String PHONE_SMS = "PHONE_SMS";//更换手机号 短信验证的type值
+}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/model/SmsModel.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/model/SmsModel.java
new file mode 100644
index 0000000..fb7ae0a
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-api/src/main/java/com/kidgrow/sms/model/SmsModel.java
@@ -0,0 +1,28 @@
+package com.kidgrow.sms.model;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 发送短信实体类<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:18 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@ApiModel(value = "发送短信实体类")
+@Data
+public class SmsModel implements Serializable {
+
+    private String phoneNumber; //手机号
+    private String key; // 短信模板key
+    private String code; // 短信验证码
+    private Map<String,String> params; // 内容 key 值要与模板一致
+    private List<String> phoneNumbers; // 群发消息时使用
+
+}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/pom.xml b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/pom.xml
new file mode 100644
index 0000000..907a7dd
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kidgrow-plugin-sms</artifactId>
+        <groupId>com.kidgrow</groupId>
+        <version>1.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kidgrow-plugin-sms-biz</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-plugin-sms-api</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/Dockerfile b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/Dockerfile
new file mode 100644
index 0000000..fef5f1e
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/client/SmsClient.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/client/SmsClient.java
new file mode 100644
index 0000000..0288e7b
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/client/SmsClient.java
@@ -0,0 +1,216 @@
+package com.kidgrow.sms.client;
+
+import com.aliyuncs.CommonRequest;
+import com.aliyuncs.CommonResponse;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.google.gson.Gson;
+import com.kidgrow.sms.exception.SmsException;
+import com.kidgrow.sms.template.BatchSmsTemplate;
+import com.kidgrow.sms.template.SmsTemplate;
+import com.kidgrow.sms.util.AliyunSmsUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云 SMS 客户端<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:07 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class SmsClient {
+    private final IAcsClient acsClient;
+    private final Map<String, SmsTemplate> smsTemplates;
+    private final Gson gson = new Gson();
+
+    @Value("${aliyun.commonRequest.domain}")
+    private String domain;
+
+    @Value("${aliyun.commonRequest.version}")
+    private String version;
+
+    @Value("${aliyun.commonRequest.action}")
+    private String action;
+
+    /**
+     * Instantiates a new SmsClient.
+     *
+     * @param accessKeyId 阿里云短信 accessKeyId
+     * @param accessKeySecret 阿里云短信 accessKeySecret
+     */
+    public SmsClient(final String accessKeyId, final String accessKeySecret) {
+        this(accessKeyId, accessKeySecret, Collections.emptyMap());
+    }
+
+    /**
+     * Instantiates a new SmsClient.
+     *
+     * @param accessKeyId 阿里云短信 accessKeyId
+     * @param accessKeySecret 阿里云短信 accessKeySecret
+     * @param smsTemplates 预置短信模板
+     */
+    public SmsClient(final String accessKeyId,
+                     final String accessKeySecret,
+                     final Map<String, SmsTemplate> smsTemplates) {
+        AliyunSmsUtils.checkNotEmpty(accessKeyId, "'accessKeyId' must be not empty");
+        AliyunSmsUtils.checkNotEmpty(accessKeySecret, "'accessKeySecret' must be not empty");
+
+        final IClientProfile clientProfile = DefaultProfile.getProfile(
+                "default", accessKeyId, accessKeySecret);
+
+        this.acsClient = new DefaultAcsClient(clientProfile);
+        this.smsTemplates = smsTemplates;
+    }
+
+    /**
+     * Instantiates a new SmsClient.
+     *
+     * @param acsClient IAcsClient
+     * @param smsTemplates 预置短信模板
+     */
+    public SmsClient(final IAcsClient acsClient, final Map<String, SmsTemplate> smsTemplates) {
+        this.acsClient = acsClient;
+        this.smsTemplates = smsTemplates;
+    }
+
+    /**
+     * 发送短信验证码.
+     *
+     * @param phoneNumber 手机号码(中国)
+     *
+     * @return 6 位数的随机码
+     */
+    public int sendVerificationCode(final String smsTemplateKey, final String phoneNumber) {
+        AliyunSmsUtils.checkPhoneNumber(phoneNumber);
+        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
+        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
+
+        final int code = AliyunSmsUtils.randomCode();
+        smsTemplate.setTemplateParam(Collections.singletonMap("code", String.valueOf(code)));
+        smsTemplate.setPhoneNumbers(Collections.singletonList(phoneNumber));
+        send(smsTemplate);
+        return code;
+    }
+
+    /**
+     * 发送消息 支持群发
+     * @param smsTemplateKey
+     * @param params
+     * @param phoneNumbers
+     */
+    public void sendSmsMsg(final String smsTemplateKey, Map<String, String> params, final List<String> phoneNumbers){
+        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
+        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
+
+        smsTemplate.setTemplateParam(params);
+        smsTemplate.setPhoneNumbers(phoneNumbers);
+        send(smsTemplate);
+    }
+
+    /**
+     * 发送短信.
+     *
+     * @param smsTemplateKey 预置短信模板 key
+     */
+    public void send(final String smsTemplateKey) {
+        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
+        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
+
+        send(smsTemplate);
+    }
+
+    /**
+     * 发送短信.
+     *
+     * @param smsTemplateKey 预置短信模板 key
+     * @param phoneNumbers 手机号码,优先于预置短信模板中配置的手机号码
+     */
+    public void send(final String smsTemplateKey, final String... phoneNumbers) {
+        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
+        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
+
+        smsTemplate.setPhoneNumbers(Arrays.asList(phoneNumbers));
+        send(smsTemplate);
+    }
+
+    /**
+     * 发送短信.
+     *
+     * @param smsTemplate 短信模板
+     */
+    public void send(final SmsTemplate smsTemplate) {
+        Objects.requireNonNull(smsTemplate);
+        AliyunSmsUtils.checkSmsTemplate(smsTemplate);
+
+        final CommonRequest request = new CommonRequest();
+        request.setSysMethod(MethodType.POST);
+        request.setSysDomain(domain);
+        request.setSysVersion(version);
+        request.setSysAction(action);
+        request.putQueryParameter("PhoneNumbers", String.join(",", smsTemplate.getPhoneNumbers()));
+        request.putQueryParameter("SignName", smsTemplate.getSignName());
+        request.putQueryParameter("TemplateCode", smsTemplate.getTemplateCode());
+        request.putQueryParameter("TemplateParam", AliyunSmsUtils.toJsonStr(smsTemplate.getTemplateParam()));
+        try {
+            final CommonResponse response = this.acsClient.getCommonResponse(request);
+            AliyunSmsUtils.checkSmsResponse(response);
+        }
+        catch (final ClientException e) {
+            throw new SmsException(e);
+        }
+    }
+
+    /**
+     * 批量发送短信.
+     *
+     * <p>
+     * 批量发送短信接口,支持在一次请求中分别向多个不同的手机号码发送不同签名的短信。
+     * 手机号码,签名,模板参数字段个数相同,一一对应,短信服务根据字段的顺序判断发往指定手机号码的签名。
+     *
+     * <p>
+     * 如果您需要往多个手机号码中发送同样签名的短信,请使用 {@link #send(SmsTemplate)}。
+     *
+     * @param batchSmsTemplate 批量发送短信模板
+     */
+    public void send(final BatchSmsTemplate batchSmsTemplate) {
+        Objects.requireNonNull(batchSmsTemplate);
+        AliyunSmsUtils.checkBatchSmsTemplate(batchSmsTemplate);
+
+        final CommonRequest request = new CommonRequest();
+        request.setSysMethod(MethodType.POST);
+        request.setSysDomain("dysmsapi.aliyuncs.com");
+        request.setSysVersion("2017-05-25");
+        request.setSysAction("SendBatchSms");
+        request.putQueryParameter("PhoneNumberJson", this.gson.toJson(batchSmsTemplate.getPhoneNumbers()));
+        request.putQueryParameter("SignNameJson", this.gson.toJson(batchSmsTemplate.getSignNames()));
+        request.putQueryParameter("TemplateCode", batchSmsTemplate.getTemplateCode());
+        request.putQueryParameter("TemplateParamJson", this.gson.toJson(batchSmsTemplate.getTemplateParams()));
+        try {
+            final CommonResponse response = this.acsClient.getCommonResponse(request);
+            AliyunSmsUtils.checkSmsResponse(response);
+        }
+        catch (final ClientException e) {
+            throw new SmsException(e);
+        }
+    }
+
+//    public static void main(String[] args) {
+//        Map<String, SmsTemplate> smsTemplates = new HashMap<>();
+//        SmsTemplate smsTemplate = SmsTemplate.builder()
+//                .signName("模板名称")
+//                .templateCode("模板code")
+//                .addTemplateParam("code", "123456")
+//                .build();
+//        smsTemplates.put("aaa",smsTemplate);
+//        SmsClient smsClient = new SmsClient("aaaa","aaaaa",smsTemplates);
+//        smsClient.sendVerificationCode("aaa","18503198351");
+//    }
+}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/exception/SmsException.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/exception/SmsException.java
new file mode 100644
index 0000000..4f74858
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/exception/SmsException.java
@@ -0,0 +1,31 @@
+package com.kidgrow.sms.exception;
+
+import com.kidgrow.common.exception.KidgrowException;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 08:57 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class SmsException extends KidgrowException {
+    /**
+     * Instantiates a new SmsException.
+     *
+     * @param message the message
+     */
+    public SmsException(final String message) {
+        super(message);
+    }
+
+    /**
+     * Instantiates a new SmsException.
+     *
+     * @param cause the cause
+     */
+    public SmsException(final Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/service/AliyunSmsService.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/service/AliyunSmsService.java
new file mode 100644
index 0000000..29556ac
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/service/AliyunSmsService.java
@@ -0,0 +1,44 @@
+package com.kidgrow.sms.service;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.sms.model.SmsModel;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 对外API 短信发送和验证码校验接口 feignClient 继承这个接口 即可调用<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:20 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Api(tags = "短信发送服务")
+public interface AliyunSmsService {
+
+    /**
+     * 发送手机验证码
+     * @param smsModel
+     */
+    @ApiOperation(value = "发送短信验证码接口")
+    @PostMapping("/send/verificationCode")
+    ResultBody sendVerificationCode(@RequestBody SmsModel smsModel);
+
+    /**
+     * 校验手机验证码是否正确
+     * @param smsModel
+     */
+    @ApiOperation(value = "验证短信验证码接口")
+    @PostMapping("/validate/verificationCode")
+    ResultBody validateVerificationCode(@RequestBody SmsModel smsModel);
+
+    /**
+     * 发送手机短信消息
+     * @param smsModel
+     */
+    @ApiOperation(value = "发送手机短信消息接口")
+    @PostMapping("/send/smsMsg")
+    ResultBody sendSmsMsg(@RequestBody SmsModel smsModel);
+}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/template/BatchSmsTemplate.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/template/BatchSmsTemplate.java
new file mode 100644
index 0000000..002e154
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/template/BatchSmsTemplate.java
@@ -0,0 +1,26 @@
+package com.kidgrow.sms.template;
+
+import lombok.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云调用批量模板<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Builder(builderClassName = "Builder", toBuilder = true)
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class BatchSmsTemplate {
+    private List<String> signNames;
+    private String templateCode;
+    private List<Map<String, String>> templateParams;
+    private List<String> phoneNumbers;
+}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/template/SmsTemplate.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/template/SmsTemplate.java
new file mode 100644
index 0000000..c943ded
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/template/SmsTemplate.java
@@ -0,0 +1,27 @@
+package com.kidgrow.sms.template;
+
+import lombok.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云调用模板<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:04 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Builder(builderClassName = "Builder", toBuilder = true)
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class SmsTemplate {
+    private String signName;
+    private String templateCode;
+    private Map<String, String> templateParam;
+    private List<String> phoneNumbers;
+
+}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/util/AliyunSmsUtils.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/util/AliyunSmsUtils.java
new file mode 100644
index 0000000..edf35c7
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/util/AliyunSmsUtils.java
@@ -0,0 +1,175 @@
+package com.kidgrow.sms.util;
+
+import com.aliyuncs.CommonResponse;
+import com.google.gson.Gson;
+import com.kidgrow.sms.exception.SmsException;
+import com.kidgrow.sms.template.BatchSmsTemplate;
+import com.kidgrow.sms.template.SmsTemplate;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ThreadLocalRandom;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云短信服务工具类<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 08:53 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class AliyunSmsUtils {
+    private static final String SUCCESS_CODE = "OK";
+    /**
+     * 宽松校验即可.
+     */
+    private static final String PHONE_NUMBER_REGEX = "\\d{5,}";
+
+    /**
+     * 生成随机验证码.
+     *
+     * @return 随机数
+     */
+    public static int randomCode() {
+        return 100_000 + ThreadLocalRandom.current().nextInt(1_000_000 - 100_000);
+    }
+
+    /**
+     * Map 转 json 字符串的简单实现.
+     *
+     * @param map the map
+     *
+     * @return the json string
+     */
+    public static String toJsonStr(final Map<String, String> map) {
+        if (null == map || map.isEmpty()) {
+            return null;
+        }
+
+        final StringBuilder sb = new StringBuilder();
+        sb.append('{');
+        for (final Map.Entry<String, String> entry : map.entrySet()) {
+            sb.append('"')
+                    .append(entry.getKey().replace("\"", "\\\""))
+                    .append('"')
+                    .append(':')
+                    .append('"')
+                    .append(entry.getValue().replace("\"", "\\\""))
+                    .append('"')
+                    .append(',');
+        }
+        sb.deleteCharAt(sb.length() - 1);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    /**
+     * 校验 SmsTemplate.
+     *
+     * @param template the SmsTemplate
+     */
+    public static void checkSmsTemplate(final SmsTemplate template) {
+
+        checkNotEmpty(template.getSignName(), "SmsTemplate signName must be not empty");
+        checkNotEmpty(template.getTemplateCode(), "SmsTemplate templateCode must be not empty");
+        checkNotEmpty(template.getPhoneNumbers(), "SmsTemplate phoneNumbers must be not empty");
+
+    }
+
+    /**
+     * 校验 BatchSmsTemplate.
+     *
+     * @param template the BatchSmsTemplate
+     */
+    public static void checkBatchSmsTemplate(final BatchSmsTemplate template) {
+
+        checkNotEmpty(template.getSignNames(), "BatchSmsTemplate signNames must be not empty");
+        checkNotEmpty(template.getPhoneNumbers(), "BatchSmsTemplate phoneNumbers must be not empty");
+        checkNotEmpty(template.getTemplateCode(), "BatchSmsTemplate templateCode must be not empty");
+        checkNotEmpty(template.getTemplateParams(), "BatchSmsTemplate templateParams must be not empty");
+
+        if (template.getSignNames().size() != template.getPhoneNumbers().size()
+                && template.getPhoneNumbers().size() != template.getTemplateParams().size()) {
+            throw new IllegalArgumentException("BatchSmsTemplate phoneNumbers, signNames, templateParams size must be the same");
+        }
+    }
+
+    /**
+     * 校验 SendSmsResponse 状态.
+     *
+     * @param response the SendSmsResponse
+     */
+    public static void checkSmsResponse(final CommonResponse response) {
+        if (null == response) {
+            throw new SmsException("Response is null");
+        }
+        final Gson gson = new Gson();
+        final Map<String, String> json = gson.fromJson(response.getData(), Map.class);
+        if (!SUCCESS_CODE.equalsIgnoreCase(json.get("Code"))) {
+            //throw new SmsException("Http status: " + response.getHttpStatus() + ", response: " + response.getData());
+            throw new SmsException(response.getData());
+        }
+    }
+
+    /**
+     * 校验手机号码(中国).
+     *
+     * @param phoneNumber the phone number
+     */
+    public static void checkPhoneNumber(final String phoneNumber) {
+        if (null == phoneNumber || !phoneNumber.matches(PHONE_NUMBER_REGEX)) {
+            throw new IllegalArgumentException("Invalid phone number");
+        }
+    }
+
+    /**  <br>     2018年3月已知
+     中国电信号段
+     133,149,153,173,177,180,181,189,199
+     中国联通号段
+     130,131,132,145,155,156,166,175,176,185,186
+     中国移动号段
+     134(0-8),135,136,137,138,139,147,150,151,152,157,158,159,178,182,183,184,187,188,198
+     其他号段
+     14号段以前为上网卡专属号段,如中国联通的是145,中国移动的是147等等。
+     虚拟运营商
+     电信:1700,1701,1702
+     移动:1703,1705,1706
+     联通:1704,1707,1708,1709,171
+     卫星通信:148(移动) 1349
+     */
+    public static boolean isMobile(String str) {
+        boolean b = false;
+        String s2="^[1](([3][0-9])|([4][5,7,9])|([5][0-9])|([6][6])|([7][3,5,6,7,8])|([8][0-9])|([9][8,9]))[0-9]{8}$";// 验证手机号
+        if(StringUtils.isNotBlank(str)){
+            return str.matches(s2);
+        }
+        return b;
+    }
+
+
+
+    /**
+     * 校验字符串不为空.
+     *
+     * @param str the str
+     * @param message the message
+     */
+    public static void checkNotEmpty(final String str, final String message) {
+        if (null == str || str.isEmpty()) {
+            throw new IllegalArgumentException(message);
+        }
+    }
+
+    /**
+     * 校验集合不为空.
+     *
+     * @param coll the Collection
+     * @param message the message
+     */
+    public static void checkNotEmpty(final Collection coll, final String message) {
+        if (null == coll || coll.isEmpty()) {
+            throw new IllegalArgumentException(message);
+        }
+    }
+}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/util/SmsChuangLanUtils.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/util/SmsChuangLanUtils.java
new file mode 100644
index 0000000..98277bf
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-biz/src/main/java/com/kidgrow/sms/util/SmsChuangLanUtils.java
@@ -0,0 +1,63 @@
+package com.kidgrow.sms.util;
+
+import com.alibaba.fastjson.JSONObject;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+public class SmsChuangLanUtils {
+    public static void main(String[] args) {
+        //短信下发
+        String sendUrl = "http://smssh1.253.com/msg/send/json";
+        Map map = new HashMap();
+        map.put("account","N2561124");//API账号
+        map.put("password","Mguj6qlRWX7b5e");//API密码
+        map.put("msg","123123");//短信内容
+        map.put("phone","18600376209");//手机号
+        map.put("report","false");//是否需要状态报告
+        JSONObject js = (JSONObject) JSONObject.toJSON(map);
+        System.out.println(sendSmsByPost(sendUrl,js.toString()));
+    }
+    public static String send(Map map,String url){
+        JSONObject js = (JSONObject) JSONObject.toJSON(map);
+        return sendSmsByPost(url,js.toString());
+
+    }
+    public static String sendSmsByPost(String path, String postContent) {
+        URL url = null;
+        try {
+            url = new URL(path);
+            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
+            httpURLConnection.setRequestMethod("POST");
+            httpURLConnection.setConnectTimeout(10000);
+            httpURLConnection.setReadTimeout(10000);
+            httpURLConnection.setDoOutput(true);
+            httpURLConnection.setDoInput(true);
+            httpURLConnection.setRequestProperty("Charset", "UTF-8");
+            httpURLConnection.setRequestProperty("Content-Type", "application/json");
+            httpURLConnection.connect();
+            OutputStream os=httpURLConnection.getOutputStream();
+            os.write(postContent.getBytes("UTF-8"));
+            os.flush();
+            StringBuilder sb = new StringBuilder();
+            int httpRspCode = httpURLConnection.getResponseCode();
+            if (httpRspCode == HttpURLConnection.HTTP_OK) {
+                BufferedReader br = new BufferedReader(
+                        new InputStreamReader(httpURLConnection.getInputStream(), "utf-8"));
+                String line = null;
+                while ((line = br.readLine()) != null) {
+                    sb.append(line);
+                }
+                br.close();
+                return sb.toString();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/Dockerfile b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/Dockerfile
new file mode 100644
index 0000000..f28a337
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-Xms64m","-Xmx128m","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/pom.xml b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/pom.xml
new file mode 100644
index 0000000..fe6fc2d
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/pom.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>kidgrow-plugin-sms</artifactId>
+        <groupId>com.kidgrow</groupId>
+        <version>1.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>kidgrow-plugin-sms-center-server</artifactId>
+<dependencies>
+    <dependency>
+        <groupId>com.kidgrow</groupId>
+        <artifactId>kidgrow-config</artifactId>
+    </dependency>
+    <dependency>
+        <groupId>com.kidgrow</groupId>
+        <artifactId>kidgrow-plugin-sms-api</artifactId>
+    </dependency>
+    <dependency>
+        <groupId>com.kidgrow</groupId>
+        <artifactId>kidgrow-plugin-sms-biz</artifactId>
+    </dependency>
+
+</dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/SmsApplication.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/SmsApplication.java
similarity index 100%
rename from kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/SmsApplication.java
rename to kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/SmsApplication.java
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java
new file mode 100644
index 0000000..80ffb22
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java
@@ -0,0 +1,46 @@
+package com.kidgrow.sms.aliyun.config;
+
+import com.kidgrow.sms.client.SmsClient;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云 SMS 自动配置<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:11 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Configuration
+@ConditionalOnClass(name = "com.aliyuncs.IAcsClient")
+@EnableConfigurationProperties(SmsProperties.class)
+public class SmsAutoConfiguration {
+    private final SmsProperties smsProperties;
+
+    public SmsAutoConfiguration(final SmsProperties smsProperties) {
+        this.smsProperties = smsProperties;
+    }
+
+    /**
+     * Configuration SmsClient bean.
+     *
+     * @return the sms client
+     */
+    @Bean
+    @ConditionalOnMissingBean
+    public SmsClient smsClient() {
+        if (this.smsProperties.getTemplates() == null) {
+            return new SmsClient(this.smsProperties.getAccessKeyId(), this.smsProperties.getAccessKeySecret());
+        } else {
+            return new SmsClient(
+                    this.smsProperties.getAccessKeyId(),
+                    this.smsProperties.getAccessKeySecret(),
+                    this.smsProperties.getTemplates());
+        }
+    }
+}
+
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java
new file mode 100644
index 0000000..103737d
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java
@@ -0,0 +1,37 @@
+package com.kidgrow.sms.aliyun.config;
+
+import com.kidgrow.sms.template.SmsTemplate;
+import lombok.Data;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 阿里云 SMS 配置属性<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:10 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Data
+@ConfigurationProperties(prefix = "aliyun.sms")
+public class SmsProperties implements InitializingBean {
+
+    private String accessKeyId;
+    private String accessKeySecret;
+    private String signName;
+    private Map<String, SmsTemplate> templates;
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        if (null != this.templates) {
+            for (final SmsTemplate smsTemplate : this.templates.values()) {
+                if (null == smsTemplate.getSignName()) {
+                    smsTemplate.setSignName(this.signName);
+                }
+            }
+        }
+    }
+}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java
new file mode 100644
index 0000000..af27f80
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java
@@ -0,0 +1,133 @@
+package com.kidgrow.sms.aliyun.controller;
+
+import com.kidgrow.common.base.ResponseCode;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.redis.template.RedisRepository;
+import com.kidgrow.sms.client.SmsClient;
+import com.kidgrow.sms.exception.SmsException;
+import com.kidgrow.sms.service.AliyunSmsService;
+import com.kidgrow.sms.model.SmsModel;
+import com.kidgrow.sms.util.AliyunSmsUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/17 09:15 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@RestController
+@RequestMapping("sms")
+public class SmsController implements AliyunSmsService {
+
+    @Autowired
+    private SmsClient smsClient;
+
+    @Autowired
+    private RedisRepository redisRepository;
+
+    @Value("${sms.verificationCode.timeOut:180}")
+    private Long timeOut;
+
+    @Value("${sms.verificationCode.prefix:default}")
+    private String smsPrefix;
+
+    /**
+     * 发送短信验证码
+     *
+     * @param smsModel
+     */
+    @Override
+    public ResultBody sendVerificationCode(@RequestBody SmsModel smsModel) {
+        String phoneNumber = smsModel.getPhoneNumber();
+        String key = smsModel.getKey();
+        if (StringUtils.isBlank(phoneNumber) || StringUtils.isBlank(key)) {
+            return ResultBody.fail(ResponseCode.ERROR_PARAMS, "手机号或短信模板不能为空!");
+        }
+        if (!AliyunSmsUtils.isMobile(phoneNumber)) {
+            return ResultBody.fail(ResponseCode.ERROR_PARAMS, "手机号格式不正确!");
+        }
+        try {
+            // 发送验证码
+            Integer code = smsClient.sendVerificationCode(key, phoneNumber);
+            // 缓存验证码和有效期
+            redisRepository.setExpire(smsPrefix + phoneNumber, code.toString(), timeOut);
+//            redisRepository.expire(smsPrefix + phoneNumber, timeOut);
+            return ResultBody.ok();
+        } catch (SmsException smsEx) {
+            smsEx.printStackTrace();
+            return ResultBody.failed().msg(smsEx.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultBody.failed().msg(e.getMessage());
+        }
+    }
+
+    /**
+     * 验证码校验
+     *
+     * @param smsModel
+     */
+    @Override
+    public ResultBody validateVerificationCode(@RequestBody SmsModel smsModel) {
+        String phoneNumber = smsModel.getPhoneNumber();
+        String code = smsModel.getCode();
+        if (StringUtils.isBlank(phoneNumber) || StringUtils.isBlank(code)) {
+            return ResultBody.failed(ResponseCode.ERROR_PARAMS, "手机号或验证码不能为空!");
+        }
+        try {
+            if (redisRepository.exists(smsPrefix + phoneNumber)) {
+                String rightCode = (String) redisRepository.get(smsPrefix + phoneNumber);
+                if (code.equals(rightCode)) {
+                    // 验证成功 移除缓存验证码
+                    redisRepository.del(smsPrefix + phoneNumber);
+                    return ResultBody.ok();
+                } else {
+                    return ResultBody.failed(ResponseCode.ERROR_PARAMS, "验证码不正确!");
+                }
+            } else {
+                return ResultBody.failed(ResponseCode.ERROR_PARAMS, "验证码已失效!");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultBody.failed("系统错误");
+        }
+    }
+
+    /**
+     * 发送手机短信消息
+     *
+     * @param smsModel
+     * @return
+     */
+    @Override
+    public ResultBody sendSmsMsg(SmsModel smsModel) {
+        List<String> phoneNumbers = smsModel.getPhoneNumbers();
+        String key = smsModel.getKey();
+//        if ((phoneNumbers == null || phoneNumbers.isEmpty()) || StringUtils.isBlank(key)) {
+//            return ResponseBuilder.buildResultError(ResponseCode.ERROR_PARAMS, "手机号或短信模板不能为空!");
+//        }
+
+        try {
+            // 发送手机短信消息
+            smsClient.sendSmsMsg(key, smsModel.getParams(), phoneNumbers);
+            return ResultBody.ok();
+        } catch (SmsException smsEx) {
+            smsEx.printStackTrace();
+            return ResultBody.failed(smsEx.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultBody.failed(e.getMessage());
+        }
+    }
+}
+
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/lanchuang/controller/SmsChuangLanController.java b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/lanchuang/controller/SmsChuangLanController.java
new file mode 100644
index 0000000..12ba9dc
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/java/com/kidgrow/sms/lanchuang/controller/SmsChuangLanController.java
@@ -0,0 +1,156 @@
+package com.kidgrow.sms.lanchuang.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.utils.DateUtils;
+import com.kidgrow.redis.util.RedisUtils;
+import com.kidgrow.sms.util.SmsChuangLanUtils;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+
+@RestController
+@RequestMapping("smsChangLan")
+@Api(tags = "创蓝短信模块")
+public class SmsChuangLanController {
+    @Value("${chuanglan.sms.sendUrl}")
+    private String CHUANGLAN_SMS_SENDURL;
+    @Value("${chuanglan.sms.account}")
+    private String CHUANGLAN_SMS_ACCOUNT;
+    @Value("${chuanglan.sms.password}")
+    private String CHUANGLAN_SMS_PASSWORD;
+    @Value("${chuanglan.sms.num}")
+    private Integer CHUANGLAN_SMS_NUM;
+    @Value("${chuanglan.sms.timeLimit}")
+    private Integer CHUANGLAN_SMS_TIMELIMIT;
+    @Autowired
+    private RedisUtils redisUtils;
+
+    /**
+     * type  为类型, "type":"LOGIN_SMS"  为登录,"type":"PASSWORD_SMS" 为密码找回,"type":"REGISTER_SMS" 为
+     * @param map
+     * @return
+     */
+    @PostMapping("send")
+    public ResultBody sendVerificationCode(@RequestBody Map map) {
+        if(CHUANGLAN_SMS_NUM==null){
+            CHUANGLAN_SMS_NUM=5;
+        }
+        Object phone = map.get("phone");
+        if (map.get("phone")==null||"".equals(map.get("phone"))){
+            return ResultBody.failed("请输入手机号");
+        }
+        Object type = map.get("type");
+        if (map.get("type")==null||"".equals(map.get("type"))){
+            return ResultBody.failed("请输入保存的类型");
+        }
+        String verificationCode="";
+        Random random=new Random();
+        for (int i = 0; i < 6; i++) {
+            int i1 = random.nextInt(9);
+            verificationCode+=i1;
+        }
+        try {
+            //组装发送消息的内容
+            map.put("account", CHUANGLAN_SMS_ACCOUNT);//API账号
+            map.put("password", CHUANGLAN_SMS_PASSWORD);//API密码
+            map.put("report","false");
+            map.put("msg","您好,您的验证码是"+verificationCode);
+            //在Redis中获取
+            Object hget = redisUtils.hget(map.get("type").toString(), map.get("phone").toString());
+            JSONObject jsonObject =new JSONObject();
+            Map<String,Object> cunMap=new HashMap<>();
+            cunMap.put("verificationCode",verificationCode);
+            cunMap.put("count",CHUANGLAN_SMS_NUM);//总共
+            if(hget==null){
+                String send = SmsChuangLanUtils.send(map, CHUANGLAN_SMS_SENDURL);
+                jsonObject=JSON.parseObject(send);
+                String s1 = DateUtils.formatCurrentDateTime();
+                cunMap.put("date",s1);
+                cunMap.put("remnant",CHUANGLAN_SMS_NUM-1);//剩余
+                Date date2 = DateUtils.addMilliseconds(DateUtils.parseDate(s1), CHUANGLAN_SMS_TIMELIMIT);
+                cunMap.put("endTime",DateUtils.formatDateTime(date2));
+            }else {
+                JSONObject redisJson = JSON.parseObject(JSON.toJSONString(hget));
+                Object remnantObject = redisJson.get("remnant");
+                if(remnantObject instanceof Integer){
+                    Integer remnant=(Integer)remnantObject;
+                    if(remnant>0){
+                        String send = SmsChuangLanUtils.send(map, CHUANGLAN_SMS_SENDURL);
+                        jsonObject=JSON.parseObject(send);
+                        String s1 = DateUtils.formatCurrentDateTime();
+                        cunMap.put("date",DateUtils.formatCurrentDateTime());
+                        cunMap.put("remnant",remnant-1);//剩余
+                        Date date2 = DateUtils.addMilliseconds(DateUtils.parseDate(s1), CHUANGLAN_SMS_TIMELIMIT);
+                        cunMap.put("endTime",DateUtils.formatDateTime(date2));
+                    }else{
+                        return ResultBody.failed().data("每个手机号限用"+CHUANGLAN_SMS_NUM+"次");
+                    }
+                }else {
+                    return ResultBody.failed();
+                }
+            }
+            if ("0".equals(jsonObject.get("code"))) {
+                redisUtils.hset(map.get("type").toString(), map.get("phone").toString(),cunMap,DateUtils.getSecondsNextEarlyMorning());
+//                return ResultBody.ok().data(verificationCode);
+                return ResultBody.ok();
+            } else {
+                return ResultBody.failed();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultBody.failed();
+        }
+    }
+    @PostMapping("verification")
+    public ResultBody verification(@RequestBody Map<String,Object> map){
+        Object phone = map.get("phone");
+        if (map.get("phone")==null||"".equals(map.get("phone"))){
+            return ResultBody.failed("请输入手机号");
+        }
+        Object verificationCode = map.get("verificationCode");
+        if (map.get("verificationCode")==null||"".equals(map.get("verificationCode"))){
+            return ResultBody.failed("请输入保存的类型");
+        }
+        Object type = map.get("type");
+        if (map.get("type")==null||"".equals(map.get("type"))){
+            return ResultBody.failed("请输入保存的类型");
+        }
+        Object hget = redisUtils.hget(map.get("type").toString(), map.get("phone").toString());
+        if(hget!=null){
+            JSONObject redisJson = JSON.parseObject(JSON.toJSONString(hget));
+            Object verificationCodeObject = redisJson.get("verificationCode");
+            if(verificationCode.equals(verificationCodeObject)){
+                Object date = redisJson.get("date");
+                long time = DateUtils.addMilliseconds(DateUtils.parseDate(date.toString()), CHUANGLAN_SMS_TIMELIMIT).getTime();
+                Date dateNow=new Date();
+                long timeNow = dateNow.getTime();
+                if(timeNow<=time){
+                    return ResultBody.ok();
+                }else {
+                    return ResultBody.failed("验证码超时");
+                }
+            }else {
+                return ResultBody.failed("验证码错误");
+            }
+        }else {
+            return ResultBody.failed("该手机号没有验证码");
+        }
+    }
+    //获取 存放 Redis的时间 秒(到今晚的秒数)
+    public Long getSecondsNextEarlyMorning() {
+        Date afterDay = DateUtils.getAfterDay(new Date());
+        String s = DateUtils.formatDate(afterDay, null);
+        Date date = DateUtils.parseDate(s);
+        System.out.println(date.getTime()-System.currentTimeMillis());
+        long second= (date.getTime()-System.currentTimeMillis())/1000;
+        return second;
+    }
+}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/resources/application.yml b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/resources/application.yml
new file mode 100644
index 0000000..60b60a3
--- /dev/null
+++ b/kidgrow-plugin/kidgrow-plugin-sms/kidgrow-plugin-sms-center-server/src/main/resources/application.yml
@@ -0,0 +1,58 @@
+#创蓝
+chuanglan:
+  sms:
+    sendUrl: http://smssh1.253.com/msg/send/json
+    account: N2561124
+    password: Mguj6qlRWX7b5e
+    num: 5
+    timeLimit: 720000
+#阿里云相关
+aliyun:
+  sms:
+    accessKeyId: LTAIX1whVSBUUKNW
+    accessKeySecret: j7UywJDoUkPRvGafKrik1pyYtEC2ys
+    signName: 微课堂
+    templates:
+      ### 模板key
+      key1:
+        ## 模板code 需要在阿里云控制台设置
+        templateCode: SMS_151231928 # 与阿里云设置的保持一致,模板内容需在后面加上,方便使用:****
+      key2:
+        templateCode: SMS_105665033 # 与阿里云设置的保持一致,模板内容需在后面加上,方便使用:****
+  commonRequest:
+    domain: dysmsapi.aliyuncs.com
+    ## 版本号
+    version: 2017-05-25
+    ##
+    action: SendSms
+
+## 短信验证码过期时间,时间单位/秒
+sms:
+  verificationCode:
+    ## 短信验证码过期时间,时间单位/秒
+    timeOut: 120
+    ##  缓存手机号key值前缀
+    prefix: "sms:aliyun:code:"
+
+server:
+  tomcat:
+    uri-encoding: UTF-8
+    max-threads: 1000
+    min-spare-threads: 30
+  port: 8008
+#    context-path: /
+
+
+
+eureka:
+  instance:
+    ###注册中心ip地址
+    hostname: ${kidgrow.eureka.instance.hostname}
+    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
+    prefer-ip-address: true
+  client:
+    serviceUrl:
+      defaultZone: ${kidgrow.eureka.client.serviceUrl.defaultZone}
+spring:
+  application:
+    name: sms-service-server
\ No newline at end of file
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/pom.xml b/kidgrow-plugin/kidgrow-plugin-sms/pom.xml
index 5f40342..6e2eef0 100644
--- a/kidgrow-plugin/kidgrow-plugin-sms/pom.xml
+++ b/kidgrow-plugin/kidgrow-plugin-sms/pom.xml
@@ -10,43 +10,25 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>kidgrow-plugin-sms</artifactId>
-
-
+    <packaging>pom</packaging>
+    <modules>
+        <module>kidgrow-plugin-sms-api</module>
+        <module>kidgrow-plugin-sms-biz</module>
+        <module>kidgrow-plugin-sms-center-server</module>
+    </modules>
     <dependencies>
-        <dependency>
-            <groupId>com.kidgrow</groupId>
-            <artifactId>kidgrow-config</artifactId>
-        </dependency>
+
         <dependency>
             <groupId>com.kidgrow</groupId>
             <artifactId>kidgrow-common-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-redis-spring-boot-starter</artifactId>
         </dependency>
         <dependency>
             <groupId>com.aliyun</groupId>
             <artifactId>aliyun-java-sdk-core</artifactId>
         </dependency>
     </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-deploy-plugin</artifactId>
-                <configuration>
-                    <skip>true</skip>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/client/SmsClient.java b/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/client/SmsClient.java
deleted file mode 100644
index 4f365ae..0000000
--- a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/client/SmsClient.java
+++ /dev/null
@@ -1,215 +0,0 @@
-package com.kidgrow.sms.aliyun.client;
-
-import com.aliyuncs.CommonRequest;
-import com.aliyuncs.CommonResponse;
-import com.aliyuncs.DefaultAcsClient;
-import com.aliyuncs.IAcsClient;
-import com.aliyuncs.exceptions.ClientException;
-import com.aliyuncs.http.MethodType;
-import com.aliyuncs.profile.DefaultProfile;
-import com.aliyuncs.profile.IClientProfile;
-import com.google.gson.Gson;
-import com.kidgrow.sms.aliyun.exception.SmsException;
-import com.kidgrow.sms.aliyun.template.BatchSmsTemplate;
-import com.kidgrow.sms.aliyun.template.SmsTemplate;
-import com.kidgrow.sms.aliyun.util.AliyunSmsUtils;
-import org.springframework.beans.factory.annotation.Value;
-
-import java.util.*;
-
-/**
- * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
- *
- * @Description: 阿里云 SMS 客户端<br>
- * @Project: <br>
- * @CreateDate: Created in 2020/2/17 09:07 <br>
- * @Author: <a href="4345453@kidgrow.com">liuke</a>
- */
-public class SmsClient {
-    private final IAcsClient acsClient;
-    private final Map<String, SmsTemplate> smsTemplates;
-    private final Gson gson = new Gson();
-
-    @Value("${aliyun.commonRequest.domain}")
-    private String domain;
-
-    @Value("${aliyun.commonRequest.version}")
-    private String version;
-
-    @Value("${aliyun.commonRequest.action}")
-    private String action;
-
-    /**
-     * Instantiates a new SmsClient.
-     *
-     * @param accessKeyId 阿里云短信 accessKeyId
-     * @param accessKeySecret 阿里云短信 accessKeySecret
-     */
-    public SmsClient(final String accessKeyId, final String accessKeySecret) {
-        this(accessKeyId, accessKeySecret, Collections.emptyMap());
-    }
-
-    /**
-     * Instantiates a new SmsClient.
-     *
-     * @param accessKeyId 阿里云短信 accessKeyId
-     * @param accessKeySecret 阿里云短信 accessKeySecret
-     * @param smsTemplates 预置短信模板
-     */
-    public SmsClient(final String accessKeyId,
-                     final String accessKeySecret,
-                     final Map<String, SmsTemplate> smsTemplates) {
-        AliyunSmsUtils.checkNotEmpty(accessKeyId, "'accessKeyId' must be not empty");
-        AliyunSmsUtils.checkNotEmpty(accessKeySecret, "'accessKeySecret' must be not empty");
-
-        final IClientProfile clientProfile = DefaultProfile.getProfile(
-                "default", accessKeyId, accessKeySecret);
-
-        this.acsClient = new DefaultAcsClient(clientProfile);
-        this.smsTemplates = smsTemplates;
-    }
-
-    /**
-     * Instantiates a new SmsClient.
-     *
-     * @param acsClient IAcsClient
-     * @param smsTemplates 预置短信模板
-     */
-    public SmsClient(final IAcsClient acsClient, final Map<String, SmsTemplate> smsTemplates) {
-        this.acsClient = acsClient;
-        this.smsTemplates = smsTemplates;
-    }
-
-    /**
-     * 发送短信验证码.
-     *
-     * @param phoneNumber 手机号码(中国)
-     *
-     * @return 6 位数的随机码
-     */
-    public int sendVerificationCode(final String smsTemplateKey, final String phoneNumber) {
-        AliyunSmsUtils.checkPhoneNumber(phoneNumber);
-        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
-        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
-
-        final int code = AliyunSmsUtils.randomCode();
-        smsTemplate.setTemplateParam(Collections.singletonMap("code", String.valueOf(code)));
-        smsTemplate.setPhoneNumbers(Collections.singletonList(phoneNumber));
-        send(smsTemplate);
-        return code;
-    }
-
-    /**
-     * 发送消息 支持群发
-     * @param smsTemplateKey
-     * @param params
-     * @param phoneNumbers
-     */
-    public void sendSmsMsg(final String smsTemplateKey, Map<String, String> params, final List<String> phoneNumbers){
-        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
-        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
-
-        smsTemplate.setTemplateParam(params);
-        smsTemplate.setPhoneNumbers(phoneNumbers);
-        send(smsTemplate);
-    }
-
-    /**
-     * 发送短信.
-     *
-     * @param smsTemplateKey 预置短信模板 key
-     */
-    public void send(final String smsTemplateKey) {
-        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
-        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
-
-        send(smsTemplate);
-    }
-
-    /**
-     * 发送短信.
-     *
-     * @param smsTemplateKey 预置短信模板 key
-     * @param phoneNumbers 手机号码,优先于预置短信模板中配置的手机号码
-     */
-    public void send(final String smsTemplateKey, final String... phoneNumbers) {
-        final SmsTemplate smsTemplate = this.smsTemplates.get(smsTemplateKey);
-        Objects.requireNonNull(smsTemplate, () -> "SmsTemplate must be not null, key:" + smsTemplateKey);
-
-        smsTemplate.setPhoneNumbers(Arrays.asList(phoneNumbers));
-        send(smsTemplate);
-    }
-
-    /**
-     * 发送短信.
-     *
-     * @param smsTemplate 短信模板
-     */
-    public void send(final SmsTemplate smsTemplate) {
-        Objects.requireNonNull(smsTemplate);
-        AliyunSmsUtils.checkSmsTemplate(smsTemplate);
-
-        final CommonRequest request = new CommonRequest();
-        request.setSysMethod(MethodType.POST);
-        request.setSysDomain(domain);
-        request.setSysVersion(version);
-        request.setSysAction(action);
-        request.putQueryParameter("PhoneNumbers", String.join(",", smsTemplate.getPhoneNumbers()));
-        request.putQueryParameter("SignName", smsTemplate.getSignName());
-        request.putQueryParameter("TemplateCode", smsTemplate.getTemplateCode());
-        request.putQueryParameter("TemplateParam", AliyunSmsUtils.toJsonStr(smsTemplate.getTemplateParam()));
-        try {
-            final CommonResponse response = this.acsClient.getCommonResponse(request);
-            AliyunSmsUtils.checkSmsResponse(response);
-        }
-        catch (final ClientException e) {
-            throw new SmsException(e);
-        }
-    }
-
-    /**
-     * 批量发送短信.
-     *
-     * <p>
-     * 批量发送短信接口,支持在一次请求中分别向多个不同的手机号码发送不同签名的短信。
-     * 手机号码,签名,模板参数字段个数相同,一一对应,短信服务根据字段的顺序判断发往指定手机号码的签名。
-     *
-     * <p>
-     * 如果您需要往多个手机号码中发送同样签名的短信,请使用 {@link #send(SmsTemplate)}。
-     *
-     * @param batchSmsTemplate 批量发送短信模板
-     */
-    public void send(final BatchSmsTemplate batchSmsTemplate) {
-        Objects.requireNonNull(batchSmsTemplate);
-        AliyunSmsUtils.checkBatchSmsTemplate(batchSmsTemplate);
-
-        final CommonRequest request = new CommonRequest();
-        request.setSysMethod(MethodType.POST);
-        request.setSysDomain("dysmsapi.aliyuncs.com");
-        request.setSysVersion("2017-05-25");
-        request.setSysAction("SendBatchSms");
-        request.putQueryParameter("PhoneNumberJson", this.gson.toJson(batchSmsTemplate.getPhoneNumbers()));
-        request.putQueryParameter("SignNameJson", this.gson.toJson(batchSmsTemplate.getSignNames()));
-        request.putQueryParameter("TemplateCode", batchSmsTemplate.getTemplateCode());
-        request.putQueryParameter("TemplateParamJson", this.gson.toJson(batchSmsTemplate.getTemplateParams()));
-        try {
-            final CommonResponse response = this.acsClient.getCommonResponse(request);
-            AliyunSmsUtils.checkSmsResponse(response);
-        }
-        catch (final ClientException e) {
-            throw new SmsException(e);
-        }
-    }
-
-//    public static void main(String[] args) {
-//        Map<String, SmsTemplate> smsTemplates = new HashMap<>();
-//        SmsTemplate smsTemplate = SmsTemplate.builder()
-//                .signName("模板名称")
-//                .templateCode("模板code")
-//                .addTemplateParam("code", "123456")
-//                .build();
-//        smsTemplates.put("aaa",smsTemplate);
-//        SmsClient smsClient = new SmsClient("aaaa","aaaaa",smsTemplates);
-//        smsClient.sendVerificationCode("aaa","18503198351");
-//    }
-}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java b/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java
deleted file mode 100644
index 2d95d2f..0000000
--- a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/config/SmsAutoConfiguration.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.kidgrow.sms.aliyun.config;
-
-import com.kidgrow.sms.aliyun.client.SmsClient;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
- *
- * @Description: 阿里云 SMS 自动配置<br>
- * @Project: <br>
- * @CreateDate: Created in 2020/2/17 09:11 <br>
- * @Author: <a href="4345453@kidgrow.com">liuke</a>
- */
-@Configuration
-@ConditionalOnClass(name = "com.aliyuncs.IAcsClient")
-@EnableConfigurationProperties(SmsProperties.class)
-public class SmsAutoConfiguration {
-    private final SmsProperties smsProperties;
-
-    public SmsAutoConfiguration(final SmsProperties smsProperties) {
-        this.smsProperties = smsProperties;
-    }
-
-    /**
-     * Configuration SmsClient bean.
-     *
-     * @return the sms client
-     */
-    @Bean
-    @ConditionalOnMissingBean
-    public SmsClient smsClient() {
-        if (this.smsProperties.getTemplates() == null) {
-            return new SmsClient(this.smsProperties.getAccessKeyId(), this.smsProperties.getAccessKeySecret());
-        } else {
-            return new SmsClient(
-                    this.smsProperties.getAccessKeyId(),
-                    this.smsProperties.getAccessKeySecret(),
-                    this.smsProperties.getTemplates());
-        }
-    }
-}
-
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java b/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java
deleted file mode 100644
index 79bda63..0000000
--- a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/config/SmsProperties.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.kidgrow.sms.aliyun.config;
-
-import com.kidgrow.sms.aliyun.template.SmsTemplate;
-import lombok.Data;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-import java.util.Map;
-
-/**
- * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
- *
- * @Description: 阿里云 SMS 配置属性<br>
- * @Project: <br>
- * @CreateDate: Created in 2020/2/17 09:10 <br>
- * @Author: <a href="4345453@kidgrow.com">liuke</a>
- */
-@Data
-@ConfigurationProperties(prefix = "aliyun.sms")
-public class SmsProperties implements InitializingBean {
-
-    private String accessKeyId;
-    private String accessKeySecret;
-    private String signName;
-    private Map<String, SmsTemplate> templates;
-
-    @Override
-    public void afterPropertiesSet() throws Exception {
-        if (null != this.templates) {
-            for (final SmsTemplate smsTemplate : this.templates.values()) {
-                if (null == smsTemplate.getSignName()) {
-                    smsTemplate.setSignName(this.signName);
-                }
-            }
-        }
-    }
-}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java b/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java
deleted file mode 100644
index 9bea8d5..0000000
--- a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/controller/SmsController.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package com.kidgrow.sms.aliyun.controller;
-
-import com.kidgrow.common.base.ResponseCode;
-import com.kidgrow.common.model.ResultBody;
-import com.kidgrow.redis.template.RedisRepository;
-import com.kidgrow.sms.aliyun.client.SmsClient;
-import com.kidgrow.sms.aliyun.exception.SmsException;
-import com.kidgrow.sms.aliyun.model.SmsModel;
-import com.kidgrow.sms.aliyun.service.AliyunSmsService;
-import com.kidgrow.sms.aliyun.util.AliyunSmsUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-
-/**
- * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
- *
- * @Description: <br>
- * @Project: <br>
- * @CreateDate: Created in 2020/2/17 09:15 <br>
- * @Author: <a href="4345453@kidgrow.com">liuke</a>
- */
-@RestController
-@RequestMapping("sms")
-public class SmsController implements AliyunSmsService {
-
-    @Autowired
-    private SmsClient smsClient;
-
-    @Autowired
-    private RedisRepository redisRepository;
-
-    @Value("${sms.verificationCode.timeOut:180}")
-    private Long timeOut;
-
-    @Value("${sms.verificationCode.prefix:default}")
-    private String smsPrefix;
-
-    /**
-     * 发送短信验证码
-     *
-     * @param smsModel
-     */
-    @Override
-    public ResultBody sendVerificationCode(@RequestBody SmsModel smsModel) {
-        String phoneNumber = smsModel.getPhoneNumber();
-        String key = smsModel.getKey();
-        if (StringUtils.isBlank(phoneNumber) || StringUtils.isBlank(key)) {
-            return ResultBody.fail(ResponseCode.ERROR_PARAMS, "手机号或短信模板不能为空!");
-        }
-        if (!AliyunSmsUtils.isMobile(phoneNumber)) {
-            return ResultBody.fail(ResponseCode.ERROR_PARAMS, "手机号格式不正确!");
-        }
-        try {
-            // 发送验证码
-            Integer code = smsClient.sendVerificationCode(key, phoneNumber);
-            // 缓存验证码和有效期
-            redisRepository.setExpire(smsPrefix + phoneNumber, code.toString(), timeOut);
-//            redisRepository.expire(smsPrefix + phoneNumber, timeOut);
-            return ResultBody.ok();
-        } catch (SmsException smsEx) {
-            smsEx.printStackTrace();
-            return ResultBody.failed().msg(smsEx.getMessage());
-        } catch (Exception e) {
-            e.printStackTrace();
-            return ResultBody.failed().msg(e.getMessage());
-        }
-    }
-
-    /**
-     * 验证码校验
-     *
-     * @param smsModel
-     */
-    @Override
-    public ResultBody validateVerificationCode(@RequestBody SmsModel smsModel) {
-        String phoneNumber = smsModel.getPhoneNumber();
-        String code = smsModel.getCode();
-        if (StringUtils.isBlank(phoneNumber) || StringUtils.isBlank(code)) {
-            return ResultBody.failed(ResponseCode.ERROR_PARAMS, "手机号或验证码不能为空!");
-        }
-        try {
-            if (redisRepository.exists(smsPrefix + phoneNumber)) {
-                String rightCode = (String) redisRepository.get(smsPrefix + phoneNumber);
-                if (code.equals(rightCode)) {
-                    // 验证成功 移除缓存验证码
-                    redisRepository.del(smsPrefix + phoneNumber);
-                    return ResultBody.ok();
-                } else {
-                    return ResultBody.failed(ResponseCode.ERROR_PARAMS, "验证码不正确!");
-                }
-            } else {
-                return ResultBody.failed(ResponseCode.ERROR_PARAMS, "验证码已失效!");
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            return ResultBody.failed("系统错误");
-        }
-    }
-
-    /**
-     * 发送手机短信消息
-     *
-     * @param smsModel
-     * @return
-     */
-    @Override
-    public ResultBody sendSmsMsg(SmsModel smsModel) {
-        List<String> phoneNumbers = smsModel.getPhoneNumbers();
-        String key = smsModel.getKey();
-//        if ((phoneNumbers == null || phoneNumbers.isEmpty()) || StringUtils.isBlank(key)) {
-//            return ResponseBuilder.buildResultError(ResponseCode.ERROR_PARAMS, "手机号或短信模板不能为空!");
-//        }
-
-        try {
-            // 发送手机短信消息
-            smsClient.sendSmsMsg(key, smsModel.getParams(), phoneNumbers);
-            return ResultBody.ok();
-        } catch (SmsException smsEx) {
-            smsEx.printStackTrace();
-            return ResultBody.failed(smsEx.getMessage());
-        } catch (Exception e) {
-            e.printStackTrace();
-            return ResultBody.failed(e.getMessage());
-        }
-    }
-}
-
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/exception/SmsException.java b/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/exception/SmsException.java
deleted file mode 100644
index 4c3d5ad..0000000
--- a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/exception/SmsException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.kidgrow.sms.aliyun.exception;
-
-import com.kidgrow.common.exception.KidgrowException;
-
-/**
- * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
- *
- * @Description: <br>
- * @Project: <br>
- * @CreateDate: Created in 2020/2/17 08:57 <br>
- * @Author: <a href="4345453@kidgrow.com">liuke</a>
- */
-public class SmsException extends KidgrowException {
-    /**
-     * Instantiates a new SmsException.
-     *
-     * @param message the message
-     */
-    public SmsException(final String message) {
-        super(message);
-    }
-
-    /**
-     * Instantiates a new SmsException.
-     *
-     * @param cause the cause
-     */
-    public SmsException(final Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/model/SmsModel.java b/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/model/SmsModel.java
deleted file mode 100644
index 337c274..0000000
--- a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/model/SmsModel.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.kidgrow.sms.aliyun.model;
-
-import io.swagger.annotations.ApiModel;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
- *
- * @Description: 发送短信实体类<br>
- * @Project: <br>
- * @CreateDate: Created in 2020/2/17 09:18 <br>
- * @Author: <a href="4345453@kidgrow.com">liuke</a>
- */
-@ApiModel(value = "发送短信实体类")
-@Data
-public class SmsModel implements Serializable {
-
-    private String phoneNumber; //手机号
-    private String key; // 短信模板key
-    private String code; // 短信验证码
-    private Map<String,String> params; // 内容 key 值要与模板一致
-    private List<String> phoneNumbers; // 群发消息时使用
-
-}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/service/AliyunSmsService.java b/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/service/AliyunSmsService.java
deleted file mode 100644
index 24659f6..0000000
--- a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/service/AliyunSmsService.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.kidgrow.sms.aliyun.service;
-
-import com.kidgrow.common.model.ResultBody;
-import com.kidgrow.sms.aliyun.model.SmsModel;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-
-/**
- * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
- *
- * @Description: 对外API 短信发送和验证码校验接口 feignClient 继承这个接口 即可调用<br>
- * @Project: <br>
- * @CreateDate: Created in 2020/2/17 09:20 <br>
- * @Author: <a href="4345453@kidgrow.com">liuke</a>
- */
-@Api(tags = "短信发送服务")
-public interface AliyunSmsService {
-
-    /**
-     * 发送手机验证码
-     * @param smsModel
-     */
-    @ApiOperation(value = "发送短信验证码接口")
-    @PostMapping("/send/verificationCode")
-    ResultBody sendVerificationCode(@RequestBody SmsModel smsModel);
-
-    /**
-     * 校验手机验证码是否正确
-     * @param smsModel
-     */
-    @ApiOperation(value = "验证短信验证码接口")
-    @PostMapping("/validate/verificationCode")
-    ResultBody validateVerificationCode(@RequestBody SmsModel smsModel);
-
-    /**
-     * 发送手机短信消息
-     * @param smsModel
-     */
-    @ApiOperation(value = "发送手机短信消息接口")
-    @PostMapping("/send/smsMsg")
-    ResultBody sendSmsMsg(@RequestBody SmsModel smsModel);
-}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/template/BatchSmsTemplate.java b/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/template/BatchSmsTemplate.java
deleted file mode 100644
index 98521cb..0000000
--- a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/template/BatchSmsTemplate.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.kidgrow.sms.aliyun.template;
-
-import lombok.*;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
- *
- * @Description: 阿里云调用批量模板<br>
- * @Project: <br>
- * @CreateDate: Created in 2020/2/17 09:04 <br>
- * @Author: <a href="4345453@kidgrow.com">liuke</a>
- */
-@Builder(builderClassName = "Builder", toBuilder = true)
-@Getter
-@Setter
-@AllArgsConstructor
-@NoArgsConstructor
-public class BatchSmsTemplate {
-    private List<String> signNames;
-    private String templateCode;
-    private List<Map<String, String>> templateParams;
-    private List<String> phoneNumbers;
-}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/template/SmsTemplate.java b/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/template/SmsTemplate.java
deleted file mode 100644
index 2a89f2a..0000000
--- a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/template/SmsTemplate.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.kidgrow.sms.aliyun.template;
-
-import lombok.*;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
- *
- * @Description: 阿里云调用模板<br>
- * @Project: <br>
- * @CreateDate: Created in 2020/2/17 09:04 <br>
- * @Author: <a href="4345453@kidgrow.com">liuke</a>
- */
-@Builder(builderClassName = "Builder", toBuilder = true)
-@Getter
-@Setter
-@AllArgsConstructor
-@NoArgsConstructor
-public class SmsTemplate {
-    private String signName;
-    private String templateCode;
-    private Map<String, String> templateParam;
-    private List<String> phoneNumbers;
-
-}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/util/AliyunSmsUtils.java b/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/util/AliyunSmsUtils.java
deleted file mode 100644
index 1ec6752..0000000
--- a/kidgrow-plugin/kidgrow-plugin-sms/src/main/java/com/kidgrow/sms/aliyun/util/AliyunSmsUtils.java
+++ /dev/null
@@ -1,175 +0,0 @@
-package com.kidgrow.sms.aliyun.util;
-
-import com.aliyuncs.CommonResponse;
-import com.google.gson.Gson;
-import com.kidgrow.sms.aliyun.exception.SmsException;
-import com.kidgrow.sms.aliyun.template.BatchSmsTemplate;
-import com.kidgrow.sms.aliyun.template.SmsTemplate;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.ThreadLocalRandom;
-
-/**
- * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
- *
- * @Description: 阿里云短信服务工具类<br>
- * @Project: <br>
- * @CreateDate: Created in 2020/2/17 08:53 <br>
- * @Author: <a href="4345453@kidgrow.com">liuke</a>
- */
-public class AliyunSmsUtils {
-    private static final String SUCCESS_CODE = "OK";
-    /**
-     * 宽松校验即可.
-     */
-    private static final String PHONE_NUMBER_REGEX = "\\d{5,}";
-
-    /**
-     * 生成随机验证码.
-     *
-     * @return 随机数
-     */
-    public static int randomCode() {
-        return 100_000 + ThreadLocalRandom.current().nextInt(1_000_000 - 100_000);
-    }
-
-    /**
-     * Map 转 json 字符串的简单实现.
-     *
-     * @param map the map
-     *
-     * @return the json string
-     */
-    public static String toJsonStr(final Map<String, String> map) {
-        if (null == map || map.isEmpty()) {
-            return null;
-        }
-
-        final StringBuilder sb = new StringBuilder();
-        sb.append('{');
-        for (final Map.Entry<String, String> entry : map.entrySet()) {
-            sb.append('"')
-                    .append(entry.getKey().replace("\"", "\\\""))
-                    .append('"')
-                    .append(':')
-                    .append('"')
-                    .append(entry.getValue().replace("\"", "\\\""))
-                    .append('"')
-                    .append(',');
-        }
-        sb.deleteCharAt(sb.length() - 1);
-        sb.append('}');
-        return sb.toString();
-    }
-
-    /**
-     * 校验 SmsTemplate.
-     *
-     * @param template the SmsTemplate
-     */
-    public static void checkSmsTemplate(final SmsTemplate template) {
-
-        checkNotEmpty(template.getSignName(), "SmsTemplate signName must be not empty");
-        checkNotEmpty(template.getTemplateCode(), "SmsTemplate templateCode must be not empty");
-        checkNotEmpty(template.getPhoneNumbers(), "SmsTemplate phoneNumbers must be not empty");
-
-    }
-
-    /**
-     * 校验 BatchSmsTemplate.
-     *
-     * @param template the BatchSmsTemplate
-     */
-    public static void checkBatchSmsTemplate(final BatchSmsTemplate template) {
-
-        checkNotEmpty(template.getSignNames(), "BatchSmsTemplate signNames must be not empty");
-        checkNotEmpty(template.getPhoneNumbers(), "BatchSmsTemplate phoneNumbers must be not empty");
-        checkNotEmpty(template.getTemplateCode(), "BatchSmsTemplate templateCode must be not empty");
-        checkNotEmpty(template.getTemplateParams(), "BatchSmsTemplate templateParams must be not empty");
-
-        if (template.getSignNames().size() != template.getPhoneNumbers().size()
-                && template.getPhoneNumbers().size() != template.getTemplateParams().size()) {
-            throw new IllegalArgumentException("BatchSmsTemplate phoneNumbers, signNames, templateParams size must be the same");
-        }
-    }
-
-    /**
-     * 校验 SendSmsResponse 状态.
-     *
-     * @param response the SendSmsResponse
-     */
-    public static void checkSmsResponse(final CommonResponse response) {
-        if (null == response) {
-            throw new SmsException("Response is null");
-        }
-        final Gson gson = new Gson();
-        final Map<String, String> json = gson.fromJson(response.getData(), Map.class);
-        if (!SUCCESS_CODE.equalsIgnoreCase(json.get("Code"))) {
-            //throw new SmsException("Http status: " + response.getHttpStatus() + ", response: " + response.getData());
-            throw new SmsException(response.getData());
-        }
-    }
-
-    /**
-     * 校验手机号码(中国).
-     *
-     * @param phoneNumber the phone number
-     */
-    public static void checkPhoneNumber(final String phoneNumber) {
-        if (null == phoneNumber || !phoneNumber.matches(PHONE_NUMBER_REGEX)) {
-            throw new IllegalArgumentException("Invalid phone number");
-        }
-    }
-
-    /**  <br>     2018年3月已知
-     中国电信号段
-     133,149,153,173,177,180,181,189,199
-     中国联通号段
-     130,131,132,145,155,156,166,175,176,185,186
-     中国移动号段
-     134(0-8),135,136,137,138,139,147,150,151,152,157,158,159,178,182,183,184,187,188,198
-     其他号段
-     14号段以前为上网卡专属号段,如中国联通的是145,中国移动的是147等等。
-     虚拟运营商
-     电信:1700,1701,1702
-     移动:1703,1705,1706
-     联通:1704,1707,1708,1709,171
-     卫星通信:148(移动) 1349
-     */
-    public static boolean isMobile(String str) {
-        boolean b = false;
-        String s2="^[1](([3][0-9])|([4][5,7,9])|([5][0-9])|([6][6])|([7][3,5,6,7,8])|([8][0-9])|([9][8,9]))[0-9]{8}$";// 验证手机号
-        if(StringUtils.isNotBlank(str)){
-            return str.matches(s2);
-        }
-        return b;
-    }
-
-
-
-    /**
-     * 校验字符串不为空.
-     *
-     * @param str the str
-     * @param message the message
-     */
-    public static void checkNotEmpty(final String str, final String message) {
-        if (null == str || str.isEmpty()) {
-            throw new IllegalArgumentException(message);
-        }
-    }
-
-    /**
-     * 校验集合不为空.
-     *
-     * @param coll the Collection
-     * @param message the message
-     */
-    public static void checkNotEmpty(final Collection coll, final String message) {
-        if (null == coll || coll.isEmpty()) {
-            throw new IllegalArgumentException(message);
-        }
-    }
-}
diff --git a/kidgrow-plugin/kidgrow-plugin-sms/src/main/resources/application.yml b/kidgrow-plugin/kidgrow-plugin-sms/src/main/resources/application.yml
deleted file mode 100644
index 6a7438d..0000000
--- a/kidgrow-plugin/kidgrow-plugin-sms/src/main/resources/application.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-#阿里云相关
-aliyun:
-  sms:
-    accessKeyId: LTAIX1whVSBUUKNW
-    accessKeySecret: j7UywJDoUkPRvGafKrik1pyYtEC2ys
-    signName: 微课堂
-    templates:
-      ### 模板key
-      key1:
-        ## 模板code 需要在阿里云控制台设置
-        templateCode: SMS_151231928 # 与阿里云设置的保持一致,模板内容需在后面加上,方便使用:****
-      key2:
-        templateCode: SMS_105665033 # 与阿里云设置的保持一致,模板内容需在后面加上,方便使用:****
-  commonRequest:
-    domain: dysmsapi.aliyuncs.com
-    ## 版本号
-    version: 2017-05-25
-    ##
-    action: SendSms
-
-## 短信验证码过期时间,时间单位/秒
-sms:
-  verificationCode:
-    ## 短信验证码过期时间,时间单位/秒
-    timeOut: 120
-    ##  缓存手机号key值前缀
-    prefix: "sms:aliyun:code:"
-
-server:
-  tomcat:
-    uri-encoding: UTF-8
-    max-threads: 1000
-    min-spare-threads: 30
-  port: 8008
-#    context-path: /
-
-spring:
-  application:
-    name: sms-service
-
-eureka:
-  instance:
-    ###注册中心ip地址
-    hostname: ${kidgrow.eureka.instance.hostname}
-    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
-    prefer-ip-address: true
-  client:
-    serviceUrl:
-      defaultZone: ${kidgrow.eureka.client.serviceUrl.defaultZone}
\ No newline at end of file
diff --git a/kidgrow-springcloud/kidgrow-springcloud-eureka/Dockerfile b/kidgrow-springcloud/kidgrow-springcloud-eureka/Dockerfile
new file mode 100644
index 0000000..f28a337
--- /dev/null
+++ b/kidgrow-springcloud/kidgrow-springcloud-eureka/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-Xms64m","-Xmx128m","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-springcloud/kidgrow-springcloud-eureka/pom.xml b/kidgrow-springcloud/kidgrow-springcloud-eureka/pom.xml
index c3c1e9e..5d47bbf 100644
--- a/kidgrow-springcloud/kidgrow-springcloud-eureka/pom.xml
+++ b/kidgrow-springcloud/kidgrow-springcloud-eureka/pom.xml
@@ -44,6 +44,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-springcloud/kidgrow-springcloud-eureka/src/main/resources/application.yml b/kidgrow-springcloud/kidgrow-springcloud-eureka/src/main/resources/application.yml
index 8df6b78..e77679f 100644
--- a/kidgrow-springcloud/kidgrow-springcloud-eureka/src/main/resources/application.yml
+++ b/kidgrow-springcloud/kidgrow-springcloud-eureka/src/main/resources/application.yml
@@ -14,7 +14,8 @@
 eureka:
   instance:
     ###注册中心ip地址
-    hostname: 192.168.1.103
+#    hostname: 172.17.97.143
+    hostname: 127.0.0.1
     lease-renewal-interval-in-seconds: 30
     lease-expiration-duration-in-seconds: 30
     instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
@@ -24,7 +25,8 @@
       ##注册地址
       #defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:9002/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:9003/eureka/
       #defaultZone: http://${eureka.instance.hostname}:9002/eureka/,http://${eureka.instance.hostname}:9003/eureka/
-      defaultZone: http://192.168.1.103:9001/eureka/,http://192.168.1.202:9001/eureka/
+#      defaultZone: http://172.17.97.143:9001/eureka/,http://192.168.2.240:9001/eureka/
+      defaultZone: http://127.0.0.1:9001/eureka/
     ####因为自己是注册中心,是否需要将自己注册给自己的注册中心(集群的时候是需要是为true)
     register-with-eureka: false
     ###因为自己是注册中心, 不需要去检索服务信息
diff --git a/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-admin/Dockerfile b/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-admin/Dockerfile
new file mode 100644
index 0000000..78e6474
--- /dev/null
+++ b/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-admin/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-Xms64m","-Xmx256m","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-admin/pom.xml b/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-admin/pom.xml
index 6cd6ca3..cfd0c06 100644
--- a/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-admin/pom.xml
+++ b/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-admin/pom.xml
@@ -44,6 +44,10 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-commons</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
@@ -65,6 +69,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.2</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-admin/src/main/resources/application.yml b/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-admin/src/main/resources/application.yml
index fdbeecb..932f536 100644
--- a/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-admin/src/main/resources/application.yml
+++ b/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-admin/src/main/resources/application.yml
@@ -8,6 +8,8 @@
     hostname: ${kidgrow.eureka.instance.hostname}
     instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
     prefer-ip-address: true
+    leaseRenewalIntervalInSeconds: 10
+    health-check-url-path: /actuator/health
   client:
     serviceUrl:
       defaultZone: ${kidgrow.eureka.client.serviceUrl.defaultZone}
@@ -20,6 +22,27 @@
 spring:
   application:
     name: admin
+  boot:
+    admin:
+      ui:
+        title: KidgrowAdmin-Server
+      notify:
+        mail:
+          from: 4345453@qq.com
+          to: 64294050@kidgrow.com,4345453@kidgrow,1024030301@kidgrow.com
+  mail:
+    host: smtp.qq.com
+    default-encoding: utf-8
+    username: 4345453@qq.com
+    password: kqqgvhgskdrpbgia
+    properties:
+      mail:
+        smtp:
+          auth: true
+          starttls:
+            enable: true
+            required: true
+
 management:
   endpoints:
     web:
@@ -28,5 +51,3 @@
   endpoint:
     health:
       show-details: ALWAYS
-
-
diff --git a/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-dashboard/Dockerfile b/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-dashboard/Dockerfile
new file mode 100644
index 0000000..fef5f1e
--- /dev/null
+++ b/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-dashboard/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-dashboard/pom.xml b/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-dashboard/pom.xml
index 5e1d702..11653ec 100644
--- a/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-dashboard/pom.xml
+++ b/kidgrow-springcloud/kidgrow-springcloud-monitor/kidgrow-springcloud-monitor-dashboard/pom.xml
@@ -53,6 +53,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/Dockerfile b/kidgrow-springcloud/kidgrow-springcloud-zuul/Dockerfile
new file mode 100644
index 0000000..11fd628
--- /dev/null
+++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/Dockerfile
@@ -0,0 +1,16 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 接收指定内存
+ENV JAVA_OPTS=$JAVA_OPTS
+# 运行jar包
+ENTRYPOINT ["java","-Xms64m","-Xmx256m","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/pom.xml b/kidgrow-springcloud/kidgrow-springcloud-zuul/pom.xml
index cc98b94..f1c9436 100644
--- a/kidgrow-springcloud/kidgrow-springcloud-zuul/pom.xml
+++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/pom.xml
@@ -12,6 +12,10 @@
     <artifactId>kidgrow-springcloud-zuul</artifactId>
 
     <dependencies>
+<!--        <dependency>-->
+<!--            <groupId>com.kidgrow</groupId>-->
+<!--            <artifactId>kidgrow-usercenter-api</artifactId>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>com.kidgrow</groupId>
             <artifactId>kidgrow-config</artifactId>
@@ -55,6 +59,11 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-configuration-processor</artifactId>
             <optional>true</optional>
+        </dependency>
+        <!--网关限流模块-->
+        <dependency>
+            <groupId>com.marcosbarbero.cloud</groupId>
+            <artifactId>spring-cloud-zuul-ratelimit</artifactId>
         </dependency>
         <!--web 模块-->
         <dependency>
@@ -107,6 +116,11 @@
             <groupId>com.github.zlt2000</groupId>
             <artifactId>swagger-butler-core</artifactId>
         </dependency>
+        <!--  redis-->
+        <dependency>
+            <groupId>com.kidgrow</groupId>
+            <artifactId>kidgrow-redis-spring-boot-starter</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
@@ -130,6 +144,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/ZuulApplication.java b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/ZuulApplication.java
index 10ab8c6..8222860 100644
--- a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/ZuulApplication.java
+++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/ZuulApplication.java
@@ -3,9 +3,7 @@
 import com.didispace.swagger.butler.EnableSwaggerButler;
 import com.kidgrow.jwt.client.EnableAuthClient;
 import com.kidgrow.ribbon.annotation.EnableFeignInterceptor;
-import com.kidgrow.zuul.service.AccessLogService;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.SpringApplication;
 import org.springframework.cloud.client.SpringCloudApplication;
 import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@@ -32,8 +30,8 @@
         SpringApplication.run(ZuulApplication.class,args);
     }
 
-    @Autowired
-    private AccessLogService accessLogService;
+//    @Autowired
+//    private AccessLogService accessLogService;
 
 //    @Bean
 //    public ZuulFilter zuulErrorFilter() {
diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/auth/Oauth2AuthSuccessHandler.java b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/auth/Oauth2AuthSuccessHandler.java
index 8bb30f4..423809a 100644
--- a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/auth/Oauth2AuthSuccessHandler.java
+++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/auth/Oauth2AuthSuccessHandler.java
@@ -2,7 +2,9 @@
 
 import cn.hutool.core.collection.CollectionUtil;
 import com.kidgrow.common.constant.SecurityConstants;
+import com.kidgrow.common.model.SysOrganization;
 import com.kidgrow.common.model.SysUser;
+import lombok.SneakyThrows;
 import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.oauth2.provider.OAuth2Authentication;
@@ -13,6 +15,9 @@
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
+import java.net.URLEncoder;
+import java.util.List;
+
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
  *
@@ -22,23 +27,34 @@
  * @Author: <a href="4345453@kidgrow.com">liuke</a>
  */
 public class Oauth2AuthSuccessHandler implements ServerAuthenticationSuccessHandler {
+    @SneakyThrows
     @Override
     public Mono<Void> onAuthenticationSuccess(WebFilterExchange webFilterExchange, Authentication authentication) {
         MultiValueMap<String, String> headerValues = new LinkedMultiValueMap(4);
         Object principal = authentication.getPrincipal();
+        String tenantId="";
         //客户端模式只返回一个clientId
         if (principal instanceof SysUser) {
             SysUser user = (SysUser)authentication.getPrincipal();
             headerValues.add(SecurityConstants.USER_ID_HEADER, String.valueOf(user.getId()));
             headerValues.add(SecurityConstants.USER_HEADER, user.getUsername());
+
+            List<SysOrganization> organizations = (List<SysOrganization>)user.getOrganizations();
+            //如果有组织架构
+            if(organizations!=null && organizations.size()==2){
+                headerValues.add(SecurityConstants.USER_ORG_ID_HEADER,String.valueOf(organizations.get(0).getId()));
+                headerValues.add(SecurityConstants.USER_ORG_NAME_HEADER, URLEncoder.encode(organizations.get(0).getOrgName(),"UTF-8"));
+                headerValues.add(SecurityConstants.USER_DEP_ID_HEADER,String.valueOf(organizations.get(1).getId()));
+                headerValues.add(SecurityConstants.USER_DEP_NAME_HEADER,URLEncoder.encode(organizations.get(1).getOrgName(),"UTF-8"));
+                tenantId=String.valueOf(organizations.get(0).getId());
+            }
         }
         OAuth2Authentication oauth2Authentication = (OAuth2Authentication)authentication;
         String clientId = oauth2Authentication.getOAuth2Request().getClientId();
-        String tenantId="";
         //保存租户id,租户id根据业务尽进行替换
         switch (clientId){
             case "hospital":
-                tenantId="1";
+                tenantId=tenantId;
                 break;
             case "webApp":
                 tenantId="webApp";
diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/SysDoctorService.java b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/SysDoctorService.java
new file mode 100644
index 0000000..989fecb
--- /dev/null
+++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/SysDoctorService.java
@@ -0,0 +1,28 @@
+package com.kidgrow.zuul.feign;
+
+import com.kidgrow.common.constant.ServiceNameConstants;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.zuul.feign.fallback.SysDoctorServiceFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/22 14:33 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@FeignClient(name = ServiceNameConstants.USER_SERVICE, fallbackFactory = SysDoctorServiceFallbackFactory.class, decode404 = true)
+public interface SysDoctorService {
+    /**
+     * 根据条件查询
+     * @param map
+     */
+    @PostMapping(value = "/sysdoctor/findByMap")
+    ResultBody getListByMap(@RequestBody Map<String, Object> map);
+}
diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/SysOrganizationService.java b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/SysOrganizationService.java
new file mode 100644
index 0000000..ea483d2
--- /dev/null
+++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/SysOrganizationService.java
@@ -0,0 +1,29 @@
+package com.kidgrow.zuul.feign;
+
+import com.kidgrow.common.constant.ServiceNameConstants;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysMenu;
+import com.kidgrow.zuul.feign.fallback.SysOrganizationServiceFallbackFactory;
+import com.kidgrow.zuul.feign.fallback.SysUserOrgServiceFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/22 14:33 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@FeignClient(name = ServiceNameConstants.USER_SERVICE, fallbackFactory = SysOrganizationServiceFallbackFactory.class, decode404 = true)
+public interface SysOrganizationService {
+
+    @GetMapping("sysorganization/getListByMap")
+    public ResultBody getListByMap(@RequestParam Map<String, Object> params);
+}
diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/SysUserOrgService.java b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/SysUserOrgService.java
new file mode 100644
index 0000000..4f8c7b8
--- /dev/null
+++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/SysUserOrgService.java
@@ -0,0 +1,33 @@
+package com.kidgrow.zuul.feign;
+
+import com.kidgrow.common.constant.ServiceNameConstants;
+import com.kidgrow.common.model.SysMenu;
+import com.kidgrow.common.model.SysUserOrg;
+import com.kidgrow.zuul.feign.fallback.MenuServiceFallbackFactory;
+import com.kidgrow.zuul.feign.fallback.SysUserOrgServiceFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/22 14:33 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@FeignClient(name = ServiceNameConstants.USER_SERVICE, fallbackFactory = SysUserOrgServiceFallbackFactory.class, decode404 = true)
+public interface SysUserOrgService {
+    /**
+     * 根据条件查询
+     * @param map
+     */
+    @PostMapping(value = "/sysuserorg/getListByMap")
+    List<SysUserOrg> getListByMap(@RequestParam Map<String,Object> map);
+}
diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/fallback/SysDoctorServiceFallbackFactory.java b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/fallback/SysDoctorServiceFallbackFactory.java
new file mode 100644
index 0000000..0bee496
--- /dev/null
+++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/fallback/SysDoctorServiceFallbackFactory.java
@@ -0,0 +1,32 @@
+package com.kidgrow.zuul.feign.fallback;
+
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.zuul.feign.SysDoctorService;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/22 14:33 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@Component
+public class SysDoctorServiceFallbackFactory implements FallbackFactory<SysDoctorService> {
+
+    @Override
+    public SysDoctorService create(Throwable throwable) {
+        return  new SysDoctorService() {
+            @Override
+            public ResultBody getListByMap(Map<String, Object> map) {
+                return ResultBody.failed("获取医生姓名失败");
+            }
+        };
+    }
+}
diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/fallback/SysOrganizationServiceFallbackFactory.java b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/fallback/SysOrganizationServiceFallbackFactory.java
new file mode 100644
index 0000000..61acc86
--- /dev/null
+++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/fallback/SysOrganizationServiceFallbackFactory.java
@@ -0,0 +1,34 @@
+package com.kidgrow.zuul.feign.fallback;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.zuul.feign.MenuService;
+import com.kidgrow.zuul.feign.SysOrganizationService;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/22 14:33 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@Component
+public class SysOrganizationServiceFallbackFactory implements FallbackFactory<SysOrganizationService> {
+
+    @Override
+    public SysOrganizationService create(Throwable throwable) {
+        return  new SysOrganizationService() {
+            @Override
+            public ResultBody getListByMap(Map<String, Object> params) {
+                return ResultBody.failed().msg("FeignClient调用参数传递测试失败");
+            }
+        };
+    }
+}
diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/fallback/SysUserOrgServiceFallbackFactory.java b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/fallback/SysUserOrgServiceFallbackFactory.java
new file mode 100644
index 0000000..74e671a
--- /dev/null
+++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/feign/fallback/SysUserOrgServiceFallbackFactory.java
@@ -0,0 +1,36 @@
+package com.kidgrow.zuul.feign.fallback;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysMenu;
+import com.kidgrow.common.model.SysUserOrg;
+import com.kidgrow.zuul.feign.MenuService;
+import com.kidgrow.zuul.feign.SysUserOrgService;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/22 14:33 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@Component
+public class SysUserOrgServiceFallbackFactory implements FallbackFactory<SysUserOrgService> {
+    @Override
+    public SysUserOrgService create(Throwable throwable) {
+      return new SysUserOrgService() {
+          @Override
+          public List<SysUserOrg> getListByMap(Map<String, Object> map) {
+              return null;
+          }
+      };
+    }
+}
diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/OrganizationFilter.java b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/OrganizationFilter.java
new file mode 100644
index 0000000..3f62c83
--- /dev/null
+++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/OrganizationFilter.java
@@ -0,0 +1,148 @@
+package com.kidgrow.zuul.filter;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.fastjson.JSON;
+import com.kidgrow.common.constant.CommonConstant;
+import com.kidgrow.common.constant.SecurityConstants;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysOrganization;
+import com.kidgrow.common.model.SysUser;
+import com.kidgrow.common.model.SysUserOrg;
+import com.kidgrow.common.utils.AddrUtil;
+import com.kidgrow.redis.util.RedisConstant;
+import com.kidgrow.redis.util.RedisUtils;
+import com.kidgrow.zuul.feign.SysOrganizationService;
+import com.kidgrow.zuul.feign.SysUserOrgService;
+import com.netflix.zuul.ZuulFilter;
+import com.netflix.zuul.context.RequestContext;
+import eu.bitwalker.useragentutils.UserAgent;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.hibernate.validator.constraints.NotBlank;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.security.authentication.AnonymousAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: 将认证用户的相关信息放入header中, 后端服务可以直接读取使用     包含了----组织的拦截---<br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/2/21 10:12 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+@Slf4j
+@Component
+public class OrganizationFilter extends ZuulFilter {
+    @Override
+    public String filterType() {
+        return FilterConstants.PRE_TYPE;
+    }
+
+    @Override
+    public int filterOrder() {
+        return PRE_DECORATION_FILTER_ORDER;
+    }
+
+    @Override
+    public boolean shouldFilter() {
+        return true;
+    }
+
+    @Autowired
+    RedisUtils redisUtils;
+    @Autowired
+    private SysUserOrgService sysUserOrgService;
+    @Autowired
+    private SysOrganizationService sysOrganizationService;
+
+    private final String CLIENTID = "webApp";//运营端
+
+    @SneakyThrows
+    @Override
+    public Object run() {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        if (authentication != null && !(authentication instanceof AnonymousAuthenticationToken)) {
+            Object principal = authentication.getPrincipal();
+            RequestContext ctx = RequestContext.getCurrentContext();
+            if (principal instanceof SysUser) {
+                //运营端进行
+                OAuth2Authentication oauth2Authentication = (OAuth2Authentication) authentication;
+                String clientId = oauth2Authentication.getOAuth2Request().getClientId();
+                if (CLIENTID.equals(clientId)) {
+                    SysUser user = (SysUser) authentication.getPrincipal();
+                    /**
+                     * 将组织中为空的拦截
+                     */
+                    List<SysUserOrg> sysUserOrgs = getSysUserOrg(user.getId());
+                    if (sysUserOrgs == null || sysUserOrgs.isEmpty()) {
+                        ctx.setSendZuulResponse(false);
+                        ctx.setResponseBody(JSON.toJSONString(ResultBody.fail(1000, "您的组织已经被禁用,请联系管理员")));
+                    }
+//                    else {
+//                        List<Long> collect = sysUserOrgs.stream().map(e -> e.getOrgId()).collect(Collectors.toList());
+//                        List<SysOrganization> sysOrganizations = getSysOrganization();
+//                        List<Long> orgIds = sysOrganizations.stream().filter(e -> e.getEnabled() == true && collect.contains(e.getId())).map(e -> e.getId()).collect(Collectors.toList());
+//                        if (orgIds == null || orgIds.size() <= 0) {
+//                            ctx.setSendZuulResponse(false);
+//                            ctx.setResponseBody(JSON.toJSONString(ResultBody.fail(1000, "您的组织已经被禁用,请联系管理员")));
+//                        }
+//                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 通过userID  获取组织的关系
+     *
+     * @param str
+     * @return
+     */
+    public List<SysUserOrg> getSysUserOrg(Long str) {
+        //获取组织 Redis中获取
+        List<SysUserOrg> sysUserOrgs = JSON.parseArray(JSON.toJSONString(redisUtils.hget(RedisConstant.USER_ORGANIZATION, str.toString())), SysUserOrg.class);
+        if (sysUserOrgs == null || sysUserOrgs.size() <= 0) {
+            //在数据库查询
+            Map<String, Object> map = new HashMap<>();
+            map.put("user_id", str);
+            sysUserOrgs = sysUserOrgService.getListByMap(map);
+            redisUtils.hset(RedisConstant.USER_ORGANIZATION, str.toString(), sysUserOrgs);
+        }
+        return sysUserOrgs;
+    }
+
+    public List<SysOrganization> getSysOrganization() {
+        Map<Object, Object> hmget = redisUtils.hmget(RedisConstant.ORGANIZATION);
+        List<SysOrganization> sysOrganizations = new ArrayList<>();
+        if (hmget == null || hmget.size() <= 0) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("is_del", 0);
+            sysOrganizations = JSON.parseArray(JSON.toJSONString(sysOrganizationService.getListByMap(map).getData()), SysOrganization.class);
+            sysOrganizations.forEach(e -> {
+                redisUtils.hset(RedisConstant.ORGANIZATION, e.getId().toString(), e);
+            });
+
+        } else {
+            Set<Object> objects = hmget.keySet();
+            Iterator<Object> iterator = objects.iterator();
+            while (iterator.hasNext()) {
+                sysOrganizations.add((SysOrganization) hmget.get(iterator.next()));
+            }
+        }
+        return sysOrganizations;
+    }
+}
+
diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/UserInfoHeaderFilter.java b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/UserInfoHeaderFilter.java
index 4563b65..c628247 100644
--- a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/UserInfoHeaderFilter.java
+++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/UserInfoHeaderFilter.java
@@ -1,14 +1,20 @@
 package com.kidgrow.zuul.filter;
 
-import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.fastjson.JSON;
 import com.kidgrow.common.constant.CommonConstant;
 import com.kidgrow.common.constant.SecurityConstants;
+import com.kidgrow.common.model.ResultBody;
+import com.kidgrow.common.model.SysDoctor;
+import com.kidgrow.common.model.SysOrganization;
 import com.kidgrow.common.model.SysUser;
 import com.kidgrow.common.utils.AddrUtil;
+import com.kidgrow.zuul.feign.SysDoctorService;
 import com.netflix.zuul.ZuulFilter;
 import com.netflix.zuul.context.RequestContext;
 import eu.bitwalker.useragentutils.UserAgent;
+import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
 import org.springframework.security.authentication.AnonymousAuthenticationToken;
 import org.springframework.security.core.Authentication;
@@ -17,13 +23,17 @@
 import org.springframework.stereotype.Component;
 
 import javax.servlet.http.HttpServletRequest;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.FORM_BODY_WRAPPER_FILTER_ORDER;
 
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
  *
- * @Description: 将认证用户的相关信息放入header中, 后端服务可以直接读取使用<br>
+ * @Description: 将认证用户的相关信息放入header中, 后端服务可以直接读取使用     包含了----组织的拦截---<br>
  * @Project: <br>
  * @CreateDate: Created in 2020/2/21 10:12 <br>
  * @Author: <a href="4345453@kidgrow.com">liuke</a>
@@ -31,6 +41,8 @@
 @Slf4j
 @Component
 public class UserInfoHeaderFilter extends ZuulFilter {
+    @Autowired
+    private SysDoctorService sysDoctorService;
     @Override
     public String filterType() {
         return FilterConstants.PRE_TYPE;
@@ -46,6 +58,9 @@
         return true;
     }
 
+
+
+    @SneakyThrows
     @Override
     public Object run() {
         Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
@@ -54,41 +69,76 @@
             RequestContext ctx = RequestContext.getCurrentContext();
             HttpServletRequest req = ctx.getRequest();
             UserAgent userAgent = UserAgent.parseUserAgentString(req.getHeader("User-Agent"));
-            String tenantId="";
+            String tenantId = "";
             //客户端模式只返回一个clientId
             if (principal instanceof SysUser) {
-                SysUser user = (SysUser)authentication.getPrincipal();
+
+                SysUser user = (SysUser) authentication.getPrincipal();
+                Map<String,Object> map=new HashMap<>();
+                map.put("user_id",user.getId());
+                ResultBody listByMap = sysDoctorService.getListByMap(map);
+
+                List<SysDoctor> sysDoctors = JSON.parseArray(JSON.toJSONString(listByMap.getData()), SysDoctor.class);
+                String str="";
+                Long hospital=-1L;
+                Long doctorId=-1L;
+                Long departmentId=-1L;
+                String departmentName="";
+                if(sysDoctors!=null&&sysDoctors.size()>0){
+                    str= sysDoctors.get(0).getDoctorName();
+                    hospital=sysDoctors.get(0).getHospitalId();
+                    doctorId=sysDoctors.get(0).getId();
+                    departmentId=sysDoctors.get(0).getDepartmentId();
+                    departmentName=sysDoctors.get(0).getDepartmentName();
+                    ctx.addZuulRequestHeader(SecurityConstants.USER_ORG_NAME_HEADER, URLEncoder.encode(sysDoctors.get(0).getHospitalName(),"UTF-8"));
+                    ctx.addZuulRequestHeader(SecurityConstants.USER_DEP_ID_HEADER,String.valueOf(departmentId));
+                    ctx.addZuulRequestHeader(SecurityConstants.USER_DEP_NAME_HEADER,URLEncoder.encode(departmentName,"UTF-8"));
+                }
                 ctx.addZuulRequestHeader(SecurityConstants.USER_ID_HEADER, String.valueOf(user.getId()));
+                ctx.addZuulRequestHeader(SecurityConstants.DOCTOR_ID_HEADER, String.valueOf(doctorId));
                 ctx.addZuulRequestHeader(SecurityConstants.USER_HEADER, user.getUsername());
-                tenantId=String.valueOf(user.getId());
-//                log.error("用户ID写入Header成功,用户ID为:"+String.valueOf(user.getId()));
+
+                ctx.addZuulRequestHeader(SecurityConstants.USER_REAL_NAME,URLEncoder.encode(str,"UTF-8"));
+                ctx.addZuulRequestHeader(SecurityConstants.USER_HOSPITAL_ID_HEADER,hospital.toString());
+                tenantId=hospital.toString();
+                List<SysOrganization> organizations = (List<SysOrganization>) user.getOrganizations();
+                //将组织数据 存到header 里面
+                organizations.sort((e1,e2)->e1.getOrgLevel().compareTo(e2.getOrgLevel()));
+                if (organizations != null&&organizations.size()>0) {
+                    ctx.addZuulRequestHeader(SecurityConstants.USER_ORG_ID_HEADER,String.valueOf(organizations.get(0).getId()));
+                    ctx.addZuulRequestHeader(SecurityConstants.USER_ORGS_HEADER,JSON.toJSONString(organizations));
+                }
+                //将角色放到header
+                ctx.addZuulRequestHeader(SecurityConstants.ROLE_HEADER, JSON.toJSONString(user.getRoles()));
+
             }
 
 
-            OAuth2Authentication oauth2Authentication = (OAuth2Authentication)authentication;
+            OAuth2Authentication oauth2Authentication = (OAuth2Authentication) authentication;
             String clientId = oauth2Authentication.getOAuth2Request().getClientId();
 
             //保存租户id,租户id根据业务尽进行替换
-            switch (clientId){
+            switch (clientId) {
                 case "hospital":
-                    tenantId=tenantId;
+                    tenantId =  tenantId;
                     break;
                 case "webApp":
-                    tenantId="webApp";
+                    tenantId = "webApp";
                     break;
                 default:
-                    tenantId=clientId;
+                    tenantId = clientId;
                     break;
             }
             ctx.addZuulRequestHeader(CommonConstant.USER_AGENT_BROWSER, userAgent.getBrowser().toString());
             ctx.addZuulRequestHeader(CommonConstant.USER_AGENT_SYSTEM, userAgent.getOperatingSystem().toString());
             ctx.addZuulRequestHeader(CommonConstant.USER_AGENT_IP, AddrUtil.getRemoteAddr(req));
+            ctx.addZuulRequestHeader(CommonConstant.USER_AGENT_SYSTEM_SCREEN, req.getHeader(CommonConstant.USER_AGENT_SYSTEM_SCREEN));
 
 //            UserAgentContextHolder.setUserAgent(AddrUtil.getRemoteAddr(req)+"kidgrow"+userAgent.getBrowser().toString()+"kidgrow"+userAgent.getOperatingSystem().toString());
 
             ctx.addZuulRequestHeader(SecurityConstants.TENANT_HEADER, tenantId);
             ctx.addZuulRequestHeader(SecurityConstants.CLIENT_HEADER, clientId);
-            ctx.addZuulRequestHeader(SecurityConstants.ROLE_HEADER, CollectionUtil.join(authentication.getAuthorities(), ","));
+
         }
         return null;
     }
diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/service/AccessLogService.java b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/service/AccessLogService.java
index 1f41dd4..ac4c6fb 100644
--- a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/service/AccessLogService.java
+++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/service/AccessLogService.java
@@ -5,6 +5,7 @@
 import com.google.common.collect.Maps;
 import com.kidgrow.common.utils.WebUtils;
 import lombok.extern.slf4j.Slf4j;
+//import org.springframework.amqp.core.AmqpTemplate;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
 import org.springframework.http.HttpHeaders;
@@ -19,6 +20,8 @@
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
+//import org.springframework.amqp.core.AmqpTemplate;
+
 /**
  * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
  *
diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/resources/application.yml b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/resources/application.yml
index f62507f..4f1cefb 100644
--- a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/resources/application.yml
+++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/resources/application.yml
@@ -1,6 +1,12 @@
 spring:
   application:
-    name: zull-server
+    name: zuul-server
+  #配置Redis
+  redis:
+    host: ${spring.redis.host}
+    port: ${spring.redis.port}
+    password: ${spring.redis.password}
+    timeout: ${spring.redis.timeout}
 server:
   tomcat:
     uri-encoding: UTF-8
@@ -17,6 +23,7 @@
     prefer-ip-address: true
   client:
     serviceUrl:
+#      defaultZone: http://192.168.2.240:9001/eureka/
       defaultZone: ${kidgrow.eureka.client.serviceUrl.defaultZone}
 
 zuul:
@@ -29,7 +36,9 @@
   ignored-headers: Access-Control-Allow-Credentials,Access-Control-Allow-Origin,Access-Control-Allow-Methods
   add-host-header: true
   host:
-    connectTimeoutMillis: 10000
+#    connectTimeoutMillis: 10000
+    socket-timeout-millis: 100000
+    connect-timeout-millis: 100000
   routes:
     auth:
       path: /api-uaa/**
@@ -85,6 +94,24 @@
       strip-prefix: true
       sensitive-headers: '*'
       custom-sensitive-headers: true
+    record-center:
+      path: /api-record/**
+      service-id: recordcenter-server
+      strip-prefix: true
+      sensitive-headers: '*'
+      custom-sensitive-headers: true
+    record-bicenter:
+      path: /api-bicenter/**
+      service-id: bicenter-server
+      strip-prefix: true
+      sensitive-headers: '*'
+      custom-sensitive-headers: true
+    sms:
+      path: /api-sms/**
+      service-id: sms-service-server
+      strip-prefix: true
+      sensitive-headers: '*'
+      custom-sensitive-headers: true
     log:
       path: /api-log/**
       service-id: logcenter-server
@@ -94,6 +121,12 @@
     search:
       path: /api-search/**
       service-id: searchcenter-server
+      strip-prefix: true
+      sensitive-headers: '*'
+      custom-sensitive-headers: true
+    oprationcenter:
+      path: /api-opration/**
+      service-id: oprationcenter-server
       strip-prefix: true
       sensitive-headers: '*'
       custom-sensitive-headers: true
@@ -112,6 +145,36 @@
     client-service-routes:
       path: /clienttest/**
       service-id: client-service
+      strip-prefix: true
+      sensitive-headers: '*'
+      custom-sensitive-headers: true
+    reportcenter-server-routes:
+      path: /reportcenter-server/**
+      service-id: reportcenter-server
+      strip-prefix: true
+      sensitive-headers: '*'
+      custom-sensitive-headers: true
+    demo-aspnet-server-routes:
+      path: /demoaspnetserver/**
+      service-id: demo-aspnet-server
+      strip-prefix: true
+      sensitive-headers: '*'
+      custom-sensitive-headers: true
+    wechat-server-routes:
+      path: /wechatserver/**
+      service-id: wechat-server
+      strip-prefix: true
+      sensitive-headers: '*'
+      custom-sensitive-headers: true
+    api-evaluation:
+      path: /api-evaluation/**
+      service-id: boneage-evaluationcenter-server
+      strip-prefix: true
+      sensitive-headers: '*'
+      custom-sensitive-headers: true
+    api-smartbox:
+      path: /api-smart/**
+      service-id: smartbox-server
       strip-prefix: true
       sensitive-headers: '*'
       custom-sensitive-headers: true
@@ -135,7 +198,7 @@
       execution:
         isolation:
           thread:
-            timeoutInMilliseconds: 100000
+            timeoutInMilliseconds: 300000
 
 kidgrow:
   oauth2:
@@ -156,6 +219,20 @@
       - /*/oauth/**
       - /actuator/health
       - /actuator/info
+      - /api-file/smsChangLan/send
+      - /api-user/users/doctorUserReg
+      - /api-user/users/isRegUser
+      - /api-user/users/passwordByPhone
+      - /api-evaluation/evaluationxrayinfo/appUpload
+      - /api-evaluation/evaluationxrayinfo/appSave
+      - /api-file/baseUplaod
+      - /api-user/users/python
+      - /api-evaluation/evaluationxrayinfo/checkQRCode
+      - /api-record/wxController/callback
+      - /api-record/alipay/return
+#      - /api-user/syshospital/findAllByMap
+#      - /api-user/sysdictionaries/findAll
+#      - /api-user/sysdepartment/findListByHospitalId
     # 忽略权限鉴定
     authority-ignores:
       - /*/authority/granted/me
@@ -176,7 +253,22 @@
         /api-uaa/js/**,
         /api-user/users-anon/**,
         /login.html,
-        /user/login
+        /user/login,
+        /api-file/smsChangLan/send,
+        /api-user/users/doctorUserReg,
+        /api-file/files-upload,
+        /api-user/users/isRegUser,
+        /api-user/users/passwordByPhone,
+        /api-evaluation/evaluationxrayinfo/appUpload,
+        /api-evaluation/evaluationxrayinfo/appSave,
+        /api-file/baseUplaod,
+        /api-user/users/python,
+        /api-evaluation/evaluationxrayinfo/checkQRCode,
+        /api-record/wxController/callback,
+        /api-record/alipay/return
+#        /api-user/syshospital/findAllByMap,
+#        /api-user/sysdictionaries/findAll,
+#        /api-user/sysdepartment/findListByHospitalId
     auth:
       #开启时间戳验证
       timestampenable: false
@@ -194,6 +286,8 @@
           /api-user/menus/current,
           /api-user/users/current,
           /api-log/requestStat
+          /wechatserver/Wechat/GetScreenCount
+          /wechatserver/news/LastestNews
         #白名单,需要URL认证的应用ID
         includeClientIds:
           - webApp
@@ -201,7 +295,7 @@
           - kidgrow
       renew:
         #是否开启token自动续签(目前只有redis实现)
-        enable: false
+        enable: true
         #白名单
         includeClientIds:
           - webApp
@@ -217,5 +311,4 @@
     auto-generate-from-zuul-routes: true
     generate-routes: user,file,log,codegenerator,auth
     apiDocsPath: v2/api-docs
-
 
diff --git a/kidgrow-uaa/kidgrow-uaa-biz/src/main/java/com/kidgrow/oauth2/mapper/ClientMapper.java b/kidgrow-uaa/kidgrow-uaa-biz/src/main/java/com/kidgrow/oauth2/mapper/ClientMapper.java
index c3a247e..96a35c6 100644
--- a/kidgrow-uaa/kidgrow-uaa-biz/src/main/java/com/kidgrow/oauth2/mapper/ClientMapper.java
+++ b/kidgrow-uaa/kidgrow-uaa-biz/src/main/java/com/kidgrow/oauth2/mapper/ClientMapper.java
@@ -17,6 +17,6 @@
  * @Author: <a href="4345453@kidgrow.com">liuke</a>
  */
 public interface ClientMapper extends SuperMapper<Client> {
-    List<Client> findList(Page<Client> page, @Param("params") Map<String, Object> params );
+    List<Client> findList(Page<Client> page, @Param("params") Map<String, Object> params);
 }
 
diff --git a/kidgrow-uaa/kidgrow-uaa-server/Dockerfile b/kidgrow-uaa/kidgrow-uaa-server/Dockerfile
new file mode 100644
index 0000000..af7a2e0
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/Dockerfile
@@ -0,0 +1,92 @@
+# 基础镜像
+FROM 182.92.99.224:8081/kidgrow/docker.private/openjdk:fonts
+#FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+##时区
+RUN echo "Asia/Shanghai" > /etc/timezone
+#captcher 字体包
+COPY dockerfont/32768no.ttf /usr/share/fonts/32768no.ttf
+COPY dockerfont/7hours.ttf  /usr/share/fonts/7hours.ttf
+COPY dockerfont/actionj.ttf /usr/share/fonts/actionj.ttf
+COPY dockerfont/ANGSTROM.TTF /usr/share/fonts/ANGSTROM.ttf
+COPY dockerfont/antelope.ttf /usr/share/fonts/antelope.ttf
+COPY dockerfont/antiblue.ttf /usr/share/fonts/antiblue.ttf
+COPY dockerfont/bboron.ttf /usr/share/fonts/bboron.ttf
+COPY dockerfont/BTTSOIEF.TTF /usr/share/fonts/BTTSOIEF.ttf
+COPY dockerfont/codon.ttf /usr/share/fonts/codon.ttf
+COPY dockerfont/colophon.ttf /usr/share/fonts/colophon.ttf
+COPY dockerfont/constant.ttf /usr/share/fonts/constant.ttf
+COPY dockerfont/cosinek.ttf /usr/share/fonts/cosinek.ttf
+COPY dockerfont/cwisdom.ttf /usr/share/fonts/cwisdom.ttf
+COPY dockerfont/davis.ttf /usr/share/fonts/davis.ttf
+COPY dockerfont/dis.ttf /usr/share/fonts/dis.ttf
+COPY dockerfont/dnahand.ttf /usr/share/fonts/dnahand.ttf
+COPY dockerfont/DoctorAz.ttf /usr/share/fonts/DoctorAz.ttf
+COPY dockerfont/donner.ttf /usr/share/fonts/donner.ttf
+COPY dockerfont/DOVES.TTF /usr/share/fonts/DOVES.ttf
+COPY dockerfont/dyspro.ttf /usr/share/fonts/dyspro.ttf
+COPY dockerfont/epilog.ttf /usr/share/fonts/epilog.ttf
+COPY dockerfont/faraday.ttf /usr/share/fonts/faraday.ttf
+COPY dockerfont/fresnel.ttf /usr/share/fonts/fresnel.ttf
+COPY dockerfont/gauss.ttf /usr/share/fonts/gauss.ttf
+COPY dockerfont/geodesic.ttf /usr/share/fonts/geodesic.ttf
+COPY dockerfont/germs.ttf /usr/share/fonts/germs.ttf
+COPY dockerfont/gmt.ttf /usr/share/fonts/gmt.ttf
+COPY dockerfont/guildof.ttf /usr/share/fonts/guildof.ttf
+COPY dockerfont/headache.ttf /usr/share/fonts/headache.ttf
+COPY dockerfont/hydrogen.ttf /usr/share/fonts/hydrogen.ttf
+COPY dockerfont/initial.ttf /usr/share/fonts/initial.ttf
+COPY dockerfont/levity.ttf /usr/share/fonts/levity.ttf
+COPY dockerfont/lexo.ttf /usr/share/fonts/lexo.ttf
+COPY dockerfont/linear.ttf /usr/share/fonts/linear.ttf
+COPY dockerfont/MAYQUEEN.TTF /usr/share/fonts/MAYQUEEN.ttf
+COPY dockerfont/melanie.ttf /usr/share/fonts/melanie.ttf
+COPY dockerfont/metalang.ttf /usr/share/fonts/metalang.ttf
+COPY dockerfont/musicdbz.ttf /usr/share/fonts/musicdbz.ttf
+COPY dockerfont/natlog.ttf /usr/share/fonts/natlog.ttf
+COPY dockerfont/nonblock.ttf /usr/share/fonts/nonblock.ttf
+COPY dockerfont/nullp.ttf /usr/share/fonts/nullp.ttf
+COPY dockerfont/opticbot.ttf /usr/share/fonts/opticbot.ttf
+COPY dockerfont/pinball.ttf /usr/share/fonts/pinball.ttf
+COPY dockerfont/prefix.ttf /usr/share/fonts/prefix.ttf
+COPY dockerfont/progbot.ttf /usr/share/fonts/progbot.ttf
+COPY dockerfont/PROTERON.TTF /usr/share/fonts/PROTERON.ttf
+COPY dockerfont/px10.ttf /usr/share/fonts/px10.ttf
+COPY dockerfont/ransom.ttf /usr/share/fonts/ransom.ttf
+COPY dockerfont/resurgen.ttf /usr/share/fonts/resurgen.ttf
+COPY dockerfont/robot.ttf /usr/share/fonts/robot.ttf
+COPY dockerfont/scandal.ttf /usr/share/fonts/scandal.ttf
+COPY dockerfont/secret.ttf /usr/share/fonts/secret.ttf
+COPY dockerfont/signal.ttf /usr/share/fonts/signal.ttf
+COPY dockerfont/SUBMERGD.TTF /usr/share/fonts/SUBMERGD.ttf
+COPY dockerfont/suckgolf.ttf /usr/share/fonts/suckgolf.ttf
+COPY dockerfont/technet.ttf /usr/share/fonts/technet.ttf
+COPY dockerfont/tetanus.ttf /usr/share/fonts/tetanus.ttf
+COPY dockerfont/thisprty.ttf /usr/share/fonts/thisprty.ttf
+COPY dockerfont/toast.ttf /usr/share/fonts/toast.ttf
+COPY dockerfont/TOMBATS1.TTF /usr/share/fonts/TOMBATS1.ttf
+COPY dockerfont/tombats3.ttf /usr/share/fonts/tombats3.ttf
+COPY dockerfont/tombats4.ttf /usr/share/fonts/tombats4.ttf
+COPY dockerfont/tombats6.ttf /usr/share/fonts/tombats6.ttf
+COPY dockerfont/tombats7.ttf /usr/share/fonts/tombats7.ttf
+COPY dockerfont/tombots.ttf /usr/share/fonts/tombots.ttf
+COPY dockerfont/tomhand.ttf /usr/share/fonts/tomhand.ttf
+COPY dockerfont/tommys.ttf /usr/share/fonts/tommys.ttf
+COPY dockerfont/tomnr.ttf /usr/share/fonts/tomnr.ttf
+COPY dockerfont/tsmiles.ttf /usr/share/fonts/tsmiles.ttf
+COPY dockerfont/tuesday.ttf /usr/share/fonts/tuesday.ttf
+COPY dockerfont/valium.ttf /usr/share/fonts/valium.ttf
+COPY dockerfont/wolves.ttf /usr/share/fonts/wolves.ttf
+COPY dockerfont/yikatu.ttf /usr/share/fonts/yikatu.ttf
+COPY dockerfont/zincboom.ttf /usr/share/fonts/zincboom.ttf
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-Xms64m","-Xmx256m","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/32768no.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/32768no.ttf
new file mode 100644
index 0000000..e8d9ef6
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/32768no.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/7hours.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/7hours.ttf
new file mode 100644
index 0000000..68bffef
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/7hours.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/ANGSTROM.TTF b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/ANGSTROM.TTF
new file mode 100644
index 0000000..a93cc4d
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/ANGSTROM.TTF
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/BTTSOIEF.TTF b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/BTTSOIEF.TTF
new file mode 100644
index 0000000..f9792d9
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/BTTSOIEF.TTF
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/DOVES.TTF b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/DOVES.TTF
new file mode 100644
index 0000000..90d0f15
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/DOVES.TTF
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/DoctorAz.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/DoctorAz.ttf
new file mode 100644
index 0000000..d363f18
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/DoctorAz.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/MAYQUEEN.TTF b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/MAYQUEEN.TTF
new file mode 100644
index 0000000..91b5059
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/MAYQUEEN.TTF
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/PROTERON.TTF b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/PROTERON.TTF
new file mode 100644
index 0000000..5fe4fea
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/PROTERON.TTF
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/SUBMERGD.TTF b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/SUBMERGD.TTF
new file mode 100644
index 0000000..4d4ef60
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/SUBMERGD.TTF
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/TOMBATS1.TTF b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/TOMBATS1.TTF
new file mode 100644
index 0000000..a045271
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/TOMBATS1.TTF
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/actionj.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/actionj.ttf
new file mode 100644
index 0000000..8439247
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/actionj.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/antelope.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/antelope.ttf
new file mode 100644
index 0000000..b74aab5
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/antelope.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/antiblue.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/antiblue.ttf
new file mode 100644
index 0000000..234f205
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/antiblue.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/bboron.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/bboron.ttf
new file mode 100644
index 0000000..c326b0f
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/bboron.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/codon.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/codon.ttf
new file mode 100644
index 0000000..54cd982
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/codon.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/colophon.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/colophon.ttf
new file mode 100644
index 0000000..2089b6f
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/colophon.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/constant.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/constant.ttf
new file mode 100644
index 0000000..59e8b18
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/constant.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/cosinek.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/cosinek.ttf
new file mode 100644
index 0000000..332de3a
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/cosinek.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/cwisdom.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/cwisdom.ttf
new file mode 100644
index 0000000..2e020e7
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/cwisdom.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/davis.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/davis.ttf
new file mode 100644
index 0000000..6b5ab07
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/davis.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/dis.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/dis.ttf
new file mode 100644
index 0000000..41826a3
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/dis.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/dnahand.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/dnahand.ttf
new file mode 100644
index 0000000..adf846f
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/dnahand.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/donner.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/donner.ttf
new file mode 100644
index 0000000..2594f38
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/donner.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/dyspro.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/dyspro.ttf
new file mode 100644
index 0000000..e673259
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/dyspro.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/epilog.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/epilog.ttf
new file mode 100644
index 0000000..bd9614a
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/epilog.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/faraday.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/faraday.ttf
new file mode 100644
index 0000000..e44f0db
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/faraday.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/fresnel.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/fresnel.ttf
new file mode 100644
index 0000000..7e32a51
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/fresnel.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/gauss.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/gauss.ttf
new file mode 100644
index 0000000..add69d8
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/gauss.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/geodesic.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/geodesic.ttf
new file mode 100644
index 0000000..72f3ca6
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/geodesic.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/germs.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/germs.ttf
new file mode 100644
index 0000000..5182be9
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/germs.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/gmt.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/gmt.ttf
new file mode 100644
index 0000000..b1d7f7a
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/gmt.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/guildof.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/guildof.ttf
new file mode 100644
index 0000000..c23a822
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/guildof.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/headache.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/headache.ttf
new file mode 100644
index 0000000..26fa0af
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/headache.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/hydrogen.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/hydrogen.ttf
new file mode 100644
index 0000000..202be8f
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/hydrogen.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/initial.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/initial.ttf
new file mode 100644
index 0000000..439cddd
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/initial.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/levity.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/levity.ttf
new file mode 100644
index 0000000..2aa5fef
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/levity.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/lexo.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/lexo.ttf
new file mode 100644
index 0000000..411af54
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/lexo.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/linear.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/linear.ttf
new file mode 100644
index 0000000..12f367c
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/linear.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/melanie.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/melanie.ttf
new file mode 100644
index 0000000..5ee012c
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/melanie.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/metalang.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/metalang.ttf
new file mode 100644
index 0000000..52c62c0
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/metalang.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/musicdbz.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/musicdbz.ttf
new file mode 100644
index 0000000..ecaa9b8
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/musicdbz.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/natlog.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/natlog.ttf
new file mode 100644
index 0000000..254b959
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/natlog.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/nonblock.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/nonblock.ttf
new file mode 100644
index 0000000..09087aa
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/nonblock.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/nullp.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/nullp.ttf
new file mode 100644
index 0000000..b465300
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/nullp.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/opticbot.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/opticbot.ttf
new file mode 100644
index 0000000..04bd183
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/opticbot.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/pinball.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/pinball.ttf
new file mode 100644
index 0000000..cd0ff01
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/pinball.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/prefix.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/prefix.ttf
new file mode 100644
index 0000000..a1aeed0
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/prefix.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/progbot.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/progbot.ttf
new file mode 100644
index 0000000..c98d122
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/progbot.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/px10.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/px10.ttf
new file mode 100644
index 0000000..e19ffca
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/px10.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/ransom.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/ransom.ttf
new file mode 100644
index 0000000..779ab8e
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/ransom.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/resurgen.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/resurgen.ttf
new file mode 100644
index 0000000..383bf28
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/resurgen.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/robot.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/robot.ttf
new file mode 100644
index 0000000..09e2de0
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/robot.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/scandal.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/scandal.ttf
new file mode 100644
index 0000000..22e3a7e
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/scandal.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/secret.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/secret.ttf
new file mode 100644
index 0000000..9a1be38
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/secret.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/signal.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/signal.ttf
new file mode 100644
index 0000000..3826ed0
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/signal.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/suckgolf.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/suckgolf.ttf
new file mode 100644
index 0000000..21b388a
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/suckgolf.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/technet.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/technet.ttf
new file mode 100644
index 0000000..bac29e1
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/technet.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tetanus.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tetanus.ttf
new file mode 100644
index 0000000..925f758
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tetanus.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/thisprty.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/thisprty.ttf
new file mode 100644
index 0000000..1ce3aa3
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/thisprty.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/toast.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/toast.ttf
new file mode 100644
index 0000000..1217bfe
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/toast.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats3.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats3.ttf
new file mode 100644
index 0000000..fb5416f
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats3.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats4.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats4.ttf
new file mode 100644
index 0000000..7e383db
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats4.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats6.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats6.ttf
new file mode 100644
index 0000000..ac556d8
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats6.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats7.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats7.ttf
new file mode 100644
index 0000000..74aee37
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombats7.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombots.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombots.ttf
new file mode 100644
index 0000000..a9313cd
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tombots.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tomhand.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tomhand.ttf
new file mode 100644
index 0000000..75a8004
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tomhand.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tommys.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tommys.ttf
new file mode 100644
index 0000000..8b4fc06
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tommys.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tomnr.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tomnr.ttf
new file mode 100644
index 0000000..ae62af1
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tomnr.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tsmiles.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tsmiles.ttf
new file mode 100644
index 0000000..27c4b7b
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tsmiles.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tuesday.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tuesday.ttf
new file mode 100644
index 0000000..8ad3dd1
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/tuesday.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/valium.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/valium.ttf
new file mode 100644
index 0000000..75bc431
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/valium.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/wolves.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/wolves.ttf
new file mode 100644
index 0000000..7155f5d
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/wolves.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/yikatu.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/yikatu.ttf
new file mode 100644
index 0000000..9facf99
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/yikatu.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/dockerfont/zincboom.ttf b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/zincboom.ttf
new file mode 100644
index 0000000..a4c683c
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/dockerfont/zincboom.ttf
Binary files differ
diff --git a/kidgrow-uaa/kidgrow-uaa-server/pom.xml b/kidgrow-uaa/kidgrow-uaa-server/pom.xml
index 22112d7..4fd6f53 100644
--- a/kidgrow-uaa/kidgrow-uaa-server/pom.xml
+++ b/kidgrow-uaa/kidgrow-uaa-server/pom.xml
@@ -24,10 +24,21 @@
             <groupId>com.kidgrow</groupId>
             <artifactId>kidgrow-uaa-biz</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
         <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
@@ -39,6 +50,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.10</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/config/AuthorizationServerConfig.java b/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/config/AuthorizationServerConfig.java
index 5672172..84121f2 100644
--- a/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/config/AuthorizationServerConfig.java
+++ b/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/config/AuthorizationServerConfig.java
@@ -1,22 +1,36 @@
 package com.kidgrow.oauth2.config;
 
+import com.kidgrow.oauth2.handler.SingleTokenServices;
 import com.kidgrow.oauth2.service.impl.RedisClientDetailsService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
 import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.ProviderManager;
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper;
 import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.oauth2.common.exceptions.InvalidTokenException;
 import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
 import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
 import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
 import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
 import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
 import org.springframework.security.oauth2.provider.code.RandomValueAuthorizationCodeServices;
 import org.springframework.security.oauth2.provider.error.WebResponseExceptionTranslator;
 import org.springframework.security.oauth2.provider.token.TokenEnhancer;
 import org.springframework.security.oauth2.provider.token.TokenEnhancerChain;
 import org.springframework.security.oauth2.provider.token.TokenStore;
 import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
+import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider;
 
 import javax.annotation.Resource;
 import java.util.Arrays;
@@ -36,8 +50,9 @@
     /**
      * 注入authenticationManager 来支持 password grant type
      */
-    @Autowired
-    private AuthenticationManager authenticationManager;
+//   @Autowired
+//    private AuthenticationManager authenticationManager;
+
 
     @Resource
     private UserDetailsService userDetailsService;
@@ -45,6 +60,9 @@
 
     @Autowired
     private TokenStore tokenStore;
+
+//    @Autowired
+//    private CustomRedisTokenStore tokenStore;
 
     @Autowired(required = false)
     private JwtAccessTokenConverter jwtAccessTokenConverter;
@@ -60,6 +78,11 @@
 
     @Autowired
     private RandomValueAuthorizationCodeServices authorizationCodeServices;
+    @Autowired
+    private AuthenticationProvider daoAuhthenticationOauthProvider;
+    @Autowired
+    private SingleTokenServices tokenServices;
+
 
     /**
      * 配置身份认证器,配置认证方式,TokenStore,TokenGranter,OAuth2RequestFactory
@@ -77,11 +100,75 @@
                 endpoints.accessTokenConverter(jwtAccessTokenConverter);
             }
         }
-        endpoints.tokenStore(tokenStore)
-                .authenticationManager(authenticationManager)
+        endpoints
+                //扩展tokenServices
+                .tokenServices(KidgrowTokenServices())
+                .authenticationManager(new AuthenticationManager(){
+                    @Override
+                    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+                        String token = (String) authentication.getPrincipal();
+                        OAuth2Authentication auth = tokenServices.loadAuthentication(token);
+                        if (auth == null) {
+                            throw new InvalidTokenException("Invalid token: " + token);
+                        }
+                        return daoAuhthenticationOauthProvider.authenticate(authentication);
+                    }
+                })
                 .userDetailsService(userDetailsService)
                 .authorizationCodeServices(authorizationCodeServices)
                 .exceptionTranslator(webResponseExceptionTranslator);
+
+    }
+    @Bean
+    DaoAuthenticationProvider daoAuthenticationProvider(){
+
+        DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
+
+        daoAuthenticationProvider.setPasswordEncoder(new BCryptPasswordEncoder());
+
+        daoAuthenticationProvider.setUserDetailsService(userDetailsService);
+
+        return daoAuthenticationProvider;
+
+    }
+
+    @Bean
+    @Primary
+    public SingleTokenServices KidgrowTokenServices(){
+        SingleTokenServices tokenServices = new SingleTokenServices();
+        tokenServices.setTokenStore(tokenStore);
+        tokenServices.setSupportRefreshToken(true);//支持刷新token
+        tokenServices.setReuseRefreshToken(true);
+        addUserDetailsService(tokenServices, this.userDetailsService);
+        return tokenServices;
+    }
+
+//    private SingleTokenServices tokenServices(AuthorizationServerEndpointsConfigurer endpoints) {
+//        SingleTokenServices tokenServices = new SingleTokenServices();
+//        tokenServices.setTokenStore(tokenStore);
+//        tokenServices.setSupportRefreshToken(true);//支持刷新token
+//        tokenServices.setReuseRefreshToken(true);
+//        tokenServices.setClientDetailsService(endpoints.getClientDetailsService());
+//        tokenServices.setTokenEnhancer(endpoints.getTokenEnhancer());
+//        addUserDetailsService(tokenServices, this.userDetailsService);
+//        return tokenServices;
+//    }
+//    private void addUserDetailsService(SingleTokenServices tokenServices, UserDetailsService userDetailsService) {
+//        if (userDetailsService != null) {
+//            PreAuthenticatedAuthenticationProvider provider = new PreAuthenticatedAuthenticationProvider();
+//            provider.setPreAuthenticatedUserDetailsService(new UserDetailsByNameServiceWrapper<>(
+//                    userDetailsService));
+//            tokenServices.setAuthenticationManager(new ProviderManager(Arrays.asList(provider)));
+//        }
+//    }
+
+    private void addUserDetailsService(SingleTokenServices tokenServices, UserDetailsService userDetailsService) {
+        if (userDetailsService != null) {
+            PreAuthenticatedAuthenticationProvider provider = new PreAuthenticatedAuthenticationProvider();
+            provider.setPreAuthenticatedUserDetailsService(new UserDetailsByNameServiceWrapper<>(
+                    userDetailsService));
+            tokenServices.setAuthenticationManager(new ProviderManager(Arrays.asList(provider)));
+        }
     }
 
     /**
diff --git a/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/config/SecurityConfig.java b/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/config/SecurityConfig.java
index 105d3ff..03c15b8 100644
--- a/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/config/SecurityConfig.java
+++ b/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/config/SecurityConfig.java
@@ -1,6 +1,7 @@
 package com.kidgrow.oauth2.config;
 
 import com.kidgrow.common.constant.SecurityConstants;
+//import com.kidgrow.oauth2.handler.InMemoryAuthenticationProvider;
 import com.kidgrow.oauth2.mobile.MobileAuthenticationSecurityConfig;
 import com.kidgrow.oauth2.openid.OpenIdAuthenticationSecurityConfig;
 import com.kidgrow.common.config.DefaultPasswordConfig;
@@ -9,19 +10,26 @@
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.ProviderManager;
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 import org.springframework.security.config.http.SessionCreationPolicy;
 import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
 import org.springframework.security.web.authentication.AuthenticationFailureHandler;
 import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
 import org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler;
 import org.springframework.security.web.authentication.logout.LogoutHandler;
+import org.springframework.security.web.header.HeaderWriterFilter;
+import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter;
 
 import javax.annotation.Resource;
+import java.util.Arrays;
 
 
 /**
@@ -63,6 +71,9 @@
 	@Autowired
 	private MobileAuthenticationSecurityConfig mobileAuthenticationSecurityConfig;
 
+//	@Autowired
+//	InMemoryAuthenticationProvider inMemoryAuthenticationProvider;
+
 	/**
 	 * 这一步的配置是必不可少的,否则SpringBoot会自动配置一个AuthenticationManager,覆盖掉内存中的用户
 	 * @return 认证管理对象
@@ -72,6 +83,22 @@
 	public AuthenticationManager authenticationManagerBean() throws Exception {
 		return super.authenticationManagerBean();
 	}
+//	@Bean
+//    @Override
+//	public AuthenticationManager authenticationManagerBean() throws Exception {
+//		// 认证管理器中只提供我需要的两个第一个是自定义认证,第二个是数据库认证,需要经过两层认证才能通过,默认的
+//
+//		// 构造函数不提供自定义认证Provider,那么默认提供DaoAuthenticationProvider
+//
+//		ProviderManager authenticationManager = new ProviderManager(Arrays.asList(inMemoryAuthenticationProvider, daoAuthenticationProvider()));
+//
+//		// 不擦除认证密码,擦除会导致TokenBasedRememberMeServices因为找不到Credentials再调用UserDetailsService而抛出UsernameNotFoundException
+//
+//		authenticationManager.setEraseCredentialsAfterAuthentication(false);
+//
+//		return authenticationManager;
+//	}
+
 
 	@Override
 	protected void configure(HttpSecurity http) throws Exception {
diff --git a/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/controller/OAuth2Controller.java b/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/controller/OAuth2Controller.java
index f5e695b..9478d1a 100644
--- a/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/controller/OAuth2Controller.java
+++ b/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/controller/OAuth2Controller.java
@@ -6,6 +6,7 @@
 import com.kidgrow.authclient.util.AuthUtils;
 import com.kidgrow.common.constant.SecurityConstants;
 import com.kidgrow.common.context.ClientContextHolder;
+import com.kidgrow.common.utils.AesUtils;
 import com.kidgrow.common.utils.ResponseUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -62,8 +63,12 @@
     public void getUserTokenInfo(
             @ApiParam(required = true, name = "username", value = "账号") String username,
             @ApiParam(required = true, name = "password", value = "密码") String password,
-            HttpServletRequest request, HttpServletResponse response) throws IOException {
-        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        //先解密
+        String decryptName = AesUtils.desEncrypt(username).trim();
+        String decryptPwd = AesUtils.desEncrypt(password).trim();
+
+        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(decryptName, decryptPwd);
         writerToken(request, response, token, "用户名或密码错误");
     }
 
diff --git a/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/controller/ValidateCodeController.java b/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/controller/ValidateCodeController.java
index 03d9e5d..0c72720 100644
--- a/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/controller/ValidateCodeController.java
+++ b/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/controller/ValidateCodeController.java
@@ -7,6 +7,7 @@
 import com.wf.captcha.base.Captcha;
 import com.wf.captcha.utils.CaptchaUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.stereotype.Controller;
 import org.springframework.util.Assert;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -33,13 +34,15 @@
      *
      * @throws Exception
      */
-    @GetMapping(SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX + "/{deviceId}")
+    @GetMapping(value=SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX + "/{deviceId}",produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
     public void createCode(@PathVariable String deviceId, HttpServletResponse response) throws Exception {
         Assert.notNull(deviceId, "机器码不能为空");
         // 设置请求头为输出图片类型
         CaptchaUtil.setHeader(response);
         // 三个参数分别为宽、高、位数
+//        GifCaptcha gifCaptcha = new GifCaptcha(100, 35, 4,new Font("actionj", 1, 32));
         GifCaptcha gifCaptcha = new GifCaptcha(100, 35, 4);
+//        gifCaptcha.setFont(Captcha.FONT_1);
         // 设置类型:字母数字混合
         gifCaptcha.setCharType(Captcha.TYPE_DEFAULT);
         // 保存验证码
diff --git a/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/handler/KidgrowTokenServices.java b/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/handler/KidgrowTokenServices.java
new file mode 100644
index 0000000..3627bec
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/handler/KidgrowTokenServices.java
@@ -0,0 +1,115 @@
+package com.kidgrow.oauth2.handler;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.oauth2.common.*;
+import org.springframework.security.oauth2.provider.ClientDetailsService;
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
+import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
+import org.springframework.security.oauth2.provider.token.TokenEnhancer;
+import org.springframework.security.oauth2.provider.token.TokenStore;
+
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/6/18 12:41 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+public class KidgrowTokenServices extends DefaultTokenServices {
+
+    private int refreshTokenValiditySeconds = 2592000;
+    private int accessTokenValiditySeconds = 43200;
+    private boolean supportRefreshToken = false;
+    private boolean reuseRefreshToken = true;
+    private ClientDetailsService clientDetailsService;
+    private TokenEnhancer accessTokenEnhancer;
+    private AuthenticationManager authenticationManager;
+
+    @Autowired
+    private TokenStore tokenStore;
+
+
+
+    @Override
+    public OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) throws AuthenticationException {
+        OAuth2AccessToken existingAccessToken = super.getAccessToken(authentication);
+        OAuth2RefreshToken refreshToken = null;
+        if (existingAccessToken != null) {
+//            if (!existingAccessToken.isExpired()) {
+//                this.tokenStore.storeAccessToken(existingAccessToken, authentication);
+//                return existingAccessToken;
+//            }
+            existingAccessToken.getRefreshToken();
+            if (existingAccessToken.getRefreshToken() != null) {
+                refreshToken = existingAccessToken.getRefreshToken();
+                this.tokenStore.removeRefreshToken(refreshToken);
+            }
+
+            this.tokenStore.removeAccessToken(existingAccessToken);
+        }
+
+
+        if (refreshToken == null) {
+            refreshToken = this.createRefreshToken(authentication);
+        } else if (refreshToken instanceof ExpiringOAuth2RefreshToken) {
+            ExpiringOAuth2RefreshToken expiring = (ExpiringOAuth2RefreshToken)refreshToken;
+            if (System.currentTimeMillis() > expiring.getExpiration().getTime()) {
+                refreshToken = this.createRefreshToken(authentication);
+            }
+        }
+
+        OAuth2AccessToken accessToken = this.createAccessToken(authentication, refreshToken);
+        this.tokenStore.storeAccessToken(accessToken, authentication);
+        refreshToken = accessToken.getRefreshToken();
+        if (refreshToken != null) {
+            this.tokenStore.storeRefreshToken(refreshToken, authentication);
+        }
+
+        return accessToken;
+    }
+
+//    @Override
+//    public void setTokenStore(TokenStore tokenStore) {
+//        this.tokenStore = tokenStore;
+//    }
+
+
+
+    @Override
+    public void setSupportRefreshToken(boolean supportRefreshToken) {
+        this.supportRefreshToken = supportRefreshToken;
+    }
+
+    @Override
+    public void setReuseRefreshToken(boolean reuseRefreshToken) {
+        this.reuseRefreshToken = reuseRefreshToken;
+    }
+
+    private OAuth2AccessToken createAccessToken(OAuth2Authentication authentication, OAuth2RefreshToken refreshToken) {
+        DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(UUID.randomUUID().toString());
+        int validitySeconds = this.getAccessTokenValiditySeconds(authentication.getOAuth2Request());
+        if (validitySeconds > 0) {
+            token.setExpiration(new Date(System.currentTimeMillis() + (long)validitySeconds * 1000L));
+        }
+
+        token.setRefreshToken(refreshToken);
+        token.setScope(authentication.getOAuth2Request().getScope());
+        return (OAuth2AccessToken)(this.accessTokenEnhancer != null ? this.accessTokenEnhancer.enhance(token, authentication) : token);
+    }
+
+    private OAuth2RefreshToken createRefreshToken(OAuth2Authentication authentication) {
+        if (!this.isSupportRefreshToken(authentication.getOAuth2Request())) {
+            return null;
+        } else {
+            int validitySeconds = this.getRefreshTokenValiditySeconds(authentication.getOAuth2Request());
+            String value = UUID.randomUUID().toString();
+            return (OAuth2RefreshToken)(validitySeconds > 0 ? new DefaultExpiringOAuth2RefreshToken(value, new Date(System.currentTimeMillis() + (long)validitySeconds * 1000L)) : new DefaultOAuth2RefreshToken(value));
+        }
+    }
+}
diff --git a/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/handler/SingleTokenServices.java b/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/handler/SingleTokenServices.java
new file mode 100644
index 0000000..4fe6897
--- /dev/null
+++ b/kidgrow-uaa/kidgrow-uaa-server/src/main/java/com/kidgrow/oauth2/handler/SingleTokenServices.java
@@ -0,0 +1,309 @@
+package com.kidgrow.oauth2.handler;
+/**
+ * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
+ *
+ * @Description: <br>
+ * @Project: <br>
+ * @CreateDate: Created in 2020/6/18 09:17 <br>
+ * @Author: <a href="4345453@kidgrow.com">liuke</a>
+ */
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.oauth2.common.*;
+import org.springframework.security.oauth2.common.exceptions.InvalidGrantException;
+import org.springframework.security.oauth2.common.exceptions.InvalidScopeException;
+import org.springframework.security.oauth2.common.exceptions.InvalidTokenException;
+import org.springframework.security.oauth2.provider.*;
+import org.springframework.security.oauth2.provider.token.*;
+import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken;
+//import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+
+import java.util.Date;
+import java.util.Set;
+import java.util.UUID;
+
+/** @deprecated */
+@Deprecated
+public class SingleTokenServices implements AuthorizationServerTokenServices, ResourceServerTokenServices, ConsumerTokenServices, InitializingBean {
+    private int refreshTokenValiditySeconds = 2592000;
+    private int accessTokenValiditySeconds = 10800;//43200   //登录时,给的默认值;一段时间后,用的查询数据库中的oauth_client_details的表的access_token_validity;
+    private boolean supportRefreshToken = false;
+    private boolean reuseRefreshToken = true;
+    private TokenStore tokenStore;
+    private ClientDetailsService clientDetailsService;
+    private TokenEnhancer accessTokenEnhancer;
+    private AuthenticationManager authenticationManager;
+
+    public SingleTokenServices() {
+    }
+
+    public void afterPropertiesSet() throws Exception {
+        Assert.notNull(this.tokenStore, "tokenStore must be set");
+    }
+
+    @Transactional
+    public OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) throws AuthenticationException {
+        OAuth2AccessToken existingAccessToken = this.tokenStore.getAccessToken(authentication);
+        OAuth2RefreshToken refreshToken = null;
+        if (existingAccessToken != null) {
+//            if (!existingAccessToken.isExpired()) {
+//                this.tokenStore.storeAccessToken(existingAccessToken, authentication);
+//                return existingAccessToken;
+//            }
+
+            if (existingAccessToken.getRefreshToken() != null) {
+                refreshToken = existingAccessToken.getRefreshToken();
+                this.tokenStore.removeRefreshToken(refreshToken);
+            }
+
+            this.tokenStore.removeAccessToken(existingAccessToken);
+        }
+
+        if (refreshToken == null) {
+            refreshToken = this.createRefreshToken(authentication);
+        } else if (refreshToken instanceof ExpiringOAuth2RefreshToken) {
+            ExpiringOAuth2RefreshToken expiring = (ExpiringOAuth2RefreshToken)refreshToken;
+            if (System.currentTimeMillis() > expiring.getExpiration().getTime()) {
+                refreshToken = this.createRefreshToken(authentication);
+            }
+        }
+
+        OAuth2AccessToken accessToken = this.createAccessToken(authentication, refreshToken);
+        this.tokenStore.storeAccessToken(accessToken, authentication);
+        refreshToken = accessToken.getRefreshToken();
+        if (refreshToken != null) {
+            this.tokenStore.storeRefreshToken(refreshToken, authentication);
+        }
+
+        return accessToken;
+    }
+
+    @Transactional(
+            noRollbackFor = {InvalidTokenException.class, InvalidGrantException.class}
+    )
+    public OAuth2AccessToken refreshAccessToken(String refreshTokenValue, TokenRequest tokenRequest) throws AuthenticationException {
+        if (!this.supportRefreshToken) {
+            throw new InvalidGrantException("Invalid refresh token: " + refreshTokenValue);
+        } else {
+            OAuth2RefreshToken refreshToken = this.tokenStore.readRefreshToken(refreshTokenValue);
+            if (refreshToken == null) {
+                throw new InvalidGrantException("Invalid refresh token: " + refreshTokenValue);
+            } else {
+                OAuth2Authentication authentication = this.tokenStore.readAuthenticationForRefreshToken(refreshToken);
+                if (this.authenticationManager != null && !authentication.isClientOnly()) {
+                    Authentication user = new PreAuthenticatedAuthenticationToken(authentication.getUserAuthentication(), "", authentication.getAuthorities());
+                    user = this.authenticationManager.authenticate(user);
+                    Object details = authentication.getDetails();
+                    authentication = new OAuth2Authentication(authentication.getOAuth2Request(), user);
+                    authentication.setDetails(details);
+                }
+
+                String clientId = authentication.getOAuth2Request().getClientId();
+                if (clientId != null && clientId.equals(tokenRequest.getClientId())) {
+                    this.tokenStore.removeAccessTokenUsingRefreshToken(refreshToken);
+                    if (this.isExpired(refreshToken)) {
+                        this.tokenStore.removeRefreshToken(refreshToken);
+                        throw new InvalidTokenException("Invalid refresh token (expired): " + refreshToken);
+                    } else {
+                        authentication = this.createRefreshedAuthentication(authentication, tokenRequest);
+                        if (!this.reuseRefreshToken) {
+                            this.tokenStore.removeRefreshToken(refreshToken);
+                            refreshToken = this.createRefreshToken(authentication);
+                        }
+
+                        OAuth2AccessToken accessToken = this.createAccessToken(authentication, refreshToken);
+                        this.tokenStore.storeAccessToken(accessToken, authentication);
+                        if (!this.reuseRefreshToken) {
+                            this.tokenStore.storeRefreshToken(accessToken.getRefreshToken(), authentication);
+                        }
+
+                        return accessToken;
+                    }
+                } else {
+                    throw new InvalidGrantException("Wrong client for this refresh token: " + refreshTokenValue);
+                }
+            }
+        }
+    }
+
+    public OAuth2AccessToken getAccessToken(OAuth2Authentication authentication) {
+        return this.tokenStore.getAccessToken(authentication);
+    }
+
+    private OAuth2Authentication createRefreshedAuthentication(OAuth2Authentication authentication, TokenRequest request) {
+        Set<String> scope = request.getScope();
+        OAuth2Request clientAuth = authentication.getOAuth2Request().refresh(request);
+        if (scope != null && !scope.isEmpty()) {
+            Set<String> originalScope = clientAuth.getScope();
+            if (originalScope == null || !originalScope.containsAll(scope)) {
+                throw new InvalidScopeException("Unable to narrow the scope of the client authentication to " + scope + ".", originalScope);
+            }
+
+            clientAuth = clientAuth.narrowScope(scope);
+        }
+
+        OAuth2Authentication narrowed = new OAuth2Authentication(clientAuth, authentication.getUserAuthentication());
+        return narrowed;
+    }
+
+    protected boolean isExpired(OAuth2RefreshToken refreshToken) {
+        if (!(refreshToken instanceof ExpiringOAuth2RefreshToken)) {
+            return false;
+        } else {
+            ExpiringOAuth2RefreshToken expiringToken = (ExpiringOAuth2RefreshToken)refreshToken;
+            return expiringToken.getExpiration() == null || System.currentTimeMillis() > expiringToken.getExpiration().getTime();
+        }
+    }
+
+    public OAuth2AccessToken readAccessToken(String accessToken) {
+        return this.tokenStore.readAccessToken(accessToken);
+    }
+
+    public OAuth2Authentication loadAuthentication(String accessTokenValue) throws AuthenticationException, InvalidTokenException {
+        OAuth2AccessToken accessToken = this.tokenStore.readAccessToken(accessTokenValue);
+        if (accessToken == null) {
+            throw new InvalidTokenException("Invalid access token:1 " + accessTokenValue);
+        } else if (accessToken.isExpired()) {
+            this.tokenStore.removeAccessToken(accessToken);
+            throw new InvalidTokenException("Access token expired: " + accessTokenValue);
+        } else {
+            OAuth2Authentication result = this.tokenStore.readAuthentication(accessToken);
+            if (result == null) {
+                throw new InvalidTokenException("Invalid access token:2 " + accessTokenValue);
+            } else {
+                if (this.clientDetailsService != null) {
+                    String clientId = result.getOAuth2Request().getClientId();
+
+                    try {
+                        this.clientDetailsService.loadClientByClientId(clientId);
+                    } catch (ClientRegistrationException var6) {
+                        throw new InvalidTokenException("Client not valid: " + clientId, var6);
+                    }
+                }
+
+                return result;
+            }
+        }
+    }
+
+    public String getClientId(String tokenValue) {
+        OAuth2Authentication authentication = this.tokenStore.readAuthentication(tokenValue);
+        if (authentication == null) {
+            throw new InvalidTokenException("Invalid access token:3 " + tokenValue);
+        } else {
+            OAuth2Request clientAuth = authentication.getOAuth2Request();
+            if (clientAuth == null) {
+                throw new InvalidTokenException("Invalid access token (no client id): " + tokenValue);
+            } else {
+                return clientAuth.getClientId();
+            }
+        }
+    }
+
+    public boolean revokeToken(String tokenValue) {
+        OAuth2AccessToken accessToken = this.tokenStore.readAccessToken(tokenValue);
+        if (accessToken == null) {
+            return false;
+        } else {
+            if (accessToken.getRefreshToken() != null) {
+                this.tokenStore.removeRefreshToken(accessToken.getRefreshToken());
+            }
+
+            this.tokenStore.removeAccessToken(accessToken);
+            return true;
+        }
+    }
+
+    private OAuth2RefreshToken createRefreshToken(OAuth2Authentication authentication) {
+        if (!this.isSupportRefreshToken(authentication.getOAuth2Request())) {
+            return null;
+        } else {
+            int validitySeconds = this.getRefreshTokenValiditySeconds(authentication.getOAuth2Request());
+            String value = UUID.randomUUID().toString();
+            return (OAuth2RefreshToken)(validitySeconds > 0 ? new DefaultExpiringOAuth2RefreshToken(value, new Date(System.currentTimeMillis() + (long)validitySeconds * 1000L)) : new DefaultOAuth2RefreshToken(value));
+        }
+    }
+
+    private OAuth2AccessToken createAccessToken(OAuth2Authentication authentication, OAuth2RefreshToken refreshToken) {
+        DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(UUID.randomUUID().toString());
+        int validitySeconds = this.getAccessTokenValiditySeconds(authentication.getOAuth2Request());
+        if (validitySeconds > 0) {
+            token.setExpiration(new Date(System.currentTimeMillis() + (long)validitySeconds * 1000L));
+        }
+
+        token.setRefreshToken(refreshToken);
+        token.setScope(authentication.getOAuth2Request().getScope());
+        return (OAuth2AccessToken)(this.accessTokenEnhancer != null ? this.accessTokenEnhancer.enhance(token, authentication) : token);
+    }
+
+    protected int getAccessTokenValiditySeconds(OAuth2Request clientAuth) {
+        if (this.clientDetailsService != null) {
+            ClientDetails client = this.clientDetailsService.loadClientByClientId(clientAuth.getClientId());
+            Integer validity = client.getAccessTokenValiditySeconds();
+            if (validity != null) {
+                return validity;
+            }
+        }
+
+        return this.accessTokenValiditySeconds;
+    }
+
+    protected int getRefreshTokenValiditySeconds(OAuth2Request clientAuth) {
+        if (this.clientDetailsService != null) {
+            ClientDetails client = this.clientDetailsService.loadClientByClientId(clientAuth.getClientId());
+            Integer validity = client.getRefreshTokenValiditySeconds();
+            if (validity != null) {
+                return validity;
+            }
+        }
+
+        return this.refreshTokenValiditySeconds;
+    }
+
+    protected boolean isSupportRefreshToken(OAuth2Request clientAuth) {
+        if (this.clientDetailsService != null) {
+            ClientDetails client = this.clientDetailsService.loadClientByClientId(clientAuth.getClientId());
+            return client.getAuthorizedGrantTypes().contains("refresh_token");
+        } else {
+            return this.supportRefreshToken;
+        }
+    }
+
+    public void setTokenEnhancer(TokenEnhancer accessTokenEnhancer) {
+        this.accessTokenEnhancer = accessTokenEnhancer;
+    }
+
+    public void setRefreshTokenValiditySeconds(int refreshTokenValiditySeconds) {
+        this.refreshTokenValiditySeconds = refreshTokenValiditySeconds;
+    }
+
+    public void setAccessTokenValiditySeconds(int accessTokenValiditySeconds) {
+        this.accessTokenValiditySeconds = accessTokenValiditySeconds;
+    }
+
+    public void setSupportRefreshToken(boolean supportRefreshToken) {
+        this.supportRefreshToken = supportRefreshToken;
+    }
+
+    public void setReuseRefreshToken(boolean reuseRefreshToken) {
+        this.reuseRefreshToken = reuseRefreshToken;
+    }
+
+    public void setTokenStore(TokenStore tokenStore) {
+        this.tokenStore = tokenStore;
+    }
+
+    public void setAuthenticationManager(AuthenticationManager authenticationManager) {
+        this.authenticationManager = authenticationManager;
+    }
+
+    public void setClientDetailsService(ClientDetailsService clientDetailsService) {
+        this.clientDetailsService = clientDetailsService;
+    }
+}
+
diff --git a/kidgrow-uaa/kidgrow-uaa-server/src/main/resources/application.yml b/kidgrow-uaa/kidgrow-uaa-server/src/main/resources/application.yml
index 58af5e9..30f4715 100644
--- a/kidgrow-uaa/kidgrow-uaa-server/src/main/resources/application.yml
+++ b/kidgrow-uaa/kidgrow-uaa-server/src/main/resources/application.yml
@@ -14,10 +14,10 @@
   application:
     name: uaa-server
   datasource:
-    url: jdbc:mysql://${kidgrow.datasource.ip}:3306/oauth_center?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
+    url: jdbc:mysql://${kidgrow.datasource.ip}:3306/oauth_center_${spring.profiles.active}?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
     username: ${kidgrow.datasource.username}
     password: ${kidgrow.datasource.password}
-    driver-class-name: com.mysql.jdbc.Driver
+#    driver-class-name: com.mysql.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
     druid:
       aop-patterns: com.kidgrow.oauth2.controller.*
@@ -56,7 +56,7 @@
   security:
     code:
       # 忽略验证码的应用编号
-      ignoreClientCode: app
+      ignoreClientCode: app,hospital,webApp,readxapp
 
 encrypt:
   key-store:
diff --git a/kidgrow-web/kidgrow-web-hospital/Dockerfile b/kidgrow-web/kidgrow-web-hospital/Dockerfile
new file mode 100644
index 0000000..fef5f1e
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-hospital/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-hospital/pom.xml b/kidgrow-web/kidgrow-web-hospital/pom.xml
index 766fdd5..5479a0e 100644
--- a/kidgrow-web/kidgrow-web-hospital/pom.xml
+++ b/kidgrow-web/kidgrow-web-hospital/pom.xml
@@ -75,6 +75,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/login.html b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/login.html
index fe6e592..acf9679 100644
--- a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/login.html
+++ b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/login.html
@@ -118,18 +118,18 @@
                     // debugger;
                     if (data.code === 0) {
                         config.putToken(data.data);
-                        layer.msg('登录成功', {icon: 1, time: 500}, function () {
+                        layer.msg('登录成功', {icon: 1, time: 2000}, function () {
                             location.replace('./');
                         });
                     } else {
                         layer.closeAll('loading');
-                        layer.msg(data.msg, {icon: 5, time: 500});
+                        layer.msg(data.msg, {icon: 5, time: 2000});
                     }
                 },
                 error: function (xhr) {
                     //console.log(xhr)
                     layer.closeAll('loading');
-                    layer.msg(xhr.responseJSON.msg, {icon: 5, time: 500});
+                    layer.msg(xhr.responseJSON.msg, {icon: 5, time: 2000});
                 }
             });
             //阻止表单跳转
diff --git a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/attestation/app.html b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/attestation/app.html
index 4ba4d01..4d9a49a 100644
--- a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/attestation/app.html
+++ b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/attestation/app.html
@@ -109,7 +109,7 @@
                 layer.load(2);
                 admin.req('api-uaa/clients/' + obj.data.id, {}, function (data) {
                     layer.closeAll('loading');
-                    layer.msg('成功', {icon: 1, time: 500});
+                    layer.msg('成功', {icon: 1, time: 2000});
                     obj.del();
                 }, 'DELETE');
             });
@@ -156,11 +156,11 @@
                 layer.closeAll('loading');
                 console.log(data);
                 if (data.code == 0) {
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                    layer.msg(data.msg, {icon: 1, time: 2000});
                     table.reload('app-table');
                     layer.closeAll('page');
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, {icon: 2, time: 2000});
                 }
             }, $('#app-form').attr('method'));
             return false;
diff --git a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/files/files.html b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/files/files.html
index a294603..5201e79 100644
--- a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/files/files.html
+++ b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/files/files.html
@@ -87,10 +87,10 @@
                 admin.req('api-file/files/' + obj.data.id, {}, function (data) {
                     layer.closeAll('loading');
                     if (data.resp_code == 0) {
-                        layer.msg(data.resp_msg, {icon: 1, time: 500});
+                        layer.msg(data.resp_msg, {icon: 1, time: 2000});
                         obj.del();
                     } else {
-                        layer.msg(data.resp_msg, {icon: 2, time: 500});
+                        layer.msg(data.resp_msg, {icon: 2, time: 2000});
                     }
                 }, 'DELETE');
             });
diff --git a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager.html b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager.html
index aec9112..12c4a45 100644
--- a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager.html
+++ b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager.html
@@ -102,10 +102,10 @@
                 admin.req('api-search/admin/index?indexName='+obj.data.indexName, {}, function (data) {
                     layer.closeAll('loading');
                     if (data.resp_code == 0) {
-                        layer.msg(data.resp_msg, {icon: 1, time: 500});
+                        layer.msg(data.resp_msg, {icon: 1, time: 2000});
                         obj.del();
                     } else {
-                        layer.msg(data.resp_msg, {icon: 2, time: 500});
+                        layer.msg(data.resp_msg, {icon: 2, time: 2000});
                     }
                 }, 'DELETE');
             });
diff --git a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager_form.html b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager_form.html
index 93e93a0..738dbdd 100644
--- a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager_form.html
+++ b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager_form.html
@@ -48,10 +48,10 @@
             admin.req('api-search/admin/index', JSON.stringify(data.field), function (data) {
                 layer.closeAll('loading');
                 if (data.resp_code == 0) {
-                    layer.msg(data.resp_msg, {icon: 1, time: 500});
+                    layer.msg(data.resp_msg, {icon: 1, time: 2000});
                     admin.finishPopupCenter();
                 } else {
-                    layer.msg(data.resp_msg, {icon: 2, time: 500});
+                    layer.msg(data.resp_msg, {icon: 2, time: 2000});
                 }
             }, "POST");
             return false;
diff --git a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager_view.html b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager_view.html
index aff0216..135fb07 100644
--- a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager_view.html
+++ b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/search/index_manager_view.html
@@ -26,7 +26,7 @@
                 if (0 == data.resp_code) {
                     $('#data').html(syntaxHighlight(data.datas));
                 } else {
-                    layer.msg('获取索引信息失败', {icon: 2, time: 500});
+                    layer.msg('获取索引信息失败', {icon: 2, time: 2000});
                 }
             }, 'GET');
         }
diff --git a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/menus.html b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/menus.html
index d7c9f88..adde00f 100644
--- a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/menus.html
+++ b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/menus.html
@@ -98,7 +98,7 @@
                 })
                 form.render();
             } else {
-                layer.msg(data.msg, {icon: 2, time: 500});
+                layer.msg(data.msg, {icon: 2, time: 2000});
             }
         }, 'GET');
 
@@ -116,10 +116,10 @@
                     admin.req('api-user/menus/'+obj.data.id+'?tenantId='+tenantId, {}, function (data) {
                         layer.closeAll('loading');
                         if (0 === data.code) {
-                            layer.msg(data.msg, {icon: 1, time: 500});
+                            layer.msg(data.msg, {icon: 1, time: 2000});
                             renderTable({tenantId: tenantId});
                         } else {
-                            layer.msg(data.msg, {icon: 2, time: 500});
+                            layer.msg(data.msg, {icon: 2, time: 2000});
                         }
                     }, 'DELETE');
                 });
@@ -170,7 +170,7 @@
                 }
             });
             if (keyword !== '' && searchCount === 0) {
-                layer.msg("没有匹配结果", {icon: 5, time: 500});
+                layer.msg("没有匹配结果", {icon: 5, time: 2000});
             } else {
                 treetable.expandAll('#menus-table');
             }
diff --git a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/menus_form.html b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/menus_form.html
index afca6db..3d5fbd8 100644
--- a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/menus_form.html
+++ b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/menus_form.html
@@ -113,7 +113,7 @@
                 }
                 form.render();  //菜单渲染 把内容加载进去
             } else {
-                layer.msg('获取一级菜单', {icon: 2, time: 500});
+                layer.msg('获取一级菜单', {icon: 2, time: 2000});
             }
         }, 'GET');
 
@@ -123,11 +123,11 @@
             admin.req('api-user/menus/saveOrUpdate?tenantId='+menus.tenantId, JSON.stringify(data.field), function (data) {
                 if (data.code === 0) {
                 	layer.closeAll('loading');
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                    layer.msg(data.msg, {icon: 1, time: 2000});
                     admin.finishPopupCenter();
                 } else {
                 	layer.closeAll('loading');
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, {icon: 2, time: 2000});
                 }
             }, $('#menus-form').attr('method'));
             return false;
diff --git a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/myInfo.html b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/myInfo.html
index b7558fd..69fe632 100644
--- a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/myInfo.html
+++ b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/myInfo.html
@@ -73,11 +73,11 @@
                 if (data.code == 0) {
                     layer.closeAll('loading');
                     $(".layui-nav-img").attr("src",$("[name=headImgUrl]").val());
-                    layer.msg("操作成功", {icon: 1, time: 500});
+                    layer.msg("操作成功", {icon: 1, time: 2000});
 
                     form.val('user-form',data.data);
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, {icon: 2, time: 2000});
                 }
             }, 'POST');
             return false;
diff --git a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/role.html b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/role.html
index f5e52c6..187ea77 100644
--- a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/role.html
+++ b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/role.html
@@ -105,7 +105,7 @@
                 })
                 form.render();
             } else {
-                layer.msg(data.msg, {icon: 2, time: 500});
+                layer.msg(data.msg, {icon: 2, time: 2000});
             }
         }, 'GET');
 
@@ -122,11 +122,11 @@
                 layer.closeAll('loading');
                 console.log(data);
                 if (data.code === 0) {
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                    layer.msg(data.msg, {icon: 1, time: 2000});
                     table.reload('role-table');
                     layer.closeAll('page');
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, {icon: 2, time: 2000});
                 }
             }, $('#role-form').attr('method'));
             return false;
@@ -181,10 +181,10 @@
                 admin.req('api-user/roles/' + obj.data.id+'?tenantId='+tenantId, {}, function (data) {
                     layer.closeAll('loading');
                     if (data.code === 0) {
-                        layer.msg(data.msg, {icon: 1, time: 500});
+                        layer.msg(data.msg, {icon: 1, time: 2000});
                         obj.del();
                     } else {
-                        layer.msg(data.msg, {icon: 2, time: 500});
+                        layer.msg(data.msg, {icon: 2, time: 2000});
                     }
                 }, 'DELETE');
             });
@@ -236,10 +236,10 @@
                     admin.req('api-user/menus/granted?tenantId='+tenantId, JSON.stringify(data) , function (data) {
                         layer.closeAll('loading');
                         if (0 == data.code) {
-                            layer.msg(data.msg, {icon: 1, time: 500});
+                            layer.msg(data.msg, {icon: 1, time: 2000});
                             layer.close(index);
                         } else {
-                            layer.msg(data.msg, {icon: 2, time: 500});
+                            layer.msg(data.msg, {icon: 2, time: 2000});
                         }
                     }, 'POST');
                 }
diff --git a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/tokens.html b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/tokens.html
index f217537..8943ec7 100644
--- a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/tokens.html
+++ b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/tokens.html
@@ -72,7 +72,7 @@
                 })
                 form.render();
             } else {
-                layer.msg(data.msg, {icon: 2, time: 500});
+                layer.msg(data.msg, {icon: 2, time: 2000});
             }
         }, 'GET');
 
@@ -90,7 +90,7 @@
                 layer.load(2);
                 admin.req('api-uaa/oauth/remove/token?token=' + obj.data.tokenValue, {}, function (data) {
                     layer.closeAll('loading');
-                    layer.msg('成功', {icon: 1, time: 500});
+                    layer.msg('成功', {icon: 1, time: 2000});
                     obj.del();
                 }, 'DELETE');
             });
diff --git a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/user.html b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/user.html
index 38acaaf..b6b125d 100644
--- a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/user.html
+++ b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/user.html
@@ -99,9 +99,9 @@
                     admin.req('api-user/users/'+obj.data.id+'/password', {}, function (data) {
                         layer.closeAll('loading');
                         if (data.ode == 0) {
-                            layer.msg(data.msg, {icon: 1, time: 500});
+                            layer.msg(data.msg, {icon: 1, time: 2000});
                         } else {
-                            layer.msg(data.msg, {icon: 2, time: 500});
+                            layer.msg(data.msg, {icon: 2, time: 2000});
                         }
                     }, 'PUT');
                 });
@@ -112,10 +112,10 @@
                     admin.req('api-user/users/'+obj.data.id, {}, function (data) {
                         layer.closeAll('loading');
                         if (data.code == 0) {
-                            layer.msg(data.msg, {icon: 1, time: 500});
+                            layer.msg(data.msg, {icon: 1, time: 2000});
                             table.reload('user-table', {});
                         } else {
-                            layer.msg(data.msg, {icon: 2, time: 500});
+                            layer.msg(data.msg, {icon: 2, time: 2000});
                         }
                     }, 'delete');
                 });
@@ -182,10 +182,10 @@
             }, function (data) {
                 layer.closeAll('loading');
                 if (data.code == 0) {
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                    layer.msg(data.msg, {icon: 1, time: 2000});
                     //table.reload('table-user', {});
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, {icon: 2, time: 2000});
                     $(obj.elem).prop('checked', !obj.elem.checked);
                     form.render('checkbox');
                 }
@@ -202,10 +202,10 @@
             ,headers: {"Authorization" : "Bearer " + config.getToken().access_token}
             ,done: function(data){
                 if (data.code == 0) {
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                    layer.msg(data.msg, {icon: 1, time: 2000});
                     table.reload('user-table', {});
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, {icon: 2, time: 2000});
                 }
             }
         });
diff --git a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/user_form.html b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/user_form.html
index fd9033b..df2f2aa 100644
--- a/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/user_form.html
+++ b/kidgrow-web/kidgrow-web-hospital/src/main/resources/static/pages/system/user_form.html
@@ -77,7 +77,7 @@
                     formSelects.value('roleId', rds);
                 }
             } else {
-                layer.msg('获取角色失败', {icon: 2, time: 500});
+                layer.msg('获取角色失败', {icon: 2, time: 2000});
             }
         }, 'GET');
 
@@ -87,10 +87,10 @@
             admin.req('api-user/users/saveOrUpdate', JSON.stringify(data.field), function (data) {
                 layer.closeAll('loading');
                 if (data.code == 0) {
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                    layer.msg(data.msg, {icon: 1, time: 2000});
                     admin.finishPopupCenter();
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, {icon: 2, time: 2000});
                 }
             }, "POST");
             return false;
diff --git a/kidgrow-web/kidgrow-web-manager/Dockerfile b/kidgrow-web/kidgrow-web-manager/Dockerfile
new file mode 100644
index 0000000..fef5f1e
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/pom.xml b/kidgrow-web/kidgrow-web-manager/pom.xml
index 3db5b22..621195c 100644
--- a/kidgrow-web/kidgrow-web-manager/pom.xml
+++ b/kidgrow-web/kidgrow-web-manager/pom.xml
@@ -75,6 +75,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.5</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/.vscode/settings.json b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/.vscode/settings.json
new file mode 100644
index 0000000..6f3a291
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+    "liveServer.settings.port": 5501
+}
\ No newline at end of file
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 89176d4..e1908dc 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,33 @@
 }).extend({
     formSelects: 'formSelects/formSelects-v4',
     treetable: 'treetable-lay/treetable',
+    treetable2: 'treetable2/TreeTable',
+    autocomplete: 'complete/autocomplete',
     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) {
@@ -24,4 +46,271 @@
 // 移除主题
 function removeTheme() {
     layui.jquery('link[id^=layuicss-assetscsstheme]').remove();
+}
+
+/**
+ * js常用工具类
+ */
+
+/**
+ * 方法作用:【格式化时间】
+ * 使用方法
+ * 示例:
+ *      使用方式一:
+ *      var now = new Date();
+ *      var nowStr = now.dateFormat("yyyy-MM-dd hh:mm:ss");
+ *      使用方式二:
+ *      new Date().dateFormat("yyyy年MM月dd日");
+ *      new Date().dateFormat("MM/dd/yyyy");
+ *      new Date().dateFormat("yyyyMMdd");
+ *      new Date().dateFormat("yyyy-MM-dd hh:mm:ss");
+ * @param format {date} 传入要格式化的日期类型
+ * @returns {2015-01-31 16:30:00}
+ */
+Date.prototype.dateFormat = function (format) {
+    var o = {
+        "M+": this.getMonth() + 1, //month
+        "d+": this.getDate(), //day
+        "h+": this.getHours(), //hour
+        "m+": this.getMinutes(), //minute
+        "s+": this.getSeconds(), //second
+        "q+": Math.floor((this.getMonth() + 3) / 3), //quarter
+        "S": this.getMilliseconds() //millisecond
+    }
+    if (/(y+)/.test(format)) {
+        format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
+    }
+    for (var k in o) {
+        if (new RegExp("(" + k + ")").test(format)) {
+            format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
+        }
+    }
+    return format;
+}
+/***********************************************************************
+ *                           日期时间工具类                            *
+ *                     注:调用方式,deteUtil.方法名                   *
+ * ********************************************************************/
+var dateUtil = {
+    /*
+     * 方法作用:【取传入日期是星期几】
+     * 使用方法:dateUtil.nowFewWeeks(new Date());
+     * @param date{date} 传入日期类型
+     * @returns {星期四,...}
+     */
+    nowFewWeeks: function (date) {
+        if (date instanceof Date) {
+            var dayNames = new Array("星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
+            return dayNames[date.getDay()];
+        } else {
+            return "Param error,date type!";
+        }
+    },
+    /**
+     * 比较第一个时间值和第二个时间值的大小  如果第一个大 返回true  否则返回false
+     * **/
+    compareDate: function (datebegin, dateend) {
+        var datebegindate = dateUtil.strTurnDate(datebegin);
+        var dateenddate = dateUtil.strTurnDate(dateend);
+        if (datebegindate > dateenddate) {
+            return true;
+        } else {
+            return false;
+        }
+    },
+    /***
+     * 获取今天的时间字符串
+     */
+    getNowDate: function () {
+        var dayTime = new Date();
+        dayTime.setTime(dayTime.getTime());
+        return dayTime.getFullYear() + "-" + (dayTime.getMonth() + 1) + "-" + dayTime.getDate();
+    },
+    /*
+     * 方法作用:【字符串转换成日期】
+     * 使用方法:dateUtil.strTurnDate("2010-01-01");
+     * @param str {String}字符串格式的日期,传入格式:yyyy-mm-dd(2015-01-31)
+     * @return {Date}由字符串转换成的日期
+     */
+    strTurnDate: function (str) {
+        var re = /^(\d{4})\S(\d{1,2})\S(\d{1,2})$/;
+        var dt;
+        if (re.test(str)) {
+            dt = new Date(RegExp.$1, RegExp.$2 - 1, RegExp.$3);
+        }
+        return dt;
+    },
+    /*
+     * 方法作用:【计算2个日期之间的天数】
+     * 传入格式:yyyy-mm-dd(2015-01-31)
+     * 使用方法:dateUtil.dayMinus(startDate,endDate);
+     * @startDate {Date}起始日期
+     * @endDate {Date}结束日期
+     * @return endDate - startDate的天数差
+     */
+    dayMinus: function (startDate, endDate) {
+        if (startDate instanceof Date && endDate instanceof Date) {
+            var days = Math.floor((endDate - startDate) / (1000 * 60 * 60 * 24));
+            return days;
+        } else {
+            return "Param error,date type!";
+        }
+    },
+    /**
+     * 判断一个字符串是否日期
+     * @param {字符串} strDate 
+     */
+    isDate: function (strDate) {
+        if (!strUtil.isEmpty(strDate) && !isNaN(Date.parse(strDate))) {
+            return true;
+        }
+        return false;
+    }
+};
+
+/***********************************************************************
+ *                           加载工具类                                *
+ *                     注:调用方式,loadUtil.方法名                   *
+ * ********************************************************************/
+var loadUtil = {
+    /*
+     * 方法说明:【动态加载js文件css文件】
+     * 使用方法:loadUtil.loadjscssfile("http://XXXXXXXXXXXXXXXXXX/jquery.js","js")
+     * @param fileurl 文件路径,
+     * @param filetype 文件类型,支持传入类型,js、css
+     */
+    loadjscssfile: function (fileurl, filetype) {
+        if (filetype == "js") {
+            var fileref = document.createElement('script');
+            fileref.setAttribute("type", "text/javascript");
+            fileref.setAttribute("src", fileurl);
+        } else if (filetype == "css") {
+
+            var fileref = document.createElement('link');
+            fileref.setAttribute("rel", "stylesheet");
+            fileref.setAttribute("type", "text/css");
+            fileref.setAttribute("href", fileurl);
+        }
+        if (typeof fileref != "undefined") {
+            document.getElementsByTagName("head")[0].appendChild(fileref);
+        } else {
+            alert("loadjscssfile method error!");
+        }
+    }
+};
+
+/***********************************************************************
+ *                           字符串操作工具类                          *
+ *                     注:调用方式,strUtil.方法名                   *
+ * ********************************************************************/
+var strUtil = {
+    /*
+     * 判断字符串是否为空
+     * @param str 传入的字符串
+     * @returns {}
+     */
+    isEmpty: function (str) {
+        if (str != '' && str != undefined && str != null) {
+            return false;
+        } else {
+            return true;
+        }
+    },
+    /*
+     * 判断两个字符串子否相同
+     * @param str1
+     * @param str2
+     * @returns {Boolean}
+     */
+    isEquals: function (str1, str2) {
+        if (str1 == str2) {
+            return true;
+        } else {
+            return false;
+        }
+    },
+    /*
+     * 忽略大小写判断字符串是否相同
+     * @param str1
+     * @param str2
+     * @returns {Boolean}
+     */
+    isEqualsIgnorecase: function (str1, str2) {
+        if (str1.toUpperCase() == str2.toUpperCase()) {
+            return true;
+        } else {
+            return false;
+        }
+    },
+    /**
+     * 判断是否是数字
+     * @param value
+     * @returns {Boolean}
+     */
+    isNum: function (value) {
+        if (value != null && value.length > 0 && isNaN(value) == false) {
+            return true;
+        } else {
+            return false;
+        }
+    },
+    /**
+     * 判断是否是中文
+     * @param str
+     * @returns {Boolean}
+     */
+    isChine: function (str) {
+        var reg = /^([u4E00-u9FA5]|[uFE30-uFFA0])*$/;
+        if (reg.test(str)) {
+            return false;
+        }
+        return true;
+    }
+};
+//从当前页面的url地址中获取参数数据
+function getRequest() {
+    var url = location.search; //获取url中"?"符后的字串
+    var theRequest = new Object();
+    if (url.indexOf("?") != -1) {
+        var str = url.substr(1);
+        strs = str.split("&");
+        for (var i = 0; i < strs.length; i++) {
+            theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
+        }
+    }
+    return theRequest;
+}
+    /**
+     * 1.判断用户是否在登录状态
+ * 2.自动将没权限的按钮隐藏
+ * 如果页面有列表,则在列表的 done事件内调用
+ * 如果页面没有列表,则在页面所有js执行的最后调用此函数
+ * 
+ * 所有需要权限控制显示的按钮,需要在class内加上permissions,
+ * 同时在控件上增加permissions="user-btn-import"这样的自定义属性 
+ * 其中引号内是菜单管理--里面对应的资源的菜单path
+ */
+function permissionsInput(res,config) {
+    if(!strUtil.isEmpty(res)&&res.code==401){
+        config.removeToken();
+        if(res.msg.includes("Access token expired")){
+            layer.msg('登录过期', {icon: 2, time: 1500}, function () {
+                location.replace('/login.html');
+            }, 5000);
+        }else if(msg.includes("Invalid access token")){
+            layer.msg('您的账号在其他地方登陆,请重新登录或修改密码', {icon: 2, time: 1500}, function () {
+                location.replace('/login.html');
+            }, 5000);
+        }
+        
+        return;
+    }
+    var needpPermissions = $(".permissions");
+    var permissions = layui.sessionData('tempData')['permissions'];
+    needpPermissions.each(function () {
+        var item = $(this);
+        if (permissions.indexOf(item.attr("permissions")) < 0) {
+            item.hide();
+        }
+    })
 }
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/baidu-map/MarkerClusterer.js b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/baidu-map/MarkerClusterer.js
index b7bbd35..7d9d330 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/baidu-map/MarkerClusterer.js
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/baidu-map/MarkerClusterer.js
@@ -593,8 +593,6 @@
         var center = this._center;
         this._clusterMarker.addEventListener("click", function(event){
             //这个方法容易造成晃动
-            //thatMap.setViewport(thatBounds);
-            //console.log(center);
             var zoom = thatMap.getZoom();
             zoom = zoom > 14 ? zoom : 14;
             thatMap.setZoom(zoom);
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/layui/css/layui.css b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/layui/css/layui.css
index e80da66..2c782bf 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/layui/css/layui.css
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/layui/css/layui.css
@@ -1,2 +1,2 @@
 /** layui-v2.3.0 MIT License By https://www.layui.com */
- .layui-inline,img{display:inline-block;vertical-align:middle}.layui-rate,li{list-style:none}h1,h2,h3,h4,h5,h6{font-weight:400}.layui-edge,.layui-header,.layui-inline,.layui-main{position:relative}.layui-btn,.layui-edge,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-disabled,.layui-icon,.layui-unselect{-webkit-user-select:none;-ms-user-select:none;-moz-user-select:none}blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{border:none}table{border-collapse:collapse;border-spacing:0}h4,h5,h6{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:24px;font:14px Helvetica Neue,Helvetica,PingFang SC,\5FAE\8F6F\96C5\9ED1,Tahoma,Arial,sans-serif}hr{height:1px;margin:10px 0;border:0;clear:both}a{color:#333;text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{*display:inline;*zoom:1}.layui-edge{display:inline-block;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent;overflow:hidden}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=230);src:url(../font/iconfont.eot?v=230#iefix) format('embedded-opentype'),url(../font/iconfont.svg?v=230#iconfont) format('svg'),url(../font/iconfont.woff?v=230) format('woff'),url(../font/iconfont.ttf?v=230) format('truetype')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-search:before{content:"\e615"}.layui-icon-share:before{content:"\e641"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-engine:before{content:"\e628"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-star:before{content:"\e600"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-chat:before{content:"\e606"}.layui-icon-release:before{content:"\e609"}.layui-icon-list:before{content:"\e60a"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-ok-circle:before{content:"\1005"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-table:before{content:"\e62d"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-edit:before{content:"\e642"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-down:before{content:"\e61a"}.layui-icon-file:before{content:"\e621"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-read:before{content:"\e705"}.layui-icon-404:before{content:"\e61c"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-help:before{content:"\e607"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-water:before{content:"\e636"}.layui-icon-username:before{content:"\e66f"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-about:before{content:"\e60b"}.layui-icon-location:before{content:"\e715"}.layui-icon-up:before{content:"\e619"}.layui-icon-pause:before{content:"\e651"}.layui-icon-date:before{content:"\e637"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-delete:before{content:"\e640"}.layui-icon-play:before{content:"\e652"}.layui-icon-top:before{content:"\e604"}.layui-icon-friends:before{content:"\e612"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-ok:before{content:"\e605"}.layui-icon-layer:before{content:"\e638"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-group:before{content:"\e613"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-link:before{content:"\e64c"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-log:before{content:"\e60e"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-return:before{content:"\e65c"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-form:before{content:"\e63c"}.layui-icon-cart:before{content:"\e657"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-fire:before{content:"\e756"}.layui-icon-set:before{content:"\e716"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-tips:before{content:"\e702"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-home:before{content:"\e68e"}.layui-icon-user:before{content:"\e770"}.layui-icon-notice:before{content:"\e667"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-voice:before{content:"\e688"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-template:before{content:"\e663"}.layui-icon-auz:before{content:"\e672"}.layui-icon-console:before{content:"\e665"}.layui-icon-app:before{content:"\e653"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-next:before{content:"\e65b"}.layui-icon-component:before{content:"\e857"}.layui-icon-more:before{content:"\e65f"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-camera:before{content:"\e660"}.layui-icon-note:before{content:"\e66e"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-password:before{content:"\e673"}.layui-icon-senior:before{content:"\e674"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-screen-restore:before{content:"\e758"}.layui-main{width:1140px;margin:0 auto}.layui-header{z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:absolute;left:200px;right:0;top:0;bottom:0;z-index:998;width:auto;overflow:hidden;overflow-y:auto;box-sizing:border-box}.layui-layout-body{overflow:hidden}.layui-layout-admin .layui-header{background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{top:60px;bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;height:44px;line-height:44px;padding:0 15px;background-color:#eee}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;padding:0 15px;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:'';display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:768px){.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:750px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:970px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1170px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space3{margin:-1.5px}.layui-col-space3>*{padding:1.5px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space8{margin:-3.5px}.layui-col-space8>*{padding:3.5px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:22px;border-left:5px solid #009688;border-radius:0 2px 2px 0;background-color:#f2f2f2}.layui-quote-nm{border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:1px 0 0}.layui-field-box{padding:10px 15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#e2e2e2}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#f2f2f2;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:22px;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card-body,.layui-card-header,.layui-form-label,.layui-form-mid,.layui-form-select,.layui-input-block,.layui-input-inline,.layui-textarea{position:relative}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-header{height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-bg-black,.layui-bg-blue,.layui-bg-cyan,.layui-bg-green,.layui-bg-orange,.layui-bg-red{color:#fff!important}.layui-card-body{padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #E6E6E6;background-color:#fff}.layui-bg-red{background-color:#FF5722!important}.layui-bg-orange{background-color:#FFB800!important}.layui-bg-green{background-color:#009688!important}.layui-bg-cyan{background-color:#2F4056!important}.layui-bg-blue{background-color:#1E9FFF!important}.layui-bg-black{background-color:#393D49!important}.layui-bg-gray{background-color:#eee!important;color:#666!important}.layui-badge-rim,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#e6e6e6}.layui-timeline-item:before,hr{background-color:#e6e6e6}.layui-text{line-height:22px;font-size:14px;color:#666}.layui-text h1,.layui-text h2,.layui-text h3{font-weight:500;color:#333}.layui-text h1{font-size:30px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text a:not(.layui-btn){color:#01AAED}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text em,.layui-word-aux{color:#999!important;padding:0 5px!important}.layui-btn{display:inline-block;height:38px;line-height:38px;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border:none;border-radius:2px;cursor:pointer}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{margin-right:3px;font-size:18px;vertical-align:bottom;vertical-align:middle\9}.layui-btn-primary{border:1px solid #C9C9C9;background-color:#fff;color:#555}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#FFB800}.layui-btn-danger{background-color:#FF5722}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border:1px solid #e6e6e6;background-color:#FBFBFB;color:#C9C9C9;cursor:not-allowed;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-sm i{font-size:16px!important}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:14px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#C9C9C9;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #c9c9c9}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#D2D2D2!important}.layui-input:focus,.layui-textarea:focus{border-color:#C9C9C9!important}.layui-textarea{min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#FF5722!important}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:999;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f2f2f2}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;border:none!important;margin-right:0;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{float:right;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{position:relative;top:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878;background-color:#5FB878;color:#fff}.layui-checkbox-disbaled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2}.layui-checkbox-disbaled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-checkbox-disbaled,.layui-checkbox-disbaled i{border-color:#e2e2e2!important}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disbaled span{background-color:#e2e2e2!important}.layui-checkbox-disbaled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio,.layui-form-radio *{display:inline-block;vertical-align:middle}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio>i:hover,.layui-form-radioed>i{color:#5FB878}.layui-radio-disbaled>i{color:#e2e2e2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#FBFBFB;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #e2e2e2}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393D49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#e2e2e2;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #e2e2e2}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{display:inline-block;width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-table,.layui-table-view{margin:10px 0}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{display:inline-block;vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;background-color:#fff;color:#666}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table[lay-even] tr:nth-child(even){background-color:#f2f2f2}.layui-table td,.layui-table th,.layui-table-fixed-r,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#e6e6e6}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0 0 1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0 1px 0 0}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding:15px 30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:40px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{font-size:12px;padding:5px 10px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:20px;line-height:20px}.layui-table[lay-data]{display:none}.layui-table-box,.layui-table-view{position:relative;overflow:hidden}.layui-table-view .layui-table{position:relative;width:auto;margin:0}.layui-table-body,.layui-table-header .layui-table,.layui-table-page{margin-bottom:-1px}.layui-table-view .layui-table[lay-skin=line]{border-width:0 1px 0 0}.layui-table-view .layui-table[lay-skin=row]{border-width:0 0 1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:5px 0;border-top:none;border-left:none}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-header{border-width:0 0 1px;overflow:hidden}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:4px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#666}.layui-table-sort .layui-table-sort-desc{bottom:4px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#666}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:28px;line-height:28px;padding:0 15px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary],.layui-table-cell .layui-form-radio[lay-skin=primary]{top:-1px;vertical-align:middle}.layui-table-cell .layui-form-radio{padding-right:0}.layui-table-cell .layui-form-radio>i{margin-right:0}.layui-table-cell .layui-table-link{color:#01AAED}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{padding:0;text-align:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px}.layui-table-body .layui-none{line-height:40px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:0 -1px 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0 0 0 1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;width:100%;height:50px;line-height:30px;padding:10px 15px;border-width:0 0 1px}.layui-table-page{position:relative;width:100%;padding:7px 7px 0;border-width:1px 0 0;height:41px;font-size:12px}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-7px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-view select[lay-ignore]{display:inline-block}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;width:100%;height:100%;padding:0 14px 1px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15)}.layui-table-edit:focus{border-color:#5FB878!important}select.layui-table-edit{padding:0 0 0 10px;border-color:#C9C9C9}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.1)}.layui-table-tips-main{margin:-44px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#333}.layui-table-tips-c{position:absolute;right:-3px;top:-12px;width:18px;height:18px;padding:3px;text-align:center;font-weight:700;border-radius:100%;font-size:14px;cursor:pointer;background-color:#666}.layui-table-tips-c:hover{background-color:#999}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-drag,.layui-upload-form,.layui-upload-wrap{display:inline-block}.layui-upload-list{margin:10px 0}.layui-upload-choose{padding:0 10px;color:#999}.layui-upload-drag{position:relative;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#FFB800;margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New;font-size:12px}.layui-tree{line-height:26px}.layui-tree li{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-tree li .layui-tree-spread,.layui-tree li a{display:inline-block;vertical-align:top;height:26px;*display:inline;*zoom:1;cursor:pointer}.layui-tree li a{font-size:0}.layui-tree li a i{font-size:16px}.layui-tree li a cite{padding:0 6px;font-size:14px;font-style:normal}.layui-tree li i{padding-left:6px;color:#333;-moz-user-select:none}.layui-tree li .layui-tree-check{font-size:13px}.layui-tree li .layui-tree-check:hover{color:#009E94}.layui-tree li ul{display:none;margin-left:20px}.layui-tree li .layui-tree-enter{line-height:24px;border:1px dotted #000}.layui-tree-drag{display:none;position:absolute;left:-666px;top:-666px;background-color:#f2f2f2;padding:5px 10px;border:1px dotted #000;white-space:nowrap}.layui-tree-drag i{padding-right:5px}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar,.layui-nav-tree .layui-nav-itemed:after{position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s}.layui-nav-bar{z-index:1000}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{content:'';top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{content:'';width:0;height:0;border-style:solid dashed dashed;border-color:#fff transparent transparent;overflow:hidden;cursor:pointer;transition:all .2s;-webkit-transition:all .2s;position:absolute;top:50%;right:3px;margin-top:-3px;border-width:6px;border-top-color:rgba(255,255,255,.7)}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{margin-top:-9px;border-style:dashed dashed solid;border-color:transparent transparent #fff}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #d2d2d2;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#333}.layui-nav .layui-nav-child a:hover{background-color:#f2f2f2;color:#000}.layui-nav-child dd{position:relative}.layui-nav .layui-nav-child dd.layui-this a,.layui-nav-child dd.layui-this{background-color:#5FB878;color:#fff}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:45px}.layui-nav-tree .layui-nav-item a{position:relative;height:45px;line-height:45px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item a:hover{background-color:#4E5465}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child a{height:40px;line-height:40px;color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-tree .layui-nav-more{right:10px}.layui-nav-itemed>.layui-nav-child{display:block;padding:0;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-bg-blue .layui-nav-bar,.layui-bg-blue .layui-nav-itemed:after,.layui-bg-blue .layui-this:after{background-color:#93D1FF}.layui-bg-blue .layui-nav-child dd.layui-this{background-color:#1E9FFF}.layui-bg-blue .layui-nav-itemed>a,.layui-nav-tree.layui-bg-blue .layui-nav-title a,.layui-nav-tree.layui-bg-blue .layui-nav-title a:hover{background-color:#007DDB!important}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5FB878!important}.layui-breadcrumb a cite{color:#666;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:'';width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#e2e2e2;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\9;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:10px}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#FF5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#f2f2f2}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5FB878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#FF5722}.layui-timeline-item:before{content:'';position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:last-child:before{display:none}.layui-timeline-item:first-child:before{display:block}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#FF5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#666}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-8px 6px 0}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\9;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add],.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\9;opacity:1;left:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#e2e2e2;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown]>[carousel-item]>*,.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:9999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9F9F9F;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-anim{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .3s;-webkit-transition:all .3s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,30px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,30px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout}
\ No newline at end of file
+ .layui-inline,img{display:inline-block;vertical-align:middle}.layui-rate,li{list-style:none}h1,h2,h3,h4,h5,h6{font-weight:400}.layui-edge,.layui-header,.layui-inline,.layui-main{position:relative}.layui-btn,.layui-edge,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-disabled,.layui-icon,.layui-unselect{-webkit-user-select:none;-ms-user-select:none;-moz-user-select:none}blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{border:none}table{border-collapse:collapse;border-spacing:0}h4,h5,h6{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:24px;font:14px Helvetica Neue,Helvetica,PingFang SC,\5FAE\8F6F\96C5\9ED1,Tahoma,Arial,sans-serif}hr{height:1px;margin:10px 0;border:0;clear:both}a{color:#333;text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{*display:inline;*zoom:1}.layui-edge{display:inline-block;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent;overflow:hidden}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=230);src:url(../font/iconfont.eot?v=230#iefix) format('embedded-opentype'),url(../font/iconfont.svg?v=230#iconfont) format('svg'),url(../font/iconfont.woff?v=230) format('woff'),url(../font/iconfont.ttf?v=230) format('truetype')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-search:before{content:"\e615"}.layui-icon-share:before{content:"\e641"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-engine:before{content:"\e628"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-star:before{content:"\e600"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-chat:before{content:"\e606"}.layui-icon-release:before{content:"\e609"}.layui-icon-list:before{content:"\e60a"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-ok-circle:before{content:"\1005"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-table:before{content:"\e62d"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-edit:before{content:"\e642"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-down:before{content:"\e61a"}.layui-icon-file:before{content:"\e621"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-read:before{content:"\e705"}.layui-icon-404:before{content:"\e61c"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-help:before{content:"\e607"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-water:before{content:"\e636"}.layui-icon-username:before{content:"\e66f"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-about:before{content:"\e60b"}.layui-icon-location:before{content:"\e715"}.layui-icon-up:before{content:"\e619"}.layui-icon-pause:before{content:"\e651"}.layui-icon-date:before{content:"\e637"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-delete:before{content:"\e640"}.layui-icon-play:before{content:"\e652"}.layui-icon-top:before{content:"\e604"}.layui-icon-friends:before{content:"\e612"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-ok:before{content:"\e605"}.layui-icon-layer:before{content:"\e638"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-group:before{content:"\e613"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-link:before{content:"\e64c"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-log:before{content:"\e60e"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-return:before{content:"\e65c"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-form:before{content:"\e63c"}.layui-icon-cart:before{content:"\e657"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-fire:before{content:"\e756"}.layui-icon-set:before{content:"\e716"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-tips:before{content:"\e702"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-home:before{content:"\e68e"}.layui-icon-user:before{content:"\e770"}.layui-icon-notice:before{content:"\e667"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-voice:before{content:"\e688"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-template:before{content:"\e663"}.layui-icon-auz:before{content:"\e672"}.layui-icon-console:before{content:"\e665"}.layui-icon-app:before{content:"\e653"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-next:before{content:"\e65b"}.layui-icon-component:before{content:"\e857"}.layui-icon-more:before{content:"\e65f"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-camera:before{content:"\e660"}.layui-icon-note:before{content:"\e66e"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-password:before{content:"\e673"}.layui-icon-senior:before{content:"\e674"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-screen-restore:before{content:"\e758"}.layui-main{width:1140px;margin:0 auto}.layui-header{z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:absolute;left:200px;right:0;top:0;bottom:0;z-index:998;width:auto;overflow:hidden;overflow-y:auto;box-sizing:border-box}.layui-layout-body{overflow:hidden}.layui-layout-admin .layui-header{background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{top:60px;bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;height:44px;line-height:44px;padding:0 15px;background-color:#eee}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;padding:0 15px;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:'';display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:768px){.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:750px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:970px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1170px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space3{margin:-1.5px}.layui-col-space3>*{padding:1.5px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space8{margin:-3.5px}.layui-col-space8>*{padding:3.5px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:22px;border-left:5px solid #009688;border-radius:0 2px 2px 0;background-color:#f2f2f2}.layui-quote-nm{border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:1px 0 0}.layui-field-box{padding:10px 15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#e2e2e2}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#f2f2f2;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:22px;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card-body,.layui-card-header,.layui-form-label,.layui-form-mid,.layui-form-select,.layui-input-block,.layui-input-inline,.layui-textarea{position:relative}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-header{height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-bg-black,.layui-bg-blue,.layui-bg-cyan,.layui-bg-green,.layui-bg-orange,.layui-bg-red{color:#fff!important}.layui-card-body{padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #E6E6E6;background-color:#fff}.layui-bg-red{background-color:#FF5722!important}.layui-bg-orange{background-color:#FFB800!important}.layui-bg-green{background-color:#009688!important}.layui-bg-cyan{background-color:#2F4056!important}.layui-bg-blue{background-color:#1E9FFF!important}.layui-bg-black{background-color:#393D49!important}.layui-bg-gray{background-color:#eee!important;color:#666!important}.layui-badge-rim,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#e6e6e6}.layui-timeline-item:before,hr{background-color:#e6e6e6}.layui-text{line-height:22px;font-size:14px;color:#666}.layui-text h1,.layui-text h2,.layui-text h3{font-weight:500;color:#333}.layui-text h1{font-size:30px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text a:not(.layui-btn){color:#01AAED}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text em,.layui-word-aux{color:#999!important;padding:0 5px!important}.layui-btn{display:inline-block;height:38px;line-height:38px;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border:none;border-radius:2px;cursor:pointer}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{margin-right:3px;font-size:18px;vertical-align:bottom;vertical-align:middle\9}.layui-btn-primary{border:1px solid #C9C9C9;background-color:#fff;color:#555}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#FFB800}.layui-btn-danger{background-color:#FF5722}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border:1px solid #e6e6e6;background-color:#FBFBFB;color:#C9C9C9;cursor:not-allowed;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-sm i{font-size:16px!important}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:14px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#C9C9C9;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #c9c9c9}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#D2D2D2!important}.layui-input:focus,.layui-textarea:focus{border-color:#C9C9C9!important}.layui-textarea{min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#FF5722!important}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:999;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f2f2f2}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;border:none!important;margin-right:0;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{float:right;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{position:relative;top:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878;background-color:#5FB878;color:#fff}.layui-checkbox-disbaled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2}.layui-checkbox-disbaled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-checkbox-disbaled,.layui-checkbox-disbaled i{border-color:#e2e2e2!important}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disbaled span{background-color:#e2e2e2!important}.layui-checkbox-disbaled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio,.layui-form-radio *{display:inline-block;vertical-align:middle}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio>i:hover,.layui-form-radioed>i{color:#5FB878}.layui-radio-disbaled>i{color:#e2e2e2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#FBFBFB;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #e2e2e2}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393D49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#e2e2e2;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #e2e2e2}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{display:inline-block;width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-table,.layui-table-view{margin:10px 0}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{display:inline-block;vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;background-color:#fff;color:#666}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table[lay-even] tr:nth-child(even){background-color:#f2f2f2}.layui-table td,.layui-table th,.layui-table-fixed-r,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#e6e6e6}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0 0 1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0 1px 0 0}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding:15px 30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:40px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{font-size:12px;padding:5px 10px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:20px;line-height:20px}.layui-table[lay-data]{display:none}.layui-table-box,.layui-table-view{position:relative;overflow:hidden}.layui-table-view .layui-table{position:relative;width:auto;margin:0}.layui-table-body,.layui-table-header .layui-table,.layui-table-page{margin-bottom:-1px}.layui-table-view .layui-table[lay-skin=line]{border-width:0 1px 0 0}.layui-table-view .layui-table[lay-skin=row]{border-width:0 0 1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:5px 0;border-top:none;border-left:none}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-header{border-width:0 0 1px;overflow:hidden}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:4px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#666}.layui-table-sort .layui-table-sort-desc{bottom:4px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#666}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:28px;line-height:28px;padding:0 15px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary],.layui-table-cell .layui-form-radio[lay-skin=primary]{top:-1px;vertical-align:middle}.layui-table-cell .layui-form-radio{padding-right:0}.layui-table-cell .layui-form-radio>i{margin-right:0}.layui-table-cell .layui-table-link{color:#01AAED}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{padding:0;text-align:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px}.layui-table-body .layui-none{line-height:40px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:0 -1px 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0 0 0 1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;width:100%;height:50px;line-height:30px;padding:10px 15px;border-width:0 0 1px}.layui-table-page{position:relative;width:100%;padding:7px 7px 0;border-width:1px 0 0;height:41px;font-size:12px}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-7px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-view select[lay-ignore]{display:inline-block}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;width:100%;height:100%;padding:0 14px 1px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15)}.layui-table-edit:focus{border-color:#5FB878!important}select.layui-table-edit{padding:0 0 0 10px;border-color:#C9C9C9}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.1)}.layui-table-tips-main{margin:-44px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#333}.layui-table-tips-c{position:absolute;right:-3px;top:-12px;width:18px;height:18px;padding:3px;text-align:center;font-weight:700;border-radius:100%;font-size:14px;cursor:pointer;background-color:#666}.layui-table-tips-c:hover{background-color:#999}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-drag,.layui-upload-form,.layui-upload-wrap{display:inline-block}.layui-upload-list{margin:10px 0}.layui-upload-choose{padding:0 10px;color:#999}.layui-upload-drag{position:relative;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#FFB800;margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New;font-size:12px}.layui-tree{line-height:26px}.layui-tree li{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-tree li .layui-tree-spread,.layui-tree li a{display:inline-block;vertical-align:top;height:26px;*display:inline;*zoom:1;cursor:pointer}.layui-tree li a{font-size:0}.layui-tree li a i{font-size:16px}.layui-tree li a cite{padding:0 6px;font-size:14px;font-style:normal}.layui-tree li i{padding-left:6px;color:#333;-moz-user-select:none}.layui-tree li .layui-tree-check{font-size:13px}.layui-tree li .layui-tree-check:hover{color:#009E94}.layui-tree li ul{display:none;margin-left:20px}.layui-tree li .layui-tree-enter{line-height:24px;border:1px dotted #000}.layui-tree-drag{display:none;position:absolute;left:-666px;top:-666px;background-color:#f2f2f2;padding:5px 10px;border:1px dotted #000;white-space:nowrap}.layui-tree-drag i{padding-right:5px}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar,.layui-nav-tree .layui-nav-itemed:after{position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s}.layui-nav-bar{z-index:1000}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{content:'';top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{content:'';width:0;height:0;border-style:solid dashed dashed;border-color:#fff transparent transparent;overflow:hidden;cursor:pointer;transition:all .2s;-webkit-transition:all .2s;position:absolute;top:50%;right:3px;margin-top:-3px;border-width:6px;border-top-color:rgba(255,255,255,.7)}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{margin-top:-9px;border-style:dashed dashed solid;border-color:transparent transparent #fff}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #d2d2d2;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#333}.layui-nav .layui-nav-child a:hover{background-color:#f2f2f2;color:#000}.layui-nav-child dd{position:relative}.layui-nav .layui-nav-child dd.layui-this a,.layui-nav-child dd.layui-this{background-color:#5FB878;color:#fff}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:45px}.layui-nav-tree .layui-nav-item a{position:relative;height:45px;line-height:45px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item a:hover{background-color:#4E5465}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child a{height:40px;line-height:40px;color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-tree .layui-nav-more{right:10px}.layui-nav-itemed>.layui-nav-child{display:block;padding:0;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-bg-blue .layui-nav-bar,.layui-bg-blue .layui-nav-itemed:after,.layui-bg-blue .layui-this:after{background-color:#93D1FF}.layui-bg-blue .layui-nav-child dd.layui-this{background-color:#1E9FFF}.layui-bg-blue .layui-nav-itemed>a,.layui-nav-tree.layui-bg-blue .layui-nav-title a,.layui-nav-tree.layui-bg-blue .layui-nav-title a:hover{background-color:#007DDB!important}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5FB878!important}.layui-breadcrumb a cite{color:#666;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:'';width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#e2e2e2;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\9;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:10px}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#FF5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#f2f2f2}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5FB878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#FF5722}.layui-timeline-item:before{content:'';position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:last-child:before{display:none}.layui-timeline-item:first-child:before{display:block}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#FF5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#666}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-8px 6px 0}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\9;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add],.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\9;opacity:1;left:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#e2e2e2;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown]>[carousel-item]>*,.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:9999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9F9F9F;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-anim{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .3s;-webkit-transition:all .3s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,30px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,30px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout}.layui-form-label.layui-required:after{content:"*";color:red;position: absolute;top:5px;left:15px;}
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/q.js b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/q.js
index a809434..b235b20 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/q.js
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/assets/libs/q.js
@@ -85,7 +85,6 @@
             return this
         },
         V: function () {
-            console.log('q.js <https://github.com/itorr/q.js> 2014/12/28');
             return this
         },
         go: function (u) {
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 135431e..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"/>
@@ -58,38 +57,7 @@
 <script type="text/javascript" src="assets/libs/q.js"></script>
 <script type="text/javascript" src="assets/libs/pandyle.min.js"></script>
 <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/login.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/login.html
index 36d1a27..ff4eb0e 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/login.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/login.html
@@ -60,9 +60,9 @@
 </div>
 <script type="text/javascript" src="module/apiUrl.js"></script>
 <script type="text/javascript" src="assets/libs/layui/layui.js"></script>
+<script type="text/javascript" src="module/aes.js"></script>
 <script type="text/javascript" src="assets/libs/login.js"></script>
 <script type="text/javascript" src="module/Math.uuid.js"></script>
-
 <script>
     layui.config({
         base: 'module/'
@@ -87,28 +87,32 @@
                 xhrFields: {
                     withCredentials: true
                 },
-                data: obj.field,
+                data: {
+                    deviceId :$("input[name='deviceId']").val(),
+                    password : getAesString($("input[name='password']").val()),
+                    username : getAesString($("input[name='username']").val()),
+                    validCode : $("input[name='validCode']").val()
+                },
                 type: 'POST',
                 beforeSend: function (xhr) {
-                    xhr.setRequestHeader('Authorization', 'Basic ' + window.btoa(config.clientId + ":" + config.clientSecret));
+                    xhr.setRequestHeader('Authorization', 'Basic ' + getAesString(config.clientId + ":" + config.clientSecret));
                 },
                 success: function (data) {
-                    // console.log(JSON.stringify(data));
-                    // debugger;
                     if (data.code === 0) {
                         config.putToken(data.data);
-                        layer.msg('登录成功', {icon: 1, time: 500}, function () {
+                        layer.msg('登录成功', {icon: 1, time: 2000}, function () {
                             location.replace('./');
                         });
                     } else {
                         layer.closeAll('loading');
-                        layer.msg(data.msg, {icon: 5, time: 500});
+                        layer.msg(data.msg, {icon: 5, time: 2000});
+                        $('.login-captcha').click();
                     }
                 },
                 error: function (xhr) {
-                    //console.log(xhr)
                     layer.closeAll('loading');
-                    layer.msg(xhr.responseJSON.msg, {icon: 5, time: 500});
+                    layer.msg(xhr.responseJSON.msg, {icon: 5, time: 2000});
+                        $('.login-captcha').click();
                 }
             });
             //阻止表单跳转
@@ -123,6 +127,9 @@
         $('.login-captcha').click(function () {
             this.src = this.src + '?t=' + (new Date).getTime();
         });
+
+
+
     });
 </script>
 </body>
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/admin.js b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/admin.js
index 001500a..f26bf3e 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/admin.js
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/admin.js
@@ -128,9 +128,18 @@
                 if (jsonRs) {
                     if (jsonRs.code == 401) {
                         config.removeToken();
-                        layer.msg('登录过期', {icon: 2, time: 1500}, function () {
-                            location.replace('/login.html');
-                        }, 1000);
+                        // var json=JSON.stringify(jsonRs)
+                        // console.log(json,"jsonjsonjsonjsonjsonjsonjson")
+                        var msg=jsonRs.msg;
+                        if(msg.includes("Access token expired")){
+                            layer.msg('登录过期', {icon: 2, time: 1500}, function () {
+                                location.replace('/login.html');
+                            }, 5000);
+                        }else if(msg.includes("Invalid access token")){
+                            layer.msg('您的账号在其他地方登陆,请重新登录或修改密码', {icon: 2, time: 1500}, function () {
+                                location.replace('/login.html');
+                            }, 5000);
+                        }
                         return;
                     } else if (jsonRs.code == 403) {
                         layer.msg('没有权限', {icon: 2});
@@ -145,7 +154,6 @@
             };
             //发送同步ajax请求
             param.async = false;
-            //console.log(param);
             $.ajax(param);
         },
         // 判断是否有权限
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/aes.js b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/aes.js
new file mode 100644
index 0000000..6e483c5
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/aes.js
@@ -0,0 +1,50 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,
+2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
+q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a,
+e)).finalize(b)}}});var n=d.algo={};return d}(Math);
+(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<
+l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
+(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),
+f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,
+m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,
+E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/
+4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);
+(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,
+l)}})();
+CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()},
+finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^=
+c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,
+e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
+this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,
+1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
+decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,
+b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();
+(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,
+16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>
+8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=
+d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();
+
+//加密
+function getAesString(data) {
+    var key = CryptoJS.enc.Latin1.parse("66XiGaoKeJi@COM6");
+    var iv = CryptoJS.enc.Latin1.parse("123#XIGAO.com456");
+    var srcs = CryptoJS.enc.Utf8.parse(data);
+
+    var encrypted = CryptoJS.AES.encrypt(srcs, key,
+        {
+            iv: iv,
+            mode: CryptoJS.mode.CBC,
+            padding: CryptoJS.pad.Pkcs7
+        });
+    return encrypted.toString();
+}
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/apiUrl.js b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/apiUrl.js
index 3ec1084..c7c9be5 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/apiUrl.js
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/apiUrl.js
@@ -1 +1,9 @@
-var my_api_server_url = 'http://192.168.2.240:8888/';
\ No newline at end of file
+// var my_api_server_url = 'http://zuul.kidgrow.com/';
+  // var my_api_server_url = 'http://192.168.2.240:8888/';
+var my_api_server_url = 'http://127.0.0.1:8888/';
+// var my_api_server_url = 'http://192.168.2.240:8888/';
+// var my_api_server_url = 'http://open.zuul.kidgrow.cloud/';
+// var my_api_server_url = 'http://uat.zuul.kidgrow.cloud/';
+// var my_api_server_url = 'https://zuul.kidgrow.cloud/';
+//var my_api_server_url = 'http://123.57.164.62:8888/';
+
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/area.js b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/area.js
new file mode 100644
index 0000000..23809b9
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/area.js
@@ -0,0 +1,73 @@
+/**
+ * 省市区3级联动使用说明:
+ * 1.在页面的layui.use中装载模块  area
+ * 2,定义调用变量 var area=layui.area;
+ * 3.装载省数据 area.areaData("#province",1,"","");
+ * 4.省联动装载市区:
+ *  //装载市区数据
+        form.on("select(province)",function(data){
+            area.areaData("#city",2,data.value,"");
+        });
+ * 5.市联动装载区县
+ //装载区县数据
+        form.on("select(city)",function(data){
+            area.areaData("#areas",3,data.value,"");
+        });
+具体使用见  system/hospital.html
+ */
+layui.define(['form', 'config', 'admin', 'layer'], function (exports) {
+    //var config = layui.config;
+    var form = layui.form;
+    var layer = layui.layer;
+    var admin = layui.admin;
+    var area = {
+        //4个参数依次是 下拉控件的id,/区域级别(1.2.3)/上级id/选中值 例如河北省
+        areaData: function (domId, levelType, parentId, selectValue) {
+            if (levelType == 1) {
+                parentId = 100000;
+            }
+            admin.req('api-user/sysarea/getListByMap', { area_leveltype: levelType, area_parent_id: parentId }, function (data) {
+                if (0 === data.code) {
+                    $(domId).empty();
+                    let selected = "";
+                    clientsAll = data.data;
+                    if (clientsAll.length > 0) {
+                        area.areasClear(domId,levelType);
+                        if(clientsAll[0].areaLeveltype==3)
+                        {
+                            admin.putTempData("t_area",clientsAll);
+                        }
+                        $.each(clientsAll, function (index, item) {
+                            if (selectValue == item.areaName) { selected = "selected='selected'"; }
+                            else {
+                                selected = "";
+                            }
+                            //往下拉菜单里添加元素
+                            $(domId).append("<option value='" + item.id + "' " + selected + ">" + item.areaName + "</option> ");
+                        })
+                    }
+                    //必须加这个刷新form!
+                    form.render();
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 1000 });
+                }
+            }, 'GET');
+        },
+        //重置select
+        areasClear:function(domId,levelType){
+            $(domId).empty();
+            switch (levelType) {
+                case 1:
+                    $(domId).append("<option value='' selected='selected'>选择省</option>");
+                    break;
+                case 2:
+                    $(domId).append("<option value='' selected='selected'>选择市</option>");
+                    break;
+                case 3:
+                    $(domId).append("<option value='' selected='selected'>选择区县</option>");
+                    break;
+            }
+        }
+    }
+    exports('area', area);
+})
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/complete/autocomplete.css b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/complete/autocomplete.css
new file mode 100644
index 0000000..3f43b18
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/complete/autocomplete.css
@@ -0,0 +1,10 @@
+.layui-form-autocomplete {position: relative;}
+.layui-form-autocomplete dl {display: none; position: absolute; left: 0; top: 0; padding: 5px 0; z-index: 999; min-width: 100%; border: 1px solid #d2d2d2; max-height: 300px; overflow-y: auto; background-color: #fff; border-radius: 2px; box-shadow: 0 2px 4px rgba(0,0,0,.12); box-sizing: border-box;}
+.layui-form-autocomplete dl dd, .layui-form-autocomplete dl dt {padding: 0 10px; line-height: 36px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;}
+.layui-form-autocomplete dl dt {font-size: 12px; color: #999;}
+.layui-form-autocomplete dl dd {cursor: pointer;}
+.layui-form-autocomplete dl dd:hover {background-color: #f2f2f2;}
+.layui-form-autocomplete .layui-autocomplete-group dd {padding-left: 20px;}
+.layui-form-autocomplete dl dd.layui-autocomplete-tips {padding-left: 10px!important; color: #999;}
+.layui-form-autocomplete dl dd.layui-this {background-color: #5FB878; color: #fff;}
+.layui-form-autocomplete-focus dl {display: block;}
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/complete/autocomplete.js b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/complete/autocomplete.js
new file mode 100644
index 0000000..84a1146
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/complete/autocomplete.js
@@ -0,0 +1,232 @@
+if (!Object.keys) {
+  Object.keys = (function () {
+    var hasOwnProperty = Object.prototype.hasOwnProperty,
+        hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
+        dontEnums = [
+          'toString',
+          'toLocaleString',
+          'valueOf',
+          'hasOwnProperty',
+          'isPrototypeOf',
+          'propertyIsEnumerable',
+          'constructor'
+        ],
+        dontEnumsLength = dontEnums.length;
+
+    return function (obj) {
+      if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
+
+      var result = [];
+
+      for (var prop in obj) {
+        if (hasOwnProperty.call(obj, prop)) result.push(prop);
+      }
+
+      if (hasDontEnumBug) {
+        for (var i = 0; i < dontEnumsLength; i++) {
+          if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
+        }
+      }
+      return result;
+    }
+  })()
+}
+
+layui.link('/module/complete/autocomplete.css'); 
+layui.define(['jquery', 'laytpl', 'layer','config'], function (e) {
+  "use strict";
+  var hint = layui.hint(),
+    $ = layui.jquery,
+    laytpl = layui.laytpl,
+    layer = layui.layer,
+    module = 'autocomplete',
+    filter = 'layui-autocomplete',
+    container = 'layui-form-autocomplete',
+    container_focus = 'layui-form-autocomplete-focus',
+    sysconfig=layui.config,
+    system = {
+      config: {
+        template: ['<div class="layui-form-autocomplete">', '<dl class="layui-anim layui-anim-upbit">', '</dl>', '</div>'].join(''),
+        layout: ['<dd data-index="{{d.index}}">{{d.text}}</dd>'].join(''),
+        template_txt: '{{d.text}}',
+        template_val: '{{d.value}}',
+        cache: false,
+        keywordsName:''
+      },
+      data: {}
+    },
+    callback = function () {
+      var _self = this,
+        _config = _self.config;
+      return {
+        call: function (handle, params) {
+          if (!_self.handles[handle]) return hint.error(handle + " handle is not defined");
+          _self.handles[handle].call(_self, params)
+        }
+      }
+    },
+    job = function (e) {
+      var _self = this;
+      _self.config = $.extend({}, _self.config, system.config, e);
+      _self.render();
+    };
+  job.prototype.config = {
+    response: {
+      code: 'code',
+      data: 'data',
+      msg: 'msg'
+    },
+    request: {
+      keywords: system.config.keywordsName
+    },
+    statusCode: 0,
+    time_limit: 300,
+    pullTimer: null,
+    data: {},
+    temp_data: {},
+    params: {},
+    filter: '',
+    method: 'get',
+    ajaxParams: {}
+  }
+  job.prototype.render = function () {
+    var _self = this, _config = _self.config;
+    _config.request.keywords=_config.keywordsName;
+    if (_config.elem = $(_config.elem), _config.where = _config.where || {}, !_config.elem[0]) return _self;
+    var _elem = _config.elem,
+      _container = _elem.next('.' + container),
+      _html = _self.elem = $(laytpl(_config.template).render({}));
+    _config.id = _self.id, _container && _container.remove(), _elem.attr('autocomplete', 'off'), _elem.after(_html);
+    _self.events()
+  }
+  job.prototype.pullData = function () {
+    var _self = this,
+      _config = _self.config,
+      _elem = _config.elem,
+      _container = _elem.next('.' + container);
+    if (!_config.filter) return _self.renderData([]);
+    if ((_config.cache || !_config.url) && _config.data instanceof Object && Object.keys(_config.data).length > 0) return _self.renderData(_config.data);
+    var keywords = _config.request.keywords
+    var params = {
+      //t: new Date().getTime()
+    }
+    params[keywords] = _config.filter.replace("'","");
+
+    var $loading = $('<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>');
+    $.ajax($.extend({
+      type: _config.method,
+      url: _config.url,
+      data: $.extend(params, _config.params instanceof Function ? _config.params() :_config.params),
+      contentType: 'text/json,charset=utf-8',
+      dataType: "json",
+      beforeSend: function (xhr) {
+        xhr.setRequestHeader("Authorization", "Bearer " + sysconfig.getToken().access_token);
+                        xhr.setRequestHeader("Content-Type", "application/json");
+        $loading.attr('style', [
+          'position:absolute', 
+          'left:' + (_elem.offset().left + _elem.outerWidth() - 20) + 'px', 
+          'top:' + _elem.offset().top + 'px',
+          'height:' + _elem.height() + 'px',
+          'line-height:' + _elem.height() + 'px'
+        ].join(';'));
+        $loading.appendTo('body');
+      },
+      success: function (resp) {
+        $loading.remove();
+        return _config.statusCode != resp[_config.response.code] ? layer.msg(resp[_config.response.msg]) : _config.data = resp[_config.response.data], _self.renderData(_config.data)
+      },
+      error: function () {
+        hint.error("请求失败")
+      }
+    }, _config.ajaxParams))
+  }
+  job.prototype.renderData = function (resp) {
+    var _self = this,
+      _config = _self.config,
+      _elem = _config.elem,
+      _container = _elem.next('.' + container),
+      _dom = _container.find('dl'),
+      _list = [];
+    _config.temp_data = [];
+    layui.each(resp, function (i, e) {
+      if (_config.cache) {
+        if (e instanceof Object) {
+          layui.each(e, function (_i, _e) {
+            if (_e && _e.toString().toLowerCase().indexOf(_config.filter.toLowerCase()) > -1) {
+              _config.temp_data.push(e), _list.push(laytpl(_config.layout).render({ index: i, text: laytpl(_config.template_txt).render(e) }));
+              return true;
+            }
+          });
+        } else {
+          if (e && e.toString().toLowerCase().indexOf(_config.filter.toLowerCase()) > -1) {
+            _config.temp_data.push(e), _list.push(laytpl(_config.layout).render({ index: i, text: laytpl(_config.template_txt).render(e) }));
+          }
+        }
+      } else {
+        _config.temp_data.push(e), _list.push(laytpl(_config.layout).render({ index: i, text: laytpl(_config.template_txt).render(e) }));
+      }
+    });
+    _dom.html(_list.join('')), _list.length > 0 ? _container.addClass(container_focus) : _container.removeClass(container_focus)
+  }
+  job.prototype.handles = {
+    addData: function (data) {
+      var _self = this,
+        _config = _self.config;
+      if (data instanceof Array) {
+        _config.data = _config.data.concat(data)
+      } else {
+        _config.data.push(data)
+      }
+    },
+    setData: function (data) {
+      var _self = this,
+        _config = _self.config;
+      _config.data = data;
+    }
+  }
+  job.prototype.events = function () {
+    var _self = this,
+      _config = _self.config,
+      _elem = _config.elem,
+      _container = _elem.next('.' + container),
+      _dom = _container.find('dl');
+    _elem.unbind('focus').unbind('input propertychange').on('focus', function () {
+      _config.filter = this.value, _self.renderData(_config.data)
+    }).on('input propertychange', function (e) {
+      var _value = this.value;
+      clearTimeout(_config.pullTimer), _config.pullTimer = setTimeout(function () {
+        _config.filter = _value, _self.pullData()
+      }, _config.time_limit)
+    })
+    $(document).on('click', function (e) {
+      var _target = e.target, _item = _dom.find(_target), _e = _item.length > 0 ? _item.closest('dd') : undefined;
+      if (_target === _elem[0]) return false;
+      if (_e !== undefined) {
+        if (_e.attr('autocomplete-load') !== undefined) return false;
+        var curr_data = _config.temp_data[_e.index()]
+        _elem.val(laytpl(_config.template_val).render(curr_data)), _config.onselect == undefined || _config.onselect(curr_data)
+      }
+      _container.removeClass(container_focus);
+    })
+  }
+  system.init = function (e, c) {
+    var c = c || {}, _self = this, _elems = $(e ? 'input[lay-filter="' + e + '"]' : 'input[' + filter + ']');
+    _elems.each(function (_i, _e) {
+      var _elem = $(_e),
+        _lay_data = _elem.attr('lay-data');
+      try {
+        _lay_data = new Function("return " + _lay_data)()
+      } catch (ex) {
+        return hint.error("autocomplete元素属性lay-data配置项存在语法错误:" + _lay_data)
+      }
+      var _config = $.extend({ elem: this }, system.config, c, _lay_data);
+      _config.url == undefined && (_config.data == undefined || _config.length === 0) && hint.error("autocomplete配置有误,缺少获取数据方式");
+      system.render(_config);
+    })
+  }
+  system.render = function (e) {
+    var j = new job(e);
+    return callback.call(j)
+  }
+  system.init(), e(module, system);
+})
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/config.js b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/config.js
index 743653e..f2c1d3e 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/config.js
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/config.js
@@ -3,7 +3,8 @@
      * 用于动态切换环境地址
      */
     //默认地址
-    var defUrl = 'http://192.168.1.103:8888/';
+    var defUrl = 'http://127.0.0.1:8888/';
+    //var defUrl = 'http://182.92.99.224:8887/';
     //当前环境的api地址
     var apiUrl;
     try{
@@ -47,7 +48,6 @@
         // 当前登录的用户
         getUser: function () {
             var u = layui.data(config.tableName).login_user;
-            // debugger;
             if (u) {
                 return JSON.parse(u);
             }
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/dic.js b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/dic.js
new file mode 100644
index 0000000..5fea5c4
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/dic.js
@@ -0,0 +1,44 @@
+/**
+ * 根据字典分类加载字典列表,并装载到指定下拉列表
+ * 
+ */
+layui.define([
+    'form',
+    'config',
+    'admin',
+    'layer'
+], function (exports) {
+    //var config = layui.config;
+    var form = layui.form;
+    var layer = layui.layer;
+    var admin = layui.admin;
+    var dic={
+        //下拉列表id/分类key/选中id
+        dicData:function(domId,dicClass,selectValue){
+            admin.req('api-user/sysdictionaries/findAll', JSON.stringify({dictionariesClassId: dicClass}), function (data) {
+                if (0 === data.code) {
+                    $(domId).empty();
+                    let selected = "";
+                    clientsAll = data.data;
+                    if (clientsAll.length > 0) {
+                        $(domId).append("<option value='' selected='selected'>请选择</option>");
+                        $.each(clientsAll, function (index, item) {
+                            if (selectValue == item.dictionariesKey) { selected = "selected='selected'"; }
+                            else {
+                                selected = "";
+                            }
+                            //往下拉菜单里添加元素
+                            $(domId).append("<option value='" + item.dictionariesKey + "' " + selected + ">" + item.dictionariesName + "</option> ");
+                        })
+                    }
+                    //必须加这个刷新form!
+                    form.render();
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 1000 });
+                }
+            }, 'POST');
+        }
+    }
+    
+    exports('dic', dic);
+});
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/index.js b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/index.js
index 0362fed..4b04179 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/index.js
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/index.js
@@ -1,13 +1,13 @@
 //add by owen 修复 path 无法引用http://页面的问题 begin
-String.prototype.startWith = function(str) {
-	if (str == null || str == "" || this.length == 0
-			|| str.length > this.length)
-		return false;
-	if (this.substr(0, str.length) == str)
-		return true;
-	else
-		return false;
-	return true;
+String.prototype.startWith = function (str) {
+    if (str == null || str == "" || this.length == 0
+        || str.length > this.length)
+        return false;
+    if (this.substr(0, str.length) == str)
+        return true;
+    else
+        return false;
+    return true;
 }
 
 
@@ -18,9 +18,9 @@
         return;
     }
     if ($parent.hasClass('layui-tab-item')) {
-        $parent.css({'padding': '0', 'overflow-y': 'hidden'});
+        $parent.css({ 'padding': '0', 'overflow-y': 'hidden' });
     } else {
-        $parent.css({'width': '100%', 'height': '100%'});
+        $parent.css({ 'width': '100%', 'height': '100%' });
     }
 }
 //add by owen 修复 path 无法引用http://页面的问题 end
@@ -33,15 +33,12 @@
     var laytpl = layui.laytpl;
     var element = layui.element;
     var form = layui.form;
-    
+
     var index = {
         // 渲染左侧菜单栏
         initLeftNav: function () {
             admin.req('api-user/menus/current', {}, function (data) {
-                //data = data[1];
-                // console.log(data);
-                // debugger;
-                admin.putTempData("menus",data.data);
+                admin.putTempData("menus", data.data);
                 var menus = data.data;
                 // 判断权限
                 for (var i = menus.length - 1; i >= 0; i--) {
@@ -123,7 +120,7 @@
                             window.open(data.path);
                         } else {
                             //临时保存url
-                            data.path.startWith("http://") ?  admin.putTempData("params",data.path) : null ;
+                            data.path.startWith("http://") ? admin.putTempData("params", data.path) : null;
 
                             var menuId = data.url.substring(2);
                             //add by owen 修复 path 无法引用http://页面的问题
@@ -142,7 +139,7 @@
             var contentDom = '.layui-layout-admin .layui-body';
             admin.showLoading('.layui-layout-admin .layui-body');
             var flag;  // 选项卡是否添加
-            flag =   menuPath.startWith("http://") ? false : flag ;
+            flag = menuPath.startWith("http://") ? false : flag;
             // 判断是否开启了选项卡功能
             if (config.pageTabs) {
                 $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title>li').each(function (index) {
@@ -153,8 +150,8 @@
                 if (!flag) {
                     element.tabAdd('admin-pagetabs', {
                         title: menuName,
-                      //add by owen 修复 path 无法引用http://页面的问题
-                        content:  menuPath.startWith("http://") ? '<div id="admin-iframe" style="width: 100%; height: 100%;"><iframe id="' + menuId + '" src="' + menuPath + '" marginwidth="0"  marginheight="0" width="100%" height="100%"  frameborder="0" onload="initIFrame()"></iframe> </div>'   :  '<div id="' + menuId + '"></div>' ,
+                        //add by owen 修复 path 无法引用http://页面的问题
+                        content: menuPath.startWith("http://") ? '<div id="admin-iframe" style="width: 100%; height: 100%;"><iframe id="' + menuId + '" src="' + menuPath + '" marginwidth="0"  marginheight="0" width="100%" height="100%"  frameborder="0" onload="initIFrame()"></iframe> </div>' : '<div id="' + menuId + '"></div>',
                         id: menuId
                     });
                 }
@@ -192,26 +189,34 @@
             layer.load(2);
             admin.req('api-user/users/current', {}, function (data) {
                 layer.closeAll('loading');
-                // console.log(data.code);
-                // debugger;
                 if (data && data.code === 0) {
                     let user = data.data;
-                    // console.log(user);
-                    // debugger;
                     config.putUser(user);
-                    admin.putTempData("permissions",user.permissions);
+                    admin.putTempData("permissions", user.permissions);
+                    admin.putTempData("organization",user.organizations[user.organizations.length-1]);
                     success(user);
                 } else {
-                    layer.msg('获取用户失败', {icon: 2});
-                    config.removeToken();
-                    location.replace('login.html');
+                    if (data.code === 1000) {
+                        layer.msg(data.msg, { icon: 2, time: 4 * 1000 }, function () {
+                            //回调
+                            config.removeToken();
+                            location.replace('login.html');
+                        })
+
+                    } else {
+                        layer.msg('获取用户失败,请联系管理员', { icon: 2, time: 4 * 1000 }, function () {
+                            //回调
+                            config.removeToken();
+                            location.replace('login.html');
+                        })
+                    }
                 }
             }, 'GET');
         },
         //获取菜单
         getMenus: function () {
             admin.req('api-user/menus/current', {}, function (data) {
-                admin.putTempData("menus",data);
+                admin.putTempData("menus", data);
             }, 'GET');
         },
         // 页面元素绑定事件监听
@@ -221,8 +226,8 @@
                 layer.confirm('确定退出登录?', function () {
                     //通过认证中心 tuic
                     admin.req('api-uaa/oauth/remove/token', {}, function (data) {
-                            config.removeToken();
-                            location.replace('login.html');
+                        config.removeToken();
+                        location.replace('login.html');
                     }, 'POST');
                 });
             });
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable-lay/treetable.js b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable-lay/treetable.js
index 35efdcf..bfe06a4 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable-lay/treetable.js
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/treetable-lay/treetable.js
@@ -43,11 +43,11 @@
                                 mData[len - 1].isParent = true;
                             }
                             mData.push(data[i]);
-                            sort(data[i].id, data);
+                            sort(""+data[i].id, data);
                         }
                     }
                 };
-                sort(param.treeSpid, tNodes);
+                sort(""+param.treeSpid, tNodes);
 
                 // 重写参数
                 param.url = undefined;
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/attestation/app.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/attestation/app.html
index 4ba4d01..ae1206c 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/attestation/app.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/attestation/app.html
@@ -10,7 +10,7 @@
         <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="app-btn-add" class="layui-btn icon-btn"><i class="layui-icon">&#xe654;</i>添加</button>
+        <button id="app-btn-add" class="layui-btn icon-btn permissions" permissions="saveOrUpdate"><i class="layui-icon">&#xe654;</i>添加</button>
         </div>
 
         <!-- 数据表格 -->
@@ -20,8 +20,8 @@
 
 <!-- 表格操作列 -->
 <script type="text/html" id="app-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>
+    <a class="layui-btn layui-btn-primary layui-btn-xs permissions" permissions="saveOrUpdate" lay-event="edit">修改</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs permissions" permissions="clients-del" lay-event="del">删除</a>
 </script>
 
 <!-- 表单弹窗 -->
@@ -80,13 +80,16 @@
             page: true,
             cols: [[
                 {type: 'numbers'},
-                {field: 'clientId',width:180, sort: true, title: '应用标识'},
-                {field: 'clientName',width:200, sort: true, title: '应用名称'},
-                {field: 'clientSecretStr', width:180, sort: true, title: '应用密钥'},
-                {field: 'webServerRedirectUri',sort: true, title: '回调地址'},
-                {field: 'authorizedGrantTypes',width:250, sort: true, title: 'oauth授权方式'},
-                {align: 'center',width:150, toolbar: '#app-table-bar', title: '操作'}
-            ]]
+                {field: 'clientId',width:"10%", sort: true, title: '应用标识'},
+                {field: 'clientName',width:"10%", sort: true, title: '应用名称'},
+                {field: 'clientSecretStr', width:"10%", sort: true, title: '应用密钥'},
+                {field: 'webServerRedirectUri',width:"25%",sort: true, title: '回调地址'},
+                {field: 'authorizedGrantTypes',width:"35%", sort: true, title: 'oauth授权方式'},
+                {align: 'center',width:"10%", toolbar: '#app-table-bar', title: '操作'}
+            ]],
+            done:function(res){
+                permissionsInput(res,config);
+            }
         });
 
         // 工具条点击事件
@@ -109,7 +112,7 @@
                 layer.load(2);
                 admin.req('api-uaa/clients/' + obj.data.id, {}, function (data) {
                     layer.closeAll('loading');
-                    layer.msg('成功', {icon: 1, time: 500});
+                    layer.msg('成功', {icon: 1, time: 2000});
                     obj.del();
                 }, 'DELETE');
             });
@@ -154,13 +157,12 @@
             layer.load(2);
             admin.req('api-uaa/clients/saveOrUpdate', JSON.stringify(data.field), function (data) {
                 layer.closeAll('loading');
-                console.log(data);
                 if (data.code == 0) {
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                    layer.msg(data.msg, {icon: 1, time: 2000});
                     table.reload('app-table');
                     layer.closeAll('page');
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, {icon: 2, time: 2000});
                 }
             }, $('#app-form').attr('method'));
             return false;
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/console.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/console.html
index bf9427e..4dc5240 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/console.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/console.html
@@ -3,265 +3,568 @@
 
 <head>
     <title>首页</title>
-    <meta charset="utf-8"/>
+    <meta charset="utf-8" />
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
     <script type="text/javascript" src="../assets/libs/echarts.min.js"></script>
     <style>
         .layui-card-header {
-            text-align:left;
+            text-align: left;
         }
+
         .layuiadmin-badge {
-            float:right;
-            margin-top:12px;
+            float: right;
+            margin-top: 12px;
         }
+
         .big-font {
-            text-align:left;
+            text-align: left;
             font-size: 250%;
             height: 30px;
         }
     </style>
 </head>
+
 <body>
 
-<div class="layui-card-body" style="text-align: center;">
-    <div class="layui-row layui-col-space10">
-        <div class="layui-col-sm2 layui-col-md2">
-            <div class="layui-card">
-                <div class="layui-card-header">在线人数
-                    <span class="layui-badge layui-bg-cyan layuiadmin-badge">时</span>
+    <div class="layui-card-body" style="text-align: center;">
+        <div class="layui-row layui-col-space10">
+            <div class="layui-col-sm2 layui-col-md2">
+                <div class="layui-card">
+                    <div class="layui-card-header">正式医院
+                    </div>
+                    <div class="layui-card-body layuiadmin-card-list">
+                        <a href="/#!syshospital">
+                            <p class="big-font" id="h_hospital"></p>
+                        </a>
+                    </div>
                 </div>
-                <div class="layui-card-body layuiadmin-card-list">
-                    <p class="big-font" id="userCnt"></p>
+            </div>
+            <div class="layui-col-sm2 layui-col-md2">
+                <div class="layui-card">
+                    <div class="layui-card-header">产品/套餐总量
+                    </div>
+                    <div class="layui-card-body layuiadmin-card-list">
+                        <a href="/#!product">
+                            <p class="big-font" id="u_product"></p>
+                        </a>
+                    </div>
+                </div>
+            </div>
+            <div class="layui-col-sm2 layui-col-md2">
+                <div class="layui-card">
+                    <div class="layui-card-header">待审核试用套餐
+                    </div>
+                    <div class="layui-card-body layuiadmin-card-list">
+                        <a href="/#!verifyRecharge">
+                            <p class="big-font" id="t_product"></p>
+                        </a>
+                    </div>
+                </div>
+            </div>
+            <div class="layui-col-sm3 layui-col-md3">
+                <div class="layui-card">
+                    <div class="layui-card-header">用户反馈
+                    </div>
+                    <div class="layui-card-body layuiadmin-card-list">
+                        <a href="/#!feedback">
+                            <p class="big-font" id="u_feedback"></p>
+                        </a>
+                    </div>
+                </div>
+            </div>
+            <div class="layui-col-sm3 layui-col-md3">
+                <div class="layui-card">
+                    <div class="layui-card-header">数据需求
+                    </div>
+                    <div class="layui-card-body layuiadmin-card-list">
+                        <a href="/#!dataneed">
+                            <p class="big-font" id="d_dataneed"></p>
+                        </a>
+                    </div>
                 </div>
             </div>
         </div>
-        <div class="layui-col-sm2 layui-col-md2">
-            <div class="layui-card">
-                <div class="layui-card-header">PV
-                    <span class="layui-badge layui-bg-green layuiadmin-badge">天</span>
+        <div class="layui-row layui-col-space10">
+            <div class="layui-col-sm2 layui-col-md2">
+                <div class="layui-card">
+                    <div class="layui-card-header">H端医生
+                    </div>
+                    <div class="layui-card-body layuiadmin-card-list">
+                        <a href="/#!doctor">
+                            <p class="big-font" id="h_doctor"></p>
+                        </a>
+                    </div>
                 </div>
-                <div class="layui-card-body layuiadmin-card-list">
-                    <p class="big-font" id="pv"></p>
+            </div>
+            <div class="layui-col-sm2 layui-col-md2">
+                <div class="layui-card">
+                    <div class="layui-card-header">C端医生
+                    </div>
+                    <div class="layui-card-body layuiadmin-card-list">
+                        <a href="/#!doctor">
+                            <p class="big-font" id="c_doctor"></p>
+                        </a>
+                    </div>
+                </div>
+            </div>
+            <div class="layui-col-sm2 layui-col-md2">
+                <div class="layui-card">
+                    <div class="layui-card-header">待审核医生
+                    </div>
+                    <div class="layui-card-body layuiadmin-card-list">
+                        <a href="/#!doctor">
+                            <p class="big-font" id="ht_doctor"></p>
+                        </a>
+                    </div>
+                </div>
+            </div>
+            <div class="layui-col-sm3 layui-col-md3">
+                <div class="layui-card">
+                    <div class="layui-card-header">签约医生
+                    </div>
+                    <div class="layui-card-body layuiadmin-card-list">
+                        <a href="/#!doctor">
+                            <p class="big-font" id="u_signing"></p>
+                        </a>
+                    </div>
+                </div>
+            </div>
+            <div class="layui-col-sm3 layui-col-md3">
+                <div class="layui-card">
+                    <div class="layui-card-header">医答医生
+                    </div>
+                    <div class="layui-card-body layuiadmin-card-list">
+                        <a href="/#!doctor">
+                            <p class="big-font" id="d_isanswer"></p>
+                        </a>
+                    </div>
                 </div>
             </div>
         </div>
-        <div class="layui-col-sm2 layui-col-md2">
-            <div class="layui-card">
-                <div class="layui-card-header">UV
-                    <span class="layui-badge layui-bg-green layuiadmin-badge">天</span>
+        <!-- <div class="layui-row layui-col-space10">
+            <div class="layui-col-lg12 layui-col-md12">
+                <div class="layui-card">
+                    <div class="card-block">
+                        <div id="contract" style="height:350px">
+                        </div>
+                    </div>
                 </div>
-                <div class="layui-card-body layuiadmin-card-list">
-                    <p class="big-font" id="uv"></p>
+            </div>
+        </div> -->
+        <div class="layui-row layui-col-space10">
+            <div class="layui-col-lg6 layui-col-md6">
+                <div class="layui-card">
+                    <div class="card-block">
+                        <div id="products" style="height:300px"></div>
+                    </div>
+                </div>
+            </div>
+            <div class="layui-col-lg6 layui-col-lg6">
+                <div class="layui-card">
+                    <div class="card-block">
+                        <div id="contract" style="height:300px"></div>
+                    </div>
                 </div>
             </div>
         </div>
-        <div class="layui-col-sm3 layui-col-md3">
-            <div class="layui-card">
-                <div class="layui-card-header">周访问量
-                    <span class="layui-badge layui-bg-blue layuiadmin-badge">周</span>
-                </div>
-                <div class="layui-card-body layuiadmin-card-list">
-                    <p class="big-font" id="weekPv"></p>
+        <div class="layui-row layui-col-space10">
+            <div class="layui-col-lg6 layui-col-md6">
+                <div class="layui-card">
+                    <div class="card-block">
+                        <div id="aiphoto" style="height:300px"></div>
+                    </div>
                 </div>
             </div>
-        </div>
-        <div class="layui-col-sm3 layui-col-md3">
-            <div class="layui-card">
-                <div class="layui-card-header">月访问量
-                    <span class="layui-badge layui-bg-orange layuiadmin-badge">月</span>
-                </div>
-                <div class="layui-card-body layuiadmin-card-list">
-                    <p class="big-font" id="monthPv"></p>
+            <div class="layui-col-lg6 layui-col-lg6">
+                <div class="layui-card">
+                    <div class="card-block">
+                        <div id="report" style="height:300px"></div>
+                    </div>
                 </div>
             </div>
         </div>
     </div>
-    <div class="layui-row layui-col-space10">
-        <div class="layui-col-lg12 layui-col-md12">
-            <div class="layui-card">
-                <div class="card-block">
-                    <div id="week-container" style="height:350px"></div>
-                </div>
-            </div>
-        </div>
-    </div>
-    <div class="layui-row layui-col-space10">
-        <div class="layui-col-lg6 layui-col-md6">
-            <div class="layui-card">
-                <div class="card-block">
-                    <div id="browser-container" style="height:300px"></div>
-                </div>
-            </div>
-        </div>
-        <div class="layui-col-lg6 layui-col-lg6">
-            <div class="layui-card">
-                <div class="card-block">
-                    <div id="operatingSystem-container" style="height:300px"></div>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
 
-<script type="text/javascript">
-    layui.use(['admin'], function () {
-        let admin = layui.admin;
-
-        let browserChart = echarts.init(document.getElementById("browser-container"));
-        browserChart.setOption({
-            title : {
-                text: '浏览器分布',
-                subtext: '',
-                x:'center'
-            },
-            tooltip : {
-                trigger: 'item',
-                formatter: "{a} <br/>{b} : {c} ({d}%)"
-            },
-            legend: {},
-            series : []
-        });
-        browserChart.showLoading();
-
-        let osChart = echarts.init(document.getElementById("operatingSystem-container"));
-        osChart.setOption({
-            title : {
-                text: '系统分布',
-                subtext: '',
-                x:'center'
-            },
-            tooltip : {
-                trigger: 'item',
-                formatter: "{a} <br/>{b} : {c} ({d}%)"
-            },
-            legend: {},
-            series : []
-        });
-        osChart.showLoading();
-
-        let weekChart = echarts.init(document.getElementById("week-container"));
-        weekChart.setOption({
-            title: {
-                text: '流量趋势'
-            },
-            tooltip: {
-                trigger: 'axis',
-                axisPointer: {
-                    type: 'cross',
-                    label: {
-                        backgroundColor: '#6a7985'
+    <script type="text/javascript">
+        layui.use(['util', 'admin', 'config'], function () {
+            let admin = layui.admin;
+            let config = layui.config;
+            let util = layui.util;
+            let $ = layui.jquery;
+            var counts = 0;
+            var noData="无权查看";
+            layer.load(2);
+            // 加载医院统计数据
+            var loadHospitalChart = function (datatype) {
+                admin.req("api-user/syshospital/chartHospital?datatype=" + datatype, {}, function (data) {
+                    if (0 === data.code) {
+                        counts = data.data;
                     }
-                }
-            },
-            legend: {
-                data: ['访问量(PV)', '独立用户(UV)']
-            },
-            xAxis: [
-                {
-                    type: 'category',
-                    boundaryGap: false,
-                    data: []
-                }
-            ],
-            yAxis: [
-                {
-                    type: 'value'
-                }
-            ],
-            series: []
-        });
-        weekChart.showLoading();
-
-        admin.req('api-log/requestStat', {}, function (data) {
-            $('#pv').html(data.currDate_pv);
-            $('#uv').html(data.currDate_uv);
-            $('#weekPv').html(data.currWeek_pv);
-            $('#monthPv').html(data.currMonth_pv);
-            $('#userCnt').html(data.currHour_uv);
-
-            browserChart.hideLoading()
-            browserChart.setOption({
-                legend: {
-                    orient: 'vertical',
-                    left: 'left',
-                    data: data.browser_legendData
-                },
-                series : [
-                    {
-                        name: '浏览器',
-                        type: 'pie',
-                        radius : '55%',
-                        center: ['50%', '60%'],
-                        data: data.browser_datas,
-                        itemStyle: {
-                            emphasis: {
-                                shadowBlur: 10,
-                                shadowOffsetX: 0,
-                                shadowColor: 'rgba(0, 0, 0, 0.5)'
+                }, "get");
+            }
+            // 加载医生统计数据
+            var loadDoctorChart = function (datatype) {
+                admin.req("api-user/sysdoctor/chartDoctor?datatype=" + datatype, {}, function (data) {
+                    if (0 === data.code) {
+                        counts = data.data;
+                    }
+                }, "get");
+            }
+            // 加载反馈需求审核统计数据
+            var loadOprationChart = function (datatype) {
+                admin.req("api-opration/productorderdetail/oprationChart?datatype=" + datatype, {},
+                    function (data) {
+                        if (0 === data.code) {
+                            counts = data.data;
+                        }
+                    }, "get");
+            }
+            // 加载合同统计数据
+            var loadProductOrderChart = function (params) {
+                admin.req("api-opration/productorderdetail/productOrderChart", params, function (data) {
+                    if (0 === data.code) {
+                        counts = data.data;
+                    }
+                }, "get");
+            }
+            // 加载套餐使用量统计数据
+            var loadProCountChart = function () {
+                admin.req("api-opration/productorderdetail/proCountChart", {}, function (data) {
+                    if (0 === data.code) {
+                        return data.data;
+                    } else {
+                        return null;
+                    }
+                }, "get");
+            }
+            //加载套餐使用图表
+            var loadContractChart = function () {
+                var chartcontract = echarts.init(document.getElementById('contract'));
+                admin.req("api-opration/productorderdetail/proCountChart", {}, function (data) {
+                    if (0 === data.code) {
+                        var listData = data.data;
+                        var Xdata = new Array();
+                        var Ydata = new Array();
+                        if (listData != null) {
+                            for (let index = 0; index < listData.length; index++) {
+                                Xdata.push(listData[index].units);
+                                Ydata.push(listData[index].ccount);
                             }
+                            var optionchart = {
+                                title: {
+                                    text: '套餐使用数量统计(前10个)'
+                                },
+                                color: ['#3398DB'],
+                                tooltip: {
+                                    trigger: 'axis',
+                                    axisPointer: { // 坐标轴指示器,坐标轴触发有效
+                                        type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
+                                    }
+                                },
+                                xAxis: {
+                                    type: 'category',
+                                    data: Xdata
+                                },
+                                yAxis: {
+                                    type: 'value'
+                                },
+                                series: [{
+                                    name: '使用数量',
+                                    data: Ydata,
+                                    type: 'bar',
+                                    barWidth: '10%',
+                                    showBackground: true
+                                }]
+                            };
+                            chartcontract.setOption(optionchart, true);
+                        }
+                        layer.closeAll('loading');
+                    }
+                }, "get");
+            }
+
+            //加载合同图表
+            var loadProductChart = function () {
+                var chartproducts = echarts.init(document.getElementById('products'));
+                admin.req("api-opration/productorderdetail/productOrderChart", {
+                    datatype: 1,
+                    startTime: "",
+                    endTime: ""
+                }, function (data) {
+                    if (0 === data.code) {
+                        var listData = data.data;
+                        var Xdata = new Array();
+                        var Ydata = new Array();
+                        if (listData != null) {
+                            for (let index = 0; index < listData.length; index++) {
+                                Xdata.push(listData[index].units);
+                                Ydata.push(listData[index].ccount);
+                            }
+                            var optionchart = {
+                                title: {
+                                    text: '合同签订统计'
+                                },
+                                color: ['#3398DB'],
+                                tooltip: {
+                                    trigger: 'axis',
+                                    axisPointer: { // 坐标轴指示器,坐标轴触发有效
+                                        type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
+                                    }
+                                },
+                                xAxis: {
+                                    type: 'category',
+                                    data: Xdata
+                                },
+                                yAxis: {
+                                    type: 'value'
+                                },
+                                series: [{
+                                    name: '合同数量',
+                                    data: Ydata,
+                                    type: 'bar',
+                                    barWidth: '10%',
+                                    showBackground: true
+                                }]
+                            };
+                            chartproducts.setOption(optionchart, true);
                         }
                     }
-                ]
-            });
+                        layer.closeAll('loading');
+                }, "get");
+            }
 
-            osChart.hideLoading()
-            osChart.setOption({
-                legend: {
-                    orient: 'vertical',
-                    left: 'left',
-                    data: data.operatingSystem_legendData
-                },
-                series : [
-                    {
-                        name: '操作系统',
-                        type: 'pie',
-                        radius : '55%',
-                        center: ['50%', '60%'],
-                        data: data.operatingSystem_datas,
-                        itemStyle: {
-                            emphasis: {
-                                shadowBlur: 10,
-                                shadowOffsetX: 0,
-                                shadowColor: 'rgba(0, 0, 0, 0.5)'
+            //加载报告图表
+            var loadreportChart = function (dataType) {
+                var nowYear = new Date().getFullYear();
+                var apiUrl =
+                    "api-bicenter/statisticalmonthlydata/findList?itemCode=3201&page=1&limit=12&startYearMonth=" +
+                    nowYear + "01&endYearMonth=" + nowYear + "12";
+                if (dataType == "1") {
+                    apiUrl =
+                        "api-bicenter/statisticalyearlydata/findList?itemCode=3201&page=1&limit=10&startYear=" +
+                        nowYear - 5 + "&endYear=" + nowYear;
+                }
+                var chartreport = echarts.init(document.getElementById('report'));
+                admin.req(apiUrl, {}, function (data) {
+                    if (0 === data.code) {
+                        var listData = data.data.data;
+                        var Xdata = new Array();
+                        var Ydata = new Array();
+                        if (listData != null) {
+                            for (let index = 0; index < listData.length; index++) {
+                                Ydata.push(listData[index].itemValue);
+                                if (dataType == "1") {
+                                    Xdata.push(listData[index].collectYear);
+                                } else if (dataType == "0") {
+                                    Xdata.push(listData[index].collectYearMonth);
+                                }
                             }
+                            var optionchart = {
+                                title: {
+                                    text: 'H端报告量'
+                                },
+                                color: ['#3398DB'],
+                                tooltip: {
+                                    trigger: 'axis',
+                                    axisPointer: { // 坐标轴指示器,坐标轴触发有效
+                                        type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
+                                    }
+                                },
+                                xAxis: {
+                                    type: 'category',
+                                    data: Xdata
+                                },
+                                yAxis: {
+                                    type: 'value'
+                                },
+                                series: [{
+                                    name: '报告数量',
+                                    data: Ydata,
+                                    type: 'bar',
+                                    barWidth: '10%',
+                                    showBackground: true
+                                }]
+                            };
+                            chartreport.setOption(optionchart, true);
                         }
+                        layer.closeAll('loading');
                     }
-                ]
-            });
-
-            weekChart.hideLoading()
-            weekChart.setOption({
-                xAxis: [
-                    {
-                        type: 'category',
-                        boundaryGap: false,
-                        data: data.statWeek_items
-                    }
-                ],
-                series: [
-                    {
-                        name: '访问量(PV)',
-                        type: 'line',
-                        areaStyle: {},
-                        label: {
-                            normal: {
-                                show: true,
-                                position: 'top'
+                }, "get");
+            }
+            
+            //加载读片图表
+            var loadaiphotoChart = function (dataType) {
+                var nowYear = new Date().getFullYear();
+                var apiUrl =
+                    "api-bicenter/statisticalmonthlydata/findList?itemCode=1301&page=1&limit=12&startYearMonth=" +
+                    nowYear + "01&endYearMonth=" + nowYear + "12";
+                if (dataType == "1") {
+                    apiUrl =
+                        "api-bicenter/statisticalyearlydata/findList?itemCode=1301&page=1&limit=10&startYear=" +
+                        nowYear - 5 + "&endYear=" + nowYear;
+                }
+                var chartaiphoto = echarts.init(document.getElementById('aiphoto'));
+                admin.req(apiUrl, {}, function (data) {
+                    if (0 === data.code) {
+                        var listData = data.data.data;
+                        var Xdata = new Array();
+                        var Ydata = new Array();
+                        if (listData != null) {
+                            for (let index = 0; index < listData.length; index++) {
+                                Ydata.push(listData[index].itemValue);
+                                if (dataType == "1") {
+                                    Xdata.push(listData[index].collectYear);
+                                } else if (dataType == "0") {
+                                    Xdata.push(listData[index].collectYearMonth);
+                                }
                             }
-                        },
-                        data: data.statWeek_pv
-                    },
-                    {
-                        name: '独立用户(UV)',
-                        type: 'line',
-                        areaStyle: {},
-                        data: data.statWeek_uv
+                            var optionchart = {
+                                title: {
+                                    text: '读片量'
+                                },
+                                color: ['#3398DB'],
+                                tooltip: {
+                                    trigger: 'axis',
+                                    axisPointer: { // 坐标轴指示器,坐标轴触发有效
+                                        type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
+                                    }
+                                },
+                                xAxis: {
+                                    type: 'category',
+                                    data: Xdata
+                                },
+                                yAxis: {
+                                    type: 'value'
+                                },
+                                series: [{
+                                    name: '读片数量',
+                                    data: Ydata,
+                                    type: 'bar',
+                                    barWidth: '10%',
+                                    showBackground: true
+                                }]
+                            };
+                            chartaiphoto.setOption(optionchart, true);
+                        }
+                        layer.closeAll('loading');
                     }
-                ]
-            });
-        }, 'GET');
-    });
-</script>
+                }, "get");
+            }
+
+            //先拿到当前登录用户的信息
+            var nowUser = config.getUser();
+            if (!strUtil.isEmpty(nowUser)) {
+                var userRole = nowUser.roles;
+                for (let index = 0; index < userRole.length; index++) {
+                    const element = userRole[index];
+                    if (element.code == "admin" ||
+                        element.code == "dev_admin" ||
+                        element.code == "pc_admin" ||
+                        element.code == "oprationmanager" ||
+                        element.code == "dev_user" ||
+                        element.code == "shop_admin" ||
+                        element.code == "app_admin") {
+                        //正式医院
+                        loadHospitalChart(0);
+                        $("#h_hospital").html(counts);
+                        //产品/套餐总量
+                        loadOprationChart(1);
+                        $("#u_product").html(counts);
+                        //待审核试用套餐
+                        loadOprationChart(0);
+                        $("#t_product").html(counts);
+                        //用户反馈
+                        loadOprationChart(2);
+                        $("#u_feedback").html(counts);
+                        //数据需求
+                        loadOprationChart(2);
+                        $("#d_dataneed").html(counts);
+                        //H端医生
+                        loadDoctorChart(4);
+                        $("#h_doctor").html(counts);
+                        //C端医生
+                        loadDoctorChart(3);
+                        $("#c_doctor").html(counts);
+                        //签约医生
+                        loadDoctorChart(1);
+                        $("#u_signing").html(counts);
+                        //医答医生
+                        loadDoctorChart(2);
+                        $("#d_isanswer").html(counts);
+                        //待审核医生
+                        loadDoctorChart(5);
+                        $("#ht_doctor").html(counts);
+                        loadContractChart();
+                        loadProductChart();
+                        loadreportChart(0);
+                        loadaiphotoChart(0);
+                    } else if (element.code == "opration") {
+                        //正式医院
+                        loadHospitalChart(0);
+                        $("#h_hospital").html(counts);
+                        //用户反馈
+                        loadOprationChart(2);
+                        $("#u_feedback").html(counts);
+                        //数据需求
+                        loadOprationChart(2);
+                        $("#d_dataneed").html(counts);
+                        //H端医生
+                        loadDoctorChart(4);
+                        $("#h_doctor").html(counts);
+                        //C端医生
+                        loadDoctorChart(3);
+                        $("#c_doctor").html(counts);
+                        //签约医生
+                        loadDoctorChart(1);
+                        $("#u_signing").html(counts);
+                        //医答医生
+                        loadDoctorChart(2);
+                        $("#d_isanswer").html(counts);
+                        //待审核医生
+                        loadDoctorChart(5);
+                        $("#ht_doctor").html(counts);
+                        loadProductChart();
+                        $("#u_product").html(noData);
+                        $("#t_product").html(noData);
+                    } else if (element.code == "sale") {
+                        //正式医院
+                        loadHospitalChart(0);
+                        $("#h_hospital").html(counts);
+                        //用户反馈
+                        loadOprationChart(2);
+                        $("#u_feedback").html(counts);
+                        //数据需求
+                        loadOprationChart(2);
+                        $("#d_dataneed").html(counts);
+                        //H端医生
+                        loadDoctorChart(4);
+                        $("#h_doctor").html(counts);
+                        //C端医生
+                        loadDoctorChart(3);
+                        $("#c_doctor").html(counts);
+                        //待审核医生
+                        loadDoctorChart(5);
+                        $("#ht_doctor").html(counts);
+                        //签约医生
+                        loadDoctorChart(1);
+                        $("#u_signing").html(counts);
+                        
+                        $("#u_product").html(noData);
+                        $("#t_product").html(noData);
+                        //医答医生
+                        loadDoctorChart(2);
+                        $("#d_isanswer").html(counts);
+
+                        loadContractChart();
+                        loadProductChart();
+                        loadreportChart(0);
+                        loadaiphotoChart(0);
+                    }
+                }
+            }
+        });
+    </script>
 </body>
+
 </html>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/console_old.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/console_old.html
deleted file mode 100644
index 989317e..0000000
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/console_old.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-<head>
-    <title>首页</title>
-    <meta charset="utf-8"/>
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
-</head>
-<body>
-
-<div class="layui-card-body" style="text-align: center;">
-    <img src="../../assets/images/welcome.png" style="max-width: 100%;">
-</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/files/files.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/files/files.html
index a294603..5201e79 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/files/files.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/files/files.html
@@ -87,10 +87,10 @@
                 admin.req('api-file/files/' + obj.data.id, {}, function (data) {
                     layer.closeAll('loading');
                     if (data.resp_code == 0) {
-                        layer.msg(data.resp_msg, {icon: 1, time: 500});
+                        layer.msg(data.resp_msg, {icon: 1, time: 2000});
                         obj.del();
                     } else {
-                        layer.msg(data.resp_msg, {icon: 2, time: 500});
+                        layer.msg(data.resp_msg, {icon: 2, time: 2000});
                     }
                 }, 'DELETE');
             });
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/header.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/header.html
index 1cf9fae..ff1c06e 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/header.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/header.html
@@ -12,19 +12,23 @@
     </li>
 </ul>
 <ul class="layui-nav layui-layout-right">
-    <!--<li class="layui-nav-item" lay-unselect>-->
-        <!--<a id="btnMessage" title="消息"><i class="layui-icon layui-icon-notice"></i></a>-->
-    <!--</li>-->
+    <!-- <li class="layui-nav-item" lay-unselect>
+        <a id="btnMessage" title="消息"><i class="layui-icon layui-icon-notice"></i></a>
+    </li> -->
     <li class="layui-nav-item layui-hide-xs" lay-unselect>
         <a ew-event="fullScreen" title="全屏"><i class="layui-icon layui-icon-screen-full"></i></a>
     </li>
     <li class="layui-nav-item" lay-unselect>
         <a>
-            <!--<img src="assets/images/head.png" class="layui-nav-img">-->
             <img p-bind="src:{{headImgUrl}}"  class="layui-nav-img">
             <!--add by owen 修复页面显示问题 -->
             <!--<cite>{{username}}</cite>-->
-            <cite>{{nickname}}</cite>
+            <cite> 
+                {{organizations[1].orgName}}
+            </cite>
+            <cite>
+                {{username}}
+            </cite>
         </a>
         <dl class="layui-nav-child">
             <dd lay-unselect>
@@ -39,7 +43,4 @@
             </dd>
         </dl>
     </li>
-<!--    <li class="layui-nav-item" lay-unselect>-->
-<!--        <a ew-event="theme" title="主题"><i class="layui-icon layui-icon-more-vertical"></i></a>-->
-<!--    </li>-->
 </ul>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/businessRecords.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/businessRecords.html
new file mode 100644
index 0000000..bfa2894
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/businessRecords.html
@@ -0,0 +1,91 @@
+<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" placeholder="开始时间"> 至 <input type="text"
+                class="layui-input search-input" id="test2"  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>
+    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-opration/businessrecords',
+            method: 'GET',
+            headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+            page: true,
+            cols: [[
+                { field: 'userName', width: 180,  title: '用户' },
+                { field: 'appName', width: 200, title: '应用名' },
+                { field: 'recordIp', width: 180,title: 'IP' },
+                { field: 'recordTitle', width: 300,title: '日志内容' },
+                { field: 'createTime', width: 250, sort: true, title: '日志时间', templet: "<div>{{layui.util.toDateString(d.createTime, 'yyyy/MM/dd HH:mm')}}</div>" }
+            ]],
+            done:function(res){
+                permissionsInput(res,config);
+            }
+        });
+        // 搜索按钮点击事件
+        $('#app-btn-search').click(function () {
+            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} });
+        });
+        //比较日期大小
+        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;
+                }
+            }
+        }
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/company.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/company.html
new file mode 100644
index 0000000..9714231
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/company.html
@@ -0,0 +1,470 @@
+<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 permissions" permissions="syscompany-edit"><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="company-table-bar">
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看详情</a>
+    <a class="layui-btn layui-btn-xs permissions" permissions="syscompany-edit" lay-event="edit">编辑</a>
+    <a class="layui-btn layui-btn-xs permissions" permissions="syscompany-del"  lay-event="del">删除</a>
+</script>
+<!-- 表格状态列 -->
+<script type="text/html" id="company-tpl-state">
+    <input type="checkbox" lay-filter="company-tpl-state" value="{{d.id}}" lay-skin="switch" lay-text="正常|已停用"
+           {{d.enabled==true?'checked':''}}/>
+</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">
+                <select  id="tenantId" name="tenantId"   placeholder="选择一个应用" lay-verify="required" required >
+                    <option value="">-请选择-</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">选择组织</label>
+            <div class="layui-input-block">
+                <select  id="orgId" name="orgId"   placeholder="选择一个应用" lay-verify="required" required >
+                    <option value="">-请选择-</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">公司名称</label>
+            <div class="layui-input-block">
+                <input name="companyName"  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="companyProvince" id="companyProvince" type="hidden" class="layui-input" maxlength="20"/>
+                <select  id="sheng"   placeholder="省份" lay-filter="sheng" ay-verify="required" required>
+                    <option value="">-请选择-</option>
+                </select>
+                <input name="companyCity" id="companyCity" type="hidden" class="layui-input" maxlength="20"/>
+                <select  id="shi"    placeholder="城市" lay-filter="shi" ay-verify="required" required>
+                    <option value="">-请选择-</option>
+                </select>
+                <input name="companyArea" id="companyArea" type="hidden" class="layui-input" maxlength="20"/>
+                <select  id="xian"   placeholder="区县"lay-filter="xian" ay-verify="required" required>
+                    <option value="">-请选择-</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">联系电话</label>
+            <div class="layui-input-block">
+                <input name="companyTel"  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="companyAdress"  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">
+                <button type="button" class="layui-btn" id="phonto">
+                    <i class="layui-icon">&#xe67c;</i>上传图片
+                  </button>
+                <input name="companyLogo" 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="companyAbout"  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>
+            <button class="layui-btn permissions" permissions="syscompany-edit"  id="sure" lay-filter="user-form-submit" lay-submit>保存</button>
+        </div>
+    </form>
+</script>
+
+
+<script>
+    layui.use(['form', 'table', 'laydate', 'upload', '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 upload = layui.upload;
+
+        // 获取应用列表
+        // 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: 2000 });
+            }
+        }, '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/syscompany',
+            method: 'GET',
+            headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+            page: true,
+            cols: [[
+                { type: 'numbers' },
+                { field: 'companyName', width: 180, title: '公司名称' },
+                { field: 'companyProvince', width: 200, title: '省' },
+                { field: 'companyCity', width: 180, title: '市' },
+                { field: 'companyArea', width: 300, title: '区县' },
+                { field: 'companyTel', width: 250, align: 'center', title: '联系方式' },
+                { field: 'tenantId', width: 250, align: 'center', title: '应用' },
+                { field: 'enabled', width: 250, align: 'center', templet: '#company-tpl-state', title: '状态' },
+                { field: 'createTime', width: 250, title: '时间', templet: "<div>{{layui.util.toDateString(d.createTime, 'yyyy-MM-dd HH:mm')}}</div>" },
+                { field: 'id', width: 250, align: 'center', toolbar: '#company-table-bar', title: '操作' },
+            ]],
+            done:function(res){
+                permissionsInput(res,config);
+            }
+        });
+
+        // 修改company状态
+        form.on('switch(company-tpl-state)', function (obj) {
+            layer.load(2);
+            admin.req('api-user/syscompany/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: 2000 });
+                    table.reload('table-user', {});
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                    $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+                }
+            }, 'GET');
+        });
+        /**
+         *
+         *  
+         */
+        //获取省份
+        var sheng = {};
+        var getSheng = function (obj, id, checkValue) {
+            admin.req('api-user/sysarea/getListByMap', { area_leveltype: obj }, function (data) {
+                layer.closeAll('loading');
+                if (0 === data.code) {
+                    let selected = false;
+                    clientsAll = data.data;
+                    sheng = data.data;
+                    $.each(data.data, function (index, item) {
+                        if (checkValue == item.areaName) {
+                            selected = true;
+                        } else {
+                            selected = false;
+                        }
+                        //往下拉菜单里添加元素
+                        $('#' + id).append(new Option(item.areaName, item.id, true, selected));
+                    })
+                    form.render('select', id);
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                }
+            }, 'GET');
+        }
+        form.on('select(sheng)', function (data) {
+            $.each(sheng, function (index, item) {
+                if (data.value == item.id) {
+                    $("#companyProvince").val(item.areaName);
+                }
+            })
+
+            //补充市的数据
+            getShi_and_xian(data.value, "shi");
+        });
+
+        form.on('select(shi)', function (data) {
+            $.each(shi_name, function (index, item) {
+                if (data.value == item.id) {
+                    $("#companyCity").val(item.areaName);
+                }
+            })
+            //补充县的数据
+            getShi_and_xian(data.value, "xian");
+        });
+        form.on('select(xian)', function (data) {
+            $.each(xian_name, function (index, item) {
+                if (data.value == item.id) {
+                    $("#companyArea").val(item.areaName);
+                }
+            })
+        });
+        var shi_name = {};
+        var xian_name = {};
+        var getShi_and_xian = function (obj, id, checkValue) {
+            admin.req('api-user/sysarea/getListByMap', { area_parent_id: obj }, function (data) {
+                layer.closeAll('loading');
+                if (0 === data.code) {
+                    let selected = false;
+                    $('#' + id).empty();
+                    //
+                    if (id == "shi") {
+                        shi_name = data.data
+                        $("#companyCity").val(shi_name[0].areaName);
+                    }
+                    if (id == "xian") {
+                        xian_name = data.data
+                        $("#companyArea").val(xian_name[0].areaName);
+                    }
+
+                    $.each(data.data, function (index, item) {
+                        if (checkValue === item.areaName) {
+                            selected = true;
+                        } else {
+                            selected = false;
+                        }
+                        //往下拉菜单里添加元素
+                        $('#' + id).append(new Option(item.areaName, item.id, false, selected));
+                    })
+                    form.render();
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                }
+            }, 'GET');
+        }
+        /**
+         *
+         *  
+         */
+        //获取租户
+        var gettenantId = function () {
+            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: 2000 });
+                }
+            }, 'GET');
+        }
+
+        //获取组织
+        var getorganization = function () {
+            admin.req('api-user/sysorganization/getListByMap', { org_attr: 0 }, 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;
+                        }
+                        //往下拉菜单里添加元素
+                        $('#orgId').append(new Option(item.orgName, item.id, false, selected));
+                    })
+                    form.render();
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                }
+            }, 'GET');
+        }
+        // 工具条点击事件
+        table.on('tool(app-table)', function (obj) {
+            var data = obj.data;
+            var layEvent = obj.event;
+            if (layEvent === 'detail') { // 查看详情
+                showEditModel(data, 2);
+            } 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/syscompany/' + obj.data.id, {}, function (data) {
+                        layer.closeAll('loading');
+                        if (data.code == 0) {
+                            layer.msg(data.msg, { icon: 1, time: 2000 });
+                            table.reload('app-table', {});
+                        } else {
+                            layer.msg(data.msg, { icon: 2, time: 2000 });
+                        }
+                    }, 'delete');
+                });
+            }
+        });
+        // 添加按钮点击事件
+        $('#user-btn-add').click(function () {
+            showEditModel(undefined, 1);
+        });
+        // 搜索按钮点击事件
+        $('#app-btn-search').click(function () {
+            var companyName = $('#app-edit-search').val();
+            table.reload('app-table', { where: { companyName: companyName } });
+        });
+        // // 显示编辑弹窗
+        var showEditModel = function (data, index) {
+            var title = ""
+            if (index == 1) {
+                title = "新增"
+            } else if (index == 2) {
+                title = "查看详情"
+            }
+            else if (index == 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');
+                    //将租户的填充
+                    gettenantId();
+                    //将组织填充
+                    getorganization();
+                    //将省份填充
+                    getSheng(1, "sheng", data.companyProvince);
+                    // getSheng(2, "shi");
+                    // getSheng(3, "xian");
+                    //图片
+                    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');
+                        }
+                    });
+                    if (data) {
+                        if (index == 2) {
+                            $('#app-form').find('input').attr('readonly', true);
+                            $('#app-form').find('select,input[type="radio"]').attr('disabled', true);
+                            $('#sure').hide();
+                        }
+                        form.val('app-form', data);
+                        //将市填充
+                        var shengId = "";
+                        $.each(sheng, function (index, item) {
+                            if (data.companyProvince === item.areaName) {
+                                shengId = item.id;
+                            }
+                        })
+                        if (data.companyCity) {
+                            getShi_and_xian(shengId, "shi", data.companyCity)
+                        }
+                        var shiId = "";
+
+                        $.each(shi_name, function (index, item) {
+                            if (data.companyCity === item.areaName) {
+                                shiId = item.id;
+                            }
+                        })
+                        if (data.companyArea) {
+                            getShi_and_xian(shiId, "xian", data.companyArea)
+                        }
+                        $('#app-form').attr('method', 'POST');
+                    } else {
+
+                    }
+                }
+            });
+        };
+        form.on('submit(user-form-submit)', function (data) {
+            layer.load(2);
+            data.field.hospitalId = parseInt(data.field.hospitalId);
+            admin.req('api-user/syscompany', JSON.stringify(data.field), function (data) {
+                layer.closeAll('loading');
+                if (data.code == 0) {
+                    layer.closeAll();
+                    table.reload('app-table', {});
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                }
+            }, "POST");
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/contract.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/contract.html
new file mode 100644
index 0000000..804ebe2
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/contract.html
@@ -0,0 +1,168 @@
+<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">
+            <div class="layui-form-item">
+                <div class="layui-inline" style="margin-bottom: -25px;">&emsp;
+            <input id="hospital-search-value" class="layui-input  search-input" type="text" placeholder="按医院名" autocomplete="off" width="400px" /></div>&emsp;
+            <button id="contract-btn-search" class="layui-btn icon-btn permissions" permissions="contract-list" style="margin-bottom: -25px;"><i class="layui-icon">&#xe615;</i>搜索</button>
+        </div>
+        <table class="layui-table" id="contract-table" lay-filter="contract-table"></table>
+    </div></div>
+    </div>
+</div>
+<input id="hospitalId" type="hidden" />
+<!-- 表格操作列 -->
+<script type="text/html" id="contract-table-bar">
+    <a class="layui-btn layui-btn-danger layui-btn-xs permissions" permissions="contract-del" lay-event="del">删除</a>
+    <a class="layui-btn layui-btn-primary layui-btn-xs permissions" permissions="productorderdetail-save" lay-event="detail">查看套餐</a>
+</script>
+<!-- 表格状态列 -->
+<script type="text/html" id="contract-tpl-state">
+    <input type="checkbox" lay-filter="contract-tpl-state" value="{{d.id}}" lay-skin="switch" lay-text="未处理|已处理"
+           {{d.enabled==true?'checked':''}}/>
+</script>
+<!-- 表单弹窗 -->
+<script type="text/html" id="contract-model">
+    <table class="layui-table" id="contract-table-detail" lay-filter="contract-table-detail"></table>
+</script>
+<script>
+    layui.use(['table', 'util', 'admin', 'config', 'form', 'autocomplete'], 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 autocomplete = layui.autocomplete;
+        var $ = layui.jquery;
+
+        //自动完成-医院名称
+        autocomplete.render({
+            elem: $('#hospital-search-value')[0],
+            keywordsName: 'hospitalName',//查询关键字名称
+            url: config.base_server + 'api-user/syshospital/findByName',
+            template_val: '{{d.hospitalName}}',//选择后文本框显示的数据字段
+            template_txt: "<div class='layui-table-cell'>{{d.hospitalName}}</div>",//下拉列表模板
+            onselect: function (resp) {
+                $("#hospitalId").val(resp.id);
+            }
+        });
+
+        // 渲染表格
+        var renderTable = function () {
+            table.render({
+                elem: '#contract-table',
+                url: config.base_server + 'api-opration/contract',
+                method: 'GET',
+                headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+                page: true,
+                cols: [[
+                    { field: 'hospitalName', width: 300, title: '医院名称' },
+                    { field: 'departmentName', width: 200, title: '科室名称' },
+                    { field: 'contractNo', width: 150, title: '合同编号' },
+                    { field: 'contractTitle', width: 200, title: '合同名' },
+                    { field: 'contractBeginTime', width: 120, title: '合同生效时间',templet:function(d)
+                    {
+                        return new Date(d.contractBeginTime).dateFormat("yyyy/MM/dd");
+                    }
+                    },
+                    { field: 'contractEndTime', width: 120, title: '合同到期时间',templet:function(d){
+                        return new Date(d.contractEndTime).dateFormat("yyyy/MM/dd");
+                    } },
+                    { field: 'contractTime', width: 120, title: '合同签订时间',templet:function(d){
+                        return new Date(d.contractTime).dateFormat("yyyy/MM/dd");
+                    } },
+                    // { field: 'enabled', width: 120, templet: '#contract-tpl-state', sort: true, title: '状态' },
+                    { field: 'createTime', width: 160, title: '创建时间' , templet: function (d) {
+                        return new Date(d.createTime).dateFormat("yyyy-MM-dd hh:mm");
+                    }},
+                    { align: 'center', width: 150, toolbar: '#contract-table-bar', title: '操作',
+                            fixed: 'right'}
+                ]],
+                done:function(res){
+                    permissionsInput(res,config);
+                }
+            });
+        }
+        renderTable();
+        // 工具条点击事件
+        table.on('tool(contract-table)', function (obj) {
+            if (obj.event === 'del') { // 删除
+                layer.confirm('确定要删除合同及关联套餐吗?', function (i) {
+                    layer.close(i);
+                    layer.load(2);
+                    admin.req('api-opration/contract/' + obj.data.id, {}, function (data) {
+                        layer.closeAll('loading');
+                        layer.msg(data.msg, { icon: 1, time: 2000 }, function () {
+                            renderTable();
+                        });
+                        obj.del();
+                    }, 'DELETE');
+                });
+            }
+            else
+            {
+                showModel(obj.data.id);
+            }
+        });
+
+        // 搜索按钮点击事件
+        $('#contract-btn-search').click(function () {
+            var hospitalName = $('#hospital-search-value').val();
+            if(strUtil.isEmpty(hospitalName))
+            {
+                $("#hospitalId").val("");
+            }
+            table.reload('contract-table', { where: { hospitalId: $("#hospitalId").val()} });
+        });
+
+        var showModel=function(orderId){
+        layer.open({
+            type:1,
+            title:'查看产品',
+            area: '1200px',
+            offset: '100px',
+            content: $('#contract-model').html(),
+            success:function(){
+                table.render({
+                elem: '#contract-table-detail',
+                url: config.base_server + 'api-opration/productorderrecord',
+                method: 'GET',
+                where:{'orderId':orderId},
+                headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+                page: true,
+                limit:10,
+                limits:[5,10],
+                cols: [[
+                    { field: 'proName', width: 300, title: '产品名称' },
+                    { field: 'ailightCount', width: 150, title: '读片量' },
+                    { field: 'recordCount', width: 100, title: '报告量' },
+                    { field: 'isShare', width: 150, title: '是否共享',templet:function(d)
+                    {
+                        if(d.isShare)
+                        return '共享'
+                        else
+                        return '私有'
+                    }
+                    },
+                    { field: 'proBegintime', width: 150, title: '开始时间',templet:function(d){
+                        return new Date(d.proBegintime).dateFormat("yyyy/MM/dd");
+                    } },
+                    { field: 'proEndtime', width: 180, title: '结束时间',templet:function(d){
+                        return new Date(d.proEndtime).dateFormat("yyyy/MM/dd");
+                    } },
+                    { field: 'createTime', width: 160, sort: true, title: '创建时间' }
+                ]]
+            });
+            }
+        });
+        }
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/dataNeed.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/dataNeed.html
new file mode 100644
index 0000000..b243578
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/dataNeed.html
@@ -0,0 +1,321 @@
+<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" placeholder="开始时间" > 至 <input type="text"
+                class="layui-input search-input" id="test2" placeholder="结束时间" > &emsp;
+            <button id="app-btn-search" class="layui-btn icon-btn permissions"  permissions="diagnostic-get"><i class="layui-icon">&#xe615;</i>搜索</button>
+            <!-- <button id="app-btn-add" class="layui-btn icon-btn"><i class="layui-icon">&#xe654;</i>添加</button> -->
+            <button id="app-btn-export" class="layui-btn icon-btn permissions"  permissions="dataneed-export"><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="app-table-bar">
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看详情</a>
+</script>
+<script type="text/html" id="app-table-bar1">
+
+    {{# if (d.enabled ==0&&d.dataFile==null){}}
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="upload">待上传数据</a>
+    {{#  } else { }}
+    <p>已上传</p>
+    {{#}}}
+</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="needType" 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="doctorName" 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="hospitalName" 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="departmentName" 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="doctorTel" 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="needBegintime" 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="needEndtime" 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">
+                <textarea name="needTags" placeholder="请输入回调地址" class="layui-input" style="height:200px;overflow:auto" maxlength="20"> </textarea>
+            </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 type="text/html" id="app-upload">
+    <form id="app-form-upload" lay-filter="app-form-upload" class="layui-form model-form">
+        <input name="id" id="upload-id"  type="hidden"/>
+        <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="dataFile" id="dataFile"  type="hidden" class="layui-input" maxlength="20"/>
+                <input name="enabled" id="enabled"  type="hidden" value="0" class="layui-input" maxlength="20"/>
+            </div>
+        </div>
+    </form>
+</script>
+
+
+<script>
+    layui.use(['form', 'table', 'laydate', 'util', 'upload', '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 upload = layui.upload;
+
+
+
+        //时间格式
+        var laydate = layui.laydate;
+        //执行一个laydate实例
+        laydate.render({
+            elem: '#test1' //指定元素
+        });
+        laydate.render({
+            elem: '#test2' //指定元素
+        });
+
+        // 渲染表格
+        table.render({
+            elem: '#app-table',
+            url: config.base_server + 'api-opration/dataneed',
+            method: 'GET',
+            headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+            page: true,
+            cols: [[
+                { type: 'numbers' },
+                { field: 'doctorName',align:'center', width: 100, title: '医生姓名' },
+                { field: 'doctorTel',align:'center', width: 150, title: '联系电话' },
+                { field: 'hospitalName',align:'center', width: 300, title: '所在医院' },
+                { field: 'needBegintime',align:'center', width: 240, title: '时间段', templet: "<div>{{layui.util.toDateString(d.needBegintime, 'yyyy-MM-dd')}} &nbsp;&nbsp;至 &nbsp;&nbsp;{{layui.util.toDateString(d.needEndtime, 'yyyy-MM-dd')}}</div>" },
+                { field: 'needType',align:'center', width: 100, title: '数据类型', templet: function (d) { if (d.needType == 1) { return '筛查' } else { return '就诊' } } },// 0就诊数据 1筛查
+                { field: 'needTags',align:'center', width: 100, align: 'center', toolbar: '#app-table-bar', title: '需求标签' },
+                { field: 'enabled',align:'center', width: 200, toolbar: '#app-table-bar1', title: '处理状态', },
+                { field: 'downTime',align:'center', width: 250, title: '下载时间', templet: "<div>{{layui.util.toDateString(d.downTime, 'yyyy-MM-dd HH:mm')}}</div>" }
+            ]],done:function(res){
+                permissionsInput(res,config);
+            }
+        });
+
+        // 工具条点击事件
+        table.on('tool(app-table)', function (obj) {
+            var data = obj.data;
+            var layEvent = obj.event;
+
+            if (layEvent === 'detail') { // 显示详情
+                showEditModel(data);
+            } else if (layEvent === 'upload') { // 上传
+                layer.open({
+                    type: 1,
+                    title: '上传数据',
+                    area: ["500px", "150px"],
+                    content: $('#app-upload').html(),
+                    success: function () {
+                        $("#upload-id").val(data.id)
+                        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
+                            },
+                            done: function (data) {
+                                layer.closeAll('loading');
+                                // $("#dataFile").val(data.url);
+                                updateEnabled(data.url, false);
+                            },
+                            error: function (data) {
+                                layer.closeAll('loading');
+                            }
+                        });
+                    }
+                });
+            }
+        });
+        //更新上传的状态
+        var updateEnabled = function (dataFile, enabled) {
+            admin.req('api-opration/dataneed/updateEnabled', {
+                id: $("#upload-id").val(),
+                enabled: enabled,
+                dataFile: dataFile
+            }, function (data) {
+                layer.closeAll('loading');
+                if (data.code == 0) {
+                    layer.closeAll();
+                    table.reload('app-table', { where: {} });
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                }
+            }, 'GET');
+        }
+        // 搜索按钮点击事件
+        $('#app-btn-search').click(function () {
+            var key = $('#app-edit-search').val();
+            var needBegintime = $('#test1').val();
+            var needEndtime = $('#test2').val();
+            if (needBegintime != null && needEndtime != null) {
+                var flag = compareDate(needBegintime, needEndtime);
+                if (!flag) {
+                    layer.msg('结束时间不得小于开始时间');
+                    return;
+                }
+            }
+
+            table.reload('app-table', { where: { doctorName: key, needBegintime: needBegintime, needEndtime: needEndtime } });
+        });
+        //比较日期大小
+        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 key = $('#app-edit-search').val();
+            var needBegintime = $('#test1').val();
+            var needEndtime = $('#test2').val();
+            if (needBegintime != null && needEndtime != null) {
+                var flag = compareDate(needBegintime, needEndtime);
+                if (!flag) {
+                    layer.msg('结束时间不得小于开始时间');
+                    return;
+                }
+            }
+            //获取
+            var url = config.base_server + 'api-opration/dataneed/export';
+            var xhr = new XMLHttpRequest();
+            xhr.open('POST', url, true);
+            xhr.responseType = "blob";
+             var form = new FormData();
+            // Add selected file to form
+            form.append("doctor_name", key);
+            form.append('need_begintime',needBegintime);
+            form.append('need_endtime',needEndtime);
+
+            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(form);
+        });
+
+        // 显示编辑弹窗
+        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) {
+                        if (data.needBegintime) {
+                            var needBegintime = layui.util.toDateString(data.needBegintime, 'yyyy年MM月dd日');
+                            data.needBegintime = needBegintime
+                        }
+                        if (data.needEndtime) {
+                            var needEndtime = layui.util.toDateString(data.needEndtime, 'yyyy年MM月dd日');
+                            data.needEndtime = needEndtime
+                        }
+                        $("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').find('input,textarea').prop('readonly', true);
+                        $('#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/departmentProduct.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/departmentProduct.html
new file mode 100644
index 0000000..37a11f5
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/departmentProduct.html
@@ -0,0 +1,166 @@
+<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;
+            <div  class="layui-col-sm10">
+                <div class="layui-col-sm4">
+                    <input type="text" class="layui-input search-input" id="startTime" placeholder="开始时间"> 至 <input type="text"
+                    class="layui-input search-input" id="endTime" placeholder="结束时间"> &emsp;
+                </div>
+                <div class="layui-col-sm2">
+                    <input id="product-search-value" class="layui-input search-input" type="text" placeholder="按产品名" />&emsp;
+                </div>
+                <div class="layui-col-sm2">
+                    <input id="hospital-search-value" class="layui-input search-input" type="text" placeholder="按医院名" style="width: 100%;" />
+                    <input type="hidden" id="hospitalId" value="">
+                </div>
+                <div class="layui-col-sm2">
+                    &emsp;<button id="product-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
+                </div>
+            </div>
+        </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>
+    layui.use(['table', 'util', 'admin', 'config', 'form', 'laydate', 'autocomplete'], function () {
+        let table = layui.table;
+        let util = layui.util;
+        let admin = layui.admin;
+        let form = layui.form;
+        let config = layui.config;
+        var autocomplete = layui.autocomplete;
+        var laydate = layui.laydate;
+
+        //执行一个laydate实例
+        laydate.render({
+            elem: '#startTime' //指定元素
+        });
+        laydate.render({
+            elem: '#endTime' //指定元素
+        });
+
+        // 渲染表格
+        var renderTable = function () {
+            table.render({
+                elem: '#product-table',
+                url: config.base_server + 'api-opration/productorderrecord/all',
+                method: 'GET',
+                headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+                page: true,
+                cols: [[
+                    { field: 'hospitalName', width: 300, title: '医院名称' },
+                    { field: 'departmentName', width: 100, title: '科室名称' },
+                    { field: 'proName', width: 250, title: '产品名称' },
+                    {
+                    field: 'proType', sort: true, align: 'center', width: 80, templet: function (d) {
+                        if (d.proType === 0)
+                            return "试用"
+                        else
+                            return "正式"
+                    }, title: '类型'
+                },
+                    { field: 'ailightCount', width: 100, title: '读片量' },
+                    { field: 'recordCount', width: 100, title: '报告量' },
+                    { field: 'isShare', width: 100, title: '是否共享',templet:function(d)
+                    {
+                        if(d.isShare)
+                        return '共享'
+                        else
+                        return '私有'
+                    }
+                    },
+                    { field: 'proBegintime', width: 120, title: '开始时间',templet:function(d){
+                        return new Date(d.proBegintime).dateFormat("yyyy/MM/dd");
+                    } },
+                    { field: 'proEndtime', width: 120, title: '结束时间',templet:function(d){
+                        return new Date(d.proEndtime).dateFormat("yyyy/MM/dd");
+                    } },
+                    // { field: 'createTime', width: 160, sort: true, title: '创建时间',templet:function(d){
+                    //     return new Date(d.createTime).dateFormat("yyyy/MM/dd hh:mm:ss");
+                    // } },
+                    { field: 'createTime', width: 200, sort: true, title: '创建时间', templet: "<div>{{layui.util.toDateString(d.createTime, 'yyyy/MM/dd HH:mm')}}</div>" },
+                    { align: 'center', width: 100, toolbar: '#product-table-bar', title: '操作' }
+                ]]
+            });
+        }
+        renderTable();
+        // 工具条点击事件
+        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/productorderrecord/' + obj.data.id, {}, function (data) {
+                        layer.closeAll('loading');
+                        layer.msg(data.msg, { icon: 1, time: 2000 }, function () {
+                            renderTable();
+                        });
+                        obj.del();
+                    }, 'DELETE');
+                });
+            }
+        });
+
+        // 搜索按钮点击事件
+        $('#product-btn-search').click(function () {
+            var startTime = $('#startTime').val();
+            var endTime = $('#endTime').val();
+            if (startTime != null && endTime != null) {
+                var flag = compareDate(startTime, endTime);
+                if (!flag) {
+                    layer.msg('结束时间不得小于开始时间');
+                    return;
+                }
+            }
+            var proName = $('#product-search-value').val();
+                var hospitalId = $('#hospitalId').val();
+            table.reload('product-table', { where: { proName: proName,hospitalId: hospitalId,startTime: startTime, endTime: endTime } });
+        });
+       
+        //比较日期大小
+        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;
+                }
+            }
+        }
+
+        //自动完成-医院名称
+        autocomplete.render({
+            elem: $('#hospital-search-value'),
+            keywordsName: 'hospitalName',//查询关键字名称
+            url: config.base_server + 'api-user/syshospital/findByName',
+            template_val: '{{d.hospitalName}}',//选择后文本框显示的数据字段
+            template_txt: "<div class='layui-table-cell'>{{d.hospitalName}}</div>",//下拉列表模板
+            onselect: function (resp) {
+                $("#hospitalId").val(resp.id);
+            }
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/diagnosisRecord.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/diagnosisRecord.html
new file mode 100644
index 0000000..e8ec4f1
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/diagnosisRecord.html
@@ -0,0 +1,156 @@
+<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">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <input type="text" name="date" id="datebegin" lay-verify="date" autocomplete="off"
+                        class="layui-input search-input" />&emsp;至&emsp;
+                    <input type="text" name="date" id="dateend" lay-verify="date" autocomplete="off"
+                        class="layui-input search-input" />&emsp;
+                    <input id="childName" class="layui-input search-input" type="text" placeholder="按患者名" />&emsp;
+                    <input id="diagnosticDoctorName" class="layui-input search-input" type="text"
+                        placeholder="按诊断医生名" />&emsp;
+                    <input id="hospitalName" class="layui-input  search-input" type="text" placeholder="按医院名,必选条件!"
+                        autocomplete="off" /></div>&emsp;
+                <button id="diagnostic-btn-search" class="layui-btn icon-btn permissions"  permissions="diagnostic-get">
+                    <i class="layui-icon">&#xe615;</i>搜索</button>
+
+                <table class="layui-table" id="diagnostic-table" lay-filter="diagnostic-table"></table>
+            </div>
+        </div>
+    </div>
+</div>
+<input id="hospitalId" type="hidden" />
+<!-- 表格操作列 -->
+<script type="text/html" id="diagnostic-table-bar">
+    <a class="layui-btn layui-btn-xs permissions"  permissions="diagnostic-get" lay-event="select">查看报告</a>
+</script>
+
+<script>
+    layui.use(['table', 'util', 'admin', 'config', 'laydate', 'form', 'autocomplete'], function () {
+        let table = layui.table;
+        let util = layui.util;
+        let admin = layui.admin;
+        let form = layui.form;
+        let config = layui.config;
+        let laydate = layui.laydate;
+        var autocomplete = layui.autocomplete;
+        var $ = layui.jquery;
+
+        //执行一个laydate实例
+        laydate.render({
+            elem: '#datebegin'//指定元素
+        });
+        laydate.render({
+            elem: '#dateend' //指定元素
+        });
+        //自动完成-医院名称
+        autocomplete.render({
+            elem: $('#hospitalName')[0],
+            keywordsName: 'hospitalName',//查询关键字名称
+            url: config.base_server + 'api-user/syshospital/findByName',
+            template_val: '{{d.hospitalName}}',//选择后文本框显示的数据字段
+            template_txt: "<div class='layui-table-cell'>{{d.hospitalName}}</div>",//下拉列表模板
+            onselect: function (resp) {
+                $("#hospitalId").val(resp.id);
+            }
+        });
+        // 渲染表格
+        table.render({
+            elem: '#diagnostic-table',
+            url: config.base_server + 'api-opration/productorderrecord/alldata',
+            method: 'POST',
+            headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+            page: true,
+            cols: [[
+                { field: 'diagnosticHospitalName',width: "10%", title: '医院名称' },
+                { field: 'diagnosticDepartName', width: "10%", title: '科室名称' },
+                { field: 'diagnosticDoctorName', width: "10%", title: '医生姓名' },
+                { field: 'childName', width: "10%", title: '患者姓名' },
+                { field: 'childSex', width: "10%", title: '性别' },
+                { field: 'childBirthday', width: "10%", title: '出生日期',templet:function(d){
+                    return new Date(d.createTime).dateFormat("yyyy-MM-dd");
+                }},
+                { field: 'childPhone', width: "10%", title: '联系电话' },
+                {
+                    field: 'isDeleted', sort: true, align: 'center', width: 100, templet: function (d) {
+                        if (!d.isDeleted)
+                            return "正常"
+                        else
+                            return "已删除"
+                    }, title: '状态'
+                },
+                {
+                    field: 'createTime', width: "10%", sort: true, title: '创建时间', templet: function (d) {
+                        return new Date(d.createTime).dateFormat("yyyy-MM-dd hh:mm");
+                    }
+                },{
+                    field: 'diagnosticDiagnoseTime',width: "10%", sort: true, title: '诊断时间', templet: function (d) {
+                        return new Date(d.diagnosticDiagnoseTime).dateFormat("yyyy-MM-dd");
+                    }
+                },
+                {
+                    field: 'updateTime', width: "10%", sort: true, title: '修改时间', templet: function (d) {
+                        return new Date(d.createTime).dateFormat("yyyy-MM-dd hh:mm");
+                    }
+                },
+                { field: 'enabled', width: "10%", templet: '#diagnostic-table-bar', title: '查看' }
+            ]],
+            done:function(res){
+                permissionsInput(res,config);
+            }
+        });
+        // 搜索按钮点击事件
+        $('#diagnostic-btn-search').click(function () {
+            debugger
+            var diagnosticHospitalId = $('#hospitalId').val();
+            if (!strUtil.isEmpty(diagnosticHospitalId)) {
+                var childName = $('#childName').val();
+                var diagnosticDoctorName = $("#diagnosticDoctorName").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);
+                }
+                var whereData = {
+                    childName: childName,
+                    diagnosticHospitalId: diagnosticHospitalId,
+                    diagnosticDoctorName: diagnosticDoctorName,
+                    startTime: datebegin,
+                    endTime: dateend
+                };
+                table.reload('diagnostic-table', { where: whereData });
+            }
+        });
+        // 工具条点击事件
+        table.on('tool(diagnostic-table)', function (obj) {
+            var data = obj.data;
+            var layEvent = obj.event;
+            if (layEvent === "select") {
+                //查看报告  报告列数据缓存起来
+                admin.putTempData("t_diagnosis", data);
+                admin.popupCenter({
+                    title: '查看报告',
+                    path: 'pages/opration/recordNote.html',
+                    area: '1200px',
+                    offset: '10px',
+                    finish: function () {
+                        admin.putTempData("t_diagnosis", "");
+                    }
+                });
+            }
+        });
+    });
+</script>
\ No newline at end of file
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..30f7296
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/doctor.html
@@ -0,0 +1,619 @@
+<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">
+            <div class="layui-form-item">
+                <div class="layui-inline" style="margin-bottom: -25px;">
+                    <input id="doctorTel" class="layui-input search-input" type="text" placeholder="按手机号" />&emsp;
+                    <input id="doctorName" class="layui-input search-input" type="text" placeholder="按医生名" />&emsp;
+                    <select id="doctorState" lay-filter="role_clients">
+                        <option value="">-医院状态-</option>
+                        <option value="1">正常</option>
+                        <option value="0">试用</option>
+                    </select>&emsp;
+                    <input name="hospitalName" id="hospitalName-seach" placeholder="按医院名称" type="text"
+                        class="layui-input search-input" maxlength="50" autocomplete="off" />&emsp;
+                </div>
+                <button id="app-btn-search" class="layui-btn icon-btn permissions" layt="abc"
+                    permissions="sysdoctor-list"><i class="layui-icon">&#xe615;</i>搜索</button>
+                <button id="doctor-btn-add" class="layui-btn icon-btn permissions" permissions="sysdoctor-edit"><i
+                        class="layui-icon">&#xe654;</i>添加</button>
+                <!-- 数据表格 -->
+                <table class="layui-table" id="app-table" lay-filter="app-table"></table>
+            </div>
+        </div>
+    </div>
+</div>
+
+<input id="hospitalId" type="hidden" />
+<!-- 表格操作列 -->
+
+<script type="text/html" id="doctor-table-bar">
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">详情</a>
+    {{# if (d.doctorType !=2){}}
+    <button class="layui-btn layui-btn-primary layui-btn-xs permissions" permissions="users-edit"
+        lay-event="reset">重置密码</button>
+    {{#}}}
+    <button class="layui-btn layui-btn-primary layui-btn-xs permissions" permissions="sysdoctor-edit"
+        lay-event="edit">修改</button>
+    <button class="layui-btn layui-btn-danger layui-btn-xs permissions" permissions="sysdoctor-del" lay-event="del">删除</button>
+</script>
+
+<!-- 表格状态列 -->
+<script type="text/html" id="doctor-tpl-state">
+    <input type="checkbox" lay-filter="doctor-tpl-state" value="{{d.id}}" lay-skin="switch" lay-text="正常|已停用"
+        {{d.enabled==true?'checked':''}} />
+</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 style="display:flex">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label" style="width: 75px;">所在医院</label>
+                    <div class="layui-input-block" style="width: 150px;">
+                        <input name="hospitalName" id="hospitalName" placeholder="请输入医院名称" type="text"
+                            class="layui-input" maxlength="50" lay-verify="required" required style="width: 150px;" />
+                        <input type="hidden" name="hospitalId" id="hospitalId" />
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">科室</label>
+                    <div class="layui-input-block" style="width: 150px;">
+                        <input name="departmentName" id="departmentName" placeholder="请选择科室" class="layui-input"
+                            maxlength="20" />
+                        <!-- <select id="departmentId" name="departmentId" lay-filter="departmentId" placeholder="请选择科室"
+                        lay-verify="required" required>
+                        <option value="">-请选择科室-</option>
+                    </select> -->
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">医生类型</label>
+                    <div class="layui-input-block" style="width: 150px;">
+                        <select id="doctorType" name="doctorType" lay-filter="doctorType" lay-verify="required"
+                            required>
+                            <option value="2" selected>C端医生</option>
+                            <option value="1">H端医生</option>
+                            <option value="0">C端+H端</option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div style="display:flex">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">姓名</label>
+                    <div class="layui-input-block" style="width: 150px;">
+                        <input name="doctorName" type="text" class="layui-input" maxlength="20" lay-verify="required"
+                            required style="width: 150px;" />
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">职称</label>
+                    <div class="layui-input-block" style="width: 150px;">
+                        <!-- <select id="doctorRankId" name="doctorRankId" lay-filter="doctorRankId" placeholder="选择一个职称"
+                        lay-verify="required" required>
+                        <option value="">-请选择-</option>
+                    </select> -->
+                        <input name="doctorRank" id='doctorRank' class="layui-input" maxlength="20" />
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">是否是管理员</label>
+                    <div class="layui-input-block">
+                        <input name="isAdminUser" id="isAdminUser-shi" type="radio" value="true" title="是"
+                            class="layui-input" />
+                        <input name="isAdminUser" id="isAdminUser-fou" type="radio" value="false" title="否"
+                            class="layui-input" />
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div style="display:flex">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">联系电话</label>
+                    <div class="layui-input-block" style="width: 150px;">
+                        <input name="doctorTel" id="doctorTel-add" type="text" class="layui-input" maxlength="20"
+                            lay-verify="required|phone" required style="width: 150px;" />
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">电话</label>
+                    <div class="layui-input-block" style="width: 150px;">
+                        <input name="doctorOtherLink" type="text" class="layui-input" maxlength="20" />
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">Email</label>
+                    <div class="layui-input-block" style="width: 150px;">
+                        <input name="doctorEmail" type="text" class="layui-input" maxlength="50"
+                            lay-verify="email"  autocomplete="off"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div style="display:flex">
+            <div class="layui-form-item">
+                <label class="layui-form-label">医生简介</label>
+                <div class="layui-input-block">
+                    <textarea name="doctorAbout" id="doctorAbout" class="layui-textarea" maxlength="300"
+                        style="width: 697px;"></textarea>
+                </div>
+            </div>
+        </div>
+        <div style="display:flex">
+            <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" />
+                    <input name="doctorState" id="doctorState-fou" type="radio" value="false" title="试用"
+                        class="layui-input" />
+                </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" />
+                    <input name="isTop" id="isTop-fou" type="radio" value="false" title="否" class="layui-input" />
+                </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" />
+                    <input name="isAnswer" id="isAnswer-fou" type="radio" value="false" title="否" class="layui-input" />
+                </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" />
+                    <input name="isSigning" id="isSigning-fou" type="radio" value="false" title="否"
+                        class="layui-input" />
+                </div>
+            </div>
+        </div>
+        <div style="display:flex">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">登录帐号</label>
+                    <div class="layui-input-block" style="width: 150px;">
+                        <input name="username" id="username" readonly type="text" class="layui-input" maxlength="20"
+                            lay-verify="required" required />
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">销售代表</label>
+                    <div class="layui-input-block" style="width: 150px;">
+                        <input name="serverUserName" id="serverUserName-add" class="layui-input" maxlength="15" />
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div style="display:flex">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">医生的头像</label>
+                    <div class="layui-input-block" id="demo" style="width: 150px;">
+                        <img id="doctorLogo" src="" width="100px" height="100px">
+                    </div>
+                </div>
+            </div>
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">资质证书</label>
+                    <div class="layui-input-block" id="demo" style="width: 150px;">
+                        <img id="doctorCcie" src="" width="200px" height="200px">
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <div class="layui-form-item model-form-footer">
+            <button class="layui-btn permissions" ew-event="closeDialog" id="shen_he" type="button">审核通过</button>
+            <button class="layui-btn permissions" ew-event="closeDialog" type="button" id="sure">关闭</button>
+        </div>
+    </form>
+</script>
+
+
+<script>
+    layui.use(['form', 'table', 'laydate', 'util', 'config', 'upload', 'admin', 'autocomplete', '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 autocomplete = layui.autocomplete;
+            var formSelects = layui.formSelects;
+            var $ = layui.jquery;
+            form.verify({
+                confirmPass: function (value) {
+                    if ($('input[name=password]').val() !== value) return '两次密码输入不一致!';
+                }
+            });
+
+            //医院数据绑定在弹框里
+            var hospital = "";
+
+            var department = "";
+            //销售代表
+            var user = "";
+            //职称
+            var doctorRank = "";
+
+            // 获取应用列表
+            // layer.load(2);
+            admin.req('api-user/syshospital/findAllByMap', 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));
+                        form.render('select', 'app-form');
+                    })
+                    form.render();
+                } else {
+                    layer.msg(data.msg, {
+                        icon: 2,
+                        time: 2000
+                    });
+                }
+            }, 'Post');
+            //自动完成-医院名称
+            autocomplete.render({
+                elem: $('#hospitalName-seach')[0],
+                keywordsName: 'hospitalName', //查询关键字名称
+                url: config.base_server + 'api-user/syshospital/findByName',
+                template_val: '{{d.hospitalName}}', //选择后文本框显示的数据字段
+                template_txt: "<div class='layui-table-cell'>{{d.hospitalName}}</div>", //下拉列表模板
+                onselect: function (resp) {
+                    $("#hospitalId").val(resp.id);
+                }
+            });
+
+            // 修改company状态
+            var updata_enable = function (obj) {
+                layer.confirm('确定审核通过吗?', function (i) {
+                    admin.req('api-user/sysdoctor/enable', JSON.stringify({
+                        id: obj.id,
+                        enabled: true
+                    }), function (data) {
+                        layer.closeAll('loading');
+                        if (data.code == 0) {
+                            layer.msg(data.msg, {
+                                icon: 1,
+                                time: 2000
+                            });
+                            parent.layui.table.reload('app-table', {});
+                        } else {
+                            layer.msg(data.msg, {
+                                icon: 2,
+                                time: 2000
+                            });
+                            $(obj.elem).prop('checked', !obj.elem.checked);
+                            form.render('checkbox');
+                        }
+                    }, '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: 2000
+                        });
+                    }
+                }, '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) {
+                            //往下拉菜单里添加元素
+                            $('#serverUserId-add').append(new Option(item.nickname, item.id,
+                                false, false));
+                        })
+                    } else {
+                        layer.msg(data.msg, {
+                            icon: 2,
+                            time: 2000
+                        });
+                    }
+                }, 'get');
+            }
+
+            // 添加按钮点击事件
+            $('#doctor-btn-add').click(function () {
+                showEditModel_add("添加");
+            });
+            //时间格式
+            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: [
+                    [{
+                            field: 'hospitalName',
+                            width: "200",
+                            title: '医院名称',
+                            fixed: 'left'
+                        },
+                        {
+                            field: 'departmentName',
+                            width: "150",
+                            title: '科室',
+                            fixed: 'left'
+                        },
+                        {
+                            field: 'doctorName',
+                            width: "100",
+                            title: '医生姓名',
+                            fixed: 'left'
+                        },
+                        {
+                            field: 'doctorRank',
+                            width: "100",
+                            title: '职称'
+                        },
+                        {
+                            field: 'username',
+                            width: "150",
+                            title: '登录帐号'
+                        },
+                        {
+                            field: 'doctorTel',
+                            width: "150",
+                            title: '联系方式'
+                        },
+                        {
+                            field: 'isAnswer',
+                            width: "75",
+                            title: '医答',
+                            templet: function (d) {
+                                return d.isAnswer ? "是" : "否"
+                            }
+                        },
+                        {
+                            field: 'isSigning',
+                            width: "75",
+                            title: '签约',
+                            templet: function (d) {
+                                return d.isSigning ? "是" : "否"
+                            }
+                        },
+                        {
+                            field: 'isAdminUser',
+                            width: "100",
+                            title: '是否管理员',
+                            templet: function (d) {
+                                return d.isAdminUser ? "管理员" : "普通医生"
+                            }
+                        },
+                        {
+                            field: 'createTime',
+                            width: "120",
+                            sort: true,
+                            title: '创建时间',
+                            templet: "<div>{{layui.util.toDateString(d.createTime, 'yyyy/MM/dd HH:mm')}}</div>"
+                        },
+                        {
+                            field: 'serverUserName',
+                            width: "120",
+                            title: '销售代表'
+                        },
+                        {
+                            width: "260",
+                            align: 'center',
+                            toolbar: '#doctor-table-bar',
+                            title: '操作',
+                            fixed: 'right'
+                        },
+                    ]
+                ],
+                done: function (res, curr, count) {
+                    permissionsInput(res, config);
+                }
+            });
+            // 显示编辑弹窗
+            var showEditModel = function (data) {
+                layer.open({
+                    type: 1,
+                    title: '详情',
+                    area: '900px',
+                    offset: '120px',
+                    content: $('#app-model').html(),
+                    id: 'LAY_layuipro',
+                    success: function () {
+                        $('#app-form')[0].reset();
+                        if (data.isAdminUser) {
+                            $('#isAdminUser-shi').prop("checked", true)
+                        } else {
+                            $('#isAdminUser-fou').prop("checked", true)
+                        }
+                        if (data.isTop) {
+                            $('#isTop-shi').prop("checked", true)
+                        } else {
+                            $('#isTop-fou').prop("checked", true)
+                        }
+                        if (data.isAnswer) {
+                            $('#isAnswer-shi').prop("checked", true)
+                        } else {
+                            $('#isAnswer-fou').prop("checked", true)
+                        }
+                        if (data.isSigning) {
+                            $('#isSigning-shi').prop("checked", true)
+                        } else {
+                            $('#isSigning-fou').prop("checked", true)
+                        }
+
+                        $('#app-form').attr('method', 'POST');
+                        if (data) {
+                            $('#doctorLogo').prop("src", data.doctorLogo);
+                            $('#doctorCcie').prop("src", data.doctorCcie);
+                            if (!data.enabled) {
+                                $('#shen_he').show();
+                            } else {
+                                $('#shen_he').hide();
+                            }
+                            form.val('app-form', data);
+                            $('#app-form').find('input,select,textarea').prop('readonly', true);
+                            $('#app-form').find('select').prop('disabled', true);
+                            $('#app-form').find('input[type="radio"]').prop('disabled', true);
+                            $('#app-form').attr('method', 'POST');
+                            form.render();
+                        }
+                        //点击审核通过按钮
+                        $('#shen_he').click(function () {
+                            updata_enable(data);
+                        })
+                    }
+                });
+            }
+
+
+            // 工具条点击事件
+            table.on('tool(app-table)', function (obj) {
+                var data = obj.data;
+                var layEvent = obj.event;
+                if (layEvent === 'detail') { // 查看详情
+                    showEditModel(data);
+                } 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.alert("密码重置为:" + data.data, {
+                                    icon: 1
+                                });
+                            } else {
+                                layer.msg(data.msg, {
+                                    icon: 2,
+                                    time: 2000
+                                });
+                            }
+                        }, 'PUT');
+                    });
+                } else if (layEvent === 'edit') {
+                    showEditModel_add("编辑", data);
+                } 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: 2000
+                                });
+                                table.reload('app-table', {});
+                            } else {
+                                layer.msg(data.msg, {
+                                    icon: 2,
+                                    time: 2000
+                                });
+                            }
+                        }, 'delete');
+                    });
+                }
+            });
+
+            // 搜索按钮点击事件
+            $('#app-btn-search').click(function () {
+                if (strUtil.isEmpty($("#hospitalName-seach").val())) {
+                    $("#hospitalId").val("");
+                }
+                var doctorState = $('#doctorState').val();
+                var hospitalName = $("#hospitalName-seach").val();
+                var doctorTel = $('#doctorTel').val();
+                var doctorName = $('#doctorName').val();
+                table.reload('app-table', {
+                    where: {
+                        doctorState: doctorState,
+                        hospitalName: hospitalName,
+                        doctorTel: doctorTel,
+                        doctorName: doctorName
+                    }
+                });
+            });
+
+            // 显示新增弹窗
+            var showEditModel_add = function (title, data) {
+                admin.putTempData('t_doctor', data);
+                admin.popupCenter({
+                    title: title,
+                    path: 'pages/opration/doctor_form.html',
+                    area: '900px',
+                    offset: '0px',
+                    finish: function () {}
+                });
+            };
+        });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/doctorTemplete.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/doctorTemplete.html
new file mode 100644
index 0000000..5c3640e
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/doctorTemplete.html
@@ -0,0 +1,242 @@
+<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">
+            <select id="templeteType" placeholder="话术类型">
+                <option value="">-请选择-</option>
+                <option value="0">结论</option>
+                <option value="1">建议</option>
+                <option value="2">方案</option>
+            </select>
+            <select id="publicType" placeholder="开放类型">
+                <option value="">-请选择-</option>
+                <option value="0">公开-</option>
+                <option value="1">私有</option>
+            </select>
+            <input name="templeteTitle" id="templeteTitle" placeholder="按标题" type="text"
+                class="layui-input search-input" maxlength="20" />
+            <button id="app-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
+            <button id="docto-templete-btn-add" class="layui-btn icon-btn permissions" permissions="doctortemplete-edit"><i class="layui-icon">&#xe654;</i>添加</button>
+        </div>
+
+        <!-- 数据表格 -->
+        <table class="layui-table permissions" permissions="doctortemplete-list" id="app-table" lay-filter="app-table"></table>
+    </div>
+</div>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="doctor-templete-table-bar">
+    <a class="layui-btn layui-btn-primary layui-btn-xs permissions" permissions="doctortemplete-edit"  lay-event="edit">修改</a>
+    <a class="layui-btn layui-btn-xs permissions" permissions="doctortemplete-del"  lay-event="del">删除</a>
+</script>
+<!-- 表格状态列 -->
+<script type="text/html" id="doctor-templete-tpl-state">
+    <input type="checkbox" lay-filter="doctor-templete-tpl-state" value="{{d.id}}" lay-skin="switch" lay-text="正常|锁定"
+           {{d.enabled==true?'checked':''}} class="permissions" permissions="doctortemplete-enable"/>
+</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="templeteTitle" 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">
+                <select name="templeteType" placeholder="话术类型" lay-verify="required" required>
+                    <option value="">-请选择-</option>
+                    <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">
+                <select id="publicType-add" name="publicType" placeholder="开放类型" lay-verify="required" required>
+                    <option value="">-请选择-</option>
+                    <option value="0">公开</option>
+                    <option value="1">私有</option>
+                </select>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">说明:</label>
+            <div class="layui-input-block">
+                <textarea name="templeteNote" placeholder="请输入内容" class="layui-textarea"></textarea>
+              </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" permissions="	
+            doctortemplete-edit" 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;
+
+        // 添加按钮点击事件
+        $('#docto-templete-btn-add').click(function () {
+            showEditModel(undefined, 1);
+        });
+        //// 刷新
+        $('#docto-templete-btn-update').click(function () {
+            table.reload('app-table', { where: {} });
+        });
+
+        // 渲染表格
+        table.render({
+            elem: '#app-table',
+            url: config.base_server + 'api-opration/doctortemplete',
+            method: 'GET',
+            headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+            page: true,
+            cols: [[
+                { field: 'templeteTitle',align:'center', width: 300, title: '标题' },
+                {
+                    field: 'publicType',align:'center', width: 100, title: '开放类型', templet: function (d) {
+                        return d.publicType ==true ? "私有" : "公开"
+                    }
+                },
+                {
+                    field: 'templeteType',align:'center', width: 100, title: '话术类型', templet: function (d) {
+                        if (d.templeteType == 0) {
+                            return "结论";
+                        } else if (d.templeteType == 1) {
+                            return "建议";
+                        } else if (d.templeteType == 2) {
+                            return "方案";
+                        }
+                    }
+                },
+                { field: 'createUserName',align:'center', width: 180, title: '创建者' },
+                { field: 'createTime',align:'center', width: 150, sort: true, title: '创建时间', templet: "<div>{{layui.util.toDateString(d.createTime, 'yyyy/MM/dd HH:mm')}}</div>" },
+                { field: 'enabled',align:'center', width: 100, templet: '#doctor-templete-tpl-state', title: '状态' ,fixed: 'right' },
+                { field: 'recordTitle',align:'center', width: 150, toolbar: '#doctor-templete-table-bar', title: '操作',fixed: 'right' },
+            ]],
+            done:function(res){
+                permissionsInput(res,config);
+            }
+        });
+
+        // 工具条点击事件
+        table.on('tool(app-table)', function (obj) {
+            var data = obj.data;
+            var layEvent = obj.event;
+            if (layEvent === 'edit') { // 查看详情
+                showEditModel(data, 2);
+            }else if(layEvent === 'del'){
+                layer.confirm('确定删除此用户吗?', function (i) {
+                    layer.close(i);
+                    layer.load(2);
+                    admin.req('api-opration/doctortemplete/' + obj.data.id, {}, function (data) {
+                        layer.closeAll('loading');
+                        if (data.code == 0) {
+                            layer.msg(data.msg, { icon: 1, time: 2000 });
+                            table.reload('app-table', {});
+                        } else {
+                            layer.msg(data.msg, { icon: 2, time: 2000 });
+                        }
+                    }, 'delete');
+                });
+            }
+        });
+
+        // 搜索按钮点击事件
+        $('#app-btn-search').click(function () {
+            var templeteType = $('#templeteType').val();
+            var publicType = $('#publicType').val();
+            var templeteTitle = $('#templeteTitle').val();
+            table.reload('app-table', { where: { templeteType: templeteType, publicType: publicType, templeteTitle: templeteTitle } });
+        });
+
+        // 修改user状态
+        form.on('switch(doctor-templete-tpl-state)', function (obj) {
+            layer.load(2);
+            admin.req('api-opration/doctortemplete/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: 2000 });
+                    table.reload('app-table', {});
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                    $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+                }
+            }, 'GET');
+        });
+
+        // 表单提交事件
+        form.on('submit(user-form-submit)', function (data) {
+            layer.load(2);
+            if(data.field.publicType==1){
+                data.field.publicType=true;
+            }else if (data.field.publicType==0){
+                data.field.publicType=false;
+            }
+            admin.req('api-opration/doctortemplete', JSON.stringify(data.field), function (data) {
+                layer.closeAll('loading');
+                if (data.code == 0) {
+                    // layer.msg(data.msg, { icon: 1, time: 2000 });
+                    layer.closeAll();
+                    table.reload('app-table', {});
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                }
+            }, "POST");
+            return false;
+        });
+        // // 显示编辑弹窗
+        var showEditModel = function (data, index) {
+            var title = "";
+            if (index == 1) {
+                title = "新增";
+            } else if (index == 2) {
+                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');
+                    if (data) {
+                        if(index==1){
+                            $('#sure').hide();
+                        }
+                        form.val('app-form', data);
+                        $('#publicType-add').val(data.publicType == true ? 1 : 0);
+                    }
+                }
+            });
+        };
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/doctor_form.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/doctor_form.html
new file mode 100644
index 0000000..e02b7a9
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/doctor_form.html
@@ -0,0 +1,638 @@
+<form id="app-form-add" lay-filter="app-form-add" class="layui-form model-form">
+    <input name="id" type="hidden" />
+    <div style="display:flex">
+        <div class="layui-form-item">
+            <div class="layui-inline">
+                <label class="layui-form-label" style="width: 75px;">所在医院</label>
+                <div class="layui-input-block" style="width: 150px;">
+                    <input name="hospitalName" id="hospitalName" placeholder="请输入医院名称" type="text" class="layui-input"
+                        maxlength="50" lay-verify="required" required style="width: 150px;" />
+                    <input type="hidden" name="hospitalId" id="hospitalId" />
+                    <input type="hidden" name="id" id="id" />
+                </div>
+            </div>
+            <div class="layui-inline">
+                <label class="layui-form-label">科室</label>
+                <div class="layui-input-block" style="width: 150px;">
+                    <input name="departmentName" id="departmentName" placeholder="请选择科室" type="hidden"
+                        class="layui-input" maxlength="20" />
+                    <select id="departmentId" name="departmentId" lay-filter="departmentId" placeholder="请选择科室"
+                        lay-verify="required" required>
+                        <option value="">-请选择科室-</option>
+                    </select>
+                </div>
+            </div>
+            <div class="layui-inline">
+                <label class="layui-form-label">医生类型</label>
+                <div class="layui-input-block" style="width: 150px;">
+                    <select id="doctorType" name="doctorType" lay-filter="doctorType" lay-verify="required" required>
+                        <option value="2" selected>C端医生</option>
+                        <option value="1">H端医生</option>
+                        <option value="0">C端+H端</option>
+                    </select>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div style="display:flex">
+        <div class="layui-form-item">
+            <div class="layui-inline">
+                <label class="layui-form-label">姓名</label>
+                <div class="layui-input-block" style="width: 150px;">
+                    <input name="doctorName" type="text" class="layui-input" maxlength="20" lay-verify="required"
+                        required style="width: 150px;" />
+                </div>
+            </div>
+            <div class="layui-inline">
+                <label class="layui-form-label">职称</label>
+                <div class="layui-input-block" style="width: 150px;">
+                    <select id="doctorRankId" name="doctorRankId" lay-filter="doctorRankId" placeholder="选择一个职称"
+                        lay-verify="required" required>
+                        <option value="">-请选择-</option>
+                    </select>
+                    <input name="doctorRank" id='doctorRank' type="hidden" class="layui-input" maxlength="20" />
+                </div>
+            </div>
+            <div class="layui-inline">
+                <label class="layui-form-label">Email</label>
+                <div class="layui-input-block" style="width: 150px;">
+                    <input name="doctorEmail" type="text" class="layui-input" maxlength="50" lay-verify="v_email"
+                    autocomplete="off"  />
+                </div>
+            </div>
+        </div>
+    </div>
+    <div style="display:flex">
+        <div class="layui-form-item">
+            <div class="layui-inline">
+                <label class="layui-form-label">联系电话</label>
+                <div class="layui-input-block" style="width: 150px;">
+                    <input name="doctorTel" id="doctorTel-add" type="text" class="layui-input" maxlength="20"
+                        lay-verify="required|phone" required style="width: 150px;" />
+                </div>
+            </div>
+            <div class="layui-inline">
+                <label class="layui-form-label">其它联系方式</label>
+                <div class="layui-input-block" style="width: 150px;">
+                    <input name="doctorOtherLink" type="text" class="layui-input" maxlength="20" />
+                </div>
+            </div>
+            <div class="layui-inline" id="roleId_div">
+                <label class="layui-form-label">角色</label>
+                <div class="layui-input-block" style="width: 150px;">
+                    <select name="roleId" xm-select="roleId">
+                    </select>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div style="display:flex">
+        <div class="layui-form-item">
+            <label class="layui-form-label">医生简介</label>
+            <div class="layui-input-block" >
+                <textarea name="doctorAbout" id="doctorAbout" class="layui-textarea" maxlength="300"
+                    style="width: 697px;"></textarea>
+            </div>
+        </div>
+    </div>
+    <div style="display:flex">
+        <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" />
+                <input name="doctorState" id="doctorState-fou" type="radio" value="false" title="试用"
+                    class="layui-input" />
+            </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" />
+                <input name="isTop" id="isTop-fou" type="radio" value="false" title="否" class="layui-input" />
+            </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" />
+                <input name="isAnswer" id="isAnswer-fou" type="radio" value="false" title="否" class="layui-input" />
+            </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" />
+                <input name="isSigning" id="isSigning-fou" type="radio" value="false" title="否" class="layui-input" />
+            </div>
+        </div>
+    </div>
+    <div style="display:flex" class="account">
+        <div class="layui-form-item">
+            <div class="layui-inline">
+                <label class="layui-form-label">登录帐号</label>
+                <div class="layui-input-block" style="width: 150px;">
+                    <input name="username" id="username" readonly type="text" class="layui-input" maxlength="20" />
+                </div>
+            </div>
+            <div class="layui-inline" id="password_div">
+                <label class="layui-form-label">登录密码</label>
+                <div class="layui-input-block" style="width: 150px;">
+                    <input name="password" type="password" id="password" class="layui-input" maxlength="20" />
+                </div>
+            </div>
+            <div class="layui-inline" id="passwordSure_div">
+                <label class="layui-form-label">确认密码</label>
+                <div class="layui-input-block" style="width: 150px;">
+                    <input name="passwordSure" type="password" id="passwordSure" class="layui-input" maxlength="20" />
+                </div>
+            </div>
+
+            <!-- </div>
+        <div class="layui-form-item">
+            
+        </div>
+        <div class="layui-form-item"> -->
+
+        </div>
+    </div>
+    <div style="display:flex">
+        <div class="layui-form-item">
+            <div class="layui-inline">
+                <label class="layui-form-label">医生的头像</label>
+                <div class="layui-input-block" id="demo" style="width: 150px;">
+                    <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-inline">
+                <label class="layui-form-label">销售代表</label>
+                <div class="layui-input-block" style="width: 150px;">
+                    <input name="serverUserName" id="serverUserName-add" type="hidden" class="layui-input"
+                        maxlength="15" />
+                    <select id="serverUserId-add" name="serverUserId" lay-filter="serverUserId-add"
+                        lay-verify="required" required>
+                        <option value="">-请选择-</option>
+                    </select>
+                </div>
+            </div>
+            <!--             
+        </div>
+
+        <div class="layui-form-item"> -->
+
+        </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 permissions" permissions="sysdoctor-edit" id="sure" lay-filter="user-form-submit"
+            lay-submit>保存</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['form', 'laydate', 'util', 'config', 'admin', 'autocomplete', 'formSelects'], function () {
+        var form = layui.form;
+        var config = layui.config;
+        var layer = layui.layer;
+        var util = layui.util;
+        var admin = layui.admin;
+        var upload = layui.upload;
+        var autocomplete = layui.autocomplete;
+        var formSelects = layui.formSelects;
+        var $ = layui.jquery;
+
+        //验证邮箱
+        admin.v_email = function(value, item){
+            var exp = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
+            if(value && !exp.test(value) ){
+                return '邮箱格式不正确';
+            }
+        }
+        form.verify({
+            v_email:admin.v_email,
+        })
+        //医生管理员
+        var guanliyuan_role = undefined;
+        //获取角色
+        var get_role = function (flag) {
+            admin.req('api-user/findByMap?tenant_id=hospital', {}, function (data) {
+                layer.closeAll('loading');
+                if (0 == data.code) {
+                    // 渲染多选下拉框
+                    var roleSelectData = new Array();
+                    for (var i = 0; i < data.data.length; i++) {
+                        roleSelectData.push({
+                            name: data.data[i].name,
+                            value: data.data[i].id
+                        });
+                    }
+                    guanliyuan_role = data.data[0].id;
+                    formSelects.data('roleId', 'local', {
+                        arr: roleSelectData
+                    });
+                    // 回显user数据
+                    if (doctor != null && doctor.roles) {
+                        formSelects.value('roleId', doctor.roles);
+                    }
+
+                } else {
+                    layer.msg('获取角色失败', {
+                        icon: 2,
+                        time: 2000
+                    });
+                }
+            }, 'GET');
+        }
+        /*
+        * 验证手机号码
+        */
+        function validatorTel(content) {
+
+            // 正则验证格式
+            eval("var reg = /^1[34578]\\d{9}$/;");
+            var flag = RegExp(reg).test(content)
+            return flag;
+        }
+        //判断用户名是否被使用
+        var username_is_usered = function (username_id) {
+            var username = $("#" + username_id).val()
+            admin.req('api-user/users/findCountByMap', JSON.stringify({
+                username: username
+            }), function (data) {
+                if (data.code == 0) {
+                    if (data.data > 0) {
+                        $("#" + username_id).val("")
+                        layer.msg("该手机号已经使用", {
+                            icon: 2,
+                            time: 2000
+                        })
+                    }
+                } else {
+                    layer.msg(data.msg, {
+                        icon: 2,
+                        time: 2000
+                    });
+                }
+            }, 'post');
+        }
+
+
+        // 表单提交事件
+        form.on('submit(user-form-submit)', function (data) {
+            debugger
+            data.field.hospitalId = $("#hospitalId").val();
+            if (data.field.roleId != null && data.field.roleId != "") {
+                data.field.roles = data.field.roleId.split(',');
+            }
+            if ($("#doctorType").val() == 2) {
+                //将关于密码的的去掉
+                data.field.username = "";
+                data.field.password = "";
+                data.field.passwordSure = "";
+            } else {
+                if (data.field.roles == null || data.field.roles.length == 0) {
+                    layer.msg("请选择角色");
+                    return false;
+                }
+                if (data.field.roles.includes(guanliyuan_role)) {
+                    data.field.isAdminUser = true;
+                } else {
+                    data.field.isAdminUser = false;
+                }
+                var doctor = admin.getTempData('t_doctor');
+                //判断只有输入密码的时候进行密码判断
+                if (doctor != null) {
+                    if (doctor.doctorType == 2 && doctorType != 2) {
+                        if (data.field.username == null || data.field.username.trim() == "") {
+                            layer.msg("请输入手机号");
+                            return false;
+                        }
+                        if (data.field.password == null || data.field.password.trim() == "") {
+                            layer.msg("请输入登录密码");
+                            return false;
+                        }
+                        if (data.field.passwordSure == null || data.field.passwordSure.trim() == "") {
+                            layer.msg("请输入确认密码");
+                            return false;
+                        } else {
+                            if (data.field.password != data.field.passwordSure) {
+                                layer.msg("两次密码不一致,请重新输入");
+                                return false;
+                            }
+                        }
+                    }
+                } else {
+                    if (data.field.username == null || data.field.username.trim() == "") {
+                        layer.msg("请输入手机号");
+                        return false;
+                    }
+                    if (data.field.password == null || data.field.password.trim() == "") {
+                        layer.msg("请输入登录密码");
+                        return false;
+                    }
+                    if (data.field.passwordSure == null || data.field.passwordSure.trim() == "") {
+                        layer.msg("请输入确认密码");
+                        return false;
+                    } else {
+                        if (data.field.password != data.field.passwordSure) {
+                            layer.msg("两次密码不一致,请重新输入");
+                            return false;
+                        }
+                    }
+                }
+                data.field.roles.forEach(element => {
+                element = "" + element
+            });
+            }
+            data.field.roleId = null;
+            
+            layer.load(2);
+            admin.req('api-user/sysdoctor', JSON.stringify(data.field), function (data) {
+                layer.closeAll('loading');
+                if (data.code == 0) {
+                    layer.closeAll();
+                    parent.layui.table.reload('app-table', {});
+                } else {
+                    layer.msg(data.msg, {
+                        icon: 2,
+                        time: 3000
+                    });
+                }
+            }, "POST");
+            return false;
+        });
+
+        //将新增  中的 serverUserName 赋值
+        form.on('select(serverUserId-add)', function (data) {
+            //将医院名称赋值
+            $('#serverUserName-add').val($(this)[0].innerHTML);
+        });
+        //新增   点击职称的触发事件
+        form.on('select(doctorRankId)', function (data) {
+            //将部门名称赋值
+            $('#doctorRank').val($(this)[0].innerHTML);
+        });
+        //新增 和  更新   科室触发的事件
+        form.on('select(departmentId)', function () {
+            //将部门名称赋值
+            $('#departmentName').val($(this)[0].innerHTML);
+        });
+        //获取科室
+        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: 2000
+                    });
+                }
+            }, 'get');
+        }
+        //职称添加数据
+        var getZhiCheng = function () {
+            admin.req('api-user/sysdictionaries/findAll', JSON.stringify({
+                dictionariesClassId: "DOCTOR_RANK"
+            }), 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: 2000
+                    });
+                }
+            }, 'Post');
+        }
+        //获取销售代表
+        var getXiaoShouDaiBiao = function (selectVal) {
+            admin.req('api-user/users/getAppointUser', { type: 0 }, function (data) {
+                layer.closeAll('loading');
+                if (0 === data.code) {
+                    user = data.data;
+                    $.each(data.data, function (index, item) {
+                        //往下拉菜单里添加元素
+                        $('#serverUserId-add').append(new Option(item.nickname, item.id,
+                            false, (!strUtil.isEmpty(selectVal) && selectVal == item.id)));
+                    })
+                } else {
+                    layer.msg(data.msg, {
+                        icon: 2,
+                        time: 2000
+                    });
+                }
+            }, 'get');
+        }
+        // 显示新增弹窗
+        var loadEditData = function () {
+            $('#app-form-add')[0].reset();
+            $('#app-form-add').attr('method', 'POST');
+            $('.layui-layer-content').css('overflow', 'auto');
+            //将医院的数据保存到下拉表
+            let selected = false;
+            var selectVal="";
+            //先拿到当前登录用户的信息
+            var nowUser = config.getUser();
+            if (!strUtil.isEmpty(nowUser)) {
+                selectVal = nowUser.id;
+            }
+            //获取职称的
+            getZhiCheng();
+            //获取销售代表
+            getXiaoShouDaiBiao(selectVal);
+            //获取角色
+            get_role();
+            var upload = layui.upload;
+            $("#roleId_div").hide()
+            //执行实例
+            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');
+                }
+            });
+            //将密码隐藏
+            $(".account").hide();
+            //将密码置空 
+            $("#password").val("");
+            form.render();
+            //医生类型的选择事件
+            // form.on('select(doctorType)', function (data) {
+            //     // console.log("eeeeeeeeeeeeeeeee");
+            //     // var doctor = admin.getTempData('t_doctor');
+            //     // debugger
+            //     // console.log("doctordoctordoctordoctordoctor",doctor);
+            //     var doctorType = $('#doctorType').val();
+            //     //将密码项取消
+            //     if (doctorType == 2) {
+            //         $(".account").hide();
+            //     } else {
+            //         $(".account").show();
+            //     }
+            // })
+        };
+        $("#username").blur(function () {
+            if (!validatorTel(doctorTel_add)) {
+                layer.msg("请输入正确的手机号");
+            } else {
+                username_is_usered("username");
+            }
+        })
+        $("#doctorTel-add").blur(function () {
+            $("#username").val($("#doctorTel-add").val())
+            var doctorTel_add = $("#doctorTel-add").val();
+            if (!validatorTel(doctorTel_add)) {
+                layer.msg("请输入正确的手机号");
+            } else {
+                username_is_usered("username");
+            }
+        })
+        //自动完成-医院名称
+        autocomplete.render({
+            elem: $('#hospitalName')[0],
+            keywordsName: 'hospitalName', //查询关键字名称
+            url: config.base_server + 'api-user/syshospital/findByName',
+            template_val: '{{d.hospitalName}}', //选择后文本框显示的数据字段
+            template_txt: "<div class='layui-table-cell'>{{d.hospitalName}}</div>", //下拉列表模板
+            onselect: function (resp) {
+
+                $("#hospitalId").val(resp.id);
+                //重新装载科室
+                getdepartment(resp.id);
+            }
+        });
+        //医生类型的选择事件
+        form.on('select(doctorType)', function (data) {
+            var doctor = admin.getTempData('t_doctor');
+            var doctorType = $('#doctorType').val();
+            if (doctor == null) {
+                if (doctorType != 2) {
+                    $(".account").show();
+                    $("#password_div").show();
+                    $("#passwordSure_div").show();
+                    $("#roleId_div").show()
+                } else {
+                    $(".account").hide();
+                    $("#roleId_div").hide()
+                }
+            } else {
+                if (doctor.doctorType == 2 && doctorType == 2) {
+                    $(".account").hide();
+                    $("#roleId_div").hide()
+                } else if (doctor.doctorType == 2 && doctorType != 2) {
+                    $(".account").show();
+                    $("#password_div").show();
+                    $("#passwordSure_div").show();
+                    $("#roleId_div").show()
+                    if (doctor.username == null) {
+                        $("#username").val(doctor.doctorTel);
+                        form.render();
+                    }
+                } else if (doctor.doctorType != 2 && doctorType != 2) {
+                    $(".account").show();
+                    $("#password_div").hide();
+                    $("#passwordSure_div").hide();
+                    $("#roleId_div").show()
+                } else if (doctor.doctorType != 2 && doctorType == 2) {
+                    $(".account").hide();
+                    $("#roleId_div").hide()
+                }
+            }
+        })
+        //数据的回显
+        var doctor = admin.getTempData('t_doctor');
+        $('#app-form-add').attr('method', 'POST');
+        if (doctor) {
+            //重新装载科室
+            getdepartment(doctor.hospitalId);
+            //获取职称的
+            getZhiCheng();
+            //获取销售代表
+            getXiaoShouDaiBiao();
+            //获取角色
+            get_role(doctor.isAdminUser);
+            form.val('app-form-add', doctor);
+            $("#hospitalId").val(doctor.hospitalId);
+            $("#password_div").hide();
+            $("#passwordSure_div").hide();
+            $("#doctorTel-add").prop("disabled",true)
+
+            //将密码项取消
+            if (doctor.doctorType == 2) {
+                $(".account").hide();
+                $("#roleId_div").hide()
+            } else {
+                $(".account").show();
+                $("#roleId_div").show()
+            }
+            $('#demo2').append('<img src="' + doctor.doctorLogo +
+                '" width="50px" height="50px" alt="' + "name" +
+                '" class="layui-upload-img">')
+            $("#password").removeAttr("lay-verify")
+            $("#password").removeAttr("required")
+            $("#passwordSure").removeAttr("lay-verify")
+            
+            
+            form.render();
+        } else {
+            loadEditData();
+        }
+    });
+</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..7d65120
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/feedback.html
@@ -0,0 +1,156 @@
+<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="开始时间" autocomplete="off"
+                class="layui-input search-input">
+            至
+            <input type="text" name="date" id="dateend" lay-verify="date" placeholder="结束时间" autocomplete="off"
+                class="layui-input search-input"> &emsp;
+            <button id="user-btn-search" class="layui-btn icon-btn permissioins" permissioins="feedback-list"><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 permissioins" permissioins="feedback-del" 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',  title: '状态' },
+                { field: 'createTime', width: 200, title: '创建时间',templet:function(d){
+                    return new Date(d.createTime).dateFormat("yyyy-MM-dd hh:mm");
+                } },
+                { align: 'center', width: 150, toolbar: '#feeedback-table-bar', title: '操作',fixed: 'right' }
+            ]],done:function(res){
+                permissionsInput(res,config);
+            }
+        });
+
+        // 修改状态
+        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: 2000 });
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                    $(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: 2000 }, 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: 2000 });
+                        }
+                    },
+                    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/groupProduct.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/groupProduct.html
new file mode 100644
index 0000000..414aa09
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/groupProduct.html
@@ -0,0 +1,65 @@
+<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 type="text" name="date" id="datebegin" lay-verify="date"  autocomplete="off"
+                class="layui-input search-input">
+            至
+            <input type="text" name="date" id="dateend" lay-verify="date"  autocomplete="off"
+                class="layui-input search-input"> &emsp;
+            <button id="product-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
+        </div>
+        <table class="layui-table" id="product-table" lay-filter="product-table"></table>
+    </div>
+</div>
+
+<script>
+    layui.use(['table', 'config','laydate'], function () {
+        let table = layui.table;
+        let laydate = layui.laydate;
+        let config = layui.config;
+        //日期
+        laydate.render({
+            elem: '#datebegin'
+        });
+        laydate.render({
+            elem: '#dateend'
+        });
+        // 渲染表格
+        var renderTable = function () {
+            table.render({
+                elem: '#product-table',
+                url: config.base_server + 'api-opration/productorderrecord/group',
+                method: 'GET',
+                headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+                page: true,
+                cols: [[
+                    { field: 'proName', width: 500, sort: true,title: '产品名称' },
+                    { field: 'proCount', width: 300, sort: true,title: '消费数量' }
+                ]]
+            });
+        }
+        renderTable();
+
+        // 搜索按钮点击事件
+        $('#product-btn-search').click(function () {
+            var createTime = $('#datebegin').val();
+            var updateTime = $('#dateend').val();
+            if (strUtil.isEmpty(datebegin) && !strUtil.isEmpty(updateTime)) {
+                createTime = dateUtil.getNowDate();
+                $('#datebegin').val(createTime);
+            }
+            if (!strUtil.isEmpty(createTime) && strUtil.isEmpty(updateTime)) {
+                updateTime = dateUtil.getNowDate();
+                $('#dateend').val(updateTime);
+            }
+            table.reload('product-table', { where: { createTime: createTime,updateTime: updateTime } });
+        });
+    });
+</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..80b9a41
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/hospital.html
@@ -0,0 +1,383 @@
+<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">
+            <select id="province" placeholder="省份" lay-filter="province">
+            </select>
+            <select id="city" placeholder="市" lay-filter="city">
+                <option value="">选择市</option>
+            </select>
+            <select id="areas" placeholder="区县" lay-filter="areas">
+                <option value="">选择区县</option>
+            </select>
+            <select id="isscreen" placeholder="选择筛查状态" lay-filter="isscreen">
+                <option value="">-是否筛查-</option>
+                <option value="1">-是-</option>
+                <option value="0">-否-</option>
+            </select>
+            &emsp;
+            <!-- <select id="isanswer" placeholder="选择医答状态" lay-filter="isanswer">
+                <option value="">-是否医答-</option>
+                <option value="1">-是-</option>
+                <option value="0">-否-</option>
+            </select>
+             &emsp;
+            <select id="hospitalstate" placeholder="选择医院状态" lay-filter="hospitalstate">
+                <option value="">-医院状态-</option>
+                <option value="0">试用</option>
+                <option value="1">正式</option>
+            </select> -->
+            &emsp;
+            <input id="hosName" class="layui-input search-input" type="text" placeholder="按医院名" />&emsp;
+            <button id="hospita-btn-search" class="layui-btn icon-btn"><i class="layui-icon permissions"
+                    permissions="hospital-get">&#xe615;</i>搜索</button>&emsp;
+            <button id="hospital-btn-add" class="layui-btn icon-btn"><i class="layui-icon permissions"
+                    permissions="hospital-save">&#xe654;</i>添加医院/科室</button>
+        </div>
+
+        <!-- 数据表格 -->
+        <table class="layui-table" id="hospital-table" lay-filter="hospital-table"></table>
+    </div>
+</div>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="businessRecords-table-bar">
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="productdetail-List">套餐</a>
+    <a class="layui-btn layui-btn-xs permissions" permissions="product-rechage" lay-event="pay">充值</a>
+    <a class="layui-btn layui-btn-primary layui-btn-xs permissions" permissions="hospital-save" lay-event="edit">修改</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs permissions" permissions="hospital-del" lay-event="del">删除科室</a>
+</script>
+<!-- 表格状态列 -->
+<script type="text/html" id="hospital-tpl-state">
+    <input type="checkbox" lay-filter="hospital-tpl-state" value="{{d.hospitalId}}" value2="{{d.departmentId}}"
+        lay-skin="switch" lay-text="启用|禁用" {{d.enabled==true?'checked':''}} />
+</script>
+<!-- 套餐详情 -->
+<script type="text/html" id="productDetail">
+    <table class="layui-table" id="productDetail-table" lay-filter="productDetail-table"></table>
+</script>
+<script>
+    layui.use(['form', 'table', 'laydate', 'util', 'config', 'admin', 'autocomplete', 'area'], 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 area = layui.area;
+
+        // 渲染表格
+        table.render({
+            elem: '#hospital-table',
+            url: config.base_server + 'api-user/syshospital',
+            method: 'GET',
+            headers: {
+                'Authorization': 'Bearer ' + config.getToken().access_token
+            },
+            page: true,
+            cols: [
+                [{
+                        field: 'hospitalId',
+                        width: 180,
+                        title: '医院编号',
+                        fixed: 'left'
+                    },
+                    {
+                        field: 'hospitalName',
+                        width: 250,
+                        title: '医院名称',
+                        fixed: 'left'
+                    },
+                    {
+                        field: 'departmentName',
+                        width: 100,
+                        title: '科室/部门',
+                        fixed: 'left'
+                    },
+                    {
+                        field: 'hospitalArea',
+                        width: 200,
+                        title: '所在地区',
+                        templet: function (d) {
+                            return ((d.hospitalProvince == null) ? "" : d.hospitalProvince) +
+                                " " +
+                                ((d.hospitalCity == null) ? "" : d.hospitalCity) + " " +
+                                ((d.hospitalArea == null) ? "" : d.hospitalArea)
+                        }
+                    },
+                    {
+                        field: 'hospitalLink',
+                        width: 100,
+                        title: '联系人'
+                    },
+                    {
+                        field: 'hospitalTel',
+                        width: 150,
+                        title: '联系方式'
+                    },
+                    // {
+                    //     field: 'enabled', width: 80,  title: '状态', templet: function (d) {
+                    //         return d.hospitalState == 0 ? "试用" : "正式"
+                    //     }
+                    // },
+                    {
+                        field: 'isScreen',
+                        width: 80,
+                        title: '筛查',
+                        templet: function (d) {
+                            return d.isScreen ? "是" : "否"
+                        }
+                    },
+                    // { field: 'isAnswer', width: 80,  title: '医答',templet:function (d) {
+                    //     return d.isScreen?"是":"否"
+                    // } },
+
+                    {
+                        field: 'serverUserName',
+                        width: 100,
+                        title: '服务人员'
+                    },
+                    {
+                        field: 'createTime',
+                        width: 150,
+                        title: '创建时间',
+                        templet: function (d) {
+                            return new Date(d.createTime).dateFormat("yyyy-MM-dd hh:mm");
+                        }
+                    },
+                    {
+                        field: 'enabled',
+                        width: 80,
+                        templet: '#hospital-tpl-state',
+                        title: '状态',
+                        align: 'center',
+                        fixed: 'right'
+                    },
+                    {
+                        field: 'hospitalId',
+                        width: 225,
+                        align: 'center',
+                        toolbar: '#businessRecords-table-bar',
+                        title: '操作',
+                        fixed: 'right'
+                    }
+                ]
+            ],
+            done: function (res) {
+                permissionsInput(res, config);
+            }
+        });
+        //省份数据加载
+        area.areaData("#province", 1, "", "");
+        // 工具条点击事件
+        table.on('tool(hospital-table)', function (obj) {
+            var data = obj.data;
+            var layEvent = obj.event;
+            if (layEvent === 'del') {
+                layer.confirm('确定要删除科室数据吗?', function (i) {
+                    layer.load(2);
+                    var whereModel = {
+                        id: obj.data.hospitalId,
+                        departmentId: obj.data.departmentId
+                    };
+                    admin.req('api-user/syshospital/delete', whereModel, function (data) {
+                        layer.closeAll('loading');
+                        layer.msg(data.msg, {
+                            icon: 1,
+                            time: 2000
+                        }, function () {
+                            $('#hospita-btn-search').click();
+                        });
+                        obj.del();
+                    }, 'GET');
+                });
+            } else if (layEvent === "edit") {
+                //修改
+                admin.putTempData("t_hospital", data);
+                showEditModel("edit");
+            } else if (layEvent === "pay") {
+                //充值
+                admin.putTempData("t_hospital", data);
+                admin.popupCenter({
+                    title: '医院科室充值',
+                    path: 'pages/opration/recharge.html',
+                    area: '1200px',
+                    offset: '0px',
+                    finish: function () {
+                        $('#hospita-btn-search').click();
+                    }
+                });
+            }
+            else if(layEvent==="productdetail-List")
+            {
+                productdetailShow(obj);
+            }
+        });
+        // 搜索按钮点击事件
+        $('#hospita-btn-search').click(function () {
+            var isscreen = $('#isscreen').val();
+            var isanswer = $('#isanswer').val();
+            var hospitalstate = $('#hospitalstate').val();
+            var hospitalName = $('#hosName').val();
+
+            var hospitalProvince = ($("#province").val() != "") ? $('#province option:selected')
+            .text() : "";
+            var hospitalCity = ($("#city").val() != "") ? $('#city option:selected').text() : "";
+            var hospitalArea = ($("#areas").val() != "") ? $('#areas option:selected').text() : "";
+
+            var whereModel = {
+                isScreen: isscreen,
+                isAnswer: isanswer,
+                hospitalState: hospitalstate,
+                hospitalName: hospitalName,
+                hospitalProvince: hospitalProvince,
+                hospitalCity: hospitalCity,
+                hospitalArea: hospitalArea
+            };
+            table.reload('hospital-table', {
+                where: whereModel
+            });
+        });
+
+        // // 显示编辑弹窗
+        var showEditModel = function (data) {
+            admin.popupCenter({
+                title: (strUtil.isEmpty(data)) ? '添加医院/科室' : '编辑医院/科室',
+                path: 'pages/opration/hospital_form_base.html',
+                area: '900px',
+                    offset: '0px',
+                finish: function () {
+                    $('#hospita-btn-search').click();
+                }
+            });
+        };
+
+        //装载市区数据
+        form.on("select(province)", function (data) {
+            area.areasClear("#areas", 3);
+            area.areaData("#city", 2, data.value, "");
+        });
+
+        //装载区县数据
+        form.on("select(city)", function (data) {
+            area.areaData("#areas", 3, data.value, "");
+        });
+        // 修改状态
+        form.on('switch(hospital-tpl-state)', function (obj) {
+            layer.load(2);
+            admin.req('api-user/syshospital/updateEnabled', {
+                id: obj.elem.value,
+                departmentId: obj.elem.getAttribute("value2"),
+                enabled: obj.elem.checked ? true : false
+            }, function (data) {
+                layer.closeAll('loading');
+                if (data.code == 0) {
+                    layer.msg(data.msg, {
+                        icon: 1,
+                        time: 2000
+                    });
+                } else {
+                    layer.msg(data.msg, {
+                        icon: 2,
+                        time: 2000
+                    });
+                    $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+                }
+            }, 'GET');
+        });
+        // 添加按钮点击事件
+        $('#hospital-btn-add').click(function () {
+            admin.putTempData("t_hospital", "");
+            showEditModel();
+        });
+        // 套餐按钮点击事件
+        var productdetailShow=function (obj) {
+            var data = obj.data;
+            layer.open({
+                type: 1,
+                title: data.hospitalName + '-' + data.departmentName + ' 所有套餐',
+                area: '1200px',
+                offset: '100px',
+                content: $('#productDetail').html(),
+                success: function () {
+                    table.render({
+                        elem: '#productDetail-table',
+                        url: config.base_server +
+                            'api-opration/productorderdetail/alldetail',
+                        method: 'GET',
+                        where: {
+                            'hospitalId': data.hospitalId,
+                            'departmentId': data.departmentId
+                        },
+                        headers: {
+                            'Authorization': 'Bearer ' + config.getToken().access_token
+                        },
+                        page: true,
+                        limit: 10,
+                        limits: [5, 10],
+                        cols: [
+                            [{
+                                    field: 'proName',
+                                    width: 300,
+                                    title: '产品名称'
+                                },
+                                {
+                                    field: 'ailightCount',
+                                    width: 150,
+                                    title: '读片量(剩余)'
+                                },
+                                {
+                                    field: 'recordCount',
+                                    width: 150,
+                                    title: '报告量(剩余)'
+                                },
+                                {
+                                    field: 'isShare',
+                                    width: 100,
+                                    title: '是否共享',
+                                    templet: function (d) {
+                                        if (d.isShare)
+                                            return '共享'
+                                        else
+                                            return '私有'
+                                    }
+                                },
+                                {
+                                    field: 'proBegintime',
+                                    width: 150,
+                                    title: '开始时间',
+                                    templet: function (d) {
+                                        return new Date(d.proBegintime)
+                                            .dateFormat("yyyy/MM/dd");
+                                    }
+                                },
+                                {
+                                    field: 'proEndtime',
+                                    width: 180,
+                                    title: '结束时间',
+                                    templet: function (d) {
+                                        return new Date(d.proEndtime)
+                                            .dateFormat("yyyy/MM/dd");
+                                    }
+                                },
+                                {
+                                    field: 'createTime',
+                                    width: 160,
+                                    sort: true,
+                                    title: '创建时间'
+                                }
+                            ]
+                        ]
+                    });
+                }
+            });
+        };
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/hospital_form_base.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/hospital_form_base.html
new file mode 100644
index 0000000..7bc7364
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/hospital_form_base.html
@@ -0,0 +1,545 @@
+<form id="hospital-form" lay-filter="hospital-form" class="layui-form model-form" method="POST">
+    <div class="layui-form-item">
+        <div class="layui-row">
+            <div class="layui-col-sm7">
+                <label class="layui-form-label">医院名称</label>
+                <div class="layui-input-block">
+                    <input name="hospitalName" id="hospitalName" placeholder="请输入医院名称" type="text" class="layui-input"
+                        maxlength="50" lay-verify="required" required style="width: 390px;" />
+                </div>
+            </div>
+            <div class="layui-col-sm3">
+                <label class="layui-form-label">医院简称</label>
+                <div class="layui-input-block">
+                    <input name="hospitalShortName" type="text" class="layui-input" maxlength="20"
+                        style="width: 200px;" />
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <div class="layui-row">
+            <div class="layui-col-sm4">
+                <label class="layui-form-label">科室名称</label>
+                <div class="layui-input-block">
+                    <input name="departmentName" id="departmentName" placeholder="科室名称" type="text" class="layui-input"
+                        maxlength="20" lay-verify="required" required style="width: 175px;" />
+                    &emsp;</div>
+            </div>
+            <div class="layui-col-sm3">
+                <label class="layui-form-label">联系电话</label>
+                <div class="layui-input-block">
+                    <input name="hospitalTel" id="hospitalTel" type="text" class="layui-input" maxlength="20" />
+                </div>
+            </div>
+            <div class="layui-col-sm3">
+                <label class="layui-form-label">联系人</label>
+                <div class="layui-input-block">
+                    <input name="hospitalLink" type="text" class="layui-input" maxlength="20" style="width: 200px;" />
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <div class="layui-row">
+            <div class="layui-col-sm4">
+                <label class="layui-form-label">医院类型</label>
+                <div class="layui-input-block">
+                    <input name="hospitalTypeId" id="hospitalTypeId" type="hidden" value="" />
+                    <select name="hospitalTypeName" id="hospitalTypeName" lay-filter="hospitalTypeName"
+                        style="width: 50px;">
+                        <option value="">请选择</option>
+                    </select>
+                </div>
+            </div>
+            <div class="layui-col-sm3">
+                <label class="layui-form-label">医院资质</label>
+                <div class="layui-input-block">
+                    <input name="hospitalQualifiedId" id="hospitalQualifiedId" type="hidden" value="" />
+                    <select name="hospitalQualifiedName" id="hospitalQualifiedName" lay-filter="hospitalQualifiedName"
+                        style="width: 300px;">
+                        <option value="">请选择</option>
+                    </select>
+                </div>
+            </div>
+            <div class="layui-col-sm3">
+                <label class="layui-form-label">帐号数量</label>
+                <div class="layui-input-block">
+                    <input id="accountsCount" name="accountsCount" type="text" value="6" class="layui-input"
+                        maxlength="1" lay-verify="required|integer" style="width: 200px;" />
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <div class="layui-row">
+            <label class="layui-form-label">所在地区</label>
+            <div class="layui-input-block">
+                <div class="layui-col-sm4">
+                    <select lay-verify="required" required id="hospitalProvince" placeholder="省份"
+                        lay-filter="hospitalProvince" style="width: 400px;">
+                    </select></div>
+                <div class="layui-col-sm4">
+                    <select id="hospitalCity" lay-verify="required" required placeholder="市" lay-filter="hospitalCity"
+                        style="width: 350px;">
+                        <option value="">选择市</option>
+                    </select></div>
+                <div class="layui-col-sm4">
+                    <select id="hospitalArea" lay-verify="required" required placeholder="区县" lay-filter="hospitalArea"
+                        style="width: 350px;">
+                        <option value="">选择区县</option>
+                    </select>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">地址</label>
+        <div class="layui-input-block">
+            <input name="hospitalAdress" type="text" class="layui-input" maxlength="100" />
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <div class="layui-row">
+            <div class="layui-col-sm4">
+                <label class="layui-form-label">区号</label>
+                <div class="layui-input-block">
+                    <input name="areaCode" id="areaCode" lay-verify="required" required type="text" class="layui-input"
+                        maxlength="10" />
+                </div>
+            </div>
+            <div class="layui-col-sm4">
+                <label class="layui-form-label">经度</label>
+                <div class="layui-input-block">
+                    <input name="longitude" id="longitude" type="text" class="layui-input" maxlength="20" />
+                </div>
+            </div>
+            <div class="layui-col-sm4">
+                <label class="layui-form-label">纬度</label>
+                <div class="layui-input-block">
+                    <input name="latitude" id="latitude" type="text" class="layui-input" maxlength="20" />
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <div class="layui-row">
+            <div class="layui-col-sm4">
+                <label class="layui-form-label">服务人员</label>
+                <div class="layui-input-block">
+                    <input name="serverUserId" id="serverUserId" type="hidden" value="" maxlength="20" />
+                    <select lay-verify="required" required name="serverUserName" id="serverUserName"
+                        style="width: 150px;" lay-filter="serverUserName">
+                    </select>
+                </div>
+            </div>
+            <div class="layui-col-sm6">
+                <label class="layui-form-label">服务人电话</label>
+                <div class="layui-input-block">
+                    <input name="serverUserTel" id="serverUserTel" type="text" class="layui-input" maxlength="20"
+                        value="" />
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <div class="layui-col-sm4">
+            <label class="layui-form-label">销售人员</label>
+            <div class="layui-input-block">
+                <input name="saleUserId" id="saleUserId" type="hidden" value="" maxlength="20" />
+                <select lay-verify="required" required name="saleUserName" id="saleUserName" style="width: 150px;"
+                    lay-filter="saleUserName">
+                </select>
+            </div>
+        </div>
+
+        <div class="layui-col-sm6">
+            <label class="layui-form-label">销售人电话</label>
+            <div class="layui-input-block">
+                <input name="saleUserTel" id="saleUserTel" type="text" class="layui-input" maxlength="20" value="" />
+            </div>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">医院简介</label>
+        <div class="layui-input-block">
+            <textarea name="hospitalAbout" class="layui-textarea" maxlength="300"></textarea>
+        </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="hospital-form-submit" lay-submit>保存</button>
+    </div>
+    <input type="hidden" name="departmentId" id="departmentId" value="" />
+    <input type="hidden" name="orgId" id="orgId" value="" />
+    <input type="hidden" name="departmentOrgId" id="departmentOrgId" value="" />
+    <input type="hidden" name="id" id="id" value="" />
+</form>
+
+<script>
+    layui.use(['form', 'table', 'util', 'config', 'admin', 'area', 'dic', 'autocomplete'], 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 area = layui.area;
+        var dic = layui.dic;
+        var autocomplete = layui.autocomplete;
+        var $ = layui.jquery;
+        //加载服务人员信息
+        var loadServerUser = function (selectVal) {
+            admin.req('api-user/users/getAppointUser', {
+                type: 1
+            }, function (data) {
+                layer.closeAll('loading');
+                if (0 === data.code) {
+                    if (data.data.length > 0) {
+                        $.each(data.data, function (index, item) {
+                            if (!strUtil.isEmpty(selectVal) && selectVal == item.id) {
+                                $('#serverUserName').append(new Option(item.nickname, item
+                                    .id, false, true));
+                            } else {
+                                //往下拉菜单里添加元素
+                                $('#serverUserName').append(new Option(item.nickname, item
+                                    .id, false, false));
+                            }
+                        })
+                    }
+
+                    if (hosIdForEdit == "") {
+                        $("#serverUserTel").val(data.data[0].mobile);
+                        $('#serverUserName').val(data.data[0].id);
+                        form.render();
+                    }
+                } else {
+                    layer.msg(data.msg, {
+                        icon: 2,
+                        time: 2000
+                    });
+                }
+
+            }, 'get');
+        }
+
+        //加载销售人员信息
+        var loadSaleUser = function (selectVal) {
+            admin.req('api-user/users/getAppointUser', {
+                type: 0
+            }, function (data) {
+                layer.closeAll('loading');
+                if (0 === data.code) {
+                    if (data.data.length > 0) {
+                        $.each(data.data, function (index, item) {
+                            //往下拉菜单里添加元素
+                                $('#saleUserName').append(new Option(item.nickname, item.id,
+                                    false, (!strUtil.isEmpty(selectVal) && selectVal == item.id)));
+                        });
+
+                        if (hosIdForEdit == "") {
+                            $("#saleUserTel").val(data.data[0].mobile);
+                            $('#saleUserName').val(data.data[0].id);
+                            form.render();
+                        }
+                    }
+                } else {
+                    layer.msg(data.msg, {
+                        icon: 2,
+                        time: 2000
+                    });
+                }
+            }, 'get');
+        }
+        //医院资质数据
+        dic.dicData("#hospitalQualifiedName", "HOSPITAL_QUALIFIED", "");
+        //医院类型数据
+        dic.dicData("#hospitalTypeName", "HOSPITAL_TYPE", "");
+        //省份数据加载
+        area.areaData("#hospitalProvince", 1, "", "");
+        //回显组织数据
+        let edithospitalData = admin.getTempData('t_hospital');
+        var hosIdForEdit = "";
+        var departmentId = "";
+        //当前登录人员的id
+        var selectVal="";
+        if (edithospitalData != null) {
+            hosIdForEdit = edithospitalData.hospitalId;
+            departmentId = edithospitalData.departmentId;
+        }
+        else{
+            //先拿到当前登录用户的信息
+            var nowUser = config.getUser();
+            if (!strUtil.isEmpty(nowUser)) {
+                selectVal = nowUser.id;
+            }
+        }
+        //装载销售人员 服务人员数据
+        loadServerUser(selectVal);
+        loadSaleUser(selectVal);
+
+        //装载市区数据
+        form.on("select(hospitalProvince)", function (data) {
+            area.areasClear("#hospitalArea", 3);
+            area.areaData("#hospitalCity", 2, data.value, "");
+            defaultValData();
+        });
+        //装载区县数据
+        form.on("select(hospitalCity)", function (data) {
+            area.areaData("#hospitalArea", 3, data.value, "");
+            defaultValData();
+        });
+        form.on("select(hospitalArea)", function (data) {
+            //区号,金纬度自动赋值
+            var areaDataFor = admin.getTempData("t_area");
+            if (areaDataFor != null) {
+                areaDataFor.forEach(function (item) {
+                    if (data.value == item.id) {
+                        $("#areaCode").val(item.areaCitycode);
+                        $("#longitude").val(item.areaLng);
+                        $("#latitude").val(item.areaLat);
+                        return;
+                    }
+                })
+            }
+        });
+
+        //赋值资质数据ID
+        form.on("select(hospitalQualifiedName)", function (data) {
+            $("#hospitalQualifiedId").val(data.value);
+        });
+        //赋值医院类型数据ID
+        form.on("select(hospitalTypeName)", function (data) {
+            $("#hospitalTypeId").val(data.value);
+        });
+        // 表单提交事件
+        form.on('submit(hospital-form-submit)', function (data) {
+            layer.load(2);
+            if (data.field != null) {
+
+                data.field.hospitalTypeName = $("#hospitalTypeName option:selected").text() != "请选择" ?
+                    $("#hospitalTypeName option:selected").text() : "";
+                data.field.hospitalQualifiedName = $("#hospitalQualifiedName option:selected").text() !=
+                    "请选择" ? $("#hospitalQualifiedName option:selected").text() : "";
+                data.field.hospitalProvince = $("#hospitalProvince option:selected").text() != "选择省" ?
+                    $("#hospitalProvince option:selected").text() : "";
+                data.field.hospitalCity = $("#hospitalCity option:selected").text() != "选择市" ? $(
+                    "#hospitalCity option:selected").text() : "";
+                data.field.hospitalArea = $("#hospitalArea option:selected").text() != "选择区县" ? $(
+                    "#hospitalArea option:selected").text() : "";
+
+                admin.req('api-user/syshospital', JSON.stringify(data.field), function (data) {
+                    if (data.code === 0) {
+                        //存储科室数据
+                        var departmentData = {
+                            serverUserId: $("#serverUserName").val(),
+                            serverUserName: $("#serverUserName option:selected").text(),
+                            serverUserTel: $("#serverUserTel").val(),
+                            departmentName: $("#departmentName").val(),
+                            id: $("#departmentId").val(),
+                            orgId: '' + $("#departmentOrgId").val(),
+                            updateUserId: '' + data.data.orgId,
+                            hospitalId: '' + data.data.id,
+                            saleUserId: '' + $("#saleUserName").val(),
+                            saleUserName: $("#saleUserName option:selected").text(),
+                            saleUserTel: $("#saleUserTel").val(),
+                            accountsCount: $("#accountsCount").val()
+                        };
+                        admin.req('api-user/sysdepartment/'+data.data.id, JSON.stringify(departmentData),
+                            function (data) {
+                                layer.closeAll('loading');
+                                if (data.code == 0) {
+                                    layer.msg(data.msg, {
+                                        icon: 1,
+                                        time: 1000
+                                    }, function () {
+                                        admin.finishPopupCenter();
+                                    });
+                                    admin.putTempData("t_hospital", "");
+                                    admin.putTempData("t_area", "");
+                                } else {
+                                    layer.msg(data.msg, {
+                                        icon: 2,
+                                        time: 1000
+                                    });
+                                }
+                            }, "POST");
+                    } else {
+                        layer.msg(data.msg, {
+                            icon: 2,
+                            time: 1000
+                        });
+                    }
+                }, "POST");
+            } else {
+                layer.msg("数据异常!", {
+                    icon: 2,
+                    time: 1000
+                });
+            }
+            return false;
+        });
+        //自动完成-医院名称
+        autocomplete.render({
+            elem: $('#hospitalName')[0],
+            keywordsName: 'hospitalName', //查询关键字名称
+            url: config.base_server + 'api-user/syshospital/findByName',
+            template_val: '{{d.hospitalName}}', //选择后文本框显示的数据字段
+            template_txt: "<div class='layui-table-cell'>{{d.hospitalName}}</div>", //下拉列表模板
+            onselect: function (resp) {
+                departmentId = "";
+                loadDatas(resp.id);
+            }
+        });
+
+        //检查科室名是否存在
+        $("#departmentName").blur(function () {
+            if (edithospitalData != null) {
+                if (edithospitalData.departmentName == $("#departmentName").val()) {
+                    return false;
+                }
+            }
+            let hosIdForDep = $("#id").val();
+            if (!strUtil.isEmpty($("#departmentName").val()) && !strUtil.isEmpty(hosIdForDep)) {
+                admin.req('api-user/sysdepartment/checkName', {
+                    hospitalId: hosIdForDep,
+                    departmentName: $("#departmentName").val()
+                }, function (data) {
+                    layer.closeAll('loading');
+                    if (0 != data.code) {
+                        layer.msg(data.msg, {
+                            icon: 2,
+                            time: 1000
+                        });
+                        return false;
+                    }
+                }, 'get');
+            }
+        })
+        //按照ID装载数据
+        var loadDatas = function (hosId) {
+            if (!strUtil.isEmpty(hosId)) {
+                //用ID获取实体
+                admin.req('api-user/syshospital/' + hosId, {}, function (data) {
+                    layer.closeAll('loading');
+                    if (0 === data.code) {
+                        //装载基本数据
+                        let hosData = data.data;
+                        form.val("hospital-form", hosData);
+                        //装载省市区数据
+                        if (!strUtil.isEmpty(hosData.hospitalProvince))
+                            area.areaData("#hospitalProvince", 1, "", hosData.hospitalProvince);
+                        if (!strUtil.isEmpty(hosData.hospitalCity))
+                            area.areaData("#hospitalCity", 2, $("#hospitalProvince").val(), hosData
+                                .hospitalCity);
+
+                        if (!strUtil.isEmpty(hosData.hospitalArea))
+                            area.areaData("#hospitalArea", 3, $("#hospitalCity").val(), hosData
+                                .hospitalArea);
+                        //装载资质 类型  
+                        $("#hospitalQualifiedName").val(hosData.hospitalQualifiedId);
+                        $("#hospitalTypeName").val(hosData.hospitalTypeId);
+                        if (!strUtil.isEmpty(departmentId)) {
+                            //装载科室数据
+                            admin.req('api-user/sysdepartment', {
+                                id: departmentId,
+                                isDel: 0,
+                                page: 1,
+                                limit: 20
+                            }, function (data) {
+                                if (data.code == 0) {
+                                    let departData = data.data.data;
+                                    if (departData.length > 0) {
+                                        if (departData.length > 1) {
+                                            layer.msg("该医院下有多个科室,默认显示第一个", {
+                                                icon: 1,
+                                                time: 2000
+                                            });
+                                        }
+
+                                        $("#serverUserId").val(departData[0].serverUserId);
+                                        $('#serverUserName').val(departData[0]
+                                            .serverUserId);
+
+                                        $("#departmentName").val(departData[0]
+                                            .departmentName);
+                                        $("#departmentId").val(departData[0].id);
+                                        $("#departmentOrgId").val(departData[0].orgId);
+                                        $("#saleUserId").val(departData[0].saleUserId);
+                                        $("#accountsCount").val(departData[0]
+                                            .accountsCount);
+                                        $('#saleUserName').val(departData[0].saleUserId);
+
+                                        if (hosIdForEdit != "") {
+                                            $("#serverUserTel").val(departData[0]
+                                                .serverUserTel);
+                                            $("#saleUserTel").val(departData[0]
+                                                .saleUserTel);
+                                        }
+                                        form.render();
+                                    }
+                                } else {
+                                    layer.msg(data.msg, {
+                                        icon: 2,
+                                        time: 2000
+                                    });
+                                }
+                            }, 'get');
+                        }
+
+                        form.render();
+                    } else {
+                        layer.msg(data.msg, {
+                            icon: 2,
+                            time: 2000
+                        });
+                    }
+                }, 'get');
+            }
+        }
+
+        //装载基本数据
+        if (!strUtil.isEmpty(hosIdForEdit)) {
+            loadDatas(hosIdForEdit);
+        }
+
+        layui.use('form', function () {
+            var $ = layui.$,
+                layer = layui.layer,
+                form = layui.form
+
+            form.verify({
+                integer: [
+                    /^[1-9]\d*$/, '只能输入正整数'
+                ]
+            });
+        });
+
+        form.on("select(serverUserName)", function (data) {
+            loadUserMobile('serverUserTel', data.value);
+        });
+
+        form.on("select(saleUserName)", function (data) {
+            loadUserMobile('saleUserTel', data.value);
+        });
+
+        var loadUserMobile = function (id, userId) {
+            admin.req('api-user/users/' + userId, {}, function (data) {
+                if (data != null) {
+                    $("#" + id).val(data.mobile);
+                } else {
+                    layer.msg(data.msg, {
+                        icon: 2,
+                        time: 2000
+                    });
+                }
+            }, 'get')
+        }
+        //重置区号 金纬度
+        var defaultValData = function () {
+            $("#areaCode").val("");
+            $("#longitude").val("");
+            $("#latitude").val("");
+        }
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/org_form.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/org_form.html
new file mode 100644
index 0000000..a036d9c
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/org_form.html
@@ -0,0 +1,113 @@
+<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">
+            <div id="orgParentId-tree" class="demo-tree demo-tree-box"></div>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">上级组织:</label>
+        <div class="layui-input-block">
+            <input name="orgParentId" id="orgParentId" type="hidden" value="-1" class="layui-input" maxlength="20" />
+            <input name="orgParentName" id="orgParentName" type="text" class="layui-input" maxlength="50" readonly />
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">组织类型:</label>
+        <div class="layui-input-block">
+            <select id="orgAttr" name="orgAttr" placeholder="选择一个类型">
+                <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">
+            <select name="orgLevel" id='orgLevel' placeholder="选择一个层级">
+                <option value="">-请选择-</option>
+                <option value="0">1级</option>
+                <option value="1">2级</option>
+                <option value="2">3级</option>
+                <option value="3">4级</option>
+                <option value="4">5级</option>
+                <option value="5">6级</option>
+                <option value="6">7级</option>
+                <option value="7">8级</option>
+                <option value="8">9级</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">医院/科室名称:</label>
+        <div class="layui-input-block">
+            <input name="orgName" 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>
+        <button class="layui-btn permissions" permissions="sysorganization-edit" id="sure" lay-filter="org-form-submit" lay-submit>保存</button>
+    </div>
+</form>
+<script>
+    parent.layui.use(['form', 'table', 'laydate', 'util', 'tree', 'config', 'admin'], function () {
+        var form = parent.layui.form;
+        var table = parent.layui.table;
+        var config = parent.layui.config;
+        var layer = parent.layui.layer;
+        var util = parent.layui.util;
+        var admin = parent.layui.admin;
+        //树形插件
+        var tree = parent.layui.tree;
+        var $ = parent.layui.jquery;
+
+        permissionsInput(res,config);
+        //组织结构树
+        var getData = function () {
+            admin.req('api-user/sysorganization/getTree', { is_del: 0, enabled: 1 }, function (data) {
+                if (0 === data.code) {
+                    tree({
+                        elem: "#orgParentId-tree",
+                        nodes: data.data,
+                        click: function (node) {
+                            //将数据赋值
+                            $("#orgParentId").val(node.id);
+                            $("#orgParentName").val(node.name);
+                            $("#orgAttr").val(node.level + 1);
+                            $("#orgLevel").val(node.level + 1);
+                            //刷新form表单
+                            form.render('select');
+                        }
+                    });
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 1000 });
+                }
+            }, 'get');
+        }
+
+        // 表单提交事件
+        form.on('submit(org-form-submit)', function (data) {
+            layer.load(2);
+            admin.req('api-user/sysorganization', JSON.stringify(data.field), function (data) {
+                layer.closeAll('loading');
+                if (data.code == 0) {
+                    //将组织数据存入本地
+                    admin.putTempData('t_org', data.data);
+                    //组织数据维护成功后,进入医院基本信息页面
+                    layer.msg("组织数据编辑成功,继续编辑基本数据...", { icon: 1, time: 1000 },function(){
+                        //admin.finishPopupCenter();
+                    });
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 1000 });
+                }
+            }, "POST");
+            return false;
+        });
+        form.render();
+        getData();
+    });
+</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..f2c679f
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/product.html
@@ -0,0 +1,142 @@
+<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 permissions"
+                    permissions="product-list">&#xe615;</i>搜索</button>
+            <button id="product-btn-add" class="layui-btn icon-btn permissions" permissions="product-edit"><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 permissions"  permissions="product-del" 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>
+    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 () {
+            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: "220",align: 'center', title: '产品名称' },
+                    {
+                        field: 'proType', align: 'center', width: '10%', templet: function (d) {
+                            if (d.proType === 0)
+                                return "试用"
+                            else
+                                return "正式"
+                        }, title: '类型'
+                    },
+                    {
+                        field: 'proTime', width: '10%', align: 'center', 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: '10%', align: 'center', title: '价格' },
+                    { field: 'recordCount', width: '10%', align: 'center', title: '报告数' },
+                    { field: 'ailightCount', width: '10%', align: 'center', title: '读片量' },
+                    {
+                        field: 'createTime', width: '120', align: 'center', sort: true, title: '创建时间', templet: function (d) {
+                            return new Date(d.createTime).dateFormat("yyyy-MM-dd hh:mm");
+                        }
+                    },
+                    { field: 'enabled', width: '10%', align: 'center', templet: '#product-tpl-state', sort: true, title: '状态' },
+                    { align: 'center', width: '10%', toolbar: '#product-table-bar', title: '操作' }
+                ]],
+                done: function (res) {
+                    permissionsInput(res,config);
+                }
+            });
+        }
+        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: 2000 });
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                    $(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: 2000 }, 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..786b527
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/product_form.html
@@ -0,0 +1,103 @@
+<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 permissions" permissions="product-edit" 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: 2000 });
+            }
+        }, '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: 2000 });
+                    admin.finishPopupCenter();
+                } else {
+                    layer.closeAll('loading');
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                }
+            }, $('#product-form').attr('method'));
+            return false;
+        });
+
+    });
+        
+        permissionsInput(res,config);
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/productdetail.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/productdetail.html
new file mode 100644
index 0000000..26bea23
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/productdetail.html
@@ -0,0 +1,165 @@
+<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;
+            <div  class="layui-col-sm10">
+                <div class="layui-col-sm4">
+                    <input type="text" class="layui-input search-input" id="startTime" placeholder="开始时间"> 至 <input type="text"
+                    class="layui-input search-input" id="endTime" placeholder="结束时间"> &emsp;
+                </div>
+                <div class="layui-col-sm2">
+                    <input id="product-search-value" class="layui-input search-input" type="text" placeholder="按产品名" />&emsp;
+                </div>
+                <div class="layui-col-sm2">
+                    <input id="hospital-search-value" class="layui-input search-input" type="text" placeholder="按医院名" style="width: 100%;" />
+                    <input type="hidden" id="hospitalId" value="">
+                </div>
+                <div class="layui-col-sm2">
+                    &emsp;<button id="product-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
+                </div>
+            </div>
+        </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>
+    layui.use(['table', 'util', 'admin', 'config', 'form', 'laydate', 'autocomplete'], function () {
+        let table = layui.table;
+        let util = layui.util;
+        let admin = layui.admin;
+        let form = layui.form;
+        let config = layui.config;
+        var autocomplete = layui.autocomplete;
+        var laydate = layui.laydate;
+
+        //执行一个laydate实例
+        laydate.render({
+            elem: '#startTime' //指定元素
+        });
+        laydate.render({
+            elem: '#endTime' //指定元素
+        });
+
+        // 渲染表格
+        var renderTable = function () {
+            table.render({
+                elem: '#product-table',
+                url: config.base_server + 'api-opration/productorderrecord/all',
+                method: 'GET',
+                headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+                page: true,
+                cols: [[
+                    { field: 'hospitalId', width: 180, title: '医院编号' },
+                    { field: 'hospitalName', width: 200, title: '医院名称' },
+                    { field: 'departmentName', width: 100, title: '科室名称' },
+                    { field: 'proName', width: 200, title: '产品名称' },
+                    {
+                    field: 'proType', sort: true, align: 'center', width: 80, templet: function (d) {
+                        if (d.proType === 0)
+                            return "试用"
+                        else
+                            return "正式"
+                    }, title: '类型'
+                },
+                    { field: 'ailightCount', width: 100, title: '读片量' },
+                    { field: 'recordCount', width: 100, title: '报告量' },
+                    { field: 'isShare', width: 100, title: '是否共享',templet:function(d)
+                    {
+                        if(d.isShare)
+                        return '共享'
+                        else
+                        return '私有'
+                    }
+                    },
+                    { field: 'proBegintime', width: 120, title: '开始时间',templet:function(d){
+                        return new Date(d.proBegintime).dateFormat("yyyy/MM/dd");
+                    } },
+                    { field: 'proEndtime', width: 120, title: '结束时间',templet:function(d){
+                        return new Date(d.proEndtime).dateFormat("yyyy/MM/dd");
+                    } },
+                    { field: 'createTime', width: 200, sort: true, title: '创建时间', templet: "<div>{{layui.util.toDateString(d.createTime, 'yyyy/MM/dd HH:mm')}}</div>" },
+                    { align: 'center', width: 100, toolbar: '#product-table-bar', title: '操作',
+                        fixed: 'right' }
+                ]]
+            });
+        }
+        renderTable();
+        // 工具条点击事件
+        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/productorderrecord/' + obj.data.id, {}, function (data) {
+                        layer.closeAll('loading');
+                        layer.msg(data.msg, { icon: 1, time: 2000 }, function () {
+                            renderTable();
+                        });
+                        obj.del();
+                    }, 'DELETE');
+                });
+            }
+        });
+
+        // 搜索按钮点击事件
+        $('#product-btn-search').click(function () {
+            var startTime = $('#startTime').val();
+            var endTime = $('#endTime').val();
+            if (startTime != null && endTime != null) {
+                var flag = compareDate(startTime, endTime);
+                if (!flag) {
+                    layer.msg('结束时间不得小于开始时间');
+                    return;
+                }
+            }
+            var proName = $('#product-search-value').val();
+                var hospitalId = $('#hospitalId').val();
+            table.reload('product-table', { where: { proName: proName,hospitalId: hospitalId,startTime: startTime, endTime: endTime } });
+        });
+       
+        //比较日期大小
+        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;
+                }
+            }
+        }
+
+        //自动完成-医院名称
+        autocomplete.render({
+            elem: $('#hospital-search-value'),
+            keywordsName: 'hospitalName',//查询关键字名称
+            url: config.base_server + 'api-user/syshospital/findByName',
+            template_val: '{{d.hospitalName}}',//选择后文本框显示的数据字段
+            template_txt: "<div class='layui-table-cell'>{{d.hospitalName}}</div>",//下拉列表模板
+            onselect: function (resp) {
+                $("#hospitalId").val(resp.id);
+            }
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/recharge.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/recharge.html
new file mode 100644
index 0000000..a5eb861
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/recharge.html
@@ -0,0 +1,616 @@
+<form id="recharge-form" lay-filter="recharge-form" class="layui-form">
+    <div style="overflow-y: auto; height:700px;">
+        <div class="layui-tab">
+            <ul class="layui-tab-title">
+                <li class="layui-this">合同信息</li>
+            </ul>
+            <div class="layui-tab-content" style="margin: 0px 0px -10px 0px;">
+                <div class="layui-tab-item layui-show">
+                    <div class="layui-form-item" style="padding: 0; margin-bottom: 0px;">
+                        <div class="layui-row">
+                            <div class="layui-col-sm5">
+                                <label class="layui-form-label" style="padding: 0;">医院名称</label>
+                                <div class="layui-input-block">
+                                    <input name="hospitalName" id="hospitalName" type="text" class="layui-input"
+                                        style="border: none; margin-top:-10px" readonly />
+                                </div>
+                            </div>
+                            <div class="layui-col-sm3">
+                                <label class="layui-form-label" style="padding: 0;">科室名称</label>
+                                <div class="layui-input-block">
+                                    <input name="departmentName" id="departmentName"
+                                        style="border: none;  margin-top:-10px" readonly class="layui-input" />
+                                </div>
+                            </div>
+                            <div class="layui-col-sm2">
+                                <label class="layui-form-label" style="padding: 0;">服务人员</label>
+                                <div class="layui-input-block">
+                                    <input name="serverUserName" id="serverUserName"
+                                        style="border: none; margin-top:-10px;width: 120px;" readonly
+                                        class="layui-input" />
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="layui-form-item" style="padding: 0; margin-bottom: 0px;">
+                        <div class="layui-row">
+                            <div class="layui-col-sm5">
+                                <label class="layui-form-label" style="padding: 0 30px 0 0;">地区</label>
+                                <input name="hospitalAreas" id="hospitalAreas" type="text"
+                                    style="border: none; width: 250px; margin-top:-10px" readonly class="layui-input" />
+                            </div>
+                            <div class="layui-col-sm3">
+                                <label class="layui-form-label" style="padding: 0;">联系电话</label>
+                                <div class="layui-input-block">
+                                    <input name="hospitalTel" id="hospitalTel" type="text" class="layui-input"
+                                        style="border: none; margin-top:-10px" readonly />
+                                </div>
+                            </div>
+                            <div class="layui-col-sm2">
+                                <label class="layui-form-label" style="padding: 0;">联系人</label>
+                                <div class="layui-input-block">
+                                    <input name="hospitalLink" type="text" class="layui-input"
+                                        style="border: none; margin-top:-10px;width: 120px;" readonly />
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item" style="padding: 0; margin-bottom: 0px;">
+                        <div class="layui-row">
+                            <div class="layui-col-sm4">
+                                <label class="layui-form-label" style="padding: 10px 30px 0 0px;">合同名称</label>
+                                <div class="layui-input-block">
+                                    <input name="contractTitle" id="contractTitle" type="text" class="layui-input"
+                                        maxlength="50" lay-verify="required" required autocomplete="off" />
+                                </div>
+                            </div>
+                            <div class="layui-col-sm3">
+                                <label class="layui-form-label">合同编号</label>
+                                <div class="layui-input-block">
+                                    <input name="contractNo" id="contractNo" type="text" class="layui-input"
+                                        maxlength="50" style="width: 185px;" autocomplete="off" lay-verify="required"
+                                        required />
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="layui-form-item" style="margin: 10px 0px 0px 0px;">
+                        <div class="layui-row">
+                            <div class="layui-col-sm4">
+                                <label class="layui-form-label" style="padding: 10px 30px 0 0px;">开始日期</label>
+                                <input autocomplete="off" name="contractBeginTime" id="contractBeginTime" type="text"
+                                    class="layui-input" style="width: 182px;" maxlength="50" lay-verify="required"
+                                    required />
+                            </div>
+                            <div class="layui-col-sm4">
+                                <label class="layui-form-label">截止日期</label>
+                                <div class="layui-input-block">
+                                    <input autocomplete="off" name="contractEndTime" id="contractEndTime" type="text"
+                                        class="layui-input" maxlength="50" lay-verify="required" required />
+                                </div>
+                            </div>
+                            <div class="layui-col-sm4">
+                                <label class="layui-form-label">签订日期</label>
+                                <div class="layui-input-block">
+                                    <input autocomplete="off" name="contractTime" id="contractTime" type="text"
+                                        class="layui-input" maxlength="50" lay-verify="required" required />
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <div class="layui-tab" style="margin: 0px;">
+            <ul class="layui-tab-title">
+                <li class="layui-this">产品信息</li>
+            </ul>
+            <div class="layui-tab-content" style="margin: -10px 0px -10px 0px;">
+                <div class="layui-tab-item layui-show" style="padding-top: 0px;">
+                    <table class="layui-table" id="product-table" lay-filter="product-table" style="margin: 0px;">
+                    </table>
+                </div>
+            </div>
+        </div>
+
+        <div class="layui-tab" style="margin: 0px;">
+            <ul class="layui-tab-title">
+                <li class="layui-this">待充值产品</li>
+            </ul>
+            <div class="layui-tab-content" style="margin: -10px 0px -10px 0px;">
+                <div class="layui-tab-item layui-show" style="padding-top: 0px;">
+                    <table class="layui-table" id="product-table-temp" lay-filter="product-table-temp"
+                        style="margin: 0px;">
+                    </table>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="layui-form-item model-form-footer" style="margin-right: 20px;">
+        <button class="layui-btn layui-btn-primary" ew-event="closeDialog" type="button">取消</button>
+        <button class="layui-btn permissions" permissions="product-rechage" lay-filter="recharge-form-submit"
+            lay-submit>确定充值</button>
+    </div>
+    <input type="hidden" value="" id="departmentId" name="departmentId" />
+    <input type="hidden" value="" id="hospitalId" name="hospitalId" />
+    <input type="hidden" value="" id="orgId" name="orgId" />
+    <input type="hidden" value="" id="serverUserId" name="serverUserId" />
+</form>
+<!-- 表格操作列 -->
+<script type="text/html" id="product-tpl-bar">
+    <a class="layui-btn layui-btn-xs" lay-event="pay">加入待充值</a>
+</script>
+<!-- 表格操作列 -->
+<script type="text/html" id="product-tpl-bar-temp">
+    <a class="layui-btn layui-btn-danger" lay-event="del">移除</a>
+</script>
+<!-- 表格状态列 -->
+<script type="text/html" id="product-tpl-isShare">
+    <input type="checkbox" lay-filter="product-tpl-isShare" value="{{d.id}}" lay-skin="switch" lay-text="共享|不共享" />
+</script>
+<script>
+    layui.use(['form', 'table', 'util', 'config', 'laydate', '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 $ = layui.jquery;
+        var laydate = layui.laydate;
+
+        //充值进行中
+        var isRun = false;
+        //执行一个laydate实例
+        laydate.render({
+            elem: '#contractBeginTime' //指定元素
+        });
+        laydate.render({
+            elem: '#contractEndTime' //指定元素
+        });
+        laydate.render({
+            elem: '#contractTime', //指定元素
+            value: new Date().dateFormat("yyyy-MM-dd")
+        });
+        //现将临时数据清理
+        admin.putTempData("t_tempProduct", "");
+        //待充值列表
+        var waitRecharge = function () {
+            table.render({
+                elem: '#product-table-temp',
+                data: admin.getTempData("t_tempProduct"),
+                page: false,
+                cellMinWidth: 100,
+                cols: [
+                    [{
+                            field: 'proName',
+                            width: 330,
+                            title: '产品名称',
+                            align: 'center',
+                            fixed: 'left'
+                        },
+                        {
+                            field: 'proType',
+                            align: 'center',
+                            width: 80,
+                            templet: function (d) {
+                                if (d.proType === 0)
+                                    return "试用"
+                                else
+                                    return "正式"
+                            },
+                            title: '类型'
+                        },
+                        {
+                            field: 'proTime',
+                            width: 100,
+                            title: '时长',
+                            align: 'center',
+                            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: 'ailightCount',
+                            width: 100,
+                            align: 'center',
+                            title: '读片量'
+                        },
+                        {
+                            field: 'recordCount',
+                            width: 100,
+                            align: 'center',
+                            title: '报告量'
+                        },
+                        {
+                            field: 'beginTime',
+                            align: 'center',
+                            width: 120,
+                            title: '开始日期'
+                        },
+                        {
+                            field: 'endTime',
+                            align: 'center',
+                            width: 120,
+                            title: '结束日期'
+                        },
+                        {
+                            field: 'isShare',
+                            fixed: 'right',
+                            align: 'center',
+                            width: 100,
+                            templet: function (d) {
+                                if (d.isShare == 0)
+                                    return "不共享"
+                                else
+                                    return "共享"
+                            },
+                            title: '共享'
+                        },
+                        {
+                            field: 'id',
+                            fixed: 'right',
+                            align: 'center',
+                            width: 100,
+                            toolbar: '#product-tpl-bar-temp',
+                            title: '操作'
+                        }
+                    ]
+                ]
+            });
+        }
+
+        //回显医院基本数据
+        let hospitalData = admin.getTempData('t_hospital');
+        if (hospitalData != null) {
+            form.val('recharge-form', hospitalData);
+            $("#hospitalAreas").val(hospitalData.hospitalProvince + " " + hospitalData.hospitalCity + " " +
+                hospitalData.hospitalArea);
+        }
+        //装载产品数据
+        table.render({
+            elem: '#product-table',
+            url: config.base_server + 'api-opration/product/all',
+            method: 'GET',
+            cellMinWidth: 50,
+            headers: {
+                'Authorization': 'Bearer ' + config.getToken().access_token
+            },
+            page: false,
+            where: {
+                is_del: 0,
+                enabled: 1
+            },
+            cols: [
+                [{
+                        field: 'proName',
+                        sort: true,
+                        width: 330,
+                        title: '产品名称',
+                        align: 'center',
+                        fixed: 'left'
+                    },
+                    {
+                        field: 'proType',
+                        sort: true,
+                        align: 'center',
+                        width: 80,
+                        templet: function (d) {
+                            if (d.proType === 0)
+                                return "试用"
+                            else
+                                return "正式"
+                        },
+                        title: '类型'
+                    },
+                    {
+                        field: 'proTime',
+                        width: 100,
+                        title: '时长',
+                        align: 'center',
+                        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: 'ailightCount',
+                        width: 100,
+                        align: 'center',
+                        title: '读片量'
+                    },
+                    {
+                        field: 'recordCount',
+                        width: 100,
+                        align: 'center',
+                        title: '报告量'
+                    },
+                    {
+                        field: 'beginTime',
+                        align: 'center',
+                        width: 120,
+                        title: '开始日期',
+                        event: "date"
+                    },
+                    {
+                        field: 'endTime',
+                        align: 'center',
+                        width: 120,
+                        title: '结束日期',
+                        event: "date"
+                    },
+                    {
+                        field: 'isShare',
+                        fixed: 'right',
+                        align: 'center',
+                        width: 100,
+                        templet: '#product-tpl-isShare',
+                        title: '共享'
+                    },
+                    {
+                        field: 'id',
+                        fixed: 'right',
+                        align: 'center',
+                        width: 100,
+                        toolbar: '#product-tpl-bar',
+                        title: '操作'
+                    }
+                ]
+            ],
+            done: function (res) {
+                permissionsInput(res, config);
+            }
+        });
+        //待充值列表功能操作
+        table.on('tool(product-table-temp)', function (obj) {
+            if (obj.event === "del") {
+                if (!strUtil.isEmpty(obj.data.id)) {
+                    delTempDataById(obj.data.id);
+                    obj.del();
+                }
+            }
+        });
+        //单元格点击事件
+        table.on('tool(product-table)', function (obj) {
+            var newdata = {};
+            var data = obj.data;
+            var selectData = {};
+            if (obj.event === 'date') {
+                var field = $(this).data('field');
+                laydate.render({
+                    elem: this.firstChild,
+                    format: "yyyy-MM-dd",
+                    show: true,
+                    done: function (value, date) {
+                        var nowTr=obj.tr;
+                        if (field === "beginTime") {
+                            var endTimes = getNowDate(data.proTime, data.proTimeUnit,
+                                value);
+                            newdata["beginTime"] = value;
+                            newdata["endTime"] = endTimes;
+                        } else if (field === "endTime") {
+                            newdata["endTime"] = value;
+                            var beginTimes = getNowDate((0 - parseInt(data.proTime)),
+                                data.proTimeUnit, value);
+                            newdata["beginTime"] = beginTimes;
+                        }
+                        obj.update(newdata);
+                    }
+                });
+            }
+            if (obj.event === "pay") {
+                data.beginTime = obj.tr.find("td[data-field='beginTime'] input").val();
+                data.endTime = obj.tr.find("td[data-field='endTime'] input").val();
+                data.beginTime = (!strUtil.isEmpty(data.beginTime)) ? data.beginTime : obj.tr.find(
+                    "td[data-field='beginTime'] div").text();
+                data.endTime = (!strUtil.isEmpty(data.endTime)) ? data.endTime : obj.tr.find(
+                    "td[data-field='endTime'] div").text();
+                data.isShare = obj.tr.find("td[data-field='isShare'] em").text();
+                data.isShare = (data.isShare.indexOf("不") == 0) ? 0 : 1;
+                if (!strUtil.isEmpty(data.beginTime) && !strUtil.isEmpty(data.endTime)) {
+                    if (dateUtil.compareDate(data.endTime, data.beginTime)) {
+                        tempDataList(data);
+                        waitRecharge();
+                    } else {
+                        layer.msg("结束时间必须大于开始时间!");
+                        return false;
+                    }
+                } else {
+                    layer.msg("时间格式有误!");
+                    return false;
+                }
+            }
+        });
+        //监听单元格编辑 判断日期格式
+        table.on('edit(product-table)', function (obj) {
+            var value = obj.value //得到修改后的值
+                ,
+                data = obj.data //得到所在行所有键值
+                ,
+                field = obj.field; //得到字段
+            if (dateUtil.isDate(value)) {} else {
+                layer.msg("输入的日期格式无效!");
+            }
+        });
+        //自动计算时间
+        var getNowDate = function (proTime, proTimeUnit, now) {
+            if (strUtil.isEmpty(now)) {
+                now = new Date();
+            } else {
+                now = dateUtil.strTurnDate(now);
+            }
+            if (strUtil.isEmpty(proTime) && strUtil.isEmpty(proTimeUnit)) {
+                return now.dateFormat("yyyy-MM-dd");
+            } else {
+                proTime = strUtil.isEmpty(proTime) ? 0 : proTime;
+                proTimeUnit = strUtil.isEmpty(proTimeUnit) ? 0 : proTimeUnit;
+                switch (proTimeUnit) {
+                    case 0:
+                        return new Date(now.setDate(now.getDate() + proTime)).dateFormat("yyyy-MM-dd");
+                        break;
+                    case 1:
+                        return new Date(now.setMonth(now.getMonth() + proTime)).dateFormat(
+                            "yyyy-MM-dd");
+                        break;
+                    case 2:
+                        return new Date(now.setFullYear(now.getFullYear() + proTime)).dateFormat(
+                            "yyyy-MM-dd");
+                        break;
+                }
+            }
+        }
+        // 产品待充值数据
+        var tempDataList = function (data) {
+            if (!strUtil.isEmpty(data)) {
+                var listData = admin.getTempData("t_tempProduct");
+                if (strUtil.isEmpty(listData)) {
+                    listData = new Array();
+                }
+                $.each(listData, function (index, value) {
+                    if (value.id === data.id) {
+                        //移除
+                        listData.splice(index, 1);
+                        return false;
+                    }
+                })
+                listData.push(data);
+                admin.putTempData("t_tempProduct", listData);
+            } else {
+                admin.putTempData("t_tempProduct", "");
+            }
+        }
+        //移除指定数据
+        var delTempDataById = function (id) {
+            if (!strUtil.isEmpty(id)) {
+                var listData = admin.getTempData("t_tempProduct");
+                $.each(listData, function (index, value) {
+                    if (value.id === id) {
+                        //移除
+                        listData.splice(index, 1);
+                        return false;
+                    }
+                })
+                admin.putTempData("t_tempProduct", listData);
+            }
+        }
+        form.on('submit(recharge-form-submit)', function (data) {
+            if (!isRun) {
+                layer.load(2);
+                var listData = admin.getTempData("t_tempProduct");
+                if (listData != null) {
+                    if (data.field != null) {
+                        layer.confirm("确定要将待充值列表中的" + listData.length + "个产品充值给当前医院的科室吗?", {
+                            btn: ["确定", "返回"]
+                        }, function () {
+                            isRun = true;
+                            data.field.contractBeginTime = data.field.contractBeginTime +
+                                " 00:00:00";
+                            data.field.contractEndTime = data.field.contractEndTime +
+                                " 23:59:59";
+                            data.field.contractTime = data.field.contractTime + " 00:00:00";
+                            admin.req('api-opration/contract', JSON.stringify(data.field),
+                                function (data) {
+                                    layer.closeAll('loading');
+                                    if (data.code === 0) {
+                                        var orderData = data.data;
+                                        //处理订单明细数据
+                                        var listDetailData = new Array();
+                                        $.each(listData, function (index, item) {
+                                            var detailData = {
+                                                orderId: orderData.id,
+                                                proId: item.id,
+                                                proType: item.proType,
+                                                proName: item.proName,
+                                                isShare: item.isShare,
+                                                ailightCount: item.ailightCount,
+                                                recordCount: item.recordCount,
+                                                proBegintime: item.beginTime +
+                                                    ' 00:00:00',
+                                                proEndtime: item.endTime +
+                                                    ' 23:59:59'
+                                            };
+                                            listDetailData.push(detailData);
+                                        })
+
+                                        if (listDetailData.length > 0) {
+                                            //提交订单数据
+                                            admin.req(
+                                                'api-opration/productorderdetail/saveall',
+                                                JSON.stringify(listDetailData),
+                                                function (data) {
+                                                    isRun = false;
+                                                    layer.closeAll('loading');
+                                                    if (data.code === 0) {
+                                                        //现将临时数据清理
+                                                        admin.putTempData(
+                                                            "t_tempProduct",
+                                                            "");
+                                                        layer.msg(data.msg, {
+                                                            icon: 1,
+                                                            time: 3000
+                                                        }, function () {
+                                                            admin
+                                                                .finishPopupCenter();
+                                                        });
+                                                    } else {
+                                                        layer.msg(data.msg, {
+                                                            icon: 2,
+                                                            time: 1000
+                                                        });
+                                                    }
+                                                }, 'POST');
+                                        } else {
+                                            layer.msg("充值数据异常为空!", {
+                                                icon: 2,
+                                                time: 1000
+                                            });
+                                            isRun = false;
+                                        }
+                                    } else {
+                                        layer.msg(data.msg, {
+                                            icon: 2,
+                                            time: 1000
+                                        });
+                                        isRun = false;
+                                    }
+                                }, 'POST');
+                        })
+                    } else {
+                        layer.msg("数据异常!", {
+                            icon: 2,
+                            time: 1000
+                        });
+                    }
+                } else {
+                    layer.msg("请先将要充值的产品加入待充值!", {
+                        icon: 2,
+                        time: 2000
+                    });
+                }
+                layer.closeAll('loading');
+                return false;
+            }
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/recordNote.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/recordNote.html
new file mode 100644
index 0000000..9122940
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/recordNote.html
@@ -0,0 +1,17 @@
+<script>
+    layui.use(['layer', 'admin', 'form', 'table', 'config'], function () {
+        var table = layui.table;
+        var config = layui.config;
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        
+        // 回显数据
+        var diagnosis = admin.getTempData('t_diagnosis');
+        if(diagnosis!=null)
+        {
+            //诊断记录ID
+            var id=diagnosis.diagnosticId;
+        }
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/sysOrganization.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/sysOrganization.html
new file mode 100644
index 0000000..9d085e2
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/sysOrganization.html
@@ -0,0 +1,298 @@
+<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="orgName-search" class="layui-input search-input" type="text" placeholder="按名称" />&emsp;
+            <button id="app-btn-search" class="layui-btn icon-btn permissions" permissions="sysorganization-list"><i class="layui-icon">&#xe615;</i>搜索</button>
+            <!-- <button id="organization-add" class="layui-btn icon-btn permissions" permissions="sysorganization-edit"><i class="layui-icon">&#xe654;</i>添加</button> -->
+        </div>
+
+        <!-- 数据表格 -->
+        <table class="layui-table" id="organization-table" lay-filter="organization-table"></table>
+    </div>
+</div>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="organization-table-bar">
+    <!-- <a class="layui-btn layui-btn-primary layui-btn-xs permissions" permissions="sysorganization-edit" lay-event="edit">修改</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs permissions" permissions="sysorganization-del" lay-event="del">删除</a> -->
+</script>
+
+<!-- 表格状态列 -->
+<script type="text/html" id="organization-tpl-state">
+    <input type="checkbox" lay-filter="organization-tpl-state" value="{{d.id}}" lay-skin="switch" lay-text="正常|锁定"
+           {{d.enabled==true?'checked':''}}/>
+</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">
+                <div id="orgParentId-tree" class="demo-tree demo-tree-box"></div>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">上级组织:</label>
+            <div class="layui-input-block">
+                <input name="orgParentId" id="orgParentId" type="hidden" value="-1" class="layui-input" maxlength="20"/>
+            <input name="orgParentName" id="orgParentName" 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">
+                <select id="doctorRankId" name="orgAttr"   placeholder="选择一个职称" >
+                    <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">
+                       <select  name="orgLevel" id='orgLevel' disabled="true" placeholder="选择一个职称" >
+                        <option value="">-请选择-</option>
+                        <option value="0">1级</option>
+                        <option value="1">2级</option>
+                        <option value="2">3级</option>
+                        <option value="3">4级</option>
+                        <option value="4">5级</option>
+                        <option value="5">6级</option>
+                        <option value="6">7级</option>
+                        <option value="7">8级</option>
+                        <option value="8">9级</option>
+                    </select>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">组织名称:</label>
+            <div class="layui-input-block">
+                <input name="orgName"  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 id="orgName-shi" name="enabled" value="true" title="启用" type="radio" class="layui-input" maxlength="20"/>
+                <input id="orgName-fou" name="enabled" value="false" title="禁用" type="radio" 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>
+            <button class="layui-btn" id="sure" lay-filter="user-form-submit" lay-submit>保存</button>
+        </div>
+    </form>
+</script>
+
+
+<script>
+    layui.use(['form', 'table', 'laydate', 'util', 'tree', 'config', 'admin', 'treetable'], 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;
+        let treetable = layui.treetable;
+        //树形插件
+        var tree = layui.tree;
+        var layer = layui.layer
+            , $ = layui.jquery;
+
+        // 渲染表格
+        // 渲染表格
+        var renderTable = function (param) {
+            if (param) {
+                param.access_token = config.getToken().access_token;
+            } else {
+                param = {
+                    access_token: config.getToken().access_token
+                };
+            }
+            treetable.render({
+                treeColIndex: 1,
+                treeSpid: -1,
+                treeIdName: 'id',
+                treePidName: 'orgParentId',
+                elem: '#organization-table',
+                url: config.base_server + 'api-user/sysorganization/getListByMap',
+                where: param,
+                page: false,
+                cols: [[
+                    { type: 'numbers' },
+                    { field: 'orgName', minWidth: 200, title: '组织名称' },
+                    {
+                        field: 'orgAttr', align: 'right', title: '所属类型', templet: function (d) {
+                            //节点属性(集团/公司/部门等,取值0,1,2,3,4)
+                            if (d.orgAttr == 0) {
+                                return "集团";
+                            } else if (d.orgAttr == 1) {
+                                return "公司/医院";
+                            } else if (d.orgAttr == 2) {
+                                return "部门/科室";
+                            } else {
+                                return "子部门/子科室";
+                            }
+                        }
+                    },
+                    // { field: 'enabled', align: 'right', sort: true, templet: '#organization-tpl-state', title: '状态' },
+                    // { toolbar: '#organization-table-bar', align: 'right', align: 'center', title: '操作' }
+                ]],
+                done: function (res) {
+                    permissionsInput(res,config);
+                }
+            });
+        };
+
+        renderTable({ access_token: config.clientId, is_del: 0 });
+        // 工具条点击事件
+        table.on('tool(organization-table)', function (obj) {
+            var data = obj.data;
+            var layEvent = obj.event;
+            if (layEvent === 'edit') { // 查看详情
+                showEditModel(data);
+            } else if (layEvent === 'del') {
+                layer.confirm('确定删除此组织吗?', function () {
+                    layer.load(2);
+                    let tenantId = $('#menu_clients').val();
+                    admin.req('api-user/sysorganization/' + obj.data.id + '?tenantId=' + tenantId, {}, function (data) {
+                        layer.closeAll('loading');
+                        if (0 === data.code) {
+                            layer.msg(data.msg, { icon: 1, time: 2000 });
+                            renderTable({ tenantId: tenantId });
+                        } else {
+                            layer.msg(data.msg, { icon: 2, time: 2000 });
+                        }
+                    }, 'DELETE');
+                });
+            }
+        });
+        // 修改menu状态
+        form.on('switch(organization-tpl-state)', function (obj) {
+            layer.load(2);
+            admin.req('api-user/sysorganization/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: 2000 });
+                    renderTable({ access_token: config.clientId, is_del: 0 });
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                    $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+                }
+            }, 'GET');
+        });
+        // 添加按钮点击事件
+        $('#organization-add').click(function () {
+            showEditModel();
+        });
+        // 表单提交事件
+        form.on('submit(user-form-submit)', function (data) {
+            layer.load(2);
+            admin.req('api-user/sysorganization', JSON.stringify(data.field), function (data) {
+                layer.closeAll('loading');
+                if (data.code == 0) {
+                    // layer.msg(data.msg, { icon: 1, time: 2000 });
+                    layer.closeAll();
+                    // treetable.reload('organization-table', {});
+                    renderTable({ access_token: config.clientId, is_del: 0 });
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                }
+            }, "POST");
+            return false;
+        });
+        // 搜索按钮点击事件
+        $('#app-btn-search').click(function () {
+            var keyword = $('#orgName-search').val();
+            var searchCount = 0;
+            $('#organization-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: 2000 });
+            } else {
+                treetable.expandAll('#organization-table');
+            }
+        });
+        var getData = function () {
+            admin.req('api-user/sysorganization/getTree', { is_del: 0 }, function (data) {
+                layer.closeAll('loading');
+                var data1 = [{
+                    name: '常用文件夹',
+                    id: 1,
+                    children: [
+                        { name: '所有未读', id: 11 },
+                        { name: '置顶邮件', id: 12 },
+                        { name: '标签邮件', id: 13 }]
+                }];
+                if (0 === data.code) {
+                    tree({
+                        elem: "#orgParentId-tree",
+                        nodes: data.data,
+                        click: function (node) {
+                            //将数据赋值
+                            $("#orgParentId").val(node.id)
+                            $("#orgParentName").val(node.name)
+                            $("#orgLevel").val(node.level + 1)
+                            form.render('select');
+                        }
+                    });
+
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                }
+            }, 'get');
+        }
+        // // 显示编辑弹窗
+        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');
+                    getData();
+                    if (data) {
+                        //
+                        form.val('app-form', data);
+                        $("#orgParentId").val(data.orgParentId);
+                        if (data.enabled) {
+                            $("#orgName-shi").prop("checked", true);
+                        } else {
+                            $("#orgName-fou").prop("checked", true);
+                        }
+                    }
+                }
+            });
+        };
+    });
+</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..1697a1c
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/sysdictionaries.html
@@ -0,0 +1,276 @@
+<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 permissions" permissions="sysdictionaries-list"><i class="layui-icon">&#xe615;</i>搜索</button>
+            <button id="user-btn-add" class="layui-btn icon-btn permissions" permissions="sysdictionaries-edit"><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 permissions" permissions="sysdictionaries-edit" lay-event="edit">修改</a>
+    <a class="layui-btn layui-btn-xs permissions" permissions="sysdictionaries-del" 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">
+    <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="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">
+                <select id="role_clients"   name="dictionariesClassId" 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="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|number" required />
+            </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 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', width: "10%",align: 'center',},
+                {
+                    field: 'dictionariesClassId', width: "10%",align: 'center', title: '字典类型', templet: function (d) {
+                        return d.dictionariesClassId == undefined ? "分类" : "字典"
+                    }
+                },
+                { field: 'dictionariesClassName', width: "10%",align: 'center', title: '字典分类' },
+                { field: 'dictionariesKey', width: "20%",align: 'center', title: '字典Key' },
+                { field: 'dictionariesName', width: "10%",align: 'center', title: '字典值' },
+                { field: 'id',  width: "10%",align: 'center', toolbar: '#dictionaries-tpl-state', title: '状态' },// 0就诊数据 1筛查
+                { field: 'createTime',  width: "10%",align: 'center', title: '创建时间', templet: "<div>{{layui.util.toDateString(d.createTime, 'yyyy-MM-dd HH:mm')}}</div>" },
+                { field: 'id', width: "10%",align: 'center', toolbar: '#dictionaries-table-bar', title: '操作' },// 0就诊数据 1筛查
+            ]],
+            done:function(res){
+                permissionsInput(res,config);
+            }
+        });
+
+        // 修改类型
+        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() {
+        }
+        // 删除
+        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: 2000 });
+                        table.reload('app-table', {});
+                    } else {
+                        layer.msg(data.msg, { icon: 2, time: 2000 });
+                    }
+                }, 'delete');
+            });
+        };
+
+        // 获取应用列表
+        var getdata = function () {
+            var co = $('#role_clients');
+            admin.req('api-user/sysdictionaries/findAll', JSON.stringify({ dictionariesClassIdIsNull: "str" }), function (data) {
+                layer.closeAll('loading');
+                if (0 === data.code) {
+                    let selected = false;
+                    clientsAll = data;
+                    $.each(data.data, function (index, item) {
+                        //往下拉菜单里添加元素
+                        $('#role_clients').append(new Option(item.dictionariesName, item.dictionariesKey, false, selected));
+                    })
+                    form.render();
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                }
+            }, '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: 2000 });
+                    table.reload('app-table', {});
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                    $(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: 2000 });
+                    layer.closeAll();
+                    table.reload('app-table', {});
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                }
+            }, "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/opration/verifyRecharge.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/verifyRecharge.html
new file mode 100644
index 0000000..5d8d669
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/verifyRecharge.html
@@ -0,0 +1,108 @@
+<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;
+            <input id="hospital-search-value" class="layui-input search-input" type="text" placeholder="按医院名" />&emsp;
+            <button id="product-btn-search" class="layui-btn icon-btn permissions" permissions="updateEnabled-detail"><i class="layui-icon">&#xe615;</i>搜索</button>
+        </div>
+        <table class="layui-table permissions" id="product-table" lay-filter="product-table" permissions="productorderdetail-verify"></table>
+    </div>
+</div>
+<!-- 表格状态列 -->
+<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>
+    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 config = layui.config;
+
+        // 渲染表格
+        var renderTable = function () {
+            table.render({
+                elem: '#product-table',
+                url: config.base_server + 'api-opration/productorderdetail/all',
+                method: 'GET',
+                where: { enabled: 0, proType: 0 },
+                headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
+                page: true,
+                cols: [[
+                    { field: 'hospitalName',align:'center', width: 300, title: '医院名称' },
+                    { field: 'departmentName', align:'center',width: 100, title: '科室名称' },
+                    { field: 'proName',align:'center', width: 250, title: '产品名称' },
+                    { field: 'ailightCount', align:'center',width: 150, title: '读片量' },
+                    { field: 'recordCount',align:'center', width: 100, title: '报告量' },
+                    {
+                        field: 'isShare',align:'center', width: 100, title: '是否共享', templet: function (d) {
+                            if (d.isShare)
+                                return '共享'
+                            else
+                                return '私有'
+                        }
+                    },
+                    {
+                        field: 'proBegintime',align:'center', width: 120, title: '开始时间', templet: function (d) {
+                            return new Date(d.proBegintime).dateFormat("yyyy/MM/dd");
+                        }
+                    },
+                    {
+                        field: 'proEndtime',align:'center', width: 120, title: '结束时间', templet: function (d) {
+                            return new Date(d.proEndtime).dateFormat("yyyy/MM/dd");
+                        }
+                    },
+                    {
+                        field: 'createTime',align:'center', width: 160, sort: true, title: '创建时间', templet: function (d) {
+                            return new Date(d.createTime).dateFormat("yyyy/MM/dd hh:mm");
+                        }
+                    },
+                    { field: 'enabled',align:'center', width: 100, templet: '#product-tpl-state', sort: true, title: '审核' }
+                ]],
+                done:function(res){
+                permissionsInput(res,config);
+                }
+            });
+        }
+        renderTable();
+
+        // 修改状态
+        form.on('switch(product-tpl-state)', function (obj) {
+            layer.confirm("确定要通过此试用吗?",{btn: ["确定", "返回"]},function(){
+                admin.req('api-opration/productorderdetail/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: 2000 });
+        renderTable();
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                    $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+                }
+            }, 'GET');
+            },function(){
+                $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+            });
+        });
+        // 搜索按钮点击事件
+        $('#product-btn-search').click(function () {
+            var proName = $('#product-search-value').val();
+            var hospitalName = $('#hospital-search-value').val();
+            table.reload('product-table', { where: { proName: proName, hospitalName: hospitalName } });
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager.html
index 66842a6..d7dc44c 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager.html
@@ -102,10 +102,10 @@
                 admin.req('api-search/admin/index?indexName='+obj.data.indexName, {}, function (data) {
                     layer.closeAll('loading');
                     if (data.code == 0) {
-                        layer.msg(data.msg, {icon: 1, time: 500});
+                        layer.msg(data.msg, {icon: 1, time: 2000});
                         obj.del();
                     } else {
-                        layer.msg(data.msg, {icon: 2, time: 500});
+                        layer.msg(data.msg, {icon: 2, time: 2000});
                     }
                 }, 'DELETE');
             });
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager_form.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager_form.html
index f2de81f..fedee9f 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager_form.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager_form.html
@@ -48,10 +48,10 @@
             admin.req('api-search/admin/index', JSON.stringify(data.field), function (data) {
                 layer.closeAll('loading');
                 if (data.code == 0) {
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                    layer.msg(data.msg, {icon: 1, time: 2000});
                     admin.finishPopupCenter();
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, {icon: 2, time: 2000});
                 }
             }, "POST");
             return false;
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager_view.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager_view.html
index b82c996..41f8992 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager_view.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/search/index_manager_view.html
@@ -26,7 +26,7 @@
                 if (0 == data.code) {
                     $('#data').html(syntaxHighlight(data.datas));
                 } else {
-                    layer.msg('获取索引信息失败', {icon: 2, time: 500});
+                    layer.msg('获取索引信息失败', {icon: 2, time: 2000});
                 }
             }, 'GET');
         }
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/menus.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/menus.html
index ae9c51f..1ba0812 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/menus.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/menus.html
@@ -2,16 +2,17 @@
     <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>
+            <a href="#!home_console">首页</a>
+            <a><cite>菜单管理</cite></a>
         </span>
     </div>
     <div class="layui-card-body">
         <div class="layui-form toolbar">
             所属应用:<select id="menu_clients" lay-filter="menu_clients"></select>
-            &emsp;搜索:<input id="menus-edit-search" class="layui-input search-input" type="text" placeholder="输入关键字"/>&emsp;
+            &emsp;搜索:<input id="menus-edit-search" class="layui-input search-input" type="text"
+                placeholder="按关键字" />&emsp;
             <button id="menus-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
-            <button id="menus-btn-add" class="layui-btn icon-btn"><i class="layui-icon">&#xe654;</i>添加</button>
+            <button id="menus-btn-add" class="layui-btn icon-btn permissions" permissions="saveOrUpdate"><i class="layui-icon">&#xe654;</i>添加</button>
             <button id="menus-btn-expand" class="layui-btn">全部展开</button>
             <button id="menus-btn-fold" class="layui-btn">全部折叠</button>
         </div>
@@ -24,8 +25,8 @@
 <!-- 表格操作列 -->
 <script type="text/html" id="menus-state">
 <!--    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="add">下级</a>-->
-    <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>
+<a class="layui-btn layui-btn-primary layui-btn-xs permissions" permissions="saveOrUpdate" lay-event="edit">修改</a>
+<a class="layui-btn layui-btn-danger layui-btn-xs permissions" permissions="menus-del" lay-event="del">删除</a>
 </script>
 
 
@@ -37,7 +38,7 @@
 
 <script>
 
-    layui.use(['form', 'table', 'util', 'config', 'admin', 'formSelects', 'treetable'],function () {
+    layui.use(['form', 'table', 'util', 'config', 'admin', 'formSelects', 'treetable'], function () {
         let table = layui.table;
         let layer = layui.layer;
         let admin = layui.admin;
@@ -64,15 +65,15 @@
                 where: param,
                 page: false,
                 cols: [[
-                    {type: 'numbers'},
-                    {field: 'name', minWidth: 200, title: '菜单名称'},
-                    {field: 'tenantId', minWidth: 80, title: '应用标识'},
-                    {field: 'url', title: '菜单url'},
-                    {field: 'path', title: '菜单path'},
-                    {field: 'css',  align: 'center', title: '样式'},
-                    {field: 'sort', width: 80, align: 'center', title: '排序号'},
+                    { type: 'numbers' ,width: "3%" },
+                    { field: 'name',width: "15%", minWidth: 200, title: '菜单名称' },
+                    { field: 'tenantId',width: "7%", minWidth: 80, title: '应用标识' },
+                    { field: 'url',width: "20%", title: '菜单url' },
+                    { field: 'path',width: "15%", title: '菜单path' },
+                    { field: 'css',width: "10%", align: 'center', title: '样式' },
+                    { field: 'sort', width: "5%", align: 'center', title: '排序号' },
                     {
-                        field: 'type', width: 80, align: 'center', templet: function (d) {
+                        field: 'type', width: "5%", align: 'center', templet: function (d) {
                             if (d.type === 2) {
                                 return '<span class="layui-badge layui-bg-gray">资源</span>';
                             }
@@ -83,12 +84,15 @@
                             }
                         }, title: '类型'
                     },
-                    {field: 'enabled', width: 100,sort: true, templet: '#menu-tpl-state', title: '状态'},
-                    {templet: '#menus-state', width: 120, align: 'center', title: '操作'}
-                ]]
+                    { field: 'enabled', width: "10%", sort: true, templet: '#menu-tpl-state', title: '状态' },
+                    { templet: '#menus-state', width: "10%", align: 'center', title: '操作' }
+                ]],
+                done: function (res) {
+                    permissionsInput(res,config);
+                }
             });
         };
-        renderTable({tenantId: config.clientId});
+        renderTable({ tenantId: config.clientId });
 
         // 获取应用列表
         layer.load(2);
@@ -96,7 +100,7 @@
             layer.closeAll('loading');
             if (0 === data.code) {
                 let selected = false;
-                $.each(data.data,function(index,item){
+                $.each(data.data, function (index, item) {
                     if (config.clientId === item.clientId) {
                         selected = true;
                     } else {
@@ -107,7 +111,7 @@
                 })
                 form.render();
             } else {
-                layer.msg(data.msg, {icon: 2, time: 500});
+                layer.msg(data.msg, { icon: 2, time: 2000 });
             }
         }, 'GET');
 
@@ -120,9 +124,9 @@
             }, function (data) {
                 layer.closeAll('loading');
                 if (data.code == 0) {
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                    layer.msg(data.msg, { icon: 1, time: 2000 });
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
                     $(obj.elem).prop('checked', !obj.elem.checked);
                     form.render('checkbox');
                 }
@@ -140,13 +144,13 @@
                 layer.confirm('确定删除此菜单吗?', function () {
                     layer.load(2);
                     let tenantId = $('#menu_clients').val();
-                    admin.req('api-user/menus/'+obj.data.id+'?tenantId='+tenantId, {}, function (data) {
+                    admin.req('api-user/menus/' + obj.data.id + '?tenantId=' + tenantId, {}, function (data) {
                         layer.closeAll('loading');
                         if (0 === data.code) {
-                            layer.msg(data.msg, {icon: 1, time: 500});
-                            renderTable({tenantId: tenantId});
+                            layer.msg(data.msg, { icon: 1, time: 2000 });
+                            renderTable({ tenantId: tenantId });
                         } else {
-                            layer.msg(data.msg, {icon: 2, time: 500});
+                            layer.msg(data.msg, { icon: 2, time: 2000 });
                         }
                     }, 'DELETE');
                 });
@@ -157,7 +161,7 @@
         var showEditModel = function (data) {
             let tenantId = $('#menu_clients').val();
             let title = data ? '修改菜单' : '添加菜单';
-            if (data){
+            if (data) {
                 data.type = data.type.toString();
                 data.hidden = data.hidden.toString();
             } else {
@@ -170,7 +174,7 @@
                 title: title,
                 path: 'pages/system/menus_form.html',
                 finish: function () {
-                    renderTable({tenantId: tenantId});
+                    renderTable({ tenantId: tenantId });
                 }
             });
         };
@@ -191,13 +195,13 @@
                     $(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);
+                        $('.layui-tab-item.layui-show').animate({ scrollTop: $(this).offset().top - 150 }, 500);
                     }
                     searchCount++;
                 }
             });
             if (keyword !== '' && searchCount === 0) {
-                layer.msg("没有匹配结果", {icon: 5, time: 500});
+                layer.msg("没有匹配结果", { icon: 5, time: 2000 });
             } else {
                 treetable.expandAll('#menus-table');
             }
@@ -212,8 +216,8 @@
         });
 
         // 应用下来框点击事件
-        form.on('select(menu_clients)', function(data){
-            renderTable({tenantId: data.value});
+        form.on('select(menu_clients)', function (data) {
+            renderTable({ tenantId: data.value });
         });
     });
 </script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/menus_form.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/menus_form.html
index 9bf93e2..2e2b07d 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/menus_form.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/menus_form.html
@@ -121,7 +121,7 @@
                 }
                 form.render();  //菜单渲染 把内容加载进去
             } else {
-                layer.msg('获取一级菜单', {icon: 2, time: 500});
+                layer.msg('获取一级菜单', {icon: 2, time: 2000});
             }
         }, 'GET');
 
@@ -143,7 +143,7 @@
                 })
                 form.render();
             } else {
-                layer.msg(data.msg, {icon: 2, time: 500});
+                layer.msg(data.msg, {icon: 2, time: 2000});
             }
         }, 'GET');
         // 表单提交事件
@@ -153,11 +153,11 @@
             admin.req('api-user/menus/saveOrUpdate?tenantId='+menus.tenantId, JSON.stringify(data.field), function (data) {
                 if (data.code === 0) {
                 	layer.closeAll('loading');
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                    layer.msg(data.msg, {icon: 1, time: 2000});
                     admin.finishPopupCenter();
                 } else {
                 	layer.closeAll('loading');
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, {icon: 2, time: 2000});
                 }
             }, $('#menus-form').attr('method'));
             return false;
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/myInfo.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/myInfo.html
index b7558fd..abbb960 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/myInfo.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/myInfo.html
@@ -10,22 +10,22 @@
     <div class="layui-form-item">
         <label class="layui-form-label">用户名</label>
         <div class="layui-input-block">
-            <input name="nickname" placeholder="请输入用户名" type="text" class="layui-input" maxlength="20"
+            <input name="nickname" disabled="disabled" class="layui-input layui-disabled" 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="mobile" placeholder="请输入手机号" type="text" class="layui-input" lay-verify="required|mobile"
+            <input name="mobile" disabled="disabled" placeholder="请输入手机号" type="text" class="layui-input layui-disabled" lay-verify="required|mobile"
                    required/>
         </div>
     </div>
     <div class="layui-form-item">
-        <label class="layui-form-label">性别</label>
+        <label class="layui-form-label" class="layui-input layui-disabled" >性别</label>
         <div class="layui-input-block">
-            <input type="radio" name="sex" value="0" title="男" checked/>
-            <input type="radio" name="sex" value="1" title="女"/>
+            <input type="radio"disabled="disabled"  name="sex" value="0" title="男" checked/>
+            <input type="radio" disabled="disabled" name="sex" value="1" title="女"/>
         </div>
     </div>
 
@@ -73,11 +73,11 @@
                 if (data.code == 0) {
                     layer.closeAll('loading');
                     $(".layui-nav-img").attr("src",$("[name=headImgUrl]").val());
-                    layer.msg("操作成功", {icon: 1, time: 500});
+                    layer.msg("操作成功", {icon: 1, time: 2000});
 
                     form.val('user-form',data.data);
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, {icon: 2, time: 2000});
                 }
             }, 'POST');
             return false;
@@ -100,7 +100,6 @@
             },
             done: function(data){
                 layer.closeAll('loading');
-                console.log(data);
                 $("[name=headImgUrl]").val(data.url);
             },
             error: function (data) {
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/role.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/role.html
index 581fd44..ce7367f 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/role.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/role.html
@@ -1,11 +1,11 @@
-<link rel="stylesheet" href="/assets/libs/zTree/css/zTreeStyle/zTreeStyle.css"/>
+<link rel="stylesheet" href="/assets/libs/zTree/css/zTreeStyle/zTreeStyle.css" />
 <script type="text/javascript" src="/assets/libs/zTree/js/jquery.ztree.all-3.5.min.js"></script>
 <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>
+            <a href="#!console">首页</a>
+            <a><cite>角色管理</cite></a>
         </span>
     </div>
     <div class="layui-card-body">
@@ -16,13 +16,13 @@
                 <option value="">-请选择-</option>
                 <option value="name">角色名称</option>
             </select>&emsp;
-            <input id="role-edit-value" class="layui-input search-input" type="text" placeholder="输入关键字"/>&emsp;
+            <input id="role-edit-value" class="layui-input search-input" type="text" placeholder="按关键字" />&emsp;
             <button id="role-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
-            <button id="role-btn-add" class="layui-btn icon-btn"><i class="layui-icon">&#xe654;</i>添加</button>
+            <button id="role-btn-add" class="layui-btn icon-btn permissions" permissions="saveOrUpdate"><i class="layui-icon">&#xe654;</i>添加</button>
         </div>
 
         <!-- 数据表格 -->
-        <table class="layui-table" id="role-table" lay-filter="role-table"></table>
+        <table class="layui-hide" id="role-table" lay-filter="role-table"></table>
     </div>
 </div>
 
@@ -57,11 +57,55 @@
     </form>
 </script>
 
+<!-- 数据权限 表单弹窗 -->
+<script type="text/html" id="role-model-role">
+    <form id="role-form" lay-filter="role-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="name" placeholder="请输入角色名" type="text" class="layui-input" maxlength="20"
+                       lay-verify="required" required/>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">Code</label>
+            <div class="layui-input-block">
+                <input name="code" placeholder="请输入Code" 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">
+                <select  name="type" lay-filter="role_organization">
+                   <option value="">请选择权限</option> 
+                   <option value="1">全部数据权限</option> 
+                   <option value="2">自定义数据权限</option> 
+                   <option value="3">本部门数据权限</option> 
+                   <option value="4">本部门及以下数据权限</option> 
+                   <option value="5">仅本人数据权限</option> 
+                </select>
+            </div>
+        </div>
+        <div class="layui-form-item" id="tree">
+            <!-- <label class="layui-form-label">数据权限</label> -->
+            <!-- <div id="orgParentId-tree" class="demo-tree demo-tree-box"></div> -->
+            <ul id="treeMenu-role" class="ztree" style="padding: 25px 0px 20px 60px;"></ul>
+        </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="role-form-submit-role" lay-submit>保存</button>
+        </div>
+    </form>
+</script>
+
 <!-- 表格操作列 -->
 <script type="text/html" id="role-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>
-    <a class="layui-btn layui-btn-xs" lay-event="auth">权限分配</a>
+    <a class="layui-btn layui-btn-primary layui-btn-xs permissions" permissions="updateEnabled" lay-event="edit">修改</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs permissions" permissions="role-del" lay-event="del">删除</a>
+    <a class="layui-btn layui-btn-xs permissions" permissions="menus-granted" lay-event="auth">权限分配</a>
+    <a class="layui-btn layui-btn-xs permissions" permissions="sysroleorganization" lay-event="auth_role">分配数据权限</a>
 </script>
 
 <!-- 表格状态列 -->
@@ -71,7 +115,7 @@
 </script>
 
 <script>
-    layui.use(['form', 'table', 'util', 'config', 'admin', 'formSelects'], function () {
+    layui.use(['form', 'table', 'util', 'config', 'tree', 'admin', 'formSelects'], function () {
         var form = layui.form;
         var table = layui.table;
         var config = layui.config;
@@ -79,28 +123,36 @@
         var util = layui.util;
         var admin = layui.admin;
         var formSelects = layui.formSelects;
-        var clientsAll =null;
+        //树形插件
+        var tree = layui.tree;
+        var layer = layui.layer
+            , $ = layui.jquery;
+        //常量
+        var clientsAll = null;
 
         //渲染表格
         table.render({
             elem: '#role-table',
             url: config.base_server + 'api-user/roles',
-            headers:{'Authorization': 'Bearer ' + config.getToken().access_token},
+            headers: { 'Authorization': 'Bearer ' + config.getToken().access_token },
             page: true,
+            cellMinWidth: 80,
             cols: [[
-                {type: 'numbers'},
-                {field: 'id', sort: true, title: 'ID',width: 80},
-                {field: 'name', sort: true, title: '角色名'},
-                {field: 'code', sort: true, title: 'Code'},
-                {field: 'tenantId', sort: true, title: '应用标识'},
-                {
-                    field: 'createTime', sort: true, templet: function (d) {
-                        return util.toDateString(d.createTime);
-                    }, title: '创建时间'
-                },
-                {field: 'enabled', width: 100,sort: true, templet: '#role-tpl-state', title: '状态'},
-                {align: 'center', toolbar: '#role-table-bar', title: '操作',width: 250}
-            ]]
+                { field: 'name', sort: true, title: '角色名' },
+                { field: 'code', sort: true, title: 'Code' },
+                { field: 'tenantId', sort: true, title: '应用标识' },
+                // {
+                //     field: 'createTime', sort: true, templet: function (d) {
+                //         return util.toDateString(d.createTime);
+                //     }, title: '创建时间'
+                // },
+                { field: 'createTime', width: 250, sort: true, title: '创建时间', templet: "<div>{{layui.util.toDateString(d.createTime, 'yyyy/MM/dd HH:mm')}}</div>" },
+                { field: 'enabled', width: 100, sort: true, templet: '#role-tpl-state', title: '状态' },
+                { align: 'center', toolbar: '#role-table-bar', title: '操作', width: 320 }
+            ]],
+            done:function(res){
+                permissionsInput(res,config);
+            }
         });
 
         // 获取应用列表
@@ -109,8 +161,8 @@
             layer.closeAll('loading');
             if (0 === data.code) {
                 let selected = false;
-                clientsAll=data.data;
-                $.each(data.data,function(index,item){
+                clientsAll = data.data;
+                $.each(data.data, function (index, item) {
                     if (config.clientId === item.clientId) {
                         selected = true;
                     } else {
@@ -121,7 +173,7 @@
                 })
                 form.render();
             } else {
-                layer.msg(data.msg, {icon: 2, time: 500});
+                layer.msg(data.msg, { icon: 2, time: 2000 });
             }
         }, 'GET');
 
@@ -132,20 +184,47 @@
 
         // 表单提交事件
         form.on('submit(role-form-submit)', function (data) {
-            data.field.tenantId=$('#role_clients_add').val();
+            data.field.tenantId = $('#role_clients_add').val();
             let tenantId = $('#role_clients_add').val();
             layer.load(2);
-            admin.req('api-user/roles/saveOrUpdate?tenantId='+tenantId, JSON.stringify(data.field), function (data) {
+            admin.req('api-user/roles/saveOrUpdate?tenantId=' + tenantId, JSON.stringify(data.field), function (data) {
                 layer.closeAll('loading');
-                // console.log(data);
                 if (data.code === 0) {
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                    layer.msg(data.msg, { icon: 1, time: 2000 });
                     table.reload('role-table');
                     layer.closeAll('page');
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
                 }
             }, $('#role-form').attr('method'));
+            return false;
+        });
+        // 表单提交事件
+        form.on('submit(role-form-submit-role)', function (data) {
+            var array=new Array();
+            var treeObj = $.fn.zTree.getZTreeObj('treeMenu-role');
+            var nodes = treeObj.getCheckedNodes(true);
+            $.each(nodes,function(i,item){
+                if(!item.children){
+                    array.push(item.id);
+                }
+            })
+            if(array.length>0){
+                data.field.orgIds=array
+            }
+            data.field.roleId= data.field.id
+            layer.load(2);
+            admin.req('api-user/sysroleorganization', JSON.stringify(data.field), function (data) {
+                layer.closeAll('loading');
+                if (data.code === 0) {
+                    layer.msg(data.msg, { icon: 1, time: 2000 });
+                    table.reload('role-table');
+                    layer.closeAll('page');
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                }
+            }, $('#role-form').attr('method'));
+            layer.closeAll('page');
             return false;
         });
 
@@ -157,7 +236,9 @@
             } else if (obj.event === 'del') { //删除
                 doDelete(obj);
             } else if (obj.event === 'auth') {  // 权限分配
-                showMenuDialog(obj.data.id,obj.data.tenantId);
+                showMenuDialog(obj.data.id, obj.data.tenantId);
+            } else if (obj.event === 'auth_role') {
+                showEditModelRole(data);//分配数据权限
             }
         });
 
@@ -170,9 +251,9 @@
             }, function (data) {
                 layer.closeAll('loading');
                 if (data.code == 0) {
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                    layer.msg(data.msg, { icon: 1, time: 2000 });
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
                     $(obj.elem).prop('checked', !obj.elem.checked);
                     form.render('checkbox');
                 }
@@ -184,9 +265,37 @@
         $('#role-btn-search').click(function () {
             var key = $('#role-search-key').val();
             var value = $('#role-edit-value').val();
-            table.reload('role-table', {where: {searchKey: key, searchValue: value}});
+            table.reload('role-table', { where: { searchKey: key, searchValue: value } });
         });
 
+        var getData = function () {
+            admin.req('api-user/sysroleorganization/getTree', { is_del: 0 }, function (data) {
+                layer.closeAll('loading');
+                var data1 = [{
+                    name: '常用文件夹',
+                    id: 1,
+                    children: [
+                        { name: '所有未读', id: 11 },
+                        { name: '置顶邮件', id: 12 },
+                        { name: '标签邮件', id: 13 }]
+                }];
+                if (0 === data.code) {
+                    var setting = {
+                        check: { enable: true },
+                        data: {
+                            simpleData: {
+                                enable: true
+                            }
+                        }
+                    };
+                    $.fn.zTree.init($('#treeMenu-role'), setting, data.data);
+                    layer.closeAll('loading');
+
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                }
+            }, 'get');
+        }
         // 显示编辑弹窗
         var showEditModel = function (data) {
             layer.open({
@@ -199,10 +308,10 @@
                     $('#role-form')[0].reset();
                     $('#role-form').attr('method', 'POST');
                     if (data) {
-                        $("input[name='code']").attr('disabled',true);
-                        $("input[name='code']").attr('class',"layui-input layui-disabled");
+                        $("input[name='code']").attr('disabled', true);
+                        $("input[name='code']").attr('class', "layui-input layui-disabled");
                         let selected = false;
-                        $.each(clientsAll,function(index,item){
+                        $.each(clientsAll, function (index, item) {
                             if (data.tenantId === item.clientId) {
                                 selected = true;
                             } else {
@@ -211,37 +320,67 @@
                             //往下拉菜单里添加元素
                             $('#role_clients_add').append(new Option(item.clientName, item.clientId, false, selected));
                         })
-                        $('#role_clients_add').attr('disabled',true);
+                        $('#role_clients_add').attr('disabled', true);
                         form.render();
                         form.val('role-form', data);
                         $('#role-form').attr('method', 'POST');
                     }
-                    else{
-                        $.each(clientsAll,function(index,item){
+                    else {
+                        $.each(clientsAll, function (index, item) {
                             //往下拉菜单里添加元素
                             $('#role_clients_add').append(new Option(item.clientName, item.clientId));
                         })
-                        $('#role_clients_add').attr('disabled',false);
+                        $('#role_clients_add').attr('disabled', false);
                         form.render();
                         $('#role-form').attr('method', 'POST');
                     }
                 }
             });
         };
+        //数据权限的点击事件
+        form.on('select(role_organization)', function (data) {
+            if (data.value == 2) {
+                $("#tree").show();
+            }else{
+                $("#tree").hide();
+            }
+        });
+        // 显示分配数据权限弹窗
+        var showEditModelRole = function (data) {
+            layer.open({
+                type: 1,
+                title: "分配数据权限",
+                area: '450px',
+                offset: '120px',
+                content: $('#role-model-role').html(),
+                success: function () {
+                    $('#role-form')[0].reset();
+                    $('#role-form').attr('method', 'POST');
+                    if (data) {
+                        getData();
+                        if(data.type!=2){
+                            $("#tree").hide();
+                        }
+                        form.render();
+                        form.val('role-form', data);
+                    }
 
+                }
+            });
+        };
         // 删除
         var doDelete = function (obj) {
             layer.confirm('确定要删除吗?', function (i) {
                 let tenantId = $('#role_clients').val();
                 layer.close(i);
                 layer.load(2);
-                admin.req('api-user/roles/' + obj.data.id+'?tenantId='+tenantId, {}, function (data) {
+                admin.req('api-user/roles/' + obj.data.id + '?tenantId=' + tenantId, {}, function (data) {
                     layer.closeAll('loading');
                     if (data.code === 0) {
-                        layer.msg(data.msg, {icon: 1, time: 500});
+                        layer.msg(data.msg, { icon: 1, time: 2000 });
                         obj.del();
                     } else {
-                        layer.msg(data.msg, {icon: 2, time: 500});
+                        layer.msg(data.msg, { icon: 2, time: 2000 });
                     }
                 }, 'DELETE');
             });
@@ -249,7 +388,7 @@
 
 
         // 菜单管理
-        var showMenuDialog = function (roleId,tenantId) {
+        var showMenuDialog = function (roleId, tenantId) {
             // let tenantId = $('#role_clients').val();
             layer.open({
                 type: 1,
@@ -263,14 +402,14 @@
                     $(layero).children('.layui-layer-content').css('overflow-y', 'auto');
                     layer.load(2);
                     var setting = {
-                        check: {enable: true},
+                        check: { enable: true },
                         data: {
                             simpleData: {
                                 enable: true
                             }
                         }
                     };
-                    admin.req('api-user/menus/'+roleId+'/menus', {tenantId: tenantId}, function (data) {
+                    admin.req('api-user/menus/' + roleId + '/menus', { tenantId: tenantId }, function (data) {
                         if (data.code === 0) {
                             $.fn.zTree.init($('#treeMenu'), setting, data.data);
                             layer.closeAll('loading');
@@ -290,13 +429,13 @@
                     data.roleId = roleId;
                     data.menuIds = ids;
 
-                    admin.req('api-user/menus/granted?tenantId='+tenantId, JSON.stringify(data) , function (data) {
+                    admin.req('api-user/menus/granted?tenantId=' + tenantId, JSON.stringify(data), function (data) {
                         layer.closeAll('loading');
                         if (0 == data.code) {
-                            layer.msg(data.msg, {icon: 1, time: 500});
+                            layer.msg(data.msg, { icon: 1, time: 2000 });
                             layer.close(index);
                         } else {
-                            layer.msg(data.msg, {icon: 2, time: 500});
+                            layer.msg(data.msg, { icon: 2, time: 2000 });
                         }
                     }, 'POST');
                 }
@@ -304,8 +443,8 @@
         }
 
         // 应用下来框点击事件
-        form.on('select(role_clients)', function(data){
-            table.reload('role-table', {where: {tenantId: data.value}});
+        form.on('select(role_clients)', function (data) {
+            table.reload('role-table', { where: { tenantId: data.value } });
         });
     });
 
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..0e688d6
--- /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 permissions" permissions="save-area"><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 permissions" permissions="save-area" lay-event="edit">编辑</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs permissions" permissions="del-sysarea" 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',  width: "10%",align: 'center', title: '区域名称' },
+                    { field: 'areaCh',width: "10%",align: 'center', title: '拼音' },
+                    { field: 'areaShortname',width: "10%",align: 'center', title: '简称' },
+                    { field: 'areaCitycode',width: "10%",align: 'center', title: '区号' },
+                    { field: 'areaZipcode',width: "10%",align: 'center', title: '邮编' },
+                    { field: 'sort', width: "10%",align: 'center', title: '排序号' },
+                    {
+                        field: 'areaLeveltype', width: "10%",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: "10%",align: 'center', sort: true, templet: '#area-tpl-state', title: '状态' },
+                    { templet: '#area-table-bar', width: "10%",align: 'center', title: '操作' }
+                ]],
+                done: function (res) {
+                    layer.closeAll('loading');
+                    permissionsInput(res,config);
+                }
+            });
+        };
+        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: 2000 });
+                } else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
+                    $(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: 2000 });
+            } 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>
\ No newline at end of file
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..561187e
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/sysArea_form.html
@@ -0,0 +1,109 @@
+<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: 2000});
+                    admin.finishPopupCenter();
+                } else {
+                	layer.closeAll('loading');
+                    layer.msg(data.msg, {icon: 2, time: 2000});
+                }
+            }, $('#area-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/system/tokens.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/tokens.html
index f217537..da920ac 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/tokens.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/tokens.html
@@ -9,7 +9,7 @@
     <div class="layui-card-body">
         <div class="layui-form toolbar">
         所属应用:<select id="token_clients" lay-filter="token_clients"></select>
-        &emsp;搜索:<input id="tokens-edit-search" class="layui-input search-input" type="text" placeholder="输入用户名"/>&emsp;
+        &emsp;搜索:<input id="tokens-edit-search" class="layui-input search-input" type="text" placeholder="按用户名"/>&emsp;
         <button id="tokens-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
         </div>
 
@@ -20,7 +20,7 @@
 
 <!-- 表格操作列 -->
 <script type="text/html" id="tokens-table-bar">
-    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs permissions" permissions="token-del" lay-event="del">删除</a>
 </script>
 
 <script>
@@ -52,7 +52,10 @@
                 {field: 'grantType',width:180, sort: true, title: '授权类型'},
                 {field: 'clientId',width:180, sort: true, title: '所属应用'},
                 {align: 'center',width:100, toolbar: '#tokens-table-bar', title: '操作'}
-            ]]
+            ]],
+            done:function(res){
+                permissionsInput(res,config);
+            }
         });
 
         // 获取应用列表
@@ -72,7 +75,7 @@
                 })
                 form.render();
             } else {
-                layer.msg(data.msg, {icon: 2, time: 500});
+                layer.msg(data.msg, {icon: 2, time: 2000});
             }
         }, 'GET');
 
@@ -90,7 +93,7 @@
                 layer.load(2);
                 admin.req('api-uaa/oauth/remove/token?token=' + obj.data.tokenValue, {}, function (data) {
                     layer.closeAll('loading');
-                    layer.msg('成功', {icon: 1, time: 500});
+                    layer.msg('成功', {icon: 1, time: 2000});
                     obj.del();
                 }, 'DELETE');
             });
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/user.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/user.html
index 5337019..18cc3c8 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/user.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/user.html
@@ -2,8 +2,8 @@
     <div class="layui-card-header">
         <h2 class="header-title">用户管理</h2>
         <span class="layui-breadcrumb pull-right">
-          <a href="#!console">首页</a>
-          <a><cite>用户管理</cite></a>
+            <a href="#!console">首页</a>
+            <a><cite>用户管理</cite></a>
         </span>
     </div>
     <div class="layui-card-body">
@@ -11,18 +11,17 @@
             搜索:
             <select id="user-search-key">
                 <option value="">-请选择-</option>
-                <option value="user_id">ID</option>
                 <option value="username">账号</option>
                 <option value="nick_name">用户名</option>
                 <option value="mobile">手机号</option>
             </select>&emsp;
-            <input id="user-search-value" class="layui-input search-input" type="text" placeholder="输入关键字"/>&emsp;
-            <button id="user-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>
-            <button id="user-btn-export" class="layui-btn icon-btn"><i class="layui-icon">&#xe601;</i>导出</button>
-            <button type="button" class="layui-btn" id="user-btn-import">
-                <i class="layui-icon">&#xe67c;</i>导入
-            </button>
+            <input id="user-search-value" class="layui-input search-input" type="text" placeholder="按关键字" />&emsp;
+            <button id="user-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 permissions" permissions="user-btn-add">&#xe654;</i>添加</button>
+<!--            <button id="user-btn-export" class="layui-btn icon-btn"><i class="layui-icon permissions" permissions="user-btn-export">&#xe601;</i>导出</button>-->
+<!--            <button type="button" class="layui-btn" id="user-btn-import">-->
+<!--                <i class="layui-icon permissions" permissions="user-btn-import">&#xe67c;</i>导入 -->
+<!--            </button>-->
         </div>
 
         <table class="layui-table" id="user-table" lay-filter="user-table"></table>
@@ -32,9 +31,10 @@
 
 <!-- 表格操作列 -->
 <script type="text/html" id="user-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="reset">重置密码</a>
-    <a class="layui-btn layui-btn-xs" lay-event="del">删除</a>
+    <a class="layui-btn layui-btn-primary layui-btn-xs permissions" permissions="user-btn-add" lay-event="edit">修改</a>
+    <a class="layui-btn layui-btn-xs permissions" permissions="user-default-password" lay-event="reset">重置密码</a> 
+    <a class="layui-btn layui-btn-xs permissions" permissions="userorg-save" lay-event="org">分配组织</a>
+    <a class="layui-btn layui-btn-xs permissions" permissions="user-del" lay-event="del">删除</a>
 </script>
 
 <!-- 表格状态列 -->
@@ -59,25 +59,30 @@
             elem: '#user-table',
             url: config.base_server + 'api-user/users',
             method: 'GET',
-            headers:{'Authorization': 'Bearer ' + config.getToken().access_token},
+            headers: { 'Authorization': 'Bearer ' + config.getToken().access_token},
             page: true,
             cols: [[
-                {type: 'numbers'},
-                {field: 'id', sort: true, title: '用户编号'},
-                {field: 'username', sort: true, title: '账号'},
-                {field: 'nickname', sort: true, title: '用户名'},
-                {field: 'mobile', sort: true, title: '手机号'},
-                {sort: true, title: '性别',templet:function (d) {
-                        return d.sex==0?"男":"女"
-                    }},
+                { field: 'username',   width: "150",align: 'center', title: '账号' },
+                { field: 'nickname',   width: "150",align: 'center', title: '用户名' },
+                { field: 'mobile',   width: "150",align: 'center', title: '手机号' },
                 {
-                    sort: true, templet: function (d) {
-                        return util.toDateString(d.createTime);
-                    }, title: '创建时间'
+                    sort: true, width: "10%",align: 'center', title: '性别', templet: function (d) {
+                        var value="";
+                        if(d.sex == 0){
+                            value="男";
+                        }else if(d.sex == 1){
+                            value="女";
+                        }
+                        return value;
+                    }, width: 100
                 },
-                {field: 'enabled',width: 100, sort: true, templet: '#user-tpl-state', title: '状态'},
-                {fixed: 'right', align: 'center', toolbar: '#user-table-bar', title: '操作', width: 195}
-            ]]
+                { field: 'createTime',  width: "150",align: 'center', sort: true, title: '创建时间', templet: "<div>{{layui.util.toDateString(d.createTime, 'yyyy/MM/dd HH:mm')}}</div>" },
+                { field: 'enabled',  width: "10%",align: 'center',  templet: '#user-tpl-state', title: '状态' },
+                { fixed: 'right',  width: "10%",align: 'center', toolbar: '#user-table-bar', title: '操作', width: 300 }
+            ]],
+            done:function(res){
+                permissionsInput(res,config);
+            }
         });
 
         // 添加按钮点击事件
@@ -96,12 +101,13 @@
                 layer.confirm('确定重置此用户的密码吗?', function (i) {
                     layer.close(i);
                     layer.load(2);
-                    admin.req('api-user/users/'+obj.data.id+'/password', {}, function (data) {
+                    admin.req('api-user/users/' + obj.data.id + '/password', {}, function (data) {
                         layer.closeAll('loading');
                         if (data.code == 0) {
-                            layer.msg(data.msg, {icon: 1, time: 500});
+                            layer.msg(data.msg, { icon: 1, time: 2000 });
+                            layer.alert("密码重置为:"+data.data, {icon: 1});
                         } else {
-                            layer.msg(data.msg, {icon: 2, time: 500});
+                            layer.msg(data.msg, { icon: 2, time: 2000 });
                         }
                     }, 'PUT');
                 });
@@ -109,15 +115,23 @@
                 layer.confirm('确定删除此用户吗?', function (i) {
                     layer.close(i);
                     layer.load(2);
-                    admin.req('api-user/users/'+obj.data.id, {}, function (data) {
+                    admin.req('api-user/users/' + obj.data.id, {}, function (data) {
                         layer.closeAll('loading');
                         if (data.code == 0) {
-                            layer.msg(data.msg, {icon: 1, time: 500});
+                            layer.msg(data.msg, { icon: 1, time: 2000 });
                             table.reload('user-table', {});
                         } else {
-                            layer.msg(data.msg, {icon: 2, time: 500});
+                            layer.msg(data.msg, { icon: 2, time: 2000 });
                         }
                     }, 'delete');
+                });
+            } else if (layEvent === "org") {
+            admin.putTempData('t_user', data);
+                admin.popupCenter({
+                    title: "分配组织",
+                    path: 'pages/system/user_org_form.html',
+                    finish: function () {
+                    }
                 });
             }
         });
@@ -125,8 +139,8 @@
         //显示表单弹窗
         var showEditModel = function (data) {
             //修改sex值
-            if (data){
-                data.sex = data.sex+'';
+            if (data) {
+                data.sex = data.sex + '';
             }
             admin.putTempData('t_user', data);
             var title = data ? '修改用户' : '添加用户';
@@ -143,7 +157,7 @@
         $('#user-btn-search').click(function () {
             var key = $('#user-search-key').val();
             var value = $('#user-search-value').val();
-            table.reload('user-table', {where: {searchKey: key, searchValue: value}});
+            table.reload('user-table', { where: { searchKey: key, searchValue: value } });
         });
 
         // 导出
@@ -154,7 +168,7 @@
             xhr.responseType = "blob";
             xhr.setRequestHeader("client_type", "DESKTOP_WEB");
             xhr.setRequestHeader("Authorization", "Bearer " + config.getToken().access_token);
-            xhr.onload = function() {
+            xhr.onload = function () {
                 if (this.status == 200) {
                     var fileName = "user.xlsx";
                     var blob = this.response;
@@ -182,10 +196,10 @@
             }, function (data) {
                 layer.closeAll('loading');
                 if (data.code == 0) {
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                    layer.msg(data.msg, { icon: 1, time: 2000 });
                     //table.reload('table-user', {});
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
                     $(obj.elem).prop('checked', !obj.elem.checked);
                     form.render('checkbox');
                 }
@@ -196,16 +210,16 @@
         var importUrl = config.base_server + 'api-user/users/import';
         upload.render({
             elem: '#user-btn-import'
-            ,url: importUrl
-            ,accept: 'file' //普通文件
-            ,multiple: false
-            ,headers: {"Authorization" : "Bearer " + config.getToken().access_token}
-            ,done: function(data){
+            , url: importUrl
+            , accept: 'file' //普通文件
+            , multiple: false
+            , headers: { "Authorization": "Bearer " + config.getToken().access_token }
+            , done: function (data) {
                 if (data.code == 0) {
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                    layer.msg(data.msg, { icon: 1, time: 2000 });
                     table.reload('user-table', {});
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, { icon: 2, time: 2000 });
                 }
             }
         });
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/user_form.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/user_form.html
index fd9033b..83b3eba 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/user_form.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/user_form.html
@@ -1,10 +1,11 @@
 <!-- user表单弹窗 -->
 <form id="user-form" lay-filter="user-form" class="layui-form model-form">
     <input name="id" type="hidden"/>
+    <input name="type" type="hidden" value="BACKEND"/>
     <div class="layui-form-item">
         <label class="layui-form-label">账号</label>
         <div class="layui-input-block">
-            <input name="username" placeholder="请输入账号" type="text" class="layui-input" maxlength="20"
+            <input id="username" name="username" placeholder="请输入账号" type="text" class="layui-input" maxlength="20"
                    lay-verify="required" required/>
         </div>
     </div>
@@ -18,7 +19,7 @@
     <div class="layui-form-item">
         <label class="layui-form-label">手机号</label>
         <div class="layui-input-block">
-            <input name="mobile" placeholder="请输入手机号" type="text" class="layui-input" lay-verify="required|mobile"
+            <input id="mobile" name="mobile" placeholder="请输入手机号" type="text" class="layui-input" lay-verify="required|mobile"
                    required/>
         </div>
     </div>
@@ -53,7 +54,7 @@
 
         // 获取所有角色
         layer.load(2);
-        admin.req('api-user/allRoles', {}, function (data) {
+        admin.req('api-user/findByMap', {}, function (data) {
             layer.closeAll('loading');
             if (0 == data.code) {
                 // 渲染多选下拉框
@@ -65,11 +66,12 @@
 
                 // 回显user数据
                 var user = admin.getTempData('t_user');
-                console.log(user);
                 $('#user-form').attr('method', 'POST');
                 if (user) {
                     form.val('user-form', user);
                     $('#user-form').attr('method', 'POST');
+                    $("#mobile").prop("disabled",true)
+                    $("#username").prop("disabled",true)
                     var rds = new Array();
                     for (var i = 0; i < user.roles.length; i++) {
                         rds.push(user.roles[i].id);
@@ -77,23 +79,66 @@
                     formSelects.value('roleId', rds);
                 }
             } else {
-                layer.msg('获取角色失败', {icon: 2, time: 500});
+                layer.msg('获取角色失败', {icon: 2, time: 2000});
             }
         }, 'GET');
 
         // 表单提交事件
         form.on('submit(user-form-submit)', function (data) {
             layer.load(2);
+           var datadto= data.field
             admin.req('api-user/users/saveOrUpdate', JSON.stringify(data.field), function (data) {
                 layer.closeAll('loading');
-                if (data.code == 0) {
-                    layer.msg(data.msg, {icon: 1, time: 500});
+                if (data.code == 0) { 
+                    if(datadto.id==null||datadto.id==''){
+                        layer.alert("用户添加成功,默认密码为:"+data.data.password);
+                    }
                     admin.finishPopupCenter();
                 } else {
-                    layer.msg(data.msg, {icon: 2, time: 500});
+                    layer.msg(data.msg, {icon: 2, time: 2000});
                 }
             }, "POST");
             return false;
         });
+        //判断用户名是否被使用
+        var username_is_usered = function (username_id) {
+            var username = $("#" + username_id).val()
+            admin.req('api-user/users/findCountByMap', JSON.stringify({
+                username: username
+            }), function (data) {
+                if (data.code == 0) {
+                    if (data.data > 0) {
+                        $("#" + username_id).val("")
+                        layer.msg("该手机号已经使用", {
+                            icon: 2,
+                            time: 2000
+                        })
+                    }
+                } else {
+                    layer.msg(data.msg, {
+                        icon: 2,
+                        time: 2000
+                    });
+                }
+            }, 'post');
+        }
+        /*
+        * 验证手机号码
+        */
+        function validatorTel(content) {
+            // 正则验证格式
+            eval("var reg = /^1[34578]\\d{9}$/;");
+            var flag = RegExp(reg).test(content)
+            return flag;
+        }
+        //验证手机号是否被使用
+        $("#mobile").blur(function () {
+            let mobile=$("#mobile").val()
+            if (!validatorTel(mobile)) {
+                layer.msg("请输入正确的手机号");
+            } else {
+                username_is_usered("mobile");
+            }
+        })
     });
 </script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/user_org_form.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/user_org_form.html
new file mode 100644
index 0000000..c293bf3
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/system/user_org_form.html
@@ -0,0 +1,164 @@
+<!-- user表单弹窗 -->
+<form id="user-org-form" lay-filter="user-org-form" class="layui-form model-form">
+    <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="20" lay-verify="required" required
+                readonly />
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">用户名</label>
+        <div class="layui-input-block">
+            <input name="nickname" type="text" class="layui-input" maxlength="20" lay-verify="required" required
+                readonly />
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">组织</label>
+        <div class="layui-input-block">
+            <div id="org-tree" class="demo-tree demo-tree-box" style="max-height: 300px; overflow-y:scroll;"></div>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">选定组织</label>
+        <div class="layui-input-block">
+            <input name="orgName" id="orgName" type="text" class="layui-input" maxlength="20" lay-verify="required"
+                required readonly />
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">状态</label>
+        <div class="layui-input-block">
+            <input type="radio" name="enabled" value="1" title="启用" />
+            <input type="radio" name="enabled" value="0" title="禁用" />
+        </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="user-org-form-submit" lay-submit>保存</button>
+    </div>
+    <input name="id" id="id" type="hidden" />
+    <input name="orgId" id="orgId" type="hidden" />
+    <input name="userId" id="userId" type="hidden" />
+    <input name="updateUserId" id="updateUserId" type="hidden" />
+</form>
+
+<script>
+    layui.use(['layer', 'admin', 'form', "tree", 'table', 'config', 'formSelects'], function () {
+        var table = layui.table;
+        var config = layui.config;
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var formSelects = layui.formSelects;
+        var tree = layui.tree;
+
+        // 回显user数据
+        var user = admin.getTempData('t_user');
+        $('#user-org-form').attr('method', 'POST');
+        if (user) {
+            form.val('user-org-form', user);
+            $("#id").val("");
+            $("#userId").val(user.id);
+            admin.req('api-user/sysuserorg', { user_id: user.id }, function (data) {
+                if (data.code == 0) {
+                    if (data.data.length > 1) {
+                        let useData = data.data[1];
+                        $("#orgId").val(useData.orgId);
+                        $("#userId").val(useData.userId);
+                        $("#id").val(useData.id);
+                        if (useData.enabled) {
+                            $('input[name="enabled"][value="0"]').removeAttr("checked");
+                            $('input[name="enabled"][value="1"]').attr("checked", "true");
+                        }
+                        else {
+                            $('input[name="enabled"][value="1"]').removeAttr("checked");
+                            $('input[name="enabled"][value="0"]').attr("checked", "true");
+                        }
+                        admin.req('api-user/sysorganization/' + useData.orgId, {}, function (dataName) {
+                            if (dataName.code == 0) {
+                                if (dataName.data != null) {
+                                    $("#orgName").val(dataName.data.orgName);
+                                }
+                                else {
+
+                                    layer.msg("当前组织数据获取失败!", { icon: 2, time: 1000 });
+                                }
+                            }
+                            else {
+                                layer.msg(data.msg, { icon: 2, time: 1000 });
+                            }
+                        }, 'get')
+                    }
+                    else {
+                        $("#userId").val(user.id);
+                        $("#id").val("");
+                        $('input[name="enabled"][value="1"]').attr("checked", "true");
+                        $('input[name="enabled"][value="0"]').removeAttr("checked");
+                    }
+                }
+                else {
+                    layer.msg(data.msg, { icon: 2, time: 2000 }, function () {
+                        admin.finishPopupCenter();
+                    });
+                }
+                
+                form.render();
+            }, 'get');
+        }
+        else {
+            layer.msg('数据异常,请重新打开!', { icon: 2, time: 2000 }, function () {
+                admin.finishPopupCenter();
+            });
+        }
+
+        //组织结构树
+        admin.req('api-user/sysorganization/getTree', { is_del: 0, enabled: 1 }, function (data) {
+            if (0 === data.code) {
+                tree({
+                    elem: "#org-tree",
+                    nodes: data.data,
+                    click: function (node) {
+                        //将数据赋值
+                        if (node.level == 2) {
+                            $("#orgId").val(node.id);
+                            $("#orgName").val(node.name);
+                            $("#updateUserId").val(node.parentId);
+                        }
+                    }
+                });
+            } else {
+                layer.msg(data.msg, { icon: 2, time: 1000 });
+            }
+        }, 'get');
+
+        // 表单提交事件
+        form.on('submit(user-org-form-submit)', function (data) {
+            layer.load(2);
+            if (!strUtil.isEmpty($("#orgId").val())) {
+                if (data.field != null) {
+                    data.field.enabled = (data.field.enabled == 0) ? false : true;
+                    data.field.fromId=0;
+                    admin.req('api-user/sysuserorg', JSON.stringify(data.field), function (data) {
+                        layer.closeAll('loading');
+                        if (data.code == 0) {
+                            layer.msg(data.msg, { icon: 1, time: 1000 });
+                            admin.finishPopupCenter();
+                        } else {
+                            layer.msg(data.msg, { icon: 2, time: 1000 });
+                        }
+                    }, "POST");
+                }
+                else {
+                    layer.msg("数据异常!", { icon: 2, time: 1000 });
+                }
+            }
+            else {
+                layer.msg("请点击选择一个组织的部门节点!", { icon: 2, time: 1000 });
+            }
+
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/tpl/iframe.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/tpl/iframe.html
index 8d6c264..37f03fa 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/tpl/iframe.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/tpl/iframe.html
@@ -5,9 +5,6 @@
         var config = layui.config;
         var admin = layui.admin;
         var html = admin.getTempData("params");
-        console.log(html);
-        console.log($('iframe:last'));
-
         if (!$('iframe:last').attr("src")){
             $('iframe:last').attr("src",html);
         }
diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/tpl/password.html b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/tpl/password.html
index 177d65f..067fe30 100644
--- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/tpl/password.html
+++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/tpl/password.html
@@ -21,7 +21,7 @@
         </div>
     </form>
 </div>
-
+<script type="text/javascript" src="../../module/aes.js"></script>
 <script>
     layui.use(['layer','form', 'admin','config'], function () {
         var form = layui.form;
@@ -29,12 +29,14 @@
         var config = layui.config;
         var layer = layui.layer;
         var user = config.getUser();
-        console.log(user.id);
         $("#id").val(user.id);
         //监听提交
         form.on('submit(submit-psw)', function (data) {
 
             layer.load(2);
+            data.field.oldPassword=getAesString(data.field.oldPassword)
+            data.field.newPassword=getAesString(data.field.newPassword)
+            data.field.rePassword=getAesString(data.field.rePassword)
             admin.req('api-user/users/password',JSON.stringify(data.field), function (data) {
                 layer.closeAll('loading');
                 if (data.code == 0) {
diff --git a/kidgrow-web/kidgrow-web-sso/Dockerfile b/kidgrow-web/kidgrow-web-sso/Dockerfile
new file mode 100644
index 0000000..fef5f1e
--- /dev/null
+++ b/kidgrow-web/kidgrow-web-sso/Dockerfile
@@ -0,0 +1,14 @@
+# 基础镜像
+FROM openjdk:8-jdk-alpine
+# 作者(可选)
+MAINTAINER kidgrow
+# 删除无用组件 优化容器体积(可选)
+RUN rm -rf /var/lib/apt/lists/*
+# 创建jar包存放目录
+RUN mkdir -p /usr/local/kidgrow
+# 获取pom文件中build参数
+ARG JAR_FILE
+# copy当前工程jar包至容器内
+COPY ${JAR_FILE} /usr/local/kidgrow/app.jar
+# 运行jar包
+ENTRYPOINT ["java","-jar","/usr/local/kidgrow/app.jar"]
\ No newline at end of file
diff --git a/kidgrow-web/kidgrow-web-sso/pom.xml b/kidgrow-web/kidgrow-web-sso/pom.xml
index e5d9970..c444ed5 100644
--- a/kidgrow-web/kidgrow-web-sso/pom.xml
+++ b/kidgrow-web/kidgrow-web-sso/pom.xml
@@ -58,6 +58,21 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <!-- Dockerfile目录指定 -->
+                    <dockerfile>Dockerfile</dockerfile>
+                    <repository>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</repository>
+                    <!-- 生成镜像标签 如不指定 默认为latest -->
+                    <tag>1.0.1</tag>
+                    <!--<tag>${project.version}</tag>-->
+                    <buildArgs>
+                        <JAR_FILE>./target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 6fb9366..e4e0d40 100644
--- a/pom.xml
+++ b/pom.xml
@@ -43,7 +43,8 @@
         <spring-cloud-dependencies.version>Greenwich.SR5</spring-cloud-dependencies.version>
         <spring-boot-dependencies.version>2.1.12.RELEASE</spring-boot-dependencies.version>
         <spring-boot-maven-plugin.version>2.1.12.RELEASE</spring-boot-maven-plugin.version>
-        <mysql-connector-java.version>5.1.38</mysql-connector-java.version>
+<!--        <mysql-connector-java.version>5.1.38</mysql-connector-java.version>-->
+        <mysql-connector-java.version>8.0.13</mysql-connector-java.version>
         <aliyun-sdk-oss>3.4.2</aliyun-sdk-oss>
         <qiniu-java-sdk>7.2.18</qiniu-java-sdk>
         <fastdfs-client.version>1.26.7</fastdfs-client.version>
@@ -58,7 +59,7 @@
         <swagger.mg.ui.version>1.0.6</swagger.mg.ui.version>
         <swagger.butler.version>2.0.1</swagger.butler.version>
         <commons-collections4.version>4.4</commons-collections4.version>
-        <fastjson.version>1.2.62</fastjson.version>
+        <fastjson.version>1.2.70</fastjson.version>
         <httpclient.version>4.5.6</httpclient.version>
         <modle-mapper.version>2.3.4</modle-mapper.version>
         <security-oauth2.version>2.4.0.RELEASE</security-oauth2.version>
@@ -73,7 +74,7 @@
         <easyCaptcha.version>1.6.2</easyCaptcha.version>
         <userAgent.version>1.21</userAgent.version>
         <oauth2-resource.version>5.1.7.RELEASE</oauth2-resource.version>
-        <docker-maven-plugin.version>1.2.2</docker-maven-plugin.version>
+        <docker-maven-plugin.version>1.4.10</docker-maven-plugin.version>
         <velocity.version>1.7</velocity.version>
         <commons-configuration2.version>2.6</commons-configuration2.version>
         <txlcn.version>5.0.2.RELEASE</txlcn.version>
@@ -84,7 +85,15 @@
         <javax.activatio.version>1.1.1</javax.activatio.version>
         <jaxb-runtime.version>2.3.0</jaxb-runtime.version>
         <jaxb-impl.version>2.3.0</jaxb-impl.version>
+        <zuul-ratelimit.version>2.0.4.RELEASE</zuul-ratelimit.version>
         <sonar.exclusions>kidgrow-jobs/**/* kidgrow-web/**/*</sonar.exclusions>
+        <docker.baseImage>openjdk:8-jre-alpine</docker.baseImage>
+        <docker.volumes>/tmp</docker.volumes>
+        <docker.image.prefix>kidgrow</docker.image.prefix>
+        <!--docker harbor地址-->
+        <docker.repostory>182.92.99.224:8081</docker.repostory>
+        <com.belerweb.pinyin4j.version>2.5.1</com.belerweb.pinyin4j.version>
+        <net.coobird.thumbnailator.version>0.4.11</net.coobird.thumbnailator.version>
     </properties>
 
     <dependencies>
@@ -149,11 +158,42 @@
             <version>${javax.activatio.version}</version>
         </dependency>
         <!-- jaxb模块引用 - end -->
+        <dependency>
+            <groupId>com.belerweb</groupId>
+            <artifactId>pinyin4j</artifactId>
+            <version>${com.belerweb.pinyin4j.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>${net.coobird.thumbnailator.version}</version>
+        </dependency>
+
     </dependencies>
 
     <dependencyManagement>
         <dependencies>
             <!-- 自定义 starter -->
+            <dependency>
+                <groupId>com.kidgrow</groupId>
+                <artifactId>kidgrow-plugin-sms-center-server</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.kidgrow</groupId>
+                <artifactId>kidgrow-plugin-sms-biz</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.kidgrow</groupId>
+                <artifactId>kidgrow-plugin-sms-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.kidgrow</groupId>
+                <artifactId>kidgrow-plugin-sms</artifactId>
+                <version>${project.version}</version>
+            </dependency>
             <dependency>
                 <groupId>com.kidgrow</groupId>
                 <artifactId>kidgrow-config</artifactId>
@@ -221,6 +261,21 @@
             </dependency>
             <dependency>
                 <groupId>com.kidgrow</groupId>
+                <artifactId>kidgrow-opration-center-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.kidgrow</groupId>
+                <artifactId>kidgrow-opration-center-biz</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.kidgrow</groupId>
+                <artifactId>kidgrow-opration-center-server</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.kidgrow</groupId>
                 <artifactId>kidgrow-uaa-api</artifactId>
                 <version>${project.version}</version>
             </dependency>
@@ -248,6 +303,11 @@
             <dependency>
                 <groupId>com.kidgrow</groupId>
                 <artifactId>kidgrow-searchcenter-server</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.kidgrow</groupId>
+                <artifactId>kidgrow-rabbitmq-spring-boot-starter</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
@@ -338,6 +398,12 @@
                 <groupId>com.baomidou</groupId>
                 <artifactId>mybatis-plus</artifactId>
                 <version>${mybatis-plus-boot-starter.version}</version>
+            </dependency>
+            <!--网关限流插件-->
+            <dependency>
+                <groupId>com.marcosbarbero.cloud</groupId>
+                <artifactId>spring-cloud-zuul-ratelimit</artifactId>
+                <version>${zuul-ratelimit.version}</version>
             </dependency>
             <dependency>
                 <groupId>p6spy</groupId>
@@ -546,7 +612,7 @@
                 </plugin>
                 <plugin>
                     <groupId>com.spotify</groupId>
-                    <artifactId>docker-maven-plugin</artifactId>
+                    <artifactId>dockerfile-maven-plugin</artifactId>
                     <version>${docker-maven-plugin.version}</version>
                 </plugin>
             </plugins>

--
Gitblit v1.8.0