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 >= #{p.startTime} + </if> + <if test="p.endTime!= null and p.endTime !=''"> + and create_time <= #{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 >= #{p.needBegintime} + </if> + <if test="p.needEndtime != null and p.needEndtime !=''"> + and need_endtime <= #{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 >= #{p.startTime} + </if> + <if test="p.endTime!= null and p.endTime !=''"> + and DE.create_time <= #{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() >= pod.pro_begintime + AND NOW() <=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 <=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 >= #{p.startTime} + </if> + <if test="p.endTime!= null and p.endTime !=''"> + and DE.create_time <= #{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() >= pod.pro_begintime + AND NOW() <=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": "WPF", + "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"></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="输入关键字"/>  <button id="app-btn-search" class="layui-btn icon-btn"><i class="layui-icon"></i>搜索</button> - <button id="app-btn-add" class="layui-btn icon-btn"><i class="layui-icon"></i>添加</button> + <button id="app-btn-add" class="layui-btn icon-btn permissions" permissions="saveOrUpdate"><i class="layui-icon"></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="按内容模糊查找" />  + <input type="text" class="layui-input search-input" id="test1" placeholder="开始时间"> 至 <input type="text" + class="layui-input search-input" id="test2" placeholder="结束时间">   + <button id="app-btn-search" class="layui-btn icon-btn"><i class="layui-icon"></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="按公司名称" />  + <button id="app-btn-search" class="layui-btn icon-btn"><i class="layui-icon"></i>搜索</button> + <button id="user-btn-add" class="layui-btn icon-btn permissions" permissions="syscompany-edit"><i class="layui-icon"></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"></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;">  + <input id="hospital-search-value" class="layui-input search-input" type="text" placeholder="按医院名" autocomplete="off" width="400px" /></div>  + <button id="contract-btn-search" class="layui-btn icon-btn permissions" permissions="contract-list" style="margin-bottom: -25px;"><i class="layui-icon"></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="按医生姓名" />  + <input type="text" class="layui-input search-input" id="test1" placeholder="开始时间" > 至 <input type="text" + class="layui-input search-input" id="test2" placeholder="结束时间" >   + <button id="app-btn-search" class="layui-btn icon-btn permissions" permissions="diagnostic-get"><i class="layui-icon"></i>搜索</button> + <!-- <button id="app-btn-add" class="layui-btn icon-btn"><i class="layui-icon"></i>添加</button> --> + <button id="app-btn-export" class="layui-btn icon-btn permissions" permissions="dataneed-export"><i class="layui-icon"></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"></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')}} 至 {{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">  + <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="结束时间">   + </div> + <div class="layui-col-sm2"> + <input id="product-search-value" class="layui-input search-input" type="text" placeholder="按产品名" />  + </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"> +  <button id="product-btn-search" class="layui-btn icon-btn"><i class="layui-icon"></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" /> 至  + <input type="text" name="date" id="dateend" lay-verify="date" autocomplete="off" + class="layui-input search-input" />  + <input id="childName" class="layui-input search-input" type="text" placeholder="按患者名" />  + <input id="diagnosticDoctorName" class="layui-input search-input" type="text" + placeholder="按诊断医生名" />  + <input id="hospitalName" class="layui-input search-input" type="text" placeholder="按医院名,必选条件!" + autocomplete="off" /></div>  + <button id="diagnostic-btn-search" class="layui-btn icon-btn permissions" permissions="diagnostic-get"> + <i class="layui-icon"></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="按手机号" />  + <input id="doctorName" class="layui-input search-input" type="text" placeholder="按医生名" />  + <select id="doctorState" lay-filter="role_clients"> + <option value="">-医院状态-</option> + <option value="1">正常</option> + <option value="0">试用</option> + </select>  + <input name="hospitalName" id="hospitalName-seach" placeholder="按医院名称" type="text" + class="layui-input search-input" maxlength="50" autocomplete="off" />  + </div> + <button id="app-btn-search" class="layui-btn icon-btn permissions" layt="abc" + permissions="sysdoctor-list"><i class="layui-icon"></i>搜索</button> + <button id="doctor-btn-add" class="layui-btn icon-btn permissions" permissions="sysdoctor-edit"><i + class="layui-icon"></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"></i>搜索</button> + <button id="docto-templete-btn-add" class="layui-btn icon-btn permissions" permissions="doctortemplete-edit"><i class="layui-icon"></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"></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">  + <input id="user-search-value" class="layui-input search-input" type="text" placeholder="按医生姓名" />  + <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">   + <button id="user-btn-search" class="layui-btn icon-btn permissioins" permissioins="feedback-list"><i class="layui-icon"></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">  + <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">   + <button id="product-btn-search" class="layui-btn icon-btn"><i class="layui-icon"></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> +   + <!-- <select id="isanswer" placeholder="选择医答状态" lay-filter="isanswer"> + <option value="">-是否医答-</option> + <option value="1">-是-</option> + <option value="0">-否-</option> + </select> +   + <select id="hospitalstate" placeholder="选择医院状态" lay-filter="hospitalstate"> + <option value="">-医院状态-</option> + <option value="0">试用</option> + <option value="1">正式</option> + </select> --> +   + <input id="hosName" class="layui-input search-input" type="text" placeholder="按医院名" />  + <button id="hospita-btn-search" class="layui-btn icon-btn"><i class="layui-icon permissions" + permissions="hospital-get"></i>搜索</button>  + <button id="hospital-btn-add" class="layui-btn icon-btn"><i class="layui-icon permissions" + permissions="hospital-save"></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;" /> +  </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">  + <input id="product-search-value" class="layui-input search-input" type="text" placeholder="按产品名" />  + <button id="product-btn-search" class="layui-btn icon-btn"><i class="layui-icon permissions" + permissions="product-list"></i>搜索</button> + <button id="product-btn-add" class="layui-btn icon-btn permissions" permissions="product-edit"><i + class="layui-icon"></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">  + <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="结束时间">   + </div> + <div class="layui-col-sm2"> + <input id="product-search-value" class="layui-input search-input" type="text" placeholder="按产品名" />  + </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"> +  <button id="product-btn-search" class="layui-btn icon-btn"><i class="layui-icon"></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="按名称" />  + <button id="app-btn-search" class="layui-btn icon-btn permissions" permissions="sysorganization-list"><i class="layui-icon"></i>搜索</button> + <!-- <button id="organization-add" class="layui-btn icon-btn permissions" permissions="sysorganization-edit"><i class="layui-icon"></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="按名称" />  + <button id="app-btn-search" class="layui-btn icon-btn permissions" permissions="sysdictionaries-list"><i class="layui-icon"></i>搜索</button> + <button id="user-btn-add" class="layui-btn icon-btn permissions" permissions="sysdictionaries-edit"><i class="layui-icon"></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">  + <input id="product-search-value" class="layui-input search-input" type="text" placeholder="按产品名" />  + <input id="hospital-search-value" class="layui-input search-input" type="text" placeholder="按医院名" />  + <button id="product-btn-search" class="layui-btn icon-btn permissions" permissions="updateEnabled-detail"><i class="layui-icon"></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> -  搜索:<input id="menus-edit-search" class="layui-input search-input" type="text" placeholder="输入关键字"/>  +  搜索:<input id="menus-edit-search" class="layui-input search-input" type="text" + placeholder="按关键字" />  <button id="menus-btn-search" class="layui-btn icon-btn"><i class="layui-icon"></i>搜索</button> - <button id="menus-btn-add" class="layui-btn icon-btn"><i class="layui-icon"></i>添加</button> + <button id="menus-btn-add" class="layui-btn icon-btn permissions" permissions="saveOrUpdate"><i class="layui-icon"></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>  - <input id="role-edit-value" class="layui-input search-input" type="text" placeholder="输入关键字"/>  + <input id="role-edit-value" class="layui-input search-input" type="text" placeholder="按关键字" />  <button id="role-btn-search" class="layui-btn icon-btn"><i class="layui-icon"></i>搜索</button> - <button id="role-btn-add" class="layui-btn icon-btn"><i class="layui-icon"></i>添加</button> + <button id="role-btn-add" class="layui-btn icon-btn permissions" permissions="saveOrUpdate"><i class="layui-icon"></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">  + <input id="area-search-value" class="layui-input search-input" type="text" placeholder="按地区名称" />  + <button id="area-btn-search" class="layui-btn icon-btn"><i class="layui-icon"></i>搜索</button> + <button id="area-btn-add" class="layui-btn icon-btn permissions" permissions="save-area"><i class="layui-icon"></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> -  搜索:<input id="tokens-edit-search" class="layui-input search-input" type="text" placeholder="输入用户名"/>  +  搜索:<input id="tokens-edit-search" class="layui-input search-input" type="text" placeholder="按用户名"/>  <button id="tokens-btn-search" class="layui-btn icon-btn"><i class="layui-icon"></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>  - <input id="user-search-value" class="layui-input search-input" type="text" placeholder="输入关键字"/>  - <button id="user-btn-search" class="layui-btn icon-btn"><i class="layui-icon"></i>搜索</button> - <button id="user-btn-add" class="layui-btn icon-btn"><i class="layui-icon"></i>添加</button> - <button id="user-btn-export" class="layui-btn icon-btn"><i class="layui-icon"></i>导出</button> - <button type="button" class="layui-btn" id="user-btn-import"> - <i class="layui-icon"></i>导入 - </button> + <input id="user-search-value" class="layui-input search-input" type="text" placeholder="按关键字" />  + <button id="user-btn-search" class="layui-btn icon-btn"><i class="layui-icon" ></i>搜索</button> + <button id="user-btn-add" class="layui-btn icon-btn"><i class="layui-icon permissions" permissions="user-btn-add"></i>添加</button> +<!-- <button id="user-btn-export" class="layui-btn icon-btn"><i class="layui-icon permissions" permissions="user-btn-export"></i>导出</button>--> +<!-- <button type="button" class="layui-btn" id="user-btn-import">--> +<!-- <i class="layui-icon permissions" permissions="user-btn-import"></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