XiaoRuby
2023-08-07 d8a687741273d121586b83745280c57f7e9d3297
Merge branch 'master' of https://gitee.com/yuanchu_code/lims-management-system

# Conflicts:
# .gitignore
已修改1个文件
已添加165个文件
10382 ■■■■■ 文件已修改
.gitignore 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/pom.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/config/DruidConfig.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/config/MyCorsConfig.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/config/Swagger3.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/config/WebMvcConfig.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/exception/MyFileException.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/handler/GlobalExceptionHandler.java 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyBaseMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyBatisPlusConfig.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyMetaObjectHandler.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MySqlInjector.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/utils/FileSaveUtil.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/utils/JackSonUtil.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/utils/MyUtil.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/utils/RedisUtil.java 622 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/utils/SpringUtil.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/com/yuanchu/limslaboratory/vo/Result.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/pom.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionController.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionMaterialController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionProductController.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/LinkBasicInformationController.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/LinkDetectionController.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/RawMaterialController.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionMapper.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionMaterialMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionProductMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/LinkBasicInformationMapper.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/LinkDetectionMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/RawMaterialMapper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/Inspection.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/InspectionMaterial.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/InspectionProduct.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/LinkBasicInformation.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/LinkDetection.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/RawMaterial.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InsProductVo.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InspectDetailVo.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InspectionVo.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionMaterialService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionProductService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionService.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/LinkBasicInformationService.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/LinkDetectionService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/RawMaterialService.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionMaterialServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionProductServiceImpl.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionServiceImpl.java 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/LinkBasicInformationServiceImpl.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/LinkDetectionServiceImpl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/RawMaterialServiceImpl.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/resources/mapper/InspectionMapper.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/resources/mapper/InspectionMaterialMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/resources/mapper/InspectionProductMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/resources/mapper/LinkBasicInformationMapper.xml 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/resources/mapper/LinkDetectionMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspection-server/src/main/resources/mapper/RawMaterialMapper.xml 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/pom.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/ClassifyController.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/EquipmentPointController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/InstrumentController.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/MeteringPlanController.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/MetricalInformationController.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/ClassifyMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/EquipmentPointMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/InstrumentMapper.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/MeteringPlanMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/MetricalInformationMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/Classify.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/EquipmentPoint.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/Instrument.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/MeteringPlan.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/MetricalInformation.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateClassifyDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateEquipmentPointDto.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateInstrumentDto.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateMetricalInformationDto.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/ClassifyService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/EquipmentPointService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/InstrumentService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/MeteringPlanService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/MetricalInformationService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/ClassifyServiceImpl.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/EquipmentPointServiceImpl.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InstrumentServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MeteringPlanServiceImpl.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MetricalInformationServiceImpl.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/resources/mapper/ClassifyMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/resources/mapper/EquipmentPointMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/resources/mapper/InstrumentMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/resources/mapper/MeteringPlanMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory-server/src/main/resources/mapper/MetricalInformationMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/lims.sql 528 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/pom.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/controller/MaterialController.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/controller/ProductController.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/controller/SpecificationsController.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/controller/StandardController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/MaterialMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/ProductMapper.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/SpecificationsMapper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/StandardMapper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Material.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Product.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Specifications.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Standard.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddMaterialDto.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddSpecifications.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddStandardDto.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/service/MaterialService.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/service/ProductService.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/service/SpecificationsService.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/service/StandardService.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MaterialServiceImpl.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/ProductServiceImpl.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/SpecificationsServiceImpl.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/StandardServiceImpl.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/resources/mapper/MaterialMapper.xml 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/resources/mapper/ProductMapper.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/resources/mapper/SpecificationsMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
standard-server/src/main/resources/mapper/StandardMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sys/pom.xml 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sys/src/main/java/com/yuanchu/limslaboratory/CodeGenerator.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sys/src/main/java/com/yuanchu/limslaboratory/SysApplication.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sys/src/main/java/com/yuanchu/limslaboratory/backup/MysqlDataBackup.java 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sys/src/main/resources/application-dev.yml 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sys/src/main/resources/application-prod.yml 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sys/src/main/resources/application.yml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sys/src/main/resources/logback-spring.xml 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sys/src/main/resources/mysqldump.exe 补丁 | 查看 | 原始文档 | blame | 历史
sys/src/test/java/com/yuanchu/limslaboratory/SysApplicationTests.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/pom.xml 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/clients/UserClient.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/clients/UserLoginUtils.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/config/FeignConfig.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/controller/EnterpriseController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/controller/RoleController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/controller/UserController.java 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/mapper/EnterpriseMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/mapper/RoleMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/mapper/UserMapper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/pojo/Enterprise.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/pojo/Role.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/pojo/User.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/service/EnterpriseService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/service/RoleService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/service/UserService.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/EnterpriseServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/RoleServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/UserServiceImpl.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/JwtToken.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/MultiRealmAuthenticator.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/config/ShiroConfig.java 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/filter/JwtFilter.java 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/realm/JwtRealm.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/realm/ShiroRealm.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/utils/JwtCredentialsMatcher.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/utils/JwtUtils.java 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/vo/NewPersonnelVo.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/vo/PagePersonnelVo.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/java/com/yuanchu/limslaboratory/vo/UpdatePersonnelVo.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/resources/mapper/EnterpriseMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/resources/mapper/RoleMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
user-server/src/main/resources/mapper/UserMapper.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -1,3 +1,4 @@
<<<<<<< HEAD
*.class
# Mobile Tools for Java (J2ME)
@@ -10,3 +11,39 @@
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
=======
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
*.log
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
>>>>>>> 97287ee79f67a623da39650ad9718131e8130cb5
framework/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>lims-laboratory</artifactId>
        <groupId>com.yuanchu</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.yunchu.limslaboratory</groupId>
    <artifactId>framework</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>framework</name>
    <description>framework</description>
    <packaging>jar</packaging>
    <dependencies>
        <!--数据库连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--Swagger3-Ui美化-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-ui</artifactId>
        </dependency>
        <!--redis jar包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>
</project>
framework/src/main/java/com/yuanchu/limslaboratory/config/DruidConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.yuanchu.limslaboratory.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DruidConfig {
    //加载application.yaml中的Druid配置
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druid(){
        return  new DruidDataSource();
    }
    //配置Druid的监控
    //1、配置一个管理后台的Servlet
    @Bean
    public ServletRegistrationBean statViewServlet(){
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        Map<String,String> initParams = new HashMap<>();
        initParams.put("loginUsername","root");
        initParams.put("loginPassword","123456");
        initParams.put("allow","");//默认就是允许所有访问
//        initParams.put("deny","192.168.15.21"); ç¦æ­¢è¯¥IP访问
        bean.setInitParameters(initParams);
        return bean;
    }
    //2、配置一个web监控的filter
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
        Map<String,String> initParams = new HashMap<>();
        initParams.put("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        bean.setInitParameters(initParams);
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }
}
framework/src/main/java/com/yuanchu/limslaboratory/config/MyCorsConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.yuanchu.limslaboratory.config;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class MyCorsConfig {
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        // 1 è®¾ç½®è®¿é—®æºåœ°å€
        corsConfiguration.addAllowedOrigin("*");
        // 2 è®¾ç½®è®¿é—®æºè¯·æ±‚头
        corsConfiguration.addAllowedHeader("*");
        // 3 è®¾ç½®è®¿é—®æºè¯·æ±‚方法
        corsConfiguration.addAllowedMethod("*");
        // 4 æš´éœ²å“ªäº›å¤´éƒ¨ä¿¡æ¯
//        corsConfiguration.addExposedHeader(JwtConstant.HEADER);
        return corsConfiguration;
    }
    @Bean
    public FilterRegistrationBean<CorsFilter> corsFilter() {
//        log.info("跨域设置。。。。");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 5 å¯¹æŽ¥å£é…ç½®è·¨åŸŸè®¾ç½®
        source.registerCorsConfiguration("/**", buildConfig());
        //有多个filter时此处设置改CorsFilter的优先执行顺序
        FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return bean;
    }
}
framework/src/main/java/com/yuanchu/limslaboratory/config/Swagger3.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
package com.yuanchu.limslaboratory.config;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Configuration
@EnableOpenApi
public class Swagger3 {
    // è·¯å¾„http://localhost:8080/doc.html
    @Value("${swagger.enabled}")
    private boolean enable;
    private final String swaggerPackage = "com.yuanchu.limslaboratory";
    /**
     * æ·»åŠ æ‘˜è¦ä¿¡æ¯
     */
    private ApiInfo apiInfo() {
        // ç”¨ApiInfoBuilder进行定制
        return new ApiInfoBuilder()
                // è®¾ç½®æ ‡é¢˜
                .title("LIMS管理系统")
                // æè¿°
                .description("LIMS管理系统")
                // ä½œè€…信息
                .contact(new Contact("Crunchy", null, null))
                // ç‰ˆæœ¬
                .version("版本号:V.1")
                //协议
                .license("The Apache License")
                //协议url
                .licenseUrl("http://www.baidu.com")
                .build();
    }
    /**
     * åˆ›å»ºAPI
     * http:IP:端口号/swagger-ui/index.html åŽŸç”Ÿåœ°å€
     * http:IP:端口号/doc.html bootStrap-UI地址
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.OAS_30).pathMapping("/")
                // ç”¨æ¥åˆ›å»ºè¯¥API的基本信息,展示在文档的页面中(自定义展示的信息)
                .enable(enable)
                .apiInfo(apiInfo())
                // è®¾ç½®å“ªäº›æŽ¥å£æš´éœ²ç»™Swagger展示
                .select()
                // æ‰«ææ‰€æœ‰æœ‰æ³¨è§£çš„api,用这种方式更灵活
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                // æ‰«ææŒ‡å®šåŒ…中的swagger注解
                .apis(RequestHandlerSelectors.basePackage(swaggerPackage))
                // æ‰«ææ‰€æœ‰ .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.regex("(?!/ApiError.*).*"))
                .paths(PathSelectors.any())
                .build()
                // æ”¯æŒçš„通讯协议集合
                .protocols(newHashSet("https", "http"))
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts());
    }
    /**
     * æ”¯æŒçš„通讯协议集合
     * @param type1
     * @param type2
     * @return
     */
    private Set<String> newHashSet(String type1, String type2){
        Set<String> set = new HashSet<>();
        set.add(type1);
        set.add(type2);
        return set;
    }
    /**
     * è®¤è¯çš„安全上下文
     */
    private List<SecurityScheme> securitySchemes() {
        List<SecurityScheme> securitySchemes = new ArrayList<>();
        securitySchemes.add((SecurityScheme) new ApiKey("token", "token", "header"));
        return securitySchemes;
    }
    /**
     * æŽˆæƒä¿¡æ¯å…¨å±€åº”用
     */
    private List<SecurityContext> securityContexts() {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(SecurityContext.builder()
                .securityReferences(defaultAuth())
                .forPaths(PathSelectors.any()).build());
        return securityContexts;
    }
    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences = new ArrayList<>();
        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
        return securityReferences;
    }
}
framework/src/main/java/com/yuanchu/limslaboratory/config/WebMvcConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.yuanchu.limslaboratory.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
    @Value("${file.path}")
    private String filePath;
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        //配置拦截器访问静态资源
        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
        //设置文件虚拟路径映射
        registry.addResourceHandler("/img/**").addResourceLocations("file:"+filePath+"/");
    }
}
framework/src/main/java/com/yuanchu/limslaboratory/exception/MyFileException.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.yuanchu.limslaboratory.exception;
public class MyFileException extends RuntimeException{
    public MyFileException() {
    }
    public MyFileException(String message) {
        super(message);
    }
    public MyFileException(Throwable cause) {
        super(cause);
    }
    public MyFileException(String message, Throwable cause) {
        super(message, cause);
    }
}
framework/src/main/java/com/yuanchu/limslaboratory/handler/GlobalExceptionHandler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,215 @@
package com.yuanchu.limslaboratory.handler;
import com.yuanchu.limslaboratory.exception.MyFileException;
import com.yuanchu.limslaboratory.utils.MyUtil;
import com.yuanchu.limslaboratory.vo.Result;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException;
import org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException;
import org.springframework.beans.ConversionNotSupportedException;
import org.springframework.beans.TypeMismatchException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.jdbc.BadSqlGrammarException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MultipartException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.BindException;
import java.sql.SQLException;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    @Value("${spring.servlet.multipart.max-file-size}")
    private String maxFileSize;
    @Value("${spring.servlet.multipart.max-request-size}")
    private String maxRequestSize;
    @ExceptionHandler(SQLException.class)
    public Result<?> handlerSQLException(SQLException e)
    {
        log.error(e.getMessage().toLowerCase(), e);
        return Result.fail("数据操作失败!请联系管理员");
    }
    /**
     * å”¯ä¸€å€¼åœ¨æ•°æ®åº“中重复
     * Duplicate entry ' ' for key ' '
     * @param e:重复键异常
     * @return 199
     */
    @ExceptionHandler
    public Result<?> DuplicateKeyException(DuplicateKeyException e) {
        log.error(String.valueOf(e));
        String message = e.getCause().getMessage();
        String[] split = message.split("'");
        return Result.fail("重复添加:【" + split[1] + "】操作失败!");
    }
    @ExceptionHandler
    public Result<?> NullPointerException(NullPointerException e){
        e.printStackTrace();
        return Result.fail("部分参数为空,请检查!");
    }
    /** è¿è¡Œæ—¶å¼‚常 */
    @ExceptionHandler(RuntimeException.class)
    public Result<?> runtimeExceptionHandler(RuntimeException e) {
        e.printStackTrace();
        return Result.fail("运行时异常");
    }
    /** ç±»åž‹è½¬æ¢å¼‚常 */
    @ExceptionHandler(ClassCastException.class)
    public Result<?> classCastExceptionHandler(ClassCastException e) {
        e.printStackTrace();
        return Result.fail("类型转换异常");
    }
    /** æ–‡ä»¶æœªæ‰¾åˆ°å¼‚常 */
    @ExceptionHandler(FileNotFoundException.class)
    public Result<?> FileNotFoundException(FileNotFoundException e) {
        e.printStackTrace();
        return Result.fail("文件未找到异常");
    }
    /** æ•°å­—格式异常 */
    @ExceptionHandler(NumberFormatException.class)
    public Result<?> NumberFormatException(NumberFormatException e) {
        e.printStackTrace();
        return Result.fail("数字格式异常");
    }
    /** å®‰å…¨å¼‚常 */
    @ExceptionHandler(SecurityException.class)
    public Result<?> SecurityException(SecurityException e) {
        e.printStackTrace();
        return Result.fail("安全异常");
    }
    /** ç±»åž‹ä¸å­˜åœ¨å¼‚常 */
    @ExceptionHandler(TypeNotPresentException.class)
    public Result<?> TypeNotPresentException(TypeNotPresentException e) {
        e.printStackTrace();
        return Result.fail("类型不存在异常");
    }
    /** IO异常 */
    @ExceptionHandler(IOException.class)
    public Result<?> iOExceptionHandler(IOException e) {
        e.printStackTrace();
        return Result.fail("IO异常");
    }
    /** æœªçŸ¥æ–¹æ³•异常 */
    @ExceptionHandler(NoSuchMethodException.class)
    public Result<?> noSuchMethodExceptionHandler(NoSuchMethodException e) {
        e.printStackTrace();
        return Result.fail("未知方法异常");
    }
    /** æ•°ç»„越界异常 */
    @ExceptionHandler(IndexOutOfBoundsException.class)
    public Result<?> indexOutOfBoundsExceptionHandler(IndexOutOfBoundsException e) {
        e.printStackTrace();
        return Result.fail("数组越界异常");
    }
    /** sql语法错误异常 */
    @ExceptionHandler(BadSqlGrammarException.class)
    public Result<?> BadSqlGrammarException(BadSqlGrammarException e) {
        e.printStackTrace();
        return Result.fail("sql语法错误异常");
    }
    /** æ— æ³•注入bean异常 */
    @ExceptionHandler(NoSuchBeanDefinitionException.class)
    public Result<?> NoSuchBeanDefinitionException(NoSuchBeanDefinitionException e) {
        e.printStackTrace();
        return Result.fail("无法注入bean");
    }
    /** Http消息不可读异常 */
    @ExceptionHandler({HttpMessageNotReadableException.class})
    public Result<?> requestNotReadable(HttpMessageNotReadableException e) {
        e.printStackTrace();
        return Result.fail("Http消息不可读");
    }
    /** 400错误 */
    @ExceptionHandler({TypeMismatchException.class})
    public Result<?> requestTypeMismatch(TypeMismatchException e) {
        e.printStackTrace();
        return Result.fail("服务器异常");
    }
    /** 500错误 */
    @ExceptionHandler({ConversionNotSupportedException.class, HttpMessageNotWritableException.class})
    public Result<?> server500(RuntimeException e) {
        e.printStackTrace();
        return Result.fail("服务器异常");
    }
    /** æ ˆæº¢å‡º */
    @ExceptionHandler({StackOverflowError.class})
    public Result<?> requestStackOverflow(StackOverflowError e) {
        e.printStackTrace();
        return Result.fail("栈溢出异常");
    }
    /** é™¤æ•°ä¸èƒ½ä¸º0 */
    @ExceptionHandler({ArithmeticException.class})
    public Result<?> arithmeticException(ArithmeticException e) {
        e.printStackTrace();
        return Result.fail("除数不能为0异常");
    }
    /**
     *文件过大报错提示
     */
    @ExceptionHandler({MultipartException.class})
    public Result<?> fileUploadExceptionHandler(MultipartException  e) {
        String msg;
        Throwable rootCause = e.getRootCause();
        if (rootCause instanceof FileSizeLimitExceededException) {
            msg="上传文件过大【单个文件大小不得超过" + maxFileSize + "】";
        }else if(rootCause instanceof SizeLimitExceededException){
            msg="上传文件过大【总上传大小不得超过" + maxRequestSize + "】";
        }else {
            msg="文件上传失败【服务器异常】";
        }
        return Result.fail(msg);
    }
    /** æ–‡ä»¶åŽç¼€åä¸é€šè¿‡è¿”回提示 */
    @ExceptionHandler({MyFileException.class})
    public Result<?> myFileException(Exception e) {
        return Result.fail("抱歉不支持【" + e.getMessage() +"】后缀的文件!");
    }
    /**
     * å‚数检验
     */
    @ExceptionHandler({MethodArgumentNotValidException.class})
    public Result<?> methodArgumentNotValidException(MethodArgumentNotValidException e) {
        List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
        String message = allErrors.stream().map(s -> s.getDefaultMessage()).collect(Collectors.joining(";"));
        return Result.fail(message);
    }
    /** å…¶ä»–错误 */
    @ExceptionHandler({Exception.class})
    public Result<?> exception(Exception e) {
        e.printStackTrace();
        return Result.fail("网络连接失败,请退出后再试");
    }
}
framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyBaseMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.yuanchu.limslaboratory.mybatis_config;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/**
 * è‡ªå®šä¹‰æ·»åŠ mybatis-plus批量添加
 * @param <T>
 */
public interface MyBaseMapper <T> extends BaseMapper<T> {
    int insertBatchSomeColumn(List<T> entityList);
}
framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyBatisPlusConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.yuanchu.limslaboratory.mybatis_config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisPlusConfig {
    /**
     * éœ€è¦é…ç½®æ‹¦æˆªå™¨ï¼Œä¸ç„¶åœ¨AddDevice中的total无法获取到
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // ä¹è§‚锁
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        // åˆ†é¡µé…ç½®
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}
framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MyMetaObjectHandler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.yuanchu.limslaboratory.mybatis_config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); // èµ·å§‹ç‰ˆæœ¬ 3.3.0(推荐使用)
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date()); // èµ·å§‹ç‰ˆæœ¬ 3.3.0(推荐使用)
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        // update的时候使用,更新的时候强制进行填充
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); // èµ·å§‹ç‰ˆæœ¬ 3.3.0(推荐)
    }
}
framework/src/main/java/com/yuanchu/limslaboratory/mybatis_config/MySqlInjector.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.yuanchu.limslaboratory.mybatis_config;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * æ‰¹é‡æ·»åŠ 
 */
@Component
public class MySqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
        //增加自定义方法,字段注解上不等于FieldFill.DEFAULT的字段才会插入
        methodList.add(new InsertBatchSomeColumn(t->!t.isLogicDelete()));
        return methodList;
    }
}
framework/src/main/java/com/yuanchu/limslaboratory/utils/FileSaveUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
package com.yuanchu.limslaboratory.utils;
import com.yuanchu.limslaboratory.exception.MyFileException;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.FileSystemUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
 * ä¿å­˜æ–‡ä»¶å·¥å…·
 */
@Slf4j
@Component
public class FileSaveUtil {
    // å–yml中的路径 + /
    private static String FILE_PATH;
    private static String[] ALLOWED;
    @Value("${file.path}")
    private String file;
    @Value("${file.allowed}")
    private String[] allowed;
    @PostConstruct
    public void getFile() {
        FILE_PATH = this.file;
    }
    @PostConstruct
    public void getAllowed(){
        ALLOWED = this.allowed;
    }
    /**
     * å­˜å‚¨æ–‡ä»¶ä¸»å‡½æ•°
     * @param file æ–‡ä»¶äºŒè¿›åˆ¶æµ
     * @return è¿”回文件名称用于存储数据库
     */
    public static String StoreFile(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        // ç”Ÿæˆéšæœºåç§°ï¼šæ—¶é—´_随机6位数字
        String FileName = System.currentTimeMillis() + "_" + MyUtil.getNumber(6);
        String suffix = null;
        if (originalFilename != null) {
            suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            // å¦‚果后缀名不通过抛出异常
            if (!isFileAllowed(suffix)){
                throw  new MyFileException(suffix);
            }
        }
        // åç§°æ‹¼æŽ¥
        String fileName = FileName + suffix;
        // è¿›è¡Œå­˜å‚¨
        try {
            storeFileWithFileName(file.getBytes(), fileName);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return fileName;
    }
    public static Boolean DeleteFile(String fileName) {
        return FileSystemUtils.deleteRecursively(new File(FILE_PATH + "/" + fileName));
    }
    /**
     * å­˜å‚¨æ–‡ä»¶å‡½æ•°
     * @param content æ–‡ä»¶äºŒè¿›åˆ¶æµ
     * @param fileName æ–‡ä»¶åç§°
     */
    private static void storeFileWithFileName(byte[] content, String fileName) {
        // å­˜å‚¨è·¯å¾„
        String path = FILE_PATH + java.io.File.separatorChar;
        // ç›®å½•不存在则创建
        java.io.File file = new java.io.File(path);
        if (!file.exists()) {
            file.mkdirs();
        }
        // å¼€å§‹å­˜å‚¨
        try (FileOutputStream os = new FileOutputStream(path + fileName);
             ByteArrayInputStream is = new ByteArrayInputStream(content)) {
             IOUtils.copy(is, os);
        } catch (IOException e) {
            MyUtil.PrintLog("存储文件异常:" + e);
        }
    }
    /**
     * åˆ¤æ–­æ–‡ä»¶æ˜¯å¦è¢«å…è®¸ä¸Šä¼ 
     *
     * @param fileName æ–‡ä»¶å
     * @return å…è®¸true, å¦åˆ™false
     */
    private static boolean isFileAllowed(String fileName) {
        // èŽ·å–åŽç¼€å
        String suffixName = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
        for (String allow : ALLOWED) {
            if (allow.equals(suffixName)) {
                return true;
            }
        }
        return false;
    }
}
framework/src/main/java/com/yuanchu/limslaboratory/utils/JackSonUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
package com.yuanchu.limslaboratory.utils;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
 * JSON解析处理
 *
 * @author å¼ å®¾
 */
@Component
public class JackSonUtil {
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    private static final ObjectWriter OBJECT_WRITER = OBJECT_MAPPER.writerWithDefaultPrettyPrinter();
    public static void marshal(File file, Object value) throws Exception {
        try {
            OBJECT_WRITER.writeValue(file, value);
        } catch (JsonGenerationException e) {
            throw new Exception(e);
        } catch (JsonMappingException e) {
            throw new Exception(e);
        } catch (IOException e) {
            throw new Exception(e);
        }
    }
    public static void marshal(OutputStream os, Object value) throws Exception {
        try {
            OBJECT_WRITER.writeValue(os, value);
        } catch (JsonGenerationException e) {
            throw new Exception(e);
        } catch (JsonMappingException e) {
            throw new Exception(e);
        } catch (IOException e) {
            throw new Exception(e);
        }
    }
    public static String marshal(Object value) throws Exception {
        try {
            return OBJECT_WRITER.writeValueAsString(value);
        } catch (JsonGenerationException e) {
            throw new Exception(e);
        } catch (JsonMappingException e) {
            throw new Exception(e);
        } catch (IOException e) {
            throw new Exception(e);
        }
    }
    public static byte[] marshalBytes(Object value) throws Exception {
        try {
            return OBJECT_WRITER.writeValueAsBytes(value);
        } catch (JsonGenerationException e) {
            throw new Exception(e);
        } catch (JsonMappingException e) {
            throw new Exception(e);
        } catch (IOException e) {
            throw new Exception(e);
        }
    }
    public static <T> T unmarshal(File file, Class<T> valueType) throws Exception {
        try {
            return OBJECT_MAPPER.readValue(file, valueType);
        } catch (JsonParseException e) {
            throw new Exception(e);
        } catch (JsonMappingException e) {
            throw new Exception(e);
        } catch (IOException e) {
            throw new Exception(e);
        }
    }
    public static <T> T unmarshal(InputStream is, Class<T> valueType) throws Exception {
        try {
            return OBJECT_MAPPER.readValue(is, valueType);
        } catch (JsonParseException e) {
            throw new Exception(e);
        } catch (JsonMappingException e) {
            throw new Exception(e);
        } catch (IOException e) {
            throw new Exception(e);
        }
    }
    /**
     * å­—符串转对象
     * @param str
     * @param valueType
     * @return
     * @param <T>
     * @throws Exception
     */
    public static <T> T unmarshal(String str, Class<T> valueType) throws Exception {
        try {
            return OBJECT_MAPPER.readValue(str, valueType);
        } catch (JsonParseException e) {
            throw new Exception(e);
        } catch (JsonMappingException e) {
            throw new Exception(e);
        } catch (IOException e) {
            throw new Exception(e);
        }
    }
    public static <T> T unmarshal(byte[] bytes, Class<T> valueType) throws Exception {
        try {
            if (bytes == null) {
                bytes = new byte[0];
            }
            return OBJECT_MAPPER.readValue(bytes, 0, bytes.length, valueType);
        } catch (JsonParseException e) {
            throw new Exception(e);
        } catch (JsonMappingException e) {
            throw new Exception(e);
        } catch (IOException e) {
            throw new Exception(e);
        }
    }
}
framework/src/main/java/com/yuanchu/limslaboratory/utils/MyUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
package com.yuanchu.limslaboratory.utils;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
@Component
public class MyUtil<T> {
    /**
     * è‡ªå®šä¹‰è°ƒè¯•工具类
     * @return
     */
    public static void PrintLog(String str){
        // ç±»å
        String className = Thread.currentThread().getStackTrace()[2].getClassName();
        // å‡½æ•°å
        String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();
        System.out.println("\033[1;94m" + className + "-->" + methodName + "-->"  + str + "\033[0m");
    }
    /**
     * æ—¥æœŸå·¥å…·ç±»
     * @return
     */
    public static String MyDateFormat(){
        //获取日期
        //导 import java.util.Date; ä¸‹çš„包
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        return sdf.format(date);
    }
    /**
     * èŽ·å–éšæœºåŠ å¯†ç›
     * @param n ä½æ•°
     * @return è¿”回随机加密盐
     */
    public static String getSalt(int n) {
        char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890!@#$%^&*()+-=/[];~.".toCharArray();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            char c = chars[new Random().nextInt(chars.length)];
            sb.append(c);
        }
        return sb.toString();
    }
    /**
     * èŽ·å–éšæœºæ•°å­—
     * @param n ä½æ•°
     * @return è¿”回随机值
     */
    public static String getNumber(int n) {
        char[] chars = "1234567890".toCharArray();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            char c = chars[new Random().nextInt(chars.length)];
            sb.append(c);
        }
        return sb.toString();
    }
    public static String getTimeSixNumberCode(String prefix){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String format = simpleDateFormat.format(new Date());
        String timeStr = format.replace("-", "");
        long incrNum = RedisUtil.incr("num", 1);
        if(incrNum == 1){
            RedisUtil.expire("num", 60 * 60 * 24);
        }
        String sixIncr = String.format("%06d", incrNum);
        return prefix + timeStr + sixIncr;
    }
}
framework/src/main/java/com/yuanchu/limslaboratory/utils/RedisUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,622 @@
package com.yuanchu.limslaboratory.utils;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Component
public class RedisUtil {
    private static RedisTemplate<String, Object> redisTemplate;
    public static RedisTemplate<String, Object> getRedisTemplate() {
        return redisTemplate;
    }
    @Autowired
    private RedisUtil(RedisConnectionFactory redisConnectionFactory){
        // redisTemplate模板初始化
        redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // å°†å¯¹è±¡åºåˆ—化
        ObjectMapper om=new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
                ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        // String的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // json序列化配置
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer<>(Object.class);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        //key采用String的序列化方式
        redisTemplate.setKeySerializer(stringRedisSerializer);
        //hash的key也采用String çš„序列化方式
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        //value的序列化方式采用jackson的方式
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
//        //hash的value序列化方式采用jackson
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
    }
    // =============================common============================
    /**
     * æŒ‡å®šç¼“存失效时间
     * @param key  é”®
     * @param time æ—¶é—´(秒)
     */
    public static 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 static long getExpire(String key) {
        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
    }
    /**
     * åˆ¤æ–­key是否存在
     * @param key é”®
     * @return true å­˜åœ¨ false不存在
     */
    public static boolean hasKey(String key) {
        try {
            return redisTemplate.hasKey(key);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * åˆ é™¤ç¼“å­˜
     * @param key å¯ä»¥ä¼ ä¸€ä¸ªå€¼ æˆ–多个
     */
//    @SuppressWarnings("unchecked")
    public static void del(String... key) {
        if (key != null && key.length > 0) {
            if (key.length == 1) {
                redisTemplate.delete(key[0]);
            } else {
                redisTemplate.delete(Arrays.asList(key));
//                redisTemplate.delete(CollectionUtils.arrayToList(key));
            }
        }
    }
    /**
     * èŽ·å–å¹¶åˆ é™¤ç¼“å­˜
     * @param key é”®
     * @return å€¼
     */
    public static Object getAndDelete(String key) {
        try{
            return key == null ? null : get(key);
        }finally {
            del(key);
        }
    }
    // ============================String=============================
    /**
     * æ™®é€šç¼“存获取
     * @param key é”®
     * @return å€¼
     */
    public static Object get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }
    /**
     * æ™®é€šç¼“存放入
     * @param key   é”®
     * @param value å€¼
     * @return true成功 false失败
     */
    public static 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 static boolean set(String key, Object value, long time) {
        try {
            if (time > 0) {
                redisTemplate.opsForValue().set(key, value, time, TimeUnit.MINUTES);
            } else {
                // åªä¿®æ”¹å‚数不修改ttl
                redisTemplate.opsForValue().set(key, value, 0);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * é€’增
     * @param key   é”®
     * @param delta è¦å¢žåР几(大于0)
     */
    public static long incr(String key, long delta) {
        if (delta < 0) {
            throw new RuntimeException("递增因子必须大于0");
        }
        return redisTemplate.opsForValue().increment(key, delta);
    }
    /**
     * é€’减
     * @param key   é”®
     * @param delta è¦å‡å°‘几(小于0)
     */
    public static 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
     */
    public static Object hget(String key, String item) {
        return redisTemplate.opsForHash().get(key, item);
    }
    /**
     * èŽ·å–hashKey对应的所有键值
     * @param key é”®
     * @return å¯¹åº”的多个键值
     */
    public static Map<Object, Object> hmget(String key) {
        return redisTemplate.opsForHash().entries(key);
    }
    /**
     * HashSet
     * @param key é”®
     * @param map å¯¹åº”多个键值
     */
    public static 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 static boolean hmset(String key, Map<String, Object> map, long time) {
        try {
            if (time > 0) {
                redisTemplate.opsForHash().putAll(key, map);
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * å‘一张hash表中放入数据,如果不存在将创建
     *
     * @param key   é”®
     * @param item  é¡¹
     * @param value å€¼
     * @return true æˆåŠŸ false失败
     */
    public static 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 static boolean hset(String key, String item, Object value, long time) {
        try {
            if (time > 0) {
                redisTemplate.opsForHash().put(key, item, value);
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * åˆ é™¤hash表中的值
     *
     * @param key  é”® ä¸èƒ½ä¸ºnull
     * @param item é¡¹ å¯ä»¥ä½¿å¤šä¸ª ä¸èƒ½ä¸ºnull
     */
    public static void hdel(String key, Object... item) {
        redisTemplate.opsForHash().delete(key, item);
    }
    /**
     * åˆ¤æ–­hash表中是否有该项的值
     *
     * @param key  é”® ä¸èƒ½ä¸ºnull
     * @param item é¡¹ ä¸èƒ½ä¸ºnull
     * @return true å­˜åœ¨ false不存在
     */
    public static boolean hHasKey(String key, String item) {
        return redisTemplate.opsForHash().hasKey(key, item);
    }
    /**
     * hash递增 å¦‚果不存在,就会创建一个 å¹¶æŠŠæ–°å¢žåŽçš„值返回
     *
     * @param key  é”®
     * @param item é¡¹
     * @param by   è¦å¢žåР几(大于0)
     */
    public static double hincr(String key, String item, double by) {
        return redisTemplate.opsForHash().increment(key, item, by);
    }
    /**
     * hash递减
     *
     * @param key  é”®
     * @param item é¡¹
     * @param by   è¦å‡å°‘è®°(小于0)
     */
    public static double hdecr(String key, String item, double by) {
        return redisTemplate.opsForHash().increment(key, item, -by);
    }
    // ============================set=============================
    /**
     * æ ¹æ®key获取Set中的所有值
     * @param key é”®
     */
    public static 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 static 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 static 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 static long sSetAndTime(String key, long time, Object... values) {
        try {
            Long count = (long)values.length;
            if (time > 0) {
                count = redisTemplate.opsForSet().add(key, values);
                expire(key, time);
            }
            return count;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    /**
     * èŽ·å–set缓存的长度
     *
     * @param key é”®
     */
    public static long sGetSetSize(String key) {
        try {
            return redisTemplate.opsForSet().size(key);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    /**
     * ç§»é™¤å€¼ä¸ºvalue的
     *
     * @param key    é”®
     * @param values å€¼ å¯ä»¥æ˜¯å¤šä¸ª
     * @return ç§»é™¤çš„个数
     */
    public static long setRemove(String key, Object... values) {
        try {
            return redisTemplate.opsForSet().remove(key, values);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    // ===============================list=================================
    /**
     * èŽ·å–list缓存的内容
     *
     * @param key   é”®
     * @param start å¼€å§‹
     * @param end   ç»“束 0 åˆ° -1代表所有值
     */
    public static 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 é”®
     */
    public static 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 è¡¨å¤´ï¼Œ1 ç¬¬äºŒä¸ªå…ƒç´ ï¼Œä¾æ¬¡ç±»æŽ¨ï¼›index<0时,-1,表尾,-2倒数第二个元素,依次类推
     */
    public static 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 å€¼
     */
    public static 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  æ—¶é—´(秒)
     */
    public static boolean lSet(String key, Object value, long time) {
        try {
            if (time > 0) {
                redisTemplate.opsForList().rightPush(key, value);
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * å°†list放入缓存
     *
     * @param key   é”®
     * @param value å€¼
     * @return true å­˜æ”¾æˆåŠŸ false存放失败
     */
    public static 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 true å­˜æ”¾æˆåŠŸ false存放失败
     */
    public static boolean lSet(String key, List<Object> value, long time) {
        try {
            if (time > 0) {
                redisTemplate.opsForList().rightPushAll(key, value);
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * æ ¹æ®ç´¢å¼•修改list中的某条数据
     *
     * @param key   é”®
     * @param index ç´¢å¼•
     * @param value å€¼
     * @return true å­˜æ”¾æˆåŠŸ false存放失败
     */
    public static 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 static long lRemove(String key, long count, Object value) {
        try {
            return redisTemplate.opsForList().remove(key, count, value);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
}
framework/src/main/java/com/yuanchu/limslaboratory/utils/SpringUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.yuanchu.limslaboratory.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringUtil implements ApplicationContextAware {
    private static ApplicationContext context;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }
    public static void set(ApplicationContext applicationContext) {
        context = applicationContext;
    }
    /**
     * é€šè¿‡å­—节码获取
     * @param beanClass
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> beanClass) {
        return context.getBean(beanClass);
    }
    /**
     * é€šè¿‡BeanName获取
     * @param beanName
     * @param <T>
     * @return
     */
    public static <T> T getBean(String beanName) {
        return (T) context.getBean(beanName);
    }
    /**
     * é€šè¿‡beanName和字节码获取
     * @param name
     * @param beanClass
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name, Class<T> beanClass) {
        return context.getBean(name, beanClass);
    }
}
framework/src/main/java/com/yuanchu/limslaboratory/vo/Result.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package com.yuanchu.limslaboratory.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
    @ApiModelProperty(value = "响应码:200成功,201失败")
    private int code;
    @ApiModelProperty(value = "响应消息")
    private String message;
    @ApiModelProperty(value = "响应参数")
    private T data;
    public static <T> Result<T> success(){
        return new Result<>(200, "success",null);
    }
    public static <T> Result<T> success(String message){
        return new Result<>(200, message,null);
    }
    public static <T> Result<T> success(T data){
        return new Result<>(200, "success",data);
    }
    public static <T> Result<T> success(String message, T data){
        return new Result<>(200, message,data);
    }
    public static <T> Result<T> fail(){
        return new Result<>(201, "fail", null);
    }
    public static <T> Result<T> fail(String message){
        return new Result<>(201, message, null);
    }
    public static <T> Result<T> fail(Integer code){
        return new Result<>(code, "fail", null);
    }
    public static <T> Result<T> fail(Integer code, String message){
        return new Result<>(code, message, null);
    }
}
inspection-server/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>lims-laboratory</artifactId>
        <groupId>com.yuanchu</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.yunchu.limslaboratory</groupId>
    <artifactId>inspection-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>inspection-server</name>
    <description>inspection-server</description>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>com.yunchu.limslaboratory</groupId>
            <artifactId>framework</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <dependency>
            <groupId>com.yunchu.limslaboratory</groupId>
            <artifactId>standard-server</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <dependency>
            <groupId>com.yunchu.limslaboratory</groupId>
            <artifactId>laboratory-server</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.12</version>
        </dependency>
    </dependencies>
</project>
inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,139 @@
package com.yuanchu.limslaboratory.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.text.ParseException;
import java.util.*;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.yuanchu.limslaboratory.pojo.Inspection;
import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
import com.yuanchu.limslaboratory.service.LinkBasicInformationService;
import com.yuanchu.limslaboratory.service.RawMaterialService;
import com.yuanchu.limslaboratory.utils.JackSonUtil;
import com.yuanchu.limslaboratory.utils.RedisUtil;
import com.yuanchu.limslaboratory.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.service.InspectionService;
import javax.annotation.Resource;
/**
 * ç”³è¯·è¡¨(Inspection)表控制层
 *
 * @author zss
 * @since 2023-08-03 13:03:36
 */
@Api(tags = "试验管理-->检验申请")
@RestController
@RequestMapping("/inspection")
public class InspectionController {
    @Autowired
    private InspectionService inspectionService;
    @Resource
    RawMaterialService rawMaterialService;
    @Resource
    LinkBasicInformationService linkBasicInformationService;
    @ApiOperation(value = "查询检验申请单列表")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "pageSize", value = "页数", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "countSize", value = "条数/页", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "message", value = "申请单号/原材料名称", dataTypeClass = String.class)
    })
    @GetMapping("/selectInspectsList")
    public Result selectInspectsList(int pageSize, int countSize, String message) {
        IPage<Map<String, Object>> inspectionPage = inspectionService.selectInspectsList(new Page<Object>(pageSize, countSize), message);
        Map<String, Object> map = new HashMap<>();
        map.put("total", inspectionPage.getTotal());
        map.put("row", inspectionPage.getRecords());
        return Result.success(map);
    }
    @ApiOperation(value = "查询所有报检")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "type", value = "类型", dataTypeClass = Integer.class, required = true)
    })
    @GetMapping("/selectAll")
    public Result selectAll(Integer type) {
        switch (type) {
            case 0 :
                //原材料
                return Result.success(rawMaterialService.selectRawmaAll());
            case 1 :
                //委托单
                return Result.success(linkBasicInformationService.selectLinkAll());
            case 2 :
                //成品检验
                return Result.success("请输入检验信息!");
        }
        return Result.fail("类型错误!");
    }
    @ApiOperation(value = "选择原材料报检")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "id", value = "原材料报检单id", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "startTime", value = "检验开始日期", dataTypeClass = String.class, required = true),
            @ApiImplicitParam(name = "endTime", value = "检验结束日期", dataTypeClass = String.class, required = true)
    })
    @GetMapping("/selectRawmaById")
    public Result selectRawmaById(Integer id, String startTime, String endTime) throws ParseException {
        return Result.success(rawMaterialService.selectRawmaById(id,startTime,endTime));
    }
    @ApiOperation(value = "选择委托报检和样品")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "bid", value = "委托报检单id", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "did", value = "委托报检样品id", dataTypeClass = Integer.class, required = true)
    })
    @GetMapping("/selectLinkByid")
    public Result selectLinkByid(Integer bid, Integer did) {
        return Result.success(linkBasicInformationService.selectLinkByid(bid, did));
    }
    @ApiOperation(value = "新增检验单")
    @PostMapping("/addInspect")
    public Result addInspect(@RequestHeader("token") String token, @RequestBody InspectionVo inspectionVo) throws Exception {
        Object object = RedisUtil.get(token);
        Map<String, Object> unmarshal = JackSonUtil.unmarshal(JackSonUtil.marshal(object), Map.class);
        return Result.success(inspectionService.addInspect((Integer) unmarshal.get("id"), inspectionVo));
    }
    @ApiOperation(value = "根据检验单id查询原材料检验单详情")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "id", value = "检验单id", dataTypeClass = Integer.class, required = true)
    })
    @GetMapping("/selectInspectsListById")
    public Result selectInspectsListById(Integer id) {
        return Result.success(inspectionService.selectInspectsListById(id));
    }
    @ApiOperation(value = "上报(更新检验状态)")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "id", value = "检验单id", dataTypeClass = Integer.class, required = true)
    })
    @PostMapping("/updateInspectsById")
    public Result updateInspectsById(Integer id) {
        //如果已经上报了不能再一次上报
        Inspection inspection = inspectionService.getById(id);
        if (ObjectUtils.isNotEmpty(inspection.getInspectionStatus())) {
            return Result.fail("已经上报过了,不能再次上报!");
        }
        return Result.success(inspectionService.updateInspectsById(id));
    }
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionMaterialController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.yuanchu.limslaboratory.controller;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.yuanchu.limslaboratory.service.InspectionMaterialService;
/**
 * (样品)检验单里面的物料(InspectionMaterial)表控制层
 *
 * @author zss
 * @since 2023-08-03 13:04:28
 */
@Api(tags = "(样品)检验单里面的物料接口")
@RestController
@RequestMapping("/inspectionMaterial")
public class InspectionMaterialController {
    @Autowired
    private InspectionMaterialService inspectionMaterialService;
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/InspectionProductController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.yuanchu.limslaboratory.controller;
import com.yuanchu.limslaboratory.pojo.InspectionProduct;
import com.yuanchu.limslaboratory.pojo.vo.InsProductVo;
import com.yuanchu.limslaboratory.service.InstrumentService;
import com.yuanchu.limslaboratory.utils.JackSonUtil;
import com.yuanchu.limslaboratory.utils.RedisUtil;
import com.yuanchu.limslaboratory.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.service.InspectionProductService;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
 * ç”³è¯·å•下物料中的项目(InspectionProduct)表控制层
 *
 * @author zss
 * @since 2023-08-03 13:04:54
 */
@Api(tags = "试验管理-->检验申请-->检验项目")
@RestController
@RequestMapping("/inspectionProduct")
public class InspectionProductController {
    @Autowired
    private InspectionProductService inspectionProductService;
    @Resource
    InstrumentService instrumentService;
    @ApiOperation(value = "查询所有设备")
    @GetMapping("/selectInstrument")
    public Result selectInstrument() {
        return Result.success(instrumentService.selectInstrument());
    }
    @ApiOperation("选择设备信息")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "id", value = "设备ID", dataTypeClass = Integer.class, required = true)
    })
    @GetMapping("/selectInstrumentById")
    public Result selectInstrumentById(Integer id) {
        String equipmentName = instrumentService.getById(id).getEquipmentName();
        return Result.success(equipmentName);
    }
    @ApiOperation(value = "更新检验项目")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "testValue", value = "检测值", dataTypeClass = String.class, required = true),
            @ApiImplicitParam(name = "required", value = "标准值", dataTypeClass = String.class, required = true),
            @ApiImplicitParam(name = "internal", value = "内控值", dataTypeClass = String.class, required = true),
            @ApiImplicitParam(name = "name", value = "项目名称", dataTypeClass = String.class, required = true),
            @ApiImplicitParam(name = "inspectionMaterialId", value = "内控值", dataTypeClass = Integer.class, required = true)
    })
    @PostMapping("/updateInsProduct")
    public Result updateInsProduct(@RequestHeader("token") String token, @RequestBody InspectionProduct inspectionProduct) throws Exception {
        Object object = RedisUtil.get(token);
        Map<String, Object> unmarshal = JackSonUtil.unmarshal(JackSonUtil.marshal(object), Map.class);
        Integer userId = (Integer) unmarshal.get("id");
        return Result.success(inspectionProductService.updateInsProduct(userId,inspectionProduct));
    }
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/LinkBasicInformationController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package com.yuanchu.limslaboratory.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.service.LinkBasicInformationService;
import com.yuanchu.limslaboratory.utils.MyUtil;
import com.yuanchu.limslaboratory.utils.RedisUtil;
import com.yuanchu.limslaboratory.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-08-03
 */
@Api(tags = "报检管理-->委托检验")
@RestController
@RequestMapping("/link-basic-table")
public class LinkBasicInformationController {
    @Autowired
    private LinkBasicInformationService linkBasicInformationService;
    @ApiOperation("链接-->获取链接")
    @GetMapping("/link")
    public Result<?> getLink() {
        Object link1 = null;
        try {
            link1 = RedisUtil.get("link");
        } catch (Exception e) {
            String uuid = IdWorker.get32UUID();
            RedisUtil.set("link", uuid, 60 * 24);
            return Result.success("success", uuid);
        }
        return Result.success(link1);
    }
    @ApiOperation(value = "分页表格")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "pageNo", value = "起始页", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "pageSize", value = "每一页数量", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "entrustCoding", value = "委托编号", dataTypeClass = String.class),
            @ApiImplicitParam(name = "sampleName", value = "样品名称", dataTypeClass = String.class),
            @ApiImplicitParam(name = "entrusted", value = "委托单位", dataTypeClass = String.class),
            @ApiImplicitParam(name = "inspectionStatus", value = "检验状态", dataTypeClass = Integer.class)
    })
    @GetMapping("/page")
    public Result<?> getLinkBasicPage(Integer pageNo, Integer pageSize, String entrustCoding, String sampleName, String entrusted, Integer inspectionStatus) {
        IPage<Map<String, Object>> linkBasicPage = linkBasicInformationService.getLinkBasicPage(new Page<Object>(pageNo, pageSize), entrustCoding, sampleName, entrusted, inspectionStatus);
        Map<String, Object> map = new HashMap<>();
        map.put("total", linkBasicPage.getTotal());
        map.put("row", linkBasicPage.getRecords());
        return Result.success(map);
    }
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/LinkDetectionController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.yuanchu.limslaboratory.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.yuanchu.limslaboratory.pojo.LinkBasicInformation;
import com.yuanchu.limslaboratory.pojo.Material;
import com.yuanchu.limslaboratory.service.LinkBasicInformationService;
import com.yuanchu.limslaboratory.service.MaterialService;
import com.yuanchu.limslaboratory.service.StandardService;
import com.yuanchu.limslaboratory.utils.RedisUtil;
import com.yuanchu.limslaboratory.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-08-03
 */
@Api(tags = "报检管理-->委托检验")
@RestController
@RequestMapping("/link-basic")
public class LinkDetectionController {
    @Autowired
    private LinkBasicInformationService linkBasicInformationService;
    @Autowired
    private MaterialService materialService;
    @Autowired
    private StandardService standardService;
    @ApiOperation("链接-->获取样品名称")
    @GetMapping("/material")
    public Result<?> getMaterialIdAndName(@RequestHeader("link") String link) {
        String redisLink = RedisUtil.get("link").toString();
        if (redisLink.equals(link)){
            LambdaQueryWrapper<Material> wrapper = new LambdaQueryWrapper<>();
            wrapper.select(Material::getId, Material::getName, Material::getCode);
            List<Map<String, Object>> maps = materialService.listMaps(wrapper);
            return Result.success(maps);
        }
        return Result.fail("抱歉链接错误或已过期!");
    }
    @ApiOperation("链接-->获取规格型号")
    @GetMapping("/specification")
    public Result<?> getSpecificationIdAndName(@RequestHeader("link") String link, String materialId) {
        String redisLink = RedisUtil.get("link").toString();
        if (redisLink.equals(link)){
            List<Map<String, Object>> specificationIdAndName = standardService.getSpecificationIdAndName(materialId);
            return Result.success(specificationIdAndName);
        }
        return Result.fail("抱歉链接错误或已过期!");
    }
    @ApiOperation("链接-->添加检验申请单")
    @PostMapping("/addInspection")
    public Result<?> addLinkBasicInformation(@RequestHeader("link") String link, @RequestBody LinkBasicInformation linkBasicInformation) {
        String redisLink = RedisUtil.get("link").toString();
        if (redisLink.equals(link)){
            String code = linkBasicInformationService.addLinkBasicInformation(linkBasicInformation);
            if (!ObjectUtils.isEmpty(code)){
                return Result.success("添加成功!", code);
            } else {
                return Result.fail("添加失败!");
            }
        }
        return Result.fail("抱歉链接错误或已过期!");
    }
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/controller/RawMaterialController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.yuanchu.limslaboratory.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.RawMaterial;
import com.yuanchu.limslaboratory.service.RawMaterialService;
import com.yuanchu.limslaboratory.utils.MyUtil;
import com.yuanchu.limslaboratory.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
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.RestController;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-28
 */
@Api(tags = "报检管理-->原材料报检-->页面版本表")
@RestController
@RequestMapping("/raw-material")
public class RawMaterialController {
    @Autowired
    private RawMaterialService rawMaterialService;
    @ApiOperation("查询所有检验计划分配")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "pageNo", value = "起始页", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "pageSize", value = "每一页数量", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "materialCoding", value = "材料编码", dataTypeClass = String.class),
            @ApiImplicitParam(name = "materialName", value = "材料名称", dataTypeClass = String.class),
            @ApiImplicitParam(name = "condition", value = "状态", dataTypeClass = Integer.class),
            @ApiImplicitParam(name = "createTime", value = "来料日期", dataTypeClass = String.class)
    })
    @GetMapping("/selectAll")
    public Result<?> selectRawMaterial(Integer pageSize, Integer pageNo, String materialCoding, String materialName, Integer condition, String createTime) {
        IPage<RawMaterial> iPage = rawMaterialService.selectRawMaterial(materialCoding, materialName, condition, createTime, new Page<Objects>(pageNo, pageSize));
        Map<String, Object> map = new HashMap<>();
        map.put("row", iPage.getRecords());
        map.put("total", iPage.getTotal());
        return Result.success(map);
    }
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.yuanchu.limslaboratory.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.Inspection;
import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
import java.util.List;
import java.util.Map;
/**
 * ç”³è¯·è¡¨(Inspection)表数据库访问层
 *
 * @author zss
 * @since 2023-08-03 13:03:36
 */
public interface InspectionMapper extends BaseMapper<Inspection> {
    /**
     * æŸ¥è¯¢æ£€éªŒç”³è¯·å•列表
     * @param page
     * @param message
     * @return
     */
    IPage<Map<String, Object>> selectInspectsList(Page<Object> page, String message);
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionMaterialMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.yuanchu.limslaboratory.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yuanchu.limslaboratory.pojo.InspectionMaterial;
/**
 * (样品)检验单里面的物料(InspectionMaterial)表数据库访问层
 *
 * @author zss
 * @since 2023-08-03 13:04:28
 */
public interface InspectionMaterialMapper extends BaseMapper<InspectionMaterial> {
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/InspectionProductMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.yuanchu.limslaboratory.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yuanchu.limslaboratory.pojo.InspectionProduct;
/**
 * ç”³è¯·å•下物料中的项目(InspectionProduct)表数据库访问层
 *
 * @author zss
 * @since 2023-08-03 13:04:54
 */
public interface InspectionProductMapper extends BaseMapper<InspectionProduct> {
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/LinkBasicInformationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.yuanchu.limslaboratory.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.LinkBasicInformation;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-08-03
 */
public interface LinkBasicInformationMapper extends BaseMapper<LinkBasicInformation> {
    IPage<Map<String, Object>> getLinkBasicPage(Page<Object> page, String entrustCoding, String sampleName, String entrusted, Integer inspectionStatus);
    /**
     * æŸ¥è¯¢æ‰€æœ‰å§”托申请和样品
     * @return
     */
    List<Map<String, Object>> selectLinkAll();
    /**
     * é€‰æ‹©å§”托申请和样品
     * @param bid
     * @param did
     * @return
     */
    InspectionVo selectLinkByid(Integer bid, Integer did);
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/LinkDetectionMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.yuanchu.limslaboratory.mapper;
import com.yuanchu.limslaboratory.mybatis_config.MyBaseMapper;
import com.yuanchu.limslaboratory.pojo.LinkDetection;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-08-03
 */
public interface LinkDetectionMapper extends MyBaseMapper<LinkDetection> {
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/mapper/RawMaterialMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.yuanchu.limslaboratory.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.RawMaterial;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-28
 */
public interface RawMaterialMapper extends BaseMapper<RawMaterial> {
    IPage<RawMaterial> selectRawMaterial(String materialCoding, String materialName, Integer condition, String createTime, Page<Objects> page);
    List<RawMaterial> selectRawmaAll();
    InspectionVo selectRawmaById(Integer id);
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/Inspection.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.io.Serializable;
/**
 * ç”³è¯·è¡¨(Inspection)表实体类
 *
 * @author zss
 * @since 2023-08-03 13:04:05
 */
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@Builder
@TableName("inspection")
public class Inspection implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ç”³è¯·å•编号
     **/
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * ç”³è¯·å•编码
     **/
    private String code;
    /**
     * æ£€éªŒç±»åž‹ 0:原材料;1:产品;2:半成品;
     **/
    private Integer type;
    /**
     * æ£€éªŒçŠ¶æ€ï¼š1:合格;0:不合格
     **/
    private Integer inspectionStatus;
    /**
     * ${column.comment}
     **/
    private Integer state;
    /**
     * ç™»è®°æ—¥æœŸ
     **/
    @TableField(fill = FieldFill.INSERT)
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date createTime;
    /**
     * ${column.comment}
     **/
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date updateTime;
    /**
     * å…³è” ç™»è®°äººï¼ˆç”¨æˆ·id)
     **/
    private Integer userId;
    /**
     * æ£€éªŒå¼€å§‹æ—¥æœŸ
     **/
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date startTime;
    /**
     * æ£€éªŒç»“束日期
     **/
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date endTime;
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/InspectionMaterial.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.io.Serializable;
/**
 * (样品)检验单里面的物料(InspectionMaterial)表实体类
 *
 * @author zss
 * @since 2023-08-03 13:04:28
 */
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@Builder
@TableName("inspection_material")
public class InspectionMaterial implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * id
     **/
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * ç‰©æ–™ç¼–码
     **/
    private String code;
    /**
     * ç‰©æ–™åç§°
     **/
    private String name;
    /**
     * æŠ¥æ£€æ•°é‡-物料数量
     **/
    private Integer num;
    /**
     * å•位
     **/
    private String unit;
    /**
     * ä¾›åº”商
     **/
    private String supplier;
    /**
     * è§„格名称-型号名称
     **/
    private String specifications;
    /**
     * æ¥æ–™æ—¥æœŸ
     **/
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date formTime;
    /**
     * ${column.comment}
     **/
    private Integer state;
    /**
     * ${column.comment}
     **/
    @TableField(fill = FieldFill.INSERT)
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date createTime;
    /**
     * ${column.comment}
     **/
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date updateTime;
    /**
     * å…³è” ç”³è¯·å•id
     **/
    private Integer inspectionId;
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/InspectionProduct.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.io.Serializable;
/**
 * ç”³è¯·å•下物料中的项目(InspectionProduct)表实体类
 *
 * @author zss
 * @since 2023-08-03 13:04:55
 */
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@Builder
@TableName("inspection_product")
public class InspectionProduct implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * é¡¹ç›®id
     **/
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * é¡¹ç›®åç§°
     **/
    private String name;
    /**
     * å•位
     **/
    private String unit;
    /**
     * è¦æ±‚值
     **/
    private String required;
    /**
     * å†…控值
     **/
    private String internal;
    /**
     * æ£€æµ‹å€¼
     **/
    private String testValue;
    /**
     * ç»“论 0:不合格;1:合格
     **/
    private Integer testState;
    /**
     * ${column.comment}
     **/
    private Integer state;
    /**
     * ${column.comment}
     **/
    @TableField(fill = FieldFill.INSERT)
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date createTime;
    /**
     * ${column.comment}
     **/
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date updateTime;
    /**
     * å…³è” æŠ¥æ£€ç‰©æ–™id
     **/
    private Integer inspectionMaterialId;
    /**
     * å…³è” ç”¨æˆ·id è¯•验员
     **/
    private Integer userId;
    /**
     * å…³è” è®¾å¤‡id
     **/
    private Integer instrumentId;
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/LinkBasicInformation.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-08-03
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="LinkBasicInformation对象", description="")
public class LinkBasicInformation implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键自增", hidden = true)
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "委托编码", hidden = true)
    private String entrustCoding;
    @ApiModelProperty(value = "委托单位", required = true, example = "阿里巴巴")
    private String entrusted;
    @ApiModelProperty(value = "联系人", required = true, example = "小黑")
    private String contacts;
    @ApiModelProperty(value = "联系电话", required = true, example = "12321423432")
    private String contactNumber;
    @ApiModelProperty(value = "联系地址", required = true, example = "江苏南通")
    private String contactAddress;
    @ApiModelProperty(value = "完成期限", required = true, example = "2023-08-03", dataType = "date")
    private Date completionDeadline;
    @ApiModelProperty(value = "送样时间", required = true, example = "2023-08-03", dataType = "date")
    private Date inspectionTime;
    @ApiModelProperty(value = "送样方式:1送样;2上门", required = true, example = "1")
    private Integer sampleDeliveryMode;
    @ApiModelProperty(value = "送样人:如果送样方式选择了送样,那么必填", example = "小白")
    private String sampleSender;
    @ApiModelProperty(value = "送样人电话:如果送样方式选择了送样,那么必填", example = "123456789676")
    private String sampleDeliveryPhone;
    @ApiModelProperty(value = "报告数", required = true, example = "23")
    private Integer reportNumber;
    @ApiModelProperty(value = "委托备注", example = "委托备注YPBH123456789YPBH123456789YPBH123456789")
    private String entrustRemarks;
    @TableLogic(value = "1", delval = "0")
    @ApiModelProperty(value = "逻辑删除 æ­£å¸¸>=1,删除<=0", hidden = true)
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;
    @TableField(exist = false)
    @ApiModelProperty(value = "检验信息")
    private List<LinkDetection> linkDetectionList;
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/LinkDetection.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-08-03
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="LinkDetection对象", description="")
public class LinkDetection implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键", hidden = true)
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "样品编号", required = true, example = "YPBH123456789")
    private String sampleNumber;
    @ApiModelProperty(value = "样品名称", required = true, example = "发动机")
    private String sampleName;
    @ApiModelProperty(value = "规格型号", required = true, example = "GGXH-AAAAA")
    private String specificationsModels;
    @NotBlank(message = "请填写单位!")
    @ApiModelProperty(value = "单位", required = true, example = "百度")
    private String unit;
    @NotNull(message = "请填写样品数量!")
    @ApiModelProperty(value = "样品数量", required = true, example = "20")
    private Integer samplesNumber;
    @NotBlank(message = "试验不能为空!")
    @ApiModelProperty(value = "试验", required = true, example = "做梦")
    private String experiment;
    @ApiModelProperty(value = "备注", example = "通过了")
    private String remarks;
    @ApiModelProperty(value = "LinkBasicInformation对象Id", hidden = true)
    private Integer linkBasicId;
    @TableLogic(value = "1", delval = "0")
    @ApiModelProperty(value = "逻辑删除 æ­£å¸¸>=1,删除<=0", hidden = true)
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;
    @ApiModelProperty(value = "检验日期", hidden = true)
    private Date dateSurvey;
    @ApiModelProperty(value = "检验状态", hidden = true)
    private Integer inspectionStatus;
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/RawMaterial.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-28
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="RawMaterial对象", description="")
public class RawMaterial implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "供应商名称")
    private String supplierName;
    @ApiModelProperty(value = "材料编码")
    private String materialCoding;
    @ApiModelProperty(value = "材料名称")
    private String materialName;
    @ApiModelProperty(value = "规格型号")
    private String specificationsModels;
    @ApiModelProperty(value = "单位")
    private String unit;
    @ApiModelProperty(value = "数量")
    private Integer quantity;
    @ApiModelProperty(value = "报检日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDateTime inspectionDate;
    @ApiModelProperty(value = "检验人")
    private String surveyor;
    @ApiModelProperty(value = "检验日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDateTime dateSurvey;
    @ApiModelProperty(value = "状态0:待检测;1:已检测")
    private Integer condition;
//    @TableLogic(value = "1", delval = "0")
    @ApiModelProperty(value = "逻辑删除 æ­£å¸¸>=1,删除<=0", hidden = true)
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @ApiModelProperty(value = "创建时间", hidden = true)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @ApiModelProperty(value = "更新时间", hidden = true)
    private Date updateTime;
    @ApiModelProperty(value = "乐观锁", hidden = true)
    private Integer version;
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InsProductVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.yuanchu.limslaboratory.pojo.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;
import java.io.Serializable;
@Data
public class InsProductVo implements Serializable {
    /**
     * é¡¹ç›®åç§°
     **/
    @JsonSerialize
    private String name;
    /**
     * å•位
     **/
    @JsonSerialize
    private String unit;
    /**
     * æ ‡å‡†å€¼
     **/
    @JsonSerialize
    private String required;
    /**
     * å†…控值
     **/
    @JsonSerialize
    private String internal;
    /**
     * æ£€æµ‹å€¼
     **/
    @JsonSerialize
    private String testValue;
    /**
     * ç»“论 0:不合格;1:合格
     **/
    @JsonSerialize
    private Integer testState;
    /**
     * è®¾å¤‡åç§°
     **/
    @JsonSerialize
    private String instrumentName;
    /**
     * å…³è” ç”³è¯·å•id
     **/
    @JsonSerialize
    private Integer inspectionMaterialId;
    /**
     *  æ£€éªŒå‘˜
     **/
    @JsonSerialize
    private String userName;
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InspectDetailVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,94 @@
package com.yuanchu.limslaboratory.pojo.vo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Data
//查询检验单详情(检验基本信息以及检验项目信息)
public class InspectDetailVo implements Serializable {
    /* æ£€éªŒè¯¦æƒ… */
    /**
     * æ¥æ–™æ—¥æœŸ
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date formTime;
    /**
     * ä¾›åº”商
     **/
    @JsonSerialize
    private String supplier;
    /**
     * åŽŸææ–™ç¼–ç 
     */
    @JsonSerialize
    private String code;
    /**
     * åŽŸææ–™åç§°
     */
    @JsonSerialize
    private String name;
    /**
     * åž‹å·è§„æ ¼
     */
    @JsonSerialize
    private String specifications;
    /**
     * å•位
     */
    @JsonSerialize
    private String unit;
    /**
     * æ•°é‡
     */
    @JsonSerialize
    private Integer num;
    /**
     * æ£€éªŒå¼€å§‹æ—¥æœŸ
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date startTime;
    /**
     * æ£€éªŒç»“束日期
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date endTime;
    /**
     * æŠ¥æ£€äººï¼ˆå½“前用户名)
     */
    @JsonSerialize
    private String userName;
    /* æ£€éªŒé¡¹ç›® */
    @JsonSerialize
    private List<InsProductVo> insProducts;
    /* æ£€éªŒç»“论 */
    /**
     * åˆæ ¼çŠ¶æ€ 0:不合格;1:合格
     */
    @JsonSerialize
    private Integer inspectionStatus;
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/pojo/vo/InspectionVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.yuanchu.limslaboratory.pojo.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
//新增检验单
@Data
public class InspectionVo implements Serializable {
    /**
     *检验类型 0:原材料;1:产品;2:半成品;
     **/
    @JsonSerialize
    private Integer type;
    /**
     * æ¥æ–™æ—¥æœŸ
     **/
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date formTime;
    /**
     * ä¾›åº”商
     **/
    @JsonSerialize
    private String supplier;
    /**
     * ç‰©æ–™ç¼–码
     **/
    @JsonSerialize
    private String mcode;
    /**
     * ç‰©æ–™åç§°
     **/
    @JsonSerialize
    private String name;
    /**
     * è§„格名称-型号名称
     **/
    @JsonSerialize
    private String specifications;
    /**
     * å•位
     **/
    @JsonSerialize
    private String unit;
    /**
     * æŠ¥æ£€æ•°é‡-物料数量
     **/
    @JsonSerialize
    private Integer num;
    /**
     * æ£€éªŒå¼€å§‹æ—¥æœŸ
     **/
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date startTime;
    /**
     * æ£€éªŒç»“束日期
     **/
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date endTime;
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionMaterialService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.yuanchu.limslaboratory.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuanchu.limslaboratory.pojo.InspectionMaterial;
/**
 * (样品)检验单里面的物料(InspectionMaterial)表服务接口
 *
 * @author zss
 * @since 2023-08-03 13:04:28
 */
public interface InspectionMaterialService extends IService<InspectionMaterial> {
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionProductService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.yuanchu.limslaboratory.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuanchu.limslaboratory.pojo.InspectionProduct;
import com.yuanchu.limslaboratory.pojo.vo.InsProductVo;
/**
 * ç”³è¯·å•下物料中的项目(InspectionProduct)表服务接口
 *
 * @author zss
 * @since 2023-08-03 13:04:54
 */
public interface InspectionProductService extends IService<InspectionProduct> {
    /**
     * æ›´æ–°æ£€éªŒé¡¹ç›®
     * @param userId
     * @param inspectionProduct
     * @return
     */
    boolean updateInsProduct(Integer userId, InspectionProduct inspectionProduct);
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/InspectionService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package com.yuanchu.limslaboratory.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuanchu.limslaboratory.pojo.Inspection;
import com.yuanchu.limslaboratory.pojo.vo.InspectDetailVo;
import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
import java.util.List;
import java.util.Map;
/**
 * ç”³è¯·è¡¨(Inspection)表服务接口
 *
 * @author zss
 * @since 2023-08-03 13:03:36
 */
public interface InspectionService extends IService<Inspection> {
    /**
     *查询检验申请单列表
     * @param page
     * @param message
     * @return
     */
    IPage<Map<String, Object>> selectInspectsList(Page<Object> page, String message);
    /**
     * æ–°å¢žæ£€éªŒç”³è¯·è¡¨
     * @param id
     * @param
     * @return
     */
    Integer addInspect(Integer id, InspectionVo inspectionVo);
    /**
     *根据检验单id查询原材料检验单详情
     * @param id
     * @return
     */
    InspectDetailVo selectInspectsListById(Integer id);
    /**
     * ä¸ŠæŠ¥(更新检验单检验结果)
     * @param id
     * @return
     */
    boolean updateInspectsById(Integer id);
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/LinkBasicInformationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.yuanchu.limslaboratory.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.LinkBasicInformation;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-08-03
 */
public interface LinkBasicInformationService extends IService<LinkBasicInformation> {
    @Transactional(rollbackFor = Exception.class)
    String addLinkBasicInformation(LinkBasicInformation linkBasicInformation);
    IPage<Map<String, Object>> getLinkBasicPage(Page<Object> page, String entrustCoding, String sampleName, String entrusted, Integer inspectionStatus);
    /**
     *查询所有委托检验和样品
     * @return
     */
    List<Map<String, Object>> selectLinkAll();
    /**
     * æ ¹æ®å§”托检验id和样品id查询委托检验和样品
     * @param bid
     * @param did
     * @return
     */
    InspectionVo selectLinkByid(Integer bid, Integer did);
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/LinkDetectionService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.yuanchu.limslaboratory.service;
import com.yuanchu.limslaboratory.pojo.LinkDetection;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-08-03
 */
public interface LinkDetectionService extends IService<LinkDetection> {
    // æ‰¹é‡æ·»åŠ 
    void insertListData(Integer id, List<LinkDetection> linkDetectionList);
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/RawMaterialService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.yuanchu.limslaboratory.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.RawMaterial;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 * æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-28
 */
public interface RawMaterialService extends IService<RawMaterial> {
    IPage<RawMaterial> selectRawMaterial(String materialCoding, String materialName, Integer condition, String createTime, Page<Objects> page);
    /**
     * æŸ¥è¯¢åŽŸææ–™æ£€éªŒ
     *
     * @return
     */
    List<RawMaterial> selectRawmaAll();
    /**
     * é€‰æ‹©åŽŸææ–™æŠ¥æ£€
     *
     * @param id
     * @return
     */
    InspectionVo selectRawmaById(Integer id, String startTime, String endTime) throws ParseException;
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionMaterialServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.yuanchu.limslaboratory.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.limslaboratory.mapper.InspectionMaterialMapper;
import com.yuanchu.limslaboratory.pojo.InspectionMaterial;
import com.yuanchu.limslaboratory.service.InspectionMaterialService;
import org.springframework.stereotype.Service;
/**
 * (样品)检验单里面的物料(InspectionMaterial)表服务实现类
 *
 * @author zss
 * @since 2023-08-03 13:04:28
 */
@Service
public class InspectionMaterialServiceImpl extends ServiceImpl<InspectionMaterialMapper, InspectionMaterial> implements InspectionMaterialService {
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionProductServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.yuanchu.limslaboratory.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.limslaboratory.mapper.InspectionProductMapper;
import com.yuanchu.limslaboratory.pojo.InspectionProduct;
import com.yuanchu.limslaboratory.pojo.vo.InsProductVo;
import com.yuanchu.limslaboratory.service.InspectionProductService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
 * ç”³è¯·å•下物料中的项目(InspectionProduct)表服务实现类
 *
 * @author zss
 * @since 2023-08-03 13:04:54
 */
@Service
public class InspectionProductServiceImpl extends ServiceImpl<InspectionProductMapper, InspectionProduct> implements InspectionProductService {
    @Resource
    InspectionProductMapper inspectionProductMapper;
    //更新检验项目
    @Override
    public boolean updateInsProduct(Integer userId, InspectionProduct inspectionProduct) {
        //赋值检验员id
        inspectionProduct.setUserId(userId);
        //判断检测值是否满足标准值和内控值的要求,如果不满足则检验结论为不合格0
        String testValue = inspectionProduct.getTestValue();//检验值
        String required = inspectionProduct.getRequired();//标准值
        String internal = inspectionProduct.getInternal();//内控值
        inspectionProduct.setTestState(checkValues(required, internal, testValue));
        //根据检验项目名和关联的检验物料id来查询检验项目的数据
        LambdaUpdateWrapper<InspectionProduct> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(InspectionProduct::getInspectionMaterialId, inspectionProduct.getInspectionMaterialId())
                .eq(InspectionProduct::getName, inspectionProduct.getName());
        inspectionProductMapper.update(inspectionProduct, updateWrapper);
        return true;
    }
    /*判断检测值是否满足标准值和内控值的要求,如果不满足则检验结论为不合格*/
    private int checkValues(String standardValueStr, String controlValueStr, String detectionValueStr) {
        boolean isStandardValueSatisfied = isValueSatisfied(standardValueStr, detectionValueStr);
        boolean isControlValueSatisfied = isValueSatisfied(controlValueStr, detectionValueStr);
        if (isStandardValueSatisfied && isControlValueSatisfied) {
            return 1;
        } else {
            return 0;
        }
    }
    private boolean isValueSatisfied(String valueStr, String detectionValueStr) {
        String substring = valueStr.substring(1, 2);
        if (substring.equals("=")) {
            String operator = valueStr.substring(0, 2);
            Double standardValue = Double.parseDouble(valueStr.substring(2));
            Double detectionValue = Double.parseDouble(detectionValueStr);
            switch (operator) {
                case ">=":
                    return detectionValue >= standardValue;
                case "<=":
                    return detectionValue <= standardValue;
                default:
                    return false;
            }
        } else {
            String operator = valueStr.substring(0, 1);
            Double standardValue = Double.parseDouble(valueStr.substring(1));
            Double detectionValue = Double.parseDouble(detectionValueStr);
            switch (operator) {
                case ">":
                    return detectionValue > standardValue;
                case "≥":
                    return detectionValue >= standardValue;
                case "≤":
                    return detectionValue <= standardValue;
                case "<":
                    return detectionValue < standardValue;
                case "=":
                    return detectionValue.equals(standardValue);
                default:
                    return false;
            }
        }
    }
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InspectionServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,199 @@
package com.yuanchu.limslaboratory.service.impl;
import cn.hutool.core.lang.Snowflake;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.limslaboratory.mapper.*;
import com.yuanchu.limslaboratory.pojo.*;
import com.yuanchu.limslaboratory.pojo.vo.InsProductVo;
import com.yuanchu.limslaboratory.pojo.vo.InspectDetailVo;
import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
import com.yuanchu.limslaboratory.service.*;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
 * ç”³è¯·è¡¨(Inspection)表服务实现类
 *
 * @author zss
 * @since 2023-08-03 13:03:36
 */
@Service
public class InspectionServiceImpl extends ServiceImpl<InspectionMapper, Inspection> implements InspectionService {
    @Resource
    InspectionMapper inspectionMapper;
    @Resource
    InspectionMaterialMapper inspectionMaterialMapper;
    @Resource
    InspectionProductService inspectionProductService;
    @Resource
    InspectionProductMapper inspectionProductMapper;
    @Resource
    MaterialMapper materialMapper;
    @Resource
    StandardService standardService;
    @Resource
    SpecificationsService specificationsService;
    @Resource
    ProductMapper productMapper;
    @Resource
    InstrumentService instrumentService;
    @Resource
    UserMapper userMapper;
    /**
     * æŸ¥è¯¢æ£€éªŒç”³è¯·å•列表
     *
     * @param message
     * @return
     */
    @Override
    public IPage<Map<String, Object>> selectInspectsList(Page<Object> page, String message) {
        return inspectionMapper.selectInspectsList(page, message);
    }
    /**
     * æ–°å¢žæ£€éªŒç”³è¯·è¡¨
     *
     * @param id
     * @param
     * @return
     */
    @Override
    public Integer addInspect(Integer id, InspectionVo inspectionVo) {
        /*新增检验申请表*/
        Inspection inspection = Inspection.builder()
                .startTime(inspectionVo.getStartTime())
                .endTime(inspectionVo.getEndTime())
                .type(inspectionVo.getType())
                .code(new Snowflake(1, 1).nextIdStr())
                .userId(id)
                .build();
        inspectionMapper.insert(inspection);
        /*新增检验样品表*/
        InspectionMaterial inspectionMaterial = InspectionMaterial.builder()
                .code(inspectionVo.getMcode())
                .name(inspectionVo.getName())
                .num(inspectionVo.getNum())
                .unit(inspectionVo.getUnit())
                .supplier(inspectionVo.getSupplier())
                .specifications(inspectionVo.getSpecifications())
                .formTime(inspectionVo.getFormTime())
                .inspectionId(inspection.getId())
                .build();
        inspectionMaterialMapper.insert(inspectionMaterial);
        /*新增检验项目表*/
        //获取物料id
        Material material = materialMapper.selectOne(Wrappers.<Material>query()
                .eq("name", inspectionVo.getName())
                .eq("code", inspectionVo.getMcode()));
        //获取规格名称和型号名称
        String specification = inspectionVo.getSpecifications();
        String[] split = specification.split("-");
        String stName = split[0];
        String spName = split[1];
        //获取规格id
        Standard standard = standardService.getOne(Wrappers.<Standard>query()
                .eq("name", stName)
                .eq("material_id", material.getId()));
        //获取型号id
        Specifications specifications = specificationsService.getOne(Wrappers.<Specifications>query()
                .eq("name", spName)
                .eq("standard_id", standard.getId()));
        //根据型号id查询项目信息
        List<Product> productList = productMapper.selectList(Wrappers.<Product>query().eq("specifications_id", specifications.getId()));
        ArrayList<InspectionProduct> list = new ArrayList<>();
        for (Product product : productList) {
            InspectionProduct rawInsProduct = InspectionProduct.builder()
                    .name(product.getName())
                    .unit(product.getUnit())
                    .required(product.getRequired())
                    .internal(product.getInternal())
                    .inspectionMaterialId(material.getId())
                    .build();
            list.add(rawInsProduct);
        }
        //检验项目批量添加
        inspectionProductService.saveBatch(list);
        return inspection.getId();
    }
    //根据检验单id查询原材料检验单详情
    @Override
    public InspectDetailVo selectInspectsListById(Integer id) {
        /*将检验单基本信息查询出来并封装到RawInspectVo对象中*/
        Inspection inspection = inspectionMapper.selectById(id);
        InspectDetailVo inspectDetailVo = new InspectDetailVo();
        //报检人
        User user = userMapper.selectById(inspection.getUserId());
        inspectDetailVo.setUserName(user.getName());
        //报检开始时间和结束时间
        inspectDetailVo.setStartTime(inspection.getStartTime());
        inspectDetailVo.setEndTime(inspection.getEndTime());
        //检验结论
        inspectDetailVo.setInspectionStatus(inspection.getInspectionStatus());
        //查询检验物料
        InspectionMaterial inspectionMaterial = inspectionMaterialMapper.selectOne(Wrappers.<InspectionMaterial>query().eq("inspection_id", id));
        //来料日期,供应商名称,原材料编码,原材料名称,规格型号,单位,数量
        BeanUtils.copyProperties(inspectionMaterial, inspectDetailVo);
        /*查询检验单里面的检验项目,并封装到RawInspectVo对象中*/
        LambdaQueryWrapper<InspectionProduct> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(InspectionProduct::getInspectionMaterialId, inspectionMaterial.getId());
        List<InspectionProduct> inspectionProducts = inspectionProductMapper.selectList(queryWrapper);
        //这里查到的设备id和检验员id要查询名称
        List<InsProductVo> insProductVos = inspectionProducts.stream().map(insProduct -> {
            //将一个对象的值赋值给另一个对象
            InsProductVo insProductVo = new InsProductVo();
            BeanUtils.copyProperties(insProduct, insProductVo);
            //获取设备名(前提是如果存在)
            if (insProduct.getInstrumentId() != null) {
                String equipmentName = instrumentService.getById(insProduct.getInstrumentId()).getEquipmentName();
                insProductVo.setInstrumentName(equipmentName);
            }
            //获取用户名(前提是如果存在)
            if (insProduct.getUserId() != null) {
                String userName = userMapper.selectById(insProduct.getUserId()).getName();
                insProductVo.setUserName(userName);
            }
            //项目关联物料id
            insProductVo.setInspectionMaterialId(inspectionMaterial.getId());
            return insProductVo;
        }).collect(Collectors.toList());
        inspectDetailVo.setInsProducts(insProductVos);
        return inspectDetailVo;
    }
    //更新检验单检验结果
    @Override
    public boolean updateInspectsById(Integer id) {
        //更新检验单里面的检验状态和检验结论
        InspectDetailVo inspectDetailVo = selectInspectsListById(id);
        Inspection inspection = Inspection.builder()
                .id(id)
                .inspectionStatus(inspectDetailVo.getInspectionStatus())
                .build();
        inspectionMapper.updateById(inspection);
        //生成报告单
        return true;
    }
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/LinkBasicInformationServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.yuanchu.limslaboratory.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.LinkBasicInformation;
import com.yuanchu.limslaboratory.mapper.LinkBasicInformationMapper;
import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
import com.yuanchu.limslaboratory.service.LinkBasicInformationService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.limslaboratory.service.LinkDetectionService;
import com.yuanchu.limslaboratory.utils.MyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-08-03
 */
@Service
public class LinkBasicInformationServiceImpl extends ServiceImpl<LinkBasicInformationMapper, LinkBasicInformation> implements LinkBasicInformationService {
    @Resource
    private LinkBasicInformationMapper linkBasicInformationMapper;
    @Autowired
    private LinkDetectionService linkDetectionService;
    @Override
    public String addLinkBasicInformation(LinkBasicInformation linkBasicInformation) {
        String code = MyUtil.getTimeSixNumberCode("SL");
        linkBasicInformation.setEntrustCoding(code);
        int insert = linkBasicInformationMapper.insert(linkBasicInformation);
        if (insert == 1) {
            linkDetectionService.insertListData(linkBasicInformation.getId(), linkBasicInformation.getLinkDetectionList());
            return code;
        }
        return null;
    }
    @Override
    public IPage<Map<String, Object>> getLinkBasicPage(Page<Object> page, String entrustCoding, String sampleName, String entrusted, Integer inspectionStatus) {
        return linkBasicInformationMapper.getLinkBasicPage(page, entrustCoding, sampleName, entrusted, inspectionStatus);
    }
    //查询所有委托检验和样品
    @Override
    public List<Map<String, Object>> selectLinkAll() {
        return linkBasicInformationMapper.selectLinkAll();
    }
    //根据委托检验id和样品id查询委托检验和样品
    @Override
    public InspectionVo selectLinkByid(Integer bid, Integer did) {
        InspectionVo inspectionVo = linkBasicInformationMapper.selectLinkByid(bid, did);
        inspectionVo.setType(1);
        return inspectionVo;
    }
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/LinkDetectionServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.yuanchu.limslaboratory.service.impl;
import com.yuanchu.limslaboratory.pojo.LinkDetection;
import com.yuanchu.limslaboratory.mapper.LinkDetectionMapper;
import com.yuanchu.limslaboratory.service.LinkDetectionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-08-03
 */
@Service
public class LinkDetectionServiceImpl extends ServiceImpl<LinkDetectionMapper, LinkDetection> implements LinkDetectionService {
    @Resource
    private LinkDetectionMapper linkDetectionMapper;
    // æ‰¹é‡æ·»åŠ 
    @Override
    public void insertListData(Integer id, List<LinkDetection> linkDetectionList) {
        for (LinkDetection linkDetection:linkDetectionList){
            linkDetection.setLinkBasicId(id);
        }
        linkDetectionMapper.insertBatchSomeColumn(linkDetectionList);
    }
}
inspection-server/src/main/java/com/yuanchu/limslaboratory/service/impl/RawMaterialServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
package com.yuanchu.limslaboratory.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.Instrument;
import com.yuanchu.limslaboratory.pojo.RawMaterial;
import com.yuanchu.limslaboratory.mapper.RawMaterialMapper;
import com.yuanchu.limslaboratory.pojo.vo.InspectionVo;
import com.yuanchu.limslaboratory.service.RawMaterialService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 * æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-28
 */
@Service
public class RawMaterialServiceImpl extends ServiceImpl<RawMaterialMapper, RawMaterial> implements RawMaterialService {
    @Resource
    private RawMaterialMapper rawMaterialMapper;
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param materialCoding
     * @param materialName
     * @param condition
     * @param createTime
     * @param page
     * @return
     */
    @Override
    public IPage<RawMaterial> selectRawMaterial(String materialCoding, String materialName, Integer condition, String createTime, Page<Objects> page) {
        return rawMaterialMapper.selectRawMaterial(materialCoding, materialName, condition, createTime, page);
    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰åŽŸææ–™æŠ¥æ£€å•
     *
     * @return
     */
    @Override
    public List<RawMaterial> selectRawmaAll() {
        return rawMaterialMapper.selectRawmaAll();
    }
    /**
     * é€‰æ‹©åŽŸææ–™æŠ¥æ£€
     *
     * @param id
     * @return
     */
    @Override
    public InspectionVo selectRawmaById(Integer id, String startTime, String endTime) throws ParseException {
        InspectionVo inspectionVo = rawMaterialMapper.selectRawmaById(id);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        inspectionVo.setStartTime(formatter.parse(startTime));
        inspectionVo.setEndTime(formatter.parse(endTime));
        inspectionVo.setType(0);
        return inspectionVo;
    }
}
inspection-server/src/main/resources/mapper/InspectionMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
<?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.yuanchu.limslaboratory.mapper.InspectionMapper">
    <select id="selectInspectsList" resultType="map">
        select i.id,
        i.code icode,
        type,
        DATE_FORMAT(`form_time`,'%Y-%m-%d'),
        supplier,
        im.code mcode,
        im.name,
        specifications,
        unit,
        num,
        DATE_FORMAT(i.`create_time`,'%Y-%m-%d'),
        u.name userName,
        inspection_status,
        DATE_FORMAT(i.`start_time`,'%Y-%m-%d'),
        DATE_FORMAT(i.`end_time`,'%Y-%m-%d')
        from lims_laboratory.inspection i
        join lims_laboratory.user u on i.user_id = u.id
        join lims_laboratory.inspection_material im on i.id = im.inspection_id
        where   i.state=1
        <if test="message!=null">
            and i.code like concat('%', #{message}, '%')
            or im.name like concat('%', #{message}, '%')
        </if>
    </select>
</mapper>
inspection-server/src/main/resources/mapper/InspectionMaterialMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
<?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.yuanchu.limslaboratory.mapper.InspectionMaterialMapper">
</mapper>
inspection-server/src/main/resources/mapper/InspectionProductMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,4 @@
<?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.yuanchu.limslaboratory.mapper.InspectionProductMapper">
</mapper>
inspection-server/src/main/resources/mapper/LinkBasicInformationMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
<?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.yuanchu.limslaboratory.mapper.LinkBasicInformationMapper">
    <select id="getLinkBasicPage" resultType="map">
        SELECT l.`id`, l.`entrust_coding`, l.`entrusted`, d.`samples_number`, d.`sample_name`, d.`specifications_models`,
            DATE_FORMAT(l.`inspection_time`,'%Y-%m-%d') inspectionTime, DATE_FORMAT(l.`completion_deadline`,'%Y-%m-%d') inspectionTime, l.`contacts`, d.`date_survey`, d.`inspection_status`
        FROM link_basic_information l, link_detection d
        WHERE l.`id` = d.`link_basic_id`
        AND l.`state` = 1
        <if test="entrustCoding != null and entrustCoding != null">
            AND l.`entrust_coding` like concat('%', #{entrustCoding}, '%')
        </if>
        <if test="sampleName != null and sampleName != null">
            AND d.`sample_name` like concat('%', #{sampleName}, '%')
        </if>
        <if test="entrusted != null and entrusted != null">
            AND l.`contacts` like concat('%', #{entrusted}, '%')
        </if>
        <if test="inspectionStatus != null and inspectionStatus != null">
            AND d.`inspection_status` = #{inspectionStatus}
        </if>
    </select>
    <select id="selectLinkAll" resultType="java.util.Map">
        SELECT l.`id`, l.`entrust_coding`, l.`entrusted`, d.`samples_number`, d.`sample_name`, d.`specifications_models`,
        DATE_FORMAT(l.`inspection_time`,'%Y-%m-%d') inspectionTime, l.`completion_deadline`, l.`contacts`, d.`date_survey`, d.`inspection_status`
        FROM lims_laboratory.link_basic_information l, lims_laboratory.link_detection d
        WHERE l.`id` = d.`link_basic_id`
        AND l.`state` = 1
    </select>
    <select id="selectLinkByid" resultType="com.yuanchu.limslaboratory.pojo.vo.InspectionVo">
        SELECT l.`inspection_time` formTime,
        l.`entrusted` supplier,
        d.`sample_number` mcode,
        d.`sample_name` name,
        d.`specifications_models` specifications,
        d.`unit`,
        d.`samples_number` num,
        d.date_survey startTime,
        l.completion_deadline endTime
        FROM lims_laboratory.link_basic_information l, lims_laboratory.link_detection d
        WHERE l.`id` = d.`link_basic_id`
          AND l.`state` = 1
        <if test="bid!=null">
            and l.id=#{bid}
        </if>
        <if test="did!=null">
            and d.id=#{did}
        </if>
    </select>
</mapper>
inspection-server/src/main/resources/mapper/LinkDetectionMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
<?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.yuanchu.limslaboratory.mapper.LinkDetectionMapper">
</mapper>
inspection-server/src/main/resources/mapper/RawMaterialMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
<?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.yuanchu.limslaboratory.mapper.RawMaterialMapper">
    <select id="selectRawMaterial" resultType="com.yuanchu.limslaboratory.pojo.RawMaterial">
        SELECT *
        FROM raw_material r
        where r.state = 1
        <if test="materialCoding != null and materialCoding != ''">
            AND r.`material_coding` LIKE CONCAT('%',#{materialCoding},'%')
        </if>
        <if test="materialName != null and materialName != ''">
            AND r.`material_name` LIKE CONCAT('%',#{materialName},'%')
        </if>
        <if test="condition != null and condition != ''">
            AND r.`condition` = #{condition}
        </if>
        <if test="createTime != null and createTime != ''">
            AND DATE_FORMAT(r.`create_time`,'%Y-%m-%d') = #{createTime}
        </if>
    </select>
    <select id="selectRawmaAll" resultType="com.yuanchu.limslaboratory.pojo.RawMaterial">
        select * from lims_laboratory.raw_material where state=1
    </select>
    <select id="selectRawmaById" resultType="com.yuanchu.limslaboratory.pojo.vo.InspectionVo">
        select create_time formTime,
               supplier_name supplier,
               material_coding mcode,
               material_name name,
               specifications_models specifications,
               unit ,
               quantity num
        from lims_laboratory.raw_material
        where id=#{id}
    </select>
</mapper>
laboratory-server/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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>lims-laboratory</artifactId>
        <groupId>com.yuanchu</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.yunchu.limslaboratory</groupId>
    <artifactId>laboratory-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>laboratory-server</name>
    <description>laboratory-server</description>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>com.yunchu.limslaboratory</groupId>
            <artifactId>framework</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <dependency>
            <groupId>com.yunchu.limslaboratory</groupId>
            <artifactId>user-server</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
    </dependencies>
</project>
laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/ClassifyController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
package com.yuanchu.limslaboratory.controller;
import com.yuanchu.limslaboratory.pojo.Classify;
import com.yuanchu.limslaboratory.pojo.dto.UpdateClassifyDto;
import com.yuanchu.limslaboratory.service.ClassifyService;
import com.yuanchu.limslaboratory.utils.JackSonUtil;
import com.yuanchu.limslaboratory.utils.MyUtil;
import com.yuanchu.limslaboratory.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
@Api(tags = "实验室-->1、设备台账-->1、分类模块")
@RestController
@RequestMapping("/classify")
public class ClassifyController {
    @Autowired
    private ClassifyService classifyService;
    @ApiOperation("添加分类")
    @PostMapping("/add")
    public Result<?> addClassifyInformation(@RequestBody Classify classify) {
        Integer isAddClassifySuccess = classifyService.addClassifyInformation(classify);
        if (isAddClassifySuccess == 1) {
            return Result.success("添加分类【"+ classify.getSonName() +"】成功!");
        } else if (isAddClassifySuccess == 2) {
            return Result.fail("抱歉重复添加分类名称【"+ classify.getSonName() +"】,添加失败!");
        }
        return Result.fail("添加分类【"+ classify.getSonName() +"】失败!");
    }
    @ApiOperation("分类侧边栏列表:如果sonName为空,则带着father_name的Id进行点击操作")
    @GetMapping("/list")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(value = "分类名称", name = "classifyName", dataTypeClass = String.class)
    })
    public Result<?> getListClassifyInformation(String classifyName) {
        return Result.success(classifyService.getListClassifyInformation(classifyName));
    }
    @ApiOperation("删除分类")
    @DeleteMapping("/delete")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(value = "分类Id", name = "classifyId", dataTypeClass = String.class)
    })
    public Result<?> deleteClassifyInformation(String classifyId) {
        Boolean isDeleteSuccess = classifyService.deleteClassifyInformation(classifyId);
        if (isDeleteSuccess){
            return Result.success("删除分类成功!");
        }
        return Result.fail("删除分类失败!");
    }
    @ApiOperation("更新分类")
    @PutMapping("/update")
    public Result<?> updateClassifyInformation(@RequestBody UpdateClassifyDto updateClassifyDto) throws Exception {
        Classify classify = JackSonUtil.unmarshal(JackSonUtil.marshal(updateClassifyDto), Classify.class);
        Boolean isUpdateClassifySuccess = classifyService.updateClassifyInformation(classify);
        if (isUpdateClassifySuccess){
            return Result.success("更新分类成功!");
        }
        return Result.fail("更新分类失败!");
    }
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/EquipmentPointController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
package com.yuanchu.limslaboratory.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.EquipmentPoint;
import com.yuanchu.limslaboratory.pojo.dto.UpdateEquipmentPointDto;
import com.yuanchu.limslaboratory.service.EquipmentPointService;
import com.yuanchu.limslaboratory.utils.JackSonUtil;
import com.yuanchu.limslaboratory.utils.MyUtil;
import com.yuanchu.limslaboratory.utils.RedisUtil;
import com.yuanchu.limslaboratory.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
@Api(tags = "实验室-->1、设备台账-->3、设备码点")
@RestController
@RequestMapping("/equipment-point")
public class EquipmentPointController {
    @Autowired
    private EquipmentPointService equipmentPointService;
    @ApiOperation("添加设备码点")
    @PostMapping("/add")
    public Result<?> addEquipmentPointInformation(@RequestHeader("X-Token") String token, @RequestBody EquipmentPoint equipmentPoint) throws Exception {
        Object object = RedisUtil.get(token);
        Map<String, Object> unmarshal = JackSonUtil.unmarshal(JackSonUtil.marshal(object), Map.class);
        equipmentPoint.setUserId((Integer) unmarshal.get("id"));
        Integer isInsertSuccess = equipmentPointService.addEquipmentPointInformation(equipmentPoint);
        if (isInsertSuccess == 1){
            return Result.success("添加【"+ equipmentPoint.getEquipmentPointName() +"】成功!");
        }
        return Result.fail("添加【"+ equipmentPoint.getEquipmentPointName() +"】失败!设备码点编码重复!");
    }
    @ApiOperation("根据仪器Id查询对应设备码点数据")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "InstrumentId", value = "仪器模块Id", dataTypeClass = String.class, required = true)
    })
    @GetMapping("/list")
    public Result<?> getListEquipmentPointInformation(String InstrumentId) {
        List<Map<String, Object>> list = equipmentPointService.getListEquipmentPointInformation(InstrumentId);
        return Result.success(list);
    }
    @ApiOperation("根据码点Id删除数据")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "equipmentPointId", value = "设备码点Id", dataTypeClass = Integer.class, required = true)
    })
    @DeleteMapping("/delete")
    public Result<?> deleteEquipmentPointInformation(Integer equipmentPointId) {
        Integer isDeleteSuccess = equipmentPointService.deleteEquipmentPointInformation(equipmentPointId);
        if (isDeleteSuccess == 1){
            return Result.success("删除成功!");
        }
        return Result.fail("删除失败!");
    }
    @ApiOperation("根据码点Id更新数据")
    @PutMapping("/update")
    public Result<?> updateEquipmentPointInformation(@RequestHeader("X-Token") String token, @RequestBody UpdateEquipmentPointDto updateEquipmentPointDto) throws Exception {
        Object object = RedisUtil.get(token);
        Map<String, Object> unmarshal = JackSonUtil.unmarshal(JackSonUtil.marshal(object), Map.class);
        EquipmentPoint equipmentPoint = JackSonUtil.unmarshal(JackSonUtil.marshal(updateEquipmentPointDto), EquipmentPoint.class);
        equipmentPoint.setUserId((Integer) unmarshal.get("id"));
        Integer isUpdateSuccess = equipmentPointService.updateEquipmentPointInformation(equipmentPoint);
        if (isUpdateSuccess == 1){
            return Result.success("更新成功!");
        }
        return Result.fail("更新失败!");
    }
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/InstrumentController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,119 @@
package com.yuanchu.limslaboratory.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.Instrument;
import com.yuanchu.limslaboratory.pojo.dto.UpdateInstrumentDto;
import com.yuanchu.limslaboratory.service.InstrumentService;
import com.yuanchu.limslaboratory.service.UserService;
import com.yuanchu.limslaboratory.utils.JackSonUtil;
import com.yuanchu.limslaboratory.utils.RedisUtil;
import com.yuanchu.limslaboratory.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
@Api(tags = "实验室-->1、设备台账-->2、仪器模块")
@RestController
@RequestMapping("/instrument")
public class InstrumentController {
    @Autowired
    private InstrumentService instrumentService;
    @Autowired
    private UserService userService;
    @ApiOperation("添加仪器设备")
    @PostMapping("/add")
    public Result<?> addInstrumentInformation(@RequestHeader("X-Token") String token, @RequestBody Instrument instrument) throws Exception {
        Object object = RedisUtil.get(token);
        Map<String, Object> unmarshal = JackSonUtil.unmarshal(JackSonUtil.marshal(object), Map.class);
        instrument.setCreateUserId((Integer) unmarshal.get("id"));
        Integer isInsertSuccess = instrumentService.addInstrumentInformation(instrument);
        if (isInsertSuccess == 1){
            return Result.success("添加【" + instrument.getEquipmentName() + "】成功!");
        }
        return Result.fail("仪器设备编号重复,添加【" + instrument.getEquipmentName() + "】失败! ");
    }
    @ApiOperation("根据分类Id:分页列表展示")
    @GetMapping("/list")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "classifyId", value = "分类Id", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "pageNo", value = "起始页", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "pageSize", value = "每一页数量", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "conditions", value = "查询状态:默认全部", dataTypeClass = Integer.class),
            @ApiImplicitParam(name = "whetherWhether", value = "是否已过期", dataTypeClass = Boolean.class),
            @ApiImplicitParam(name = "numberOrNameOrSpecifications", value = "编号/设备名称/规格型号", dataTypeClass = String.class)
    })
    public Result<?> getListInstrumentInformation(Integer pageNo,
                                                  Integer pageSize,
                                                  Integer conditions,
                                                  Integer classifyId,
                                                  Boolean whetherWhether,
                                                  String numberOrNameOrSpecifications) {
        IPage<Map<String, Object>> pageList = instrumentService.getListInstrumentInformation(conditions, whetherWhether, numberOrNameOrSpecifications,
                classifyId, new Page<Objects>(pageNo, pageSize));
        Map<String, Object> map = new HashMap<>();
        map.put("row", pageList.getRecords());
        map.put("total", pageList.getTotal());
        return Result.success(map);
    }
    @ApiOperation("删除仪器数据")
    @DeleteMapping("/delete")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "instrumentId", value = "仪器Id", dataTypeClass = String.class, required = true)
    })
    public Result<?> deleteInstrumentInformation(String instrumentId) {
        Boolean isDeleteSuccess = instrumentService.deleteInstrumentInformation(instrumentId);
        if (isDeleteSuccess){
            return Result.success("删除仪器成功!");
        }
        return Result.fail("删除仪器失败!");
    }
    @ApiOperation("添加仪器时保管人下拉框数据")
    @GetMapping("/get_user")
    public Result<?> getMapUserInformation() {
        return Result.success(userService.getUserNameAndId());
    }
    @ApiOperation("根据仪器Id获取信息用于编辑")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "InstrumentId", value = "分类Id", dataTypeClass = Integer.class, required = true)
    })
    @GetMapping("/get_instrument")
    public Result<?> getIdInstrumentInformation(Integer InstrumentId) {
        Instrument idInstrumentInformation = instrumentService.getIdInstrumentInformation(InstrumentId);
        return Result.success(idInstrumentInformation);
    }
    @ApiOperation("根据仪器Id更新数据")
    @PutMapping("/update")
    public Result<?> updateEquipmentPointInformation(@RequestBody UpdateInstrumentDto updateInstrumentDto) throws Exception {
        Instrument instrument = JackSonUtil.unmarshal(JackSonUtil.marshal(updateInstrumentDto), Instrument.class);
        Integer isUpdateSuccess = instrumentService.updateEquipmentPointInformation(instrument);
        if (isUpdateSuccess == 1){
            return Result.success("更新【" + instrument.getEquipmentName() + "】成功!");
        }
        return Result.fail("仪器设备编号重复,更新【" + instrument.getEquipmentName() + "】失败! ");
    }
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/MeteringPlanController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.yuanchu.limslaboratory.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.Instrument;
import com.yuanchu.limslaboratory.pojo.MeteringPlan;
import com.yuanchu.limslaboratory.service.MeteringPlanService;
import com.yuanchu.limslaboratory.utils.JackSonUtil;
import com.yuanchu.limslaboratory.utils.RedisUtil;
import com.yuanchu.limslaboratory.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-27
 */
@Api(tags = "实验室-->2、计量管理")
@RestController
@RequestMapping("/metering-plan")
public class MeteringPlanController {
    @Autowired
    private MeteringPlanService meteringPlanService;
    @ApiOperation("添加计量计划")
    @PostMapping("/add")
    public Result<?> addMeteringPlanInformation(@RequestBody MeteringPlan meteringPlan) {
        Integer isInsertSuccess = meteringPlanService.addMeteringPlanInformation(meteringPlan);
        if (isInsertSuccess == 1){
            return Result.success("添加计量计划成功!");
        }
        return Result.fail("添加计量计划失败! ");
    }
    @ApiOperation("计量计划分页查询")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "pageNo", value = "起始页", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "pageSize", value = "每一页数量", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "measureCodeOrNameOrUnit", value = "每一页数量", dataTypeClass = Integer.class, required = true)
    })
    @GetMapping("/plan_page_list")
    public Result<?> pagingQueryOfMeteringPlan(Integer pageNo, Integer pageSize, String measureCodeOrNameOrUnit) {
        IPage<Map<String, Object>> page = meteringPlanService.pagingQueryOfMeteringPlan(measureCodeOrNameOrUnit, new Page<Objects>(pageNo, pageSize));
        return Result.success(page);
    }
    @ApiOperation("计量台账分页查询")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "pageNo", value = "起始页", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "pageSize", value = "每一页数量", dataTypeClass = Integer.class, required = true)
    })
    @GetMapping("/standing_page_list")
    public Result<?> pagingQueryOfMeasurementLedger(Integer pageNo, Integer pageSize) {
        IPage<Map<String, Object>> page = meteringPlanService.pagingQueryOfMeasurementLedger(new Page<Objects>(pageNo, pageSize));
        return Result.success(page);
    }
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/controller/MetricalInformationController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.yuanchu.limslaboratory.controller;
import com.yuanchu.limslaboratory.pojo.MetricalInformation;
import com.yuanchu.limslaboratory.pojo.dto.UpdateMetricalInformationDto;
import com.yuanchu.limslaboratory.service.MetricalInformationService;
import com.yuanchu.limslaboratory.service.UserService;
import com.yuanchu.limslaboratory.utils.JackSonUtil;
import com.yuanchu.limslaboratory.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
@Api(tags = "实验室-->1、设备台账-->4、计量信息")
@RestController
@RequestMapping("/metrical-information")
public class MetricalInformationController {
    @Autowired
    private MetricalInformationService metricalInformationService;
    @Autowired
    private UserService userService;
    @ApiOperation("添加计量信息")
    @PostMapping("/add")
    public Result<?> addMetricalInformation(MetricalInformation metricalInformation,
                                            @RequestPart(value = "file", required = false) MultipartFile file) {
        Integer isInsertSuccess = metricalInformationService.addEquipmentPointInformation(metricalInformation, file);
        if (isInsertSuccess == 1){
            return Result.success("添加【"+ metricalInformation.getMeasurementUnit() +"】成功!");
        }
        return Result.fail("添加【"+ metricalInformation.getMeasurementUnit() +"】失败!设备码点编码重复!");
    }
    @ApiOperation("查询所有计量信息数据")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "InstrumentId", value = "仪器模块Id", dataTypeClass = String.class, required = true)
    })
    @GetMapping("/list")
    public Result<?> getListMetricalInformation(String InstrumentId) {
        List<Map<String, Object>> list = metricalInformationService.getListEquipmentPointInformation(InstrumentId);
        return Result.success(list);
    }
    @ApiOperation("根据计量信息Id删除数据")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "metricalInformationId", value = "计量信息Id", dataTypeClass = Integer.class, required = true)
    })
    @DeleteMapping("/delete")
    public Result<?> deleteMetricalInformation(Integer metricalInformationId) {
        Integer isDeleteSuccess = metricalInformationService.deleteMetricalInformation(metricalInformationId);
        if (isDeleteSuccess == 1){
            return Result.success("删除成功!");
        }
        return Result.fail("删除失败!");
    }
    @ApiOperation("根据计量信息Id更新数据")
    @PutMapping("/update")
    public Result<?> updateMetricalInformation(UpdateMetricalInformationDto updateMetricalInformationDto,
                                                     @RequestPart(value = "file", required = false) MultipartFile file) throws Exception {
        MetricalInformation metricalInformation = JackSonUtil.unmarshal(JackSonUtil.marshal(updateMetricalInformationDto), MetricalInformation.class);
        Integer isUpdateSuccess = metricalInformationService.updateMetricalInformation(metricalInformation, file);
        if (isUpdateSuccess == 1){
            return Result.success("更新成功!");
        }
        return Result.fail("更新失败!");
    }
    @ApiOperation("添加计量信息时负责人下拉框数据")
    @GetMapping("/get_user")
    public Result<?> getMapUserInformation() {
        return Result.success(userService.getUserNameAndId());
    }
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/ClassifyMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.yuanchu.limslaboratory.mapper;
import com.yuanchu.limslaboratory.pojo.Classify;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
public interface ClassifyMapper extends BaseMapper<Classify> {
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/EquipmentPointMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.yuanchu.limslaboratory.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.EquipmentPoint;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
public interface EquipmentPointMapper extends BaseMapper<EquipmentPoint> {
    List<Map<String, Object>> getListEquipmentPointInformation(String InstrumentId);
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/InstrumentMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.yuanchu.limslaboratory.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.Instrument;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
public interface InstrumentMapper extends BaseMapper<Instrument> {
    IPage<Map<String, Object>> getListInstrumentInformation(Integer conditions,Boolean whetherWhether, String numberOrNameOrSpecifications, Integer classifyId, Page<Objects> page);
    //查询所有设备信息
    List<Map> selectInstrument();
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/MeteringPlanMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.yuanchu.limslaboratory.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.MeteringPlan;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-27
 */
public interface MeteringPlanMapper extends BaseMapper<MeteringPlan> {
    IPage<Map<String, Object>> pagingQueryOfMeasurementLedger(Page<Objects> page);
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/mapper/MetricalInformationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.yuanchu.limslaboratory.mapper;
import com.yuanchu.limslaboratory.pojo.MetricalInformation;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
public interface MetricalInformationMapper extends BaseMapper<MetricalInformation> {
    List<Map<String, Object>> getListEquipmentPointInformation(String InstrumentId);
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/Classify.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="Classify对象", description="")
public class Classify implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "分类主键", hidden = true)
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "分类父名称", example = "温度测量仪表")
    private String fatherName;
    @NotBlank(message = "名称不允许为空!")
    @ApiModelProperty(value = "分类子名称", example = "体温计",required = true)
    private String sonName;
    @TableLogic(value = "1", delval = "0")
    @ApiModelProperty(value = "逻辑删除 æ­£å¸¸>=1,删除<=0", hidden = true)
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;
    @ApiModelProperty(value = "乐观锁", hidden = true)
    private Integer version;
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/EquipmentPoint.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="EquipmentPoint对象", description="")
public class EquipmentPoint implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键", hidden = true)
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "仪器Id å…³è”", example = "1", required = true)
    private Integer instrumentId;
    @ApiModelProperty(value = "用户Id å…³è”", hidden = true)
    private Integer userId;
    @ApiModelProperty(value = "码点编号", example = "Area-1", required = true)
    private String equipmentPoint;
    @ApiModelProperty(value = "码点名称", example = "导体屏蔽(壁厚面积)", required = true)
    private String equipmentPointName;
    @ApiModelProperty(value = "单位", example = "mm", required = true)
    private String unit;
    @ApiModelProperty(value = "描述", example = "疯了,做不了")
    private String descriptiveness;
    @TableLogic(value = "1", delval = "0")
    @ApiModelProperty(value = "逻辑删除 æ­£å¸¸>=1,删除<=0", hidden = true)
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间", hidden = true)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新时间", hidden = true)
    private Date updateTime;
    @ApiModelProperty(value = "乐观锁", hidden = true)
    private Integer version;
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/Instrument.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="Instrument对象", description="")
public class Instrument implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键", hidden = true)
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "分类ID å…³è”", example = "1", required = true)
    private Integer classifyId;
    @ApiModelProperty(value = "保管人:用户表关联Id", example = "9", required = true)
    private Integer userId;
    @ApiModelProperty(value = "保管人:用户表关联Id", hidden = true)
    @TableField(value = "")
    private Integer createUserId;
    @ApiModelProperty(value = "仪器设备编号", example = "JSTC-W1-00001", required = true)
    private String equipmentCode;
    @ApiModelProperty(value = "仪器设备名称", example = "数字电桥", required = true)
    private String equipmentName;
    @ApiModelProperty(value = "默认1;1:运行、2:故障、3:报修、4:检修、5:待机", example = "1", required = true)
    private Integer conditions;
    @ApiModelProperty(value = "规格型号", example = "WCDMS-1", required = true)
    private String specificationsModels;
    @ApiModelProperty(value = "测量范围", example = "12毫米")
    private String measuringRange;
    @ApiModelProperty(value = "误差", example = "0.000001微米")
    private String errorRate;
    @ApiModelProperty(value = "生产厂家", example = "江苏鵷雏")
    private String manufacturer;
    @ApiModelProperty(value = "到货日期", example = "2001-07-06", dataType = "date")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date arrivalDate;
    @ApiModelProperty(value = "验收日期", example = "2060-07-06", dataType = "date")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date acceptanceDate;
    @ApiModelProperty(value = "存放地", example = "地球亚洲中国江苏南通")
    private String storagePlace;
    @ApiModelProperty(value = "是否支持数采;1:支持;0:不支持", example = "1")
    private Integer whetherDataAcquisition;
    @ApiModelProperty(value = "是否需要仪器设备计量:如果需要计量周期必填;如果不需要计量周期不必填.1:需要;0:不需要", example = "0")
    private Integer equipmentMeasurement;
    @ApiModelProperty(value = "计量截止有效期:与equipmentMeasurement相关联", example = "12")
    private Integer termValidity;
    @ApiModelProperty(value = "描述", example = "疯狂星期五!!!")
    private String descriptiveness;
    @JsonIgnore
    @TableLogic(value = "1", delval = "0")
    @ApiModelProperty(value = "逻辑删除 æ­£å¸¸>=1,删除<=0", hidden = true)
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date createTime;
    @JsonIgnore
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新时间", hidden = true)
    private Date updateTime;
    @JsonIgnore
    @ApiModelProperty(value = "乐观锁", hidden = true)
    private Integer version;
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/MeteringPlan.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-27
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="MeteringPlan对象", description="")
public class MeteringPlan implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "Id主键", hidden = true)
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "计量负责人 å…³è”用户表", example = "10", required = true)
    private Integer measurePerson;
    @ApiModelProperty(value = "创建人 å…³è”用户表", example = "21", required = true)
    @TableField("create_Person")
    private Integer createPerson;
    @ApiModelProperty(value = "计划单号", hidden = true)
    private String plannedOrderNumber;
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd", iso = DateTimeFormat.ISO.DATE_TIME)
    @ApiModelProperty(value = "开始日期", example = "2023-07-06", required = true, dataType = "date")
    private Date beginTime;
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd", iso = DateTimeFormat.ISO.DATE_TIME)
    @ApiModelProperty(value = "结束日期", example = "2023-07-06", required = true, dataType = "date")
    private Date endTime;
    @ApiModelProperty(value = "计划状态:三种:1:已完成;2:待提交;3:未完成", example = "1", required = true)
    private Integer planningStatus;
    @ApiModelProperty(value = "计量单位", example = "GB")
    private String unit;
    @TableLogic(value = "1", delval = "0")
    @ApiModelProperty(value = "逻辑删除 æ­£å¸¸>=1,删除<=0", hidden = true)
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间", hidden = true)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新时间", hidden = true)
    private Date updateTime;
    @ApiModelProperty(value = "乐观锁", hidden = true)
    private Integer version;
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/MetricalInformation.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="MetricalInformation对象", description="")
public class MetricalInformation implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键", hidden = true)
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "用户关联Id", example = "7", required = true)
    private Integer userId;
    @ApiModelProperty(value = "仪器关联Id", example = "1", required = true)
    private Integer instrumentId;
    @ApiModelProperty(value = "计量单位", example = "GB", required = true)
    private String measurementUnit;
    @ApiModelProperty(value = "开始日期", example = "2023-07-06", required = true, dataType = "date")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd", iso = DateTimeFormat.ISO.DATE_TIME)
    private Date beginDate;
    @ApiModelProperty(value = "结束日期", example = "2026-07-06", required = true, dataType = "date")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd", iso = DateTimeFormat.ISO.DATE_TIME)
    private Date endDate;
    @ApiModelProperty(value = "不确定度", example = "0.3%", required = true)
    private String uncertainty;
    @ApiModelProperty(value = "结果: 1:合格;2:矫正后可用;3:不合格", example = "1", required = true)
    private Integer result;
    @ApiModelProperty(value = "性能指标", example = "10086")
    private String performanceIndex;
    @ApiModelProperty(value = "备注", example = "10086.com")
    private String remarks;
    @ApiModelProperty(value = "文件路径", hidden = true)
    private String filePath;
    @TableLogic(value = "1", delval = "0")
    @ApiModelProperty(value = "逻辑删除 æ­£å¸¸>=1,删除<=0", hidden = true)
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间", hidden = true)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新时间", hidden = true)
    private Date updateTime;
    @ApiModelProperty(value = "乐观锁", hidden = true)
    private Integer version;
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateClassifyDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.yuanchu.limslaboratory.pojo.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="UpdateClassifyDto对象", description="")
public class UpdateClassifyDto {
    @ApiModelProperty(value = "分类主键", example = "1", required = true)
    private Integer id;
    @ApiModelProperty(value = "分类父名称", example = "温度测量仪表")
    private String fatherName;
    @ApiModelProperty(value = "分类子名称", example = "体温计",required = true)
    private String sonName;
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateEquipmentPointDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.yuanchu.limslaboratory.pojo.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="UpdateEquipmentPointDto对象", description="")
public class UpdateEquipmentPointDto {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键", example = "1", required = true)
    private Integer id;
    @ApiModelProperty(value = "仪器Id å…³è”", example = "1", required = true)
    private Integer instrumentId;
    @ApiModelProperty(value = "码点编号", example = "Area-1", required = true)
    private String equipmentPoint;
    @ApiModelProperty(value = "码点名称", example = "导体屏蔽(壁厚面积)", required = true)
    private String equipmentPointName;
    @ApiModelProperty(value = "单位", example = "mm", required = true)
    private String unit;
    @ApiModelProperty(value = "描述", example = "疯了,做不了")
    private String descriptiveness;
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateInstrumentDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.yuanchu.limslaboratory.pojo.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="UpdateInstrumentDto对象", description="")
public class UpdateInstrumentDto {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "计量信息主键",example = "1", required = true)
    private Integer id;
    @ApiModelProperty(value = "分类ID å…³è”", example = "1", required = true)
    private Integer classifyId;
    @ApiModelProperty(value = "保管人:用户表关联Id", example = "9", required = true)
    private Integer userId;
    @ApiModelProperty(value = "仪器设备编号", example = "JSTC-W1-00001", required = true)
    private String equipmentCode;
    @ApiModelProperty(value = "仪器设备名称", example = "数字电桥", required = true)
    private String equipmentName;
    @ApiModelProperty(value = "默认1;1:运行、2:故障、3:报修、4:检修、5:待机", example = "1", required = true)
    private Integer conditions;
    @ApiModelProperty(value = "规格型号", example = "WCDMS-1", required = true)
    private String specificationsModels;
    @ApiModelProperty(value = "测量范围", example = "12毫米")
    private String measuringRange;
    @ApiModelProperty(value = "误差", example = "0.000001微米")
    private String errorRate;
    @ApiModelProperty(value = "生产厂家", example = "江苏鵷雏")
    private String manufacturer;
    @ApiModelProperty(value = "到货日期", example = "2001-07-06", dataType = "date")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date arrivalDate;
    @ApiModelProperty(value = "验收日期", example = "2060-07-06", dataType = "date")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date acceptanceDate;
    @ApiModelProperty(value = "存放地", example = "地球亚洲中国江苏南通")
    private String storagePlace;
    @ApiModelProperty(value = "是否支持数采;1:支持;0:不支持", example = "1")
    private Integer whetherDataAcquisition;
    @ApiModelProperty(value = "是否需要仪器设备计量:如果需要计量周期必填;如果不需要计量周期不必填.1:需要;0:不需要", example = "0")
    private Integer equipmentMeasurement;
    @ApiModelProperty(value = "计量截止有效期:与equipmentMeasurement相关联", example = "12")
    private Integer termValidity;
    @ApiModelProperty(value = "描述", example = "疯狂星期五!!!")
    private String descriptiveness;
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/UpdateMetricalInformationDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package com.yuanchu.limslaboratory.pojo.dto;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="UpdateMetricalInformationDto对象", description="")
public class UpdateMetricalInformationDto {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    private Integer id;
    @ApiModelProperty(value = "用户关联Id", example = "7", required = true)
    private Integer userId;
    @ApiModelProperty(value = "计量单位", example = "GB", required = true)
    private String measurementUnit;
    @ApiModelProperty(value = "开始日期", example = "2023-07-06", required = true, dataType = "date")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd", iso = DateTimeFormat.ISO.DATE_TIME)
    private Date beginDate;
    @ApiModelProperty(value = "结束日期", example = "2026-07-06", required = true, dataType = "date")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd", iso = DateTimeFormat.ISO.DATE_TIME)
    private Date endDate;
    @ApiModelProperty(value = "不确定度", example = "0.3%", required = true)
    private String uncertainty;
    @ApiModelProperty(value = "结果: 1:合格;2:矫正后可用;3:不合格", example = "1", required = true)
    private Integer result;
    @ApiModelProperty(value = "性能指标", example = "10086")
    private String performanceIndex;
    @ApiModelProperty(value = "备注", example = "10086.com")
    private String remarks;
    @ApiModelProperty(value = "文件路径", hidden = true)
    private String filePath;
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/ClassifyService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.yuanchu.limslaboratory.service;
import com.yuanchu.limslaboratory.pojo.Classify;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
public interface ClassifyService extends IService<Classify> {
    Integer addClassifyInformation(Classify classify);
    List<Map<String, Object>> getListClassifyInformation(String classifyName);
    Boolean deleteClassifyInformation(String classifyId);
    Boolean updateClassifyInformation(Classify classify);
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/EquipmentPointService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.yuanchu.limslaboratory.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.EquipmentPoint;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
public interface EquipmentPointService extends IService<EquipmentPoint> {
    Integer addEquipmentPointInformation(EquipmentPoint equipmentPoint);
    List<Map<String, Object>> getListEquipmentPointInformation(String InstrumentId);
    Integer deleteEquipmentPointInformation(Integer equipmentPointId);
    Integer updateEquipmentPointInformation(EquipmentPoint equipmentPoint);
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/InstrumentService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.yuanchu.limslaboratory.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.Instrument;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
public interface InstrumentService extends IService<Instrument> {
    Integer addInstrumentInformation(Instrument instrument);
    Boolean deleteInstrumentInformation(String instrumentId);
    IPage<Map<String, Object>> getListInstrumentInformation(Integer conditions, Boolean whetherWhether, String numberOrNameOrSpecifications,
                                                            Integer classifyId, Page<Objects> page);
    /**
     * æ›´æ–°ä»ªå™¨æ•°æ®çš„æ—¶å€™éœ€è¦èŽ·å–æ‰€æœ‰æ•°æ®
     * @param instrumentId
     * @return
     */
    Instrument getIdInstrumentInformation(Integer instrumentId);
    Integer updateEquipmentPointInformation(Instrument instrument);
    /**
     * æŸ¥è¯¢æ‰€æœ‰è®¾å¤‡ä¿¡æ¯
     * @return
     */
    List<Map> selectInstrument();
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/MeteringPlanService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.yuanchu.limslaboratory.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.MeteringPlan;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-27
 */
public interface MeteringPlanService extends IService<MeteringPlan> {
    Integer addMeteringPlanInformation(MeteringPlan meteringPlan);
    IPage<Map<String, Object>> pagingQueryOfMeteringPlan(String measureCodeOrNameOrUnit, Page<Objects> page);
    IPage<Map<String, Object>> pagingQueryOfMeasurementLedger(Page<Objects> page);
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/MetricalInformationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.yuanchu.limslaboratory.service;
import com.yuanchu.limslaboratory.pojo.MetricalInformation;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
public interface MetricalInformationService extends IService<MetricalInformation> {
    Integer addEquipmentPointInformation(MetricalInformation metricalInformation, MultipartFile file);
    List<Map<String, Object>> getListEquipmentPointInformation(String InstrumentId);
    Integer deleteMetricalInformation(Integer metricalInformationId);
    Integer updateMetricalInformation(MetricalInformation metricalInformation, MultipartFile file);
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/ClassifyServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
package com.yuanchu.limslaboratory.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.yuanchu.limslaboratory.pojo.Classify;
import com.yuanchu.limslaboratory.mapper.ClassifyMapper;
import com.yuanchu.limslaboratory.service.ClassifyService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
@Service
public class ClassifyServiceImpl extends ServiceImpl<ClassifyMapper, Classify> implements ClassifyService {
    @Resource
    private ClassifyMapper classifyMapper;
    @Override
    public Integer addClassifyInformation(Classify classify) {
        LambdaQueryWrapper<Classify> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Classify::getFatherName, classify.getFatherName());
        wrapper.eq(Classify::getSonName, classify.getSonName());
        wrapper.eq(Classify::getState, 1);
        Classify classify1 = classifyMapper.selectOne(wrapper);
        if (ObjectUtils.isEmpty(classify1)){
            return classifyMapper.insert(classify);
        } else {
            return 2;
        }
    }
    @Override
    public List<Map<String, Object>> getListClassifyInformation(String classifyName) {
        LambdaQueryWrapper<Classify> wrapper = new LambdaQueryWrapper<>();
        if (!ObjectUtils.isEmpty(classifyName)){
            wrapper.like(Classify::getFatherName, classifyName);
        }
        wrapper.groupBy(Classify::getFatherName);
        wrapper.select(Classify::getId, Classify::getFatherName);
        List<Map<String, Object>> maps = classifyMapper.selectMaps(wrapper);
        for (Map<String, Object> map : maps){
            LambdaQueryWrapper<Classify> wrapper1 = new LambdaQueryWrapper<>();
            wrapper1.eq(Classify::getFatherName, map.get("father_name"));
            wrapper1.isNotNull(Classify::getSonName);
            wrapper1.select(Classify::getId, Classify::getSonName);
            List<Map<String, Object>> maps1 = classifyMapper.selectMaps(wrapper1);
            if (!ObjectUtils.isEmpty(maps1)){
                map.put("children", maps1);
                map.remove("id");
            } else {
                map.put("children", null);
            }
        }
        return maps;
    }
    @Override
    public Boolean deleteClassifyInformation(String classifyId) {
        LambdaUpdateWrapper<Classify> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(Classify::getId, classifyId);
        wrapper.set(Classify::getState, 0);
        int isDeleteSuccess = classifyMapper.update(new Classify(), wrapper);
        return isDeleteSuccess > 0;
    }
    @Override
    public Boolean updateClassifyInformation(Classify classify) {
        LambdaUpdateWrapper<Classify> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(Classify::getId, classify.getId());
        int isUpdateClassifySuccess = classifyMapper.update(classify, updateWrapper);
        return isUpdateClassifySuccess > 0;
    }
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/EquipmentPointServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
package com.yuanchu.limslaboratory.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.EquipmentPoint;
import com.yuanchu.limslaboratory.mapper.EquipmentPointMapper;
import com.yuanchu.limslaboratory.pojo.Instrument;
import com.yuanchu.limslaboratory.service.EquipmentPointService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
@Service
public class EquipmentPointServiceImpl extends ServiceImpl<EquipmentPointMapper, EquipmentPoint> implements EquipmentPointService {
    @Resource
    private EquipmentPointMapper equipmentPointMapper;
    @Override
    public Integer addEquipmentPointInformation(EquipmentPoint equipmentPoint) {
        LambdaQueryWrapper<EquipmentPoint> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EquipmentPoint::getEquipmentPoint, equipmentPoint.getEquipmentPoint());
        wrapper.eq(EquipmentPoint::getState, 1);
        wrapper.eq(EquipmentPoint::getInstrumentId, equipmentPoint.getInstrumentId());
        wrapper.select(EquipmentPoint::getEquipmentPoint);
        EquipmentPoint equipmentPoint1 = equipmentPointMapper.selectOne(wrapper);
        if (ObjectUtils.isEmpty(equipmentPoint1)){
            return equipmentPointMapper.insert(equipmentPoint);
        }
        return 0;
    }
    @Override
    public List<Map<String, Object>> getListEquipmentPointInformation(String InstrumentId) {
        return equipmentPointMapper.getListEquipmentPointInformation(InstrumentId);
    }
    @Override
    public Integer deleteEquipmentPointInformation(Integer equipmentPointId) {
        LambdaUpdateWrapper<EquipmentPoint> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(EquipmentPoint::getId, equipmentPointId);
        updateWrapper.set(EquipmentPoint::getState, 0);
        return equipmentPointMapper.update(new EquipmentPoint(), updateWrapper);
    }
    @Override
    public Integer updateEquipmentPointInformation(EquipmentPoint equipmentPoint) {
        LambdaQueryWrapper<EquipmentPoint> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EquipmentPoint::getEquipmentPoint, equipmentPoint.getEquipmentPoint());
        wrapper.eq(EquipmentPoint::getState, 1);
        wrapper.select(EquipmentPoint::getId, EquipmentPoint::getId);
        EquipmentPoint equipmentPoint1 = equipmentPointMapper.selectOne(wrapper);
        if (ObjectUtils.isEmpty(equipmentPoint1)){
            return equipmentPointMapper.updateById(equipmentPoint);
        } else if (equipmentPoint.getId().equals(equipmentPoint1.getId())){
            return equipmentPointMapper.updateById(equipmentPoint);
        }
        return 0;
    }
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/InstrumentServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.yuanchu.limslaboratory.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.Instrument;
import com.yuanchu.limslaboratory.mapper.InstrumentMapper;
import com.yuanchu.limslaboratory.service.InstrumentService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.limslaboratory.utils.MyUtil;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
@Service
public class InstrumentServiceImpl extends ServiceImpl<InstrumentMapper, Instrument> implements InstrumentService {
    @Resource
    private InstrumentMapper instrumentMapper;
    @Override
    public Integer addInstrumentInformation(Instrument instrument) {
        LambdaQueryWrapper<Instrument> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Instrument::getEquipmentCode, instrument.getEquipmentCode());
        wrapper.eq(Instrument::getState, 1);
        wrapper.select(Instrument::getEquipmentCode);
        Instrument instrument1 = instrumentMapper.selectOne(wrapper);
        if (ObjectUtils.isEmpty(instrument1)){
            return instrumentMapper.insert(instrument);
        }
        return 0;
    }
    @Override
    public Boolean deleteInstrumentInformation(String instrumentId) {
        LambdaUpdateWrapper<Instrument> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(Instrument::getId, instrumentId);
        updateWrapper.set(Instrument::getState, 0);
        int isUpdateSuccess = instrumentMapper.update(new Instrument(), updateWrapper);
        return isUpdateSuccess > 0;
    }
    @Override
    public IPage<Map<String, Object>> getListInstrumentInformation(Integer conditions, Boolean whetherWhether, String numberOrNameOrSpecifications,
                                                                   Integer classifyId, Page<Objects> page) {
        return instrumentMapper.getListInstrumentInformation(conditions, whetherWhether, numberOrNameOrSpecifications, classifyId, page);
    }
    @Override
    public Instrument getIdInstrumentInformation(Integer instrumentId) {
        LambdaQueryWrapper<Instrument> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Instrument::getId, instrumentId);
        return instrumentMapper.selectOne(wrapper);
    }
    @Override
    public Integer updateEquipmentPointInformation(Instrument instrument) {
        LambdaQueryWrapper<Instrument> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Instrument::getEquipmentCode, instrument.getEquipmentCode());
        wrapper.eq(Instrument::getState, 1);
        wrapper.select(Instrument::getEquipmentCode, Instrument::getId);
        Instrument instrument1 = instrumentMapper.selectOne(wrapper);
        if (ObjectUtils.isEmpty(instrument1)){
            return instrumentMapper.updateById(instrument);
        } else if (instrument.getId().equals(instrument1.getId())){
            return instrumentMapper.updateById(instrument);
        }
        return 0;
    }
    //查询所有设备信息
    @Override
    public List<Map> selectInstrument() {
        return instrumentMapper.selectInstrument();
    }
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MeteringPlanServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.yuanchu.limslaboratory.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.Instrument;
import com.yuanchu.limslaboratory.pojo.MeteringPlan;
import com.yuanchu.limslaboratory.mapper.MeteringPlanMapper;
import com.yuanchu.limslaboratory.service.MeteringPlanService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.limslaboratory.utils.MyUtil;
import com.yuanchu.limslaboratory.utils.RedisUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-27
 */
@Service
public class MeteringPlanServiceImpl extends ServiceImpl<MeteringPlanMapper, MeteringPlan> implements MeteringPlanService {
    @Resource
    private MeteringPlanMapper meteringPlanMapper;
    @Override
    public Integer addMeteringPlanInformation(MeteringPlan meteringPlan) {
        String timeSixNumber = MyUtil.getTimeSixNumberCode("P");
        meteringPlan.setPlannedOrderNumber(timeSixNumber);
        return meteringPlanMapper.insert(meteringPlan);
    }
    @Override
    public IPage<Map<String, Object>> pagingQueryOfMeteringPlan(String measureCodeOrNameOrUnit, Page<Objects> page) {
        return null;
    }
    @Override
    public IPage<Map<String, Object>> pagingQueryOfMeasurementLedger(Page<Objects> page) {
        return meteringPlanMapper.pagingQueryOfMeasurementLedger(page);
    }
}
laboratory-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MetricalInformationServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.yuanchu.limslaboratory.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.yuanchu.limslaboratory.pojo.MetricalInformation;
import com.yuanchu.limslaboratory.mapper.MetricalInformationMapper;
import com.yuanchu.limslaboratory.service.MetricalInformationService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.limslaboratory.utils.FileSaveUtil;
import com.yuanchu.limslaboratory.utils.MyUtil;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-20
 */
@Service
public class MetricalInformationServiceImpl extends ServiceImpl<MetricalInformationMapper, MetricalInformation> implements MetricalInformationService {
    @Resource
    private MetricalInformationMapper metricalInformationMapper;
    @Override
    public Integer addEquipmentPointInformation(MetricalInformation metricalInformation, MultipartFile file) {
        if (!ObjectUtils.isEmpty(file)){
            String fileName = FileSaveUtil.StoreFile(file);
            metricalInformation.setFilePath(fileName);
        }
        return metricalInformationMapper.insert(metricalInformation);
    }
    @Override
    public List<Map<String, Object>> getListEquipmentPointInformation(String InstrumentId) {
        return metricalInformationMapper.getListEquipmentPointInformation(InstrumentId);
    }
    @Override
    public Integer deleteMetricalInformation(Integer metricalInformationId) {
        LambdaUpdateWrapper<MetricalInformation> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(MetricalInformation::getId, metricalInformationId);
        updateWrapper.set(MetricalInformation::getState, 0);
        return metricalInformationMapper.update(new MetricalInformation(), updateWrapper);
    }
    @Override
    public Integer updateMetricalInformation(MetricalInformation metricalInformation, MultipartFile file) {
        if (!ObjectUtils.isEmpty(file)){
            String fileName = FileSaveUtil.StoreFile(file);
            metricalInformation.setFilePath(fileName);
            LambdaQueryWrapper<MetricalInformation> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(MetricalInformation::getId, metricalInformation.getId());
            wrapper.select(MetricalInformation::getFilePath);
            MetricalInformation metricalInformation1 = metricalInformationMapper.selectOne(wrapper);
            if (!ObjectUtils.isEmpty(metricalInformation1.getFilePath())){
                FileSaveUtil.DeleteFile(metricalInformation1.getFilePath());
            }
        }
        return metricalInformationMapper.updateById(metricalInformation);
    }
}
laboratory-server/src/main/resources/mapper/ClassifyMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
<?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.yuanchu.limslaboratory.mapper.ClassifyMapper">
</mapper>
laboratory-server/src/main/resources/mapper/EquipmentPointMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
<?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.yuanchu.limslaboratory.mapper.EquipmentPointMapper">
    <select id="getListEquipmentPointInformation" resultType="map">
        SELECT e.`id`, e.`equipment_point` equipmentPoint, e.`equipment_point_name` equipmentPointName, e.`unit`,u.`name`, DATE_FORMAT(e.`update_time`, '%Y-%m-%d') updateTime, e.`descriptiveness`
        FROM equipment_point e, `user` u
        WHERE e.`user_id` = u.`id`
        AND e.`instrument_id` = #{InstrumentId}
    </select>
</mapper>
laboratory-server/src/main/resources/mapper/InstrumentMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
<?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.yuanchu.limslaboratory.mapper.InstrumentMapper">
    <select id="getListInstrumentInformation" resultType="map">
        SELECT i.`id`, i.`equipment_code`, i.`equipment_name`, i.`specifications_models`, u.`name`,
               DATE_FORMAT(DATE_ADD(i.`create_time`, INTERVAL i.`term_validity` MONTH), '%Y-%m-%d') termValidity, i.`conditions`, i.`storage_place`
        FROM instrument i, `user` u
        WHERE i.`state` = 1
          AND i.`classify_id` = #{classifyId}
        <if test="conditions != null">
            AND i.`conditions` = #{conditions}
        </if>
        <if test="numberOrNameOrSpecifications != null and numberOrNameOrSpecifications != ''">
            AND CONCAT(i.`equipment_code`, i.`equipment_name`, i.`specifications_models`) LIKE CONCAT('%',#{numberOrNameOrSpecifications},'%')
        </if>
        <if test="whetherWhether == true">
            AND DATE_FORMAT(DATE_ADD(i.`create_time`, INTERVAL i.`term_validity` MONTH), '%Y-%m-%d') <![CDATA[<]]> NOW()
        </if>
        AND i.`user_id` = u.`id`
    </select>
    <select id="selectInstrument" resultType="Map">
        select id,equipment_name from lims_laboratory.instrument
    </select>
</mapper>
laboratory-server/src/main/resources/mapper/MeteringPlanMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
<?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.yuanchu.limslaboratory.mapper.MeteringPlanMapper">
    <select id="pagingQueryOfMeasurementLedger" resultType="map">
        SELECT i.`equipment_code`, i.`equipment_name`, i.`specifications_models`, m.`create_time`, m.`uncertainty`,
               m.`end_date`, i.`term_validity`, i.`storage_place`, i.`conditions`
        FROM instrument i, metrical_information m
        WHERE i.`id` = m.`instrument_id`
    </select>
</mapper>
laboratory-server/src/main/resources/mapper/MetricalInformationMapper.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.yuanchu.limslaboratory.mapper.MetricalInformationMapper">
    <select id="getListEquipmentPointInformation" resultType="map">
        SELECT m.`id`, u.`name`, m.`measurement_unit`, DATE_FORMAT(m.`begin_date`, '%Y-%m-%d') beginDate, DATE_FORMAT(m.`end_date`, '%Y-%m-%d') endDate,
               m.`uncertainty`, m.`result`, m.`performance_index`, m.`remarks`, m.`file_path`, DATE_FORMAT(m.`create_time`, '%Y-%m-%d') createDate
        FROM metrical_information m, `user` u
        WHERE m.`user_id` = u.`id`
        AND m.`state` = 1
        AND m.`instrument_id` = #{InstrumentId}
    </select>
</mapper>
pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,232 @@
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yuanchu</groupId>
    <artifactId>lims-laboratory</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>lims-laboratory</name>
    <description>lims-laboratory</description>
    <packaging>pom</packaging>
    <modules>
        <module>user-server</module>
        <module>sys</module>
        <module>framework</module>
        <module>standard-server</module>
        <module>inspection-server</module>
        <module>laboratory-server</module>
    </modules>
    <properties>
        <java.version>1.8</java.version>
        <log4j.version>1.2.17</log4j.version>
        <mysql.version>8.0.28</mysql.version>
        <jwt.version>4.4.0</jwt.version>
        <swagger.version>3.0.0</swagger.version>
        <knife4j-spring-ui.version>3.0.3</knife4j-spring-ui.version>
        <druid.version>1.2.18</druid.version>
        <mybatis-plus.version>3.5.3.1</mybatis-plus.version>
        <openfeign.version>3.1.3</openfeign.version>
        <feign-okhttp.version>11.0</feign-okhttp.version>
        <shiro.version>1.5.3</shiro.version>
        <!-- æ‰“包后导出的路径 -->
        <package.path>${project.build.directory}/LIMS</package.path>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!--热部署a-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--Swagger3-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <!--后端注释检验工具-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <!--log4j-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <!--mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <!--数据库连接池-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <!--Swagger3-Ui美化-->
            <dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-spring-ui</artifactId>
                <version>${knife4j-spring-ui.version}</version>
            </dependency>
            <!--mybatis-plus代码生成器-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>
            <!--feign-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
                <version>${openfeign.version}</version>
            </dependency>
            <!--okhttp-->
            <dependency>
                <groupId>io.github.openfeign</groupId>
                <artifactId>feign-okhttp</artifactId>
                <version>${feign-okhttp.version}</version>
            </dependency>
            <!--安全框架shiro-->
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-spring-boot-starter</artifactId>
                <version>${shiro.version}</version>
            </dependency>
            <!--jwt-->
            <dependency>
                <groupId>com.auth0</groupId>
                <artifactId>java-jwt</artifactId>
                <version>${jwt.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <!-- ä¸Šçº¿éƒ¨ç½² JAR启动分离依赖lib和配置 -->
            <!-- æ‰“包jar -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <!-- ä¸æ‰“包资源文件 -->
                    <excludes>
                        <exclude>*.**</exclude>
                    </excludes>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <!-- MANIFEST.MF ä¸­ Class-Path åŠ å…¥å‰ç¼€ -->
                            <classpathPrefix>lib/</classpathPrefix>
                            <!-- jar包不包含唯一版本标识 -->
                            <useUniqueVersions>false</useUniqueVersions>
                            <!-- æŒ‡å®šå…¥å£ç±» -->
                            <mainClass>com.yuanchu.limslaboratory.SysApplication</mainClass>
                        </manifest>
                        <!--  æŒ‡å®šé…ç½®æ–‡ä»¶ç›®å½•,这样jar运行时会去找到同目录下的conf文件夹下查找  -->
                        <manifestEntries>
                            <Class-Path>conf/</Class-Path>
                        </manifestEntries>
                    </archive>
                    <outputDirectory>${package.path}</outputDirectory>
                </configuration>
            </plugin>
            <!-- æ‹·è´ä¾èµ– copy-dependencies -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${package.path}/lib/ </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- æ‹·è´èµ„源文件 copy-resources -->
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <directory>src/main/resources</directory>
                                    <!--  æŒ‡å®šå‚与构建的resource -->
                                    <includes>
                                        <include>*.**</include>
                                        <!--排除application-dev.yml文件-->
                                    </includes>
                                </resource>
                            </resources>
                            <outputDirectory>${package.path}/conf</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
sql/lims.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,528 @@
/*
SQLyog Ultimate v13.1.1 (64 bit)
MySQL - 5.7.32-log : Database - lims_laboratory
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`lims_laboratory` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `lims_laboratory`;
/*Table structure for table `classify` */
DROP TABLE IF EXISTS `classify`;
CREATE TABLE `classify` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '分类主键',
  `father_name` varchar(25) NOT NULL COMMENT '分类父名称',
  `son_name` varchar(25) DEFAULT NULL COMMENT '分类子名称',
  `state` int(1) NOT NULL DEFAULT '1' COMMENT '逻辑删除',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  `version` int(1) NOT NULL DEFAULT '1' COMMENT '乐观锁',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4;
/*Data for the table `classify` */
insert  into `classify`(`id`,`father_name`,`son_name`,`state`,`create_time`,`update_time`,`version`) values
(1,'温度测量仪表','体温计',1,'2023-07-21 10:42:26','2023-07-21 14:14:54',1),
(3,'体温计',NULL,1,'2023-07-21 10:48:51','2023-07-21 10:48:51',1),
(5,'体温',NULL,1,'2023-07-21 10:53:32','2023-07-21 10:53:32',1),
(10,'体温','体温',0,'2023-07-21 11:16:51','2023-07-21 13:45:52',1),
(12,'体温','体温计',1,'2023-07-21 11:16:51','2023-07-21 11:16:51',1),
(13,'体温','体温',1,'2023-07-21 13:50:52','2023-07-21 13:50:52',1);
/*Table structure for table `enterprise` */
DROP TABLE IF EXISTS `enterprise`;
CREATE TABLE `enterprise` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '企业编号',
  `name` varchar(20) NOT NULL COMMENT '企业名字',
  `byname` varchar(20) NOT NULL COMMENT '企业简称',
  `link_name` varchar(10) NOT NULL COMMENT '联系人名字',
  `link_phone` varchar(11) NOT NULL COMMENT '联系人电话',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  `version` int(1) NOT NULL DEFAULT '1' COMMENT '锁',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
/*Data for the table `enterprise` */
insert  into `enterprise`(`id`,`name`,`byname`,`link_name`,`link_phone`,`create_time`,`update_time`,`version`) values
(1,'中天科技网络有限公司','中天科技','李林','18400000000','2023-07-07 10:51:38','2023-07-07 10:51:41',1);
/*Table structure for table `equipment_point` */
DROP TABLE IF EXISTS `equipment_point`;
CREATE TABLE `equipment_point` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `instrument_id` int(10) NOT NULL COMMENT '仪器Id å…³è”',
  `user_id` int(10) NOT NULL COMMENT '用户Id å…³è”',
  `equipment_point` varchar(25) NOT NULL COMMENT '码点编号',
  `equipment_point_name` varchar(25) NOT NULL COMMENT '码点名称',
  `unit` varchar(20) NOT NULL COMMENT '单位',
  `descriptiveness` varchar(100) DEFAULT '--' COMMENT '描述',
  `create_time` datetime NOT NULL COMMENT '创建日期',
  `update_time` datetime NOT NULL COMMENT '更新日期',
  `state` int(11) NOT NULL DEFAULT '1' COMMENT '逻辑删除',
  `version` int(11) DEFAULT '1' COMMENT '乐观锁',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
/*Data for the table `equipment_point` */
insert  into `equipment_point`(`id`,`instrument_id`,`user_id`,`equipment_point`,`equipment_point_name`,`unit`,`descriptiveness`,`create_time`,`update_time`,`state`,`version`) values
(1,1,7,'Area-1','导体屏蔽(壁厚面积)','mm','疯了,做不了','2023-07-24 14:40:01','2023-07-24 17:23:15',1,1),
(2,1,7,'Area-2','导体屏蔽(壁厚面积)','mm','太困了','2023-07-24 14:40:01','2023-07-24 15:03:44',1,1);
/*Table structure for table `inspection` */
DROP TABLE IF EXISTS `inspection`;
CREATE TABLE `inspection` (
  `id` varchar(25) NOT NULL COMMENT '报检编号',
  `type` int(1) NOT NULL COMMENT '0:原材料;1:产品;2:半成品;',
  `inspection_status` int(1) NOT NULL DEFAULT '0' COMMENT '报检状态 1:已检验;0未检验',
  `qualified_state` int(1) DEFAULT NULL COMMENT '是否合格 1:是;0否',
  `state` int(1) NOT NULL DEFAULT '1' COMMENT '1:待提交;2:已提交;0:已作废',
  `create_time` datetime NOT NULL COMMENT '报检时间',
  `update_time` datetime NOT NULL,
  `version` int(1) DEFAULT '1',
  `user_name` varchar(25) NOT NULL COMMENT '报检人',
  `inspect_user_id` int(10) DEFAULT NULL COMMENT '关联 æ£€éªŒäººï¼ˆç”¨æˆ·id)',
  `inspect_start_time` datetime DEFAULT NULL COMMENT '检验开始日期',
  `inspect_end_time` datetime DEFAULT NULL COMMENT '检验结束日期',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*Data for the table `inspection` */
insert  into `inspection`(`id`,`type`,`inspection_status`,`qualified_state`,`state`,`create_time`,`update_time`,`version`,`user_name`,`inspect_user_id`,`inspect_start_time`,`inspect_end_time`) values
('1680929494813868034',0,0,NULL,1,'2023-07-17 21:16:36','2023-07-17 21:16:36',1,'测试人员',NULL,NULL,NULL),
('1680929899014750210',0,0,NULL,1,'2023-07-17 21:18:13','2023-07-17 21:18:13',1,'测试人员',NULL,NULL,NULL),
('1681215775833042945',0,0,NULL,1,'2023-07-18 16:14:11','2023-07-18 16:14:11',1,'测试人员',NULL,NULL,NULL);
/*Table structure for table `inspection_material_list` */
DROP TABLE IF EXISTS `inspection_material_list`;
CREATE TABLE `inspection_material_list` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `material_id` varchar(25) NOT NULL COMMENT '物料id',
  `material_num` int(10) NOT NULL COMMENT '报检数量-物料数量',
  `material_supplier` varchar(25) NOT NULL COMMENT '供应商',
  `material_name` varchar(25) NOT NULL COMMENT '物料名称',
  `material_location` varchar(25) NOT NULL COMMENT '物料存放地',
  `material_batch` varchar(25) NOT NULL COMMENT '物料批次',
  `material_reel_number` varchar(25) NOT NULL COMMENT '物料盘号',
  `specifications_serial_number` varchar(50) NOT NULL COMMENT '规格名称/型号名称',
  `specifications_voltage_level` varchar(30) DEFAULT NULL COMMENT '电压等级',
  `specifications_cross_section` varchar(30) DEFAULT NULL COMMENT '主线心截面',
  `specifications_number_of_cores` varchar(30) DEFAULT NULL COMMENT '主线芯芯数',
  `specifications_instruct` varchar(30) DEFAULT NULL COMMENT '生产指令号',
  `notes` varchar(100) DEFAULT NULL COMMENT '备注',
  `state` int(1) NOT NULL DEFAULT '1',
  `create_time` datetime NOT NULL COMMENT '报检时间',
  `update_time` datetime NOT NULL,
  `version` int(1) DEFAULT '1',
  `inspection_id` varchar(25) NOT NULL COMMENT '关联 æŠ¥æ£€å•id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4;
/*Data for the table `inspection_material_list` */
insert  into `inspection_material_list`(`id`,`material_id`,`material_num`,`material_supplier`,`material_name`,`material_location`,`material_batch`,`material_reel_number`,`specifications_serial_number`,`specifications_voltage_level`,`specifications_cross_section`,`specifications_number_of_cores`,`specifications_instruct`,`notes`,`state`,`create_time`,`update_time`,`version`,`inspection_id`) values
(1,'1680929494813868034',100,'中天','电线电缆','地下一层','1','123','测试规格/dsahj1','1','1','1','1',NULL,1,'2023-07-17 21:16:36','2023-07-17 21:16:36',1,'1681215775833042945'),
(2,'1680929899014750210',100,'中天','电线电缆','地下一层','1','123','测试规格/dsahj1','1','1','1','1',NULL,1,'2023-07-17 21:18:13','2023-07-17 21:18:13',1,'1681215775833042945'),
(3,'1681499095783407618',100,'中天','电线电缆','地下一层','1','123','23123','3424','2131','2','123','312',1,'2023-07-19 11:00:00','2023-07-19 11:00:00',1,'1681215775833042945'),
(4,'1',10,'中天','电线电缆','地下一层','1','123','','','规格/型号','','','',1,'2023-07-19 13:59:46','2023-07-19 13:59:46',1,'1681215775833042945'),
(5,'1',10,'中天','电线电缆','地下一层','1','123','','','规格/型号','','','',1,'2023-07-19 14:00:51','2023-07-19 14:00:51',1,'1681215775833042945'),
(6,'1',10,'中天','电线电缆','地下一层','1','123','','','规格/型号','','','',0,'2023-07-19 14:01:46','2023-07-19 14:01:46',1,'1681215775833042945'),
(7,'1',10,'中天','电线电缆','地下一层','1','123','','','规格/型号','','','',0,'2023-07-19 14:02:47','2023-07-19 14:02:47',1,'1681215775833042945'),
(8,'1',10,'中天','电线电缆','地下一层','1','123','规格/型号','5','2','4','3','1',1,'2023-07-19 14:25:56','2023-07-19 14:39:23',1,'1681215775833042945'),
(9,'1',10,'中天','电线电缆','地下一层','1','123','规格/型号','5','2','4','3','1',1,'2023-07-19 15:17:56','2023-07-19 15:17:56',1,'1681215775833042945'),
(13,'1',10,'中天','电线电缆','地下一层','1','123','规格/型号','5','2','4','3','1',0,'2023-07-19 15:44:51','2023-07-20 11:07:27',1,'1681215775833042945');
/*Table structure for table `inspection_product_list` */
DROP TABLE IF EXISTS `inspection_product_list`;
CREATE TABLE `inspection_product_list` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '项目id',
  `name` varchar(25) NOT NULL COMMENT '项目名称',
  `method` varchar(25) NOT NULL COMMENT '试验方法',
  `ask` varchar(30) DEFAULT NULL COMMENT '试验要求',
  `unit` varchar(20) NOT NULL COMMENT '单位',
  `required` varchar(20) NOT NULL COMMENT '招标人要求值',
  `internal` varchar(20) NOT NULL COMMENT '内控值',
  `start_time` datetime DEFAULT NULL COMMENT '开始日期',
  `end_time` datetime DEFAULT NULL COMMENT '结束日期',
  `state` int(1) NOT NULL DEFAULT '1',
  `create_time` datetime NOT NULL,
  `update_time` datetime NOT NULL,
  `version` int(1) DEFAULT '1',
  `inspection_material_list_id` int(10) NOT NULL COMMENT '关联 æŠ¥æ£€ç‰©æ–™id',
  `user_id` int(10) NOT NULL COMMENT '关联 ç”¨æˆ·id è¯•验员',
  `instrument_id` int(10) DEFAULT NULL COMMENT '关联 è®¾å¤‡id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;
/*Data for the table `inspection_product_list` */
insert  into `inspection_product_list`(`id`,`name`,`method`,`ask`,`unit`,`required`,`internal`,`start_time`,`end_time`,`state`,`create_time`,`update_time`,`version`,`inspection_material_list_id`,`user_id`,`instrument_id`) values
(2,'项目一','尺表测量',NULL,'ç±³','>=1','>1',NULL,NULL,1,'2023-07-17 21:16:36','2023-07-17 21:16:36',1,1,1,NULL),
(3,'项目一','尺表测量',NULL,'ç±³','>=1','>1',NULL,NULL,1,'2023-07-17 21:18:13','2023-07-17 21:18:13',1,2,1,NULL),
(4,'项目二','测试方法',NULL,'人民币','>1','>2',NULL,NULL,1,'2023-07-17 21:18:13','2023-07-17 21:18:13',1,3,1,NULL),
(5,'项目一','尺表测量',NULL,'ç±³','>=1','>1',NULL,NULL,0,'2023-07-19 15:44:51','2023-07-20 11:07:27',1,0,1,NULL),
(6,'项目二','测试方法',NULL,'人民币','>1','>2',NULL,NULL,0,'2023-07-19 15:44:51','2023-07-20 11:07:27',1,0,1,NULL);
/*Table structure for table `inspection_records` */
DROP TABLE IF EXISTS `inspection_records`;
CREATE TABLE `inspection_records` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '记录id',
  `method` varchar(25) NOT NULL COMMENT '检测方法',
  `num` int(10) NOT NULL COMMENT '检测的样品数量',
  `value` varchar(25) NOT NULL COMMENT '检测值',
  `submit_state` int(1) NOT NULL DEFAULT '0' COMMENT '提交状态 0:待提交;1:待审核;2:已通过',
  `state` int(1) NOT NULL DEFAULT '1',
  `create_time` datetime NOT NULL COMMENT '检测日期',
  `update_time` datetime NOT NULL,
  `version` int(1) DEFAULT NULL,
  `inspection_product_list_id` int(10) NOT NULL COMMENT '关联 æ ·å“ä¸‹çš„项目id',
  `user_name` int(10) DEFAULT NULL COMMENT '关联 å®¡æ‰¹äººï¼ˆç”¨æˆ·åç§°ï¼‰',
  `approval_time` datetime DEFAULT NULL COMMENT '审批日期',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*Data for the table `inspection_records` */
/*Table structure for table `instrument` */
DROP TABLE IF EXISTS `instrument`;
CREATE TABLE `instrument` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `classify_id` int(10) NOT NULL COMMENT '分类ID å…³è”',
  `user_id` int(10) NOT NULL COMMENT '用户关联 ä¿ç®¡äºº',
  `equipment_code` varchar(25) NOT NULL COMMENT '仪器设备编号',
  `equipment_name` varchar(25) NOT NULL COMMENT '仪器设备名称',
  `conditions` int(1) NOT NULL COMMENT '默认1;1:运行、2:故障、3:报修、4:检修、5:待机',
  `specifications_models` varchar(25) NOT NULL COMMENT '规格型号',
  `measuring_range` varchar(25) DEFAULT '--' COMMENT '测量范围',
  `error_rate` varchar(10) DEFAULT '--' COMMENT '误差',
  `manufacturer` varchar(50) DEFAULT '--' COMMENT '生产厂家',
  `arrival_date` datetime DEFAULT NULL COMMENT '到货日期',
  `acceptance_date` datetime DEFAULT NULL COMMENT '验收日期',
  `storage_place` varchar(100) DEFAULT '--' COMMENT '存放地',
  `whether_data_acquisition` int(1) NOT NULL COMMENT '是否支持数采',
  `equipment_measurement` int(1) NOT NULL COMMENT '是否需要仪器设备计量:如果需要计量周期必填;如果不需要计量周期不必填',
  `term_validity` int(11) NOT NULL COMMENT '计量截止有效期',
  `descriptiveness` varchar(100) DEFAULT '--' COMMENT '描述',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  `state` int(1) NOT NULL DEFAULT '1' COMMENT '逻辑删除',
  `version` int(1) DEFAULT '1' COMMENT '乐观锁',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4;
/*Data for the table `instrument` */
insert  into `instrument`(`id`,`classify_id`,`user_id`,`equipment_code`,`equipment_name`,`conditions`,`specifications_models`,`measuring_range`,`error_rate`,`manufacturer`,`arrival_date`,`acceptance_date`,`storage_place`,`whether_data_acquisition`,`equipment_measurement`,`term_validity`,`descriptiveness`,`create_time`,`update_time`,`state`,`version`) values
(1,1,9,'JSTC-W1-00001','数字电桥',1,'WCDMS-1','12毫米','0.000001微米','江苏鵷雏','2001-07-06 00:00:00','2060-07-06 00:00:00','地球亚洲中国江苏南通',1,0,12,'疯狂星期五!!!','2023-07-21 15:15:23','2023-07-24 17:10:17',1,1),
(2,1,9,'JSTC-W1-00002','数字电桥',1,'WCDMS-1','12毫米','0.000001微米','江苏鵷雏','2001-07-06 00:00:00','2060-07-06 00:00:00','地球亚洲中国江苏南通',1,0,12,'疯狂星期五!!!','2023-07-21 15:17:56','2023-07-21 15:58:35',1,1),
(3,1,10,'JSTC-W1-00003','数字电桥',3,'WCDMS-1','12毫米','0.000001微米','江苏鵷雏','2001-07-06 00:00:00','2060-07-06 00:00:00','地球亚洲中国江苏南通',1,0,12,'疯狂星期五!!!','2020-01-09 15:18:02','2023-07-21 15:18:02',1,1),
(4,1,11,'JSTC-W1-00004','数字电桥',2,'WCDMS-1','12毫米','0.000001微米','江苏鵷雏','2001-07-06 00:00:00','2060-07-06 00:00:00','地球亚洲中国江苏南通',1,0,12,'疯狂星期五!!!','2023-07-21 15:18:10','2023-07-21 15:18:10',1,1),
(5,1,12,'JSTC-W1-00005','数字电桥',4,'WCDMS-1','12毫米','0.000001微米','江苏鵷雏','2001-07-06 00:00:00','2060-07-06 00:00:00','地球亚洲中国江苏南通',1,0,12,'疯狂星期五!!!','2023-07-21 15:18:15','2023-07-21 15:18:15',1,1),
(6,1,13,'JSTC-W1-00006','A数字电桥',1,'WCDMS-1','12毫米','0.000001微米','江苏鵷雏','2001-07-06 00:00:00','2060-07-06 00:00:00','地球亚洲中国江苏南通',1,0,12,'疯狂星期五!!!','2023-07-21 15:18:19','2023-07-21 15:18:19',1,1),
(7,1,14,'JSTC-W1-00007','数字电桥',5,'WCDMS-1','12毫米','0.000001微米','江苏鵷雏','2001-07-06 00:00:00','2060-07-06 00:00:00','地球亚洲中国江苏南通',1,0,12,'疯狂星期五!!!','2023-07-21 15:18:23','2023-07-21 15:18:23',1,1),
(8,1,9,'JSTC-W1-00008','数字电桥',1,'WCDMS-1','12毫米','0.000001微米','江苏鵷雏','2001-07-06 00:00:00','2060-07-06 00:00:00','地球亚洲中国江苏南通',1,0,12,'疯狂星期五!!!','2023-07-24 14:16:07','2023-07-24 14:16:07',1,1);
/*Table structure for table `material` */
DROP TABLE IF EXISTS `material`;
CREATE TABLE `material` (
  `id` varchar(25) NOT NULL COMMENT '物料id',
  `name` varchar(25) NOT NULL COMMENT '物料名称',
  `supplier` varchar(25) NOT NULL COMMENT '供应商',
  `location` varchar(25) NOT NULL COMMENT '物料存放地',
  `num` int(10) NOT NULL COMMENT '物料数量',
  `batch` varchar(25) NOT NULL COMMENT '批次',
  `reel_number` varchar(25) NOT NULL COMMENT '盘号',
  `state` int(1) NOT NULL DEFAULT '1',
  `create_time` datetime NOT NULL,
  `update_time` datetime NOT NULL,
  `version` int(1) NOT NULL DEFAULT '1',
  `specifications_id` int(10) NOT NULL COMMENT '关联 è§„æ ¼id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*Data for the table `material` */
insert  into `material`(`id`,`name`,`supplier`,`location`,`num`,`batch`,`reel_number`,`state`,`create_time`,`update_time`,`version`,`specifications_id`) values
('11111111111111','22222222222','1111111111','1111111',1111111,'111111','1111111',0,'2023-07-20 15:19:11','2023-07-21 13:04:12',1,1),
('112233445566','手机','test','test',1,'2','3',1,'2023-07-21 13:29:57','2023-07-21 13:29:57',1,1),
('11223456','test','腾讯','仓库一,二号架',200,'2','152453211563232',1,'2023-07-21 13:51:21','2023-07-21 13:51:21',1,1),
('12345','testmaterial','test','test',1,'123','1',0,'2023-07-21 13:08:44','2023-07-21 13:13:54',1,1),
('123456','test','test','test',1,'1','1',0,'2023-07-21 13:14:49','2023-07-21 13:20:20',1,1),
('152423211563212','手机','百度','仓库一,二号架',200,'1','152453211563212',0,'2023-07-17 14:22:57','2023-07-21 13:28:54',1,1),
('152453211563211','石头','百度','仓库一,三号架',200,'1','152453211563212',0,'2023-07-17 14:14:03','2023-07-21 13:42:15',1,1),
('152453211563212','石头','百度','仓库一,二号架',200,'1','152453211563212',1,'2023-07-21 13:41:49','2023-07-21 13:41:49',1,1),
('152453211563222','石头','百度','仓库一,三号架',200,'1','152453211563212',1,'2023-07-17 14:14:03','2023-07-20 11:09:36',1,4),
('152453211563233','石头','百度','仓库一,三号架',200,'1','152453211563212',1,'2023-07-17 14:14:03','2023-07-20 11:00:29',1,4),
('218469124614','1122333','test','test',1,'1','1',1,'2023-07-21 13:31:00','2023-07-21 13:31:00',1,1),
('22222222','2222222','22222222','22222222',22222222,'2222222222','2222222',0,'2023-07-20 15:20:20','2023-07-21 13:21:25',1,1);
/*Table structure for table `metrical_information` */
DROP TABLE IF EXISTS `metrical_information`;
CREATE TABLE `metrical_information` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` int(10) NOT NULL COMMENT '用户关联Id',
  `measurement_unit` varchar(15) NOT NULL COMMENT '计量单位',
  `begin_date` datetime NOT NULL COMMENT '开始日期',
  `end_date` datetime NOT NULL COMMENT '结束日期',
  `uncertainty` varchar(20) NOT NULL COMMENT '不确定度',
  `result` int(1) NOT NULL COMMENT '结果 1:合格;2:矫正后可用;3:不合格',
  `performance_index` varchar(100) DEFAULT NULL COMMENT '性能指标',
  `remarks` varchar(100) DEFAULT NULL COMMENT '备注',
  `file_path` varchar(50) DEFAULT NULL COMMENT '文件路径',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  `state` int(1) NOT NULL DEFAULT '1' COMMENT '逻辑删除',
  `version` int(1) DEFAULT '1' COMMENT '乐观锁',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
/*Data for the table `metrical_information` */
insert  into `metrical_information`(`id`,`user_id`,`measurement_unit`,`begin_date`,`end_date`,`uncertainty`,`result`,`performance_index`,`remarks`,`file_path`,`create_time`,`update_time`,`state`,`version`) values
(1,7,'1','2023-07-25 00:00:00','2023-07-25 00:00:00','1',1,'1','1','1690255123954_131493.png','2023-07-25 10:43:30','2023-07-25 13:50:24',1,1),
(2,7,'2','2023-07-25 00:00:00','2023-07-25 00:00:00','2',2,'2','2','1690264656523_540845.png','2023-07-25 11:18:44','2023-07-25 13:57:37',1,1);
/*Table structure for table `plan` */
DROP TABLE IF EXISTS `plan`;
CREATE TABLE `plan` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '计划编号',
  `results` int(10) DEFAULT NULL COMMENT '检验结果 0:未完成;1:已完成;',
  `thing` varchar(50) DEFAULT NULL COMMENT '试验说明',
  `state` int(1) NOT NULL DEFAULT '1' COMMENT '1:待认领;2:待分配;3:已分配;4:超期待分配;5:已完成;0:已作废',
  `create_time` datetime NOT NULL COMMENT '任务登记时间',
  `update_time` datetime NOT NULL,
  `version` int(1) DEFAULT '1',
  `inspection_id` varchar(25) NOT NULL COMMENT '关联 æŠ¥æ£€id(申请单编号)',
  `user_id` int(10) DEFAULT NULL COMMENT '关联 ç”¨æˆ·id(负责人id)',
  `device_id` int(10) DEFAULT NULL COMMENT '关联 è®¾å¤‡id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*Data for the table `plan` */
/*Table structure for table `product` */
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '测试标准id',
  `name` varchar(25) NOT NULL COMMENT '测试标准名称',
  `method` varchar(25) NOT NULL COMMENT '试验方法',
  `father` varchar(20) DEFAULT NULL COMMENT '测试标准父类',
  `unit` varchar(20) NOT NULL COMMENT '单位',
  `required` varchar(20) NOT NULL COMMENT '招标人要求值',
  `internal` varchar(20) NOT NULL COMMENT '内控值',
  `state` int(1) NOT NULL DEFAULT '1',
  `create_time` datetime NOT NULL,
  `update_time` datetime NOT NULL,
  `version` int(1) NOT NULL DEFAULT '1',
  `user_id` int(10) NOT NULL COMMENT '关联 ç”¨æˆ·id',
  `material_id` varchar(25) NOT NULL COMMENT '关联 ç‰©æ–™id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4;
/*Data for the table `product` */
insert  into `product`(`id`,`name`,`method`,`father`,`unit`,`required`,`internal`,`state`,`create_time`,`update_time`,`version`,`user_id`,`material_id`) values
(1,'单位长度质量','--','铝包钢芯铝绞线','km','<=0.3458','<=0.3458',0,'2023-07-17 14:56:22','2023-07-21 13:28:54',1,7,'152423211563212'),
(2,'单位宽度质量','--','铝包钢芯铝绞线','km','<=0.3458','<=0.3458',1,'2023-07-17 14:56:22','2023-07-20 11:09:36',1,7,'152453211563222'),
(3,'单位宽度质量','--',NULL,'km','<=0.3458','<=0.3458',1,'2023-07-17 14:56:22','2023-07-20 11:09:36',1,7,'152453211563222'),
(4,'好多1','控制变量法','1111111','好多1','2000','100',0,'2023-07-20 16:05:38','2023-07-21 13:04:12',1,7,'11111111111111'),
(5,'好多好多','---','新的父项目','好多好多','200','100',0,'2023-07-20 16:10:19','2023-07-21 13:04:12',1,7,'11111111111111'),
(6,'好多好多','---','新的父项目','好多好多','200','100',0,'2023-07-20 16:11:39','2023-07-21 13:04:12',1,7,'11111111111111'),
(7,'1111111','test',NULL,'test','12','123',1,'2023-07-21 13:31:34','2023-07-21 13:31:34',1,7,'112233445566'),
(8,'111111','1',NULL,'11','1','1',1,'2023-07-21 13:33:06','2023-07-21 13:33:06',1,7,'112233445566'),
(9,'单位长度质量','--','铝包钢芯铝绞线','km','<=0.3458','<=0.3458',1,'2023-07-21 13:39:28','2023-07-21 13:39:28',1,7,'152453211563212'),
(10,'单位长度质量','--','铝包钢芯铝绞线','km','<=0.3458','<=0.3458',0,'2023-07-21 13:42:01','2023-07-21 14:19:34',1,7,'152453211563212'),
(11,'1111111111','1111','铝包钢芯铝绞线','cm','11','111',0,'2023-07-21 13:48:25','2023-07-21 14:20:50',1,7,'152453211563212'),
(12,'11111111','1','铝包钢芯铝绞线','1111','1','1',0,'2023-07-21 13:48:59','2023-07-21 14:19:04',1,7,'112233445566'),
(13,'11111','--','11111111','km','<=0.3458','<=0.3458',1,'2023-07-21 13:52:21','2023-07-21 13:52:21',1,7,'11223456'),
(14,'12345','--','11111111','km','<=0.3458','<=0.3458',0,'2023-07-21 13:53:58','2023-07-21 13:56:17',1,7,'11223456'),
(15,'11111111111111','1','铝包钢芯铝绞线','111','11','1',0,'2023-07-21 14:23:10','2023-07-21 14:23:22',1,7,'152453211563212');
/*Table structure for table `role` */
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '角色id',
  `name` varchar(30) NOT NULL COMMENT '角色名',
  `power` int(1) NOT NULL COMMENT '0:无权限;1:有权限',
  `state` int(1) NOT NULL DEFAULT '1' COMMENT '逻辑删除 æ­£å¸¸>=1,删除<=0',
  `create_time` datetime NOT NULL,
  `update_time` datetime NOT NULL,
  `version` int(10) NOT NULL COMMENT '乐观锁',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
/*Data for the table `role` */
insert  into `role`(`id`,`name`,`power`,`state`,`create_time`,`update_time`,`version`) values
(1,'普通人员',1,1,'2023-07-07 11:30:06','2023-07-07 11:30:11',1);
/*Table structure for table `serial_number` */
DROP TABLE IF EXISTS `serial_number`;
CREATE TABLE `serial_number` (
  `id` varchar(25) NOT NULL COMMENT '型号编号',
  `name` varchar(25) NOT NULL COMMENT '型号名称',
  `state` int(1) NOT NULL DEFAULT '1',
  `create_time` datetime NOT NULL,
  `update_time` datetime NOT NULL,
  `version` int(1) NOT NULL DEFAULT '1',
  `standards_id` varchar(15) NOT NULL COMMENT '关联字段 æ ‡å‡†id',
  `user_id` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*Data for the table `serial_number` */
insert  into `serial_number`(`id`,`name`,`state`,`create_time`,`update_time`,`version`,`standards_id`,`user_id`) values
('111222','型号1',0,'2023-07-20 15:01:08','2023-07-20 15:20:09',1,'111',7),
('230711000002','光纤2.0.1',1,'2023-07-11 22:34:11','2023-07-20 09:28:19',1,'230711000001',7),
('ModelNumber001','光纤2.0.1',1,'2023-07-20 10:51:01','2023-07-20 10:51:01',1,'230711000002',7),
('ModelNumber002','光纤2.0.2',1,'2023-07-18 13:36:13','2023-07-20 09:28:19',1,'230711000001',7),
('ModelNumber003','光纤2.0.3',1,'2023-07-18 13:36:23','2023-07-20 10:54:11',1,'230711000002',7),
('num1','光纤2.0.3',1,'2023-07-20 14:18:24','2023-07-20 14:18:24',1,'230711000002',7),
('num2','光纤2.0.4',1,'2023-07-20 14:19:34','2023-07-20 14:19:34',1,'230711000002',7),
('PleasantGoat','1345',1,'2023-07-18 13:46:49','2023-07-20 10:22:42',1,'230711000002',7),
('spiritless','78915',1,'2023-07-18 13:46:24','2023-07-18 13:46:24',1,'230711000004',7);
/*Table structure for table `specifications` */
DROP TABLE IF EXISTS `specifications`;
CREATE TABLE `specifications` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '规格id',
  `number` varchar(25) NOT NULL COMMENT '规格编号',
  `name` varchar(25) NOT NULL COMMENT '产品规格',
  `instruct` varchar(25) DEFAULT NULL COMMENT '生产指令号',
  `voltage_level` varchar(30) DEFAULT NULL COMMENT '电压等级',
  `cross_section` varchar(30) DEFAULT NULL COMMENT '主线心截面',
  `number_of_cores` varchar(30) DEFAULT NULL COMMENT '主线芯芯数',
  `spe_state` int(1) NOT NULL DEFAULT '-1' COMMENT '规格状态 0:停用;1:正常;-1:草稿',
  `state` int(1) NOT NULL DEFAULT '1' COMMENT '逻辑删除 æ­£å¸¸>=1,删除<=0',
  `create_time` datetime NOT NULL,
  `update_time` datetime NOT NULL COMMENT '更新时间',
  `version` int(1) NOT NULL DEFAULT '1',
  `vel` varchar(15) NOT NULL DEFAULT 'V1.0' COMMENT '规格版本',
  `serial_id` varchar(25) NOT NULL COMMENT '关联字段 åž‹å·id',
  `user_id` int(10) NOT NULL COMMENT '关联字段 ç”¨æˆ·id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;
/*Data for the table `specifications` */
insert  into `specifications`(`id`,`number`,`name`,`instruct`,`voltage_level`,`cross_section`,`number_of_cores`,`spe_state`,`state`,`create_time`,`update_time`,`version`,`vel`,`serial_id`,`user_id`) values
(1,'111','ab','test','1','test','test',0,1,'2023-07-12 00:00:12','2023-07-21 09:52:22',1,'V1.0','230711000002',7),
(2,'abc','AB','abc','abc','abc','abc',0,1,'2023-07-12 00:00:12','2023-07-20 16:34:38',1,'V1.0','230711000002',7),
(4,'abc','AB','abc','abc','abc','abc',1,1,'2023-07-12 00:00:12','2023-07-20 11:00:29',1,'V1.0','ModelNumber003',7),
(5,'abc','AB','abc','abc','abc','abc',1,1,'2023-07-12 00:00:12','2023-07-20 10:22:42',1,'V1.0','PleasantGoat',7),
(6,'modelId','AB','test','test','test','test',-1,1,'2023-07-20 13:42:40','2023-07-20 13:42:40',1,'V1.0','230711000002',7),
(7,'modelID1','test','test','test','test','test',-1,1,'2023-07-20 14:02:26','2023-07-20 14:02:26',1,'V1.0','230711000002',7),
(8,'modelId2','test11','test','test','test','test',-1,1,'2023-07-20 14:03:54','2023-07-20 14:03:54',1,'V1.0','230711000002',7),
(9,'111222','光纤2.0.3','test','test','test','test',-1,1,'2023-07-20 14:55:12','2023-07-20 14:55:12',1,'V1.0','230711000002',7);
/*Table structure for table `standards` */
DROP TABLE IF EXISTS `standards`;
CREATE TABLE `standards` (
  `id` varchar(15) NOT NULL COMMENT '标准编号 yyMMdd000001(000001++)',
  `name` varchar(25) NOT NULL COMMENT '标准名称',
  `eng_name` varchar(25) NOT NULL COMMENT '英文名称',
  `type` int(1) NOT NULL COMMENT '0:原材料;1:电线电缆',
  `state` int(1) NOT NULL DEFAULT '1' COMMENT '逻辑字段 0:删除;1:正常',
  `create_time` datetime NOT NULL COMMENT '生效日期',
  `update_time` datetime NOT NULL COMMENT '更新日期',
  `version` int(1) NOT NULL DEFAULT '1',
  `user_id` int(10) NOT NULL COMMENT '关联字段 æ›´æ–°äººid',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*Data for the table `standards` */
insert  into `standards`(`id`,`name`,`eng_name`,`type`,`state`,`create_time`,`update_time`,`version`,`user_id`) values
('111','123131313','164654565',0,0,'2023-07-20 13:26:55','2023-07-20 15:20:09',1,7),
('112233445566','鱼鱼','fish',1,0,'2023-07-20 10:54:12','2023-07-20 15:19:41',1,7),
('230711000001','小白','OpticalFibre',1,1,'2023-07-11 21:27:04','2023-07-20 09:28:19',1,6),
('230711000002','材料','OpticalFibrw',1,1,'2023-07-11 21:27:04','2023-07-20 10:22:42',1,6),
('230711000003','显示屏','Monitor',2,1,'2023-07-18 13:43:52','2023-07-18 13:43:52',1,7),
('230711000004','小黑','Black',2,1,'2023-07-18 13:44:29','2023-07-18 13:44:29',1,7);
/*Table structure for table `user` */
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `account` varchar(20) NOT NULL COMMENT '账号',
  `password` varchar(100) NOT NULL COMMENT '密码',
  `name` varchar(20) NOT NULL COMMENT '姓名',
  `phone` varchar(11) DEFAULT NULL COMMENT '手机号',
  `email` varchar(30) DEFAULT NULL COMMENT '邮箱',
  `age` int(3) DEFAULT NULL COMMENT '年龄',
  `job_state` int(1) NOT NULL DEFAULT '1' COMMENT '在职状态 æ­£å¸¸>=1,离职<=0',
  `info` varchar(100) DEFAULT NULL COMMENT '个性签名',
  `create_time` datetime NOT NULL,
  `update_time` datetime NOT NULL,
  `version` int(1) NOT NULL DEFAULT '1',
  `role_id` int(10) NOT NULL,
  `enterprise_id` int(10) NOT NULL COMMENT '关联 ä¼ä¸šID',
  PRIMARY KEY (`id`),
  UNIQUE KEY `account_unique` (`account`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4;
/*Data for the table `user` */
insert  into `user`(`id`,`account`,`password`,`name`,`phone`,`email`,`age`,`job_state`,`info`,`create_time`,`update_time`,`version`,`role_id`,`enterprise_id`) values
(7,'123456','123456','小小','12345678981','12345678@qq.com',23,1,NULL,'2023-07-11 09:14:50','2023-07-11 09:14:50',1,1,1),
(9,'1388967','123456','鱼鱼','19727565533','1981343953@qq.com',18,1,NULL,'2023-07-13 14:51:41','2023-07-13 14:51:41',1,1,1),
(10,'1111111','123456','叮叮当','17726824629','13958368246@gmail.com',13,1,NULL,'2023-07-13 14:57:23','2023-07-13 14:57:23',1,0,1),
(11,'135686632','123456','叮叮当','13795639054','19813438642@qq.com',18,1,NULL,'2023-07-13 14:58:45','2023-07-13 14:58:45',1,1,1),
(12,'333','123456','鱼鱼','72398','2144',36,1,NULL,'2023-07-13 15:21:34','2023-07-13 15:21:34',1,0,1),
(13,'199999','123456','鱼鱼','2154364646','18913908',34,1,NULL,'2023-07-13 15:22:16','2023-07-13 15:22:16',1,1,1),
(14,'8957824','123456','张三','23875185298','2222222872',13,1,NULL,'2023-07-13 15:29:13','2023-07-13 15:29:13',1,1,1),
(21,'45612345','123456','小黑','12345678981','12345678@qq.com',23,1,NULL,'2023-07-17 10:36:23','2023-07-17 10:36:23',1,1,1),
(23,'4561278345','123456','小黑','12345678981','12345678@qq.com',23,1,NULL,'2023-07-17 11:28:50','2023-07-17 11:28:50',1,1,1);
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
standard-server/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>lims-laboratory</artifactId>
        <groupId>com.yuanchu</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.yunchu.limslaboratory</groupId>
    <artifactId>standard-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>standard-library</name>
    <description>standard-library</description>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>com.yunchu.limslaboratory</groupId>
            <artifactId>framework</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <dependency>
            <groupId>com.yunchu.limslaboratory</groupId>
            <artifactId>user-server</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
    </dependencies>
</project>
standard-server/src/main/java/com/yuanchu/limslaboratory/controller/MaterialController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.yuanchu.limslaboratory.controller;
import com.yuanchu.limslaboratory.pojo.dto.AddMaterialDto;
import com.yuanchu.limslaboratory.service.MaterialService;
import com.yuanchu.limslaboratory.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-17
 */
@Api(tags = "标准库-->1、物料")
@RestController
@RequestMapping("/material")
public class MaterialController {
    @Autowired
    private MaterialService materialService;
    @ApiOperation("添加物料")
    @PostMapping("/add")
    public Result<?> addMaterialInformation(@Validated @RequestBody AddMaterialDto addMaterialDto) {
        Integer isMaterialSuccess = materialService.addMaterialInformation(addMaterialDto);
        if (isMaterialSuccess == 1) {
            return Result.success("添加物料【"+ addMaterialDto.getMaterialName() +"】成功!");
        }
        return Result.fail("添加物料【"+ addMaterialDto.getMaterialName() +"】失败!");
    }
    @ApiOperation("根据物料ID删除物料")
    @DeleteMapping("/delete")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(value = "物料ID", name = "materialId", dataTypeClass = Integer.class)
    })
    public Result<?> deleteMaterialInformation(Integer materialId) {
        Integer isDeleteMaterialSuccess = materialService.deleteMaterialInformation(materialId);
        if (isDeleteMaterialSuccess == 1) {
            return Result.success("删除成功!");
        }
        return Result.fail("删除失败!");
    }
    @ApiOperation(value = "标准库-->物料-->侧边栏四级展开", tags = "⭐⭐⭐后端调整")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(value = "型号/型号名称", name = "specificationName", dataTypeClass = String.class)
    })
    @GetMapping("/list")
    public Result<?> getFourLevelInformation(String specificationName) {
        List<Map<String, Object>> fourLevelInformation = materialService.getFourLevelInformation(specificationName);
        return Result.success(fourLevelInformation);
    }
}
standard-server/src/main/java/com/yuanchu/limslaboratory/controller/ProductController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.yuanchu.limslaboratory.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.service.ProductService;
import com.yuanchu.limslaboratory.vo.Result;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-17
 */
@Api(tags = "标准库-->4、项目")
@RestController
@RequestMapping("/product")
public class ProductController {
    @Autowired
    private ProductService productService;
    @ApiOperation("1、分页查询项目")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "pageNo", value = "起始页", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "pageSize", value = "每一页数量", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "specificationsId", value = "规格型号ID", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(value = "原材料编码/原材料名称", name = "productCodeOrName", dataTypeClass = String.class)
    })
    @GetMapping("/page")
    public Result<?> pageProductInformation(Integer pageNo, Integer pageSize, Integer specificationsId, String productCodeOrName) {
        IPage<Map<String, Object>> maps = productService.pageProductInformation(productCodeOrName, specificationsId, new Page<Objects>(pageNo, pageSize));
        Map<String, Object> map = new HashMap<>();
        map.put("row", maps.getRecords());
        map.put("total", maps.getTotal());
        return Result.success(map);
    }
    @ApiOperation("2、根据父类查子类")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(value = "父类名称", name = "fatherName", dataTypeClass = String.class)
    })
    @GetMapping("/father")
    public Result<?> pageFatherNameProductInformation(String fatherName) {
        List<Map<String, Object>> maps = productService.pageFatherNameProductInformation(fatherName);
        return Result.success(maps);
    }
}
standard-server/src/main/java/com/yuanchu/limslaboratory/controller/SpecificationsController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.yuanchu.limslaboratory.controller;
import com.yuanchu.limslaboratory.pojo.dto.AddSpecifications;
import com.yuanchu.limslaboratory.pojo.dto.AddStandardDto;
import com.yuanchu.limslaboratory.service.SpecificationsService;
import com.yuanchu.limslaboratory.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-11
 */
@Api(tags = "标准库-->3、产品规格")
@RestController
@RequestMapping("/specifications")
public class SpecificationsController {
    @Autowired
    private SpecificationsService specificationsService;
    @ApiOperation("添加物料")
    @PostMapping("/add")
    public Result<?> addSpecificationsInformation(@Validated @RequestBody AddSpecifications addSpecifications) {
        Integer isMaterialSuccess = specificationsService.addSpecificationsInformation(addSpecifications);
        if (isMaterialSuccess == 1) {
            return Result.success("添加物料【"+ addSpecifications.getSpecificationsName() +"】成功!");
        }
        return Result.fail("添加物料【"+ addSpecifications.getSpecificationsName() +"】失败!");
    }
    @ApiOperation("删除产品规格")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "specificationsId", value = "规格Id", dataTypeClass = Integer.class, required = true)
    })
    @DeleteMapping("/delete")
    public Result<?> deleteSpecificationsInformation(Integer specificationsId) {
        Integer isStandardsSuccess = specificationsService.deleteSpecifications(specificationsId);
        if (isStandardsSuccess == 1) {
            return Result.success("删除成功!");
        }
        return Result.fail("删除失败!");
    }
}
standard-server/src/main/java/com/yuanchu/limslaboratory/controller/StandardController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.yuanchu.limslaboratory.controller;
import com.yuanchu.limslaboratory.pojo.dto.AddStandardDto;
import com.yuanchu.limslaboratory.service.StandardService;
import com.yuanchu.limslaboratory.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-11
 */
@Api(tags = "标准库-->2、标准")
@RestController
@RequestMapping("/standards")
public class StandardController {
    @Autowired
    private StandardService standardService;
    @ApiOperation("添加物料")
    @PostMapping("/add")
    public Result<?> addStandardInformation(@Validated @RequestBody AddStandardDto addStandardDto) {
        Integer isMaterialSuccess = standardService.addStandardInformation(addStandardDto);
        if (isMaterialSuccess == 1) {
            return Result.success("添加物料【"+ addStandardDto.getStandardName() +"】成功!");
        }
        return Result.fail("添加物料【"+ addStandardDto.getStandardName() +"】失败!");
    }
    @ApiOperation("根据ID删除数据")
    @DeleteMapping("/delete")
    public Result<?> deleteStandardsInformation(Integer standardsId) {
        Integer isDeleteMaterialSuccess = standardService.deleteStandardInformation(standardsId);
        if (isDeleteMaterialSuccess == 1) {
            return Result.success("删除成功!");
        }
        return Result.fail("删除失败!");
    }
}
standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/MaterialMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.yuanchu.limslaboratory.mapper;
import com.yuanchu.limslaboratory.pojo.Material;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-17
 */
public interface MaterialMapper extends BaseMapper<Material> {
    //查询物料信息
    List<Map> selectMaterialLimit(int num1,int num2, int type);
    //根据物料id查询物料信息
    Map selectMaterialById(String materialId);
    // å››çº§æ ‘
    List<Map<String, Object>> FourTree(String specificationsName);
}
standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/ProductMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.yuanchu.limslaboratory.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.Product;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-17
 */
public interface ProductMapper extends BaseMapper<Product> {
    //根据物料id查询检验项目
    List<Map> selectProductByMaterialId(int materialId);
    IPage<Map<String, Object>> pageProductInformation(String productCodeOrName, Integer specificationsId, Page<Objects> page);
    Map<String, Object> selectOneChildren(Object father);
    Map<String, Object> getProductInformation(Integer productId);
    //通过项目名查询项目的试验方法
    List<Map> selectInstrumentByProname(String name);
}
standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/SpecificationsMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.yuanchu.limslaboratory.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.Specifications;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-11
 */
public interface SpecificationsMapper extends BaseMapper<Specifications> {
    Map<String, Object> selectSNameSNName(int materialId);
    IPage<Map<String, Objects>> listSpecificationsInformation(String specificationsName, String serialNumberId, Page<Objects> page);
}
standard-server/src/main/java/com/yuanchu/limslaboratory/mapper/StandardMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.yuanchu.limslaboratory.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.Standard;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-11
 */
public interface StandardMapper extends BaseMapper<Standard> {
    IPage<Map<String, Object>> listPageStandardsInformation(Page<Object> page, String idOrNameOfStandards);
    List<Map<String, Object>> getSpecificationIdAndName(String materialId);
}
standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Material.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.yuanchu.limslaboratory.pojo;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-17
 */
@Accessors(chain = true)
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="Material对象", description="")
public class Material implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "物料id", hidden = true)
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "物料编码", hidden = true)
    private String code;
    @ApiModelProperty(value = "物料名称", example = "石头", required = true)
    private String name;
    @ApiModelProperty(value = "0:原材料;1:成品;2:半成品", example = "1", required = true)
    private Integer type;
    @TableLogic(value = "1", delval = "0")
    @ApiModelProperty(value = "逻辑删除 æ­£å¸¸>=1,删除<=0", hidden = true)
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;
    @ApiModelProperty(value = "乐观锁", hidden = true)
    private Integer version;
}
standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Product.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-17
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="Product对象", description="")
public class Product implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "项目id", hidden = true)
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "项目名称", example = "单位长度质量", required = true)
    private String name;
    @ApiModelProperty(value = "项目父类", example = "铝包钢芯铝绞线")
    private String father;
    @ApiModelProperty(value = "单位", example = "km", required = true)
    private String unit;
    @ApiModelProperty(value = "标准值", example = "<=0.3458", required = true)
    private String required;
    @ApiModelProperty(value = "内控值", example = "<=0.3458", required = true)
    private String internal;
    @TableLogic(value = "1", delval = "0")
    @ApiModelProperty(value = "逻辑删除 æ­£å¸¸>=1,删除<=0", hidden = true)
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;
    @ApiModelProperty(value = "乐观锁", hidden = true)
    private Integer version;
    @ApiModelProperty(value = "关联 ç‰©æ–™id", example = "1", hidden = true)
    private Integer specifications_id;
}
standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Specifications.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-11
 */
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="Specifications对象", description="规格")
public class Specifications implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "型号id", hidden = true)
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "产品型号名称", example = "AB", required = true)
    private String name;
    @ApiModelProperty(value = "逻辑删除 æ­£å¸¸>=1,删除<=0", hidden = true)
    @TableLogic(value = "1", delval = "0")
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;
    @ApiModelProperty(value = "乐观锁", hidden = true)
    @Version
    private Integer version;
    @ApiModelProperty(value = "关联字段 è§„æ ¼id", hidden = true)
    private Integer standardId;
}
standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/Standard.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-11
 */
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="Standards对象", description="标准")
public class Standard implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "规格编号 yyMMdd000001(000001++)", example = "230711000001", required = true)
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "规格名称", example = "光纤", required = true)
    private String name;
    @TableLogic(value = "1", delval = "0")
    @ApiModelProperty(value = "逻辑删除 æ­£å¸¸>=1,删除<=0", hidden = true)
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新时间", hidden = true)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;
    @ApiModelProperty(value = "乐观锁", hidden = true)
    @Version
    private Integer version;
    @ApiModelProperty(value = "物料Id", hidden = true)
    private Integer materialId;
}
standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddMaterialDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.yuanchu.limslaboratory.pojo.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="AddMaterialDto对象", description="")
public class AddMaterialDto {
    @NotNull(message = "物料类型不能为空!")
    @ApiModelProperty(value = "0:原材料;1:成品;2:半成品", example = "1", required = true)
    private Integer type;
    @NotBlank(message = "物料名称不能为空!")
    @ApiModelProperty(value = "物料名称", example = "石头", required = true)
    private String materialName;
    @NotBlank(message = "标准名称不能为空!")
    @ApiModelProperty(value = "标准名称", example = "光纤", required = true)
    private String standardName;
    @NotBlank(message = "产品规格名称不能为空!")
    @ApiModelProperty(value = "产品规格名称", example = "AB", required = true)
    private String specificationsName;
}
standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddSpecifications.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.yuanchu.limslaboratory.pojo.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="AddSpecifications对象", description="")
public class AddSpecifications {
    @NotNull(message = "标准ID不能为空!")
    @ApiModelProperty(value = "标准id", example = "1", required = true)
    private Integer standardId;
    @NotBlank(message = "产品规格名称不能为空!")
    @ApiModelProperty(value = "产品规格名称", example = "AB", required = true)
    private String specificationsName;
}
standard-server/src/main/java/com/yuanchu/limslaboratory/pojo/dto/AddStandardDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.yuanchu.limslaboratory.pojo.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="AddStandardDto对象", description="")
public class AddStandardDto {
    @NotNull(message = "物料ID不能为空!")
    @ApiModelProperty(value = "物料id", example = "1", required = true)
    private Integer materialId;
    @NotBlank(message = "标准名称不能为空!")
    @ApiModelProperty(value = "标准名称", example = "光纤", required = true)
    private String standardName;
    @NotBlank(message = "产品规格名称不能为空!")
    @ApiModelProperty(value = "产品规格名称", example = "AB", required = true)
    private String specificationsName;
}
standard-server/src/main/java/com/yuanchu/limslaboratory/service/MaterialService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.yuanchu.limslaboratory.service;
import com.yuanchu.limslaboratory.pojo.Material;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuanchu.limslaboratory.pojo.dto.AddMaterialDto;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-17
 */
public interface MaterialService extends IService<Material> {
    List<Map> selectMaterialLimit(int pageSize,int countSize, int type);
    /**
     * åˆ é™¤ç­‰äºŽMaterialId的数据
     * @param materialId
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    Integer deleteMaterialInformation(Integer materialId);
    /**
     * ä¸‰çº§æ·»åŠ å‚æ•°
     */
    @Transactional(rollbackFor = Exception.class)
    Integer addMaterialInformation(AddMaterialDto addMaterialDto);
    /**
     * å››çº§åˆ†å±‚显示
     */
    List<Map<String, Object>> getFourLevelInformation(String specificationName);
}
standard-server/src/main/java/com/yuanchu/limslaboratory/service/ProductService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.yuanchu.limslaboratory.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.Product;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-17
 */
public interface ProductService extends IService<Product> {
    void deleteProductInformation(List<Integer> SpecificationsId);
    IPage<Map<String, Object>> pageProductInformation(String productCodeOrName, Integer specificationsId, Page<Objects> page);
    List<Map<String, Object>> pageFatherNameProductInformation(String fatherName);
    /**
     * é€šè¿‡é¡¹ç›®åæŸ¥è¯¢é¡¹ç›®çš„试验方法
     * @param name
     * @return
     */
    List<Map> selectInstrumentByProname(String name);
}
standard-server/src/main/java/com/yuanchu/limslaboratory/service/SpecificationsService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.yuanchu.limslaboratory.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yuanchu.limslaboratory.pojo.Specifications;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuanchu.limslaboratory.pojo.Standard;
import com.yuanchu.limslaboratory.pojo.dto.AddSpecifications;
import com.yuanchu.limslaboratory.pojo.dto.AddStandardDto;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-11
 */
public interface SpecificationsService extends IService<Specifications> {
    /**
     * å¤šè¡¨åˆ é™¤ï¼Œè¡¨æ ¼åˆ†åˆ«æœ‰ï¼šSpecification --> Material --> Product
     * @param specificationsId
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    Integer deleteSpecifications(Integer specificationsId);
    List<Integer> StandardIdDeleteSpecifications(List<Integer> deleteStandard);
    Integer addSpecificationsInformation(AddSpecifications addStandardDto);
}
standard-server/src/main/java/com/yuanchu/limslaboratory/service/StandardService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.yuanchu.limslaboratory.service;
import com.yuanchu.limslaboratory.pojo.Standard;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuanchu.limslaboratory.pojo.dto.AddStandardDto;
import io.swagger.models.auth.In;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-11
 */
public interface StandardService extends IService<Standard> {
    /**
     * æ ¹æ®æ ‡å‡†Id删除数据
     * @param materialId
     * @return
     */
    List<Integer> deleteStandardsInformation(Integer materialId);
    @Transactional(rollbackFor = Exception.class)
    Integer deleteStandardInformation(Integer standardsId);
    Integer addStandardInformation(AddStandardDto addStandardDto);
    List<Map<String, Object>> getSpecificationIdAndName(String materialId);
}
standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/MaterialServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
package com.yuanchu.limslaboratory.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.yuanchu.limslaboratory.pojo.Material;
import com.yuanchu.limslaboratory.mapper.MaterialMapper;
import com.yuanchu.limslaboratory.pojo.Specifications;
import com.yuanchu.limslaboratory.pojo.Standard;
import com.yuanchu.limslaboratory.pojo.dto.AddMaterialDto;
import com.yuanchu.limslaboratory.service.MaterialService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.limslaboratory.service.ProductService;
import com.yuanchu.limslaboratory.service.SpecificationsService;
import com.yuanchu.limslaboratory.service.StandardService;
import com.yuanchu.limslaboratory.utils.MyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-17
 */
@Service
public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> implements MaterialService {
    @Resource
    private MaterialMapper materialMapper;
    @Autowired
    private StandardService standardService;
    @Autowired
    private SpecificationsService specificationsService;
    @Autowired
    private ProductService productService;
    //查询物料信息
    @Override
    public List<Map> selectMaterialLimit(int pageSize, int countSize, int type) {
        return materialMapper.selectMaterialLimit((pageSize - 1) * countSize,pageSize * countSize, type);
    }
    @Override
    public Integer deleteMaterialInformation(Integer materialId) {
        LambdaUpdateWrapper<Material> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(Material::getId, materialId);
        updateWrapper.set(Material::getState, 0);
        int isDeleteSuccess = materialMapper.update(new Material(), updateWrapper);
        if (isDeleteSuccess == 1){
            List<Integer> isDeleteStandard = standardService.deleteStandardsInformation(materialId);
            if (!ObjectUtils.isEmpty(isDeleteStandard)){
                List<Integer> idDeleteSpecifications = specificationsService.StandardIdDeleteSpecifications(isDeleteStandard);
                if (!ObjectUtils.isEmpty(idDeleteSpecifications)){
                    productService.deleteProductInformation(idDeleteSpecifications);
                }
            }
            return 1;
        }
        return 0;
    }
    @Override
    public Integer addMaterialInformation(AddMaterialDto addMaterialDto) {
        Material material = new Material()
                .setCode("BZ" + IdWorker.getIdStr())
                .setName(addMaterialDto.getMaterialName())
                .setType(addMaterialDto.getType());
        int isInsertSuccess = materialMapper.insert(material);
        if (isInsertSuccess > 0){
            Standard standard = new Standard()
                    .setMaterialId(material.getId())
                    .setName(addMaterialDto.getStandardName());
            boolean save = standardService.save(standard);
            if (save){
                Specifications specifications = new Specifications()
                        .setName(addMaterialDto.getSpecificationsName())
                        .setStandardId(standard.getId());
                boolean save1 = specificationsService.save(specifications);
                if (save1)
                    return 1;
            }
        }
        return 0;
    }
    @Override
    public List<Map<String, Object>> getFourLevelInformation(String specificationName) {
        return materialMapper.FourTree(specificationName);
    }
}
standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/ProductServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.yuanchu.limslaboratory.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.Product;
import com.yuanchu.limslaboratory.mapper.ProductMapper;
import com.yuanchu.limslaboratory.service.ProductService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.limslaboratory.utils.MyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import com.yuanchu.limslaboratory.service.UserService;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 * æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-17
 */
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
    @Resource
    private ProductMapper productMapper;
    @Override
    public void deleteProductInformation(List<Integer> SpecificationsId) {
        for (Integer materialId : SpecificationsId){
            LambdaUpdateWrapper<Product> wrapper = new LambdaUpdateWrapper<>();
            wrapper.eq(Product::getSpecifications_id, materialId);
            wrapper.set(Product::getState, 0);
            productMapper.update(new Product(), wrapper);
        }
    }
    @Override
    public IPage<Map<String, Object>> pageProductInformation(String productCodeOrName, Integer specificationsId, Page<Objects> page) {
        IPage<Map<String, Object>> iPage = productMapper.pageProductInformation(productCodeOrName, specificationsId, page);
        List<Map<String, Object>> maps = iPage.getRecords();
        maps.forEach(map -> {
            int num = Integer.parseInt(map.get("num").toString());
            boolean children = false;
            if (num > 1){
                children = true;
            } else {
                Map<String, Object> product = productMapper.selectOneChildren(map.get("father"));
                map.putAll(product);
            }
            map.put("children", children);
            map.remove("num");
        });
        return iPage;
    }
    @Override
    public List<Map<String, Object>> pageFatherNameProductInformation(String fatherName) {
        LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Product::getFather, fatherName);
        wrapper.select(Product::getId, Product::getName, Product::getUnit, Product::getRequired, Product::getInternal);
        return productMapper.selectMaps(wrapper);
    }
    //通过项目名查询项目的试验方法
    @Override
    public List<Map> selectInstrumentByProname(String name) {
        return productMapper.selectInstrumentByProname(name);
    }
}
standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/SpecificationsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
package com.yuanchu.limslaboratory.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.yuanchu.limslaboratory.pojo.Specifications;
import com.yuanchu.limslaboratory.mapper.SpecificationsMapper;
import com.yuanchu.limslaboratory.pojo.dto.AddSpecifications;
import com.yuanchu.limslaboratory.pojo.dto.AddStandardDto;
import com.yuanchu.limslaboratory.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-11
 */
@Service
public class SpecificationsServiceImpl extends ServiceImpl<SpecificationsMapper, Specifications> implements SpecificationsService {
    @Resource
    private SpecificationsMapper specificationsMapper;
    @Autowired
    private ProductService productService;
    @Override
    public Integer deleteSpecifications(Integer specificationsId) {
        LambdaUpdateWrapper<Specifications> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(Specifications::getId, specificationsId);
        updateWrapper.set(Specifications::getState, 0);
        List<Integer> list = new ArrayList<>();
        list.add(specificationsId);
        int isDeleteSuccess = specificationsMapper.update(new Specifications(), updateWrapper);
        if (isDeleteSuccess == 1){
            productService.deleteProductInformation(list);
            return 1;
        }
        return 0;
    }
    @Override
    public List<Integer> StandardIdDeleteSpecifications(List<Integer> deleteStandard) {
        List<Integer> list = new ArrayList<>();
        for (Integer standard : deleteStandard){
            LambdaQueryWrapper<Specifications> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(Specifications::getStandardId, standard);
            wrapper.select(Specifications::getId);
            List<Specifications> maps1 = specificationsMapper.selectList(wrapper);
            for (Specifications specifications:maps1){
                LambdaUpdateWrapper<Specifications> updateWrapper = new LambdaUpdateWrapper<>();
                updateWrapper.eq(Specifications::getId, specifications.getId());
                updateWrapper.set(Specifications::getState, 0);
                specificationsMapper.update(new Specifications(), updateWrapper);
                list.add(specifications.getId());
            }
        }
        return list;
    }
    @Override
    public Integer addSpecificationsInformation(AddSpecifications addStandardDto) {
        Specifications specifications = new Specifications()
                .setName(addStandardDto.getSpecificationsName())
                .setStandardId(addStandardDto.getStandardId());
        return specificationsMapper.insert(specifications);
    }
}
standard-server/src/main/java/com/yuanchu/limslaboratory/service/impl/StandardServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package com.yuanchu.limslaboratory.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.yuanchu.limslaboratory.mapper.StandardMapper;
import com.yuanchu.limslaboratory.pojo.Material;
import com.yuanchu.limslaboratory.pojo.Specifications;
import com.yuanchu.limslaboratory.pojo.Standard;
import com.yuanchu.limslaboratory.pojo.dto.AddStandardDto;
import com.yuanchu.limslaboratory.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-11
 */
@Service
public class StandardServiceImpl extends ServiceImpl<StandardMapper, Standard> implements StandardService {
    @Resource
    private StandardMapper standardMapper;
    @Lazy
    @Autowired
    private SpecificationsService specificationsService;
    @Autowired
    private ProductService productService;
    @Override
    public List<Integer> deleteStandardsInformation(Integer materialId) {
        LambdaQueryWrapper<Standard> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Standard::getMaterialId, materialId);
        wrapper.select(Standard::getId);
        List<Integer> list = new ArrayList<>();
        List<Standard> standards = standardMapper.selectList(wrapper);
        for (Standard standard : standards){
            LambdaUpdateWrapper<Standard> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper.eq(Standard::getMaterialId, materialId);
            updateWrapper.set(Standard::getState, 0);
            standardMapper.update(new Standard(), updateWrapper);
            list.add(standard.getId());
        }
        return list;
    }
    @Override
    public Integer deleteStandardInformation(Integer standardsId) {
        LambdaUpdateWrapper<Standard> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(Standard::getId, standardsId);
        updateWrapper.set(Standard::getState, 0);
        List<Integer> list = new ArrayList<>();
        int isDeleteSuccess = standardMapper.update(new Standard(), updateWrapper);
        if (isDeleteSuccess == 1){
            list.add(standardsId);
            List<Integer> idDeleteSpecifications = specificationsService.StandardIdDeleteSpecifications(list);
            if (!ObjectUtils.isEmpty(idDeleteSpecifications)){
                productService.deleteProductInformation(idDeleteSpecifications);
            }
            return 1;
        }
        return 0;
    }
    @Override
    public Integer addStandardInformation(AddStandardDto addStandardDto) {
        Standard standard = new Standard()
                .setMaterialId(addStandardDto.getMaterialId())
                .setName(addStandardDto.getStandardName());
        int save = standardMapper.insert(standard);
        if (save == 1){
            Specifications specifications = new Specifications()
                    .setName(addStandardDto.getSpecificationsName())
                    .setStandardId(standard.getId());
            boolean save1 = specificationsService.save(specifications);
            if (save1)
                return 1;
        }
        return 0;
    }
    @Override
    public List<Map<String, Object>> getSpecificationIdAndName(String materialId) {
        return standardMapper.getSpecificationIdAndName(materialId);
    }
}
standard-server/src/main/resources/mapper/MaterialMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
<?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.yuanchu.limslaboratory.mapper.MaterialMapper">
    <select id="selectMaterialLimit" resultType="Map">
        select id,code, name
        from lims_laboratory.material
        where state = 1
        and type = #{type}
        order by create_time desc
            limit #{num1},#{num2}
    </select>
    <select id="selectMaterialById" resultType="Map">
        select m.id,
               m.num,
               m.supplier,
               m.name,
               m.location,
               m.batch,
               m.reel_number                reelNumber,
               concat(s.name, '/', sn.name) specificationSerialNum,
               s.voltage_level              voltageLevel,
               s.cross_section              crossSection,
               s.number_of_cores            numberOfCores,
               s.instruct
        from lims_laboratory.material m,
             lims_laboratory.specifications s,
             lims_laboratory.serial_number sn
        where m.specifications_id = s.id
          and s.serial_id = sn.id
          and m.id=#{materialId}
    </select>
    <resultMap id="OneLevelTreeMap" type="Map">
        <id property="id" column="materialId"/>
        <result property="name" column="materialName"/>
        <collection property="children" resultMap="TwoLevelTreeMap" javaType="List"/>
    </resultMap>
    <resultMap id="TwoLevelTreeMap" type="Map">
        <id property="id" column="standardId"/>
        <result property="name" column="standardName"/>
        <collection property="children" resultMap="ThreeLevelTreeMap" javaType="List"/>
    </resultMap>
    <resultMap id="ThreeLevelTreeMap" type="Map">
        <id property="id" column="specificationsId"/>
        <result property="name" column="specificationsName"/>
        <collection property="children" resultMap="FourLevelTreeMap" javaType="List"/>
    </resultMap>
    <resultMap id="FourLevelTreeMap" type="Map">
        <id property="id" column="productId"/>
        <result property="name" column="productName"/>
    </resultMap>
    <select id="FourTree" resultMap="OneLevelTreeMap">
        SELECT m.`id` materialId, m.`name` materialName, s.`id` standardId, s.`name` standardName,
               f.`id` specificationsId, f.`name` specificationsName, p.`id` productId, p.`name` productName
        FROM material m
                 LEFT JOIN (SELECT s.`id`, s.`name`, s.`material_id` FROM standard s WHERE s.`state` = 1) s ON m.id = s.`material_id`
                 LEFT JOIN (SELECT f.`id`, f.`name`, f.`standard_id` FROM specifications f WHERE f.`state` = 1
                                                                                             <if test="specificationsName != null and specificationsName != ''">
                                                                                                 AND f.`name` = #{specificationsName}
                                                                                             </if>
                                                                                           ) f ON s.`id` = f.`standard_id`
                 LEFT JOIN (SELECT p.`id`, p.`name`, p.`specifications_id` FROM product p WHERE p.`state` = 1) p ON f.`id` = p.`specifications_id`
        WHERE m.`state` = 1
    </select>
</mapper>
standard-server/src/main/resources/mapper/ProductMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
<?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.yuanchu.limslaboratory.mapper.ProductMapper">
    <select id="pageProductInformation" resultType="map">
        SELECT COUNT(1) num, p.`father`
        FROM product p
        WHERE p.`specifications_id` = #{specificationsId}
        <if test="productCodeOrName != null and productCodeOrName != ''">
            AND p.`father` = #{productCodeOrName}
        </if>
        GROUP BY p.`father`
    </select>
    <select id="selectOneChildren" resultType="map">
        SELECT p.`id`, p.`name`, p.`unit`, p.`required`, p.`internal`
        FROM product p
        WHERE p.`father` = #{father}
    </select>
    <select id="selectProductByMaterialId" resultType="Map">
        select p.name,unit,required,internal
        from lims_laboratory.product p,
             lims_laboratory.specifications sp,
             lims_laboratory.standard st
        where specifications_id=sp.id
          and standard=st.id
        and material_id=#{materialId}
    </select>
</mapper>
standard-server/src/main/resources/mapper/SpecificationsMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
<?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.yuanchu.limslaboratory.mapper.SpecificationsMapper">
</mapper>
standard-server/src/main/resources/mapper/StandardMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
<?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.yuanchu.limslaboratory.mapper.StandardMapper">
    <resultMap id="BaseResultMap" type="java.util.Map">
        <id property="specificationsId" column="specificationsId" jdbcType="INTEGER"/>
        <result property="specificationsName" column="specificationsName" jdbcType="VARCHAR"/>
        <collection property="children" resultMap="BaseResultMapChildren" javaType="java.util.List"/>
    </resultMap>
    <resultMap id="BaseResultMapChildren" type="java.util.Map">
        <id property="modelId" column="modelId" jdbcType="INTEGER"/>
        <result property="modelName" column="modelName" jdbcType="VARCHAR"/>
    </resultMap>
    <select id="getSpecificationIdAndName" resultMap="BaseResultMap">
        SELECT s.`id` specificationsId, s.`name` specificationsName, f.id modelId, f.name modelName
        FROM standard s
                 LEFT JOIN (SELECT f.`id`, f.`name`, f.`standard_id` FROM specifications f WHERE f.`state` = 1) f
                           ON s.`id` = f.`standard_id`
        WHERE s.`material_id` = #{materialId}
          AND s.`state` = 1
    </select>
</mapper>
sys/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>lims-laboratory</artifactId>
        <groupId>com.yuanchu</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.yunchu.limslaboratory</groupId>
    <artifactId>sys</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sys</name>
    <description>sys</description>
    <packaging>jar</packaging>
    <dependencies>
        <!--基础框架类-->
        <dependency>
            <groupId>com.yunchu.limslaboratory</groupId>
            <artifactId>framework</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <!--用户服务模块-->
        <dependency>
            <groupId>com.yunchu.limslaboratory</groupId>
            <artifactId>user-server</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <!--标准库模块-->
        <dependency>
            <groupId>com.yunchu.limslaboratory</groupId>
            <artifactId>standard-server</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <!--检验模块-->
        <dependency>
            <groupId>com.yunchu.limslaboratory</groupId>
            <artifactId>inspection-server</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <!--实验室模块-->
        <dependency>
            <groupId>com.yunchu.limslaboratory</groupId>
            <artifactId>laboratory-server</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <!--druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <!--mybatis-plus代码生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
        </dependency>
        <!-- framework: mybatis-plus代码生成需要一个模板引擎 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
</project>
sys/src/main/java/com/yuanchu/limslaboratory/CodeGenerator.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
package com.yuanchu.limslaboratory;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.Collections;
import java.util.Scanner;
// æ¼”示例子,执行 main æ–¹æ³•控制台输入模块表名回车自动生成对应项目目录中
public class CodeGenerator {
    public static String database_url = "jdbc:mysql://localhost:3306/mom_ocean?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
    public static String database_username = "root";
    public static String database_password= "123456";
    public static String author = "江苏鵷雏网络科技有限公司";
    public static String model_name = "/inspect-server"; // å¦‚果为分布式填子模块名称,如果不是分布式为空即可
    public static String setParent = "com.yuanchu.mom"; // åŒ…路径
    public static void main(String[] args) {
        String projectPath = System.getProperty("user.dir");
        System.out.println(projectPath+"===================");
        FastAutoGenerator.create(database_url, database_username, database_password)
                // å…¨å±€é…ç½®
                .globalConfig(builder -> {
                    builder.author(author) // è®¾ç½®ä½œè€…
                            .commentDate("yyyy-MM-dd hh:mm:ss")   //注释日期
                            .outputDir(projectPath + model_name + "/src/main/java") // æŒ‡å®šè¾“出目录
                            .disableOpenDir() //禁止打开输出目录,默认打开
                    ;
                })
                // åŒ…配置
                .packageConfig(builder -> {
                    builder.entity("pojo");
                    builder.parent(setParent) // è®¾ç½®çˆ¶åŒ…名
                            .pathInfo(Collections.singletonMap(OutputFile.xml, projectPath + model_name +  "/src/main/resources/mapper")); // è®¾ç½®mapperXml生成路径
                })
                // ç­–略配置
                .strategyConfig(builder -> {
                    builder.addInclude(scanner("表名,多个空格分割").split(" ")) // è®¾ç½®éœ€è¦ç”Ÿæˆçš„表名
                            .addTablePrefix("sys_") // è®¾ç½®è¿‡æ»¤è¡¨å‰ç¼€
                            // Entity ç­–略配置
                            .entityBuilder()
                            .enableLombok() //开启 Lombok
                            .naming(NamingStrategy.underline_to_camel)  //数据库表映射到实体的命名策略:下划线转驼峰命
                            .columnNaming(NamingStrategy.underline_to_camel)    //数据库表字段映射到实体的命名策略:下划线转驼峰命
                            // Mapper ç­–略配置
                            .mapperBuilder()
                            .enableFileOverride() // è¦†ç›–已生成文件
                            // Service ç­–略配置
                            .serviceBuilder()
                            .enableFileOverride() // è¦†ç›–已生成文件
                            .formatServiceFileName("%sService") //格式化 service æŽ¥å£æ–‡ä»¶åç§°ï¼Œ%s进行匹配表名,如 UserService
                            .formatServiceImplFileName("%sServiceImpl") //格式化 service å®žçŽ°ç±»æ–‡ä»¶åç§°ï¼Œ%s进行匹配表名,如 UserServiceImpl
                            // Controller ç­–略配置
                            .controllerBuilder()
                            .enableFileOverride() // è¦†ç›–已生成文件
                    ;
                })
                .execute();
    }
    /**
     * <p>
     * è¯»å–控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }
}
sys/src/main/java/com/yuanchu/limslaboratory/SysApplication.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.yuanchu.limslaboratory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@MapperScan("com.yuanchu.limslaboratory.mapper")// æ‰«æMybatis中的mapper包
@EnableFeignClients("com.yuanchu.limslaboratory.clients") // æ‰«æfeign接口所在包 é‡è¦
public class SysApplication {
    public static void main(String[] args) {
        SpringApplication.run(SysApplication.class, args);
    }
}
sys/src/main/java/com/yuanchu/limslaboratory/backup/MysqlDataBackup.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,190 @@
package com.yuanchu.limslaboratory.backup;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
@EnableScheduling
@Slf4j
public class MysqlDataBackup {
    /**
     * æ•°æ®åº“版本是否为 8.0 + ï¼ˆfalse=否  true=是), mysql8+ éœ€è¦å‚æ•°  --column-statistics=0  ï¼Œ mysql8- ä¸éœ€è¦
     */
    Boolean isDbVersion8 = false;
    /**
     * å¤‡ä»½å‘½ä»¤
     * USERNAME   è´¦å·
     * PASSWORD   å¯†ç 
     * SERVERPATH æœåС噍IP/域名
     * DBNAME     æ•°æ®åº“名称
     * FILEPATH   å¤‡ä»½æ–‡ä»¶å­˜æ”¾åœ°å€+名称
     * è¯´æ˜Ž
     * cmdCompression ï¼š éœ€åŽ‹ç¼© ï¼ˆæœ¬åœ°æˆ–服务器需安装 mysqldump å‘½ä»¤(安装mysql自带患独立安装) +  gzip å‘½ä»¤(独立安装))
     * cmd ï¼š            ä¸åŽ‹ç¼© (本地或服务器需安装 mysqldump å‘½ä»¤(安装mysql自带患独立安装)
     * --column-statistics=0     mysql8 æ·»åŠ è¯¥å‚æ•°, éžmysql8 ä¸æ·»åŠ , å¦åˆ™å°†å‡ºé”™
     */
    String cmdMysql8 = "mysqldump --column-statistics=0  -u{USERNAME} -p{PASSWORD} -h{SERVERPATH} -P3306 --databases {DBNAME}"; //  > {FILEPATH}.sql
    String cmd = "mysqldump -u{USERNAME} -p{PASSWORD} -h{SERVERPATH} -P3306 --databases {DBNAME}";      //  > {FILEPATH}.sql
    /**
     * å¤‡ä»½ sql å­˜æ”¾ç›®å½•(相对路径, æ³¨æ„å¯èƒ½éœ€è¦åœ¨ MvcConfig é…ç½®è®¿é—®æƒé™)
     */
    @Value("${backup.path}")
    private String filePath;
    @Value("${spring.datasource.url}")
    private String dbUrl;
    @Value("${spring.datasource.username}")
    private String dbUserName;
    @Value("${spring.datasource.password}")
    private String dbPassWord;
    @Value("${backup.destiny}")
    private Integer destiny;
    @Value("${backup.mysqldump}")
    private String mysqldump;
    /**
     * æ¯å¤©æ™šä¸Š23点05秒执行 ã€  0 0 4 1/1 * ? ã€‘
     * æµ‹è¯• 20 ç§’一次【  0/20 * * * * ? ã€‘@Scheduled(cron = "5 * 23 * * ?")
     */
    @Scheduled(cron = "5 0 23 * * ?")
    private void configureTasks() {
        log.info("【备份数据库】--START");
        String dbUrl2 = dbUrl.replace("jdbc:mysql://", "");
        // èŽ·å–æ•°æ®åº“åç§°
        String dbName = dbUrl2.substring(dbUrl2.lastIndexOf("/") + 1, dbUrl2.indexOf("?"));
        // èŽ·å–æ•°æ®åº“åœ°å€
        String serverPath = dbUrl2.substring(0, dbUrl2.lastIndexOf(":"));
        // æ•°æ®åº“账号
        String username = dbUserName;
        // æ•°æ®åº“密码
        String password = dbPassWord;
        // å¤‡ä»½æ–‡ä»¶ç›®å½•+名称  å¤‡ä»½æ–‡ä»¶å­˜æ”¾ç›®å½•+名称(名称 = æ•°æ®åº“名+时间字符串.sql)
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        String format = simpleDateFormat.format(new Date());
        String timeStr = format
                .replaceAll("-", "_")
                .replaceAll(" ", "_")
                .replaceAll(":", "");
        timeStr = timeStr.substring(0, 15);
        String pathFileName = filePath + "/" + dbName + "_" + timeStr + ".sql";
        String newCmd = "";
        if (isDbVersion8) {
            newCmd = cmdMysql8;
        } else {
            newCmd = cmd;
        }
        // æ‰§è¡Œå‘½ä»¤
        newCmd = newCmd.replace("{USERNAME}", username)
                .replace("{PASSWORD}", password)
                .replace("{SERVERPATH}", serverPath)
                .replace("{DBNAME}", dbName)
                .replace("{FILEPATH}", pathFileName);
        PrintWriter printWriter = null;
        BufferedReader bufferedReader = null;
        try {
            // åˆ›å»ºå­˜æ”¾sql的文件
            existsFile(new File(pathFileName));
            printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(pathFileName), "utf8"));
            Process process = null;
            String property = System.getProperty("os.name");
            System.out.println(property);
            if (property.indexOf("Linux") != -1) {
                // linux
                process = Runtime.getRuntime().exec(new String[]{"bash", "-c", newCmd});
            } else {
                // æœ¬åœ°win
                String mysqldumpPath = "cmd /c " + mysqldump + "/" + newCmd;
                System.out.println(mysqldumpPath);
                process = Runtime.getRuntime().exec(mysqldumpPath);
            }
            InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), "utf8");
            bufferedReader = new BufferedReader(inputStreamReader);
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                printWriter.println(line);
            }
            // æ­¤æ¬¡ä¼šæ‰§è¡Œè¿‡é•¿æ—¶é—´,直到备份完成
            printWriter.flush();
            printWriter.close();
            //0 è¡¨ç¤ºçº¿ç¨‹æ­£å¸¸ç»ˆæ­¢ã€‚
            if (process.waitFor() == 0) {
                // çº¿ç¨‹æ­£å¸¸æ‰§è¡Œ
                log.info("【备份数据库】SUCCESS,SQL文件:{}", pathFileName);
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.info("【备份数据库】FAILURE");
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (printWriter != null) {
                    printWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        log.info("【备份数据库】--END");
    }
    /**
     * æ¯å¤©æ™šä¸Š23点0分10秒执行 ã€  0 0 4 1/1 * ? ã€‘
     * æµ‹è¯• 20 ç§’一次【  0/20 * * * * ? ã€‘
     */
    @Scheduled(cron = "6 0 23 * * ?")
    private void TimerDeleteFile(){
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("d");
        Integer currentDay = Integer.valueOf(sdf.format(date));
        File file = new File(filePath);
        File[] files = file.listFiles();
        if (files != null) {
            for(File f : files){
                if(f.isFile()){//若是文件,直接打印
                    String[] splitFile = f.getName().split("_");
                    Integer fileDay = Integer.valueOf(splitFile[splitFile.length - 2]);
                    Integer i = currentDay - fileDay;
                    if (i.equals(destiny)){
                        f.delete();
                        log.info("备份sql文件过多进行删除!");
                    }
                }
            }
        }
    }
    /**
     * åˆ¤æ–­æ–‡ä»¶æ˜¯å¦å­˜åœ¨ï¼Œä¸å­˜åœ¨åˆ›å»º
     */
    private static void existsFile(File file) {
        // åˆ¤æ–­æ–‡ä»¶è·¯å¾„是否存在,不存在新建
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
sys/src/main/resources/application-dev.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
swagger:
  enabled: true
# æ—¥å¿—配置
logging:
  config: classpath:logback-spring.xml
  # æ—¥å¿—存储路径+++++++++++++++++++++++++++运维需要配置+++++++++++++++++++++++++++
  file-location: log
# æ•°æ®åº“备份路径
backup:
  # æ•°æ®åº“备份路径+++++++++++++++++++++++++++运维需要配置+++++++++++++++++++++++++++
  path: E:/webapp/backup
  # æ•°æ®åº“备份天数
  destiny: 7
  # æ•°æ®åº“备份工具路径+++++++++++++++++++++++++++运维需要配置+++++++++++++++++++++++++++
  mysqldump: E:\JavaCode\WMS\WMS_Admin\src\main\resources
# ç…§ç‰‡å­˜å‚¨è·¯å¾„+++++++++++++++++++++++++++运维需要配置+++++++++++++++++++++++++++
file:
  path: E:/webapp/images
  # ä¸Šä¼ æ–‡ä»¶å…è®¸çš„æ‰©å±•名
  allowed: png,jpg,jpeg,gif
# éµ·é›ç®¡ç†ç³»ç»Ÿå¯†é’¥
login:
  userID: c8b1aaacec366c24e5d18c7eea9e551b
  secret: 701C85FCE0F7CFD714C2052D77098DC7f407b0ee79210bcef51787a0eb8ec7a5
# éµ·é›ç½‘络IP或者域名
customer:
  url: http://114.132.189.42:8011
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # å¼€å¯mybatis-plus日志
# æ•°æ®æºé…ç½®
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/lims_laboratory?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
    username: root
    password: 123456
    druid:
      #   Druid数据源配置
      initialSize: 5 # åˆå§‹è¿žæŽ¥æ•°
      minIdle: 10 # æœ€å°è¿žæŽ¥æ± æ•°é‡
      maxActive: 20 # æœ€å¤§è¿žæŽ¥æ± æ•°é‡
      maxWait: 60000 # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
      timeBetweenEvictionRunsMillis: 60000 # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      minEvictableIdleTimeMillis: 300000 # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      maxEvictableIdleTimeMillis: 900000 # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      validationQuery: SELECT 1 FROM DUAL # é…ç½®æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆ
      testWhileIdle: true #申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      testOnBorrow: false #配置从连接池获取连接时,是否检查连接有效性,true每次都检查;false不检查。做了这个配置会降低性能。
      testOnReturn: false #配置向连接池归还连接时,是否检查连接有效性,true每次都检查;false不检查。做了这个配置会降低性能。
      poolPreparedStatements: true #打开PsCache,并且指定每个连接上PSCache的大小
      maxPoolPreparedStatementPerConnectionSize: 20
      filters: stat,wall,log4j # é…ç½®ç›‘控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      useGlobalDataSourceStat: true #合并多个DruidDatasource的监控数据
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500; #通过connectProperties属性来打开mergesql功能罗慢sQL记录
  redis:
    # redis数据库索引(默认为0),我们使用索引为3的数据库,避免和其他数据库冲突
    database: 0
    # redis服务器地址(默认为localhost)
    host: localhost
    # redis端口(默认为6379)
    port: 6380
    # redis访问密码(默认为空)
    password: null
    # redis连接超时时间(单位毫秒)
    timeout: 5
    # redis连接池配置
    pool:
      # æœ€å¤§å¯ç”¨è¿žæŽ¥æ•°ï¼ˆé»˜è®¤ä¸º8,负数表示无限)
      max-active: 8
      # æœ€å¤§ç©ºé—²è¿žæŽ¥æ•°ï¼ˆé»˜è®¤ä¸º8,负数表示无限)
      max-idle: 8
      # æœ€å°ç©ºé—²è¿žæŽ¥æ•°ï¼ˆé»˜è®¤ä¸º0,该值只有为正数才有用)
      min-idle: 0
      # ä»Žè¿žæŽ¥æ± ä¸­èŽ·å–è¿žæŽ¥æœ€å¤§ç­‰å¾…æ—¶é—´ï¼ˆé»˜è®¤ä¸º-1,单位为毫秒,负数表示无限)
      max-wait: -1
sys/src/main/resources/application-prod.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
swagger:
  enabled: false
# æ—¥å¿—配置
logging:
  config: classpath:logback-spring.xml
  # æ—¥å¿—存储路径+++++++++++++++++++++++++++运维需要配置+++++++++++++++++++++++++++
  file-location: /javaWork/LIMS/log
# æ•°æ®åº“备份路径
backup:
  # æ•°æ®åº“备份路径+++++++++++++++++++++++++++运维需要配置+++++++++++++++++++++++++++
  path: /javaWork/LIMS/backup
  # æ•°æ®åº“备份天数+++++++++++++++++++++++++++运维需要配置+++++++++++++++++++++++++++
  destiny: 7
  # æ•°æ®åº“备份工具路径+++++++++++++++++++++++++++运维需要配置+++++++++++++++++++++++++++
  mysqldump: /javaWork/LIMS/conf
# ç…§ç‰‡è·¯å¾„+++++++++++++++++++++++++++运维需要配置+++++++++++++++++++++++++++
file:
  path: /javaWork/LIMS/images
  # ä¸Šä¼ æ–‡ä»¶å…è®¸çš„æ‰©å±•名
  allowed: png,jpg,jpeg,gif
# éµ·é›ç½‘络IP或者域名+++++++++++++++++++++++++++运维需要配置+++++++++++++++++++++++++++
customer:
  url: http://114.132.189.42:8011
login:
  userID: c8b1aaacec366c24e5d18c7eea9e551b
  secret: 701C85FCE0F7CFD714C2052D77098DC7f407b0ee79210bcef51787a0eb8ec7a5
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl # å…³é—­mybatis-plus日志
# æ•°æ®æºé…ç½®
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/study?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
    username: root
    password: 123456
    druid:
      #   Druid数据源配置
      initialSize: 5 # åˆå§‹è¿žæŽ¥æ•°
      minIdle: 10 # æœ€å°è¿žæŽ¥æ± æ•°é‡
      maxActive: 20 # æœ€å¤§è¿žæŽ¥æ± æ•°é‡
      maxWait: 60000 # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
      timeBetweenEvictionRunsMillis: 60000 # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      minEvictableIdleTimeMillis: 300000 # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      maxEvictableIdleTimeMillis: 900000 # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      validationQuery: SELECT 1 FROM DUAL # é…ç½®æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆ
      testWhileIdle: true #申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      testOnBorrow: false #配置从连接池获取连接时,是否检查连接有效性,true每次都检查;false不检查。做了这个配置会降低性能。
      testOnReturn: false #配置向连接池归还连接时,是否检查连接有效性,true每次都检查;false不检查。做了这个配置会降低性能。
      poolPreparedStatements: true #打开PsCache,并且指定每个连接上PSCache的大小
      maxPoolPreparedStatementPerConnectionSize: 20
      filters: stat,wall,log4j # é…ç½®ç›‘控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      useGlobalDataSourceStat: true #合并多个DruidDatasource的监控数据
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500; #通过connectProperties属性来打开mergesql功能罗慢sQL记录
redis:
  # redis数据库索引(默认为0),我们使用索引为3的数据库,避免和其他数据库冲突
  database: 0
  # redis服务器地址(默认为loaclhost)
  host: 127.0.0.1
  # redis端口(默认为6379)
  port: 6379
  # redis访问密码(默认为空)
  #  password:
  # redis连接超时时间(单位毫秒)
  timeout: 0
  # redis连接池配置
  pool:
    # æœ€å¤§å¯ç”¨è¿žæŽ¥æ•°ï¼ˆé»˜è®¤ä¸º8,负数表示无限)
    max-active: 8
    # æœ€å¤§ç©ºé—²è¿žæŽ¥æ•°ï¼ˆé»˜è®¤ä¸º8,负数表示无限)
    max-idle: 8
    # æœ€å°ç©ºé—²è¿žæŽ¥æ•°ï¼ˆé»˜è®¤ä¸º0,该值只有为正数才有用)
    min-idle: 0
    # ä»Žè¿žæŽ¥æ± ä¸­èŽ·å–è¿žæŽ¥æœ€å¤§ç­‰å¾…æ—¶é—´ï¼ˆé»˜è®¤ä¸º-1,单位为毫秒,负数表示无限)
    max-wait: -1
sys/src/main/resources/application.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
server:
  port: 1234
spring:
  servlet:
    multipart:
      max-file-size: 20MB # å•个文件大小
      max-request-size: 1024MB # ä¸€æ¬¡è¯·æ±‚文件总大小
  profiles:
    active: dev
mybatis-plus:
  type-aliases-package: com.yuanchu.limslaboratory.pojo
  mapper-locations: classpath*:/mapper/*.xml
  global-config:
    banner: off # å…³é—­mybatis-plus启动图标
feign:
  client:
    config:
      default:
        connectTimeout: 2000
        readTimeout: 3000
        loggerLevel: FULL
  httpclient:
    enabled: false # å…³é—­ httpclient
  okhttp:
    enabled: true # å¼€å¯ okhttp
sys/src/main/resources/logback-spring.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,236 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- æ—¥å¿—级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,比如: å¦‚果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration  scan="true" scanPeriod="10 seconds">
    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
    <springProperty scope="context" name="logs" source="logging.file-location" default="/var/log/myapp"/>
    <property name="log.path" value="${logs}"/>
    <!--0. æ—¥å¿—格式和颜色渲染 -->
    <!-- å½©è‰²æ—¥å¿—依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <!-- å½©è‰²æ—¥å¿—格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!--1. è¾“出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- è®¾ç½®å­—符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!--2. è¾“出到文档-->
    <!-- 2.1 level为 DEBUG æ—¥å¿—,时间滚动输出  -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- æ­£åœ¨è®°å½•的日志文档的路径及文档名 -->
        <file>${log.path}/debug.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- è®¾ç½®å­—符集 -->
        </encoder>
        <!-- æ—¥å¿—记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- æ—¥å¿—å½’æ¡£ -->
            <fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <!-- æ­¤æ—¥å¿—文档只记录debug级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 2.2 level为 INFO æ—¥å¿—,时间滚动输出  -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- æ­£åœ¨è®°å½•的日志文档的路径及文档名 -->
        <file>${log.path}/info.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- æ—¥å¿—记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- æ¯å¤©æ—¥å¿—归档路径以及格式 -->
            <fileNamePattern>${log.path}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <!-- æ­¤æ—¥å¿—文档只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 2.3 level为 WARN æ—¥å¿—,时间滚动输出  -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- æ­£åœ¨è®°å½•的日志文档的路径及文档名 -->
        <file>${log.path}/warn.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- æ­¤å¤„设置字符集 -->
        </encoder>
        <!-- æ—¥å¿—记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <!-- æ­¤æ—¥å¿—文档只记录warn级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 2.4 level为 ERROR æ—¥å¿—,时间滚动输出  -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- æ­£åœ¨è®°å½•的日志文档的路径及文档名 -->
        <file>${log.path}/error.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- æ­¤å¤„设置字符集 -->
        </encoder>
        <!-- æ—¥å¿—记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <!-- æ­¤æ—¥å¿—文档只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 2.5 æ‰€æœ‰ é™¤äº†DEBUG级别的其它高于DEBUG的 æ—¥å¿—,记录到一个文件  -->
    <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- æ­£åœ¨è®°å½•的日志文档的路径及文档名 -->
        <file>${log.path}/all.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- æ­¤å¤„设置字符集 -->
        </encoder>
        <!-- æ—¥å¿—记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/all-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <!-- æ­¤æ—¥å¿—文档记录除了DEBUG级别的其它高于DEBUG的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
    </appender>
    <!--
        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
        ä»¥åŠæŒ‡å®š<appender>。<logger>仅有一个name属性,
        ä¸€ä¸ªå¯é€‰çš„level和一个可选的addtivity属性。
        name:用来指定受此logger约束的某一个包或者具体的某一个类。
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL å’Œ OFF,
              è¿˜æœ‰ä¸€ä¸ªç‰¹æ®Šå€¼INHERITED或者同义词NULL,代表强制执行上级的级别。
              å¦‚果未设置此属性,那么当前logger将会继承上级的级别。
        addtivity:是否向上级logger传递打印信息。默认是true。
        <logger name="org.springframework.web" level="info"/>
        <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
    -->
    <!--
        ä½¿ç”¨mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
        ç¬¬ä¸€ç§æŠŠ<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
        ç¬¬äºŒç§å°±æ˜¯å•独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
        ã€logging.level.org.mybatis=debug logging.level.dao=debug】
     -->
    <!--
        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL å’Œ OFF,
        ä¸èƒ½è®¾ç½®ä¸ºINHERITED或者同义词NULL。默认是DEBUG
        å¯ä»¥åŒ…含零个或多个元素,标识这个appender将会添加到这个logger。
    -->
    <!-- 4  æœ€ç»ˆçš„策略:
                 åŸºæœ¬ç­–ç•¥(root级) + æ ¹æ®profile在启动时, logger标签中定制化package日志级别(优先级高于上面的root级)-->
    <springProfile name="dev">
        <root level="info">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="ALL_FILE" />
        </root>
        <logger name="com.yuanchu.limslaboratory.SysApplication" level="debug"/> <!-- å¼€å‘环境, æŒ‡å®šæŸåŒ…日志为debug级 -->
    </springProfile>
    <springProfile name="test">
        <root level="info">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="ALL_FILE" />
        </root>
        <logger name="com.yuanchu.limslaboratory.SysApplication" level="info"/> <!-- æµ‹è¯•环境, æŒ‡å®šæŸåŒ…日志为info级 -->
    </springProfile>
    <springProfile name="prod">
        <root level="info">
            <!-- ç”Ÿäº§çŽ¯å¢ƒæœ€å¥½ä¸é…ç½®console写文件 -->
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="ALL_FILE" />
        </root>
        <logger name="com.yuanchu.limslaboratory" level="warn"/> <!-- ç”Ÿäº§çŽ¯å¢ƒ, æŒ‡å®šæŸåŒ…日志为warn级 -->
        <logger name="com.yuanchu.limslaboratory.SysApplication" level="info"/> <!-- ç‰¹å®šæŸä¸ªç±»æ‰“印info日志, æ¯”如application启动成功后的提示语 -->
    </springProfile>
</configuration>
sys/src/main/resources/mysqldump.exe
Binary files differ
sys/src/test/java/com/yuanchu/limslaboratory/SysApplicationTests.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.yuanchu.limslaboratory;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SysApplicationTests {
    @Test
    void contextLoads() {
        String newString = String.format("%06d", 77);
        System.out.println("newString === " + newString);
    }
}
user-server/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>lims-laboratory</artifactId>
        <groupId>com.yuanchu</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.yunchu.limslaboratory</groupId>
    <artifactId>user-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>user-server</name>
    <description>user-server</description>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>com.yunchu.limslaboratory</groupId>
            <artifactId>framework</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <!--feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--okhttp-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-okhttp</artifactId>
        </dependency>
        <!--安全框架shiro-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-starter</artifactId>
        </dependency>
        <!--jwt-->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
        </dependency>
    </dependencies>
</project>
user-server/src/main/java/com/yuanchu/limslaboratory/clients/UserClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.yuanchu.limslaboratory.clients;
import com.yuanchu.limslaboratory.vo.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
@FeignClient(value = "userservice", url = "${customer.url}")
public interface UserClient {
    @PostMapping("/business/login")
    Result<?> BusynessUserLogin(@RequestBody Map<String, Object> mapData);
    @PostMapping("/business/code")
    Result<?> BusynessUserLoginToken(@RequestParam("code") String code);
}
user-server/src/main/java/com/yuanchu/limslaboratory/clients/UserLoginUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.yuanchu.limslaboratory.clients;
import com.yuanchu.limslaboratory.pojo.User;
import com.yuanchu.limslaboratory.shiro.utils.JwtUtils;
import com.yuanchu.limslaboratory.utils.MyUtil;
import com.yuanchu.limslaboratory.utils.RedisUtil;
import com.yuanchu.limslaboratory.vo.Result;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@Component
public class UserLoginUtils {
    @Resource
    private UserClient userClient;
    @Value("${login.userID}")
    private String LoginUserID;
    @Value("${login.secret}")
    private String LoginSecret;
    public Result<Map<String, Object>> LoginExamine(User user){
        Map<String, Object> mapData = new HashMap<>();
        mapData.put("LoginUserID", LoginUserID);
        mapData.put("LoginSecret", LoginSecret);
        Result<?> code = userClient.BusynessUserLogin(mapData);
        if (code.getCode() == 200){
            Result<?> result = userClient.BusynessUserLoginToken(code.getData().toString());
            if (result.getCode() == 200){
                Map data = (Map) result.getData();
                String token = data.get("token").toString();
                data.remove("token");
                HashMap<String, Object> mapRedis = new HashMap<>();
                mapRedis.put("id", user.getId());
                mapRedis.put("account", user.getAccount());
                mapRedis.put("name", user.getName());
                mapRedis.put("enterpriseId", user.getEnterpriseId());
                mapRedis.put("data", data);
                //存入redis,二个小时后删除
                RedisUtil.set(token, mapRedis, 120);
                // å°†ç­¾å‘çš„ JWT token è¿”回给前端
                HashMap<String, Object> map = new HashMap<>();
                String refresh = JwtUtils.sign(user.getAccount());
                map.put("token", token);
                map.put("refresh", refresh);
                RedisUtil.set(user.getAccount(), map, 168);
                return Result.success(map);
            } else {
                return Result.fail(result.getMessage());
            }
        } else {
            return Result.fail(code.getMessage());
        }
    }
//    public Result<Map<String, Object>> LoginExamine(User user){
//        String token = JwtUtils.sign(user.getAccount());
//        //存入redis,二个小时后删除
//        RedisUtil.set(token, user, 2);
//        // å°†ç­¾å‘çš„ JWT token è¿”回给前端
//        HashMap<String, Object> map = new HashMap<>();
//        String refresh = JwtUtils.sign(user.getAccount());
//        map.put("token", token);
//        map.put("refresh", refresh);
//        RedisUtil.set(user.getAccount(), map, 120);
//        return Result.success(map);
//    }
}
user-server/src/main/java/com/yuanchu/limslaboratory/config/FeignConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.yuanchu.limslaboratory.config;
import feign.Feign;
import okhttp3.OkHttpClient;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.cloud.commons.httpclient.OkHttpClientFactory;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.openfeign.FeignAutoConfiguration;
import org.springframework.cloud.openfeign.support.FeignHttpClientProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
@Configuration
@ConditionalOnClass(Feign.class)
@AutoConfigureBefore(FeignAutoConfiguration.class)
public class FeignConfig {
    private OkHttpClient okHttpClient;
    //注入okhttp
    @Bean
    public OkHttpClient okHttpClient(OkHttpClientFactory okHttpClientFactory,
                                             FeignHttpClientProperties httpClientProperties) {
        this.okHttpClient = okHttpClientFactory.createBuilder(httpClientProperties.isDisableSslValidation()).connectTimeout(httpClientProperties.getConnectionTimeout(),TimeUnit.SECONDS)
                .followRedirects(httpClientProperties.isFollowRedirects())
                .build();
        return this.okHttpClient;
    }
}
user-server/src/main/java/com/yuanchu/limslaboratory/controller/EnterpriseController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.yuanchu.limslaboratory.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
@RestController
@RequestMapping("/enterprise")
public class EnterpriseController {
}
user-server/src/main/java/com/yuanchu/limslaboratory/controller/RoleController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.yuanchu.limslaboratory.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
@RestController
@RequestMapping("/role")
public class RoleController {
}
user-server/src/main/java/com/yuanchu/limslaboratory/controller/UserController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,147 @@
package com.yuanchu.limslaboratory.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.clients.UserLoginUtils;
import com.yuanchu.limslaboratory.pojo.Enterprise;
import com.yuanchu.limslaboratory.pojo.User;
import com.yuanchu.limslaboratory.service.UserService;
import com.yuanchu.limslaboratory.shiro.realm.ShiroRealm;
import com.yuanchu.limslaboratory.utils.JackSonUtil;
import com.yuanchu.limslaboratory.utils.MyUtil;
import com.yuanchu.limslaboratory.utils.RedisUtil;
import com.yuanchu.limslaboratory.utils.SpringUtil;
import com.yuanchu.limslaboratory.vo.NewPersonnelVo;
import com.yuanchu.limslaboratory.vo.PagePersonnelVo;
import com.yuanchu.limslaboratory.vo.Result;
import com.yuanchu.limslaboratory.vo.UpdatePersonnelVo;
import io.swagger.annotations.*;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 * å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
@RestController
@RequestMapping("/user")
@Api(tags = "用户模块")
public class UserController {
    @Autowired
    private UserService userService;
    @ApiOperation("用户登录")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "account", value = "账号", dataTypeClass = String.class, required = true),
            @ApiImplicitParam(name = "password", value = "密码", dataTypeClass = String.class, required = true)
    })
    @PostMapping("/login")
    public Result<?> userLogin(String account, String password){
        boolean loginSuccess = false;
        Subject subject = SecurityUtils.getSubject();
        if (!subject.isAuthenticated()) {
            UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(account, password);
            try {
                subject.login(usernamePasswordToken);
                loginSuccess = true;
            } catch (UnknownAccountException e) {
                return Result.fail(202, "没有找到该账号,请检查输入!");
            } catch (IncorrectCredentialsException e) {
                return Result.fail(202, "密码不匹配,请检查输入!");
            }
        }
        if (loginSuccess) {
            // èŽ·å–shiroRealm中的数据
            ShiroRealm bean = SpringUtil.getBean(ShiroRealm.class);
            User user = bean.user;
            user.setPassword(null);
            UserLoginUtils bean1 = SpringUtil.getBean(UserLoginUtils.class);
            return bean1.LoginExamine(user);
        }else {
            return Result.fail("登录失败");
        }
    }
    @ApiOperation("登录-->获取用户信息")
    @GetMapping("/info")
    public Result<?> getUserInfo(@RequestHeader("X-Token") String token){
        //根据token获取用户信息
        Map<String,Object> data = userService.getUserInfo(token);
        if (data != null){
            return Result.success(data);
        }
        return Result.fail(202,"用户登录信息无效,请重新登录");
    }
    @PostMapping("/getUserById")
    @ApiOperation("获取指定用户id的用户信息和企业信息")
    public Result<?> getUserById(@RequestHeader("X-Token") String token) throws Exception {
        Object o = RedisUtil.get(token);
        Map<String, Object> unmarshal = null;
        if (!ObjectUtils.isEmpty(o)){
            unmarshal = JackSonUtil.unmarshal(JackSonUtil.marshal(o), Map.class);
            Map<String, String> map = userService.selectUserByUserId((Integer) unmarshal.get("id"));
            return Result.success(map);
        }
        return Result.fail("Token错误!");
    }
    @PostMapping("/add_new_personnel")
    @ApiOperation("实验室管理-->人员管理-->新增人员")
    public Result<?> addNewPersonnel(@RequestHeader("X-Token") String token, @RequestBody NewPersonnelVo newPersonnelVo) throws Exception {
        Object redisUserMessage = RedisUtil.get(token);
        Map<String, Object> user = null;
        Integer isAddSuccess = 0;
        if (!ObjectUtils.isEmpty(redisUserMessage)) {
            user = JackSonUtil.unmarshal(JackSonUtil.marshal(redisUserMessage), Map.class);
            newPersonnelVo.setPassword("123456");
            isAddSuccess = userService.addNewPersonnel(newPersonnelVo, user.get("enterpriseId").toString());
        }
        if (isAddSuccess == 1){
            return Result.success("添加【" + newPersonnelVo.getName() + "】成功,默认密码为:" + newPersonnelVo.getPassword());
        }
        return Result.fail("添加失败!");
    }
    @PutMapping("/update_new_personnel")
    @ApiOperation("实验室管理-->人员管理-->编辑操作")
    public Result<?> updateNewPersonnel(@RequestBody UpdatePersonnelVo updatePersonnelVo) {
        Integer isUpdateSuccess = userService.updateNewPersonnel(updatePersonnelVo);
        if (isUpdateSuccess == 1){
            return Result.success("更新【" + updatePersonnelVo.getName() + "】成功");
        }
        return Result.fail("更新【" + updatePersonnelVo.getName() + "】失败");
    }
    @GetMapping("/list_new_personnel")
    @ApiOperation("实验室管理-->人员管理-->分页查询")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "pageNo", value = "起始页", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "pageSize", value = "每一页数量", dataTypeClass = Integer.class, required = true),
            @ApiImplicitParam(name = "name", value = "人员名称", dataTypeClass = String.class)
    })
    public Result<Map<String, Object>> getNewPersonnelPage(Integer pageNo, Integer pageSize, String name) {
        IPage<PagePersonnelVo> PageList = userService.getNewPersonnelPage(name, new Page<Objects>(pageNo, pageSize));
        Map<String, Object> map = new HashMap<>();
        map.put("row", PageList.getRecords());
        map.put("total", PageList.getTotal());
        return Result.success(map);
    }
}
user-server/src/main/java/com/yuanchu/limslaboratory/mapper/EnterpriseMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.yuanchu.limslaboratory.mapper;
import com.yuanchu.limslaboratory.pojo.Enterprise;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
public interface EnterpriseMapper extends BaseMapper<Enterprise> {
}
user-server/src/main/java/com/yuanchu/limslaboratory/mapper/RoleMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.yuanchu.limslaboratory.mapper;
import com.yuanchu.limslaboratory.pojo.Role;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
public interface RoleMapper extends BaseMapper<Role> {
}
user-server/src/main/java/com/yuanchu/limslaboratory/mapper/UserMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.yuanchu.limslaboratory.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yuanchu.limslaboratory.vo.PagePersonnelVo;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
public interface UserMapper extends BaseMapper<User> {
    Map<String, String> selectUserByUserId(int userId);
    IPage<PagePersonnelVo> getNewPersonnelPage(String name, Page page);
    List<Map> selectUser();
}
user-server/src/main/java/com/yuanchu/limslaboratory/pojo/Enterprise.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="Enterprise对象", description="")
public class Enterprise implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "企业编号")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "企业名字")
    private String name;
    @ApiModelProperty(value = "企业简称")
    private String byname;
    @ApiModelProperty(value = "联系人名字")
    private String linkName;
    @ApiModelProperty(value = "联系人电话")
    private String linkPhone;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone="GMT+8")
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone="GMT+8")
    private Date updateTime;
    @Version
    @ApiModelProperty(value = "锁")
    private Integer version;
    public Enterprise(String name, String byname, String linkName, String linkPhone) {
        this.name = name;
        this.byname = byname;
        this.linkName = linkName;
        this.linkPhone = linkPhone;
    }
}
user-server/src/main/java/com/yuanchu/limslaboratory/pojo/Role.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="Role对象", description="")
public class Role implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "角色id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "角色名")
    private String name;
    @ApiModelProperty(value = "0:无权限;1:有权限")
    private Integer power;
    @TableLogic(value = "1", delval = "0")
    @ApiModelProperty(value = "逻辑删除 æ­£å¸¸>=1,删除<=0")
    private Integer state;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone="GMT+8")
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone="GMT+8")
    private Date updateTime;
    @Version
    @ApiModelProperty(value = "乐观锁")
    private Integer version;
}
user-server/src/main/java/com/yuanchu/limslaboratory/pojo/User.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.yuanchu.limslaboratory.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.sun.jmx.snmp.Timestamp;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
@Accessors(chain = true)
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="User对象", description="")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "用户id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "账号")
    private String account;
    @ApiModelProperty(value = "密码")
    private String password;
    @ApiModelProperty(value = "姓名")
    private String name;
    @ApiModelProperty(value = "手机号")
    private String phone;
    @ApiModelProperty(value = "邮箱")
    private String email;
    @ApiModelProperty(value = "年龄")
    private Integer age;
    @ApiModelProperty(value = "个性签名")
    private String info;
    @ApiModelProperty(value = "在职状态 æ­£å¸¸>=1,离职<=0")
    private Integer jobState;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;
    @Version
    private Integer version;
    @ApiModelProperty(value = "关联 è§’色id")
    private Integer roleId;
    @ApiModelProperty(value = "关联 ä¼ä¸šid")
    private Integer enterpriseId;
    public User(String account, String name, String phone, String email, String info) {
        this.account = account;
        this.name = name;
        this.phone = phone;
        this.email = email;
        this.info = info;
    }
}
user-server/src/main/java/com/yuanchu/limslaboratory/service/EnterpriseService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.yuanchu.limslaboratory.service;
import com.yuanchu.limslaboratory.pojo.Enterprise;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
public interface EnterpriseService extends IService<Enterprise> {
}
user-server/src/main/java/com/yuanchu/limslaboratory/service/RoleService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.yuanchu.limslaboratory.service;
import com.yuanchu.limslaboratory.pojo.Role;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
public interface RoleService extends IService<Role> {
}
user-server/src/main/java/com/yuanchu/limslaboratory/service/UserService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.yuanchu.limslaboratory.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.User;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yuanchu.limslaboratory.vo.NewPersonnelVo;
import com.yuanchu.limslaboratory.vo.PagePersonnelVo;
import com.yuanchu.limslaboratory.vo.UpdatePersonnelVo;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
public interface UserService extends IService<User> {
    /**
     * é€šè¿‡ç”¨æˆ·id获取用户信息
     * @param userId
     * @return
     */
    Map<String, String> selectUserByUserId(int userId);
    User AccordingUsernameSelectAll(String account);
    /**
     * æ·»åŠ ç”¨æˆ·
     * @param newPersonnelVo
     * @param enterpriseId
     * @return
     */
    Integer addNewPersonnel(NewPersonnelVo newPersonnelVo, String enterpriseId);
    /**
     * æ›´æ–°ç”¨æˆ·åŸºæœ¬ä¿¡æ¯
     * @param updatePersonnelVo
     * @return
     */
    Integer updateNewPersonnel(UpdatePersonnelVo updatePersonnelVo);
    /**
     * åˆ†é¡µæŸ¥è¯¢æ‰€æœ‰ç”¨æˆ·ä¿¡æ¯
     * @param name
     * @param page
     * @return
     */
    IPage<PagePersonnelVo> getNewPersonnelPage(String name, Page page);
    /**
     * ç™»å½•获取用户基本信息与系统超时时间提醒
     * @param token
     * @return
     */
    Map<String, Object> getUserInfo(String token);
    /**
     * æ ¹æ®Id查询是否存在该用户
     */
    Boolean userIsNull(Integer Id);
    /**
     * æ ¹æ®ç”¨æˆ·Id查询用户名称
     * @param userId ç”¨æˆ·Id
     * @return
     */
    String selectByUserId(Integer userId);
    /**
     * æŸ¥è¯¢æ‰€æœ‰ç”¨æˆ·ä¿¡æ¯
     * @return
     */
    List<Map> selectUser();
    /**
     * èŽ·å–æ‰€æœ‰ç”¨æˆ·çš„åç§°ä¸ŽId
     */
    List<Map<String, Object>> getUserNameAndId();
}
user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/EnterpriseServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.yuanchu.limslaboratory.service.impl;
import com.yuanchu.limslaboratory.pojo.Enterprise;
import com.yuanchu.limslaboratory.mapper.EnterpriseMapper;
import com.yuanchu.limslaboratory.service.EnterpriseService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
@Service
public class EnterpriseServiceImpl extends ServiceImpl<EnterpriseMapper, Enterprise> implements EnterpriseService {
}
user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/RoleServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.yuanchu.limslaboratory.service.impl;
import com.yuanchu.limslaboratory.pojo.Role;
import com.yuanchu.limslaboratory.mapper.RoleMapper;
import com.yuanchu.limslaboratory.service.RoleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {
}
user-server/src/main/java/com/yuanchu/limslaboratory/service/impl/UserServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,135 @@
package com.yuanchu.limslaboratory.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuanchu.limslaboratory.pojo.User;
import com.yuanchu.limslaboratory.mapper.UserMapper;
import com.yuanchu.limslaboratory.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.limslaboratory.utils.RedisUtil;
import com.yuanchu.limslaboratory.vo.NewPersonnelVo;
import com.yuanchu.limslaboratory.vo.PagePersonnelVo;
import com.yuanchu.limslaboratory.vo.UpdatePersonnelVo;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2023-07-07
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Resource
    private UserMapper userMapper;
    @Override
    public Map<String, Object> getUserInfo(String token) {
        //根据token获取用户信息
        Object obj = RedisUtil.get(token);
        if (!ObjectUtils.isEmpty(obj)){
            Map loginUser = (Map) obj;
            Map map = (Map)loginUser.get("data");
            Object residualTime = map.get("residualTime");
            int i = Integer.parseInt(residualTime.toString());
            String remind = null;
            if (i <= 30) {
                remind = "您所使用的系统即将过期!请联系管理员!";
            }
            Map<String, Object> data = new HashMap<>();
            data.put("name",loginUser.get("name"));
            data.put("remind", remind);
            return data;
        }
        return null;
    }
    @Override
    public Boolean userIsNull(Integer Id) {
        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
        userLambdaQueryWrapper.eq(User::getId, Id);
        userLambdaQueryWrapper.select(User::getName);
        User user = userMapper.selectOne(userLambdaQueryWrapper);
        return !ObjectUtils.isEmpty(user);
    }
    @Override
    public String selectByUserId(Integer userId) {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(User::getId, userId);
        wrapper.select(User::getName);
        User user = userMapper.selectOne(wrapper);
        return user.getName();
    }
    @Override
    public List<Map> selectUser() {
        return userMapper.selectUser();
    }
    @Override
    public List<Map<String, Object>> getUserNameAndId() {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.select(User::getId, User::getName);
        return userMapper.selectMaps(wrapper);
    }
    @Override
    public Map<String, String> selectUserByUserId(int userId) {
        return userMapper.selectUserByUserId(userId);
    }
    @Override
    public User AccordingUsernameSelectAll(String account) {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(User::getAccount, account);
        wrapper.select(User::getPassword, User::getId, User::getName, User::getAccount, User::getEnterpriseId);
        return userMapper.selectOne(wrapper);
    }
    @Override
    public Integer addNewPersonnel(NewPersonnelVo newPersonnelVo, String enterpriseId) {
        User user = new User()
                .setName(newPersonnelVo.getName())
                .setAccount(newPersonnelVo.getAccount())
                .setAge(newPersonnelVo.getAge())
                .setPhone(newPersonnelVo.getPhone())
                .setEmail(newPersonnelVo.getEmail())
                .setRoleId(newPersonnelVo.getRole_id())
                .setPassword(newPersonnelVo.getPassword())
                .setEnterpriseId(Integer.valueOf(enterpriseId));
        return userMapper.insert(user);
    }
    @Override
    public Integer updateNewPersonnel(UpdatePersonnelVo updatePersonnelVo) {
        User user = new User()
                .setName(updatePersonnelVo.getName())
                .setAccount(updatePersonnelVo.getAccount())
                .setAge(updatePersonnelVo.getAge())
                .setPhone(updatePersonnelVo.getPhone())
                .setEmail(updatePersonnelVo.getEmail())
                .setRoleId(updatePersonnelVo.getRole_id())
                .setPassword(updatePersonnelVo.getPassword())
                .setJobState(updatePersonnelVo.getJobState());
        LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(User::getId, updatePersonnelVo.getId());
        return userMapper.update(user, updateWrapper);
    }
    @Override
    public IPage<PagePersonnelVo> getNewPersonnelPage(String name, Page page) {
        return userMapper.getNewPersonnelPage(name, page);
    }
}
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/JwtToken.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.yuanchu.limslaboratory.shiro;
import com.yuanchu.limslaboratory.shiro.utils.JwtUtils;
import org.apache.shiro.authc.AuthenticationToken;
public class JwtToken implements AuthenticationToken {
    private static final long serialVersionUID = 1L;
    // åŠ å¯†åŽçš„ JWT token串
    private String token;
    private String account;
    public JwtToken(String token) {
        this.token = token;
        this.account = JwtUtils.getClaimFiled(token, "account");
    }
    @Override
    public Object getPrincipal() {
        return this.account;
    }
    @Override
    public Object getCredentials() {
        return token;
    }
}
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/MultiRealmAuthenticator.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.yuanchu.limslaboratory.shiro;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.pam.AuthenticationStrategy;
import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
import org.apache.shiro.realm.Realm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collection;
public class MultiRealmAuthenticator extends ModularRealmAuthenticator {
    private static final Logger log = LoggerFactory.getLogger(MultiRealmAuthenticator.class);
    @Override
    protected AuthenticationInfo doMultiRealmAuthentication(Collection<Realm> realms, AuthenticationToken token)
            throws AuthenticationException {
        AuthenticationStrategy strategy = getAuthenticationStrategy();
        AuthenticationInfo aggregate = strategy.beforeAllAttempts(realms, token);
        if (log.isTraceEnabled()) {
            log.trace("Iterating through {} realms for PAM authentication", realms.size());
        }
        AuthenticationException authenticationException = null;
        for (Realm realm : realms) {
            aggregate = strategy.beforeAttempt(realm, token, aggregate);
            if (realm.supports(token)) {
                log.trace("Attempting to authenticate token [{}] using realm [{}]", token, realm);
                AuthenticationInfo info = null;
                try {
                    info = realm.getAuthenticationInfo(token);
                } catch (AuthenticationException e) {
                    authenticationException = e;
                    if (log.isDebugEnabled()) {
                        String msg = "Realm [" + realm
                                + "] threw an exception during a multi-realm authentication attempt:";
                        log.debug(msg, e);
                    }
                }
                aggregate = strategy.afterAttempt(realm, token, info, aggregate, authenticationException);
            } else {
                log.debug("Realm [{}] does not support token {}.  Skipping realm.", realm, token);
            }
        }
        if (authenticationException != null) {
            throw authenticationException;
        }
        aggregate = strategy.afterAllAttempts(token, aggregate);
        return aggregate;
    }
}
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/config/ShiroConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,179 @@
package com.yuanchu.limslaboratory.shiro.config;
import com.yuanchu.limslaboratory.shiro.filter.JwtFilter;
import com.yuanchu.limslaboratory.shiro.MultiRealmAuthenticator;
import com.yuanchu.limslaboratory.shiro.realm.JwtRealm;
import com.yuanchu.limslaboratory.shiro.realm.ShiroRealm;
import com.yuanchu.limslaboratory.shiro.utils.JwtCredentialsMatcher;
import org.apache.shiro.authc.credential.CredentialsMatcher;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.authc.pam.AuthenticationStrategy;
import org.apache.shiro.authc.pam.FirstSuccessfulStrategy;
import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
import org.apache.shiro.authz.Authorizer;
import org.apache.shiro.authz.ModularRealmAuthorizer;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
import org.apache.shiro.mgt.DefaultSubjectDAO;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.mgt.SessionStorageEvaluator;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
import java.util.*;
@Configuration
public class ShiroConfig {
    /**
     * ä¸å‘ Spring容器中注册 JwtFilter Bean,防止 Spring å°† JwtFilter æ³¨å†Œä¸ºå…¨å±€è¿‡æ»¤å™¨
     * å…¨å±€è¿‡æ»¤å™¨ä¼šå¯¹æ‰€æœ‰è¯·æ±‚进行拦截,而本例中只需要拦截除 /login å’Œ /logout å¤–的请求
     * å¦ä¸€ç§ç®€å•做法是:直接去掉 jwtFilter()上的 @Bean æ³¨è§£
     */
    @Bean
    public FilterRegistrationBean<Filter> registration(JwtFilter filter) {
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<Filter>(filter);
        registration.setEnabled(false);
        return registration;
    }
    //ShiroFilter过滤所有请求
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //给ShiroFilter配置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        // æ·»åŠ  jwt ä¸“用过滤器,拦截除 /login å’Œ /logout å¤–的请求
        Map<String, Filter> filterMap = new LinkedHashMap<>();
        filterMap.put("jwtFilter", new JwtFilter());
        shiroFilterFactoryBean.setFilters(filterMap);
        //配置系统公共资源
        Map<String, String> map = new HashMap<String, String>();
        // swagger放行
        map.put("/doc.html", "anon");
        map.put("/webjars/**/**", "anon");
        map.put("/swagger-resources", "anon");
        map.put("/api-docs", "anon");
        map.put("/v3/**", "anon");
        map.put("/link-basic/*", "anon");
        map.put("/user/login/**","anon");//表示这个为公共资源 ä¸€å®šæ˜¯åœ¨å—限资源上面
//        map.put("/**","jwtFilter");//表示这个资源需要认证和授权
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
        return shiroFilterFactoryBean;
    }
    /**
     * é…ç½® ModularRealmAuthenticator
     */
    @Bean
    public ModularRealmAuthenticator authenticator() {
        ModularRealmAuthenticator authenticator = new MultiRealmAuthenticator();
        // è®¾ç½®å¤š Realm的认证策略,默认 AtLeastOneSuccessfulStrategy
        AuthenticationStrategy strategy = new FirstSuccessfulStrategy();
        authenticator.setAuthenticationStrategy(strategy);
        return authenticator;
    }
    /**
     * ç¦ç”¨session, ä¸ä¿å­˜ç”¨æˆ·ç™»å½•状态。保证每次请求都重新认证
     */
    @Bean
    protected SessionStorageEvaluator sessionStorageEvaluator() {
        DefaultSessionStorageEvaluator sessionStorageEvaluator = new DefaultSessionStorageEvaluator();
        sessionStorageEvaluator.setSessionStorageEnabled(false);
        return sessionStorageEvaluator;
    }
    /**
     * é…ç½® SecurityManager:权限管理器
     */
    @Bean
    public DefaultWebSecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 1.身份验证器
        securityManager.setAuthenticator(authenticator());
        // 2.管理Realm
        List<Realm> realms = new ArrayList<Realm>(16);
        realms.add(JwtRealm());
        realms.add(shiroRealm());
        securityManager.setRealms(realms); // é…ç½®å¤šä¸ªrealm
        // 3.关闭shiro自带的session
        DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
        subjectDAO.setSessionStorageEvaluator(sessionStorageEvaluator());
        securityManager.setSubjectDAO(subjectDAO);
        return securityManager;
    }
    //    åˆ›å»ºè‡ªå®šä¹‰Realm
    @Bean
    public Realm shiroRealm() {
        ShiroRealm realm = new ShiroRealm();
//        HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
////        //设置使用MD5加密算法
////        credentialsMatcher.setHashAlgorithmName(Md5Hash.ALGORITHM_NAME);
////        //散列次数
////        credentialsMatcher.setHashIterations(1024);
//        realm.setCredentialsMatcher(credentialsMatcher);
        return realm;
    }
    @Bean
    public Realm JwtRealm(){
        JwtRealm jwtRealm = new JwtRealm();
        // è®¾ç½®åŠ å¯†ç®—æ³•
        CredentialsMatcher credentialsMatcher = new JwtCredentialsMatcher();
        // è®¾ç½®åŠ å¯†æ¬¡æ•°
        jwtRealm.setCredentialsMatcher(credentialsMatcher);
        return jwtRealm;
    }
    // ä»¥ä¸‹ä¸‰ä¸­bean通用,固定配置
    /**
     * äº¤ç”± Spring æ¥è‡ªåŠ¨åœ°ç®¡ç† Shiro-Bean çš„生命周期
     */
    @Bean
    public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }
    /**
     * ä¸º Spring-Bean å¼€å¯å¯¹ Shiro æ³¨è§£çš„æ”¯æŒ
     */
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
    }
    /**
     * å¼€å¯AOP方法级权限检查
     */
    @Bean
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
        DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
        advisorAutoProxyCreator.setProxyTargetClass(true);
        return advisorAutoProxyCreator;
    }
}
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/filter/JwtFilter.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,170 @@
package com.yuanchu.limslaboratory.shiro.filter;
import com.yuanchu.limslaboratory.shiro.JwtToken;
import com.yuanchu.limslaboratory.shiro.utils.JwtUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
import org.apache.shiro.web.util.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
@Component
public class JwtFilter extends BasicHttpAuthenticationFilter {
    private Logger log = LoggerFactory.getLogger(this.getClass());
    public Integer code;
    public String message;
    /**
     * å‰ç½®å¤„理
     */
    @Override
    protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
        HttpServletRequest httpServletRequest = WebUtils.toHttp(request);
        HttpServletResponse httpServletResponse = WebUtils.toHttp(response);
        // è·¨åŸŸæ—¶ä¼šé¦–先发送一个option请求,这里我们给option请求直接返回正常状态
        if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
            httpServletResponse.setStatus(HttpStatus.OK.value());
            return false;
        }
        return super.preHandle(request, response);
    }
    /**
     * åŽç½®å¤„理
     */
    @Override
    protected void postHandle(ServletRequest request, ServletResponse response) {
        // æ·»åŠ è·¨åŸŸæ”¯æŒ
        this.fillCorsHeader(WebUtils.toHttp(request), WebUtils.toHttp(response));
    }
    /**
     * è¿‡æ»¤å™¨æ‹¦æˆªè¯·æ±‚的入口方法
     * è¿”回 true åˆ™å…è®¸è®¿é—®
     * è¿”回false åˆ™ç¦æ­¢è®¿é—®ï¼Œä¼šè¿›å…¥ onAccessDenied()
     */
    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
        // å¦‚æžœtoken为空不让通过
        String header = ((HttpServletRequest) request).getHeader(JwtUtils.AUTH_HEADER);
        if (ObjectUtils.isEmpty(header)){
            code = 503;
            message = "STS token解码过程中,由于内部调用失败导致解码失败,请稍后再试。";
            return false;
        }
        boolean allowed = false;
        try {
            // æ£€æµ‹Header里的 JWT token内容是否正确,尝试使用 token进行登录
            allowed = executeLogin(request, response);
        } catch (IllegalStateException e) { // not found any token
            log.error("Not found any token");
        } catch (Exception e) {
            log.error("Error occurs when login", e);
        }
        return allowed || super.isPermissive(mappedValue);
    }
    /**
     * èº«ä»½éªŒè¯,检查 JWT token æ˜¯å¦åˆæ³•
     */
    @Override
    protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
        AuthenticationToken token = createToken(request, response);
        if (token == null) {
            String msg = "createToken method implementation returned null. A valid non-null AuthenticationToken "
                    + "must be created in order to execute a login attempt.";
            throw new IllegalStateException(msg);
        }
        try {
            Subject subject = getSubject(request, response);
            subject.login(token); // äº¤ç»™ Shiro åŽ»è¿›è¡Œç™»å½•éªŒè¯
            return onLoginSuccess(token, subject, request, response);
        } catch (AuthenticationException e) {
            return onLoginFailure(token, e, request, response);
        }
    }
    /**
     * ä»Ž Header é‡Œæå– JWT token
     */
    @Override
    protected AuthenticationToken createToken(ServletRequest servletRequest, ServletResponse servletResponse) {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String authorization = httpServletRequest.getHeader(JwtUtils.AUTH_HEADER);
        JwtToken token = new JwtToken(authorization);
        return token;
    }
    /**
     * isAccessAllowed()方法返回false,会进入该方法,表示拒绝访问
     */
    @Override
    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
        HttpServletResponse httpResponse = WebUtils.toHttp(servletResponse);
        httpResponse.setCharacterEncoding("UTF-8");
        httpResponse.setContentType("application/json;charset=UTF-8");
        httpResponse.setStatus(HttpStatus.UNAUTHORIZED.value());
        PrintWriter writer = httpResponse.getWriter();
        writer.write("{\"errCode\": "+ code +", \"msg\": \"" + message +"\"}");
        fillCorsHeader(WebUtils.toHttp(servletRequest), httpResponse);
        return false;
    }
    /**
     * Shiro åˆ©ç”¨ JWT token ç™»å½•成功,会进入该方法
     */
    @Override
    protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request,
                                     ServletResponse response) {
        HttpServletResponse httpResponse = WebUtils.toHttp(response);
        String newToken = null;
        if (token instanceof JwtToken) {
            newToken = JwtUtils.refreshTokenExpired(token.getCredentials().toString(), JwtUtils.SECRET);
        }
        if (newToken != null)
            httpResponse.setHeader(JwtUtils.AUTH_HEADER, newToken);
        return true;
    }
    /**
     * Shiro åˆ©ç”¨ JWT token ç™»å½•失败,会进入该方法
     */
    @Override
    protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request,
                                     ServletResponse response) {
        // æ­¤å¤„直接返回 false ï¼Œäº¤ç»™åŽé¢çš„  onAccessDenied()方法进行处理
        String error = e.getClass().toString().split("\\.")[4];
        if (error.equals("IncorrectCredentialsException")) {
            code = 10010;
        } else {
            code = 401;
        }
        message = e.getMessage();
        return false;
    }
    /**
     * æ·»åŠ è·¨åŸŸæ”¯æŒ
     */
    protected void fillCorsHeader(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin"));
        httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,HEAD");
        httpServletResponse.setHeader("Access-Control-Allow-Headers",
                httpServletRequest.getHeader("Access-Control-Request-Headers"));
    }
}
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/realm/JwtRealm.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.yuanchu.limslaboratory.shiro.realm;
import com.yuanchu.limslaboratory.pojo.User;
import com.yuanchu.limslaboratory.shiro.JwtToken;
import com.yuanchu.limslaboratory.utils.RedisUtil;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
public class JwtRealm extends AuthorizingRealm {
    /**
     * é™å®šè¿™ä¸ª Realm åªå¤„理我们自定义的 JwtToken
     */
    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof JwtToken;
    }
    /**
     * æ­¤å¤„çš„ SimpleAuthenticationInfo å¯è¿”回任意值,密码校验时不会用到它
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
        JwtToken jwtToken = (JwtToken) authcToken;
        if (jwtToken.getPrincipal() == null) {
            throw new AccountException("Token参数异常!");
        }
        // å½“前用户
        String account = jwtToken.getPrincipal().toString();
        // å½“前用户的token
        String credentials = (String)jwtToken.getCredentials();
        User user = (User) RedisUtil.get(credentials);
        // ç”¨æˆ·ä¸å­˜åœ¨
        if (user == null) {
            throw new UnknownAccountException("用户不存在!");
        }
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, account, getName());
        return info;
    }
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        return info;
    }
}
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/realm/ShiroRealm.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.yuanchu.limslaboratory.shiro.realm;
import com.yuanchu.limslaboratory.pojo.User;
import com.yuanchu.limslaboratory.service.UserService;
import com.yuanchu.limslaboratory.utils.SpringUtil;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.util.ObjectUtils;
public class ShiroRealm extends AuthorizingRealm {
    public User user;
    /**
     * é™å®šè¿™ä¸ª Realm åªå¤„理 UsernamePasswordToken
     */
    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof UsernamePasswordToken;
    }
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) {
        String principal = (String) authenticationToken.getPrincipal();
        //获取UserService对象
        UserService userService = SpringUtil.getBean(UserService.class);
        user = userService.AccordingUsernameSelectAll(principal);
        if (!ObjectUtils.isEmpty(user)) {
            return new SimpleAuthenticationInfo(user.getAccount(), user.getPassword(), this.getName());
        } else {
            throw new UnknownAccountException();
        }
    }
}
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/utils/JwtCredentialsMatcher.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.yuanchu.limslaboratory.shiro.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.credential.CredentialsMatcher;
import org.springframework.stereotype.Component;
@Component
public class JwtCredentialsMatcher implements CredentialsMatcher {
    /**
     * JwtCredentialsMatcher只需验证JwtToken内容是否合法
     */
    @Override
    public boolean doCredentialsMatch(AuthenticationToken authenticationToken, AuthenticationInfo authenticationInfo) {
        String token = authenticationToken.getCredentials().toString();
        String account = authenticationToken.getPrincipal().toString();
        try {
            Algorithm algorithm = Algorithm.HMAC256(JwtUtils.getSecret());
            JWTVerifier verifier = JWT.require(algorithm).withClaim("account", account).build();
            verifier.verify(token);
            return true;
        } catch (JWTVerificationException e) {
        } catch (Exception e){
            e.printStackTrace();
        }
        return false;
    }
}
user-server/src/main/java/com/yuanchu/limslaboratory/shiro/utils/JwtUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,159 @@
package com.yuanchu.limslaboratory.shiro.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import javax.annotation.PostConstruct;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
@Component
public class JwtUtils {
    private static String staticSecret;
    @Value("${login.secret}")
    private String secret;
    @PostConstruct
    public void getApiToken() {
        staticSecret = this.secret;
    }
    public static String getSecret() {
        // lockie.zou
        return staticSecret;
    }
    // è¿‡æœŸæ—¶é—´ 2 å°æ—¶
    private static final long EXPIRE_TIME = 2 * 60 * 60 * 1000;
    //自己定制密钥
    public static final String SECRET = "J-(t]Poe9P";
    //请求头
    public static final String AUTH_HEADER = "X-Token";  // X-Authorization-With
    /**
     * éªŒè¯token是否正确
     * @param token
     * @return
     */
    public static boolean verify(String token){
        try{
            String account = getClaimFiled(token, "account");
            if (account == null){
                return false;
            }
            Algorithm algorithm = Algorithm.HMAC256(getSecret());
            JWTVerifier verifier = JWT.require(algorithm).withClaim("account",account).build();
            verifier.verify(token);
            return true;
        } catch (JWTVerificationException exception){
            return false;
        } catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }
    /**
     * èŽ·å¾—token中的自定义信息,一般是获取token的username,无需secret解密也能获得
     * @param token
     * @param filed
     * @return
     */
    public static String getClaimFiled(String token, String filed){
        try{
            if (!ObjectUtils.isEmpty(token)){
                DecodedJWT jwt = JWT.decode(token);
                return jwt.getClaim(filed).asString();
            }
            return null;
        } catch (JWTDecodeException e){
            return null;
        }
    }
    /**
     * ç”Ÿæˆç­¾å,准确地说是生成token
     * @return
     */
    public static String sign(String account){
        try{
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            Algorithm algorithm = Algorithm.HMAC256(SECRET);
            //附带username,nickname信息
            return JWT.create()
                    .withClaim("account",account)
                    .withExpiresAt(date)
                    .sign(algorithm);
        } catch (JWTCreationException e){
            e.printStackTrace();
            return null;
        } catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
    /**
     * èŽ·å–token的签发时间
     * @param token
     * @return
     */
    public static Date getIssueAt(String token){
        try{
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getIssuedAt();
        } catch (JWTDecodeException e){
            e.printStackTrace();
            return null;
        }
    }
    /**
     * éªŒè¯token是否过期
     * @param token
     * @return
     */
    public static boolean isTokenExpired(String token){
        Date now = Calendar.getInstance().getTime();
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getExpiresAt().before(now);
    }
    /**
     * åˆ·æ–°token的有效期
     * @param token
     * @param secret
     * @return
     */
    public static String refreshTokenExpired(String token, String secret){
        DecodedJWT jwt = JWT.decode(token); //解析token
        Map<String, Claim> claims = jwt.getClaims(); //获取token的参数信息
        try{
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            Algorithm algorithm = Algorithm.HMAC256(secret);
            JWTCreator.Builder builder = JWT.create().withExpiresAt(date);
            for(Map.Entry<String,Claim> entry : claims.entrySet()){
                builder.withClaim(entry.getKey(),entry.getValue().asString());
            }
            return builder.sign(algorithm);
        } catch (JWTCreationException e){
            e.printStackTrace();
            return null;
        }
    }
}
user-server/src/main/java/com/yuanchu/limslaboratory/vo/NewPersonnelVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.yuanchu.limslaboratory.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="NewPersonnelVo对象", description="用于对角色管理的添加")
public class NewPersonnelVo {
    @ApiModelProperty(value = "姓名", example = "小黑", required = true)
    private String name;
    @ApiModelProperty(value = "账号", example = "45612345", required = true)
    private String account;
    @ApiModelProperty(value = "0:无权限;1:有权限", example = "1", required = true)
    private Integer role_id;
    @ApiModelProperty(value = "年龄", example = "23")
    private Integer age;
    @ApiModelProperty(value = "年龄", example = "23", hidden = true)
    private String password;
    @ApiModelProperty(value = "手机号", example = "12345678981")
    private String phone;
    @ApiModelProperty(value = "邮箱", example = "12345678@qq.com")
    private String email;
}
user-server/src/main/java/com/yuanchu/limslaboratory/vo/PagePersonnelVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.yuanchu.limslaboratory.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="UpdatePersonnelVo对象", description="用于对角色管理的更新")
public class PagePersonnelVo {
    @ApiModelProperty(value = "主键ID", example = "1", required = true)
    private String id;
    @ApiModelProperty(value = "姓名", example = "小黑", required = true)
    private String username;
    @ApiModelProperty(value = "角色权限", example = "小黑", required = true)
    private String roleName;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
    private Date createTime;
    @ApiModelProperty(value = "年龄", example = "23")
    private Integer age;
    @ApiModelProperty(value = "手机号", example = "12345678981")
    private String phone;
    @ApiModelProperty(value = "邮箱", example = "12345678@qq.com")
    private String email;
    @ApiModelProperty(value = "在职状态 æ­£å¸¸>=1,离职<=0", example = "0")
    private Integer jobState;
}
user-server/src/main/java/com/yuanchu/limslaboratory/vo/UpdatePersonnelVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.yuanchu.limslaboratory.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="UpdatePersonnelVo对象", description="用于对角色管理的更新")
public class UpdatePersonnelVo {
    @ApiModelProperty(value = "主键ID", example = "1", required = true)
    private String id;
    @ApiModelProperty(value = "姓名", example = "小黑", required = true)
    private String name;
    @ApiModelProperty(value = "账号", example = "45612345", required = true)
    private String account;
    @ApiModelProperty(value = "0:无权限;1:有权限", example = "1", required = true)
    private Integer role_id;
    @ApiModelProperty(value = "年龄", example = "23")
    private Integer age;
    @ApiModelProperty(value = "手机号", example = "12345678981")
    private String phone;
    @ApiModelProperty(value = "邮箱", example = "12345678@qq.com")
    private String email;
    @ApiModelProperty(value = "在职状态 æ­£å¸¸>=1,离职<=0", example = "0")
    private Integer jobState;
    @ApiModelProperty(value = "账号密码", example = "654321")
    private String password;
}
user-server/src/main/resources/mapper/EnterpriseMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
<?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.yunachu.limslaboratory.mapper.EnterpriseMapper">
</mapper>
user-server/src/main/resources/mapper/RoleMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
<?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.yuanchu.limslaboratory.mapper.RoleMapper">
</mapper>
user-server/src/main/resources/mapper/UserMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
<?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.yuanchu.limslaboratory.mapper.UserMapper">
    <select id="selectUserByUserId" parameterType="int" resultType="Map">
        SELECT u.account    account,
               u.name       uname,
               u.phone,
               u.email,
               u.info,
               e.byname     e_byname,
               e.`name`     e_name,
               e.link_name  e_link_name,
               e.link_phone e_phone
        FROM enterprise e,
             `user` u
        WHERE e.`id` = u.`enterprise_id`
          AND u.id = #{userId}
    </select>
    <resultMap id="PagePersonnelVoMap" type="com.yuanchu.limslaboratory.vo.PagePersonnelVo">
        <result property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="roleName" column="roleName"/>
        <result property="createTime" column="create_time"/>
        <result property="age" column="age"/>
        <result property="phone" column="phone"/>
        <result property="email" column="email"/>
        <result property="jobState" column="job_state"/>
    </resultMap>
    <select id="getNewPersonnelPage" resultMap="PagePersonnelVoMap">
        SELECT u.`id`, u.`name` username, r.`name` roleName, u.`create_time`, IFNULL(u.`age`, '---') age,
        IFNULL(u.`phone`, '---') phone, IFNULL(u.`email`, '---') email, u.`job_state`
        FROM `user` u, role r
        WHERE u.`role_id` = r.`id`
        <if test="name != null">
            AND u.name = #{name}
        </if>
    </select>
    <select id="selectUser" resultType="Map">
        select id, name
        from lims_laboratory.user
    </select>
</mapper>