zouyu
2025-03-01 e7a77fffb72595958d245598c4abe87c6b4b84b6
初始化
已修改1个文件
已添加506个文件
54029 ■■■■■ 文件已修改
.gitignore 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LICENSE 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/pom.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java 393 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/CertificationController.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/LaboratoryController.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/ProductPartController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/ProductSupplierDensityController.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/SealController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/StandardMethodController.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/StandardTemplateController.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/StandardTreeController.java 276 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/StructureTestObjectPartController.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/CopyStandardProductListDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/FactoryDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/IfsInventoryQuantityCheckDto.java 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/IfsInventoryQuantityDto.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/IfsInventoryQuantitySupplierDto.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/InsSampleReceiveDto.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/LaboratoryDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/ModelDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/PageTestObjectDto.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/ProductDTO1.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/ProductDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/ResetTreeDragDTO.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/SampleDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/SampleTypeDto.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/dto/TestItemDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/excel/StructureTestObjectData.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/excel/StructureTestObjectListener.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/CertificationMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/IfsInventoryQuantityMapper.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/LaboratoryMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/ProductMapper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/ProductPartMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/ProductSupplierDensityMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/SealMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardMethodListMapper.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardMethodMapper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardProductListMapper.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardProductListSupplierAskMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTemplateMapper.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeMapper.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StructureItemParameterMapper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StructureTestObjectMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/mapper/StructureTestObjectPartMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/Certification.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/IfsInventoryQuantity.java 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/InsSample1.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/Laboratory.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/Product.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/ProductPart.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/ProductSupplierDensity.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/Seal.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethod.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethodList.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardProductList.java 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardProductListSupplierAsk.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardTemplate.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardTree.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StructureTestObject.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/pojo/StructureTestObjectPart.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/CapacityScopeService.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/CertificationService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/LaboratoryService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/ProductPartService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/ProductService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/ProductSupplierDensityService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/SealService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/StandardMethodListService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/StandardMethodService.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/StandardProductListService.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/StandardProductListService2.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/StandardProductListSupplierAskService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/StandardTemplateService.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/StandardTreeService.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/StructureItemParameterService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/StructureTestObjectPartService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/StructureTestObjectService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/CertificationServiceImpl.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/LaboratoryServiceImpl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/ProductPartServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/ProductSupplierDensityServiceImpl.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/SealServiceImpl.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodListServiceImpl.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListService2Impl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java 701 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListSupplierAskServiceImpl.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTemplateServiceImpl.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTreeServiceImpl.java 535 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StructureItemParameterServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StructureTestObjectPartServiceImpl.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StructureTestObjectServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/CertificationMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/IfsInventoryQuantityMapper.xml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/LaboratoryMapper.xml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/ProductMapper.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/ProductPartMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/ProductSupplierDensityMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/SealMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StandardMethodListMapper.xml 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StandardMethodMapper.xml 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StandardProductListMapper.xml 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StandardProductListSupplierAskMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StandardTemplateMapper.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StandardTreeMapper.xml 384 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StructureItemParameterMapper.xml 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StructureTestMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/resources/mapper/StructureTestObjectPartMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bin/clean.bat 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bin/package.bat 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bin/run.bat 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/pom.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/basic/pojo/InsSample.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/pom.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryCorrectionHoursController.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryOriginalHoursController.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryOutputWorkingHoursController.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryWorkingHoursController.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryWorkingHoursDayController.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/controller/ShiftTimeController.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryAllDto.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryCorrectionHoursDto.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryOriginalHoursDto.java 251 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryOriginalHoursLookDto.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryOutputWorkingHoursDto.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryWorkingHoursDayDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/dto/HoursDay.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/dto/PerformanceShiftAddDto.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/dto/PerformanceShiftMapDto.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/excel/AuxiliaryCorrectionHoursListener.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryCorrectionHoursMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryOriginalHoursMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryOutputWorkingHoursMapper.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryWorkingHoursDayMapper.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryWorkingHoursMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/PerformanceShiftMapper.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/mapper/ShiftTimeMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryCorrectionHours.java 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryOutputWorkingHours.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryWorkingHours.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryWorkingHoursDay.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/pojo/PerformanceShift.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/pojo/ShiftTime.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/AuxiliaryCorrectionHoursService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/AuxiliaryOriginalHoursService.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/AuxiliaryOutputWorkingHoursService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/AuxiliaryWorkingHoursDayService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/AuxiliaryWorkingHoursService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/PerformanceShiftService.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/ShiftTimeService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryCorrectionHoursServiceImpl.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOriginalHoursServiceImpl.java 635 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryWorkingHoursDayServiceImpl.java 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryWorkingHoursServiceImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/PerformanceShiftServiceImpl.java 563 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/ShiftTimeServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/utils/CustomerDoubleSerialize.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/utils/StyleMonthUtils.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/utils/StyleYearUtils.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/AuxiliaryCorrectionHoursMapper.xml 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/AuxiliaryOriginalHoursMapper.xml 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/AuxiliaryOutputWorkingHoursMapper.xml 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/AuxiliaryWorkingHoursDayMapper.xml 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/AuxiliaryWorkingHoursMapper.xml 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/ShiftTimeMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 385 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/pom.xml 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/CodeGenerator.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/CustomController.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java 262 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java 256 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/META-INF/spring-devtools.properties 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-druid.yml 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/banner.txt 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/i18n/messages.properties 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/logback.xml 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/pom.xml 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/config/MinioConfig.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/config/serializer/SensitiveJsonSerializer.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/MinioResult.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/Result.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/Custom.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java 274 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java 241 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java 363 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java 266 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java 268 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java 1010 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/DesensitizedType.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/UtilException.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileSizeLimitExceededException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileUploadException.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/job/TaskException.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/user/BlackListException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserNotExistsException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitExceedException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/filter/PropertyPreExcludeFilter.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/handler/MybatisHandler.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/numgen/LambdaUtils.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/numgen/NumberGenerator.java 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/numgen/NumberGeneratorModelHelper.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/numgen/NumberTableInfo.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/numgen/SerializedLambda.java 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/DesensitizedUtil.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/JackSonUtil.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/LogUtils.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/QueryWrappers.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java 684 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java 291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MinioUtils.java 294 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java 570 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java 274 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java 382 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java 1900 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java 410 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Base64.java 291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java 484 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/pom.xml 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java 254 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/I18nConfig.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/mybatis_config/MyBaseMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/mybatis_config/MyBatisPlusConfig.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/mybatis_config/MySqlInjector.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/AuthenticationContextHolder.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/PermissionContextHolder.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java 240 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/pom.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java 263 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java 385 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java 373 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java 531 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java 408 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/generator.yml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/java/controller.java.vm 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/java/domain.java.vm 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/java/mapper.java.vm 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/java/service.java.vm 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/js/api.js.vm 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/sql/sql.vm 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm 505 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/vue/index.vue.vm 602 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm 474 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm 590 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/pom.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/config/ScheduleConfig.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobLogMapper.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobMapper.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/CronUtils.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzDisallowConcurrentExecution.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzJobExecution.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/pom.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysCache.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java 269 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/CustomMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/CustomService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomServiceImpl.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java 238 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java 543 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java 427 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java 550 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/CustomMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml 233 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ry.bat 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ry.sh 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
######################################################################
# Build Tools
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar
target/
!.mvn/wrapper/maven-wrapper.jar
######################################################################
# IDE
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### JRebel ###
rebel.xml
### NetBeans ###
nbproject/private/
build/*
nbbuild/
dist/
nbdist/
.nb-gradle/
######################################################################
# Others
*.log
*.xml.versionsBackup
*.swp
!*/build/*.java
!*/build/*.html
!*/build/*.xml
#/ruoyi-admin/src/main/resources/application.yml
#/ruoyi-admin/src/main/resources/application-druid.yml
#/ruoyi-admin/src/main/resources/logback.xml
#/ruoyi-generator/src/main/resources/generator.yml
LICENSE
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2018 RuoYi
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
README.md
@@ -1,4 +1,95 @@
## center-lims-after-ruoyi
<p align="center">
    <img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
</p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v3.8.9</h1>
<h4 align="center">基于SpringBoot+Vue前后端分离的Java快速开发框架</h4>
<p align="center">
    <a href="https://gitee.com/y_project/RuoYi-Vue/stargazers"><img src="https://gitee.com/y_project/RuoYi-Vue/badge/star.svg?theme=dark"></a>
    <a href="https://gitee.com/y_project/RuoYi-Vue"><img src="https://img.shields.io/badge/RuoYi-v3.8.9-brightgreen.svg"></a>
    <a href="https://gitee.com/y_project/RuoYi-Vue/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
</p>
检测中心LIMS新后端
## å¹³å°ç®€ä»‹
若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
* å‰ç«¯é‡‡ç”¨Vue、Element UI。
* åŽç«¯é‡‡ç”¨Spring Boot、Spring Security、Redis & Jwt。
* æƒé™è®¤è¯ä½¿ç”¨Jwt,支持多终端认证系统。
* æ”¯æŒåŠ è½½åŠ¨æ€æƒé™èœå•ï¼Œå¤šæ–¹å¼è½»æ¾æƒé™æŽ§åˆ¶ã€‚
* é«˜æ•ˆçŽ‡å¼€å‘ï¼Œä½¿ç”¨ä»£ç ç”Ÿæˆå™¨å¯ä»¥ä¸€é”®ç”Ÿæˆå‰åŽç«¯ä»£ç ã€‚
* æä¾›äº†æŠ€æœ¯æ ˆï¼ˆ[Vue3](https://v3.cn.vuejs.org) [Element Plus](https://element-plus.org/zh-CN) [Vite](https://cn.vitejs.dev))版本[RuoYi-Vue3](https://gitcode.com/yangzongzhuan/RuoYi-Vue3),保持同步更新。
* æä¾›äº†å•应用版本[RuoYi-Vue-fast](https://gitcode.com/yangzongzhuan/RuoYi-Vue-fast),Oracle版本[RuoYi-Vue-Oracle](https://gitcode.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。
* ä¸åˆ†ç¦»ç‰ˆæœ¬ï¼Œè¯·ç§»æ­¥[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud)
* é˜¿é‡Œäº‘折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)&nbsp;&nbsp;
## å†…置功能
1.  ç”¨æˆ·ç®¡ç†ï¼šç”¨æˆ·æ˜¯ç³»ç»Ÿæ“ä½œè€…,该功能主要完成系统用户配置。
2.  éƒ¨é—¨ç®¡ç†ï¼šé…ç½®ç³»ç»Ÿç»„织机构(公司、部门、小组),树结构展现支持数据权限。
3.  å²—位管理:配置系统用户所属担任职务。
4.  èœå•管理:配置系统菜单,操作权限,按钮权限标识等。
5.  è§’色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
6.  å­—典管理:对系统中经常使用的一些较为固定的数据进行维护。
7.  å‚数管理:对系统动态配置常用参数。
8.  é€šçŸ¥å…¬å‘Šï¼šç³»ç»Ÿé€šçŸ¥å…¬å‘Šä¿¡æ¯å‘布维护。
9.  æ“ä½œæ—¥å¿—:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
10. ç™»å½•日志:系统登录日志记录查询包含登录异常。
11. åœ¨çº¿ç”¨æˆ·ï¼šå½“前系统中活跃用户状态监控。
12. å®šæ—¶ä»»åŠ¡ï¼šåœ¨çº¿ï¼ˆæ·»åŠ ã€ä¿®æ”¹ã€åˆ é™¤)任务调度包含执行结果日志。
13. ä»£ç ç”Ÿæˆï¼šå‰åŽç«¯ä»£ç çš„生成(java、html、xml、sql)支持CRUD下载 ã€‚
14. ç³»ç»ŸæŽ¥å£ï¼šæ ¹æ®ä¸šåŠ¡ä»£ç è‡ªåŠ¨ç”Ÿæˆç›¸å…³çš„api接口文档。
15. æœåŠ¡ç›‘æŽ§ï¼šç›‘è§†å½“å‰ç³»ç»ŸCPU、内存、磁盘、堆栈等相关信息。
16. ç¼“存监控:对系统的缓存信息查询,命令统计等。
17. åœ¨çº¿æž„建器:拖动表单元素生成相应的HTML代码。
18. è¿žæŽ¥æ± ç›‘视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。
## åœ¨çº¿ä½“验
- admin/admin123
- é™†é™†ç»­ç»­æ”¶åˆ°ä¸€äº›æ‰“赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。
演示地址:http://vue.ruoyi.vip
文档地址:http://doc.ruoyi.vip
## æ¼”示图
<table>
    <tr>
        <td><img src="https://oscimg.oschina.net/oscnet/cd1f90be5f2684f4560c9519c0f2a232ee8.jpg"/></td>
        <td><img src="https://oscimg.oschina.net/oscnet/1cbcf0e6f257c7d3a063c0e3f2ff989e4b3.jpg"/></td>
    </tr>
    <tr>
        <td><img src="https://oscimg.oschina.net/oscnet/up-8074972883b5ba0622e13246738ebba237a.png"/></td>
        <td><img src="https://oscimg.oschina.net/oscnet/up-9f88719cdfca9af2e58b352a20e23d43b12.png"/></td>
    </tr>
    <tr>
        <td><img src="https://oscimg.oschina.net/oscnet/up-39bf2584ec3a529b0d5a3b70d15c9b37646.png"/></td>
        <td><img src="https://oscimg.oschina.net/oscnet/up-936ec82d1f4872e1bc980927654b6007307.png"/></td>
    </tr>
    <tr>
        <td><img src="https://oscimg.oschina.net/oscnet/up-b2d62ceb95d2dd9b3fbe157bb70d26001e9.png"/></td>
        <td><img src="https://oscimg.oschina.net/oscnet/up-d67451d308b7a79ad6819723396f7c3d77a.png"/></td>
    </tr>
    <tr>
        <td><img src="https://oscimg.oschina.net/oscnet/5e8c387724954459291aafd5eb52b456f53.jpg"/></td>
        <td><img src="https://oscimg.oschina.net/oscnet/644e78da53c2e92a95dfda4f76e6d117c4b.jpg"/></td>
    </tr>
    <tr>
        <td><img src="https://oscimg.oschina.net/oscnet/up-8370a0d02977eebf6dbf854c8450293c937.png"/></td>
        <td><img src="https://oscimg.oschina.net/oscnet/up-49003ed83f60f633e7153609a53a2b644f7.png"/></td>
    </tr>
    <tr>
        <td><img src="https://oscimg.oschina.net/oscnet/up-d4fe726319ece268d4746602c39cffc0621.png"/></td>
        <td><img src="https://oscimg.oschina.net/oscnet/up-c195234bbcd30be6927f037a6755e6ab69c.png"/></td>
    </tr>
    <tr>
        <td><img src="https://oscimg.oschina.net/oscnet/b6115bc8c31de52951982e509930b20684a.jpg"/></td>
        <td><img src="https://oscimg.oschina.net/oscnet/up-5e4daac0bb59612c5038448acbcef235e3a.png"/></td>
    </tr>
</table>
## è‹¥ä¾å‰åŽç«¯åˆ†ç¦»äº¤æµç¾¤
QQ群: [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/已满-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![加入QQ群](https://img.shields.io/badge/已满-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![加入QQ群](https://img.shields.io/badge/已满-167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [![加入QQ群](https://img.shields.io/badge/已满-104748341-blue.svg)](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [![加入QQ群](https://img.shields.io/badge/已满-160110482-blue.svg)](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [![加入QQ群](https://img.shields.io/badge/已满-170801498-blue.svg)](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [![加入QQ群](https://img.shields.io/badge/已满-108482800-blue.svg)](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [![加入QQ群](https://img.shields.io/badge/已满-101046199-blue.svg)](https://jq.qq.com/?_wv=1027&k=SpyH2875) [![加入QQ群](https://img.shields.io/badge/已满-136919097-blue.svg)](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [![加入QQ群](https://img.shields.io/badge/已满-143961921-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [![加入QQ群](https://img.shields.io/badge/已满-174951577-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [![加入QQ群](https://img.shields.io/badge/已满-161281055-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [![加入QQ群](https://img.shields.io/badge/已满-138988063-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) [![加入QQ群](https://img.shields.io/badge/已满-151450850-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DkugnCg68PevlycJSKSwjhFqfIgrWWwR&authKey=pR1Pa5lPIeGF%2FFtIk6d%2FGB5qFi0EdvyErtpQXULzo03zbhopBHLWcuqdpwY241R%2F&noverify=0&group_code=151450850) [![加入QQ群](https://img.shields.io/badge/已满-224622315-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=F58bgRa-Dp-rsQJThiJqIYv8t4-lWfXh&authKey=UmUs4CVG5OPA1whvsa4uSespOvyd8%2FAr9olEGaWAfdLmfKQk%2FVBp2YU3u2xXXt76&noverify=0&group_code=224622315) [![加入QQ群](https://img.shields.io/badge/已满-287842588-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Nxb2EQ5qozWa218Wbs7zgBnjLSNk_tVT&authKey=obBKXj6SBKgrFTJZx0AqQnIYbNOvBB2kmgwWvGhzxR67RoRr84%2Bus5OadzMcdJl5&noverify=0&group_code=287842588) [![加入QQ群](https://img.shields.io/badge/187944233-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=numtK1M_I4eVd2Gvg8qtbuL8JgX42qNh&authKey=giV9XWMaFZTY%2FqPlmWbkB9g3fi0Ev5CwEtT9Tgei0oUlFFCQLDp4ozWRiVIzubIm&noverify=0&group_code=187944233) ç‚¹å‡»æŒ‰é’®å…¥ç¾¤ã€‚
basic-server/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ruoyi</artifactId>
        <groupId>com.ruoyi</groupId>
        <version>3.8.9</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>basic-server</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-framework</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-system</artifactId>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
</project>
basic-server/src/main/java/com/ruoyi/basic/controller/CapacityScopeController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,393 @@
package com.ruoyi.basic.controller;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.poi.excel.ExcelUtil;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.system.service.ISysDictTypeService;
import com.ruoyi.basic.dto.PageTestObjectDto;
import com.ruoyi.basic.dto.ProductDTO1;
import com.ruoyi.basic.excel.StructureTestObjectData;
import com.ruoyi.basic.excel.StructureTestObjectListener;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.StandardTemplate;
import com.ruoyi.basic.pojo.StructureItemParameter;
import com.ruoyi.basic.pojo.StructureTestObject;
import com.ruoyi.basic.service.CapacityScopeService;
import com.ruoyi.basic.service.ProductService;
import com.ruoyi.basic.service.StandardTemplateService;
import com.ruoyi.basic.service.StructureItemParameterService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
 * æ£€éªŒé¡¹ç›®å‚æ•°(StructureItemParameter)表控制层
 *
 * @author makejava
 * @since 2024-02-26 16:21:17
 */
@Api(tags = "能力范围")
@AllArgsConstructor
@RestController
@RequestMapping("/capacityScope")
public class CapacityScopeController {
    private CapacityScopeService capacityScopeService;
    private ProductService productService;
    private StructureItemParameterService structureItemParameterService;
    private ISysDictTypeService dictTypeService;
    private StandardTemplateService standardTemplateService;
    @ApiOperation(value = "获取项目检验参数列表")
    @PostMapping("/selectItemParameterList")
    public Result selectItemParameterList(Page page,StructureItemParameter itemParameter) throws Exception {
        return Result.success(capacityScopeService.selectItemParameterList(page, itemParameter));
    }
    @ApiOperation(value = "添加项目检验参数")
    @PostMapping("/addItemParameter")
    public Result addItemParameter(@RequestBody StructureItemParameter itemParameter) {
        return Result.success(capacityScopeService.addItemParameter(itemParameter));
    }
    @ApiOperation(value = "删除项目检验参数")
    @PostMapping("/delItemParameter")
    public Result<?> delItemParameter(Integer id) {
        return Result.success(capacityScopeService.delItemParameter(id));
    }
    @ApiOperation(value = "修改项目检验参数")
    @PostMapping("/upItemParameter")
    public Result<?> upItemParameter(@RequestBody StructureItemParameter itemParameter) {
        return Result.success(capacityScopeService.upItemParameter(itemParameter));
    }
    @ApiOperation(value = "获取检验对象")
    @PostMapping("/selectTestObjectList")
    public Result selectTestObjectList(Page page,PageTestObjectDto pageTestObjectDto) throws Exception {
        return Result.success(capacityScopeService.selectTestObjectList(page, pageTestObjectDto));
    }
    @ApiOperation(value = "添加检验对象")
    @PostMapping("/addTestObject")
    public Result addTestObject(@RequestBody StructureTestObject testObject) {
        return Result.success(capacityScopeService.addTestObject(testObject));
    }
    @ApiOperation(value = "删除检验对象")
    @PostMapping("/delTestObject")
    public Result<?> delTestObject(Integer id) {
        return Result.success(capacityScopeService.delTestObject(id));
    }
    @ApiOperation(value = "修改检验对象")
    @PostMapping("/upTestObject")
    public Result upTestObject(@RequestBody StructureTestObject testObject) {
        return Result.success(capacityScopeService.upTestObject(testObject));
    }
    @ApiOperation(value = "获取检验对象枚举")
    @GetMapping("/selectTestObjectByName")
    public Result selectTestObjectByName() {
        return Result.success(capacityScopeService.selectTestObjectByName());
    }
    @ApiOperation(value = "设备里面选择检验项目(树形结构)")
    @PostMapping("/getInsProduction")
    public Result getInsProduction() {
        return Result.success(capacityScopeService.getInsProduction());
    }
    @ApiOperation(value = "维护检验对象的产品")
    @PostMapping("/selectProductListByObjectId")
    public Result selectProductListByObjectId(Page page,ProductDTO1 productDTO) throws Exception {
        return Result.success(productService.selectProductListByObjectId(page, productDTO));
    }
    @ApiOperation(value = "添加产品")
    @PostMapping("/addProduct")
    public Result addProduct(@RequestBody Product product) {
        return Result.success(productService.addProduct(product));
    }
    @ApiOperation(value = "修改产品")
    @PostMapping("/upProduct")
    public Result upProduct(@RequestBody Product product) {
        return Result.success(productService.upProduct(product));
    }
    @ApiOperation(value = "删除产品")
    @PostMapping("/delProduct")
    public Result delProduct(Integer id) {
        return Result.success(productService.delProduct(id));
    }
    @ApiOperation(value = "获取检验对象树")
    @GetMapping("/getItemTree")
    public Result getItemTree() {
        return Result.success(capacityScopeService.getItemTree());
    }
    @ApiOperation(value = "装备导入检验项目")
    @PostMapping("/importEquipData")
    @Transactional
    public Result importEquipData(@RequestParam("file") MultipartFile file) throws Exception {
        InputStream inputStream = file.getInputStream();
        List<StructureItemParameter> lists = new ArrayList<>();
        AtomicReference<String> sample = new AtomicReference<>();
        ExcelUtil.readBySax(inputStream, -1, (i, l, list1) -> {
            if (l == 1) {
                sample.set(list1.get(1) + "");
            }
            if (l >= 1) {
                StructureItemParameter str = new StructureItemParameter();
                // æµ‹è¯•对象
                if (list1.get(1) == null) {
                    str.setSample(null);
                } else {
                    String brand = (String) list1.get(1);
                    StringBuilder builder = new StringBuilder();
                    builder.append("[");
                    // äº§å“
                    if (ObjectUtil.isNotEmpty(list1.get(2))) {
                        String production = (String) list1.get(2);
                        if (!production.contains(";")) {
                            builder.append(String.format("[\"%s\",\"%s\"]", brand, production));
                        } else {
                            Arrays.stream(production.split(";")).forEach(item -> {
                                builder.append(String.format("[\"%s\",\"%s\"],", brand, item));
                            });
                            builder.deleteCharAt(builder.length() - 1);
                        }
                    } else {
                        builder.append("[");
                        builder.append(String.format("\"%s\"", brand));
                        builder.append("]");
                    }
                    builder.append("]");
                    str.setSample(builder.toString());
                }
                // æ£€éªŒé¡¹
                str.setInspectionItem(list1.get(4).toString().trim());
                // æ£€éªŒé¡¹è‹±æ–‡
                if (list1.get(5) != null) {
                    str.setInspectionItemEn(list1.get(5).toString());
                }
                // æ£€éªŒå­é¡¹
                if (list1.get(6) == null) {
                    str.setInspectionItemSubclass(null);
                } else {
                    str.setInspectionItemSubclass(list1.get(6).toString().trim());
                }
                // æ£€éªŒå­é¡¹è‹±æ–‡
                if (list1.get(7) == null) {
                    str.setInspectionItemSubclassEn(null);
                } else {
                    str.setInspectionItemSubclassEn(String.valueOf(list1.get(7).toString()));
                }
                // æ£€éªŒé¡¹åˆ†ç±»
                if (list1.get(22) != null && list1.get(22) != "") {
                    str.setInspectionItemClass(list1.get(22).toString().trim());
                } else {
                    str.setInspectionItemClass(null);
                }
                // æ£€éªŒé¡¹åˆ†ç±»è‹±æ–‡
                if (list1.get(23) != null && list1.get(23) != "") {
                    str.setInspectionItemClassEn(list1.get(23) + "");
                } else {
                    str.setInspectionItemClassEn(null);
                }
                LambdaQueryWrapper<StructureItemParameter> wrapper = Wrappers.lambdaQuery(StructureItemParameter.class)
                        .eq(StructureItemParameter::getInspectionItem, str.getInspectionItem())
                        .eq(StructureItemParameter::getSample, str.getSample())
                        .last("limit 1");
                // åˆ¤æ–­æ˜¯å¦æœ‰æ£€éªŒé¡¹ç±»åž‹
                if (ObjectUtils.isNotEmpty(str.getInspectionItemClass())) {
                    wrapper.eq(StructureItemParameter::getInspectionItemClass, str.getInspectionItemClass());
                }
                // åˆ¤æ–­æ˜¯å¦æœ‰æ£€éªŒå­é¡¹
                if (ObjectUtils.isNotEmpty(str.getInspectionItemSubclass())) {
                    wrapper.eq(StructureItemParameter::getInspectionItemSubclass, str.getInspectionItemSubclass());
                }
                StructureItemParameter db_str = structureItemParameterService.getOne(wrapper);
                if (ObjectUtils.isNotEmpty(db_str)) {
                    str.setId(db_str.getId());
                }
                // æ–¹æ³•名称
                if (list1.get(8) == null) {
                    str.setMethod(null);
                } else {
                    StringBuffer buffer = new StringBuffer();
                    String input = list1.get(8).toString();
                    buffer.append("[");
                    String[] values = input.split(";");
                    for (String value : values) {
                        buffer.append("\"").append(value.trim()).append("\",");
                    }
                    buffer.deleteCharAt(buffer.length() - 1);
                    buffer.append("]");
                    str.setMethod(buffer.toString());
                }
                // è¯•验室
                if (list1.get(9) == null) {
                    str.setSonLaboratory(null);
                } else {
                    str.setSonLaboratory(list1.get(9).toString());
                }
                // è®¡é‡å•位
                if (list1.get(10) == null) {
                    str.setUnit(null);
                } else {
                    str.setUnit(list1.get(10).toString());
                }
                // è¦æ±‚值
                if (list1.get(11) == null) {
                    str.setAskTell(null);
                } else {
                    str.setAskTell(list1.get(11).toString());
                }
                // è¦æ±‚描述
                if (list1.get(12) == null) {
                    str.setAsk(null);
                } else {
                    str.setAsk(list1.get(12).toString());
                }
                // å•ä»·
                if (list1.get(13) == null) {
                    str.setPrice(null);
                } else {
                    str.setPrice(list1.get(13) + "");
                }
                // å·¥æ—¶ç³»æ•°
                if (list1.get(14) == null) {
                    str.setManHour(null);
                } else {
                    str.setManHour(Double.valueOf(list1.get(14).toString()));
                }
                // å·¥æ—¶åˆ†ç»„
                if (list1.get(15) == null) {
                    str.setManHourGroup(null);
                } else {
                    str.setManHourGroup(list1.get(15).toString());
                }
                // é¢„计完成时间
                if (list1.get(16) == null) {
                    str.setManDay(null);
                } else {
                    str.setManDay(Integer.valueOf(list1.get(16).toString()));
                }
                // æ•°æ®ç±»åž‹
                String jy;
                if (list1.get(17).toString().equals("非采集类型")) {
                    jy = "0";
                } else {
                    jy = "1";
                }
                str.setInspectionItemType(jy);
                // æ£€éªŒé¡¹ç±»åž‹
                String validateValueType = list1.get(18).toString();
                if (ObjectUtils.isNotEmpty(validateValueType)) {
                    List<SysDictData> enums = dictTypeService.selectDictDataByName("检验值类型")
                            .stream().filter(sysDictData -> sysDictData.getDictLabel().equals(validateValueType)).collect(Collectors.toList());
                    str.setInspectionValueType(enums.get(0).getDictValue());
                }
                int bsm;
                //特殊标识
                if (list1.get(19).toString().equals("否")) {
                    bsm = 0;
                } else {
                    bsm = 1;
                }
                str.setBsm(bsm + "");
                // æ•°å­—å­—å…¸
                if (list1.get(20) != null) {
                    str.setDic(list1.get(20) + "");
                } else {
                    str.setDic(null);
                }
                // åŽŸå§‹è®°å½•æ¨¡æ¿
                StandardTemplate standTempIdByName = standardTemplateService.getStandTempIdByName(String.valueOf(list1.get(21)));
                if (standTempIdByName != null) {
                    str.setTemplateId(standTempIdByName.getId());
                } else {
                    str.setTemplateId(null);
                }
                try {
                    if (list1.get(24) != null) {
                        str.setLaboratory(list1.get(24) + "");
                    }
                } catch (Exception e) {
                }
                // æ¡ä»¶
                if (list1.get(25) == null) {
                    str.setRadiusList(null);
                } else {
                    StringBuffer buffer = new StringBuffer();
                    String input = list1.get(25).toString();
                    buffer.append("[");
                    String[] values = input.split(";");
                    for (String value : values) {
                        buffer.append("\"").append(value.trim()).append("\",");
                    }
                    buffer.deleteCharAt(buffer.length() - 1);
                    buffer.append("]");
                    str.setRadiusList(buffer.toString());
                }
                // æ”¶è´¹æ ‡å‡†
                if (list1.get(26) == null) {
                    str.setRates(null);
                } else {
                    str.setRates(list1.get(26) + "");
                }
                lists.add(str);
            }
        });
//        structureItemParameterService.removeNoSample(sample.get());
        // å¦‚果数据库里面的数据存在那么就执行更新拷贝操作
        try {
            structureItemParameterService.saveOrUpdateBatch(lists);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("服务端报错");
        }
        return Result.success();
    }
    @ApiOperation(value = "导入检验对象")
    @PostMapping("/importExcel")
    public Result importExcel(@RequestParam("file") MultipartFile file) {
        try {
            EasyExcel.read(file.getInputStream(), StructureTestObjectData.class, new StructureTestObjectListener(productService)).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Result.success();
    }
}
basic-server/src/main/java/com/ruoyi/basic/controller/CertificationController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.basic.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.basic.pojo.Certification;
import com.ruoyi.basic.service.CertificationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "资质说明")
@AllArgsConstructor
@RestController
@RequestMapping("/certification")
public class CertificationController {
    private CertificationService certificationService;
    @ApiOperation(value = "查询资质明细列表")
    @PostMapping("/getCertificationDetail")
    public Result getCertificationDetail(Page page,Certification certification) {
        return Result.success(certificationService.getCertificationDetail(page, certification));
    }
    @ApiOperation(value = "添加资质明细列表")
    @PostMapping("/addCertificationDetail")
    public Result addCertificationDetail(@RequestBody Certification certification) {
        return Result.success(certificationService.addCertificationDetail(certification));
    }
    @ApiOperation(value = "删除资质明细列表")
    @PostMapping("/delCertificationDetail")
    public Result<?> delCertificationDetail( String ids) {
        return Result.success(certificationService.delCertificationDetail(ids));
    }
}
basic-server/src/main/java/com/ruoyi/basic/controller/LaboratoryController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ruoyi.basic.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.basic.pojo.Laboratory;
import com.ruoyi.basic.service.LaboratoryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
 * å®žéªŒå®¤ç®¡ç†(LaboratoryController)表控制层
 */
@Api(tags = "场所或设施")
@RestController
@RequestMapping("/laboratoryScope")
public class LaboratoryController {
    @Resource
    private LaboratoryService laboratoryService;
    @ApiOperation(value = "查询实验室管理列表")
    @PostMapping("/selectItemParameter")
    public Result selectItemParameter(Page page ,Laboratory itemParameter) {
        return Result.success(laboratoryService.selectItemParameter(page, itemParameter));
    }
    @ApiOperation(value = "添加实验室参数")
    @PostMapping("/addParameter")
    public Result addParameter(@RequestBody Laboratory itemParameter) {
        return Result.success(laboratoryService.addParameter(itemParameter));
    }
    @ApiOperation(value = "删除实验室参数")
    @PostMapping("/delParameter")
    public Result<?> delParameter(Integer id) {
        return Result.success(laboratoryService.delParameter(id));
    }
    @ApiOperation(value = "修改实验室参数")
    @PostMapping("/upParameter")
    public Result<?> upParameter(@RequestBody Laboratory itemParameter) {
        return Result.success(laboratoryService.upParameter(itemParameter));
    }
    @ApiOperation(value = "获取实验室名称")
    @GetMapping("/obtainItemParameterList")
    public Result obtainItemParameterList() {
        return Result.success(laboratoryService.obtainItemParameterList());
    }
}
basic-server/src/main/java/com/ruoyi/basic/controller/ProductPartController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.ruoyi.basic.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.basic.pojo.ProductPart;
import com.ruoyi.basic.service.ProductPartService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@AllArgsConstructor
@RequestMapping("/productPart")
@Api(tags = "产品零件绑定")
public class ProductPartController {
    private ProductPartService productPartService;
    @ApiOperation(value = "根据产品id查询零件")
    @PostMapping("/selectByProductId")
    public Result selectByProductId(Page page,ProductPart productPart){
        return Result.success(productPartService.selectByProductId(page,productPart));
    }
    @ApiOperation(value = "新增产品零件")
    @PostMapping("/addProductPart")
    public Result addProductPart(@RequestBody ProductPart productPart) {
        productPartService.addProductPart(productPart);
        return Result.success();
    }
    @ApiOperation(value = "更新产品零件")
    @PostMapping("/updateProductPart")
    public Result updateProductPart(@RequestBody ProductPart productPart) {
        productPartService.updateProductPartById(productPart);
        return Result.success();
    }
    @ApiOperation(value = "删除产品零件")
    @PostMapping("/deleteProductPart")
    public Result deleteProductPart(Integer id) {
        productPartService.removeById(id);
        return Result.success();
    }
}
basic-server/src/main/java/com/ruoyi/basic/controller/ProductSupplierDensityController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.ruoyi.basic.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.basic.pojo.ProductSupplierDensity;
import com.ruoyi.basic.service.ProductSupplierDensityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * äº§å“åŽ‚å®¶å¯†åº¦ç»‘å®šè¡¨
 *
 * @author zhuo
 * @since 2024-09-19
 */
@RestController
@RequestMapping("/productSupplierDensity")
@AllArgsConstructor
@Api(tags = "产品厂家密度绑定")
public class ProductSupplierDensityController {
    private ProductSupplierDensityService productSupplierDensityService;
    @ApiOperation(value = "根据产品id查询厂家密度绑定")
    @PostMapping("/selectSupplierDensityByProductId")
    public Result selectSupplierDensityByProductId(Page page,ProductSupplierDensity supplierDensity) {
        return Result.success(productSupplierDensityService.selectByProductId(page, supplierDensity));
    }
    @ApiOperation(value = "新增厂家密度绑定")
    @PostMapping("/addProductSupplierDensity")
    public Result addProductSupplierDensity(@RequestBody ProductSupplierDensity supplierDensity) {
        productSupplierDensityService.addProductSupplierDensity(supplierDensity);
        return Result.success();
    }
    @ApiOperation(value = "更新厂家密度绑定")
    @PostMapping("/updateProductSupplierDensity")
    public Result updateProductSupplierDensity(@RequestBody ProductSupplierDensity supplierDensity) {
        productSupplierDensityService.updateProductSupplierDensity(supplierDensity);
        return Result.success();
    }
    @ApiOperation(value = "删除厂家密度绑定")
    @PostMapping("/deleteProductSupplierDensity")
    public Result deleteProductSupplierDensity(Integer id) {
        productSupplierDensityService.removeById(id);
        return Result.success();
    }
}
basic-server/src/main/java/com/ruoyi/basic/controller/SealController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.ruoyi.basic.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.Laboratory;
import com.ruoyi.basic.pojo.Seal;
import com.ruoyi.basic.service.SealService;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.utils.JackSonUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
 * å°ç« ç®¡ç†(SealController)表控制层
 */
@Api(tags = "印章管理")
@RestController
@RequestMapping("/sealScope")
public class SealController {
    @Resource
    private SealService sealService;
    @ApiOperation(value = "添加印章参数")
    @PostMapping("/addSeal")
    public Result addSeal(@RequestBody Seal seal) {
        int i = sealService.addSeal(seal);
        if(i>0){
            Integer labId = seal.getLabId();
            List<Laboratory> laboratory = sealService.Laboratory(labId);
            return Result.success(laboratory);
        }else{
            return Result.fail();
        }
    }
    @ApiOperation(value="查询印章列表")
    @PostMapping("/selectSeal")
    public  Result selectSeal(Page page,Seal seal) {
        return Result.success(sealService.selectSeal(page,seal));
    }
}
basic-server/src/main/java/com/ruoyi/basic/controller/StandardMethodController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.ruoyi.basic.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.basic.pojo.StandardMethod;
import com.ruoyi.basic.service.StandardMethodService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@Api(tags = "标准方法")
@RestController
@RequestMapping("/standardMethod")
@AllArgsConstructor
public class StandardMethodController {
    private StandardMethodService standardMethodService;
    @ApiOperation(value = "获取标准方法列表")
    @PostMapping("/selectStandardMethodList")
    public Result selectStandardMethodList(Page page,StandardMethod standardMethod) throws Exception {
        return Result.success(standardMethodService.selectStandardMethodList(page, standardMethod));
    }
    @ApiOperation(value = "获取标准方法枚举")
    @GetMapping("/selectStandardMethods")
    public Result selectStandardMethods(){
        return Result.success(standardMethodService.selectStandardMethods());
    }
    @ApiOperation(value = "添加标准方法")
    @PostMapping("/addStandardMethod")
    public Result addStandardMethod(@RequestBody StandardMethod standardMethod) {
        return Result.success(standardMethodService.addStandardMethod(standardMethod));
    }
    @ApiOperation(value = "删除标准方法")
    @PostMapping("/delStandardMethod")
    public Result<?> delStandardMethod(Integer id) {
        return Result.success(standardMethodService.delStandardMethod(id));
    }
    @ApiOperation(value = "修改标准方法")
    @PostMapping("/upStandardMethod")
    public Result<?> upStandardMethod(@RequestBody StandardMethod standardMethod) {
        return Result.success(standardMethodService.upStandardMethod(standardMethod));
    }
    @ApiOperation(value = "导入标准明细")
    @PostMapping("/importStandardDetails")
    public Result<?> importStandardDetails(@RequestPart("file") MultipartFile file) throws IOException {
        standardMethodService.inputExcel(file);
        return Result.success();
    }
}
basic-server/src/main/java/com/ruoyi/basic/controller/StandardTemplateController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package com.ruoyi.basic.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.basic.pojo.StandardTemplate;
import com.ruoyi.basic.service.StandardTemplateService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
@RequestMapping("/StandardTemplate")
@RestController
@AllArgsConstructor
@Api(tags = "原始记录模板")
public class StandardTemplateController {
    private StandardTemplateService standardTemplateService;
    @ApiOperation(value = "获取原始记录模板列表")
    @PostMapping("/selectStandardTemplatePageList")
    public Result selectStandardTemplatePageList(Page page,StandardTemplate standardTemplate) throws Exception {
        return Result.success(standardTemplateService.selectStandardTemplatePageList(page, standardTemplate));
    }
    @ApiOperation(value = "添加原始记录模板")
    @PostMapping("/addStandardTemplate")
    public Result addStandardTemplate(@RequestBody StandardTemplate standardTemplate) {
        return Result.success(standardTemplateService.addStandardTemplate(standardTemplate));
    }
    @ApiOperation(value = "修改原始记录模板")
    @PostMapping("/upStandardTemplate")
    public Result<?> upStandardTemplate(@RequestBody StandardTemplate standardTemplate) {
        return Result.success(standardTemplateService.upStandardTemplate(standardTemplate));
    }
    @ApiOperation(value = "删除原始记录模板")
    @PostMapping("/delStandardTemplate")
    public Result<?> delStandardTemplate(Integer id) {
        return Result.success(standardTemplateService.delStandardTemplate(id));
    }
    @ApiOperation(value = "查询原始记录模板枚举")
    @GetMapping("/getStandardTemplate")
    public Result<?> getStandardTemplate() {
        return Result.success(standardTemplateService.getStandardTemplate());
    }
    @ApiOperation(value = "通过模板id获取检验项模板内容")
    @PostMapping("/getStandTempThingById")
    public Result<?> getStandTempThingById(Integer id) {
        return Result.success(standardTemplateService.getStandTempThingById(id));
    }
    @ApiOperation(value = "编辑模板编制")
    @GetMapping("/getEditTemplatePreparation")
    public Result<?> getEditTemplatePreparation(@RequestParam("id") Integer id) {
        StandardTemplate byId = standardTemplateService.getById(id);
        return Result.success("OK", byId.getThing());
    }
    @ApiOperation(value = "复制原始记录模板")
    @PostMapping("/copyStandardTemplate")
    public Result copyStandardTemplate(@RequestBody StandardTemplate newTemplate) {
        return Result.success(standardTemplateService.copyStandardTemplate(newTemplate));
    }
}
basic-server/src/main/java/com/ruoyi/basic/controller/StandardTreeController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,276 @@
package com.ruoyi.basic.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.basic.dto.CopyStandardProductListDto;
import com.ruoyi.basic.dto.FactoryDto;
import com.ruoyi.basic.dto.InsSampleReceiveDto;
import com.ruoyi.basic.dto.ResetTreeDragDTO;
import com.ruoyi.basic.pojo.StandardProductList;
import com.ruoyi.basic.pojo.StandardProductListSupplierAsk;
import com.ruoyi.basic.pojo.StandardTree;
import com.ruoyi.basic.service.StandardMethodListService;
import com.ruoyi.basic.service.StandardProductListService;
import com.ruoyi.basic.service.StandardProductListSupplierAskService;
import com.ruoyi.basic.service.StandardTreeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
@RestController
@AllArgsConstructor
@RequestMapping("/standardTree")
@Api(tags = "标准库")
public class StandardTreeController {
    private StandardTreeService standardTreeService;
    private StandardMethodListService standardMethodListService;
    private StandardProductListService standardProductListService;
    private StandardProductListSupplierAskService standardProductListSupplierAskService;
    @ApiOperation(value = "获取标准树")
    @GetMapping("/selectStandardTreeList")
    public Result selectStandardTreeList() {
        return Result.success(standardTreeService.selectStandardTreeList());
    }
    @ApiOperation(value = "获取标准树(检验下单)")
    @GetMapping("/selectStandardTreeList2")
    public Result selectStandardTreeList2() {
        return Result.success(standardTreeService.selectStandardTreeList());
    }
    @ApiOperation(value = "添加标准树")
    @PostMapping("/addStandardTree")
    public Result addStandardTree(@RequestBody StandardTree standardTree) {
        return Result.success(standardTreeService.addStandardTree(standardTree));
    }
    @ApiOperation(value = "给标准树添加检验标准")
    @PostMapping("/addStandardMethodList")
    public Result addStandardMethodList(String tree, Integer standardId) {
        return Result.success(standardMethodListService.addStandardMethodList(standardId, tree));
    }
    @ApiOperation(value = "根据标准树进行标准查询")
    @PostMapping("/selectsStandardMethodByFLSSM")
    public Result selectsStandardMethodByFLSSM(String tree) {
        return Result.success(standardMethodListService.selectsStandardMethodByFLSSM(tree));
    }
    @ApiOperation(value = "修改标准库中的内容")
    @PostMapping("/upStandardProductList")
    public Result upStandardProductList(String str) {
        StandardProductList list = JSON.parseObject(str, StandardProductList.class);
        return Result.success(standardProductListService.upStandardProductList(list));
    }
    @ApiOperation(value = "修改标准库区间")
    @PostMapping("/updateSection")
    public Result updateSection(String str) {
        StandardProductList list = JSON.parseObject(str, StandardProductList.class);
        return Result.success(standardProductListService.updateSection(list));
    }
    @ApiOperation(value = "删除标准树下的检验标准")
    @PostMapping("/delStandardMethodByFLSSM")
    public Result delStandardMethodByFLSSM(Integer id) {
        return Result.success(standardMethodListService.delStandardMethodByFLSSM(id));
    }
    @ApiOperation(value = "删除标准树下的检验项目")
    @PostMapping("/delStandardProductByIds")
    public Result delStandardProductByIds(String ids) {
        JSONArray lists = JSON.parseArray(ids);
        return Result.success(standardProductListService.delStandardProduct(lists));
    }
    @ApiOperation(value = "新增标准树下的检验项目")
    @PostMapping("/addStandardProduct")
    public Result addStandardProduct(String ids, String tree) {
        return Result.success(standardTreeService.addStandardProduct(ids, tree));
    }
    @ApiOperation(value = "删除标准树的层级")
    @PostMapping("/delStandardTree")
    public Result delStandardTree(String tree) {
        return Result.success(standardTreeService.delStandardTree(tree));
    }
    @ApiOperation(value = "通过标准树查询对应的检验项目")
    @PostMapping("/selectStandardProductList")
    public Result selectStandardProductList(@RequestBody InsSampleReceiveDto insSample) {
        return Result.success(standardProductListService.selectStandardProductList(insSample));
    }
    @ApiOperation(value = "通过检验标准查询检验项目")
    @PostMapping("/selectStandardProductListByMethodId")
    public Result selectStandardProductListByMethodId(Integer id, String tree, Integer page) {
        return Result.success(standardProductListService.selectStandardProductListByMethodId(id, tree, page));
    }
    @ApiOperation(value = "批量编辑查询检验项目")
    @PostMapping("/selectStandardProductByMethodId")
    public Result selectStandardProductByMethodId(Integer id, String tree, Integer page, String laboratory, String item, String items) {
        return Result.success(standardProductListService.selectStandardProductByMethodId(id, tree, page, laboratory, item, items));
    }
    @ApiOperation(value = "批量编辑查询所有检验项目和检验子项枚举")
    @PostMapping("/selectStandardProductEnumByMethodId")
    public Result selectStandardProductEnumByMethodId(Integer id, String tree, String item) {
        return Result.success(standardProductListService.selectStandardProductEnumByMethodId(id, tree, item));
    }
    @ApiOperation(value = "获取标准树下标准方法枚举")
    @GetMapping("/selectStandardMethodEnum")
    public Result selectStandardMethodEnum() {
        return Result.success(standardMethodListService.selectStandardMethodEnum());
    }
    @ApiOperation(value = "获取产品架构")
    @GetMapping("/getStandardTree2")
    public Result getStandardTree2() {
        return Result.success(standardTreeService.getStandardTree2());
    }
    @ApiOperation(value = "批量修改项目内容")
    @PostMapping("/upStandardProducts")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "standardProductList", dataTypeClass = StandardProductList.class),
            @ApiImplicitParam(name = "ids", dataTypeClass = Integer.class)
    })
    public Result upStandardProducts(@RequestBody Map<String, Object> product) {
        return Result.success(standardTreeService.upStandardProducts(product));
    }
    @PostMapping("/getStandTreeBySampleType")
    @ApiOperation("仅获取光纤的型号")
    public Result<?> getStandTreeBySampleType(String laboratory, String sampleType) {
        return Result.success(standardTreeService.getStandTreeBySampleType(laboratory, sampleType));
    }
    @ApiOperation("导入标准库")
    @PostMapping("/inExcelOfTree/{isEquipment}")
    public Result inExcelOfTree(@RequestParam("file") MultipartFile file, @PathVariable("isEquipment") Boolean isEquipment) {
        if (!isEquipment) {
            standardTreeService.inExcelOfTree(file);
        } else {
            standardTreeService.importWorkstationExcel(file);
        }
        return Result.success();
    }
    @ApiOperation("重置标准库单价")
    @PostMapping("/resetTreeOfPrice")
    public Result resetTreeOfPrice(String tree, Integer standardId) {
        standardTreeService.resetTreeOfPrice(tree, standardId);
        return Result.success();
    }
    @ApiOperation("重置标准库工时系数")
    @PostMapping("/resetTreeOfHour")
    public Result resetTreeOfHour(String tree, Integer standardId) {
        standardTreeService.resetTreeOfHour(tree, standardId);
        return Result.success();
    }
    @ApiOperation("重置标准库要求描述和要求值")
    @PostMapping("/resetTreeOfAsk")
    public Result resetTreeOfAsk(String tree, Integer standardId) {
        standardTreeService.resetTreeOfAsk(tree, standardId);
        return Result.success();
    }
    @ApiOperation("标准库拖拽")
    @PostMapping("/resetTreeDrag")
    public Result resetTreeDrag(@RequestBody ResetTreeDragDTO resetTreeDragDTO) {
        standardProductListService.resetTreeDrag(resetTreeDragDTO);
        return Result.success();
    }
    @ApiOperation("标准库拖拽全部")
    @PostMapping("/resetTreeDragBatch")
    public Result resetTreeDragBatch(@RequestBody Map<String, Object> params) {
        List<StandardProductList> standardProductLists = (List<StandardProductList>) params.get("params");
        standardProductListService.resetTreeDragBatch(standardProductLists);
        return Result.success();
    }
    @ApiOperation(value = "标准树排序")
    @PostMapping("/updateTreeSort")
    public Result updateTreeSort(@RequestBody List<FactoryDto> list) {
        return Result.success(standardTreeService.updateTreeSort(list));
    }
    /*************************************************** åŽ‚å®¶ç‰¹æ®Šè¦æ±‚å€¼å¤„ç† ************************************************************/
    @ApiOperation(value = "根据产品id查询厂家要求值绑定")
    @PostMapping("/selectSupplierAsk")
    public Result selectSupplierAsk(StandardProductListSupplierAsk supplierAsk) throws Exception {
        return Result.success(standardProductListSupplierAskService.selectByProductId(supplierAsk));
    }
    @ApiOperation(value = "新增厂家要求值绑定")
    @PostMapping("/addProductSupplierAsk")
    public Result addProductSupplierAsk(String str) {
        StandardProductListSupplierAsk supplierAsk = JSON.parseObject(str, StandardProductListSupplierAsk.class);
        return Result.success(standardProductListSupplierAskService.addProductSupplierAsk(supplierAsk));
    }
    @ApiOperation(value = "更新厂家要求值绑定")
    @PostMapping("/updateProductSupplierAsk")
    public Result updateProductSupplierAsk(String str) {
        StandardProductListSupplierAsk supplierAsk = JSON.parseObject(str, StandardProductListSupplierAsk.class);
        standardProductListSupplierAskService.updateProductSupplierAsk(supplierAsk);
        return Result.success();
    }
    @ApiOperation(value = "删除厂家要求值绑定")
    @PostMapping("/deleteProductSupplierAsk")
    public Result deleteProductSupplierAsk(Integer supplierAskId) {
        standardProductListSupplierAskService.removeById(supplierAskId);
        return Result.success();
    }
    @ApiOperation(value = "修改标准树")
    @PostMapping("/updateStandardTree")
    public Result updateStandardTree(@RequestBody StandardTree standardTree) {
        return Result.success(standardTreeService.updateStandardTree(standardTree));
    }
    @ApiOperation(value = "检验项要求值复制对比")
    @PostMapping("/copyStandardProductList")
    public Result copyStandardProductList(@RequestBody CopyStandardProductListDto copyStandardProductListDto) {
        return Result.success(standardProductListService.copyStandardProductList(copyStandardProductListDto));
    }
    @ApiOperation(value = "检验项要求值单独对比")
    @PostMapping("/copyStandardProductOne")
    public Result copyStandardProductOne(@RequestBody CopyStandardProductListDto copyStandardProductListDto) {
        return Result.success(standardProductListService.copyStandardProductOne(copyStandardProductListDto));
    }
    @ApiOperation(value = "检验项批量修改要求值要求描述")
    @PostMapping("/updateStandardProductListBatch")
    public Result updateStandardProductListBatch(@RequestBody Map<String, Object> param) {
        List<StandardProductList> standardProductList = (List<StandardProductList>) param.get("standardProductList");
        return Result.success(standardProductListService.updateBatchById(standardProductList));
    }
    @ApiOperation(value = "检验项复制排序")
    @PostMapping("/copyStandardProductSort")
    public Result copyStandardProductSort(@RequestBody CopyStandardProductListDto copyStandardProductListDto) {
        return Result.success(standardProductListService.copyStandardProductSort(copyStandardProductListDto));
    }
}
basic-server/src/main/java/com/ruoyi/basic/controller/StructureTestObjectPartController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.ruoyi.basic.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.basic.pojo.StructureTestObjectPart;
import com.ruoyi.basic.service.StructureTestObjectPartService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * æ£€éªŒå¯¹è±¡é›¶ä»¶è¡¨
 *
 * @author zhuo
 * @since 2024-08-07
 */
@RestController
@RequestMapping("/structureTestObjectPart")
@AllArgsConstructor
@Api(tags = "检验对象零件表")
public class StructureTestObjectPartController {
    private StructureTestObjectPartService structureTestObjectPartService;
    @ApiOperation(value = "根据检验对象id查询零件")
    @PostMapping("/selectByTestObjectId")
    public Result selectByTestObjectId(Page page,StructureTestObjectPart structureTestObjectPart){
        return Result.success(structureTestObjectPartService.selectByTestObjectId(page,structureTestObjectPart));
    }
    @ApiOperation(value = "新增检验对象零件")
    @PostMapping("/addTestObjectPart")
    public Result addTestObjectPart(@RequestBody StructureTestObjectPart structureTestObjectPart) {
        structureTestObjectPartService.addTestObjectPart(structureTestObjectPart);
        return Result.success();
    }
    @ApiOperation(value = "更新检验对象零件")
    @PostMapping("/updateTestObjectPart")
    public Result updateTestObjectPart(@RequestBody StructureTestObjectPart structureTestObjectPart) {
        structureTestObjectPartService.updateTestObjectPart(structureTestObjectPart);
        return Result.success();
    }
    @ApiOperation(value = "删除检验对象零件")
    @PostMapping("/deleteTestObjectPart")
    public Result deleteTestObjectPart(Integer id) {
        structureTestObjectPartService.removeById(id);
        return Result.success();
    }
}
basic-server/src/main/java/com/ruoyi/basic/dto/CopyStandardProductListDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.basic.dto;
import com.ruoyi.basic.pojo.StandardProductList;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * æ ‡å‡†æ£€éªŒé¡¹å¤åˆ¶
 *
 * @Author zhuo
 * @Date 2024/10/31
 */
@Data
public class CopyStandardProductListDto {
    @ApiModelProperty("原本检验项信息")
    private List<StandardProductList> oldStandardProductList;
    @ApiModelProperty("需要对比的检验项信息")
    private List<StandardProductList> newStandardProductList;
}
basic-server/src/main/java/com/ruoyi/basic/dto/FactoryDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.basic.dto;
import lombok.Data;
import java.util.List;
@Data
public class FactoryDto {
    private String code = "[1]";
    private String label;
    private String value;
    private List<LaboratoryDto> children;
}
basic-server/src/main/java/com/ruoyi/basic/dto/IfsInventoryQuantityCheckDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,182 @@
package com.ruoyi.basic.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * åŽŸææ–™æŸ¥è¯¢, æŽ’除了供应商
 * @Author zhuo
 * @Date 2024/8/28
 */
@Data
public class IfsInventoryQuantityCheckDto  implements Serializable {
    private Integer id;
    @ApiModelProperty("域")
    private String contract;
    @ApiModelProperty("订单号")
    private String orderNo;
    @ApiModelProperty("行号")
    private String lineNo;
    @ApiModelProperty("下达号")
    private String releaseNo;
    @ApiModelProperty("接收号")
    private Integer receiptNo;
    @ApiModelProperty("零件号")
    private String partNo;
    @ApiModelProperty("零件描述")
    private String partDesc;
    @ApiModelProperty("状态描述")
    private String status;
    @ApiModelProperty("状态")
    private String statusDb;
    @ApiModelProperty("抵达的采购数量")
    private BigDecimal qtyArrived;
    @ApiModelProperty("已检验的购买数量")
    private BigDecimal qtyInspected;
    @ApiModelProperty("要检验的采购数量")
    private BigDecimal qtyToInspect;
    @ApiModelProperty("抵达的库存数量")
    private BigDecimal invQtyInStore;
    @ApiModelProperty("抵达的采购数量")
    private BigDecimal purQtyInStore;
    @ApiModelProperty("配置标识")
    private String configurationId;
    @ApiModelProperty("批号")
    private String lotBatchNo;
    @ApiModelProperty("wdr号")
    private String waivDevRejNo;
    @ApiModelProperty("活动序列")
    private Integer activitySeq;
    @ApiModelProperty("序列号")
    private String serialNo;
    @ApiModelProperty("库位号")
    private String locationNo;
    @ApiModelProperty("版本号")
    private String engChgLevel;
    @ApiModelProperty("接收人")
    private String receiver;
    @ApiModelProperty("接收人姓名")
    private String receiverName;
    @ApiModelProperty("采购员")
    private String buyerCode;
    @ApiModelProperty("采购员姓名")
    private String buyerName;
    @ApiModelProperty("实际到货日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime arriveDate;
    @ApiModelProperty("实际交货日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime deliveryDate;
    @ApiModelProperty("生产日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime productDate;
    @ApiModelProperty("失效日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime invalidDate;
    @ApiModelProperty("审批日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime approvedDate;
    @ApiModelProperty("采购申请创建人")
    private String reqCeater;
    @ApiModelProperty("采购申请创建人姓名")
    private String reqCeaterName;
    @ApiModelProperty("采购订单行备注")
    private String lineRemarks;
    @ApiModelProperty("单位")
    private String buyUnitMeas;
    private Integer isSource;
    private Integer number;
    private Integer state;
    @ApiModelProperty("接收时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime receiverDate;
    @ApiModelProperty("是否为首次出现 0 å¦ 1 æ˜¯")
    private Integer isFirst;
    @ApiModelProperty("目标库位号")
    private String toLocation;
    @ApiModelProperty("是否是报检 0 å¦ 1 æ˜¯")
    private Integer isInspect;
    @ApiModelProperty("报检人")
    private String declareUser;
    @ApiModelProperty("报检人id")
    private Integer declareUserId;
    @ApiModelProperty("单位")
    private String partUnit;
    @ApiModelProperty("产业链检测数据")
    private String industryChain;
    @ApiModelProperty("报检时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime declareDate;
    @ApiModelProperty("是否卡可以季度检验 0 å¦ 1 æ˜¯")
    private Integer isQuarter;
    // ä¿®æ”¹åŽçš„
    @ApiModelProperty("批号")
    private String updateBatchNo;
    @ApiModelProperty("是否是铜单丝, 0否, 1是")
    private Integer isCopper;
    @ApiModelProperty("物料类型")
    private Integer isExpire;
}
basic-server/src/main/java/com/ruoyi/basic/dto/IfsInventoryQuantityDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.ruoyi.basic.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class IfsInventoryQuantityDto extends IfsInventoryQuantityCheckDto {
    /**
     * å§”托编号
     */
    @ApiModelProperty("委托编号")
    private String entrustCode;
    @ApiModelProperty("检验对象")
    private String sampleType;
    @ApiModelProperty("样品名称")
    private String sampleName;
    @ApiModelProperty("样品型号")
    private String sampleModel;
    @ApiModelProperty("样品编号")
    private String sampleCode;
    // è¿›åŽ‚
    @ApiModelProperty("订单id")
    private Integer enterOrderId;
    @ApiModelProperty("报告id")
    private String enterReportId;
    @ApiModelProperty("系统生成报告地址")
    private String enterUrl;
    @ApiModelProperty("手动上传报告地址")
    private String enterUrlS;
    // å­£åº¦
    @ApiModelProperty("订单id")
    private Integer quarterOrderId;
    @ApiModelProperty("报告id")
    private String quarterReportId;
    @ApiModelProperty("系统生成报告地址")
    private String quarterUrl;
    @ApiModelProperty("手动上传报告地址")
    private String quarterUrlS;
    private Integer orderState;
    @ApiModelProperty("下发时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime sendTime;
    @ApiModelProperty("材料厂家")
    private String supplierName;
    @ApiModelProperty("委托人")
    private String prepareUser;
    @ApiModelProperty("颜色")
    private String color;
    @ApiModelProperty("标签状态")
    private String labelStatus;
    @ApiModelProperty("标签条形码")
    private String labelBarCode;
    @ApiModelProperty("创建人")
    private Integer createUser;
    @ApiModelProperty("检验人")
    private String userName;
}
basic-server/src/main/java/com/ruoyi/basic/dto/IfsInventoryQuantitySupplierDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,124 @@
package com.ruoyi.basic.dto;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * èƒ½æŸ¥è¯¢åˆ°ä¾›åº”商
 */
@Data
@ExcelIgnoreUnannotated
public class IfsInventoryQuantitySupplierDto extends IfsInventoryQuantity {
    /**
     * å§”托编号
     */
    @ExcelProperty(index = 2, value = "委托编号")
    @ApiModelProperty("委托编号")
    private String entrustCode;
    @ApiModelProperty("样品id")
    private Integer sampleId;
    @ApiModelProperty("检验对象")
    private String sampleType;
    @ExcelProperty(index = 7, value = "样品名称")
    @ApiModelProperty("样品名称")
    private String sampleName;
    @ExcelProperty(index = 8, value = "样品型号")
    @ApiModelProperty("样品型号")
    private String sampleModel;
    @ApiModelProperty("样品编号")
    private String sampleCode;
    // è¿›åŽ‚
    @ApiModelProperty("进厂订单id")
    private Integer enterOrderId;
    @ApiModelProperty("报告id")
    private String enterReportId;
    @ApiModelProperty("系统生成报告地址")
    private String enterUrl;
    @ApiModelProperty("手动上传报告地址")
    private String enterUrlS;
    // å­£åº¦
    @ApiModelProperty("季度订单id")
    private Integer quarterOrderId;
    @ApiModelProperty("报告id")
    private String quarterReportId;
    @ApiModelProperty("系统生成报告地址")
    private String quarterUrl;
    @ApiModelProperty("手动上传报告地址")
    private String quarterUrlS;
    private Integer orderState;
    @ApiModelProperty("下发时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime sendTime;
    @ApiModelProperty("委托人")
    private String prepareUser;
    @ApiModelProperty("颜色")
    private String color;
    @ApiModelProperty("标签状态")
    private String labelStatus;
    @ApiModelProperty("标签条形码")
    private String labelBarCode;
    @ApiModelProperty("创建人")
    private Integer createUser;
    @ExcelProperty(index = 9, value = "检验人")
    @ApiModelProperty("检验人")
    private String userName;
    @ExcelProperty(index = 10, value = "下发时间")
    private String sendTimeString;
    @ExcelProperty(index = 14, value = "接收时间")
    private String receiverDateString;
    @ExcelProperty(index = 15, value = "报检时间")
    private String declareDateString;
    // åˆæ ¼çŠ¶æ€,: 0 æ£€éªŒä¸­, 1合格, 2不合格, 3未下单,4让步放行
    @ExcelProperty(index = 6, value = "检验状态")
    private String inspectStatusString;
    @ApiModelProperty("报检开始时间")
    private String beginDeclareDate;
    @ApiModelProperty("报检结束时间")
    private String endDeclareDate;
    @ApiModelProperty("不合格描述")
    @ExcelProperty(index = 16, value = "不合格描述")
    private String unqualifiedDesc;
    @ApiModelProperty("不合格项")
    @ExcelProperty(index = 17, value = "不合格项")
    private String unqualifiedItem;
    @ApiModelProperty("免检")
    private Integer isExemption;
}
basic-server/src/main/java/com/ruoyi/basic/dto/InsSampleReceiveDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.basic.dto;
import com.ruoyi.basic.pojo.InsSample1;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2024/10/29
 */
@Data
public class InsSampleReceiveDto extends InsSample1 {
    @ApiModelProperty("零件号")
    private String partNo;
    @ApiModelProperty("原材料id")
    private Integer ifsInventoryId;
    @ApiModelProperty("芯数")
    private String cores;
    @ApiModelProperty("型号参数")
    private String modelNum;
    @ApiModelProperty("导体材质")
    private String conductorMaterial;
    @ApiModelProperty("导体类型")
    private String conductorType;
    @ApiModelProperty("是否是电缆配置")
    private String isCableTag;
}
basic-server/src/main/java/com/ruoyi/basic/dto/LaboratoryDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.basic.dto;
import lombok.Data;
import java.util.List;
@Data
public class LaboratoryDto {
    private String code = "[2]";
    private String label;
    private String value;
    private List<SampleTypeDto> children;
}
basic-server/src/main/java/com/ruoyi/basic/dto/ModelDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.basic.dto;
import lombok.Data;
@Data
public class ModelDto {
    private String code = "[5]";
    private String label;
    private String value;
}
basic-server/src/main/java/com/ruoyi/basic/dto/PageTestObjectDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.basic.dto;
import com.ruoyi.basic.pojo.StructureTestObject;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @Author æˆ´å“
 * @Date 2024/2/26
 */
@Data
public class PageTestObjectDto extends StructureTestObject {
    @ApiModelProperty(value = "产品")
    private String product;
    @ApiModelProperty(value = "创建人")
    private String createUserName;
    @ApiModelProperty(value = "更新人")
    private String updateUserName;
    @ApiModelProperty(value = "零件号")
    private String partNo;
}
basic-server/src/main/java/com/ruoyi/basic/dto/ProductDTO1.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.basic.dto;
import com.ruoyi.basic.pojo.Product;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2024/8/5
 */
@Data
public class ProductDTO1 extends Product {
    @ApiModelProperty(value = "零件号")
    private String partNo;
}
basic-server/src/main/java/com/ruoyi/basic/dto/ProductDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.basic.dto;
import lombok.Data;
@Data
public class ProductDto {
    private Integer id;
    private String name;
}
basic-server/src/main/java/com/ruoyi/basic/dto/ResetTreeDragDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.basic.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2024/8/22
 */
@Data
public class ResetTreeDragDTO {
    @ApiModelProperty(value = "开始索引")
    private String beginIndex;
    @ApiModelProperty(value = "结束索引")
    private String endIndex;
    @ApiModelProperty(value = "标准编号id")
    private String methodId;
    @ApiModelProperty(value = "数")
    private String tree;
    @ApiModelProperty(value = "检验项行id")
    private String productionId;
}
basic-server/src/main/java/com/ruoyi/basic/dto/SampleDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.basic.dto;
import lombok.Data;
import java.util.List;
@Data
public class SampleDto {
    private String code = "[4]";
    private String label;
    private String value;
    private String partNo;
    // æ ·å“è‹±æ–‡
    private String sampleEn;
    private List<ModelDto> children;
}
basic-server/src/main/java/com/ruoyi/basic/dto/SampleTypeDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.basic.dto;
import lombok.Data;
import java.util.List;
@Data
public class SampleTypeDto {
    private String code = "[3]";
    // æ£€æµ‹å¯¹è±¡id
    private Integer sampleTypeId;
    // æ£€æµ‹å¯¹è±¡æŽ’序
    private Integer sort;
    private String label;
    private String value;
    private String partNo;
    // å¯¹è±¡è‹±æ–‡
    private String sampleTypeEn;
    private List<SampleDto> children;
}
basic-server/src/main/java/com/ruoyi/basic/dto/TestItemDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.basic.dto;
import lombok.Data;
import java.util.List;
@Data
public class TestItemDto {
    private Integer id;
    private String name;
    private List<ProductDto> children;
}
basic-server/src/main/java/com/ruoyi/basic/excel/StructureTestObjectData.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.basic.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class StructureTestObjectData {
    @ExcelProperty(value = "场所")
    private String laboratory;
    @ExcelProperty(value = "检测对象")
    private String specimenName;
    @ExcelProperty(value = "检测对象(EN)")
    private String specimenNameEn;
    @ExcelProperty(value = "对象代号")
    private String code;
    @ExcelProperty(value = "产品名称")
    private String name;
    @ExcelProperty(value = "产品名称(EN)")
    private String nameEn;
}
basic-server/src/main/java/com/ruoyi/basic/excel/StructureTestObjectListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.ruoyi.basic.excel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.ruoyi.basic.service.ProductService;
import java.util.ArrayList;
import java.util.List;
public class StructureTestObjectListener extends AnalysisEventListener<StructureTestObjectData> {
    private static final int BATCH_COUNT = 1000;
    List<StructureTestObjectData> list = new ArrayList<>();
    private ProductService productService;
    public StructureTestObjectListener(ProductService productService) {
        this.productService = productService;
    }
    @Override
    public void invoke(StructureTestObjectData data, AnalysisContext analysisContext) {
        list.add(data);
        if (list.size() >= BATCH_COUNT) {
            save();
            list.clear();
        }
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        save();
    }
    private void save() {
        productService.importPartExcel(list);
    }
}
basic-server/src/main/java/com/ruoyi/basic/mapper/CertificationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.Certification;
import org.apache.ibatis.annotations.Param;
public interface CertificationMapper extends BaseMapper<Certification> {
    //查询资质明细列表
    IPage<Certification> getCertificationDetail(Page page, @Param("ew") QueryWrapper<Certification> ew);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/IfsInventoryQuantityMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.dto.IfsInventoryQuantityDto;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.List;
@Mapper
public interface IfsInventoryQuantityMapper extends BaseMapper<IfsInventoryQuantity> {
    /**
     * æ‰“印标签查询
     * @param ids
     * @return
     */
    List<IfsInventoryQuantityDto> printLabel(@Param("ids") List<Integer> ids);
    /**
     *
     * @param ifsInventoryId
     * @return
     */
    int selectReportCountById(@Param("ifsInventoryId") Integer ifsInventoryId);
    /**
     * æŸ¥è¯¢å½“前季度是否出现过该材料
     * @param partDetail         åž‹å·
     * @param supplierName       ä¾›åº”商名称
     * @param startOfNextQuarter å­£åº¦å¼€å§‹æ—¶é—´
     * @param endOfQuarter       å­£åº¦ç»“束时间
     * @return
     */
    Integer selectIsFirst(@Param("partDetail") String partDetail,
                          @Param("supplierName") String supplierName,
                          @Param("startOfNextQuarter") LocalDateTime startOfNextQuarter,
                          @Param("endOfQuarter") LocalDateTime endOfQuarter);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/LaboratoryMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.Laboratory;
import org.apache.ibatis.annotations.Param;
/**
 * å®žéªŒå®¤ç®¡ç†(Laboratory)表数据库访问层
 */
public interface LaboratoryMapper extends BaseMapper<Laboratory> {
    IPage<Laboratory> selectItemParameter(Page page, @Param("ew") QueryWrapper<Laboratory> ew);
    Object obtainItemParameterList(@Param("page") Page page, @Param("ew") QueryWrapper<Laboratory> ew);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/ProductMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.ProductDTO1;
import com.ruoyi.basic.pojo.Product;
import org.apache.ibatis.annotations.Param;
/**
* @author z1292
* @description é’ˆå¯¹è¡¨ã€product(产品表)】的数据库操作Mapper
* @createDate 2024-04-26 01:11:02
* @Entity com.ruoyi.basic.pojo.Product
*/
public interface ProductMapper extends BaseMapper<Product> {
    IPage<Product> selectProductListByObjectId(Page page, @Param("ew") QueryWrapper<ProductDTO1> ew, @Param("partNo") String partNo);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/ProductPartMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.basic.pojo.ProductPart;
import org.apache.ibatis.annotations.Param;
public interface ProductPartMapper extends BaseMapper<ProductPart> {
    IPage<ProductPart> selectListByProductId(IPage<ProductPart> page,
                                              @Param("ew") QueryWrapper<ProductPart> ew,
                                              @Param("productId") Integer productId);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/ProductSupplierDensityMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.ProductSupplierDensity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * äº§å“åŽ‚å®¶å¯†åº¦ç»‘å®šè¡¨
 *
 * @author zhuo
 * @since 2024-09-19
 */
@Mapper
public interface ProductSupplierDensityMapper extends BaseMapper<ProductSupplierDensity> {
    IPage<ProductSupplierDensity> selectListByProductId(@Param("page") Page page, @Param("ew") QueryWrapper<ProductSupplierDensity> ew, @Param("productId") Integer productId);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/SealMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.Laboratory;
import com.ruoyi.basic.pojo.Seal;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface SealMapper extends BaseMapper<Seal> {
    IPage<Seal>selectSeal(Page page, @Param("ew") QueryWrapper<Seal> ew);
    List<Laboratory> selectLaboratory (Integer labId);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardMethodListMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.pojo.StandardMethodList;
import com.ruoyi.basic.pojo.StandardProductList;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€standard_method_list(标准树下的标准列表)】的数据库操作Mapper
* @createDate 2024-03-04 13:44:04
* @Entity com.ruoyi.basic.pojo.StandardMethodList
*/
public interface StandardMethodListMapper extends BaseMapper<StandardMethodList> {
    Map<String, String> selectStandardMethodById(Integer id);
    String selectUserById(Integer id);
    List<StandardMethodList> selectStandardMethodLists(String tree);
    List<StandardMethodList> selectStandardMethodListsByNull(String tree);
    List<StandardMethodList> selectStandardMethodLists3(String tree);
    List<StandardMethodList> selectStandardMethodLists2(@Param("data1") String data1, @Param("data2") String data2, @Param("data3") String data3, @Param("data4") String data4, @Param("data5") String data5);
    List<StandardProductList> selectParameterList(String code);
    List<StandardMethodList> selectListEnum();
    Integer getStandardMethodId(String code);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardMethodMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.mybatis_config.MyBaseMapper;
import com.ruoyi.basic.pojo.StandardMethod;
import org.apache.ibatis.annotations.Param;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€standard_method(标准方法)】的数据库操作Mapper
* @createDate 2024-03-03 19:21:41
* @Entity com.ruoyi.basic.pojo.StandardMethod
*/
public interface StandardMethodMapper extends MyBaseMapper<StandardMethod> {
    IPage<StandardMethod> selectStandardMethodList(Page page, @Param("ew") QueryWrapper<StandardMethod> ew);
    StandardMethod selectStandMethodById(Integer id);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardProductListMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.basic.pojo.StandardProductList;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€standard_product_list(标准树下的检验项目)】的数据库操作Mapper
* @createDate 2024-03-05 10:33:29
* @Entity com.ruoyi.basic.pojo.StandardProductList
*/
public interface StandardProductListMapper extends BaseMapper<StandardProductList> {
    IPage<StandardProductList> standardProductListIPage(@Param("id") Integer id, @Param("tree") String tree, IPage<StandardProductList> page, @Param("laboratory") String laboratory, @Param("insItem") String insItem, @Param("insItems") String insItems);
    StandardProductList getOne(@Param("standardMethodListId") Integer standardMethodListId, @Param("inspectionItem") String inspectionItem, @Param("sample") String sample, @Param("inspectionItemSubclass") String inspectionItemSubclass, @Param("model") String model, @Param("inspectionItemClass") String inspectionItemClass);
    List<StandardProductList> selectDetail(@Param("standardMethodListId") Integer standardMethodListId, @Param("state") int state, @Param("model") String model, @Param("isCableTag") String isCableTag);
    List<StandardProductList> selectDetail2(@Param("standardMethodListId") Integer standardMethodListId, @Param("state") int state, @Param("tree") String tree, @Param("isCableTag") String isCableTag);
    /**
     * æŸ¥è¯¢é›¶ä»¶é¢œè‰²
     * @param partNo
     * @return
     */
    Map<String, String> selectPartColor(@Param("partNo") String partNo);
    /**
     * åŒºé—´ä¿®æ”¹
     * @param productList
     * @return
     */
    void updateSection(@Param("productList") StandardProductList productList);
    /**
     * ä»Žä¸Šå¾€ä¸‹ä¿®æ”¹é¡ºåº
     * @param beginIndex å¼€å§‹ä½ç½®
     * @param endIndex ç»“束位置
     * @param methodId æ ‡å‡†id
     * @param tree æ ‘
     */
    void updateSortUp(@Param("beginIndex") Integer beginIndex,
                      @Param("endIndex") Integer endIndex,
                      @Param("methodId") Integer methodId,
                      @Param("tree") String tree);
    /**
     * ä»Žä¸‹ç½‘上修改顺序
     * @param beginIndex
     * @param endIndex
     * @param methodId
     * @param tree
     */
    void updateSortDown(@Param("beginIndex") Integer beginIndex,
                        @Param("endIndex") Integer endIndex,
                        @Param("methodId") Integer methodId,
                        @Param("tree") String tree);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardProductListSupplierAskMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.pojo.StandardProductListSupplierAsk;
import org.apache.ibatis.annotations.Mapper;
/**
 * æ£€éªŒé¡¹ç›®åŽ‚å®¶å¯†åº¦ç»‘å®šè¡¨
 *
 * @author zhuo
 * @since 2024-09-23
 */
@Mapper
public interface StandardProductListSupplierAskMapper extends BaseMapper<StandardProductListSupplierAsk> {
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTemplateMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.StandardTemplate;
import org.apache.ibatis.annotations.Param;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€standard_template(标准模板)】的数据库操作Mapper
* @createDate 2024-03-11 13:47:52
* @Entity com.ruoyi.basic.pojo.StandardTemplate
*/
public interface StandardTemplateMapper extends BaseMapper<StandardTemplate> {
    IPage<StandardTemplate> selectStandardTemplatePageList(Page page, @Param("ew") QueryWrapper<StandardTemplate> ew);
    StandardTemplate getStandTempIdByName(String name);
    /**
     * æŸ¥è¯¢åŽ‹ç¼©åŽçš„æ•°æ®
     * @param templateId
     * @return
     */
    String selectCompressThing(Integer templateId);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.*;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.basic.pojo.StandardMethodList;
import com.ruoyi.basic.pojo.StandardProductList;
import com.ruoyi.basic.pojo.StandardTree;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @author Administrator
 * @description é’ˆå¯¹è¡¨ã€standard_tree(标准树)】的数据库操作Mapper
 * @createDate 2024-03-01 15:06:44
 * @Entity com.ruoyi.basic.pojo.StandardTree
 */
public interface StandardTreeMapper extends BaseMapper<StandardTree> {
    List<FactoryDto> selectStandardTreeList();
    List<StandardTree> selectStandardTreeList2(String sampleType);
    StandardProductList selectStandardProductById(Integer id);
    List<StandardProductList> getStandardProductListBySample(String sampleType);
    List<StandardMethodList> getStandardMethodListBySample(String sampleType);
    List<StandardProductList> selectStandardProductListByTree(String tree, String sample, String model, String trees, String laboratory);
    List<StandardProductList> selectStandardProductListByTree2(String tree, String sample, String model, String trees, String laboratory);
    List<SampleTypeDto> getStandardTree2();
    List<SampleDto> getStandardTree3(String sampleType);
    String getLaboratory(String str);
    Integer getStructureItemParameterId(String sampleType, String item, String itemChild, String inspectionItemClass);
    List<ProductDto> selectPList(String name);
    String selSample(String sample);
    List<FactoryDto> selectStandardTreeListByPartNo(@Param("partNo") String partNo);
    IPage<IfsInventoryQuantity> selectIfsPage(IPage<IfsInventoryQuantity> page,
                                              @Param("ew") QueryWrapper<IfsInventoryQuantity> ew);
    IPage<IfsInventoryQuantityDto> getIfsByStateOne(IPage<IfsInventoryQuantityDto> page,
                                                    @Param("ew") QueryWrapper<IfsInventoryQuantityDto> ew);
    IPage<IfsInventoryQuantityCheckDto> selectIfsInventoryQuantity(Page<IfsInventoryQuantityCheckDto> page, @Param("ew")QueryWrapper<IfsInventoryQuantityCheckDto> ew);
    /**
     * åŽŸææŠ¥æ£€æŸ¥è¯¢å…¨éƒ¨(分页)
     * @param page
     * @param ew
     * @return
     */
    IPage<IfsInventoryQuantitySupplierDto> getIfsByOver(Page<IfsInventoryQuantitySupplierDto> page, @Param("ew") QueryWrapper<IfsInventoryQuantitySupplierDto> ew, @Param("beginDeclareDate") String beginDeclareDate, @Param("endDeclareDate")String endDeclareDate);
    /**
     * åŽŸææŠ¥æ£€æŸ¥è¯¢å…¨éƒ¨(无分页)
     * @param ew
     * @return
     */
    List<IfsInventoryQuantitySupplierDto> getIfsByOverList(@Param("ew") QueryWrapper<IfsInventoryQuantitySupplierDto> ew, @Param("beginDeclareDate") String beginDeclareDate, @Param("endDeclareDate")String endDeclareDate);
    /**
     * åŽŸææ–™æŸ¥è¯¢å­£åº¦æ£€éªŒ
     * @param page
     * @param
     * @param beginDeclareDate
     * @param endDeclareDate
     * @return
     */
    IPage<IfsInventoryQuantitySupplierDto> getIfsByQuarter(Page<IfsInventoryQuantitySupplierDto> page, @Param("ew") QueryWrapper<IfsInventoryQuantitySupplierDto> ew, @Param("beginDeclareDate") String beginDeclareDate, @Param("endDeclareDate")String endDeclareDate);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StructureItemParameterMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.TestItemDto;
import com.ruoyi.basic.pojo.StructureItemParameter;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
 * æ£€éªŒé¡¹ç›®å‚æ•°(StructureItemParameter)表数据库访问层
 *
 * @author makejava
 * @since 2024-02-26 16:21:17
 */
public interface StructureItemParameterMapper extends BaseMapper<StructureItemParameter> {
    IPage<StructureItemParameter> selectItemParameterList(Page page, @Param("ew") QueryWrapper<StructureItemParameter> ew);
    List<Map<String, Object>> getInsProduction();
    List<TestItemDto> getItemTree();
    int removeNoSample(@Param("sample") String sample);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StructureTestObjectMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.PageTestObjectDto;
import com.ruoyi.basic.pojo.StructureTestObject;
import org.apache.ibatis.annotations.Param;
/**
 * æ£€æµ‹å¯¹è±¡(StructureTestObject)表数据库访问层
 *
 * @author makejava
 * @since 2024-02-26 17:36:41
 */
public interface StructureTestObjectMapper extends BaseMapper<StructureTestObject> {
    IPage<PageTestObjectDto> selectTestObjectList(Page page, @Param("ew") QueryWrapper<PageTestObjectDto> ew, @Param("partNo") String partNo);
}
basic-server/src/main/java/com/ruoyi/basic/mapper/StructureTestObjectPartMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.StructureTestObjectPart;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * æ£€éªŒå¯¹è±¡é›¶ä»¶è¡¨
 *
 * @author zhuo
 * @since 2024-08-07
 */
@Mapper
public interface StructureTestObjectPartMapper extends BaseMapper<StructureTestObjectPart> {
    IPage<StructureTestObjectPart> selectListByTestObjectId(Page page, @Param("ew") QueryWrapper<StructureTestObjectPart> structureTestObjectPartQueryWrapper, @Param("testObjectId") Integer testObjectId);
}
basic-server/src/main/java/com/ruoyi/basic/pojo/Certification.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@TableName(value = "certification")
@Data
public class Certification implements Serializable {
    @ApiModelProperty(value = "主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "资质名称")
    private String name;
    @ApiModelProperty(value = "资质编码")
    private String code;
    @ApiModelProperty(value = "颁发机构")
    private String organization;
    @ApiModelProperty(value = "资质说明")
    private String explanation;
    @ApiModelProperty(value = "首次颁发时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime firstIssuanceDate;
    @ApiModelProperty(value = "最近颁发时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime latestIssuanceDate;
    @ApiModelProperty(value = "到期颁发时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime expireTime;
    @ApiModelProperty(value = "颁布日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime dateOfIssuance;
    @ApiModelProperty(value = "创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "更新人")
    private String createUserName;
    @ApiModelProperty(value = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "资质图片地址")
    private String imageUrl;
    @ApiModelProperty(value = "资质附件地址")
    private String fileUrl;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/IfsInventoryQuantity.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,210 @@
package com.ruoyi.basic.pojo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@TableName("ifs_inventory_quantity")
@ExcelIgnoreUnannotated
public class IfsInventoryQuantity  implements Serializable {
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("域")
    private String contract;
    @ExcelProperty(index = 13, value = "订单号")
    @ApiModelProperty("订单号")
    private String orderNo;
    @ApiModelProperty("行号")
    private String lineNo;
    @ApiModelProperty("下达号")
    private String releaseNo;
    @ApiModelProperty("接收号")
    private Integer receiptNo;
    @ExcelProperty(index = 3, value = "零件号")
    @ApiModelProperty("零件号")
    private String partNo;
    @ExcelProperty(index = 4, value = "零件描述")
    @ApiModelProperty("零件描述")
    private String partDesc;
    @ApiModelProperty("状态描述(IFS原本拉取的状态)")
    private String status;
    @ApiModelProperty("状态(IFS原本拉取的状态)")
    private String statusDb;
    @ExcelProperty(index = 11, value = "抵达的采购数量")
    @ApiModelProperty("抵达的采购数量")
    private BigDecimal qtyArrived;
    @ApiModelProperty("已检验的购买数量")
    private BigDecimal qtyInspected;
    @ApiModelProperty("要检验的采购数量")
    private BigDecimal qtyToInspect;
    @ApiModelProperty("供应商编号")
    private String supplierId;
    @ExcelProperty(index = 5, value = "供应商名称")
    @ApiModelProperty("供应商名称")
    private String supplierName;
    @ApiModelProperty("抵达的库存数量")
    private BigDecimal invQtyInStore;
    @ApiModelProperty("抵达的采购数量")
    private BigDecimal purQtyInStore;
    @ApiModelProperty("配置标识")
    private String configurationId;
    @ApiModelProperty("批号")
    private String lotBatchNo;
    @ApiModelProperty("wdr号")
    private String waivDevRejNo;
    @ApiModelProperty("活动序列")
    private Integer activitySeq;
    @ApiModelProperty("序列号")
    private String serialNo;
    @ApiModelProperty("库位号")
    private String locationNo;
    @ApiModelProperty("版本号")
    private String engChgLevel;
    @ApiModelProperty("接收人")
    private String receiver;
    @ApiModelProperty("接收人姓名")
    private String receiverName;
    @ApiModelProperty("采购员")
    private String buyerCode;
    @ApiModelProperty("采购员姓名")
    private String buyerName;
    @ApiModelProperty("实际到货日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime arriveDate;
    @ApiModelProperty("实际交货日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime deliveryDate;
    @ApiModelProperty("生产日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime productDate;
    @ApiModelProperty("失效日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime invalidDate;
    @ApiModelProperty("审批日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime approvedDate;
    @ApiModelProperty("采购申请创建人")
    private String reqCeater;
    @ApiModelProperty("采购申请创建人姓名")
    private String reqCeaterName;
    @ApiModelProperty("采购订单行备注")
    private String lineRemarks;
    @ExcelProperty(index = 12, value = "单位")
    @ApiModelProperty("单位")
    private String buyUnitMeas;
    @ApiModelProperty("是否为ifs拉取,0 å¦, 1是")
    private Integer isSource;
    private Integer number;
    @ApiModelProperty("状态: 0:待报检, 1:待检验, :已审核")
    private Integer state;
    @ApiModelProperty("接收时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime receiverDate;
    @ApiModelProperty("是否为首次出现 0 å¦ 1 æ˜¯")
    private Integer isFirst;
    @ApiModelProperty("目标库位号")
    private String toLocation;
    @ApiModelProperty("是否是报检 0 å¦ 1 æ˜¯")
    private Integer isInspect;
    @ApiModelProperty("报检人")
    private String declareUser;
    @ApiModelProperty("报检人id")
    private Integer declareUserId;
    @ApiModelProperty("单位")
    private String partUnit;
    @ApiModelProperty("产业链检测数据")
    private String industryChain;
    @ApiModelProperty("报检时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime declareDate;
    @ApiModelProperty("是否卡可以季度检验 0 å¦ 1 æ˜¯")
    private Integer isQuarter;
    // ä¿®æ”¹åŽçš„
    @ExcelProperty(index = 1, value = "批号")
    @ApiModelProperty("批号")
    private String updateBatchNo;
    @ApiModelProperty("是否结束, 0否, 1是")
    private Integer isFinish;
    @ApiModelProperty("是否是铜单丝, 0否, 1是")
    private Integer isCopper;
    // åˆæ ¼çŠ¶æ€,: 0 æ£€éªŒä¸­, 1合格, 2不合格, 3未下单,4让步放行
    @ApiModelProperty("检验状态")
    private Integer inspectStatus;
    @ApiModelProperty("是否采购订单登记: 0否, 1:是")
    private Integer isRegister;
    @ApiModelProperty("是否修改过批号: 0否, 1:是")
    private Integer isUpdateBatch;
    // æ˜¯å¦æ˜¯è¿‡æœŸææ–™: 0否, 1:是"
    @ApiModelProperty("物料类型")
    private Integer isExpire;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/InsSample1.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,123 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * æ£€éªŒæ ·å“
 * @TableName ins_sample
 */
@TableName(value ="ins_sample")
@Data
public class InsSample1 implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * 1:合格 0:不合格
     */
    private Integer insResult;
    /**
     * å¤–键:ins_order表id
     */
    private Integer insOrderId;
    /**
     * é…å¥—样品型号
     */
    private String joinModel;
    /**
     * é…å¥—样品名称
     */
    private String joinName;
    /**
     * é…å¥—样品数量
     */
    private Integer joinNum;
    /**
     * æ ·å“ç¼–码
     */
    private String sampleCode;
    /**
     * æ£€éªŒå·¥åŽ‚
     */
    private String factory;
    /**
     * å®žéªŒå®¤åç§°
     */
    private String laboratory;
    /**
     * æ ·å“ç±»åž‹
     */
    private String sampleType;
    /**
     * æ ·å“åç§°
     */
    private String sample;
    /**
     * è§„格型号
     */
    private String model;
    /**
     * æ£€éªŒçŠ¶æ€(0:待检验1:检验中 2:已检验3:待复核4:复核未通过5:复核通过)
     */
    private Integer insState;
    /**
     * å¤‡æ³¨
     */
    private String remark;
    private Integer standardMethodListId;
    @ApiModelProperty("样品单位")
    private String unit;
    private Integer cellId;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    private Integer parentId;
    @ApiModelProperty("数量")
    private Integer quantity;
    @ApiModelProperty("特殊标准方法")
    private String specialStandardMethod;
    @TableField(select = false,exist = false)
    private Integer num=1;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/Laboratory.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * å®žéªŒå®¤ç®¡ç†(Laboratory)表对象
 */
@TableName(value = "laboratory")
@Data
@NoArgsConstructor
public class Laboratory  implements Serializable {
    @ApiModelProperty(value = "主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "实验室名称")
    private String laboratoryName;
    @ApiModelProperty(value = "场所编码")
    private String laboratoryNumber;
    @ApiModelProperty(value = "实验室代号")
    private String laboratoryCode;
    @ApiModelProperty(value = "负责人电话")
    private String phoneNumber;
    @ApiModelProperty(value = "负责人")
    @TableField(fill = FieldFill.INSERT)
    private String head;
    @ApiModelProperty(value = "地址")
    private String address;
    @ApiModelProperty(value = "创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "创建人")
    private String createUserName;
    @ApiModelProperty(value = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/Product.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * äº§å“è¡¨
 * @TableName product
 */
@TableName(value ="product")
@Data
public class Product  implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * äº§å“åç§°
     */
    private String name;
    /**
     * äº§å“åç§°EN
     */
    private String nameEn;
    @ApiModelProperty(value = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * å¤–键:structure_test_object表id
     */
    private Integer objectId;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/ProductPart.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("product_part")
public class ProductPart implements Serializable {
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("产品id")
    private Integer productId;
    @ApiModelProperty("零件号")
    private String partNo;
    @ApiModelProperty("颜色")
    private String color;
    @ApiModelProperty("色标")
    private String colorCode;
    @ApiModelProperty(value = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/ProductSupplierDensity.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * äº§å“åŽ‚å®¶å¯†åº¦ç»‘å®šè¡¨
 *
 * @author zhuo
 * @since 2024-09-19
 */
@Data
@TableName("product_supplier_density")
public class ProductSupplierDensity implements Serializable {
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("产品id")
    private Integer productId;
    @ApiModelProperty("型号")
    private String model;
    @ApiModelProperty("厂家名称")
    private String supplierName;
    @ApiModelProperty("密度值")
    private String densityValue;
    @ApiModelProperty(value = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/Seal.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * å°ç« ç®¡ç†(Laboratory)表对象
 */
@TableName(value = "seal")
@Data
public class Seal  implements Serializable {
    @ApiModelProperty(value = "主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "实验室id")
    private Integer labId;
    @TableField(exist=false)
    @ApiModelProperty(value = "实验室名称")
    private String laboratoryName;
    @ApiModelProperty(value = "印章图片")
    private String address;
    @ApiModelProperty(value = "印章类型")
    private String type;
    @ApiModelProperty(value = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethod.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * æ ‡å‡†æ–¹æ³•
 * @TableName standard_method
 */
@TableName(value ="standard_method")
@Data
public class StandardMethod implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String field;
    @ApiModelProperty("检验对象")
    private String structureTestObjectId;
    /**
     * æ ‡å‡†ç¼–号
     */
    @ApiModelProperty(value = "标准编号")
    private String code;
    /**
     * æ ‡å‡†æ–¹æ³•
     */
    @ApiModelProperty(value = "标准描述")
    private String name;
    @ApiModelProperty(value = "标准描述EN")
    private String nameEn;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "资质")
    private String qualificationId;
    @ApiModelProperty(value = "是否产品标准")
    private Integer isProduct;
    @ApiModelProperty(value = "是否启用")
    private Integer isUse;
    @ApiModelProperty(value = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "创建人")
    @TableField(exist = false,select = false)
    private String createUserName;
    @ApiModelProperty(value = "更新人")
    @TableField(exist = false,select = false)
    private String updateUserName;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardMethodList.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * æ ‡å‡†æ ‘下的标准列表
 * @TableName standard_method_list
 */
@TableName(value ="standard_method_list")
@Data
public class StandardMethodList implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * æ ‡å‡†ç¼–号
     */
    @ApiModelProperty("标准编号")
    private String code;
    /**
     * æ ‡å‡†åç§°
     */
    @ApiModelProperty("标准称号")
    private String name;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("工厂")
    private String factory;
    @ApiModelProperty("实验室")
    private String laboratory;
    @ApiModelProperty("样品分类")
    private String sampleType;
    @ApiModelProperty("样品")
    private String sample;
    @ApiModelProperty("型号")
    private String model;
    @ApiModelProperty("")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(exist = false)
    private String createUserName;
    /**
     *
     */
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     *
     */
    @ApiModelProperty("")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     *
     */
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardProductList.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,221 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * æ ‡å‡†æ ‘下的检验项目
 * @TableName standard_product_list
 */
@TableName(value ="standard_product_list")
@Data
public class StandardProductList implements Serializable {
    /**
     * ä¸»é”®id
     */
    @TableId(value = "id",type = IdType.ASSIGN_ID)
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;
    /**
     * æ£€éªŒé¡¹
     */
    @ApiModelProperty("检验项")
    private String inspectionItem;
    @ApiModelProperty("检验项EN")
    private String inspectionItemEn;
    /**
     * æ£€éªŒé¡¹å°ç±»
     */
    @ApiModelProperty("检验项小类")
    private String inspectionItemSubclass;
    @ApiModelProperty("检验项小类EN")
    private String inspectionItemSubclassEn;
    /**
     * å®žéªŒå®¤
     */
    @ApiModelProperty("实验室")
    private String laboratory;
    @ApiModelProperty("子实验室")
    private String sonLaboratory;
    /**
     * è®¡é‡å•位
     */
    @ApiModelProperty("计量单位")
    private String unit;
    /**
     * å•ä»·(元)
     */
    @ApiModelProperty("单价")
    private String price;
    /**
     * å·¥æ—¶(H)
     */
    @ApiModelProperty("工时")
    private String manHour;
    /**
     * å·¥æ—¶åˆ†ç»„
     */
    @ApiModelProperty("工时分组")
    private String manHourGroup;
    /**
     * æ£€éªŒé¡¹ç±»åž‹
     */
    @ApiModelProperty("检验项类型")
    private String inspectionItemType;
    /**
     * æ£€éªŒå€¼ç±»åž‹
     */
    @ApiModelProperty("检验值类型")
    private String inspectionValueType;
    /**
     * æ£€éªŒæ¬¡æ•°
     */
    @ApiModelProperty("检验次数")
    private Integer checkoutNumber;
    /**
     * åŒºé—´
     */
    @ApiModelProperty("区间")
    private String section;
    /**
     * åŒºé—´
     */
    @ApiModelProperty("芯数区间")
    private String cores;
    /**
     * æ–¹æ³•
     */
    @ApiModelProperty("方法列表")
    private String method;
    @ApiModelProperty("方法")
    private String methodS;
    /**
     * é¢„计时间(天)
     */
    @ApiModelProperty("预计时间")
    private Integer manDay;
    /**
     * ç‰¹æ®Šæ ‡è¯†
     */
    @ApiModelProperty("特殊标识")
    private String bsm;
    /**
     * è¦æ±‚值
     */
    @ApiModelProperty("要求值")
    private String ask;
    @ApiModelProperty("要求描述")
    private String tell;
    /**
     * å¤–键:标准方法id
     */
    @ApiModelProperty("标准方法id")
    private Integer standardMethodListId;
    @ApiModelProperty("工厂")
    private String factory;
    @ApiModelProperty("样品分类")
    private String sampleType;
    @ApiModelProperty("样品")
    private String sample;
    @ApiModelProperty("型号")
    private String model;
    @ApiModelProperty("型号")
    private Integer templateId;
    @ApiModelProperty("")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     *
     */
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     *
     */
    @ApiModelProperty("")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     *
     */
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty("1:有效 0:无效")
    private Integer state;
    private String dic;
    private String tree;
    private Integer structureItemParameterId;
    @ApiModelProperty(value = "检验项分类")
    private String inspectionItemClass;
    @ApiModelProperty(value = "检验项分类EN")
    private String inspectionItemClassEn;
    @ApiModelProperty(value = "条件")
    private String radius;
    @ApiModelProperty(value = "条件列表")
    private String radiusList;
    @ApiModelProperty(value = "收费标准(元/次)")
    private String rates;
    @ApiModelProperty(value = "索引顺序")
    private Integer sort;
    /**
     * å¯¼ä½“材质
     */
    @ApiModelProperty("导体材质")
    private String conductorMaterial;
    /**
     * å¯¼ä½“类型
     */
    @ApiModelProperty("导体类型")
    private String conductorType;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardProductListSupplierAsk.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * æ£€éªŒé¡¹ç›®åŽ‚å®¶å¯†åº¦ç»‘å®šè¡¨
 *
 * @author zhuo
 * @since 2024-09-23
 */
@TableName(value ="standard_product_list_supplier_ask")
@Data
public class StandardProductListSupplierAsk {
    @TableId(type = IdType.AUTO)
    private Integer supplierAskId;
    @JsonSerialize(using = ToStringSerializer.class)
    @ApiModelProperty("检验项目id")
    private Long productListId;
    @ApiModelProperty("厂家名称")
    private String supplierName;
    @ApiModelProperty("要求值")
    private String ask;
    @ApiModelProperty("要求描述")
    private String tell;
    @ApiModelProperty(value = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardTemplate.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * æ ‡å‡†æ¨¡æ¿
 * @TableName standard_template
 */
@TableName(value ="standard_template")
@Data
public class StandardTemplate  implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * æ¨¡æ¿åç§°
     */
    @ApiModelProperty("模板名称")
    private String name;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty("备注")
    private String remark;
    /**
     * æ¨¡æ¿ç»“æž„
     */
    private String thing;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     *
     */
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     *
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     *
     */
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty("创建用户")
    @TableField(exist = false)
    private String createUserName;
    @ApiModelProperty("更新用户")
    @TableField(exist = false)
    private String updateUserName;
    /**
     * æ¨¡æ¿ç¼–号
     */
    @ApiModelProperty("模板编号")
    private String number;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/StandardTree.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* æ ‡å‡†æ ‘
* @TableName standard_tree
*/
@TableName(value ="standard_tree")
@Data
public class StandardTree implements Serializable {
    /**
    *
    */
    @NotNull(message="[]不能为空")
    @ApiModelProperty("")
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
    * å·¥åŽ‚
    */
    @Size(max= 255,message="编码长度不能超过255")
    @ApiModelProperty("工厂")
    @Length(max= 255,message="编码长度不能超过255")
    private String factory;
    /**
    * å®žéªŒå®¤
    */
    @Size(max= 255,message="编码长度不能超过255")
    @ApiModelProperty("实验室")
    @Length(max= 255,message="编码长度不能超过255")
    private String laboratory;
    /**
    * æ ·å“å¤§ç±»
    */
    @Size(max= 255,message="编码长度不能超过255")
    @ApiModelProperty("样品大类")
    @Length(max= 255,message="编码长度不能超过255")
    private String sampleType;
    /**
    * æ ·å“
    */
    @Size(max= 255,message="编码长度不能超过255")
    @ApiModelProperty("样品")
    @Length(max= 255,message="编码长度不能超过255")
    private String sample;
    /**
    * åž‹å·
    */
    @Size(max= 255,message="编码长度不能超过255")
    @ApiModelProperty("型号")
    @Length(max= 255,message="编码长度不能超过255")
    private String model;
    /**
    *
    */
    @ApiModelProperty("")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
    *
    */
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
    *
    */
    @ApiModelProperty("")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
    *
    */
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * ä¿®æ”¹å‰åç§°
     */
    @TableField(exist = false,select = false)
    private String oldModel;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * æ£€éªŒé¡¹ç›®å‚æ•°(StructureItemParameter)表对象
 *
 * @author makejava
 * @since 2024-02-26 16:21:17
 */
@TableName(value ="structure_item_parameter")
@Data
public class StructureItemParameter implements Serializable {
    @ApiModelProperty(value = "主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "检验项")
    private String inspectionItem;
    @ApiModelProperty(value = "检验项EN")
    private String inspectionItemEn;
    @ApiModelProperty(value = "检验子项")
    private String inspectionItemSubclass;
    @ApiModelProperty(value = "检验子项EN")
    private String inspectionItemSubclassEn;
    @ApiModelProperty(value = "检验对象")
    private String sample;
    @ApiModelProperty(value = "单价(元)")
    private String price;
    @ApiModelProperty(value = "场所")
    private String laboratory;
    @ApiModelProperty(value = "试验室")
    private String sonLaboratory;
    @ApiModelProperty(value = "要求描述")
    private String askTell;
    @ApiModelProperty(value = "要求值")
    private String ask;
    @ApiModelProperty(value = "计量单位")
    private String unit;
    @ApiModelProperty(value = "试验方法")
    private String method;
    @ApiModelProperty(value = "工时(H)")
    private Double manHour;
    @ApiModelProperty(value = "预计时间(H)")
    private Integer manDay;
    @ApiModelProperty(value = "工时分组")
    private String manHourGroup;
    @ApiModelProperty(value = "检验项类型")
    private String inspectionItemType;
    @ApiModelProperty(value = "检验值类型")
    private String inspectionValueType;
    @ApiModelProperty(value = "检验次数")
    private Integer checkoutNumber;
    @ApiModelProperty(value = "区间")
    private String section;
    @ApiModelProperty(value = "特殊标识")
    private String bsm;
    @ApiModelProperty(value = "原始记录模板")
    private Integer templateId;
    @ApiModelProperty(value = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "字典类型")
    private String dic;
    @ApiModelProperty(value = "检验项分类")
    private String inspectionItemClass;
    @ApiModelProperty(value = "检验项分类EN")
    private String inspectionItemClassEn;
    @ApiModelProperty(value = "条件")
    private String radiusList;
    @ApiModelProperty(value = "收费标准(元/次)")
    private String rates;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/StructureTestObject.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * æ£€æµ‹å¯¹è±¡(StructureTestObject)表对象
 *
 * @author makejava
 * @since 2024-02-26 17:36:41
 */
@TableName(value ="structure_test_object")
@Data
public class StructureTestObject implements Serializable {
    @ApiModelProperty(value = "主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "场所")
    private Integer laboratoryId;
    @ApiModelProperty(value = "检验对象")
    private String specimenName;
    @ApiModelProperty(value = "检验对象EN")
    private String specimenNameEn;
    @ApiModelProperty(value = "对象代号")
    private String code;
    @ApiModelProperty(value = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "排序")
    private Integer sort;
    //"对象类型, 1:原材料, 2:成品, 3:辅材"
    @ApiModelProperty(value = "对象类型")
    private String objectType;
}
basic-server/src/main/java/com/ruoyi/basic/pojo/StructureTestObjectPart.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * æ£€éªŒå¯¹è±¡é›¶ä»¶è¡¨(StructureTestObjectPart)$desc
 *
 * @author makejava
 * @since 2024-08-07 10:10:30
 */
@TableName(value ="structure_test_object_part")
@Data
public class StructureTestObjectPart implements Serializable {
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("检验对象id")
    private Integer testObjectId;
    @ApiModelProperty("零件号")
    private String partNo;
    @ApiModelProperty("颜色")
    private String color;
    @ApiModelProperty("色标")
    private String colorCode;
    @ApiModelProperty(value = "创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
basic-server/src/main/java/com/ruoyi/basic/service/CapacityScopeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.ruoyi.basic.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.ruoyi.basic.dto.PageTestObjectDto;
import com.ruoyi.basic.dto.TestItemDto;
import com.ruoyi.basic.pojo.StructureItemParameter;
import com.ruoyi.basic.pojo.StructureTestObject;
import java.util.List;
import java.util.Map;
/**
 * æ£€éªŒé¡¹ç›®å‚æ•°(StructureItemParameter)表服务接口
 *
 * @author makejava
 * @since 2024-02-26 16:21:17
 */
public interface CapacityScopeService extends IService<StructureItemParameter> {
    IPage<StructureItemParameter> selectItemParameterList(Page page, StructureItemParameter itemParameter);
    int addItemParameter(StructureItemParameter itemParameter);
    int delItemParameter(Integer id);
    int upItemParameter(StructureItemParameter itemParameter);
    IPage<PageTestObjectDto> selectTestObjectList(Page page, PageTestObjectDto pageTestObjectDto);
    int addTestObject(StructureTestObject testObject);
    int delTestObject(Integer id);
    int upTestObject(StructureTestObject testObject);
    List<StructureTestObject> selectTestObjectByName();
    //设备里面选择检验项目(树形结构)
    List<Map<String, Object>> getInsProduction();
    List<TestItemDto> getItemTree();
}
basic-server/src/main/java/com/ruoyi/basic/service/CertificationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.basic.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.ruoyi.basic.pojo.Certification;
public interface CertificationService extends IService<Certification> {
    //查询资质明细列表
    IPage<Certification> getCertificationDetail(Page page, Certification certification);
    //添加资质明细列表
    int addCertificationDetail(Certification certification);
    //删除资质明细列表
    int delCertificationDetail(String ids);
}
basic-server/src/main/java/com/ruoyi/basic/service/LaboratoryService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.basic.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.ruoyi.basic.pojo.Laboratory;
import java.util.List;
/**
 * å®žéªŒå®¤ç®¡ç†(Laboratory)表服务接口
 */
public interface LaboratoryService extends IService<Laboratory> {
    IPage<Laboratory> selectItemParameter(Page page, Laboratory itemParameter);
    int addParameter(Laboratory itemParameter);
    int delParameter(Integer id);
    int upParameter(Laboratory itemParameter);
    List<Laboratory> obtainItemParameterList();
}
basic-server/src/main/java/com/ruoyi/basic/service/ProductPartService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.basic.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.pojo.ProductPart;
public interface ProductPartService extends IService<ProductPart> {
    IPage<ProductPart> selectByProductId(IPage<ProductPart> page,ProductPart productPart);
    void addProductPart(ProductPart productPart);
    void updateProductPartById(ProductPart productPart);
}
basic-server/src/main/java/com/ruoyi/basic/service/ProductService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.basic.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.ruoyi.basic.dto.ProductDTO1;
import com.ruoyi.basic.excel.StructureTestObjectData;
import com.ruoyi.basic.pojo.Product;
import java.util.List;
/**
* @author z1292
* @description é’ˆå¯¹è¡¨ã€product(产品表)】的数据库操作Service
* @createDate 2024-04-26 01:11:02
*/
public interface ProductService extends IService<Product> {
    IPage<Product> selectProductListByObjectId(Page page, ProductDTO1 productDto);
    int addProduct(Product product);
    int upProduct(Product product);
    int delProduct(Integer id);
    void importPartExcel(List<StructureTestObjectData> list);
}
basic-server/src/main/java/com/ruoyi/basic/service/ProductSupplierDensityService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.basic.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.ruoyi.basic.pojo.ProductSupplierDensity;
/**
 * äº§å“åŽ‚å®¶å¯†åº¦ç»‘å®šè¡¨
 *
 * @author zhuo
 * @since 2024-09-19
 */
public interface ProductSupplierDensityService extends IService<ProductSupplierDensity> {
    IPage<ProductSupplierDensity> selectByProductId(Page page, ProductSupplierDensity supplierDensity);
    void addProductSupplierDensity(ProductSupplierDensity supplierDensity);
    void updateProductSupplierDensity(ProductSupplierDensity supplierDensity);
}
basic-server/src/main/java/com/ruoyi/basic/service/SealService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.basic.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.ruoyi.basic.pojo.Laboratory;
import com.ruoyi.basic.pojo.Seal;
import java.util.List;
import java.util.Map;
public interface SealService extends IService<Seal> {
    //新增
    int addSeal(Seal seal);
    //查询
    IPage<Seal> selectSeal(Page page, Seal seal);
    List<Laboratory>  Laboratory(Integer id);
}
basic-server/src/main/java/com/ruoyi/basic/service/StandardMethodListService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.basic.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.pojo.StandardMethodList;
import java.util.List;
import java.util.Map;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€standard_method_list(标准树下的标准列表)】的数据库操作Service
* @createDate 2024-03-04 13:44:04
*/
public interface StandardMethodListService extends IService<StandardMethodList> {
    int addStandardMethodList(Integer standardId, String tree);
    Map<String, List<?>> selectsStandardMethodByFLSSM(String tree);
    Map<String, List<?>> selectsStandardMethodByFLSSM2(String tree);
    int delStandardMethodByFLSSM(Integer id);
    List<StandardMethodList> selectStandardMethodEnum();
    Integer getStandardMethodId(String code);
}
basic-server/src/main/java/com/ruoyi/basic/service/StandardMethodService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.basic.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.ruoyi.basic.pojo.StandardMethod;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€standard_method(标准方法)】的数据库操作Service
* @createDate 2024-03-03 19:21:41
*/
public interface StandardMethodService extends IService<StandardMethod> {
    IPage<StandardMethod> selectStandardMethodList(Page page, StandardMethod standardMethod);
    List<StandardMethod> selectStandardMethods();
    int addStandardMethod(StandardMethod standardMethod);
    int delStandardMethod(Integer id);
    int upStandardMethod(StandardMethod standardMethod);
    void inputExcel(MultipartFile file) throws IOException;
}
basic-server/src/main/java/com/ruoyi/basic/service/StandardProductListService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.basic.service;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.dto.CopyStandardProductListDto;
import com.ruoyi.basic.dto.InsSampleReceiveDto;
import com.ruoyi.basic.dto.ResetTreeDragDTO;
import com.ruoyi.basic.pojo.StandardProductList;
import java.util.List;
import java.util.Map;
/**
 * @author Administrator
 * @description é’ˆå¯¹è¡¨ã€standard_product_list(标准树下的检验项目)】的数据库操作Service
 * @createDate 2024-03-05 10:33:29
 */
public interface StandardProductListService extends IService<StandardProductList> {
    int upStandardProductList(StandardProductList list);
    int delStandardProduct(JSONArray list);
    List<StandardProductList> selectStandardProductList(InsSampleReceiveDto insSample);
    Map<String, Object> selectStandardProductListByMethodId(Integer id, String tree, Integer page);
    IPage<StandardProductList> selectStandardProductByMethodId(Integer id, String tree, Integer page, String laboratory, String item, String items);
    Map<String, List<?>> selectStandardProductEnumByMethodId(Integer id, String tree, String item);
    boolean updateSection(StandardProductList list);
    /**
     * æ ‡å‡†åº“拖拽
     * @param resetTreeDragDTO
     */
    void resetTreeDrag(ResetTreeDragDTO resetTreeDragDTO);
    /**
     * æ ‡å‡†åº“拖拽
     * @param standardProductLists
     */
    void resetTreeDragBatch(List<StandardProductList> standardProductLists);
    /**
     * æ£€éªŒé¡¹è¦æ±‚值对比
     * @param copyStandardProductListDto
     * @return
     */
    List<StandardProductList> copyStandardProductList(CopyStandardProductListDto copyStandardProductListDto);
    /**
     * æ£€éªŒé¡¹è¦æ±‚值对比一个
     * @param copyStandardProductListDto
     * @return
     */
    List<StandardProductList> copyStandardProductOne(CopyStandardProductListDto copyStandardProductListDto);
    /**
     * æ£€éªŒé¡¹å¤åˆ¶æŽ’序
     * @param copyStandardProductListDto
     * @return
     */
    boolean copyStandardProductSort(CopyStandardProductListDto copyStandardProductListDto);
}
basic-server/src/main/java/com/ruoyi/basic/service/StandardProductListService2.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.basic.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.pojo.StandardProductList;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€standard_product_list(标准树下的检验项目)】的数据库操作Service
* @createDate 2024-03-05 10:33:29
*/
public interface StandardProductListService2 extends IService<StandardProductList> {
}
basic-server/src/main/java/com/ruoyi/basic/service/StandardProductListSupplierAskService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.basic.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.pojo.StandardProductListSupplierAsk;
import java.util.List;
/**
 * æ£€éªŒé¡¹ç›®åŽ‚å®¶å¯†åº¦ç»‘å®šè¡¨
 *
 * @author makejava
 * @since 2024-09-23
 */
public interface StandardProductListSupplierAskService extends IService<StandardProductListSupplierAsk> {
    List<StandardProductListSupplierAsk> selectByProductId(StandardProductListSupplierAsk supplierAsk);
    Integer addProductSupplierAsk(StandardProductListSupplierAsk supplierAsk);
    Integer updateProductSupplierAsk(StandardProductListSupplierAsk supplierAsk);
}
basic-server/src/main/java/com/ruoyi/basic/service/StandardTemplateService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.basic.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.ruoyi.basic.pojo.StandardTemplate;
import java.util.List;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€standard_template(标准模板)】的数据库操作Service
* @createDate 2024-03-11 13:47:52
*/
public interface StandardTemplateService extends IService<StandardTemplate> {
    IPage<StandardTemplate> selectStandardTemplatePageList(Page page, StandardTemplate standardTemplate);
    int addStandardTemplate(StandardTemplate standardTemplate);
    int upStandardTemplate(StandardTemplate standardTemplate);
    int delStandardTemplate(Integer id);
    List<StandardTemplate> getStandardTemplate();
    String getStandTempThingById(Integer templateId);
    String getStandTempNameById(Integer templateId);
    StandardTemplate getStandTempIdByName(String name);
    int copyStandardTemplate(StandardTemplate newTemplate);
}
basic-server/src/main/java/com/ruoyi/basic/service/StandardTreeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.ruoyi.basic.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.dto.FactoryDto;
import com.ruoyi.basic.dto.SampleTypeDto;
import com.ruoyi.basic.pojo.StandardTree;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€standard_tree(标准树)】的数据库操作Service
* @createDate 2024-03-01 15:06:44
*/
public interface StandardTreeService extends IService<StandardTree> {
    List<FactoryDto> selectStandardTreeList();
    int addStandardTree(StandardTree standardTree);
    int delStandardTree(String tree);
    int addStandardProduct(String ids, String tree);
    List<SampleTypeDto> getStandardTree2();
    int upStandardProducts(Map<String, Object> product);
    List<StandardTree> getStandTreeBySampleType(String laboratory, String sampleType);
    void inExcelOfTree(MultipartFile file);
    void resetTreeOfPrice(String tree, Integer standardId);
    void resetTreeOfHour(String tree, Integer standardId);
    void resetTreeOfAsk(String tree, Integer standardId);
    void importWorkstationExcel(MultipartFile file);
    /**
     * æ ‡å‡†æ•°æŽ’序
     * @param list
     * @return
     */
    boolean updateTreeSort(List<FactoryDto> list);
    int updateStandardTree(StandardTree standardTree);
}
basic-server/src/main/java/com/ruoyi/basic/service/StructureItemParameterService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package com.ruoyi.basic.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.pojo.StructureItemParameter;
public interface StructureItemParameterService extends IService<StructureItemParameter> {
    void removeNoSample(String sample);
}
basic-server/src/main/java/com/ruoyi/basic/service/StructureTestObjectPartService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.basic.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.ruoyi.basic.pojo.StructureTestObjectPart;
/**
 * æ£€éªŒå¯¹è±¡é›¶ä»¶è¡¨
 *
 * @author zhuo
 * @since 2024-08-07
 */
public interface StructureTestObjectPartService extends IService<StructureTestObjectPart> {
    IPage<StructureTestObjectPart> selectByTestObjectId(Page page, StructureTestObjectPart structureTestObjectPart);
    void addTestObjectPart(StructureTestObjectPart structureTestObjectPart);
    void updateTestObjectPart(StructureTestObjectPart structureTestObjectPart);
}
basic-server/src/main/java/com/ruoyi/basic/service/StructureTestObjectService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.basic.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.pojo.StructureTestObject;
/**
 * æ£€æµ‹å¯¹è±¡(StructureTestObject)$desc
 *
 * @author makejava
 * @since 2024-09-13 09:45:55
 */
public interface StructureTestObjectService extends IService<StructureTestObject> {
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,185 @@
package com.ruoyi.basic.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
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.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.basic.dto.PageTestObjectDto;
import com.ruoyi.basic.dto.TestItemDto;
import com.ruoyi.basic.mapper.*;
import com.ruoyi.basic.pojo.*;
import com.ruoyi.basic.service.CapacityScopeService;
import com.ruoyi.basic.service.StandardProductListService;
import com.ruoyi.basic.service.StructureItemParameterService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * æ£€éªŒé¡¹ç›®å‚æ•°(StructureItemParameter)表服务实现类
 *
 * @author makejava
 * @since 2024-02-26 16:21:17
 */
@Service
@AllArgsConstructor
public class CapacityScopeServiceImpl extends ServiceImpl<StructureItemParameterMapper, StructureItemParameter> implements CapacityScopeService {
    private LaboratoryMapper laboratoryMapper;
    private StructureItemParameterMapper structureItemParameterMapper;
    private StructureTestObjectMapper structureTestObjectMapper;
    private ProductMapper productMapper;
    private StructureTestObjectPartMapper structureTestObjectPartMapper;
    private ProductPartMapper productPartMapper;
    private StandardProductListService standardProductListService;
    private StandardTreeMapper standardTreeMapper;
    private StructureItemParameterService structureItemParameterService;
    @Override
    public IPage<StructureItemParameter> selectItemParameterList(Page page, StructureItemParameter itemParameter) {
       return structureItemParameterMapper.selectItemParameterList(page, QueryWrappers.queryWrappers(itemParameter));
    }
    @Override
    public int addItemParameter(StructureItemParameter itemParameter) {
        if (itemParameter.getBsm().equals("")||itemParameter.getBsm()==null){
            itemParameter.setBsm("0");
        }
        int insert = structureItemParameterMapper.insert(itemParameter);
        return insert;
    }
    @Override
    public int delItemParameter(Integer id) {
        return structureItemParameterMapper.deleteById(id);
    }
    @Override
    public int upItemParameter(StructureItemParameter itemParameter) {
        return structureItemParameterMapper.updateById(itemParameter);
    }
    @Override
    public IPage<PageTestObjectDto> selectTestObjectList(Page page, PageTestObjectDto pageTestObjectDto) {
        String partNo = pageTestObjectDto.getPartNo();
        pageTestObjectDto.setPartNo(null);
        return structureTestObjectMapper.selectTestObjectList(page, QueryWrappers.queryWrappers(pageTestObjectDto),partNo);
    }
    @Override
    public int addTestObject(StructureTestObject testObject) {
        Long count = structureTestObjectMapper.selectCount(Wrappers.<StructureTestObject>lambdaQuery().eq(StructureTestObject::getSpecimenName, testObject.getSpecimenName()));
        if(count.compareTo(0L) > 0){
            throw new BaseException("检验对象不能重复");
        }
        return structureTestObjectMapper.insert(testObject);
    }
    @Override
    public int delTestObject(Integer id) {
        // äº§å‡ºæ£€éªŒå¯¹è±¡äº§å“ç»´æŠ¤
        structureTestObjectPartMapper.delete(Wrappers.<StructureTestObjectPart>lambdaQuery()
                .eq(StructureTestObjectPart::getTestObjectId, id));
        // åˆ é™¤äº§å“ç»´æŠ¤çš„零件绑定
        List<Product> products = productMapper.selectList(Wrappers.<Product>lambdaQuery()
                .eq(Product::getObjectId, id));
        List<Integer> productIds = products.stream().map(Product::getId).collect(Collectors.toList());
        productPartMapper.delete(Wrappers.<ProductPart>lambdaQuery()
                .in(ProductPart::getProductId, productIds));
        // åˆ é™¤äº§å“ç»´æŠ¤
        productMapper.delete(Wrappers.<Product>lambdaQuery()
                .in(Product::getId, productIds));
        return structureTestObjectMapper.deleteById(id);
    }
    @Override
    public int upTestObject(StructureTestObject testObject) {
        // æŸ¥è¯¢æ—§çš„æ£€éªŒå¯¹è±¡
        StructureTestObject oldTestObject = structureTestObjectMapper.selectById(testObject.getId());
        if (!oldTestObject.getSpecimenName().equals(testObject.getSpecimenName())) {
            // æŸ¥è¯¢æ‰€æœ‰å¯¹è±¡ä¸€æ ·çš„æ£€éªŒé¡¹ç›®
            List<StandardProductList> standardProductLists = standardProductListService.list(Wrappers.<StandardProductList>lambdaUpdate()
                    .eq(StandardProductList::getSampleType, oldTestObject.getSpecimenName()));
            if (CollectionUtils.isNotEmpty(standardProductLists)){
                for (StandardProductList standardProductList : standardProductLists) {
                    // ä¿®æ”¹æ‰€æœ‰çš„对象名称和数型结构
                    standardProductList.setSampleType(testObject.getSpecimenName());
                    // éœ€è¦æˆªå–第三级, é¿å…ä¸‰å››çº§åç§°ä¸€æ ·ä¿®æ”¹é”™è¯¯
                    String[] trees = standardProductList.getTree().split(" - ");
                    trees[2] = testObject.getSpecimenName();
                    List<String> list = CollUtil.newArrayList(trees);
                    String newName = CollUtil.join(list, " - ");
                    standardProductList.setTree(newName);
                }
                standardProductListService.updateBatchById(standardProductLists);
            }
            // ä¿®æ”¹æ£€éªŒé¡¹ç›®å‚数的检验对象
            // æ‹¼æŽ¥ ["object", æŸ¥è¯¢æ£€éªŒé¡¹ç›®å‚数修改绑定的检验对象
            String format = "[\"{}\",";
            String sampleOld = StrUtil.format(format, oldTestObject.getSpecimenName());
            List<StructureItemParameter> itemParameterList = structureItemParameterService.list(Wrappers.<StructureItemParameter>lambdaQuery()
                    .like(StructureItemParameter::getSample, sampleOld));
            if (CollectionUtils.isNotEmpty(itemParameterList)) {
                for (StructureItemParameter structureItemParameter : itemParameterList) {
                    // ä¿®æ”¹ç»‘定的样品名称
                    String sampleNew = StrUtil.format(format, testObject.getSpecimenName());
                    String sampleUp = structureItemParameter.getSample().replace(sampleOld, sampleNew);
                    structureItemParameter.setSample(sampleUp);
                }
                structureItemParameterService.updateBatchById(itemParameterList);
            }
            // ä¿®æ”¹æ ‘的型号
            standardTreeMapper.update(null, Wrappers.<StandardTree>lambdaUpdate()
                    .eq(StandardTree::getSampleType, oldTestObject.getSpecimenName())
                    .set(StandardTree::getSampleType, testObject.getSpecimenName()));
        }
        Long count = structureTestObjectMapper.selectCount(Wrappers.<StructureTestObject>lambdaQuery()
                .eq(StructureTestObject::getSpecimenName, testObject.getSpecimenName())
                .ne(StructureTestObject::getId, testObject.getId()));
        if(count.compareTo(0L) > 0){
            throw new BaseException("检验对象不能重复");
        }
        return structureTestObjectMapper.updateById(testObject);
    }
    @Override
    public List<StructureTestObject> selectTestObjectByName() {
        return structureTestObjectMapper.selectList(Wrappers.<StructureTestObject>lambdaQuery().select(StructureTestObject::getSpecimenName,StructureTestObject::getId));
    }
    //设备里面选择检验项目(树形结构)
    @Override
    public List<Map<String, Object>> getInsProduction() {
        return structureItemParameterMapper.getInsProduction();
    }
    @Override
    public List<TestItemDto> getItemTree() {
        return structureItemParameterMapper.getItemTree();
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/CertificationServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package com.ruoyi.basic.service.impl;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.basic.mapper.CertificationMapper;
import com.ruoyi.basic.pojo.Certification;
import com.ruoyi.basic.service.CertificationService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class CertificationServiceImpl extends ServiceImpl<CertificationMapper, Certification> implements CertificationService {
    private CertificationMapper certificationMapper;
    //查询资质明细列表
    @Override
    public IPage<Certification> getCertificationDetail(Page page, Certification certification) {
        return  certificationMapper.getCertificationDetail(page, QueryWrappers.queryWrappers(certification));
    }
    //添加资质明细列表
    @Override
    public int addCertificationDetail(Certification certification) {
        return certificationMapper.insert(certification);
    }
    //删除资质明细列表
    @Override
    public int delCertificationDetail(String ids) {
        List<Integer> list = JSON.parseArray(ids,Integer.class);
        return certificationMapper.deleteBatchIds(list);
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/LaboratoryServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package com.ruoyi.basic.service.impl;
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.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.basic.mapper.LaboratoryMapper;
import com.ruoyi.basic.pojo.Laboratory;
import com.ruoyi.basic.service.LaboratoryService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * å®žéªŒå®¤ç®¡ç†(Laboratory)表服务实现类
 */
@Service
@AllArgsConstructor
public class LaboratoryServiceImpl extends ServiceImpl<LaboratoryMapper, Laboratory> implements LaboratoryService {
    private LaboratoryMapper laboratoryMapper;
    @Override
    public IPage<Laboratory> selectItemParameter(Page page, Laboratory itemParameter) {
        return laboratoryMapper.selectItemParameter(page, QueryWrappers.queryWrappers(itemParameter));
    }
    @Override
    public int addParameter(Laboratory itemParameter) {
        return laboratoryMapper.insert(itemParameter);
    }
    @Override
    public int delParameter(Integer id) {
        return laboratoryMapper.deleteById(id);
    }
    @Override
    public int upParameter(Laboratory itemParameter) {
        return laboratoryMapper.updateById(itemParameter);
    }
    @Override
    public List<Laboratory> obtainItemParameterList() {
        return laboratoryMapper.selectList(Wrappers.<Laboratory>lambdaQuery().select(Laboratory::getLaboratoryName, Laboratory::getId));
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/ProductPartServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.basic.mapper.ProductPartMapper;
import com.ruoyi.basic.mapper.StructureTestObjectPartMapper;
import com.ruoyi.basic.pojo.ProductPart;
import com.ruoyi.basic.pojo.StructureTestObjectPart;
import com.ruoyi.basic.service.ProductPartService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Transactional
@Service
@AllArgsConstructor
public class ProductPartServiceImpl extends ServiceImpl<ProductPartMapper, ProductPart> implements ProductPartService {
    private  ProductPartMapper productPartMapper;
    private StructureTestObjectPartMapper structureTestObjectPartMapper;
    @Override
    public IPage<ProductPart> selectByProductId(IPage<ProductPart> page,ProductPart productPart) {
        return productPartMapper.selectListByProductId(page, QueryWrappers.queryWrappers(productPart),productPart.getProductId());
    }
    @Override
    public void addProductPart(ProductPart productPart) {
        if (productPart.getProductId() == null) {
            throw new BaseException("缺少产品对象id");
        }
        this.isPartNoExist(productPart.getPartNo(), productPart.getProductId(), null);
        productPartMapper.insert(productPart);
    }
    @Override
    public void updateProductPartById(ProductPart productPart) {
        this.isPartNoExist(productPart.getPartNo(), productPart.getProductId(), productPart.getId());
        if (productPart.getProductId() == null) {
            throw new BaseException("缺少产品对象id");
        }
        productPartMapper.updateById(productPart);
    }
    // åˆ¤æ–­é›¶ä»¶å·æ˜¯å¦å­˜åœ¨
    public void isPartNoExist(String partNo,Integer productId, Integer id) {
        // é›¶ä»¶å·å”¯ä¸€ ä½†ä¸å¿…å¡«
        if (StringUtils.isNotBlank(partNo)) {
            Long count = productPartMapper.selectCount(new LambdaQueryWrapper<ProductPart>()
//                    .eq(ProductPart::getProductId, productId)
                    .eq(ProductPart::getPartNo, partNo)
                    .ne(id != null, ProductPart::getId, id));
            Long selectCount = structureTestObjectPartMapper.selectCount(Wrappers.<StructureTestObjectPart>lambdaQuery()
                    .eq(StructureTestObjectPart::getPartNo, partNo));
            if (count > 0 || selectCount > 0) {
                throw new BaseException("该零件号已绑定过检验对象");
            }
        } else {
            throw new BaseException("请输入零件号");
        }
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,188 @@
package com.ruoyi.basic.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
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.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.basic.dto.ProductDTO1;
import com.ruoyi.basic.excel.StructureTestObjectData;
import com.ruoyi.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductPartMapper;
import com.ruoyi.basic.mapper.StandardTreeMapper;
import com.ruoyi.basic.mapper.StructureTestObjectMapper;
import com.ruoyi.basic.pojo.*;
import com.ruoyi.basic.service.LaboratoryService;
import com.ruoyi.basic.service.ProductService;
import com.ruoyi.basic.service.StandardProductListService;
import com.ruoyi.basic.service.StructureItemParameterService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @author z1292
* @description é’ˆå¯¹è¡¨ã€product(产品表)】的数据库操作Service实现
* @createDate 2024-04-26 01:11:02
*/
@Service
@AllArgsConstructor
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product>
    implements ProductService{
    private ProductMapper productMapper;
    private LaboratoryService laboratoryService;
    private StructureTestObjectMapper structureTestObjectMapper;
    private ProductPartMapper productPartMapper;
    private StandardProductListService standardProductListService;
    private StandardTreeMapper standardTreeMapper;
    private StructureItemParameterService structureItemParameterService;
    @Override
    public IPage<Product> selectProductListByObjectId(Page page, ProductDTO1 product) {
        String partNo = product.getPartNo();
        product.setPartNo(null);
        return productMapper.selectProductListByObjectId(page, QueryWrappers.queryWrappers(product), partNo);
    }
    @Override
    public int addProduct(Product product) {
        return productMapper.insert(product);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int upProduct(Product product) {
        // æŸ¥è¯¢åŽŸæœ¬çš„åç§°
        Product oldProduct = productMapper.selectById(product.getId());
        if (!oldProduct.getName().equals(product.getName())) {
            // ä¿®æ”¹åç§°åŒ¹é…çš„æ ‡å‡†æ ‘下的检验项目
            // æŸ¥è¯¢æ‰€æœ‰å¯¹è±¡+名称的树
            StructureTestObject testObject = structureTestObjectMapper.selectById(oldProduct.getObjectId());
            List<StandardProductList> standardProductLists = standardProductListService.list(Wrappers.<StandardProductList>lambdaUpdate()
                    .eq(StandardProductList::getSample, oldProduct.getName())
                    .eq(StandardProductList::getSampleType, testObject.getSpecimenName()));
            if (CollectionUtils.isNotEmpty(standardProductLists)) {
                for (StandardProductList standardProductList : standardProductLists) {
                    // ä¿®æ”¹æ ·å“åç§°
                    standardProductList.setSample(product.getName());
                    // ä¿®æ”¹æ ‘名称
                    // éœ€è¦æˆªå–第四级, é¿å…ä¸‰å››çº§åç§°ä¸€æ ·ä¿®æ”¹é”™è¯¯
                    String[] trees = standardProductList.getTree().split(" - ");
                    trees[3] = product.getName();
                    List<String> list = CollUtil.newArrayList(trees);
                    String newName = CollUtil.join(list, " - ");
                    standardProductList.setTree(newName);
                }
                standardProductListService.updateBatchById(standardProductLists);
            }
            // ä¿®æ”¹æ£€éªŒé¡¹ç›®å‚数的检验对象
            // æ‹¼æŽ¥["object","product"]查询检验项目参数修改绑定的检验对象
            String format = "[\"{}\",\"{}\"]";
            String sampleOld = StrUtil.format(format, testObject.getSpecimenName(), oldProduct.getName());
            List<StructureItemParameter> itemParameterList = structureItemParameterService.list(Wrappers.<StructureItemParameter>lambdaQuery()
                    .like(StructureItemParameter::getSample, sampleOld));
            if (CollectionUtils.isNotEmpty(itemParameterList)) {
                for (StructureItemParameter structureItemParameter : itemParameterList) {
                    // ä¿®æ”¹ç»‘定的样品名称
                    String sampleNew = StrUtil.format(format, testObject.getSpecimenName(), product.getName());
                    String sampleUp = structureItemParameter.getSample().replace(sampleOld, sampleNew);
                    structureItemParameter.setSample(sampleUp);
                }
                structureItemParameterService.updateBatchById(itemParameterList);
            }
            // ä¿®æ”¹æ ‘的型号
            standardTreeMapper.update(null, Wrappers.<StandardTree>lambdaUpdate()
                    .eq(StandardTree::getSampleType, testObject.getSpecimenName())
                    .eq(StandardTree::getSample, oldProduct.getName())
                    .set(StandardTree::getSample, product.getName()));
        }
        return productMapper.updateById(product);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int delProduct(Integer id) {
        // åˆ é™¤é›¶ä»¶ç»‘定
        productPartMapper.delete(Wrappers.<ProductPart>lambdaQuery()
                .eq(ProductPart::getProductId, id));
        return productMapper.deleteById(id);
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void importPartExcel(List<StructureTestObjectData> list) {
        list.forEach(i -> {
            // æ£€éªŒå¯¹è±¡
            StructureTestObject structureTestObject1 = structureTestObjectMapper.selectOne(Wrappers.<StructureTestObject>lambdaQuery()
                    .eq(StructureTestObject::getSpecimenName, i.getSpecimenName())
                    .eq(StructureTestObject::getSpecimenNameEn, i.getSpecimenNameEn()));
            Laboratory laboratory = laboratoryService.getOne(Wrappers.<Laboratory>lambdaQuery()
                    .eq(Laboratory::getLaboratoryName, i.getLaboratory()));
            if (ObjectUtils.isEmpty(laboratory)) {
                throw new BaseException("未找到该场所:" + i.getLaboratory() + ",请检查是否存在该场所!");
            }
            // å¦‚果为空进行新增
            if(ObjectUtils.isEmpty(structureTestObject1)) {
                StructureTestObject structureTestObject = new StructureTestObject();
                structureTestObject.setLaboratoryId(laboratory.getId());
                structureTestObject.setSpecimenName(i.getSpecimenName());
                structureTestObject.setSpecimenNameEn(i.getSpecimenNameEn());
                structureTestObject.setCode(i.getCode());
                structureTestObjectMapper.insert(structureTestObject);
                // äº§å“
                Product product = productMapper.selectOne(Wrappers.<Product>lambdaQuery()
                        .eq(Product::getName, i.getName())
                        .eq(Product::getNameEn, i.getNameEn()));
                if (ObjectUtils.isEmpty(product)){
                    Product product1 = new Product();
                    product1.setName(i.getName());
                    product1.setNameEn(i.getNameEn());
                    product1.setObjectId(structureTestObject.getId());
                    baseMapper.insert(product1);
                }
            } else {
                structureTestObject1.setCode(i.getCode());
                structureTestObject1.setLaboratoryId(laboratory.getId());
                structureTestObjectMapper.updateById(structureTestObject1);
                // äº§å“
                Product product = productMapper.selectOne(Wrappers.<Product>lambdaQuery()
                        .eq(Product::getName, i.getName())
                        .eq(Product::getNameEn, i.getNameEn()));
                if (ObjectUtils.isEmpty(product)){
                    Product product1 = new Product();
                    product1.setName(i.getName());
                    product1.setNameEn(i.getNameEn());
                    product1.setObjectId(structureTestObject1.getId());
                    baseMapper.insert(product1);
                } else {
                    product.setName(i.getName());
                    product.setNameEn(i.getNameEn());
                    product.setObjectId(structureTestObject1.getId());
                    baseMapper.updateById(product);
                }
            }
        });
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/ProductSupplierDensityServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.basic.mapper.ProductSupplierDensityMapper;
import com.ruoyi.basic.pojo.ProductSupplierDensity;
import com.ruoyi.basic.service.ProductSupplierDensityService;
import org.springframework.stereotype.Service;
/**
 * äº§å“åŽ‚å®¶å¯†åº¦ç»‘å®šè¡¨
 *
 * @author zhuo
 * @since 2024-09-19
 */
@Service
public class ProductSupplierDensityServiceImpl extends ServiceImpl<ProductSupplierDensityMapper, ProductSupplierDensity> implements ProductSupplierDensityService {
    @Override
    public IPage<ProductSupplierDensity> selectByProductId(Page page, ProductSupplierDensity supplierDensity) {
        if (supplierDensity.getProductId() == null) {
            throw new BaseException("缺少产品对象id");
        }
        return baseMapper.selectListByProductId(page, QueryWrappers.queryWrappers(supplierDensity), supplierDensity.getProductId());
    }
    @Override
    public void addProductSupplierDensity(ProductSupplierDensity supplierDensity) {
        if (supplierDensity.getProductId() == null) {
            throw new BaseException("缺少产品对象id");
        }
        // æŸ¥è¯¢æ”¹åŽ‚å®¶æ˜¯å¦ç»‘å®šè¿‡
//        Long count = baseMapper.selectCount(Wrappers.<ProductSupplierDensity>lambdaQuery()
//                .eq(ProductSupplierDensity::getProductId, supplierDensity.getProductId())
//                .eq(ProductSupplierDensity::getModel, supplierDensity)
//                .eq(ProductSupplierDensity::getSupplierName, supplierDensity.getSupplierName()));
//        if (count > 0){
//            throw new BaseException("该产品已绑定过该厂家");
//        }
        baseMapper.insert(supplierDensity);
    }
    @Override
    public void updateProductSupplierDensity(ProductSupplierDensity supplierDensity) {
        if (supplierDensity.getProductId() == null) {
            throw new BaseException("缺少产品对象id");
        }
        // æŸ¥è¯¢æ”¹åŽ‚å®¶æ˜¯å¦ç»‘å®šè¿‡
//        Long count = baseMapper.selectCount(Wrappers.<ProductSupplierDensity>lambdaQuery()
//                .ne(ProductSupplierDensity::getId, supplierDensity.getId())
//                .eq(ProductSupplierDensity::getProductId, supplierDensity.getProductId())
//                .eq(ProductSupplierDensity::getModel, supplierDensity)
//                .eq(ProductSupplierDensity::getSupplierName, supplierDensity.getSupplierName()));
//        if (count > 0){
//            throw new BaseException("该产品已绑定过该厂家");
//        }
        baseMapper.updateById(supplierDensity);
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/SealServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.mapper.SealMapper;
import com.ruoyi.basic.pojo.Laboratory;
import com.ruoyi.basic.pojo.Seal;
import com.ruoyi.basic.service.SealService;
import com.ruoyi.common.utils.QueryWrappers;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@AllArgsConstructor
public class SealServiceImpl extends ServiceImpl<SealMapper, Seal> implements SealService {
    private SealMapper sealMapper;
    @Override
    public int addSeal(Seal seal) {
        return sealMapper.insert(seal);
    }
    @Override
    public IPage<Seal> selectSeal(Page page, Seal seal) {
        return sealMapper.selectSeal(page, QueryWrappers.queryWrappers(seal));
    }
    @Override
    public List<Laboratory> Laboratory(Integer labId) {
        return sealMapper.selectLaboratory(labId);
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodListServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,150 @@
package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.mapper.StandardMethodListMapper;
import com.ruoyi.basic.mapper.StandardProductListMapper;
import com.ruoyi.basic.pojo.StandardMethodList;
import com.ruoyi.basic.pojo.StandardProductList;
import com.ruoyi.basic.service.StandardMethodListService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€standard_method_list(标准树下的标准列表)】的数据库操作Service实现
* @createDate 2024-03-04 13:44:04
*/
@Service
@AllArgsConstructor
public class StandardMethodListServiceImpl extends ServiceImpl<StandardMethodListMapper, StandardMethodList>
    implements StandardMethodListService{
    private StandardMethodListMapper standardMethodListMapper;
    private StandardProductListMapper standardProductListMapper;
    @Override
    public int addStandardMethodList(Integer standardId, String tree) {
        String[] trees = tree.split(" - ");
        Map<String, String> map = standardMethodListMapper.selectStandardMethodById(standardId);
        StandardMethodList list = new StandardMethodList();
        list.setCode(map.get("code"));
        list.setName(map.get("name"));
        list.setRemark(map.get("remark"));
        list.setFactory(trees[0]);
        try {
            list.setLaboratory(trees[1]);
        }catch (Exception e){}
        try {
            list.setSampleType(trees[2]);
        }catch (Exception e){}
        try {
            list.setSample(trees[3]);
        }catch (Exception e){}
        try {
            list.setModel(trees[4]);
        }catch (Exception e){}
        standardMethodListMapper.insert(list);
        List<StandardProductList> standardProductLists = standardMethodListMapper.selectParameterList(list.getCode());
        for (StandardProductList standardProductList : standardProductLists) {
            standardProductList.setStandardMethodListId(list.getId());
            standardProductList.setFactory(trees[0]);
            try {
                standardProductList.setLaboratory(trees[1]);
            }catch (Exception e){}
            try {
                standardProductList.setSampleType(trees[2]);
            }catch (Exception e){}
            try {
                standardProductList.setSample(trees[3]);
            }catch (Exception e){}
            try {
                standardProductList.setModel(trees[4]);
            }catch (Exception e){}
            standardProductListMapper.insert(standardProductList);
        }
        return 1;
    }
    @Override
    public Map<String, List<?>> selectsStandardMethodByFLSSM(String tree) {
        String[] trees = tree.split(" - ");
        Map<String, List<?>> map = new HashMap<>();
        String str = "";
        List<StandardMethodList> standardMethodLists = new ArrayList<>();
        switch (trees.length){
            case 5:
                str += "\"" + trees[2] + "\",\"" + trees[3] + "\",\"" + trees[4] + "\"";
                standardMethodLists.addAll(standardMethodListMapper.selectStandardMethodLists(str));
                standardMethodLists.addAll(standardMethodListMapper.selectStandardMethodLists("\"" + trees[2] + "\",\"" + trees[3] + "\""));
                standardMethodLists.addAll(standardMethodListMapper.selectStandardMethodLists("\"" + trees[2] + "\""));
                break;
            case 4:
                str += "\"" + trees[2] + "\",\"" + trees[3] + "\"";
                standardMethodLists.addAll(standardMethodListMapper.selectStandardMethodLists(str));
                standardMethodLists.addAll(standardMethodListMapper.selectStandardMethodLists("\"" + trees[2] + "\""));
                break;
            case 3:
                str += "\"" + trees[2] + "\"";
                standardMethodLists.addAll(standardMethodListMapper.selectStandardMethodLists3(str));
                break;
            default:
                map.put("standardMethodList", null);
                return map;
        }
        standardMethodLists.addAll(standardMethodListMapper.selectStandardMethodListsByNull(str));
        map.put("standardMethodList", standardMethodLists);
        return map;
    }
    @Override
    public Map<String, List<?>> selectsStandardMethodByFLSSM2(String tree) {
        String[] trees = tree.split(" - ");
        List<StandardMethodList> standardMethodLists = null;
        switch (trees.length){
            case 5:
                standardMethodLists = standardMethodListMapper.selectStandardMethodLists2(trees[0],trees[1],trees[2],trees[3],trees[4]);
                break;
            case 4:
                standardMethodLists = standardMethodListMapper.selectStandardMethodLists2(trees[0],trees[1],trees[2],trees[3],null);
                break;
            case 3:
                standardMethodLists = standardMethodListMapper.selectStandardMethodLists2(trees[0],trees[1],trees[2],null,null);
                break;
            case 2:
                standardMethodLists = standardMethodListMapper.selectStandardMethodLists2(trees[0],trees[1],null,null,null);
                break;
            case 1:
                standardMethodLists = standardMethodListMapper.selectStandardMethodLists2(trees[0],null,null,null,null);
                break;
        }
        Map<String, List<?>> map = new HashMap<>();
        map.put("standardMethodList", standardMethodLists);
        return map;
    }
    @Override
    public int delStandardMethodByFLSSM(Integer id) {
        standardProductListMapper.delete(Wrappers.<StandardProductList>lambdaUpdate().eq(StandardProductList::getStandardMethodListId, id));
        return standardMethodListMapper.deleteById(id);
    }
    @Override
    public List<StandardMethodList> selectStandardMethodEnum() {
        return standardMethodListMapper.selectListEnum();
    }
    @Override
    public Integer getStandardMethodId(String code) {
        return baseMapper.getStandardMethodId(code);
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardMethodServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,260 @@
package com.ruoyi.basic.service.impl;
import cn.hutool.json.JSONUtil;
import cn.hutool.poi.excel.ExcelUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
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.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.basic.mapper.StandardMethodMapper;
import com.ruoyi.basic.mapper.StandardProductListMapper;
import com.ruoyi.basic.mapper.StructureItemParameterMapper;
import com.ruoyi.basic.pojo.StandardMethod;
import com.ruoyi.basic.pojo.StandardProductList;
import com.ruoyi.basic.pojo.StructureItemParameter;
import com.ruoyi.basic.service.StandardMethodService;
import com.ruoyi.basic.service.StandardProductListService;
import com.ruoyi.basic.service.StructureItemParameterService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.CompletableFuture;
/**
 * @author Administrator
 * @description é’ˆå¯¹è¡¨ã€standard_method(标准方法)】的数据库操作Service实现
 * @createDate 2024-03-03 19:21:41
 */
@Service
@AllArgsConstructor
public class StandardMethodServiceImpl extends ServiceImpl<StandardMethodMapper, StandardMethod>
        implements StandardMethodService {
    private StandardMethodMapper standardMethodMapper;
    StandardProductListMapper standardProductListMapper;
    StandardProductListService standardProductListService;
    StructureItemParameterMapper structureItemParameterMapper;
    StructureItemParameterService structureItemParameterService;
    @Override
    public IPage<StandardMethod> selectStandardMethodList(Page page, StandardMethod standardMethod) {
        return standardMethodMapper.selectStandardMethodList(page, QueryWrappers.queryWrappers(standardMethod));
    }
    @Override
    public List<StandardMethod> selectStandardMethods() {
        return standardMethodMapper.selectList(Wrappers.<StandardMethod>lambdaQuery().select(StandardMethod::getId, StandardMethod::getCode, StandardMethod::getName).ne(StandardMethod::getId, 0));
    }
    @Override
    public int addStandardMethod(StandardMethod standardMethod) {
        int insert = standardMethodMapper.insert(standardMethod);
        return insert;
    }
    @Override
    public int delStandardMethod(Integer id) {
        int i = standardMethodMapper.deleteById(id);
        return i;
    }
    @Override
    public int upStandardMethod(StandardMethod standardMethod) {
        StandardMethod oldStandardMethod = standardMethodMapper.selectById(standardMethod.getId());
        if (!oldStandardMethod.getCode().equals(standardMethod.getCode())) {
            CompletableFuture.supplyAsync(() -> replaceMethod(oldStandardMethod.getCode(), standardMethod.getCode()));
        }
        int i = standardMethodMapper.updateById(standardMethod);
        return i;
    }
    //编辑method后全部替换
    public String replaceMethod(String oldCode, String code) {
        //查询StandardProductList中所有Method如果包含之前的则替换
        List<StandardProductList> standardProductLists = standardProductListMapper.selectList(null);
        for (StandardProductList standardProductList : standardProductLists) {
            if (standardProductList.getMethod().contains(oldCode)) {
                String[] split = standardProductList.getMethod().split(",");
                String a = null;
                for (int i = 0; i < split.length; i++) {
                    String methodName = split[i].substring(1, split[i].length() - 1);
                    if (i == 0) {
                        methodName = split[i].substring(2, split[i].length() - 1);
                    } else if (i == split.length - 1) {
                        methodName = split[i].substring(1, split[i].length() - 2);
                    }
                    if (methodName.equals(oldCode)) {
                        methodName = code;
                    }
                    a += "\"" + methodName + "\",";
                }
                String method = "[\"" + a.substring(0, a.length() - 1) + "\"]";
                standardProductList.setMethod(method);
            }
        }
        standardProductListService.updateBatchById(standardProductLists);
        //查询StructureItemParameter中所有Method如果包含之前的则替换
        List<StructureItemParameter> structureItemParameters = structureItemParameterMapper.selectList(null);
        for (StructureItemParameter structureItemParameter : structureItemParameters) {
            if (structureItemParameter.getMethod().contains(oldCode)) {
                String[] split = structureItemParameter.getMethod().split(",");
                String a = null;
                for (int i = 0; i < split.length; i++) {
                    String methodName = split[i].substring(1, split[i].length() - 1);
                    if (i == 0) {
                        methodName = split[i].substring(2, split[i].length() - 1);
                    } else if (i == split.length - 1) {
                        methodName = split[i].substring(1, split[i].length() - 2);
                    }
                    if (methodName.equals(oldCode)) {
                        methodName = code;
                    }
                    a += "\"" + methodName + "\",";
                }
                String method = "[\"" + a.substring(0, a.length() - 1) + "\"]";
                structureItemParameter.setMethod(method);
            }
        }
        structureItemParameterService.updateBatchById(structureItemParameters);
        return "替换完毕!";
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void inputExcel(MultipartFile file) throws IOException {
        // å­˜å‚¨æ£€æµ‹å¯¹è±¡List
        List<Object> structureTestObjectIdList = new ArrayList<>();
        List<StandardMethod> result = new ArrayList<>();
        ExcelUtil.readBySax(file.getInputStream(), 0, (i, l, list) -> {
            // åŽ»é™¤ç¬¬ä¸€è¡Œè¡¨å¤´
            if (l == 0) {
                return;
            }
            // å­˜å‚¨å”¯ä¸€æ£€æµ‹å¯¹è±¡
            if (!structureTestObjectIdList.contains(list.get(2))) {
                structureTestObjectIdList.add(list.get(2));
            }
            StandardMethod standardMethod = formatData(list);
            result.add(standardMethod);
        });
        addStructureTest(structureTestObjectIdList, result);
    }
    // æ ¼å¼åŒ–数据
    public StandardMethod formatData(List<Object> list) {
        StandardMethod standardMethod = new StandardMethod();
        standardMethod.setField(list.get(1).toString());
        // é€ æ ¼å¼
        List<List<Object>> structureTestObjectId = new ArrayList<>();
        if (ObjectUtils.isEmpty(list.get(3))) {
            structureTestObjectId.add(Arrays.asList(list.get(2)));
        } else {
            structureTestObjectId.add(Arrays.asList(list.get(2), list.get(3)));
        }
        standardMethod.setStructureTestObjectId(JSONUtil.toJsonStr(structureTestObjectId));
        standardMethod.setCode(list.get(4).toString());
        standardMethod.setName(list.get(5).toString());
        standardMethod.setNameEn(list.get(6).toString());
        if (!Objects.equals(list.get(7), null)) {
            standardMethod.setRemark(list.get(7).toString());
        }
        standardMethod.setQualificationId(list.get(8).toString());
        if (ObjectUtils.isNotEmpty(list.get(9))) {
            if (list.get(9).equals("是")) {
                standardMethod.setIsProduct(1);
            } else if (list.get(9).equals("否")) {
                standardMethod.setIsProduct(0);
            }
        }
        if (ObjectUtils.isNotEmpty(list.get(10))) {
            if (list.get(10).equals("是")) {
                standardMethod.setIsUse(1);
            } else if (list.get(9).equals("否")) {
                standardMethod.setIsUse(0);
            }
        }
        return standardMethod;
    }
    // æ–°å¢žæ•°æ®
    public void addStructureTest(List<Object> structureTestObjectIdList, List<StandardMethod> standardMethodList) {
        List<StandardMethod> updateList = new ArrayList<>();
        List<Integer> deleteListId = new ArrayList<>();
        List<StandardMethod> addList = new ArrayList<>();
        if (!structureTestObjectIdList.isEmpty()) {
            // å¾ªçޝexcel里面的分组
            structureTestObjectIdList.forEach(j -> {
                // ä»¥excel中的组名查询数据库中的分组
                List<StandardMethod> standardMethods = baseMapper.selectList(Wrappers.<StandardMethod>lambdaQuery()
                        .like(StandardMethod::getStructureTestObjectId, "\"" + j + "\""));
                // å°†ç»“果循环匹配
                for (int i = 0; i < standardMethods.size(); i++) {
                    boolean isExistence = false;
                    for (int i1 = 0; i1 < standardMethodList.size(); i1++) {
                        // æ›´æ–°
                        if (standardMethods.get(i).getStructureTestObjectId().equals(standardMethodList.get(i1).getStructureTestObjectId())
                                && standardMethods.get(i).getCode().equals(standardMethodList.get(i1).getCode())
                                && standardMethods.get(i).getField().equals(standardMethodList.get(i1).getField())) {
                            // ç»™excel数据赋值id做更新
                            standardMethodList.get(i1).setId(standardMethods.get(i).getId());
                            // æ›´æ–°
                            updateList.add(standardMethodList.get(i1));
                            isExistence = true;
                            break;
                        }
                    }
                    // åˆ é™¤
                    if (!isExistence) {
                        deleteListId.add(standardMethods.get(i).getId());
                    }
                }
                for (int i = 0; i < standardMethodList.size(); i++) {
                    if (standardMethodList.get(i).getStructureTestObjectId().contains("\"" + j + "\"")) {
                        boolean isExistence = false;
                        for (int i1 = 0; i1 < standardMethods.size(); i1++) {
                            if (standardMethods.get(i1).getStructureTestObjectId().equals(standardMethodList.get(i).getStructureTestObjectId())
                                    && standardMethods.get(i1).getCode().equals(standardMethodList.get(i).getCode())
                                    && standardMethods.get(i1).getField().equals(standardMethodList.get(i).getField())) {
                                isExistence = true;
                                break;
                            }
                        }
                        // æ–°å¢ž
                        if (!isExistence) {
                            addList.add(standardMethodList.get(i));
                        }
                    }
                }
            });
        }
        if (!addList.isEmpty()) {
            // æ–°å¢ž
            baseMapper.insertBatchSomeColumn(addList);
        }
        if (!deleteListId.isEmpty()) {
            // åˆ é™¤
            baseMapper.deleteBatchIds(deleteListId);
        }
        if (!updateList.isEmpty()) {
            // æ›´æ–°
            updateList.forEach(i -> {
                baseMapper.updateById(i);
            });
        }
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListService2Impl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.mapper.StandardProductListMapper;
import com.ruoyi.basic.pojo.StandardProductList;
import com.ruoyi.basic.service.StandardProductListService2;
import org.springframework.stereotype.Service;
@Service
public class StandardProductListService2Impl extends ServiceImpl<StandardProductListMapper, StandardProductList>
        implements StandardProductListService2 {
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,701 @@
package com.ruoyi.basic.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.basic.dto.CopyStandardProductListDto;
import com.ruoyi.basic.dto.InsSampleReceiveDto;
import com.ruoyi.basic.dto.ProductDto;
import com.ruoyi.basic.dto.ResetTreeDragDTO;
import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
import com.ruoyi.basic.mapper.StandardProductListMapper;
import com.ruoyi.basic.mapper.StandardProductListSupplierAskMapper;
import com.ruoyi.basic.mapper.StandardTreeMapper;
import com.ruoyi.basic.pojo.StandardProductList;
import com.ruoyi.basic.pojo.StandardProductListSupplierAsk;
import com.ruoyi.basic.pojo.StandardTree;
import com.ruoyi.basic.service.StandardProductListService;
import com.ruoyi.basic.service.StandardProductListService2;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
 * @author Administrator
 * @description é’ˆå¯¹è¡¨ã€standard_product_list(标准树下的检验项目)】的数据库操作Service实现
 * @createDate 2024-03-05 10:33:29
 */
@Service
@AllArgsConstructor
public class StandardProductListServiceImpl extends ServiceImpl<StandardProductListMapper, StandardProductList>
        implements StandardProductListService {
    private StandardProductListMapper standardProductListMapper;
    private StandardTreeMapper standardTreeMapper;
    private StandardProductListService2 standardProductListService2;
    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
    private StandardProductListSupplierAskMapper standardProductListSupplierAskMapper;
    @Override
    public int upStandardProductList(StandardProductList list) {
        return standardProductListMapper.updateById(list);
    }
    @Override
    public int delStandardProduct(JSONArray list) {
        return standardProductListMapper.deleteBatchIds(list);
    }
    @Override
    public List<StandardProductList> selectStandardProductList(InsSampleReceiveDto insSample) {
        // æ˜¯å¦æ²¡æœ‰äº§å“
        boolean isNoSample = false;
//        String[] models = insSample.getModel().split("-(?=[^-]*$)");//拆分最后一个【-】
        String model = insSample.getModel();
        String modelNum = insSample.getModelNum();
        List<StandardProductList> list = standardProductListMapper.selectDetail(insSample.getStandardMethodListId(), 1, model, insSample.getIsCableTag());
        if (list.size() == 0) {
            if (Objects.equals(insSample.getFactory(), "") || insSample.getFactory() == null) {
                return null;
            }
            String[] split = insSample.getFactory().split(" - ");
            split[3] = split[3].replace("- ", "");
            String tree = split[0] + " - " + split[1] + " - " + split[2] + " - " + split[3] + " - null";
            list = standardProductListMapper.selectDetail2(insSample.getStandardMethodListId(), 1, tree, insSample.getIsCableTag());
            if (list.size() == 0) {
                String tree1 = split[0] + " - " + split[1] + " - " + split[2] + " - null - " + split[3];
                list = standardProductListMapper.selectDetail2(insSample.getStandardMethodListId(), 1, tree1, insSample.getIsCableTag());
                // åªæœ‰å¯¹è±¡çš„一层
                if (list.size() == 0) {
                    String tree2 = split[0] + " - " + split[1] + " - " + split[2] + " - null - null";
                    list = standardProductListMapper.selectDetail2(insSample.getStandardMethodListId(), 1, tree2, insSample.getIsCableTag());
                    // æ ·å“ç›´æŽ¥èµ‹å€¼æ ·å“åˆ†ç±»
                    list.forEach(standardProductList -> standardProductList.setSample(standardProductList.getSampleType()));
                    isNoSample = true;
                }
            }
        }
        String[] split1 = insSample.getFactory().split(" - ");
        if (!isNoSample) {
            //判断长度
            if (split1.length > 4) {
                if (ObjectUtils.isNotEmpty(split1[3])) {
                    list = list.stream().filter(list1 -> Objects.nonNull(list1.getSample()) && Objects.equals(list1.getSample(), split1[3])).collect(Collectors.toList());
                } else if (split1[3].equals("")) {
                    list = list.stream().filter(list1 -> Objects.nonNull(list1.getSampleType()) && Objects.equals(list1.getSampleType(), split1[2])).collect(Collectors.toList());
                }
            }
        }
        list = list.stream().filter(a -> {
                    try {
                        if (a.getSection() != null && !Objects.equals(a.getSection(), "")) {
                            List<String> sections = JSON.parseArray(a.getSection(), String.class);// åŒºé—´
                            List<String> cores = JSON.parseArray(a.getCores(), String.class); // èŠ¯æ•°
                            List<String> conductorMaterials = JSON.parseArray(a.getConductorMaterial(), String.class); // å¯¼ä½“材质
                            List<String> conductorTypes = JSON.parseArray(a.getConductorType(), String.class); // å¯¼ä½“类型
                            List<String> asks = JSON.parseArray(a.getAsk(), String.class);
                            List<String> tells = JSON.parseArray(a.getTell(), String.class);
                            boolean isIf;
                            for (int i = 0; i < sections.size(); i++) {
                                if (Objects.equals(a.getBsm(), "1")) {
                                    return true;
                                } else {
                                    if (sections.get(i).contains("&")) {
                                        String[] split = sections.get(i).split("&");
                                        isIf = getIsIf(split[0], modelNum, cores.get(i), conductorMaterials.get(i), conductorTypes.get(i), insSample)
                                                && getIsIf(split[1], modelNum, cores.get(i), conductorMaterials.get(i), conductorTypes.get(i), insSample);
                                    } else {
                                        isIf = getIsIf(sections.get(i), modelNum, cores.get(i), conductorMaterials.get(i), conductorTypes.get(i), insSample);
                                    }
                                    if (isIf) {
                                        a.setSection(sections.get(i));
                                        a.setAsk(asks.get(i));
                                        a.setTell(tells.get(i));
                                        return true;
                                    }
                                }
                            }
                            return false;
                        }
                    } catch (Exception ignored) {
                        return false;
                    }
                    return true;
                }).peek(standardProductList -> {
                    // todo: åˆ¤æ–­æ˜¯å¦æ˜¯åŽŸæä¸‹å•, éœ€è¦å•ŠæŠŠé¢œè‰²ç»‘å®šåˆ°è¯•æ ·é¢œè‰²çš„è¦æ±‚å€¼ä¸Š
                    if (StringUtils.isNotBlank(insSample.getPartNo())) {
                        // åˆ¤æ–­æ˜¯å¦æœ‰è¿™ä¸ªå­—段且是文本类型
                        if (StringUtils.isNotBlank(standardProductList.getInspectionItem())
                                && standardProductList.getInspectionItem().contains("试样颜色")) {
                            Map<String, String> partColor = baseMapper.selectPartColor(insSample.getPartNo());
                            if (CollectionUtils.isNotEmpty(partColor)) {
                                if (StringUtils.isNotBlank(partColor.get("color"))) {
                                    // åˆ¤æ–­æ£€éªŒå€¼æ˜¯å¦ä¸ºç©ºå’Œä¸ç­‰äºŽ -  å’Œ /
                                    if (StringUtils.isBlank(standardProductList.getAsk()) || partColor.get("color").contains("本")) { // æ²¡æœ‰ask直接复制
                                        // æŸ¥è¯¢å¯¹è±¡ç»‘定表和产品绑定表
                                        standardProductList.setAsk("=" + partColor.get("color")
                                                + (StringUtils.isBlank(partColor.get("color_code")) ? "" : "(" + partColor.get("color_code") + ")"));
                                        standardProductList.setTell(partColor.get("color")
                                                + (StringUtils.isBlank(partColor.get("color_code")) ? "" : "(" + partColor.get("color_code") + ")"));
                                        standardProductList.setInspectionValueType("2");
                                    } else { // æ‹¼æŽ¥åˆ°è¦æ±‚描述前面
                                        standardProductList.setTell(partColor.get("color")
                                                + (StringUtils.isBlank(partColor.get("color_code")) ? "" : "(" + partColor.get("color_code") + ")") + "@" + standardProductList.getTell());
                                    }
                                }
                            }
                        }
                    }
                })
                .collect(Collectors.toList());
        // æŸ¥è¯¢åŽ‚å®¶æ˜¯å¦æœ‰ç‰¹æ®Šè¦æ±‚å€¼
        if (insSample.getIfsInventoryId() != null) {
            // æŸ¥è¯¢åŽŸææ–™åŽ‚å®¶åç§°
            String supplierName = ifsInventoryQuantityMapper.selectById(insSample.getIfsInventoryId())
                    .getSupplierName();
            List<Long> collect = list.stream().map(StandardProductList::getId).collect(Collectors.toList());
            if (CollectionUtils.isNotEmpty(collect)) {
                List<StandardProductListSupplierAsk> supplierAsks = standardProductListSupplierAskMapper.selectList(Wrappers.<StandardProductListSupplierAsk>lambdaQuery()
                        .in(StandardProductListSupplierAsk::getProductListId, collect)
                        .eq(StandardProductListSupplierAsk::getSupplierName, supplierName));
                // åˆ¤æ–­æœ‰æ²¡æœ‰ç‰¹æ®Šå€¼ç»‘定
                if (CollectionUtils.isNotEmpty(supplierAsks)) {
                    for (StandardProductList standardProductList : list) {
                        for (StandardProductListSupplierAsk supplierAsk : supplierAsks) {
                            if (standardProductList.getId().equals(supplierAsk.getProductListId())) {
                                // é‡æ–°èµ‹å€¼è¦æ±‚值和要求描述
                                standardProductList.setAsk(supplierAsk.getAsk());
                                standardProductList.setTell(supplierAsk.getTell());
                            }
                        }
                    }
                }
            }
        }
        return list;
    }
    /**
     *
     * @param str                 åˆ¤å®šå…¬å¼
     * @param model               åž‹å·
     * @param standardCores       èŠ¯æ•°
     * @param conductorMaterial   å¯¼ä½“材质
     * @param conductorType       å¯¼ä½“类型
     * @param insSample
     * @return
     */
    private boolean getIsIf(String str, String model, String standardCores, String conductorMaterial, String conductorType,InsSampleReceiveDto insSample) {
        Matcher matcher = Pattern.compile("\\d+(\\.\\d+)?").matcher(model);
        String model2 = "";
        while (matcher.find()) {
            model2 += matcher.group();
            break;
        }
        boolean flag = false;
        if (str.contains("≥") || str.contains(">=")) {
            String param = str.replace("≥", "").replace(">=", "");
            flag = new BigDecimal(model2).compareTo(new BigDecimal(param)) > -1;
        } else if (str.contains("≤") || str.contains("<=")) {
            String param = str.replace("≤", "").replace("<=", "");
            flag = new BigDecimal(model2).compareTo(new BigDecimal(param)) < 1;
        } else if (str.contains(">") || str.contains(">")) {
            String param = str.replace(">", "").replace(">", "");
            flag = new BigDecimal(model2).compareTo(new BigDecimal(param)) > 0;
        } else if (str.contains("<") || str.contains("<")) {
            String param = str.replace("<", "").replace("<", "");
            flag = new BigDecimal(model2).compareTo(new BigDecimal(param)) < 0;
        } else if (str.contains("=")) {
            String param = str.replace("=", "");
            flag = new BigDecimal(model2).compareTo(new BigDecimal(param)) == 0;
        }
        if (flag) {
            boolean coresMatch = true;
            boolean conductorMaterialMatch = true;
            boolean conductorTypeMatch = true;
            // åˆ¤æ–­æ˜¯å¦æœ‰çº¿èŠ¯æ•°é‡
            if (StringUtils.isNotBlank(standardCores)) {
                if (StringUtils.isBlank(insSample.getCores()) || !standardCores.equals(insSample.getCores())) {
                    coresMatch = false;
                }
            }
            // åˆ¤æ–­æ˜¯å¦æœ‰å¯¼ä½“材质
            if (StringUtils.isNotBlank(conductorMaterial)) {
                if (StringUtils.isBlank(insSample.getConductorMaterial()) || !conductorMaterial.equals(insSample.getConductorMaterial())) {
                    conductorMaterialMatch = false;
                }
            }
            // åˆ¤æ–­æ˜¯å¦æœ‰å¯¼ä½“类型
            if (StringUtils.isNotBlank(conductorType)) {
                if (StringUtils.isBlank(insSample.getConductorType()) || !conductorType.equals(insSample.getConductorType())) {
                    conductorTypeMatch = false;
                }
            }
            // æœ€ç»ˆåˆ¤æ–­
            flag = coresMatch && conductorMaterialMatch && conductorTypeMatch;
        }
        return flag;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Map<String, Object> selectStandardProductListByMethodId(Integer id, String tree, Integer page) {
        String[] trees = tree.split(" - ");
        try {
            String tree1 = trees[2];
        } catch (Exception e) {
            throw new BaseException("操作太快,系统传参错误!!!!");
        }
        boolean isDrag = false;
        List<StandardProductList> list = new ArrayList<>();
        if (trees.length == 3) {
            List<StandardTree> treeList = new ArrayList<>();
            StandardTree standardTree = new StandardTree();
            standardTree.setFactory(trees[0]);
            standardTree.setLaboratory(trees[1]);
            standardTree.setSampleType(trees[2]);
            List<ProductDto> pList = standardTreeMapper.selectPList(trees[2]);
            if (pList.size() == 0 || pList.get(0) == null) {
                List<StandardTree> treeList1 = standardTreeMapper.selectList(Wrappers.<StandardTree>lambdaQuery().eq(StandardTree::getLaboratory, trees[1]).eq(StandardTree::getSampleType, trees[2]));
                if (treeList1.size() == 0) {
                    treeList.add(standardTree);
                } else {
                    treeList.addAll(treeList1);
                }
            } else {
                for (ProductDto p : pList) {
                    standardTree.setSample(p.getName());
                    List<StandardTree> treeList1 = standardTreeMapper.selectList(Wrappers.<StandardTree>lambdaQuery().eq(StandardTree::getLaboratory, trees[1]).eq(StandardTree::getSampleType, trees[2]).eq(StandardTree::getSample, p.getName()));
                    if (treeList1.size() == 0) {
                        treeList.add(JSON.parseObject(JSON.toJSONString(standardTree), StandardTree.class));
                    } else {
                        treeList.addAll(treeList1);
                    }
                }
            }
            for (StandardTree standardTree2 : treeList) {
                String tree2 = trees[0] + " - " + trees[1] + " - " + trees[2] + " - " + standardTree2.getSample() + " - " + standardTree2.getModel();
                list.addAll(standardTreeMapper.selectStandardProductListByTree("\"" + trees[2] + "\"", standardTree2.getSample(), standardTree2.getModel(), tree2, trees[1]));
                list.addAll(standardTreeMapper.selectStandardProductListByTree2("\"" + trees[2] + "\",\"" + standardTree2.getSample() + "\"", standardTree2.getSample(), standardTree2.getModel(), tree2, trees[1]));
            }
        } else if (trees.length == 4) {
            // åˆ¤æ–­ç¬¬å››å±‚是否有型号
            Long count = standardProductListMapper.selectCount(Wrappers.<StandardProductList>lambdaQuery()
                    .eq(StandardProductList::getStandardMethodListId, id)
                    .isNull(StandardProductList::getModel)
                    .like(StandardProductList::getTree, tree));
            if (count == 0) {
                isDrag = true;
            }
            isDrag = true;
            List<StandardTree> treeList = standardTreeMapper.selectList(Wrappers.<StandardTree>lambdaQuery().eq(StandardTree::getLaboratory, trees[1]).eq(StandardTree::getSampleType, trees[2]).eq(StandardTree::getSample, trees[3]));
            if (treeList.size() == 0) {
                StandardTree standardTree = new StandardTree();
                standardTree.setFactory(trees[0]);
                standardTree.setLaboratory(trees[1]);
                standardTree.setSampleType(trees[2]);
                standardTree.setSample(trees[3]);
                treeList.add(standardTree);
            }
            for (StandardTree standardTree : treeList) {
                String str = tree + " - " + standardTree.getModel();
                list.addAll(standardTreeMapper.selectStandardProductListByTree("\"" + trees[2] + "\"", standardTree.getSample(), standardTree.getModel(), str, trees[1]));
                list.addAll(standardTreeMapper.selectStandardProductListByTree2("\"" + trees[2] + "\",\"" + trees[3] + "\"", standardTree.getSample(), standardTree.getModel(), str, trees[1]));
            }
        } else {
            isDrag = true;
            list.addAll(standardTreeMapper.selectStandardProductListByTree("\"" + trees[2] + "\"", trees[3].equals("null") ? null : trees[3], trees[4], tree, trees[1]));
            list.addAll(standardTreeMapper.selectStandardProductListByTree2("\"" + trees[2] + "\",\"" + trees[3] + "\"", trees[3].equals("null") ? null : trees[3], trees[4], tree, trees[1]));
        }
        for (StandardProductList productList : list) {
            productList.setId(IdWorker.getId());
        }
        List<StandardProductList> standardProductLists;
        if (isDrag) {
            standardProductLists = standardProductListMapper.selectList(Wrappers.<StandardProductList>lambdaQuery()
                    .eq(StandardProductList::getStandardMethodListId, id)
                    .like(StandardProductList::getTree, tree)
                    .orderByAsc(StandardProductList::getSort));
            // åˆ¤æ–­æ˜¯å¦æœ‰æ²¡æœ‰åºå·çš„, æ²¡æœ‰åºå·é‡ç½®
            boolean b = standardProductLists.stream().anyMatch(standardProductList -> standardProductList.getSort() == null);
        } else {
            standardProductLists = standardProductListMapper.selectList(Wrappers.<StandardProductList>lambdaQuery()
                    .eq(StandardProductList::getStandardMethodListId, id)
                    .like(StandardProductList::getTree, tree));
        }
        for (StandardProductList sp : standardProductLists) {
            for (StandardProductList pl : list) {
                // åˆ¤æ–­æ¡ä»¶æ˜¯å¦åªæœ‰ä¸€ä¸ª, æœ‰ä¸€ä¸ªçš„话默认第一个
                String radiusList = pl.getRadiusList();
                if (StringUtils.isNotBlank(radiusList) && !radiusList.equals("null") && !radiusList.equals("\"\"")) {
                    JSONArray jsonArray = JSON.parseArray(radiusList);
                    List<String> radius = jsonArray.toJavaList(String.class);
                    if (CollectionUtils.isNotEmpty(radius) && radius.size() == 1) {
                        pl.setRadius(radius.get(0));
                    }
                }
                if (Objects.equals(sp.getInspectionItem(), pl.getInspectionItem())
                        && Objects.equals((sp.getInspectionItemSubclass() == null) ? "" : sp.getInspectionItemSubclass(), pl.getInspectionItemSubclass() == null ? "" : pl.getInspectionItemSubclass())
//                        && Objects.equals(sp.getSample(), pl.getSample())
                        && Objects.equals(sp.getModel(), pl.getModel())
                        && sp.getTree().indexOf(pl.getSample() == null ? "null" : pl.getSample()) > -1
                        && Objects.equals(sp.getStructureItemParameterId(), pl.getStructureItemParameterId())) {
                    pl.setId(sp.getId());
                    // æ·»åŠ æŽ’åºå­—æ®µ
                    pl.setSort(sp.getSort());
                    if (sp.getState() != null && !sp.getState().equals("")) {
                        pl.setState(sp.getState());
                    } else {
                        pl.setState(id == 0 ? 1 : 0);
                    }
                    if (sp.getMethodS() != null && !sp.getMethodS().equals("")) {
                        pl.setMethod(sp.getMethodS());
                    }
                    if (sp.getRadius() != null && !sp.getRadius().equals("")) {
                        pl.setRadius(sp.getRadius());
                    }
                    if (sp.getRates() != null && !sp.getRates().equals("")) {
                        pl.setRates(sp.getRates());
                    }
                    if (sp.getAsk() != null && !sp.getAsk().equals("")) {
                        pl.setAsk(sp.getAsk());
                    }
                    if (sp.getTell() != null && !sp.getTell().equals("")) {
                        pl.setTell(sp.getTell());
                    }
                    if (sp.getPrice() != null && !sp.getPrice().equals("")) {
                        pl.setPrice(sp.getPrice());
                    }
                    if (sp.getManHour() != null && !sp.getManHour().equals("")) {
                        pl.setManHour(sp.getManHour());
                    }
                    if (sp.getSection() != null && !sp.getSection().equals("")) {
                        pl.setSection(sp.getSection());
                    }
                    if (sp.getCores() != null && !sp.getCores().equals("")) {
                        pl.setCores(sp.getCores());
                    }
                    if (sp.getConductorMaterial() != null && !sp.getConductorMaterial().equals("")) {
                        pl.setConductorMaterial(sp.getConductorMaterial());
                    }
                    if (sp.getConductorType() != null && !sp.getConductorType().equals("")) {
                        pl.setConductorType(sp.getConductorType());
                    }
                    if (sp.getTemplateId() != null && !sp.getTemplateId().equals("")) {
                        pl.setTemplateId(sp.getTemplateId());
                    }
                    //因为还有个产品叫耐张线夹 æŽ¥ç»­é‡‘å…· ,这两个项目的数据完全一样,特殊处理
                    if (sp.getTree() != null && !sp.getTree().equals("") && !pl.getTree().equals("中天科技检测中心 - ç”µåŠ›äº§å“å®žéªŒå®¤ - é‡‘å…· - è€å¼ çº¿å¤¹ - null")) {
                        pl.setTree(sp.getTree());
                    }
                    break;
                }
            }
        }
        if (page == 1) {
            Integer userId = SecurityUtils.getUserId().intValue();
//            CompletableFuture.supplyAsync(() -> {
            if (trees.length == 5) {
                standardProductListMapper.delete(Wrappers.<StandardProductList>lambdaUpdate()
                        .eq(StandardProductList::getStandardMethodListId, id)
                        .eq(StandardProductList::getTree, tree));
            } else {
                standardProductListMapper.delete(Wrappers.<StandardProductList>lambdaUpdate()
                        .eq(StandardProductList::getStandardMethodListId, id)
                        .like(StandardProductList::getTree, tree));
            }
            boolean success = false;
            int retryCount = 0;
            while (!success && retryCount < 100) {
                try {
                    standardProductListService2.saveBatch(list.stream().map(a -> {
                        a.setFactory(trees[0]);
                        a.setLaboratory(trees[1]);
                        a.setSampleType(trees[2]);
                        a.setCreateUser(userId);
                        a.setUpdateUser(userId);
                        a.setStandardMethodListId(id);
                        return a;
                    }).collect(Collectors.toList()));
                    ;
                    success = true;
                } catch (Exception e) {
                    // å¤„理重复 ID çš„记录,重新生成 ID å¹¶ç»§ç»­å°è¯•插入
                    for (StandardProductList productList : list) {
                        productList.setId(IdWorker.getId());
                    }
                }
            }
            if (!success) {
                throw new RuntimeException("插入失败");
            }
        }
        Map<String, Object> map = new HashMap<>();
        Collections.sort(list, (o1, o2) -> {
            String field1 = o1.getManHourGroup();
            String field2 = o2.getManHourGroup();
            boolean isEmpty1 = field1 == null || field1.isEmpty();
            boolean isEmpty2 = field2 == null || field2.isEmpty();
            if (isEmpty1 && isEmpty2) {
                return 0;
            } else if (isEmpty1) {
                return 1;
            } else if (isEmpty2) {
                return -1;
            } else {
                int num1 = extractNumber(field1);
                int num2 = extractNumber(field2);
                return Integer.compare(num1, num2);
            }
        });
          // æŒ‰ç…§ç´¢å¼•排序
        if (isDrag) {
            list.sort((o1, o2) -> (o1.getSort() == null ? 0 : o1.getSort())
                    - (o2.getSort() == null ? 0 : o2.getSort()));
        }
        try {
            map.put("productList", list.subList((page - 1) * 300, page * 300));
        } catch (IndexOutOfBoundsException e) {
            map.put("productList", list.subList((page - 1) * 300, list.size()));
        }
        map.put("total", list.size());
        return map;
    }
    private int extractNumber(String s) {
        // ä»Žå­—符串中提取数字的逻辑,这里假设字段的格式是 "text<number>"
        String number = s;
        if (!s.matches("\\d+")) {
            number = s.replaceAll("\\D", "");
        }
        return Integer.parseInt(number);
    }
    @Override
    public IPage<StandardProductList> selectStandardProductByMethodId(Integer id, String tree, Integer page, String laboratory, String item, String items) {
        IPage<StandardProductList> iPage = new Page<>();
        iPage.setSize(100);
        iPage.setCurrent(page);
        return standardProductListMapper.standardProductListIPage(id, tree, iPage, laboratory, item, items);
    }
    @Override
    public Map<String, List<?>> selectStandardProductEnumByMethodId(Integer id, String tree, String item) {
        HashMap<String, List<?>> map = new HashMap<>();
        map.put("item", standardProductListMapper.selectList(Wrappers.<StandardProductList>lambdaQuery()
                .eq(StandardProductList::getStandardMethodListId, id)
                .like(StandardProductList::getTree, tree)
                .select(StandardProductList::getInspectionItem)
                .groupBy(StandardProductList::getInspectionItem)));
        if (ObjectUtils.isNotEmpty(item)) {
            map.put("items", standardProductListMapper.selectList(Wrappers.<StandardProductList>lambdaQuery()
                    .eq(StandardProductList::getStandardMethodListId, id)
                    .eq(StandardProductList::getInspectionItem, item)
                    .like(StandardProductList::getTree, tree)
                    .select(StandardProductList::getInspectionItemSubclass)
                    .groupBy(StandardProductList::getInspectionItemSubclass)));
        } else {
            map.put("items", standardProductListMapper.selectList(Wrappers.<StandardProductList>lambdaQuery()
                    .eq(StandardProductList::getStandardMethodListId, id)
                    .like(StandardProductList::getTree, tree)
                    .select(StandardProductList::getInspectionItemSubclass)
                    .groupBy(StandardProductList::getInspectionItemSubclass)));
        }
        return map;
    }
    /**
     * ä¿®æ”¹æ ‡å‡†åº“区间
     * @param list
     * @return
     */
    @Override
    public boolean updateSection(StandardProductList list) {
        standardProductListMapper.updateSection(list);
        return true;
    }
    /**
     * æ ‡å‡†åº“拖拽
     * @param resetTreeDragDTO
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void resetTreeDrag(ResetTreeDragDTO resetTreeDragDTO) {
        Integer beginIndex = Integer.parseInt(resetTreeDragDTO.getBeginIndex());
        Integer endIndex = Integer.parseInt(resetTreeDragDTO.getEndIndex());
        Integer methodId = Integer.parseInt(resetTreeDragDTO.getMethodId());
        Long productionId = Long.parseLong(resetTreeDragDTO.getProductionId());
        // åˆ¤æ–­æ˜¯ä»Žä¸Šå¾€ä¸‹æ‹–拽还是从下往上放拖拽
        // ä»Žä¸Šå¾€ä¸‹
        if (beginIndex < endIndex) {
            standardProductListMapper.updateSortUp(beginIndex,
                    endIndex,
                    methodId,
                    resetTreeDragDTO.getTree());
            // ä»Žä¸‹å¾€ä¸Š
        } else if (beginIndex > endIndex){
            standardProductListMapper.updateSortDown(beginIndex,
                    endIndex,
                    methodId,
                    resetTreeDragDTO.getTree());
        } else {
            return;
        }
        // ä¿®æ”¹æ ‡å‡†åº“项顺序
        standardProductListMapper.update(null, Wrappers.<StandardProductList>lambdaUpdate()
                .eq(StandardProductList::getId, productionId)
                .set(StandardProductList::getSort, endIndex));
    }
    @Override
    public void resetTreeDragBatch(List<StandardProductList> standardProductLists) {
        standardProductListService2.updateBatchById(standardProductLists);
    }
    /**
     * æ£€éªŒé¡¹è¦æ±‚值对比
     * @param copyDto
     * @return
     */
    @Override
    public List<StandardProductList> copyStandardProductList(CopyStandardProductListDto copyDto) {
        List<StandardProductList> productLists = new ArrayList<>();
        // å¯¹æ¯”检验项一样的填充要求值要求描述
        for (StandardProductList oldProductList : copyDto.getOldStandardProductList()) {
            String oldItemName = oldProductList.getInspectionItemClassEn()
                    + oldProductList.getInspectionItem()
                    + oldProductList.getInspectionItemSubclass();
            for (StandardProductList newProductList : copyDto.getNewStandardProductList()) {
                String newItemName = newProductList.getInspectionItemClassEn()
                        + newProductList.getInspectionItem()
                        + newProductList.getInspectionItemSubclass();
                // åˆ¤æ–­åç§°æ˜¯å¦ä¸€æ ·
                if (oldItemName.equals(newItemName)) {
                    // åŒºé—´
                    oldProductList.setSection(newProductList.getSection());
                    // èŠ¯æ•°
                    oldProductList.setCores(newProductList.getCores());
                    // è¦æ±‚值
                    oldProductList.setAsk(newProductList.getAsk());
                    // è¦æ±‚描述
                    oldProductList.setTell(newProductList.getTell());
                    // å•ä»·
                    oldProductList.setPrice(newProductList.getPrice());
                    // å·¥æ—¶åˆ†ç»„
                    oldProductList.setManHour(newProductList.getManHour());
                    // å¯¼ä½“材质
                    oldProductList.setConductorMaterial(newProductList.getConductorMaterial());
                    // å¯¼ä½“类型
                    oldProductList.setConductorType(newProductList.getConductorType());
                    productLists.add(oldProductList);
                }
            }
        }
        return productLists;
    }
    /**
     * æ£€éªŒé¡¹å¤åˆ¶å¯¹æ¯”一个
     * @param dto
     * @return
     */
    @Override
    public List<StandardProductList> copyStandardProductOne(CopyStandardProductListDto dto) {
        if (CollectionUtils.isEmpty(dto.getNewStandardProductList()) && dto.getNewStandardProductList().size() == 1 &&
                CollectionUtils.isEmpty(dto.getOldStandardProductList()) && dto.getOldStandardProductList().size() == 1) {
            throw new BaseException("需要对比的检验项请选择一个");
        }
        StandardProductList newProductList = dto.getNewStandardProductList().get(0);
        StandardProductList oldProductList = dto.getOldStandardProductList().get(0);
        // åŒºé—´
        oldProductList.setSection(newProductList.getSection());
        // èŠ¯æ•°
        oldProductList.setCores(newProductList.getCores());
        // è¦æ±‚值
        oldProductList.setAsk(newProductList.getAsk());
        // è¦æ±‚描述
        oldProductList.setTell(newProductList.getTell());
        // å•ä»·
        oldProductList.setPrice(newProductList.getPrice());
        // å·¥æ—¶åˆ†ç»„
        oldProductList.setManHour(newProductList.getManHour());
        // å¯¼ä½“材质
        oldProductList.setConductorMaterial(newProductList.getConductorMaterial());
        // å¯¼ä½“类型
        oldProductList.setConductorType(newProductList.getConductorType());
        List<StandardProductList> productLists = new ArrayList<>();
        productLists.add(oldProductList);
        return productLists;
    }
    /**
     * æ£€éªŒé¡¹å¤åˆ¶æŽ’序
     * @param copyDto
     * @return
     */
    @Override
    public boolean copyStandardProductSort(CopyStandardProductListDto copyDto) {
        List<StandardProductList> productLists = new ArrayList<>();
        // å¯¹æ¯”检验项一样的填充要求值要求描述
        for (StandardProductList oldProductList : copyDto.getOldStandardProductList()) {
            String oldItemName = oldProductList.getInspectionItemClassEn()
                    + oldProductList.getInspectionItem()
                    + oldProductList.getInspectionItemSubclass();
            for (StandardProductList newProductList : copyDto.getNewStandardProductList()) {
                String newItemName = newProductList.getInspectionItemClassEn()
                        + newProductList.getInspectionItem()
                        + newProductList.getInspectionItemSubclass();
                // åˆ¤æ–­åç§°æ˜¯å¦ä¸€æ ·
                if (oldItemName.equals(newItemName)) {
                    StandardProductList standardProductList = new StandardProductList();
                    standardProductList.setId(oldProductList.getId());
                    // å¤åˆ¶æŽ’序
                    standardProductList.setSort(newProductList.getSort());
                    productLists.add(standardProductList);
                }
            }
        }
        this.updateBatchById(productLists);
        return false;
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListSupplierAskServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.basic.mapper.StandardProductListSupplierAskMapper;
import com.ruoyi.basic.pojo.StandardProductListSupplierAsk;
import com.ruoyi.basic.service.StandardProductListSupplierAskService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * æ£€éªŒé¡¹ç›®åŽ‚å®¶å¯†åº¦ç»‘å®šè¡¨
 *
 * @author zhuo
 * @since 2024-09-23
 */
@Service
public class StandardProductListSupplierAskServiceImpl extends ServiceImpl<StandardProductListSupplierAskMapper, StandardProductListSupplierAsk> implements StandardProductListSupplierAskService {
    /**
     * æŸ¥è¯¢åŽ‚å®¶è¦æ±‚å€¼ç»‘å®š
     * @param supplierAsk
     * @return
     */
    @Override
    public List<StandardProductListSupplierAsk> selectByProductId(StandardProductListSupplierAsk supplierAsk) {
        if (supplierAsk.getProductListId() == null) {
            throw new BaseException("缺少检验项id");
        }
        return baseMapper.selectList(Wrappers.<StandardProductListSupplierAsk>lambdaQuery()
                .eq(StandardProductListSupplierAsk::getProductListId, supplierAsk.getProductListId()));
    }
    /**
     * æ–°å¢žåŽ‚å®¶è¦æ±‚å€¼ç»‘å®š
     * @param supplierAsk
     * @return
     */
    @Override
    public Integer addProductSupplierAsk(StandardProductListSupplierAsk supplierAsk) {
        if (supplierAsk.getProductListId() == null) {
            throw new BaseException("缺少产品对象id");
        }
        // æŸ¥è¯¢æ”¹åŽ‚å®¶æ˜¯å¦ç»‘å®šè¿‡
        Long count = baseMapper.selectCount(Wrappers.<StandardProductListSupplierAsk>lambdaQuery()
                .eq(StandardProductListSupplierAsk::getProductListId, supplierAsk.getProductListId())
                .eq(StandardProductListSupplierAsk::getSupplierName, supplierAsk.getSupplierName()));
        if (count > 0){
            throw new BaseException("该产品已绑定过该厂家");
        }
        baseMapper.insert(supplierAsk);
        return supplierAsk.getSupplierAskId();
    }
    /**
     * ä¿®æ”¹åŽ‚å®¶è¦æ±‚å€¼ç»‘å®š
     * @param supplierAsk
     * @return
     */
    @Override
    public Integer updateProductSupplierAsk(StandardProductListSupplierAsk supplierAsk) {
        if (supplierAsk.getProductListId() == null) {
            throw new BaseException("缺少检验项id");
        }
        // æŸ¥è¯¢æ”¹åŽ‚å®¶æ˜¯å¦ç»‘å®šè¿‡
        Long count = baseMapper.selectCount(Wrappers.<StandardProductListSupplierAsk>lambdaQuery()
                .ne(StandardProductListSupplierAsk::getSupplierAskId, supplierAsk.getSupplierAskId())
                .eq(StandardProductListSupplierAsk::getProductListId, supplierAsk.getProductListId())
                .eq(StandardProductListSupplierAsk::getSupplierName, supplierAsk.getSupplierName()));
        if (count > 0){
            throw new BaseException("该检验项已绑定过该厂家");
        }
        baseMapper.updateById(supplierAsk);
        return supplierAsk.getSupplierAskId();
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTemplateServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,130 @@
package com.ruoyi.basic.service.impl;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
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.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.basic.mapper.StandardTemplateMapper;
import com.ruoyi.basic.pojo.StandardTemplate;
import com.ruoyi.basic.service.StandardTemplateService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€standard_template(标准模板)】的数据库操作Service实现
* @createDate 2024-03-11 13:47:52
*/
@Service
@AllArgsConstructor
public class StandardTemplateServiceImpl extends ServiceImpl<StandardTemplateMapper, StandardTemplate>
    implements StandardTemplateService{
    private StandardTemplateMapper standardTemplateMapper;
    private final NumberGenerator<StandardTemplate> numberGenerator;
    @Override
    public IPage<StandardTemplate> selectStandardTemplatePageList(Page page, StandardTemplate standardTemplate) {
        return standardTemplateMapper.selectStandardTemplatePageList(page, QueryWrappers.queryWrappers(standardTemplate));
    }
    @Override
    public int addStandardTemplate(StandardTemplate standardTemplate) {
        if (StringUtils.isBlank(standardTemplate.getNumber())) {
            String giveCode = numberGenerator.generateNumberWithPrefix(5,
                    "MB" + DateUtil.format(new Date(), "yyMM"),
                    StandardTemplate::getNumber);
            standardTemplate.setNumber(giveCode);
        }
        return standardTemplateMapper.insert(standardTemplate);
    }
    @Override
    public int upStandardTemplate(StandardTemplate standardTemplate) {
        if(standardTemplate.getThing().equals("")){
            standardTemplate.setThing(null);
        }
        return standardTemplateMapper.updateById(standardTemplate);
    }
    @Override
    public int delStandardTemplate(Integer id) {
        return standardTemplateMapper.deleteById(id);
    }
    @Override
    public List<StandardTemplate> getStandardTemplate() {
        return standardTemplateMapper.selectList(Wrappers.<StandardTemplate>lambdaQuery().select(StandardTemplate::getId,StandardTemplate::getName));
    }
    @Override
    public String getStandTempThingById(Integer templateId) {
        StandardTemplate standardTemplate = standardTemplateMapper.selectOne(Wrappers.<StandardTemplate>lambdaQuery()
                .eq(StandardTemplate::getId, templateId)
                .select(StandardTemplate::getThing));
        if(standardTemplate==null){
            return null;
        }else{
            return standardTemplate.getThing();
        }
        // æŸ¥è¯¢åŽ‹ç¼©åŽçš„æ•°æ®
//        String thing = standardTemplateMapper.selectCompressThing(templateId);
//        if (StringUtils.isNotBlank(thing)) {
//            try {
//                return DecompressMySQLData.decompress(java.util.Base64.getDecoder().decode(thing));
//            } catch (Exception e) {
//                throw new RuntimeException(e);
//            }
//        } else {
//            return null;
//        }
    }
    @Override
    public String getStandTempNameById(Integer templateId) {
        StandardTemplate standardTemplate = standardTemplateMapper.selectOne(Wrappers.<StandardTemplate>lambdaQuery()
                .eq(StandardTemplate::getId, templateId)
                .select(StandardTemplate::getName));
        if(standardTemplate==null){
            return null;
        }else{
            return standardTemplate.getName();
        }
    }
    @Override
    public StandardTemplate getStandTempIdByName(String name) {
        return standardTemplateMapper.getStandTempIdByName(name);
    }
    /**
     * å¤åˆ¶åŽŸå§‹è®°å½•æ¨¡æ¿
     * @param newTemplate
     * @return
     */
    @Override
    public int copyStandardTemplate(StandardTemplate newTemplate) {
        // æŸ¥è¯¢æ—§æ¨¡æ¿
        StandardTemplate standardTemplate = baseMapper.selectById(newTemplate.getId());
        newTemplate.setThing(standardTemplate.getThing());
        if (StringUtils.isBlank(newTemplate.getNumber())) {
            String giveCode = numberGenerator.generateNumberWithPrefix(5,
                    "MB" + DateUtil.format(new Date(), "yyMM"),
                    StandardTemplate::getNumber);
            newTemplate.setNumber(giveCode);
        }
        newTemplate.setId(null);
        return standardTemplateMapper.insert(newTemplate);
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTreeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,535 @@
package com.ruoyi.basic.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.poi.excel.ExcelUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.basic.dto.FactoryDto;
import com.ruoyi.basic.dto.LaboratoryDto;
import com.ruoyi.basic.dto.SampleTypeDto;
import com.ruoyi.basic.mapper.StandardProductListMapper;
import com.ruoyi.basic.mapper.StandardTreeMapper;
import com.ruoyi.basic.pojo.StandardProductList;
import com.ruoyi.basic.pojo.StandardTemplate;
import com.ruoyi.basic.pojo.StandardTree;
import com.ruoyi.basic.pojo.StructureTestObject;
import com.ruoyi.basic.service.*;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
/**
 * @author Administrator
 * @description é’ˆå¯¹è¡¨ã€standard_tree(标准树)】的数据库操作Service实现
 * @createDate 2024-03-01 15:06:44
 */
@Service
@AllArgsConstructor
public class StandardTreeServiceImpl extends ServiceImpl<StandardTreeMapper, StandardTree>
        implements StandardTreeService {
    private StandardTreeMapper standardTreeMapper;
    private StandardMethodListService standardMethodListService;
    private StandardProductListMapper standardProductListMapper;
    private StandardProductListService standardProductListService;
    private StandardTemplateService standardTemplateService;
    private StructureTestObjectService structureTestObjectService;
    @Override
    public List<FactoryDto> selectStandardTreeList() {
        List<FactoryDto> factoryDtos = standardTreeMapper.selectStandardTreeList();
        for (FactoryDto factoryDto : factoryDtos) {
            for (LaboratoryDto laboratoryDto : factoryDto.getChildren()) {
                laboratoryDto.getChildren().sort((o1, o2) -> (o1.getSort() == null ? 0 : o1.getSort())
                        - (o2.getSort() == null ? 0 : o2.getSort()));
                for (SampleTypeDto sampleTypeDto : laboratoryDto.getChildren()) {
//                    if (sampleTypeDto.getChildren().size() == 0) {
                        sampleTypeDto.getChildren().addAll(standardTreeMapper.getStandardTree3(sampleTypeDto.getValue()));
//                    }
                }
            }
        }
        return factoryDtos;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int addStandardTree(StandardTree standardTree) {
        LambdaQueryWrapper<StandardTree> wrapper = Wrappers.<StandardTree>lambdaQuery()
                .eq(StandardTree::getFactory, standardTree.getFactory())
                .eq(StandardTree::getLaboratory, standardTree.getLaboratory())
                .eq(StandardTree::getSampleType, standardTree.getSampleType())
                .eq(StandardTree::getSample, standardTree.getSample())
                .eq(StandardTree::getModel, standardTree.getModel());
        if (StringUtils.isNotBlank(standardTree.getSample())) {
            wrapper.eq(StandardTree::getSample, standardTree.getSample());
        }
        StandardTree tree = standardTreeMapper.selectOne(wrapper);
        if (tree != null) {
            throw new BaseException("该型号已存在");
        }
        return standardTreeMapper.insert(standardTree);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int delStandardTree(String tree) {
        String[] trees = tree.split(" - ");
        switch (trees.length) {
            case 5:
                if (trees[3].equals("null")) {
                    standardTreeMapper.delete(Wrappers.<StandardTree>lambdaUpdate().eq(StandardTree::getFactory, trees[0]).eq(StandardTree::getLaboratory, trees[1]).eq(StandardTree::getSampleType, trees[2]).isNull(StandardTree::getSample).eq(StandardTree::getModel, trees[4]));
                } else {
                    standardTreeMapper.delete(Wrappers.<StandardTree>lambdaUpdate().eq(StandardTree::getFactory, trees[0]).eq(StandardTree::getLaboratory, trees[1]).eq(StandardTree::getSampleType, trees[2]).eq(StandardTree::getSample, trees[3]).eq(StandardTree::getModel, trees[4]));
                }
                break;
            /*case 4:
                standardTreeMapper.delete(Wrappers.<StandardTree>lambdaUpdate().eq(StandardTree::getFactory, trees[0]).eq(StandardTree::getLaboratory, trees[1]).eq(StandardTree::getSampleType, trees[2]).eq(StandardTree::getSample, trees[3]));
                break;
            case 3:
                standardTreeMapper.delete(Wrappers.<StandardTree>lambdaUpdate().eq(StandardTree::getFactory, trees[0]).eq(StandardTree::getLaboratory, trees[1]).eq(StandardTree::getSampleType, trees[2]));
                break;
            case 2:
                standardTreeMapper.delete(Wrappers.<StandardTree>lambdaUpdate().eq(StandardTree::getFactory, trees[0]).eq(StandardTree::getLaboratory, trees[1]));
                break;
            case 1:
                standardTreeMapper.delete(Wrappers.<StandardTree>lambdaUpdate().eq(StandardTree::getFactory, trees[0]));
                break;*/
        }
        return 1;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int addStandardProduct(String ids, String tree) {
        String[] trees = tree.split(" - ");
        JSONArray jsonArray = JSON.parseArray(ids);
        for (Object o : jsonArray) {
            StandardProductList standardProductList = standardTreeMapper.selectStandardProductById(Integer.parseInt("" + o));
            standardProductList.setFactory(trees[0]);
            try {
                standardProductList.setLaboratory(trees[1]);
            } catch (Exception e) {
            }
            try {
                standardProductList.setSampleType(trees[2]);
            } catch (Exception e) {
            }
            try {
                standardProductList.setSample(trees[3]);
            } catch (Exception e) {
            }
            try {
                standardProductList.setModel(trees[4]);
            } catch (Exception e) {
            }
            standardProductListMapper.insert(standardProductList);
        }
        return 1;
    }
    @Override
    public List<SampleTypeDto> getStandardTree2() {
        return standardTreeMapper.getStandardTree2();
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int upStandardProducts(Map<String, Object> product) {
        List<Integer> ids = JSON.parseArray(product.get("ids") + "");
        StandardProductList productList = JSON.parseObject(JSON.toJSONString(product.get("standardProductList")), StandardProductList.class);
        if (productList.getMethodS() != null) {
            standardProductListMapper.update(productList, Wrappers.<StandardProductList>lambdaUpdate().in(StandardProductList::getId, ids).like(StandardProductList::getMethod, productList.getMethodS()));
            return 1;
        }
        if (productList.getRadiusList() != null) {
            standardProductListMapper.update(productList, Wrappers.<StandardProductList>lambdaUpdate().in(StandardProductList::getId, ids).like(StandardProductList::getRadiusList, productList.getRadius()));
            return 1;
        }
        standardProductListMapper.update(productList, Wrappers.<StandardProductList>lambdaUpdate().in(StandardProductList::getId, ids));
        return 1;
    }
    @Override
    public List<StandardTree> getStandTreeBySampleType(String laboratory, String sampleType) {
        return standardTreeMapper.selectList(Wrappers.<StandardTree>lambdaQuery()
                .eq(StandardTree::getLaboratory, laboratory)
                .eq(StandardTree::getSampleType, sampleType)
                .select(StandardTree::getModel, StandardTree::getSample));
    }
    /**
     * æ²³å£æ£€æµ‹ä¸­å¿ƒå¯¼å…¥
     * @param file
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void inExcelOfTree(MultipartFile file) {
        InputStream inputStream;
        try {
            inputStream = file.getInputStream();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        List<StandardProductList> lists = new ArrayList<>();
        AtomicReference<String> laboratory = new AtomicReference<>();
        ExcelUtil.readBySax(inputStream, 0, (i, l, list) -> {
            StandardProductList str = new StandardProductList();
            if (i == 0 && l == 1) {
                laboratory.set(standardTreeMapper.getLaboratory(list.get(1) + ""));
                if (laboratory.get() == null) {
                    throw new BaseException("检验对象不存在:" + list.get(1));
                }
            }
            if (i == 0 && l >= 1) {
                Integer standardMethodId = standardMethodListService.getStandardMethodId(list.get(0) + "");
                if (standardMethodId == null) {
                    throw new BaseException("标准编号不存在:" + list.get(0));
                }
                str.setStandardMethodListId(standardMethodId);
                str.setSampleType(list.get(1) + "");
                if (list.get(2) != null) {
                    String sample = baseMapper.selSample(list.get(2) + "");
                    if (sample == null) {
                        throw new BaseException("样品不存在:" + list.get(2));
                    }
                    str.setSample(list.get(2) + "");
                } else {
                    str.setSample(null);
                }
                if (list.get(3) != null) {
                    str.setModel(list.get(3) + "");
                    Long aLong = standardTreeMapper.selectCount(Wrappers.<StandardTree>lambdaQuery()
                            .eq(StandardTree::getModel, str.getModel())
                            .eq(StandardTree::getSampleType, list.get(1) + ""));
                    if (aLong == 0) {
                        StandardTree standardTree = new StandardTree();
                        standardTree.setFactory("中天科技检测中心");
                        standardTree.setLaboratory(laboratory.get());
                        standardTree.setSampleType(str.getSampleType());
                        standardTree.setSample(str.getSample());
                        standardTree.setModel(str.getModel());
                        standardTreeMapper.insert(standardTree);
                    }
                } else {
                    str.setModel(null);
                }
                str.setInspectionItem(list.get(4) + "");
                if (list.get(6) == null) {
                    str.setInspectionItemSubclass("");
                } else {
                    str.setInspectionItemSubclass(list.get(6).toString());
                }
                StandardProductList db_str;
                try {
                    db_str = standardProductListMapper.getOne(str.getStandardMethodListId(), str.getInspectionItem(), str.getSample(), str.getInspectionItemSubclass(), str.getModel(), str.getInspectionItemClass());
                } catch (Exception e) {
                    throw new BaseException("重复查询:" + str.getInspectionItem() + " " + str.getInspectionItemSubclass());
                }
                if (ObjectUtils.isNotEmpty(db_str)) {
                    str.setId(db_str.getId());
                    str.setStructureItemParameterId(db_str.getStructureItemParameterId());
                }
                if (list.get(8) != null) {
                    str.setMethodS(list.get(8) + "");
                }
                if (list.get(11) == null) {
                    str.setTell(null);
                } else {
                    str.setTell(list.get(11).toString());
                }
                if (list.get(12) == null) {
                    str.setAsk(null);
                } else {
                    str.setAsk(list.get(12).toString());
                }
                if (list.get(13) == null) {
                    str.setPrice(null);
                } else {
                    str.setPrice((list.get(13).toString()));
                }
                if (list.get(14) == null) {
                    str.setManHour(null);
                } else {
                    str.setManHour(list.get(14).toString());
                }
                StandardTemplate standTempIdByName = standardTemplateService.getStandTempIdByName(String.valueOf(list.get(21)));
                if (standTempIdByName != null) {
                    str.setTemplateId(standTempIdByName.getId());
                } else {
                    throw new BaseException("模板不存在:" + list.get(21));
                }
                str.setFactory("中天科技检测中心");
                str.setLaboratory(laboratory.get());
                str.setState(1);
                str.setTree(str.getFactory() + " - " + str.getLaboratory() + " - " + str.getSampleType() + " - " + str.getSample() + " - " + (str.getModel() == null ? "" : str.getModel()));
                try {
                    str.setStructureItemParameterId(standardTreeMapper.getStructureItemParameterId("\"" + str.getSampleType() + "\"", str.getInspectionItem(), str.getInspectionItemSubclass(), str.getInspectionItemClass()));
                } catch (Exception e) {
                    str.setStructureItemParameterId(standardTreeMapper.getStructureItemParameterId("\"" + str.getSampleType() + "\",\"" + str.getSample() + "\"", str.getInspectionItem(), str.getInspectionItemSubclass(), str.getInspectionItemClass()));
                }
                if (str.getStructureItemParameterId() == null) {
                    throw new BaseException("检验项目不存在:" + str.getInspectionItem() + " " + str.getInspectionItemSubclass());
                }
                lists.add(str);
            }
        });
        lists.forEach(a -> {
            if (a.getId() != null) {
                standardProductListMapper.updateById(a);
            } else {
                standardProductListMapper.insert(a);
            }
        });
    }
    @Override
    public void importWorkstationExcel(MultipartFile file) {
        InputStream inputStream;
        try {
            inputStream = file.getInputStream();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        List<StandardProductList> lists = new ArrayList<>();
        AtomicReference<String> laboratory = new AtomicReference<>();
        ExcelUtil.readBySax(inputStream, 0, (i, l, list) -> {
            StandardProductList str = new StandardProductList();
            if (i == 0 && l == 1) {
                laboratory.set(standardTreeMapper.getLaboratory(list.get(1) + ""));
                if (laboratory.get() == null) {
                    throw new BaseException("检验对象不存在:" + list.get(1));
                }
            }
            if (i == 0 && l >= 1) {
                Integer standardMethodId = standardMethodListService.getStandardMethodId(list.get(0) + "");
                if (standardMethodId == null) {
                    throw new BaseException("标准编号不存在:" + list.get(0));
                }
                str.setStandardMethodListId(standardMethodId);
                str.setSampleType(list.get(1) + "");
                if (list.get(2) != null) {
                    String sample = baseMapper.selSample(list.get(2) + "");
                    if (sample == null) {
                        throw new BaseException("样品不存在:" + list.get(2));
                    }
                    str.setSample(list.get(2) + "");
                } else {
                    str.setSample(null);
                }
                if (list.get(3) != null) {
                    str.setModel(list.get(3) + "");
                    Long aLong = standardTreeMapper.selectCount(Wrappers.<StandardTree>lambdaQuery()
                            .eq(StandardTree::getModel, str.getModel())
                            .eq(StandardTree::getSampleType, list.get(1) + ""));
                    if (aLong == 0) {
                        StandardTree standardTree = new StandardTree();
                        standardTree.setFactory("中天科技检测中心");
                        standardTree.setLaboratory(laboratory.get());
                        standardTree.setSampleType(str.getSampleType());
                        standardTree.setSample(str.getSample());
                        standardTree.setModel(str.getModel());
                        standardTreeMapper.insert(standardTree);
                    }
                } else {
                    str.setModel(null);
                }
                str.setInspectionItemClass(list.get(4).toString());
                str.setInspectionItemClassEn(list.get(5).toString());
                // å¼€å§‹åŠ 2
                str.setInspectionItem(list.get(6) + "");
                if (list.get(8) == null) {
                    str.setInspectionItemSubclass("");
                } else {
                    str.setInspectionItemSubclass(list.get(8).toString());
                }
                StandardProductList db_str;
                try {
                    db_str = standardProductListMapper.getOne(str.getStandardMethodListId(), str.getInspectionItem(), str.getSample(), str.getInspectionItemSubclass(), str.getModel(), str.getInspectionItemClass());
                } catch (Exception e) {
                    throw new BaseException("重复查询:" + str.getInspectionItem() + " " + str.getInspectionItemSubclass());
                }
                if (ObjectUtils.isNotEmpty(db_str)) {
                    str.setId(db_str.getId());
                    str.setStructureItemParameterId(db_str.getStructureItemParameterId());
                }
                if (list.get(10) != null) {
                    str.setMethodS(list.get(10) + "");
                }
                if (list.get(13) == null) {
                    str.setTell(null);
                } else {
                    str.setTell(list.get(13).toString());
                }
                if (list.get(14) == null) {
                    str.setAsk(null);
                } else {
                    str.setAsk(list.get(14).toString());
                }
                if (list.get(15) == null) {
                    str.setPrice(null);
                } else {
                    str.setPrice((list.get(15).toString()));
                }
                if (list.get(16) == null) {
                    str.setManHour(null);
                } else {
                    str.setManHour(list.get(16).toString());
                }
                StandardTemplate standTempIdByName = standardTemplateService.getStandTempIdByName(String.valueOf(list.get(23)));
                if (standTempIdByName != null) {
                    str.setTemplateId(standTempIdByName.getId());
                } else {
                    throw new BaseException("模板不存在:" + list.get(23));
                }
                str.setFactory("中天科技检测中心");
                str.setLaboratory(laboratory.get());
                str.setState(1);
                str.setTree(str.getFactory() + " - " + str.getLaboratory() + " - " + str.getSampleType() + " - " + str.getSample() + " - " + (str.getModel() == null ? "" : str.getModel()));
                try {
                    str.setStructureItemParameterId(standardTreeMapper.getStructureItemParameterId("\"" + str.getSampleType() + "\"", str.getInspectionItem(), str.getInspectionItemSubclass(), str.getInspectionItemClass()));
                } catch (Exception e) {
                    str.setStructureItemParameterId(standardTreeMapper.getStructureItemParameterId("\"" + str.getSampleType() + "\",\"" + str.getSample() + "\"", str.getInspectionItem(), str.getInspectionItemSubclass(), str.getInspectionItemClass()));
                }
                if (str.getStructureItemParameterId() == null) {
                    throw new BaseException("检验项目不存在:" + str.getInspectionItem() + " " + str.getInspectionItemSubclass());
                }
                lists.add(str);
            }
        });
        lists.forEach(a -> {
            if (a.getId() != null) {
                standardProductListMapper.updateById(a);
            } else {
                standardProductListMapper.insert(a);
            }
        });
    }
    @Override
    public boolean updateTreeSort(List<FactoryDto> list) {
        List<StructureTestObject> testObjects = new ArrayList<>();
        for (FactoryDto factoryDto : list) {
            for (LaboratoryDto laboratoryDto : factoryDto.getChildren()) {
                List<SampleTypeDto> children = laboratoryDto.getChildren();
                int sort = 0;
                // å¾ªçŽ¯ç¬¬ä¸‰å±‚
                for (SampleTypeDto child : children) {
                    StructureTestObject structureTestObject = new StructureTestObject();
                    structureTestObject.setSort(sort);
                    structureTestObject.setId(child.getSampleTypeId());
                    testObjects.add(structureTestObject);
                    sort++;
                }
            }
        }
        structureTestObjectService.updateBatchById(testObjects);
        return true;
    }
    /**
     * ä¿®æ”¹æ ‡å‡†æ•°
     * @param standardTree
     * @return
     */
    @Override
    public int updateStandardTree(StandardTree standardTree) {
        // ä¿®æ”¹åç§°åŒ¹é…çš„æ ‡å‡†æ ‘下的检验项目
        // æŸ¥è¯¢æ‰€æœ‰å¯¹è±¡+名称的树
        List<StandardProductList> standardProductLists = standardProductListService.list(Wrappers.<StandardProductList>lambdaUpdate()
                .eq(StandardProductList::getSample, standardTree.getSample())
                .eq(StandardProductList::getSampleType, standardTree.getSampleType())
                .eq(StandardProductList::getModel, standardTree.getOldModel()));
        if (CollectionUtils.isNotEmpty(standardProductLists)) {
            for (StandardProductList standardProductList : standardProductLists) {
                // ä¿®æ”¹æ ·å“åç§°
                standardProductList.setModel(standardTree.getModel());
                // ä¿®æ”¹æ ‘名称
                // éœ€è¦æˆªå–第四级, é¿å…ä¸‰å››çº§åç§°ä¸€æ ·ä¿®æ”¹é”™è¯¯
                String[] trees = standardProductList.getTree().split(" - ");
                trees[4] = standardTree.getModel();
                List<String> list = CollUtil.newArrayList(trees);
                String newName = CollUtil.join(list, " - ");
                standardProductList.setTree(newName);
            }
            standardProductListService.updateBatchById(standardProductLists);
        }
        // ä¿®æ”¹æ ‡å‡†æ•°æ£€éªŒé¡¹ç›®
        LambdaUpdateWrapper<StandardTree> wrapper = Wrappers.<StandardTree>lambdaUpdate()
                .eq(StandardTree::getFactory, standardTree.getFactory())
                .eq(StandardTree::getLaboratory, standardTree.getLaboratory())
                .eq(StandardTree::getSampleType, standardTree.getSampleType())
                .eq(StandardTree::getModel, standardTree.getOldModel())
                .set(StandardTree::getModel, standardTree.getModel());
        if (StringUtils.isNotBlank(standardTree.getSample())) {
            wrapper.eq(StandardTree::getSample, standardTree.getSample());
        }
        return standardTreeMapper.update(null, wrapper);
    }
    @Override
    public void resetTreeOfPrice(String tree, Integer standardId) {
        standardProductListMapper.update(null, Wrappers.<StandardProductList>lambdaUpdate().like(StandardProductList::getTree, tree).eq(StandardProductList::getStandardMethodListId, standardId).set(StandardProductList::getPrice, null));
    }
    @Override
    public void resetTreeOfHour(String tree, Integer standardId) {
        standardProductListMapper.update(null, Wrappers.<StandardProductList>lambdaUpdate().like(StandardProductList::getTree, tree).eq(StandardProductList::getStandardMethodListId, standardId).set(StandardProductList::getManHour, null));
    }
    @Override
    public void resetTreeOfAsk(String tree, Integer standardId) {
        standardProductListMapper.update(null, Wrappers.<StandardProductList>lambdaUpdate().like(StandardProductList::getTree, tree).eq(StandardProductList::getStandardMethodListId, standardId)
                .set(StandardProductList::getAsk, null)
                .set(StandardProductList::getTell, null)
                .set(StandardProductList::getSection, null)
                .set(StandardProductList::getCores, null)
                .set(StandardProductList::getConductorMaterial, null)
                .set(StandardProductList::getConductorType, null)
                .set(StandardProductList::getPrice, null)
                .set(StandardProductList::getManHour, null));
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/StructureItemParameterServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.mapper.StructureItemParameterMapper;
import com.ruoyi.basic.pojo.StructureItemParameter;
import com.ruoyi.basic.service.StructureItemParameterService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
@AllArgsConstructor
public class StructureItemParameterServiceImpl extends ServiceImpl<StructureItemParameterMapper, StructureItemParameter> implements StructureItemParameterService {
    @Resource
    private StructureItemParameterMapper structureItemParameterMapper;
    @Override
    public void removeNoSample(String sample) {
        structureItemParameterMapper.removeNoSample("\""+sample+"\"");
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/StructureTestObjectPartServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
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.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.basic.mapper.ProductPartMapper;
import com.ruoyi.basic.mapper.StructureTestObjectPartMapper;
import com.ruoyi.basic.pojo.ProductPart;
import com.ruoyi.basic.pojo.StructureTestObjectPart;
import com.ruoyi.basic.service.StructureTestObjectPartService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * æ£€éªŒå¯¹è±¡é›¶ä»¶è¡¨
 *
 * @author zhuo
 * @since 2024-08-07
 */
@Transactional
@Service
@AllArgsConstructor
public class StructureTestObjectPartServiceImpl extends ServiceImpl<StructureTestObjectPartMapper, StructureTestObjectPart> implements StructureTestObjectPartService {
    private ProductPartMapper productPartMapper;
    @Override
    public IPage<StructureTestObjectPart> selectByTestObjectId(Page page, StructureTestObjectPart structureTestObjectPart) {
        return baseMapper.selectListByTestObjectId(page, QueryWrappers.queryWrappers(structureTestObjectPart),structureTestObjectPart.getTestObjectId());
    }
    @Override
    public void addTestObjectPart(StructureTestObjectPart structureTestObjectPart) {
        this.isPartNoExist(structureTestObjectPart.getPartNo(), null);
        if (structureTestObjectPart.getTestObjectId() == null) {
            throw new BaseException("缺少产品对象id");
        }
        baseMapper.insert(structureTestObjectPart);
    }
    @Override
    public void updateTestObjectPart(StructureTestObjectPart structureTestObjectPart) {
        this.isPartNoExist(structureTestObjectPart.getPartNo(),  structureTestObjectPart.getId());
        if (structureTestObjectPart.getTestObjectId() == null) {
            throw new BaseException("缺少产品对象id");
        }
        baseMapper.updateById(structureTestObjectPart);
    }
    // åˆ¤æ–­é›¶ä»¶å·æ˜¯å¦å­˜åœ¨
    public void isPartNoExist(String partNo, Integer id) {
        // é›¶ä»¶å·å”¯ä¸€ ä½†ä¸å¿…å¡«
        if (StringUtils.isNotBlank(partNo)) {
            Long count = productPartMapper.selectCount(new LambdaQueryWrapper<ProductPart>()
                    .eq(ProductPart::getPartNo, partNo));
            Long selectCount = baseMapper.selectCount(Wrappers.<StructureTestObjectPart>lambdaQuery()
                    .eq(StructureTestObjectPart::getPartNo, partNo)
                    .ne(id != null, StructureTestObjectPart::getId, id));
            if (count > 0 || selectCount > 0) {
                throw new BaseException("该零件号已绑定过检验对象");
            }
        } else {
            throw new BaseException("请输入零件号");
        }
    }
}
basic-server/src/main/java/com/ruoyi/basic/service/impl/StructureTestObjectServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.mapper.StructureTestObjectMapper;
import com.ruoyi.basic.pojo.StructureTestObject;
import com.ruoyi.basic.service.StructureTestObjectService;
import org.springframework.stereotype.Service;
/**
 * æ£€æµ‹å¯¹è±¡
 *
 * @author zhuo
 * @since 2024-09-13
 */
@Service
public class StructureTestObjectServiceImpl extends ServiceImpl<StructureTestObjectMapper, StructureTestObject> implements StructureTestObjectService {
}
basic-server/src/main/resources/mapper/CertificationMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<?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.ruoyi.basic.mapper.CertificationMapper">
    <select id="getCertificationDetail" resultType="com.ruoyi.basic.pojo.Certification">
        select b.*
        from ( select a.`name`, a.`code`,a.organization,a.explanation,a.first_issuance_date,a.latest_issuance_date,c.expire_time FROM
            (SELECT id,name,MIN(date_of_issuance) AS first_issuance_date,
                    MAX(date_of_issuance) AS latest_issuance_date,
                    c.`code`,c.organization,c.explanation
             FROM
                 certification c
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
             GROUP BY
                 name) a left join certification c on a.id=c.id
        ) b
    </select>
</mapper>
basic-server/src/main/resources/mapper/IfsInventoryQuantityMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
<?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.ruoyi.basic.mapper.IfsInventoryQuantityMapper">
    <select id="printLabel" resultType="com.ruoyi.basic.dto.IfsInventoryQuantityDto">
        SELECT io.sample sample_name,
        iiq.supplier_name,
        io.part_detail part_desc,
        io.send_time,
        io.prepare_user,
        io.entrust_code,
        iiq.qty_arrived,
        iiq.buy_unit_meas,
        CASE
        WHEN pp.color IS NOT NULL
        THEN pp.color
        ELSE sto.color
        END   color,
        case
        when iiq.state = 2 then '2'
        when iiq.state = 1 then case
        when ROUND((select count(*)
        from ins_product ip
        where state = 1
        and ins_result is not null
        and ip.ins_sample_id in (select id
        from ins_sample
        where ins_sample.ins_order_id = io.id)) /
        (select count(*)
        from ins_product ip2
        where state = 1
        and ip2.ins_sample_id in
        (select id from ins_sample where ins_sample.ins_order_id = io.id)) *
        100, 2) != 100 then '0'
        else '1' end
        end   labelStatus,
        JSON_OBJECT(
        'sample_ame', io.sample,
        'supplier_name', iiq.supplier_name,
        'part_desc', iiq.part_desc,
        'entrust_code', io.entrust_code
        )         labelBarCode
        FROM ifs_inventory_quantity iiq
        LEFT JOIN  ins_order io on io.id = (SELECT io2.id
        FROM ins_order io2
        WHERE io2.ifs_inventory_id = iiq.id
        and io2.state != -1
        order by io2.send_time desc
        limit 1) COLLATE utf8mb4_general_ci
        LEFT JOIN product_part pp ON pp.part_no = iiq.part_no COLLATE utf8mb4_general_ci
        LEFT JOIN structure_test_object_part sto ON sto.part_no = iiq.part_no COLLATE utf8mb4_general_ci
        WHERE iiq.id in
        <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
            #{val}
        </foreach>
    </select>
    <select id="selectReportCountById" resultType="java.lang.Integer">
        select count(*)
        from ifs_inventory_quantity iiq
                 left join ins_order io on io.ifs_inventory_id = iiq.id and io.state
                 left join ins_report ir on ir.ins_order_id = io.id
        where iiq.id = #{ifsInventoryId}
          and ir.id is not null
    </select>
    <select id="selectIsFirst" resultType="java.lang.Integer">
        select count(*)
        from ifs_inventory_quantity iiq
                 LEFT JOIN ins_order io1 on io1.ifs_inventory_id = iiq.id
            and io1.state != -1
        where io1.part_detail = #{partDetail}
          and iiq.supplier_name = #{supplierName}
          and iiq.receiver_date between #{startOfNextQuarter} and #{endOfQuarter}
    </select>
</mapper>
basic-server/src/main/resources/mapper/LaboratoryMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
<?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.ruoyi.basic.mapper.LaboratoryMapper">
    <select id="selectItemParameter" resultType="com.ruoyi.basic.pojo.Laboratory">
        select * from
        (
        select l.id,
        laboratory_name,
        laboratory_number,
        laboratory_code,
        phone_number,
        head,
        l.address,
        u1.name create_user_name,
        l.create_time
        from laboratory l
        left join user u1 on l.create_user = u1.id
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="obtainItemParameterList" resultType="java.lang.Object">
        select * from
            (
                select l.id,
                       laboratory_name,
                       laboratory_number,
                       phone_number,
                       head,
                       l.address,
                       u1.name create_user_name,
                       l.create_time
                from laboratory l
                         left join user u1 on l.create_user = u1.id
            ) a
    </select>
</mapper>
basic-server/src/main/resources/mapper/ProductMapper.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.ruoyi.basic.mapper.ProductMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.Product">
            <id property="id" column="id" jdbcType="INTEGER"/>
            <result property="name" column="name" jdbcType="VARCHAR"/>
            <result property="nameEn" column="name_en" jdbcType="VARCHAR"/>
            <result property="createUser" column="create_user" jdbcType="INTEGER"/>
            <result property="updateUser" column="update_user" jdbcType="INTEGER"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
            <result property="objectId" column="object_id" jdbcType="INTEGER"/>
    </resultMap>
    <sql id="Base_Column_List">
        id,name,name_en,
        create_user,update_user,create_time,
        update_time,object_id
    </sql>
    <select id="selectProductListByObjectId" resultType="com.ruoyi.basic.pojo.Product">
        select * from (
        select p.id,
               p.name,
               p.name_en,
               p.create_user,
               p.update_user,
               p.create_time,
               p.update_time,
               p.object_id
        from product p
        WHERE 1=1
            <if test="partNo != null and partNo != ''">
                and p.id = (select pp.product_id
                from product_part pp
                where pp.part_no = #{partNo})
            </if>) a
            <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
                ${ew.customSqlSegment}
            </if>
    </select>
</mapper>
basic-server/src/main/resources/mapper/ProductPartMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
<?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.ruoyi.basic.mapper.ProductPartMapper">
    <select id="selectListByProductId" resultType="com.ruoyi.basic.pojo.ProductPart">
        SELECT * from product_part pp
        where  pp.product_id=#{productId}
    </select>
</mapper>
basic-server/src/main/resources/mapper/ProductSupplierDensityMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
<?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.ruoyi.basic.mapper.ProductSupplierDensityMapper">
    <select id="selectListByProductId" resultType="com.ruoyi.basic.pojo.ProductSupplierDensity">
        SELECT * from product_supplier_density pp
        where  pp.product_id=#{productId}
    </select>
</mapper>
basic-server/src/main/resources/mapper/SealMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<?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.ruoyi.basic.mapper.SealMapper">
    <select id="selectSeal" resultType="com.ruoyi.basic.pojo.Seal">
        select l.id,s.lab_id,l.laboratory_name ,s.address, s.type as Type,s.create_time
        from seal s  LEFT JOIN laboratory l  on s.lab_id=l.id
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="selectLaboratory" resultType="com.ruoyi.basic.pojo.Laboratory">
        SELECT *
        from laboratory
        WHERE id = #{labId}
    </select>
</mapper>
basic-server/src/main/resources/mapper/StandardMethodListMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
<?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.ruoyi.basic.mapper.StandardMethodListMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.StandardMethodList">
        <id property="id" column="id" jdbcType="INTEGER"/>
        <result property="code" column="code" jdbcType="VARCHAR"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="remark" column="remark" jdbcType="VARCHAR"/>
        <result property="createUser" column="create_user" jdbcType="INTEGER"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
        <result property="updateUser" column="update_user" jdbcType="INTEGER"/>
        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <select id="selectStandardMethodById" resultType="java.util.Map">
        select code, name, remark
        from standard_method
        where id = #{id}
    </select>
    <select id="selectUserById" resultType="java.lang.String">
        select name
        from user
        where id = #{id}
    </select>
    <select id="selectStandardMethodLists" resultType="com.ruoyi.basic.pojo.StandardMethodList">
        select id, code, name, remark
        from standard_method
        where is_use = 1
        and is_product = 1
        and structure_test_object_id LIKE CONCAT('%[', #{tree}, ']%')
    </select>
    <select id="selectParameterList" resultType="com.ruoyi.basic.pojo.StandardProductList">
        select inspection_item,
               inspection_item_subclass,
               laboratory,
               unit,
               price,
               man_hour,
               man_hour_group,
               inspection_item_type,
               inspection_value_type,
               checkout_number,
               section,
               method,
               man_day,
               bsm,
               template_id,
               son_laboratory
        from structure_item_parameter
        where method = #{code}
    </select>
    <select id="selectStandardMethodLists2" resultType="com.ruoyi.basic.pojo.StandardMethodList">
        select sml.id, sml.code, sml.name,sml.remark, sml.create_time, u.name create_user_name
        from standard_method_list sml
        left join user u on u.id = sml.create_user
        where factory = #{data1}
        <if test="data2 != null">
            and laboratory = #{data2}
        </if>
        <if test="data3 != null">
            and sample_type = #{data3}
        </if>
        <if test="data4 != null">
            and sample = #{data4}
        </if>
        <if test="data5 != null">
            and model = #{data5}
        </if>
    </select>
    <select id="selectStandardMethodLists3" resultType="com.ruoyi.basic.pojo.StandardMethodList">
        select id, code, name, remark
        from standard_method
        where is_use = 1
          and is_product = 1
          and structure_test_object_id LIKE CONCAT('%', #{tree}, '%')
    </select>
    <select id="selectListEnum" resultType="com.ruoyi.basic.pojo.StandardMethodList">
        select id,code,name from standard_method
        where is_product = 1
        and is_use = 1
    </select>
    <select id="selectStandardMethodListsByNull" resultType="com.ruoyi.basic.pojo.StandardMethodList">
        select id, code, name, remark
        from standard_method
        where is_use = 1
          and is_product = 1
          and (
                structure_test_object_id is null
                OR structure_test_object_id = ''
                OR structure_test_object_id = '[]'
            )
    </select>
    <select id="getStandardMethodId" resultType="java.lang.Integer">
        select id from standard_method where code = #{code}
    </select>
</mapper>
basic-server/src/main/resources/mapper/StandardMethodMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
<?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.ruoyi.basic.mapper.StandardMethodMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.StandardMethod">
        <id property="id" column="id" jdbcType="INTEGER"/>
        <result property="code" column="code" jdbcType="VARCHAR"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="remark" column="remark" jdbcType="VARCHAR"/>
        <result property="createUser" column="create_user" jdbcType="INTEGER"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
        <result property="updateUser" column="update_user" jdbcType="INTEGER"/>
        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <select id="selectStandardMethodList" resultType="com.ruoyi.basic.pojo.StandardMethod">
        select * from (
                select sm.id,
                sm.code,
                sm.name,
                sm.structure_test_object_id,
                sto.specimen_name sample_type,
                sm.remark,
                u1.name create_user_name,
                sm.create_time,
                u2.name update_user_name,
                sm.update_time,
                sm.is_product,
                sm.field,
                sm.name_en,
                sm.is_use,
                sm.qualification_id
                from standard_method sm
                left join user u1 on sm.create_user = u1.id
                left join user u2 on sm.update_user = u2.id
                left join structure_test_object sto on sm.structure_test_object_id = sto.id
                where sm.code != '技术要求'
                ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="selectStandMethodById" resultType="com.ruoyi.basic.pojo.StandardMethod">
        select sm.id,
               sm.code,
               sm.name,
               sm.structure_test_object_id,
               sto.specimen_name sample_type,
               sm.remark,
               u1.name create_user_name,
               sm.create_time,
               u2.name update_user_name,
               sm.update_time,
               sm.is_product,
               sm.field,
               sm.name_en,
               sm.is_use,
               sm.qualification_id
        from standard_method sm
                 left join user u1 on sm.create_user = u1.id
                 left join user u2 on sm.update_user = u2.id
                 left join structure_test_object sto on sm.structure_test_object_id = sto.id
        where sm.id = #{id}
    </select>
</mapper>
basic-server/src/main/resources/mapper/StandardProductListMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,144 @@
<?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.ruoyi.basic.mapper.StandardProductListMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.StandardProductList">
            <id property="id" column="id" jdbcType="INTEGER"/>
            <result property="inspectionItem" column="inspection_item" jdbcType="VARCHAR"/>
            <result property="inspectionItemSubclass" column="inspection_item_subclass" jdbcType="VARCHAR"/>
            <result property="laboratory" column="laboratory" jdbcType="VARCHAR"/>
            <result property="unit" column="unit" jdbcType="VARCHAR"/>
            <result property="price" column="price" jdbcType="DECIMAL"/>
            <result property="manHour" column="man_hour" jdbcType="INTEGER"/>
            <result property="manHourGroup" column="man_hour_group" jdbcType="VARCHAR"/>
            <result property="inspectionItemType" column="inspection_item_type" jdbcType="VARCHAR"/>
            <result property="inspectionValueType" column="inspection_value_type" jdbcType="VARCHAR"/>
            <result property="checkoutNumber" column="checkout_number" jdbcType="INTEGER"/>
            <result property="section" column="section" jdbcType="VARCHAR"/>
            <result property="method" column="method" jdbcType="VARCHAR"/>
            <result property="manDay" column="man_day" jdbcType="INTEGER"/>
            <result property="bsm" column="bsm" jdbcType="VARCHAR"/>
            <result property="ask" column="ask" jdbcType="VARCHAR"/>
            <result property="standardMethodListId" column="standard_method_list_id" jdbcType="INTEGER"/>
            <result property="createUser" column="create_user" jdbcType="INTEGER"/>
            <result property="updateUser" column="update_user" jdbcType="INTEGER"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <update id="updateSection">
        UPDATE standard_product_list
        SET price=#{productList.price},
            man_hour=#{productList.manHour},
            section=#{productList.section},
            cores=#{productList.cores},
            conductor_material=#{productList.conductorMaterial},
            conductor_type=#{productList.conductorType},
            ask=#{productList.ask},
            tell=#{productList.tell},
            update_user=#{productList.updateUser},
            update_time=#{productList.updateTime}
        WHERE id = #{productList.id}
    </update>
    <update id="updateSortUp">
        update standard_product_list
        set sort = sort - 1
        where tree = #{tree}
          and standard_method_list_id = #{methodId}
          and sort between #{beginIndex} + 1 and #{endIndex}
    </update>
    <update id="updateSortDown">
        update standard_product_list
        set sort = sort + 1
        where tree = #{tree}
          and standard_method_list_id = #{methodId}
          and sort between #{endIndex} and #{beginIndex} - 1
    </update>
    <select id="standardProductListIPage" resultType="com.ruoyi.basic.pojo.StandardProductList">
        select spl.* from standard_product_list spl
        left join product p on spl.sample = p.name
        where standard_method_list_id = #{id}
        and tree like concat('%',#{tree},'%')
        <if test="laboratory != ''">
            and son_laboratory = #{laboratory}
        </if>
        <if test="insItem != ''">
            and inspection_item = #{insItem}
        </if>
        <if test="insItems != ''">
            and inspection_item_subclass = #{insItems}
        </if>
        order by p.id
        group by spl.id
    </select>
    <select id="getOne" resultType="com.ruoyi.basic.pojo.StandardProductList">
        select * from standard_product_list
        where standard_method_list_id = #{standardMethodListId}
        and inspection_item = #{inspectionItem}
        <if test="sample!=null">
            and sample = #{sample}
        </if>
        <if test="inspectionItemSubclass!=null">
            and inspection_item_subclass = #{inspectionItemSubclass}
        </if>
        <if test="inspectionItemSubclass == null">
            and (inspection_item_subclass is null or inspection_item_subclass = '')
        </if>
        <if test="model!=null">
            and model = #{model}
        </if>
        <if test="inspectionItemClass != null and inspectionItemClass != ''">
            and inspection_item_class = #{inspectionItemClass}
        </if>
    </select>
    <select id="selectDetail" resultType="com.ruoyi.basic.pojo.StandardProductList">
        select * from standard_product_list
        where standard_method_list_id = #{standardMethodListId}
        and state =#{state}
        and model=#{model}
        <if test="isCableTag != null and isCableTag != ''">
            and (inspection_item_class like concat('%结构尺寸%') or
            inspection_item_class like concat('%电缆电性能%')or
            inspection_item_class like concat('%绝缘%')or
            inspection_item_class like concat('%电缆燃烧性能%'))
        </if>
        order by sort asc,
            case when man_hour_group is NULL then 1
                      when man_hour_group ='' then 1  else 0 end,
                 CASE
                     WHEN man_hour_group REGEXP '^[0-9]' THEN CAST(man_hour_group AS UNSIGNED) -- å¦‚果以数字开头,则按照数字大小排序
                     WHEN man_hour_group REGEXP '[0-9]+' THEN CAST(SUBSTRING(man_hour_group, 2)AS UNSIGNED) END -- æå–字母后面的数字部分
                ,id asc
    </select>
    <select id="selectDetail2" resultType="com.ruoyi.basic.pojo.StandardProductList">
        select * from standard_product_list
        where standard_method_list_id = #{standardMethodListId}
          and state =#{state}
          and tree =#{tree}
        <if test="isCableTag != null and isCableTag != ''">
            and (inspection_item_class like concat('%结构尺寸%') or
            inspection_item_class like concat('%电缆电性能%')or
            inspection_item_class like concat('%绝缘%')or
            inspection_item_class like concat('%电缆燃烧性能%'))
        </if>
        order by sort asc,
            case when man_hour_group is NULL then 1
                      when man_hour_group ='' then 1  else 0 end,
                 CASE
                     WHEN man_hour_group REGEXP '^[0-9]' THEN CAST(man_hour_group AS UNSIGNED) -- å¦‚果以数字开头,则按照数字大小排序
                     WHEN man_hour_group REGEXP '[0-9]+' THEN CAST(SUBSTRING(man_hour_group, 2)AS UNSIGNED) END -- æå–字母后面的数字部分
                ,id asc
    </select>
    <select id="selectPartColor" resultType="java.util.Map">
        select color,
               color_code
        from product_part
        where part_no = #{partNo}
        union all
        select color,
               color_code
        from structure_test_object_part
        where part_no = #{partNo}
    </select>
</mapper>
basic-server/src/main/resources/mapper/StandardProductListSupplierAskMapper.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.ruoyi.basic.mapper.StandardProductListSupplierAskMapper">
</mapper>
basic-server/src/main/resources/mapper/StandardTemplateMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
<?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.ruoyi.basic.mapper.StandardTemplateMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.StandardTemplate">
            <id property="id" column="id" jdbcType="INTEGER"/>
            <result property="name" column="name" jdbcType="VARCHAR"/>
            <result property="remark" column="remark" jdbcType="VARCHAR"/>
            <result property="thing" column="thing" jdbcType="VARCHAR"/>
            <result property="createUser" column="create_user" jdbcType="INTEGER"/>
            <result property="updateUser" column="update_user" jdbcType="INTEGER"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <select id="selectStandardTemplatePageList" resultType="com.ruoyi.basic.pojo.StandardTemplate">
        select * from (
        select st.id, st.name,st.number, st.remark, u2.name create_user_name, u3.name update_user_name, st.create_time, st.update_time
        from standard_template st
        left join user u2 on u2.id = st.create_user
        left join user u3 on u3.id = st.update_user
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="getStandTempIdByName" resultType="com.ruoyi.basic.pojo.StandardTemplate">
        select id from standard_template where name=#{name}
    </select>
    <!-- æŸ¥è¯¢åŽ‹ç¼©åŽçš„æ•°æ® -->
    <select id="selectCompressThing" resultType="java.lang.String">
        SELECT COMPRESS(thing)
        from standard_template b
        WHERE id = #{templateId}
    </select>
</mapper>
basic-server/src/main/resources/mapper/StandardTreeMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,384 @@
<?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.ruoyi.basic.mapper.StandardTreeMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.StandardTree">
        <id property="id" column="id" jdbcType="INTEGER"/>
        <result property="factory" column="factory" jdbcType="VARCHAR"/>
        <result property="laboratory" column="laboratory" jdbcType="VARCHAR"/>
        <result property="sampleType" column="sample_type" jdbcType="VARCHAR"/>
        <result property="sample" column="sample" jdbcType="VARCHAR"/>
        <result property="model" column="model" jdbcType="VARCHAR"/>
        <result property="createUser" column="create_user" jdbcType="INTEGER"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
        <result property="updateUser" column="update_user" jdbcType="INTEGER"/>
        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <resultMap id="FactoryDto" type="com.ruoyi.basic.dto.FactoryDto">
        <result property="label" column="factory"/>
        <result property="value" column="factory"/>
        <collection property="children" resultMap="LaboratoryDto"/>
    </resultMap>
    <resultMap id="LaboratoryDto" type="com.ruoyi.basic.dto.LaboratoryDto">
        <result property="label" column="laboratory"/>
        <result property="value" column="laboratory"/>
        <collection property="children" resultMap="SampleTypeDto"/>
    </resultMap>
    <resultMap id="SampleTypeDto" type="com.ruoyi.basic.dto.SampleTypeDto">
        <result property="label" column="sample_type"/>
        <result property="value" column="sample_type"/>
        <result property="sampleTypeId" column="sample_type_id"/>
        <result property="sort" column="sort"/>
        <result property="partNo" column="part_no"/>
        <result property="sampleTypeEn" column="sample_type_en"/>
        <collection property="children" resultMap="SampleDto"/>
    </resultMap>
    <resultMap id="SampleDto" type="com.ruoyi.basic.dto.SampleDto">
        <result property="label" column="sample"/>
        <result property="value" column="sample"/>
        <result property="partNo" column="sample_part_no"/>
        <result property="sampleEn" column="sample_en"/>
        <collection property="children" resultMap="ModelDto"/>
    </resultMap>
    <resultMap id="ModelDto" type="com.ruoyi.basic.dto.ModelDto">
        <result property="label" column="model"/>
        <result property="value" column="model"/>
    </resultMap>
    <sql id="selectStandardTree">
        sample    sample2,
               inspection_item,
               inspection_item_en,
               inspection_item_subclass,
               inspection_item_subclass_en,
               inspection_item_class,
               inspection_item_class_en,
               method,
               son_laboratory,
               unit,
               ask_tell  tell,
               ask,
               price,
               man_hour,
               man_hour_group,
               man_day,
               inspection_item_type,
               inspection_value_type,
               bsm,
               template_id,
               laboratory,
               checkout_number,
               section,
               dic,
               0         state,
        #{model}
        model,
        #{sample}
        sample,
        #{trees}
        tree,
        id
        structure_item_parameter_id,
        radius_list,
        rates
    </sql>
    <select id="selectStandardTreeList" resultMap="FactoryDto">
        select '中天科技检测中心'        factory,
               l.laboratory_name laboratory,
               sto.specimen_name sample_type,
               p.name            sample,
               st.model,
               sto.code,
               sto.id  sample_type_id,
               sto.sort,
               sto.specimen_name_en sample_type_en,
               p.name_en sample_en
        from laboratory l
                 left join structure_test_object sto on sto.laboratory_id = l.id
                 left join product p on p.object_id = sto.id
                 left join standard_tree st on st.sample_type = sto.specimen_name
            and st.sample = p.name
        order by l.id, CAST(sto.code AS DECIMAL), p.id, ISNULL(st.id), st.id
    </select>
    <select id="selectStandardProductById" resultType="com.ruoyi.basic.pojo.StandardProductList">
        select inspection_item,
               inspection_item_subclass,
               laboratory,
               son_laboratory,
               unit,
               price,
               man_hour,
               man_hour_group,
               inspection_item_type,
               inspection_value_type,
               checkout_number,
               section,
               method,
               man_day,
               bsm,
               template_id
        from structure_item_parameter
        where id = #{id}
    </select>
    <select id="getStandardProductListBySample" resultType="com.ruoyi.basic.pojo.StandardProductList">
        select inspection_item,
               inspection_item_subclass,
               laboratory,
               son_laboratory,
               unit,
               price,
               man_hour,
               man_hour_group,
               inspection_item_type,
               inspection_value_type,
               checkout_number,
               section,
               method,
               man_day,
               sample,
               bsm,
               template_id,
               dic,
               ask,
               ask_tell as tell
        from structure_item_parameter sp
        where sp.sample = #{sampleType}
           or sp.sample = ''
           or sp.sample = '[]'
    </select>
    <select id="getStandardMethodListBySample" resultType="com.ruoyi.basic.pojo.StandardMethodList">
        select sm.code,sm.name,sm.remark from standard_method sm
        left join structure_test_object sto on sm.structure_test_object_id = sto.id
        where is_use = 1
        and is_product = 1
        <if test="sampleType != null">
            and sto.specimen_name = #{sampleType}
        </if>
    </select>
    <select id="selectStandardTreeList2" resultType="com.ruoyi.basic.pojo.StandardTree">
        select '中天科技检测中心'        factory,
               l.laboratory_name laboratory,
               sto.specimen_name sample_type,
               p.name            sample
        from laboratory l
                 left join structure_test_object sto on sto.laboratory_id = l.id
                 left join product p on p.object_id = sto.id
                 left join standard_tree st on st.laboratory = l.laboratory_name
            and st.sample_type = sto.specimen_name
            and st.sample = p.name
        where sto.specimen_name = #{sampleType}
        group by sto.specimen_name
    </select>
    <select id="selectStandardProductListByTree" resultType="com.ruoyi.basic.pojo.StandardProductList">
        select <include refid="selectStandardTree"/>
        from structure_item_parameter
        where (
                sample is NULL
                OR sample = ''
                or sample = '[]'
                OR sample LIKE CONCAT('%[', #{tree}, ']%')
            )
          and (laboratory is null
            or laboratory = ''
            or laboratory = #{laboratory})
        order by inspection_item_class, inspection_item, id asc
    </select>
    <select id="selectStandardProductListByTree2" resultType="com.ruoyi.basic.pojo.StandardProductList">
        select <include refid="selectStandardTree"/>
        from structure_item_parameter
        where sample LIKE CONCAT('%[', #{tree}, ']%')
          and (laboratory is null
            or laboratory = ''
            or laboratory = #{laboratory})
        order by inspection_item_class, inspection_item, id asc
    </select>
    <select id="getStandardTree2" resultMap="SampleTypeDto">
        select sto.specimen_name sample_type,
               p.name            sample,
               st.model
        from structure_test_object sto
                 left join product p on p.object_id = sto.id
                 left join standard_tree st on st.sample_type = sto.specimen_name
            and st.sample = p.name
    </select>
    <select id="getStandardTree3" resultType="com.ruoyi.basic.dto.SampleDto">
        select model label,
               model value
        from standard_tree
        where sample_type = #{sampleType}
          and sample is null
    </select>
    <select id="getLaboratory" resultType="java.lang.String">
        select l.laboratory_name
        from structure_test_object sto
                 left join laboratory l on sto.laboratory_id = l.id
        where sto.specimen_name = #{str}
    </select>
    <select id="getStructureItemParameterId" resultType="java.lang.Integer">
        select id from structure_item_parameter
        where sample like concat('%', #{sampleType}, '%')
        and inspection_item = #{item}
        <if test="itemChild != null and itemChild != ''">
            and inspection_item_subclass = #{itemChild}
        </if>
        <if test="inspectionItemClass != null and inspectionItemClass != ''">
            and inspection_item_class = #{inspectionItemClass}
        </if>
        <if test="itemChild == null or itemChild == ''">
            and (inspection_item_subclass is null or inspection_item_subclass = '')
        </if>
    </select>
    <select id="selectPList" resultType="com.ruoyi.basic.dto.ProductDto">
        select p.name
        from structure_test_object sto
                 left join product p on p.object_id = sto.id
        where sto.specimen_name = #{name}
        order by p.id
    </select>
    <select id="selSample" resultType="java.lang.String">
        select name
        from product
        where name = #{name}
    </select>
    <select id="selectStandardTreeListByPartNo" resultMap="FactoryDto">
        select '中天科技检测中心' factory,
               l.laboratory_name  laboratory,
               sto.specimen_name  sample_type,
               p.name             sample,
               st.model,
               CASE
                   WHEN p.id = (SELECT pp.product_id
                                FROM product_part pp
                                WHERE pp.part_no = #{partNo})
                       THEN #{partNo}
                   ELSE NULL
                   END AS sample_part_no,
               CASE
                   WHEN sto.id = (SELECT sto.test_object_id
                                  FROM structure_test_object_part sto
                                  WHERE sto.part_no = #{partNo})
                       THEN #{partNo}
                   ELSE NULL
                   END AS part_no
        from laboratory l
                 left join structure_test_object sto on sto.laboratory_id = l.id
                 left join product p on p.object_id = sto.id
                 left join standard_tree st on st.sample_type = sto.specimen_name
            and st.sample = p.name
        where (p.id = (select pp.product_id
                       from product_part pp
                       where pp.part_no = #{partNo})
            or sto.id = (select sto.test_object_id
                         from structure_test_object_part sto
                         where sto.part_no = #{partNo}))
        order by l.id, CAST(sto.code AS DECIMAL), p.id, ISNULL(st.id), st.id
    </select>
    <sql id="getIfsOrder">
        select *
        from (SELECT ifs.*,
                     COALESCE(io1.create_user, io2.create_user)           create_user,
                     COALESCE(io1.entrust_code, io2.entrust_code)         entrust_code,
                     COALESCE(io1.send_time, io2.send_time)               send_time,
                     io1.id                                      enter_order_id,
                     ir1.id                                      enter_report_id,
                     ir1.url                                     enter_url,
                     ir1.url_s                                   enter_url_s,
                     io2.id                                      quarter_order_id,
                     ir2.id                                      quarter_report_id,
                     ir2.url                                     quarter_url,
                     ir2.url_s                                   quarter_url_s,
                     group_concat(distinct isa.sample_code, ' ')          sample_code,
                     group_concat(distinct isa.sample, ' ')               sample_name,
                     group_concat(distinct isa.model, ' ')                sample_model,
                     COALESCE(io1.state, io2.state)                       order_state,
                     COALESCE(isu.userName, COALESCE(u1.name, u2.name)) user_name,
                     group_concat(distinct iuh.unqualified_desc, ' ')    unqualified_desc,
                     io1.is_exemption
              FROM ifs_inventory_quantity ifs
                       LEFT JOIN ins_order io1 ON io1.ifs_inventory_id = ifs.id and io1.order_type = '进厂检验' and io1.state != -1
                       left join ins_report ir1 on io1.id = ir1.ins_order_id
                       left join user u1 on io1.create_user = u1.id
                       LEFT JOIN ins_order io2 ON io2.ifs_inventory_id = ifs.id and io2.order_type = 'Quarterly inspection' and io2.state != -1
                       left join ins_report ir2 on io2.id = ir2.ins_order_id
                       left join user u2 on io2.create_user = u2.id
                       LEFT JOIN ins_sample isa ON COALESCE(io1.id, io2.id) = isa.ins_order_id
                       LEFT JOIN (SELECT ins_sample_id, GROUP_CONCAT(DISTINCT uu.name SEPARATOR ',') AS userName
                                  FROM ins_sample_user u
                                           LEFT JOIN user uu ON u.user_id = uu.id
                                  WHERE u.state = 0
                                  GROUP BY ins_sample_id
                                  ORDER BY ins_sample_id) isu ON isu.ins_sample_id = COALESCE(io1.id, io2.id)
                       left join ins_unqualified_handler iuh on iuh.inventory_quantity_id = ifs.id
              group by ifs.id) a
    </sql>
    <select id="getIfsByStateOne" resultType="com.ruoyi.basic.dto.IfsInventoryQuantityDto">
        <include refid="getIfsOrder"/>
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="selectIfsPage" resultType="com.ruoyi.basic.pojo.IfsInventoryQuantity">
        SELECT * from ifs_inventory_quantity ifs
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="selectIfsInventoryQuantity" resultType="com.ruoyi.basic.dto.IfsInventoryQuantityCheckDto">
        SELECT * from ifs_inventory_quantity ifs
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="getIfsByOver" resultType="com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto">
        select * from (<include refid="getIfsOrder"/>
        <where>
            <if test="beginDeclareDate != null and beginDeclareDate != '' and endDeclareDate != null and endDeclareDate != ''">
                send_time between #{beginDeclareDate} and #{endDeclareDate}
            </if>
        </where>
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="getIfsByOverList" resultType="com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto">
        select * from (<include refid="getIfsOrder"/>
            <where>
                <if test="beginDeclareDate != null and beginDeclareDate != '' and endDeclareDate != null and endDeclareDate != ''">
                    send_time between #{beginDeclareDate} and #{endDeclareDate}
                </if>
            </where>
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="getIfsByQuarter" resultType="com.ruoyi.basic.dto.IfsInventoryQuantitySupplierDto">
        select * from (<include refid="getIfsOrder"/>
        <where>
            and (quarter_order_id is not null)
            <if test="beginDeclareDate != null and beginDeclareDate != '' and endDeclareDate != null and endDeclareDate != ''">
                and  send_time between #{beginDeclareDate} and #{endDeclareDate}
            </if>
        </where>
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
</mapper>
basic-server/src/main/resources/mapper/StructureItemParameterMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
<?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.ruoyi.basic.mapper.StructureItemParameterMapper">
    <delete id="removeNoSample">
        delete
        from structure_item_parameter
        where sample like concat('%', #{sample}, '%')
    </delete>
    <select id="selectItemParameterList" resultType="com.ruoyi.basic.pojo.StructureItemParameter">
        select * from (select A.id,
        inspection_item,
        inspection_item_en,
        inspection_item_subclass,
        inspection_item_subclass_en,
        laboratory,
        unit,
        price,
        man_hour,
        man_hour_group,
        inspection_item_type,
        checkout_number,
        section,
        A.create_user,
        A.update_user,
        A.create_time,
        A.update_time,
        method,
        man_day,
        bsm,
        sample,
        inspection_value_type,
        dic,
        template_id,
        son_laboratory,
        ask,
        ask_tell,
        inspection_item_class,
        inspection_item_class_en,
        code,
        radius_list,
        rates
        from (select *,
        CASE
        WHEN INSTR(sample, ',') > 0 THEN
        SUBSTRING_INDEX(SUBSTRING_INDEX(sample, '","', 1), '"', -1)
        when sample = '[""]' then null
        when sample = '[]' then null
        ELSE
        TRIM(BOTH '["]' FROM SUBSTRING_INDEX(REPLACE(sample, '[["', ''), '"]]', 1))
        END AS samples
        from structure_item_parameter) A
        left join structure_test_object sto on samples = specimen_name
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>)B
        order by CASE
        WHEN code IS NULL THEN 1
        ELSE 0
        END,
        CAST(code AS UNSIGNED),
        case when man_hour_group is NULL then 1
        when man_hour_group ='' then 1 else 0 end,
        CASE
        WHEN man_hour_group REGEXP '^[0-9]' THEN CAST(man_hour_group AS UNSIGNED) -- å¦‚果以数字开头,则按照数字大小排序
        WHEN man_hour_group REGEXP '[0-9]+' THEN CAST(SUBSTRING(man_hour_group, 2)AS UNSIGNED) END -- æå–字母后面的数字部分
        ,id asc
    </select>
    <resultMap id="getInsProductions" type="map">
        <result property="name" column="sample"/>
        <collection property="children" resultMap="itemClass" javaType="List"/>
    </resultMap>
    <resultMap id="itemClass" type="map">
        <result property="name" column="item_class"/>
        <collection property="children" resultMap="item" javaType="List"/>
    </resultMap>
    <resultMap id="item" type="map">
        <result property="name" column="inspection_item"/>
        <collection property="children" resultMap="itemSubClass" javaType="List"/>
    </resultMap>
    <resultMap id="itemSubClass" type="map">
        <id property="id" column="id"/>
        <result property="name" column="subclass"/>
    </resultMap>
    <select id="getInsProduction" resultMap="getInsProductions">
        select distinct id,
                        CASE
                            WHEN INSTR(sample, ',') > 0 THEN
                                SUBSTRING_INDEX(SUBSTRING_INDEX(sample, '","', 1), '"', -1)
                            when sample = '[""]' then '*'
                            ELSE
                                TRIM(BOTH '["]' FROM SUBSTRING_INDEX(REPLACE(sample, '[["', ''), '"]]', 1))
                            END
                                                              as sample,
                        inspection_item,
                        case
                            when inspection_item_subclass is null or inspection_item_subclass = '' then inspection_item
                            else inspection_item_subclass end as subclass,
                        case
                            when inspection_item_class is null or inspection_item_class = '' then inspection_item
                            else inspection_item_class end as item_class
        from structure_item_parameter
    </select>
    <select id="getItemTree" resultMap="itemDto">
        select sto.id sId, sto.specimen_name sName, p.id pId, p.name pName
        from structure_test_object sto
                 left join product p on p.object_id = sto.id
    </select>
    <resultMap id="itemDto" type="com.ruoyi.basic.dto.TestItemDto">
        <result column="sId" property="id"/>
        <result column="sName" property="name"/>
        <collection property="children" resultMap="productDto"/>
    </resultMap>
    <resultMap id="productDto" type="com.ruoyi.basic.dto.ProductDto">
        <result column="pId" property="id"/>
        <result column="pName" property="name"/>
    </resultMap>
</mapper>
basic-server/src/main/resources/mapper/StructureTestMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
<?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.ruoyi.basic.mapper.StructureTestObjectMapper">
    <select id="selectTestObjectList" resultType="com.ruoyi.basic.dto.PageTestObjectDto">
        select * from (
        select sto.id,
        sto.specimen_name,
        u1.name create_user_name,
        sto.create_time,
        u2.name update_user_name,
        sto.update_time,
        sto.code,
        sto.laboratory_id,
        GROUP_CONCAT(p.name) product,
        sto.specimen_name_en,
        sto.object_type
        from structure_test_object sto
        left join user u1 on sto.create_user = u1.id
        left join user u2 on sto.update_user = u2.id
        left join product p on p.object_id = sto.id
        left join product_part pp on pp.product_id = p.id
        left join structure_test_object_part stop ON stop.test_object_id = sto.id
        <if test="partNo != null and partNo != ''" >
            where pp.part_no = #{partNo} or stop.part_no = #{partNo}
        </if>
        group by sto.id
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
</mapper>
basic-server/src/main/resources/mapper/StructureTestObjectPartMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
<?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.ruoyi.basic.mapper.StructureTestObjectPartMapper">
    <select id="selectListByTestObjectId" resultType="com.ruoyi.basic.pojo.StructureTestObjectPart">
        SELECT * from structure_test_object_part pp
        where  pp.test_object_id = #{testObjectId}
    </select>
</mapper>
bin/clean.bat
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
@echo off
echo.
echo [信息] æ¸…理工程target生成路径。
echo.
%~d0
cd %~dp0
cd ..
call mvn clean
pause
bin/package.bat
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
@echo off
echo.
echo [信息] æ‰“包Web工程,生成war/jar包文件。
echo.
%~d0
cd %~dp0
cd ..
call mvn clean package -Dmaven.test.skip=true
pause
bin/run.bat
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
@echo off
echo.
echo [信息] ä½¿ç”¨Jar命令运行Web工程。
echo.
cd %~dp0
cd ../ruoyi-admin/target
set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
java -jar %JAVA_OPTS% ruoyi-admin.jar
cd bin
pause
inspect-server/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ruoyi</artifactId>
        <groupId>com.ruoyi</groupId>
        <version>3.8.9</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>inspect-server</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-framework</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-system</artifactId>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
</project>
inspect-server/src/main/java/com/ruoyi/basic/pojo/InsSample.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,123 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * æ£€éªŒæ ·å“
 * @TableName ins_sample
 */
@TableName(value ="ins_sample")
@Data
public class InsSample implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * 1:合格 0:不合格
     */
    private Integer insResult;
    /**
     * å¤–键:ins_order表id
     */
    private Integer insOrderId;
    /**
     * é…å¥—样品型号
     */
    private String joinModel;
    /**
     * é…å¥—样品名称
     */
    private String joinName;
    /**
     * é…å¥—样品数量
     */
    private Integer joinNum;
    /**
     * æ ·å“ç¼–码
     */
    private String sampleCode;
    /**
     * æ£€éªŒå·¥åŽ‚
     */
    private String factory;
    /**
     * å®žéªŒå®¤åç§°
     */
    private String laboratory;
    /**
     * æ ·å“ç±»åž‹
     */
    private String sampleType;
    /**
     * æ ·å“åç§°
     */
    private String sample;
    /**
     * è§„格型号
     */
    private String model;
    /**
     * æ£€éªŒçŠ¶æ€(0:待检验1:检验中 2:已检验3:待复核4:复核未通过5:复核通过)
     */
    private Integer insState;
    /**
     * å¤‡æ³¨
     */
    private String remark;
    private Integer standardMethodListId;
    @ApiModelProperty("样品单位")
    private String unit;
    private Integer cellId;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    private Integer parentId;
    @ApiModelProperty("数量")
    private Integer quantity;
    @ApiModelProperty("特殊标准方法")
    private String specialStandardMethod;
    @TableField(select = false,exist = false)
    private Integer num=1;
}
performance-server/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ruoyi</artifactId>
        <groupId>com.ruoyi</groupId>
        <version>3.8.9</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>performance-server</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-framework</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-system</artifactId>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
</project>
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryCorrectionHoursController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.ruoyi.performance.controller;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.utils.JackSonUtil;
import com.ruoyi.performance.dto.AuxiliaryCorrectionHoursDto;
import com.ruoyi.performance.excel.AuxiliaryCorrectionHoursListener;
import com.ruoyi.performance.service.AuxiliaryCorrectionHoursService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.Map;
/**
 * <p>
 * å·¥æ—¶ç»Ÿè®¡çš„修正工时 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-29 02:38:19
 */
@Api(tags = "工时统计-修正工时")
@AllArgsConstructor
@RestController
@RequestMapping("/auxiliaryCorrectionHours")
public class AuxiliaryCorrectionHoursController {
    @Resource
    AuxiliaryCorrectionHoursService auxiliaryCorrectionHoursService;
    @ApiOperation(value = "查询修正工时")
    @PostMapping("/selectAuxiliaryCorrectionHours")
    public Result selectAuxiliaryCorrectionHours(Page page,AuxiliaryCorrectionHoursDto entity) throws Exception {
        return Result.success(auxiliaryCorrectionHoursService.selectAuxiliaryCorrectionHours(page, entity));
    }
    /**
     * excel上传
     *
     * @return
     */
    @ApiOperation(value = "导入修正工时")
    @PostMapping("/upload")
    public Result upload(@RequestParam("file") MultipartFile file) {
        try {
            EasyExcel.read(file.getInputStream(), AuxiliaryCorrectionHoursDto.class, new AuxiliaryCorrectionHoursListener(auxiliaryCorrectionHoursService)).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Result.success();
    }
}
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryOriginalHoursController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.ruoyi.performance.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.utils.JackSonUtil;
import com.ruoyi.performance.dto.AuxiliaryOriginalHoursLookDto;
import com.ruoyi.performance.service.AuxiliaryOriginalHoursService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
@Api(tags = "工时统计-原始工时")
@AllArgsConstructor
@RestController
@RequestMapping("/auxiliaryOriginalHours")
public class AuxiliaryOriginalHoursController {
    @Resource
    AuxiliaryOriginalHoursService auxiliaryOriginalHoursService;
    @ApiOperation(value = "查询原始工时")
    @PostMapping("/selectAuxiliaryOriginalHours")
    public Result selectAuxiliaryOriginalHours(Page page, AuxiliaryOriginalHoursLookDto entity) throws Exception {
        return Result.success(auxiliaryOriginalHoursService.selectAuxiliaryOriginalHours(page, entity));
    }
    @ApiOperation(value = "导出原始工时")
    @PostMapping("/exportOriginalHours")
    public void exportOriginalHours(@RequestParam("month") String month,  @RequestParam("name") String name,  @RequestParam("departLims") String departLims,HttpServletResponse response) throws IOException {
        auxiliaryOriginalHoursService.exportWorkingHours(month,name,departLims,response);
    }
    @ApiOperation(value = "查询月份全部工时")
    @PostMapping("/selectAuxiliaryAllByMonth")
    public Result selectAuxiliaryAllByMonth(@RequestBody AuxiliaryOriginalHoursLookDto dto){
        return Result.success(auxiliaryOriginalHoursService.selectAuxiliaryAllByMonth(dto));
    }
}
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryOutputWorkingHoursController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.ruoyi.performance.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.utils.JackSonUtil;
import com.ruoyi.performance.dto.AuxiliaryOutputWorkingHoursDto;
import com.ruoyi.performance.service.AuxiliaryOutputWorkingHoursService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
/**
 * <p>
 * æ—¥å·¥æ—¶ç®¡ç†çš„产量工时 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-28 03:48:48
 */
@Api(tags = "日工时管理-产量工时")
@AllArgsConstructor
@RestController
@RequestMapping("/auxiliaryOutputWorkingHours")
public class AuxiliaryOutputWorkingHoursController {
    @Resource
    private AuxiliaryOutputWorkingHoursService auxiliaryOutputWorkingHoursService;
    @ApiOperation(value = "查询产量工时")
    @PostMapping("/selectAuxiliaryOutputWorkingHours")
    public Result selectAuxiliaryOutputWorkingHours(Page page,AuxiliaryOutputWorkingHoursDto entity) throws Exception {
        return Result.success(auxiliaryOutputWorkingHoursService.selectAuxiliaryOutputWorkingHours(page, entity));
    }
    @ApiOperation(value = "统计产量工时汇总和辅助工时汇总")
    @PostMapping("/collectWorkingHours")
    public Result collectWorkingHours(@RequestBody Map<String, Object> data)throws Exception{
        AuxiliaryOutputWorkingHoursDto entity = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), AuxiliaryOutputWorkingHoursDto.class);
        return Result.success(auxiliaryOutputWorkingHoursService.collectWorkingHours(entity));
    }
    @ApiOperation(value = "导出产量工时+辅助工时")
    @GetMapping("/exportWorkingHours")
    public void exportWorkingHours(HttpServletResponse response) throws IOException {
        auxiliaryOutputWorkingHoursService.exportWorkingHours(response);
    }
    @ApiOperation(value = "组长权限")
    @PostMapping("/leader")
    public Result leader() {
        return Result.success();
    }
    /**
     * å¯¼å‡ºäº§é‡å·¥æ—¶
     * @param response
     * @throws IOException
     */
    @ApiOperation(value = "导出产量工时")
    @PostMapping("/exportOutputHours")
    public void exportOutputHours(@RequestBody Map<String, Object> data, HttpServletResponse response) throws Exception {
        AuxiliaryOutputWorkingHoursDto entity = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), AuxiliaryOutputWorkingHoursDto.class);
        auxiliaryOutputWorkingHoursService.exportOutputHours(entity, response);
    }
}
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryWorkingHoursController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.ruoyi.performance.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.utils.JackSonUtil;
import com.ruoyi.performance.pojo.AuxiliaryWorkingHours;
import com.ruoyi.performance.service.AuxiliaryWorkingHoursService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Map;
/**
 * <p>
 * è¾…助工时 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-09 06:58:31
 */
@Api(tags = "绩效管理-辅助工时设置")
@AllArgsConstructor
@RestController
@RequestMapping("/auxiliaryWorkingHours")
public class AuxiliaryWorkingHoursController {
    @Resource
    private AuxiliaryWorkingHoursService auxiliaryWorkingHoursService;
    @ApiOperation(value="查询辅助工时")
    @PostMapping("/selectAuxiliaryWorkingHours")
    public Result selectAuxiliaryWorkingHours(Page page,AuxiliaryWorkingHours entity) throws Exception {
        return Result.success(auxiliaryWorkingHoursService.selectAuxiliaryWorkingHours(page,entity));
    }
    @ApiOperation(value="删除辅助工时")
    @PostMapping("/deleteAuxiliaryWorkingHours")
    public Result deleteAuxiliaryWorkingHours(Integer id){
        return Result.success(auxiliaryWorkingHoursService.deleteAuxiliaryWorkingHours(id));
    }
    @ApiOperation(value="修改辅助工时")
    @PostMapping("/upAuxiliaryWorkingHours")
    public Result upAuxiliaryWorkingHours(@RequestBody AuxiliaryWorkingHours auxiliaryWorkingHours){
        return Result.success(auxiliaryWorkingHoursService.upAuxiliaryWorkingHours(auxiliaryWorkingHours));
    }
    @ApiOperation(value="新增辅助工时")
    @PostMapping("/insertAuxiliaryWorkingHours")
    public  Result insertAuxiliaryWorkingHours(@RequestBody AuxiliaryWorkingHours auxiliaryWorkingHours){
        return Result.success(auxiliaryWorkingHoursService.insertAuxiliaryWorkingHours(auxiliaryWorkingHours));
    }
}
performance-server/src/main/java/com/ruoyi/performance/controller/AuxiliaryWorkingHoursDayController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
package com.ruoyi.performance.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.utils.JackSonUtil;
import com.ruoyi.performance.dto.AuxiliaryWorkingHoursDayDto;
import com.ruoyi.performance.dto.HoursDay;
import com.ruoyi.performance.pojo.AuxiliaryWorkingHoursDay;
import com.ruoyi.performance.service.AuxiliaryWorkingHoursDayService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.Map;
/**
 * <p>
 * æ—¥å·¥æ—¶ç®¡ç†çš„辅助工时 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-28 02:22:19
 */
@Api(tags = "日工时管理-辅助工时")
@AllArgsConstructor
@RestController
@RequestMapping("/auxiliaryWorkingHoursDay")
public class AuxiliaryWorkingHoursDayController {
    @Resource
    private AuxiliaryWorkingHoursDayService auxiliaryWorkingHoursDayService;
    @ApiOperation(value = "查询工时统计的辅助工时")
    @PostMapping("/selectAuxiliaryWorkingHoursDay")
    public Result selectAuxiliaryWorkingHoursDay(Page page,AuxiliaryWorkingHoursDayDto entity) throws Exception {
        return Result.success(auxiliaryWorkingHoursDayService.selectAuxiliaryWorkingHoursDay(page, entity));
    }
    @ApiOperation(value = "根据编号查询辅助工时配置信息")
    @PostMapping("/selectAuxiliaryWorkingHoursByNumber")
    public Result selectAuxiliaryWorkingHoursByNumber(String number) {
        return Result.success(auxiliaryWorkingHoursDayService.selectAuxiliaryWorkingHoursByNumber(number));
    }
    @ApiOperation(value = "根据编号当前用户信息查询所在班次")
    @PostMapping("/selectshiftByUser")
    public Result selectshiftByUser(LocalDateTime dateTime) {
        return Result.success(auxiliaryWorkingHoursDayService.selectshiftByUser(dateTime));
    }
    @ApiOperation(value = "录入数据(工时统计的辅助工时)")
    @PostMapping("/insertAuxiliaryWorkingHoursDay")
    public Result insertAuxiliaryWorkingHoursDay(@RequestBody AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay) {
        return Result.success(auxiliaryWorkingHoursDayService.insertAuxiliaryWorkingHoursDay(auxiliaryWorkingHoursDay));
    }
    @ApiOperation(value = "批准工时统计的辅助工时")
    @PostMapping("/approve")
    public Result approve(@RequestBody HoursDay hoursDay ) {
        return Result.success(auxiliaryWorkingHoursDayService.checkOrApprove(hoursDay));
    }
    @ApiOperation(value = "审核工时统计的辅助工时")
    @PostMapping("/check")
    public Result check(@RequestBody HoursDay hoursDay ) {
        return Result.success(auxiliaryWorkingHoursDayService.checkOrApprove(hoursDay));
    }
    @ApiOperation(value = "编辑工时统计的辅助工时")
    @PostMapping("/updateAuxiliaryWorkingHoursDay")
    public Result updateAuxiliaryWorkingHoursDay(@RequestBody AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay) {
        return Result.success(auxiliaryWorkingHoursDayService.updateAuxiliaryWorkingHoursDay(auxiliaryWorkingHoursDay));
    }
    @ApiOperation(value = "删除工时统计的辅助工时")
    @PostMapping("/deleteAuxiliaryWorkingHoursDay")
    public Result deleteAuxiliaryWorkingHoursDay(Integer id) {
        return Result.success(auxiliaryWorkingHoursDayService.deleteAuxiliaryWorkingHoursDay(id));
    }
    /**
     * å¯¼å‡ºè¾…助工时
     * @param response
     * @throws IOException
     */
    @ApiOperation(value = "导出辅助工时")
    @PostMapping("/exportAssistantHours")
    public void exportAssistantHours(@RequestBody Map<String, Object> data, HttpServletResponse response) throws Exception {
        AuxiliaryWorkingHoursDayDto entity = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), AuxiliaryWorkingHoursDayDto.class);
        auxiliaryWorkingHoursDayService.exportWorkingHours(entity, response);
    }
}
performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,152 @@
package com.ruoyi.performance.controller;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.performance.dto.PerformanceShiftAddDto;
import com.ruoyi.performance.pojo.PerformanceShift;
import com.ruoyi.performance.service.PerformanceShiftService;
import com.ruoyi.performance.utils.StyleMonthUtils;
import com.ruoyi.performance.utils.StyleYearUtils;
import com.ruoyi.system.service.ISysDictTypeService;
import com.ruoyi.system.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotNull;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * <p>
 * ç»©æ•ˆç®¡ç†-班次 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-08 09:12:04
 */
@Api(tags = "绩效管理-班次")
@RestController
@RequestMapping("/performanceShift")
public class PerformanceShiftController {
    @Autowired
    private PerformanceShiftService performanceShiftService;
    @Resource
    private ISysDictTypeService dictTypeService;
    @Resource
    private UserService userService;
    @ApiOperation(value = "排班")
    @PostMapping("add")
    public Result<?> performanceShiftAdd(@RequestBody PerformanceShiftAddDto performanceShiftAddDto) {
        performanceShiftService.performanceShiftAdd(performanceShiftAddDto);
        return Result.success();
    }
    @ApiOperation(value = "月份分页查询")
    @PostMapping("page")
    public Result<?> performanceShiftPage(Integer size, Integer current, String time, String userName, String laboratory) {
        return Result.success(performanceShiftService.performanceShiftPage(new Page<>(current, size), time, userName, laboratory));
    }
    @ApiOperation(value = "年份分页查询")
    @PostMapping("pageYear")
    public Result<?> performanceShiftPageYear(Integer size, Integer current, String time, String userName, String laboratory) {
        return Result.success(performanceShiftService.performanceShiftPageYear(new Page<>(current, size), time, userName, laboratory));
    }
    @ApiOperation(value = "班次状态修改")
    @PutMapping("update")
    public Result<?> performanceShiftUpdate(@RequestBody PerformanceShift performanceShift) {
        performanceShiftService.performanceShiftUpdate(performanceShift);
        return Result.success();
    }
    @ApiOperation(value = "导出")
    @GetMapping("export")
    public void exportToExcel(@NotNull(message = "时间不能为空!") String time, String userName, String laboratory, Boolean isMonth, HttpServletResponse response) throws Exception {
        Map<Object, Object> data;
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("requestType","excel");
        response.setHeader("Access-Control-Expose-Headers", "requestType");
        if (!isMonth) {
            data = performanceShiftService.exportToYearExcel(time, userName, laboratory);
            // è®¾ç½®å•元格样式
            HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(StyleYearUtils.getHeadStyle(), StyleYearUtils.getContentStyle());
            // ä¿å­˜åˆ°ç¬¬ä¸€ä¸ªsheet中
            EasyExcel.write(response.getOutputStream())
                    .head((List<List<String>>) data.get("header"))
                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // è‡ªé€‚应列宽
                    .registerWriteHandler(horizontalCellStyleStrategy)
                    .sheet("年度")
                    .doWrite((Collection<?>) data.get("data"));
        } else {
            data = performanceShiftService.exportToMonthExcel(time, userName, laboratory);
            // è®¾ç½®å•元格样式
            HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(StyleMonthUtils.getHeadStyle(), StyleMonthUtils.getContentStyle());
            EasyExcel.write(response.getOutputStream())
                    .head((List<List<String>>) data.get("header"))
                    .registerWriteHandler(horizontalCellStyleStrategy)
                    .sheet("月度")
                    .doWrite((Collection<?>) data.get("data"));
        }
    }
    @ApiOperation(value = "临时接口-添加7月份8月份的数据")
    @GetMapping("temporaryInterface")
    public void temporaryInterface() {
        System.out.println("开始给每个人进行排班,默认早班======start");
        // TODO ç»™æ¯ä¸ªäººéƒ½è¿›è¡ŒæŽ’班(默认早班)
        PerformanceShiftAddDto performanceShiftAddDto = new PerformanceShiftAddDto();
        //班次--早(查询字典)
        List<SysDictData> shiftType = dictTypeService.selectDictDataByName("班次类型");
        List<String> collect = shiftType.stream().filter(enums -> enums.getDictLabel().equals("早")).map(enums -> enums.getDictValue()).collect(Collectors.toList());
        performanceShiftAddDto.setShift(collect.get(0));
        //人员--所有人
        String userIds = userService.list().stream().map(user -> user.getId().toString()).distinct().collect(Collectors.joining(","));
        performanceShiftAddDto.setUserId(userIds);
        //周次--当月所有
        // èŽ·å–å½“å‰æ—¥æœŸ
        LocalDate today = LocalDate.of(2024, 8, 15);
        // èŽ·å–æœ¬æœˆçš„ç¬¬ä¸€å¤©å’Œæœ€åŽä¸€å¤©
        LocalDate firstDayOfMonth = today.with(TemporalAdjusters.firstDayOfMonth());
        LocalDate lastDayOfMonth = today.with(TemporalAdjusters.lastDayOfMonth());
        // èŽ·å–å‘¨å­—æ®µä¿¡æ¯ï¼ˆæ ¹æ®åŒºåŸŸè®¾ç½®ï¼‰
        WeekFields weekFields = WeekFields.of(Locale.getDefault());
        // èŽ·å–æœ¬æœˆç¬¬ä¸€å¤©çš„å‘¨ä¸€
        LocalDate startOfWeek = firstDayOfMonth.with(TemporalAdjusters.previousOrSame(weekFields.getFirstDayOfWeek()));
        // éåŽ†æœ¬æœˆæ‰€æœ‰å¤©æ•°ï¼Œæ‰¾å‡ºæ¯å‘¨çš„ç¬¬ä¸€å¤©å’Œæœ€åŽä¸€å¤©
        LocalDate endOfWeek;
        while (startOfWeek.isBefore(firstDayOfMonth.plusMonths(1))) {
            endOfWeek = startOfWeek.plusDays(6);
            LocalDateTime startDateTime = LocalDateTime.of(startOfWeek, LocalTime.MIDNIGHT);
            LocalDateTime endDateTime = LocalDateTime.of(endOfWeek, LocalTime.MIDNIGHT);
            System.out.println("Week starts on " + startDateTime + " and ends on " + endDateTime);
            performanceShiftAddDto.setStartWeek(startDateTime);
            performanceShiftAddDto.setEndWeek(endDateTime);
            performanceShiftService.performanceShiftAdd(performanceShiftAddDto);
            startOfWeek = startOfWeek.plusWeeks(1);
        }
        System.out.println("排班结束======end");
    }
}
performance-server/src/main/java/com/ruoyi/performance/controller/ShiftTimeController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ruoyi.performance.controller;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.performance.pojo.ShiftTime;
import com.ruoyi.performance.service.ShiftTimeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 * ç­æ¬¡å¯¹åº”的时间 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-07-24 11:22:17
 */
@Api(tags = "绩效管理-班次排班")
@RestController
@RequestMapping("/shiftTime")
public class ShiftTimeController {
    @Autowired
    private ShiftTimeService shiftTimeService;
    @ApiOperation(value = "排班时间配置")
    @PostMapping("add")
    public Result<?> shiftTimeAdd(@RequestBody ShiftTime shiftTime) {
        shiftTimeService.shiftTimeAdd(shiftTime);
        return Result.success();
    }
    @ApiOperation(value = "排班时间配置查询")
    @PostMapping("list")
    public Result<?> shiftTimeList() {
        return Result.success(shiftTimeService.shiftTimeList());
    }
    @ApiOperation(value = "排班时间配置删除")
    @PostMapping("remove")
    public Result<?> shiftTimeRemove(Long id) {
        return Result.success(shiftTimeService.removeById(id));
    }
    @ApiOperation(value = "排班时间配置修改")
    @PostMapping("update")
    public Result<?> shiftTimeUpdate(@RequestBody ShiftTime shiftTime) {
        return Result.success(shiftTimeService.updateById(shiftTime));
    }
}
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryAllDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.performance.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * å·¥æ—¶ç»Ÿè®¡åˆ—表
 *
 * @Author zhuo
 * @Date 2024/10/25
 */
@Data
public class AuxiliaryAllDto {
    @ApiModelProperty("产量工时")
    private BigDecimal yieldHour;
    @ApiModelProperty("辅助工时")
    private BigDecimal subsidiaryHour;
    @ApiModelProperty("总工时")
    private BigDecimal totalHour;
    @ApiModelProperty("人员id")
    private Integer userId;
    @ApiModelProperty("姓名")
    private String userName;
    @ApiModelProperty("月份")
    private String month;
}
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryCorrectionHoursDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.performance.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import com.ruoyi.performance.pojo.AuxiliaryCorrectionHours;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class AuxiliaryCorrectionHoursDto extends AuxiliaryCorrectionHours {
    @ApiModelProperty("姓名")
    @ExcelProperty(value = "姓名")
    private String name;
    @ApiModelProperty("部门")
    private String departLims;
    @ApiModelProperty("总工时")
    private BigDecimal total;
}
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryOriginalHoursDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,251 @@
package com.ruoyi.performance.dto;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.ruoyi.performance.pojo.AuxiliaryCorrectionHours;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
//原始工时
public class AuxiliaryOriginalHoursDto {
    @ApiModelProperty("姓名")
    @ExcelProperty(value = "姓名")
    private String name;
    //修正工时
    private AuxiliaryCorrectionHours auxiliaryCorrectionHours;
    @ApiModelProperty("类型")
    @ExcelProperty(value = "类型")
    private String type;
    @ApiModelProperty("1日工时")
    @ExcelProperty(value = "1日")
    private BigDecimal oneHours;
    @ExcelIgnore
    private Integer one;
    @ApiModelProperty("2日工时")
    @ExcelProperty(value = "2日")
    private BigDecimal twoHours;
    @ExcelIgnore
    private Integer  two;
    @ApiModelProperty("3日工时")
    @ExcelProperty(value = "3日")
    private BigDecimal threeHours;
    @ExcelIgnore
    private Integer three;
    @ApiModelProperty("4日工时")
    @ExcelProperty(value = "4日")
    private BigDecimal fourHours;
    @ExcelIgnore
    private Integer four;
    @ApiModelProperty("5日工时")
    @ExcelProperty(value = "5日")
    private BigDecimal fiveHours;
    @ExcelIgnore
    private Integer  five;
    @ApiModelProperty("6日工时")
    @ExcelProperty(value = "6日")
    private BigDecimal sixHours;
    @ExcelIgnore
    private Integer six;
    @ApiModelProperty("7日工时")
    @ExcelProperty(value = "7日")
    private BigDecimal sevenHours;
    @ExcelIgnore
    private Integer seven;
    @ApiModelProperty("8日工时")
    @ExcelProperty(value = "8日")
    private BigDecimal eightHours;
    @ExcelIgnore
    private Integer eight;
    @ApiModelProperty("9日工时")
    @ExcelProperty(value = "9日")
    private BigDecimal nineHours;
    @ExcelIgnore
    private Integer nine;
    @ApiModelProperty("10日工时")
    @ExcelProperty(value = "10日")
    private BigDecimal tenHours;
    @ExcelIgnore
    private Integer ten;
    @ApiModelProperty("11日工时")
    @ExcelProperty(value = "11日")
    private BigDecimal elevenHours;
    @ExcelIgnore
    private Integer eleven;
    @ApiModelProperty("12日工时")
    @ExcelProperty(value = "12日")
    private BigDecimal twelveHours;
    @ExcelIgnore
    private Integer twelve;
    @ApiModelProperty("13日工时")
    @ExcelProperty(value = "13日")
    private BigDecimal thirteenHours;
    @ExcelIgnore
    private Integer thirteen;
    @ApiModelProperty("14日工时")
    @ExcelProperty(value = "14日")
    private BigDecimal fourteenHours;
    @ExcelIgnore
    private Integer fourteen;
    @ApiModelProperty("15日工时")
    @ExcelProperty(value = "15日")
    private BigDecimal fifteenHours;
    @ExcelIgnore
    private Integer fifteen;
    @ApiModelProperty("16日工时")
    @ExcelProperty(value = "16日")
    private BigDecimal sixteenHours;
    @ExcelIgnore
    private Integer sixteen;
    @ApiModelProperty("17日工时")
    @ExcelProperty(value = "17日")
    private BigDecimal seventeenHours;
    @ExcelIgnore
    private Integer seventeen;
    @ApiModelProperty("18日工时")
    @ExcelProperty(value = "18日")
    private BigDecimal eighteenHours;
    @ExcelIgnore
    private Integer eighteen;
    @ApiModelProperty("19日工时")
    @ExcelProperty(value = "19日")
    private BigDecimal nineteenHours;
    @ExcelIgnore
    private Integer nineteen;
    @ApiModelProperty("20日工时")
    @ExcelProperty(value = "20日")
    private BigDecimal twentyHours;
    @ExcelIgnore
    private Integer twenty;
    @ApiModelProperty("21日工时")
    @ExcelProperty(value = "21日")
    private BigDecimal twentyOneHours;
    @ExcelIgnore
    private Integer twentyOne;
    @ApiModelProperty("22日工时")
    @ExcelProperty(value = "22日")
    private BigDecimal twentyTwoHours;
    @ExcelIgnore
    private Integer twentyTwo;
    @ApiModelProperty("23日工时")
    @ExcelProperty(value = "23日")
    private BigDecimal twentyThreeHours;
    @ExcelIgnore
    private Integer twentyThree;
    @ApiModelProperty("24日工时")
    @ExcelProperty(value = "24日")
    private BigDecimal twentyFourHours;
    @ExcelIgnore
    private Integer twentyFour;
    @ApiModelProperty("25日工时")
    @ExcelProperty(value = "25日")
    private BigDecimal twentyFiveHours;
    @ExcelIgnore
    private Integer twentyFive;
    @ApiModelProperty("26日工时")
    @ExcelProperty(value = "26日")
    private BigDecimal twentySixHours;
    @ExcelIgnore
    private Integer twentySix;
    @ApiModelProperty("27日工时")
    @ExcelProperty(value = "27日")
    private BigDecimal twentySevenHours;
    @ExcelIgnore
    private Integer twentySeven;
    @ApiModelProperty("28日工时")
    @ExcelProperty(value = "28日")
    private BigDecimal twentyEightHours;
    @ExcelIgnore
    private Integer  twentyEight;
    @ApiModelProperty("29日工时")
    @ExcelProperty(value = "29日")
    private BigDecimal twentyNineHours;
    @ExcelIgnore
    private Integer  twentyNine;
    @ApiModelProperty("30日工时")
    @ExcelProperty(value = "30日")
    private BigDecimal thirtyHours;
    @ExcelIgnore
    private Integer thirty;
    @ApiModelProperty("31日工时")
    @ExcelProperty(value = "31日")
    private BigDecimal thirtyOneHours;
    @ExcelIgnore
    private Integer thirtyOne;
    @ApiModelProperty("总工时")
    @ExcelProperty(value = "总工时")
    private BigDecimal total;
    @ApiModelProperty("月份")
    @ExcelProperty(value = "月份")
    private String month;
}
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryOriginalHoursLookDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.performance.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
//原始工时统计的查询条件
public class AuxiliaryOriginalHoursLookDto {
    @NotNull
    private String month;//月份
    private String name;
    private String departLims;
    @ApiModelProperty("开始时间")
    private String beginDate;
    @ApiModelProperty("结束时间")
    private String endDate;
}
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryOutputWorkingHoursDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.performance.dto;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ExcelIgnoreUnannotated
public class AuxiliaryOutputWorkingHoursDto extends AuxiliaryOutputWorkingHours {
    @ApiModelProperty("检测人")
    @ExcelProperty(index = 1, value = "检测人")
    private String name;
    @ApiModelProperty("电缆标识")
    private String cableTag;
}
performance-server/src/main/java/com/ruoyi/performance/dto/AuxiliaryWorkingHoursDayDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.performance.dto;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.ruoyi.performance.pojo.AuxiliaryWorkingHoursDay;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ExcelIgnoreUnannotated
public class AuxiliaryWorkingHoursDayDto extends AuxiliaryWorkingHoursDay {
    @ApiModelProperty("姓名")
    @ExcelProperty(index = 1, value = "姓名")
    private String name;
}
performance-server/src/main/java/com/ruoyi/performance/dto/HoursDay.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.performance.dto;
import com.ruoyi.performance.pojo.AuxiliaryWorkingHoursDay;
import lombok.Data;
import java.util.List;
@Data
public class HoursDay {
    // æ“ä½œ, 1通过, 2退回
    private String operation;
    private List<AuxiliaryWorkingHoursDay> auxiliaryWorkingHoursDays;
}
performance-server/src/main/java/com/ruoyi/performance/dto/PerformanceShiftAddDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.performance.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
@Data
public class PerformanceShiftAddDto {
    @NotNull(message = "请选择班次")
    @ApiModelProperty("班次")
    private String shift;
    @NotNull(message = "请选择员工")
    @ApiModelProperty("员工id")
    private String userId;
    @NotNull(message = "请选择周次")
    @ApiModelProperty("开始周次")
    private LocalDateTime startWeek;
    @NotNull(message = "请选择周次")
    @ApiModelProperty("结束周次")
    private LocalDateTime endWeek;
}
performance-server/src/main/java/com/ruoyi/performance/dto/PerformanceShiftMapDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.performance.dto;
import lombok.Data;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Data
public class PerformanceShiftMapDto {
    private String name;
    private String shiftTime;
    private String userId;
    private String department;
    private Map<String, Object> monthlyAttendance = new HashMap<>();
    private Map<String, Object> sidebarAnnualAttendance = new HashMap<>();;
    private List<Map<String, Object>> list = new ArrayList<>();
    private List<Map<Object, Object>> headerList = new ArrayList<>();
}
performance-server/src/main/java/com/ruoyi/performance/excel/AuxiliaryCorrectionHoursListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.performance.excel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.ruoyi.performance.dto.AuxiliaryCorrectionHoursDto;
import com.ruoyi.performance.service.AuxiliaryCorrectionHoursService;
import java.util.ArrayList;
import java.util.List;
public class AuxiliaryCorrectionHoursListener extends AnalysisEventListener<AuxiliaryCorrectionHoursDto> {
    private static final int BATCH_COUNT = 1000;
    List<AuxiliaryCorrectionHoursDto> list = new ArrayList<>();
    private AuxiliaryCorrectionHoursService auxiliaryCorrectionHoursService;
    public AuxiliaryCorrectionHoursListener(AuxiliaryCorrectionHoursService auxiliaryCorrectionHoursService) {
        this.auxiliaryCorrectionHoursService = auxiliaryCorrectionHoursService;
    }
    @Override
    public void invoke(AuxiliaryCorrectionHoursDto data, AnalysisContext analysisContext) {
        list.add(data);
        if (list.size() >= BATCH_COUNT) {
            save();
            list.clear();
        }
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        save();
    }
    private void save() {
        auxiliaryCorrectionHoursService.importExcel(list);
    }
}
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryCorrectionHoursMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.performance.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.performance.dto.AuxiliaryCorrectionHoursDto;
import com.ruoyi.performance.pojo.AuxiliaryCorrectionHours;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
 * å·¥æ—¶ç»Ÿè®¡çš„修正工时 Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-29 02:38:19
 */
public interface AuxiliaryCorrectionHoursMapper extends BaseMapper<AuxiliaryCorrectionHours> {
    IPage<AuxiliaryCorrectionHoursDto> selectAuxiliaryCorrectionHours(Page page, @Param("ew") QueryWrapper<AuxiliaryCorrectionHoursDto> ew, @Param("ids") List<Long> ids);
    List<Integer> selDepartLimsByName(String departLims);
}
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryOriginalHoursMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.performance.mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface AuxiliaryOriginalHoursMapper {
    //查询该月的总工时
    List<Map<String, Object>> totalHours(@Param("month") String month, @Param("ids") List<Integer> ids);
}
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryOutputWorkingHoursMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ruoyi.performance.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.performance.dto.AuxiliaryAllDto;
import com.ruoyi.performance.dto.AuxiliaryOriginalHoursLookDto;
import com.ruoyi.performance.dto.AuxiliaryOutputWorkingHoursDto;
import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
 * <p>
 * æ—¥å·¥æ—¶ç®¡ç†çš„产量工时 Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-28 03:48:48
 */
public interface AuxiliaryOutputWorkingHoursMapper extends BaseMapper<AuxiliaryOutputWorkingHours> {
    IPage<AuxiliaryOutputWorkingHoursDto> selectAuxiliaryOutputWorkingHours(Page page, @Param("ew") QueryWrapper<AuxiliaryOutputWorkingHoursDto> ew, @Param("ids") List<Long> ids);
    //查询统计工时导出数据
    List<AuxiliaryOutputWorkingHoursDto> selectDataByUser(@Param("ids") List<Long> ids);
    //查询该月的产量工时
    List<Map<String, Object>> totalHours(@Param("month") String month, @Param("ids") List<Long> ids, @Param("type") String type);
    List<AuxiliaryOutputWorkingHours> selectListByIds(@Param("ids") List<Long> ids);
    List<AuxiliaryOutputWorkingHours> selectLists(@Param("ew") QueryWrapper<AuxiliaryOutputWorkingHours> ew, @Param("ids") List<Long> ids);
    /**
     * æŸ¥è¯¢
     * @param dto
     * @return
     */
    List<AuxiliaryAllDto> selectAuxiliaryAllByMonth(@Param("dto") AuxiliaryOriginalHoursLookDto dto, @Param("userIds") List<Long> userIds);
    /**
     * æŸ¥è¯¢è¾…助工时
     * @param dto
     * @param userIds
     * @return
     */
    List<AuxiliaryAllDto> selectSubsidiaryAllByMonth(@Param("dto") AuxiliaryOriginalHoursLookDto dto, @Param("userIds") List<Long> userIds);
    List<AuxiliaryOutputWorkingHoursDto> selectAuxiliaryOutputWorkingHoursList(@Param("ew") QueryWrapper<AuxiliaryOutputWorkingHoursDto> ew, @Param("ids") List<Long> ids);
}
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryWorkingHoursDayMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.performance.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.performance.dto.AuxiliaryWorkingHoursDayDto;
import com.ruoyi.performance.pojo.AuxiliaryWorkingHoursDay;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
 * <p>
 * æ—¥å·¥æ—¶ç®¡ç†çš„辅助工时 Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-28 02:22:19
 */
public interface AuxiliaryWorkingHoursDayMapper extends BaseMapper<AuxiliaryWorkingHoursDay> {
    IPage<AuxiliaryWorkingHoursDayDto> selectAuxiliaryWorkingHoursDay(Page page, @Param("ew") QueryWrapper<AuxiliaryWorkingHoursDayDto> ew, @Param("ids") List<Long> ids);
    //查询辅助工时导出信息
    List<AuxiliaryWorkingHoursDayDto> selectDataByUser(@Param("ids") List<Long> ids);
    List<AuxiliaryWorkingHoursDay> selectListByIds(@Param("ids") List<Long> ids);
    //查询该月的辅助工时
    List<Map<String, Object>> totalHours(@Param("month") String month, @Param("ids") List<Long> ids);
    List<AuxiliaryWorkingHoursDay> selectLists(@Param("ew") QueryWrapper<AuxiliaryWorkingHoursDay> ew, @Param("ids") List<Long> ids);
    /**
     * æŸ¥è¯¢è¾…助工时集合
     * @param ew
     * @param ids
     * @return
     */
    List<AuxiliaryWorkingHoursDayDto> selectAuxiliaryWorkingHoursDayList(@Param("ew") QueryWrapper<AuxiliaryWorkingHoursDayDto> ew, @Param("ids") List<Long> ids);
}
performance-server/src/main/java/com/ruoyi/performance/mapper/AuxiliaryWorkingHoursMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.performance.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.performance.pojo.AuxiliaryWorkingHours;
/**
 * <p>
 * è¾…助工时 Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-09 06:58:31
 */
public interface AuxiliaryWorkingHoursMapper extends BaseMapper<AuxiliaryWorkingHours> {
    IPage<AuxiliaryWorkingHours> selectAuxiliaryWorkingHours(Page page, QueryWrapper<AuxiliaryWorkingHours> ew);
}
performance-server/src/main/java/com/ruoyi/performance/mapper/PerformanceShiftMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.performance.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.mybatis_config.MyBaseMapper;
import com.ruoyi.performance.dto.PerformanceShiftMapDto;
import com.ruoyi.performance.pojo.PerformanceShift;
import org.springframework.data.repository.query.Param;
import java.util.List;
import java.util.Map;
/**
 * <p>
 * ç»©æ•ˆç®¡ç†-班次 Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-08 09:12:04
 */
public interface PerformanceShiftMapper extends MyBaseMapper<PerformanceShift> {
    IPage<PerformanceShiftMapDto> performanceShiftPage(
            Page<Object> page,
            @Param("time") String time,
            @Param("userName") String userName,
            @Param("laboratory") String laboratory
    );
    List<Map<String, Object>> performanceShiftYearPage(@Param("time") String time,
                                                       @Param("userName") String userName,
                                                       @Param("laboratory") String laboratory);
    IPage<Map<String, Object>> performanceShiftYear(Page<Object> page, String time, String userName, String laboratory);
    List<Map<String, Object>> performanceShiftYearList(String time, String userName, String laboratory);
    List<PerformanceShiftMapDto> performanceShiftList(String time, String userName, String laboratory);
    String seldepLimsId(int depLimsId);
}
performance-server/src/main/java/com/ruoyi/performance/mapper/ShiftTimeMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.performance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.performance.pojo.ShiftTime;
/**
 * <p>
 * ç­æ¬¡å¯¹åº”的时间 Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-07-24 11:22:17
 */
public interface ShiftTimeMapper extends BaseMapper<ShiftTime> {
}
performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryCorrectionHours.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,181 @@
package com.ruoyi.performance.pojo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <p>
 * å·¥æ—¶ç»Ÿè®¡çš„修正工时
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-29 02:38:19
 */
@Getter
@Setter
@TableName("auxiliary_correction_hours")
@ApiModel(value = "AuxiliaryCorrectionHours对象", description = "工时统计的修正工时")
public class AuxiliaryCorrectionHours  implements Serializable {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("姓名id")
    private Integer nameUser;
    @ApiModelProperty("类型")
    @ExcelProperty(value = "类型")
    private String type;
    @ApiModelProperty("1")
    @ExcelProperty(value = "1日")
    private BigDecimal oneHours;
    @ApiModelProperty("2")
    @ExcelProperty(value = "2日")
    private BigDecimal twoHours;
    @ApiModelProperty("3")
    @ExcelProperty(value = "3日")
    private BigDecimal threeHours;
    @ApiModelProperty("4")
    @ExcelProperty(value = "4日")
    private BigDecimal fourHours;
    @ApiModelProperty("5")
    @ExcelProperty(value = "5日")
    private BigDecimal fiveHours;
    @ApiModelProperty("6")
    @ExcelProperty(value = "6日")
    private BigDecimal sixHours;
    @ApiModelProperty("7")
    @ExcelProperty(value = "7日")
    private BigDecimal sevenHours;
    @ApiModelProperty("8")
    @ExcelProperty(value = "8日")
    private BigDecimal eightHours;
    @ApiModelProperty("9")
    @ExcelProperty(value = "9日")
    private BigDecimal nineHours;
    @ApiModelProperty("10")
    @ExcelProperty(value = "10日")
    private BigDecimal tenHours;
    @ApiModelProperty("11")
    @ExcelProperty(value = "11日")
    private BigDecimal elevenHours;
    @ApiModelProperty("12")
    @ExcelProperty(value = "12日")
    private BigDecimal twelveHours;
    @ApiModelProperty("13")
    @ExcelProperty(value = "13日")
    private BigDecimal thirteenHours;
    @ApiModelProperty("14")
    @ExcelProperty(value = "14日")
    private BigDecimal fourteenHours;
    @ApiModelProperty("15")
    @ExcelProperty(value = "15日")
    private BigDecimal fifteenHours;
    @ApiModelProperty("16")
    @ExcelProperty(value = "16日")
    private BigDecimal sixteenHours;
    @ApiModelProperty("17")
    @ExcelProperty(value = "17日")
    private BigDecimal seventeenHours;
    @ApiModelProperty("18")
    @ExcelProperty(value = "18日")
    private BigDecimal eighteenHours;
    @ApiModelProperty("19")
    @ExcelProperty(value = "19日")
    private BigDecimal nineteenHours;
    @ApiModelProperty("20")
    @ExcelProperty(value = "20日")
    private BigDecimal twentyHours;
    @ApiModelProperty("21")
    @ExcelProperty(value = "21日")
    private BigDecimal twentyOneHours;
    @ApiModelProperty("22")
    @ExcelProperty(value = "22日")
    private BigDecimal twentyTwoHours;
    @ApiModelProperty("23")
    @ExcelProperty(value = "23日")
    private BigDecimal twentyThreeHours;
    @ApiModelProperty("24")
    @ExcelProperty(value = "24日")
    private BigDecimal twentyFourHours;
    @ApiModelProperty("25")
    @ExcelProperty(value = "25日")
    private BigDecimal twentyFiveHours;
    @ApiModelProperty("26")
    @ExcelProperty(value = "26日")
    private BigDecimal twentySixHours;
    @ApiModelProperty("27")
    @ExcelProperty(value = "27日")
    private BigDecimal twentySevenHours;
    @ApiModelProperty("28")
    @ExcelProperty(value = "28日")
    private BigDecimal twentyEightHours;
    @ApiModelProperty("29")
    @ExcelProperty(value = "29日")
    private BigDecimal twentyNineHours;
    @ApiModelProperty("30")
    @ExcelProperty(value = "30日")
    private BigDecimal thirtyHours;
    @ApiModelProperty("31")
    @ExcelProperty(value = "31日")
    private BigDecimal thirtyOneHours;
    @ApiModelProperty("月份")
    @ExcelProperty(value = "月份")
    private String month;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
}
performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryOutputWorkingHours.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,123 @@
package com.ruoyi.performance.pojo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <p>
 * æ—¥å·¥æ—¶ç®¡ç†çš„产量工时
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-28 03:48:48
 */
@Getter
@Setter
@TableName("auxiliary_output_working_hours")
@ApiModel(value = "AuxiliaryOutputWorkingHours对象", description = "日工时管理的产量工时")
@ExcelIgnoreUnannotated
public class AuxiliaryOutputWorkingHours  implements Serializable {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("检测项分类")
    @ExcelProperty(index = 2, value = "检测项分类")
    private String inspectionItemClass;
    @ApiModelProperty("检测项")
    @ExcelProperty(index = 3, value = "检测项")
    private String inspectionItem;
    @ApiModelProperty("检测子项")
    @ExcelProperty(index = 4, value = "检测子项")
    private String inspectionItemSubclass;
    @ApiModelProperty("样品id")
    private Integer sampleId;
    @ApiModelProperty("样品编号")
    @ExcelProperty(index = 6, value = "样品编号")
    private String sample;
    @ApiModelProperty("加班委托单号")
    private String overtimeOrderNo;
    @ApiModelProperty("加班工时")
    private BigDecimal overtimeWorkTime;
    @ApiModelProperty("加班数量")
    private Integer overtimeAmount;
    @ApiModelProperty("非加班委托单号")
    private Integer orderId;
    @ApiModelProperty("委托单号")
    @ExcelProperty(index = 5, value = "委托单号")
    private String orderNo;
    @ApiModelProperty("工时")
    private BigDecimal workTime;
    @ApiModelProperty("数量")
    private Integer amount;
    @ApiModelProperty("产量工时")
    @ExcelProperty(index = 7, value = "产量工时")
    private BigDecimal outputWorkTime;
    @ApiModelProperty("日期")
    @ExcelProperty(index = 10, value = "日期")
    private String dateTime;
    @ApiModelProperty("周次")
    @ExcelProperty(index = 11, value = "周次")
    private String week;
    @ApiModelProperty("星期")
    @ExcelProperty(index = 12, value = "星期")
    private String weekDay;
    @ApiModelProperty("检测人id")
    @TableField("`check`")
    private Integer check;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty("创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("工时分组")
    @ExcelProperty(index = 8, value = "工时分组")
    private String manHourGroup;
    @ApiModelProperty("单价")
    @ExcelProperty(index = 9, value = "单价")
    private BigDecimal price;
    @ApiModelProperty("检验项id")
    private Integer insProductId;
}
performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryWorkingHours.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.ruoyi.performance.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <p>
 * è¾…助工时
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-09 06:58:31
 */
@Getter
@Setter
@TableName("auxiliary_working_hours")
@ApiModel(value = "AuxiliaryWorkingHours对象", description = "辅助工时")
public class AuxiliaryWorkingHours  implements Serializable {
    @ApiModelProperty("主键ID")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("编号")
    private String number;
    @ApiModelProperty("辅助项目名称")
    private String auxiliaryProject;
    @ApiModelProperty("核准工时")
    private BigDecimal approvedWorkingHour;
    @ApiModelProperty("备注")
    private String remarks;
    @ApiModelProperty("创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("部门")
    private String department;
    @ApiModelProperty("实验室")
    private String laboratory;
    @ApiModelProperty("单位")
    private String unit;
}
performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryWorkingHoursDay.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
package com.ruoyi.performance.pojo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <p>
 * æ—¥å·¥æ—¶ç®¡ç†çš„辅助工时
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-28 02:22:19
 */
@Data
@TableName("auxiliary_working_hours_day")
@ApiModel(value = "AuxiliaryWorkingHoursDay对象", description = "日工时管理的辅助工时")
@ExcelIgnoreUnannotated
public class AuxiliaryWorkingHoursDay  implements Serializable {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("姓名id")
    private Integer nameUser;
    @ApiModelProperty("编号")
    @ExcelProperty(index = 2, value = "编号")
    private String number;
    @ApiModelProperty("辅助项目名称")
    @ExcelProperty(index = 3, value = "辅助项目名称")
    private String auxiliaryProject;
    @ApiModelProperty("核准工时")
    @ExcelProperty(index = 5, value = "核准工时")
    private BigDecimal approvedWorkingHour;
    @ApiModelProperty("数量")
    @ExcelProperty(index = 6, value = "数量")
    private Integer amount;
    @ApiModelProperty("辅助工时")
    @ExcelProperty(index = 7, value = "辅助工时")
    private BigDecimal nonproductiveTime;
    @ApiModelProperty("辅助说明")
    @ExcelProperty(index = 8, value = "辅助说明")
    private String remarks;
    @ApiModelProperty("复核人")
    @ExcelProperty(index = 9, value = "复核人")
    private String reviewer;
    @ApiModelProperty("复核数量")
    @ExcelProperty(index = 10, value = "复核数量")
    private Integer reviewerNumber;
    @ApiModelProperty("复核工时")
    @ExcelProperty(index = 11, value = "复核工时")
    private BigDecimal reviewerNonproductiveTime;
    @ApiModelProperty("复核说明")
    @ExcelProperty(index = 12, value = "复核说明")
    private String reviewerRemark;
    @ApiModelProperty("å¹´")
    @ExcelProperty(index = 13, value = "å¹´")
    private String year;
    @ApiModelProperty("班次")
    @ExcelProperty(index = 14, value = "班次")
    private String shift;
    @ApiModelProperty("周次")
    @ExcelProperty(index = 15, value = "周次")
    private String week;
    @ApiModelProperty("星期")
    @ExcelProperty(index = 16, value = "星期")
    private String weekDay;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("状态")
    @ExcelProperty(index = 4, value = "状态")
    private String state;
    @ApiModelProperty("日期")
    @ExcelProperty(index = 17, value = "日期")
    private String dateTime;
}
performance-server/src/main/java/com/ruoyi/performance/pojo/PerformanceShift.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.ruoyi.performance.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * ç»©æ•ˆç®¡ç†-班次
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-08 09:12:04
 */
@Data
@TableName("performance_shift")
@ApiModel(value = "PerformanceShift对象", description = "绩效管理-班次")
public class PerformanceShift  implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键ID")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("班次")
    private String shift;
    @ApiModelProperty("员工id")
    private Integer userId;
    @ApiModelProperty("排班日期")
    private LocalDateTime workTime;
    @ApiModelProperty("创建人Id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建日期")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("更新人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
performance-server/src/main/java/com/ruoyi/performance/pojo/ShiftTime.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.ruoyi.performance.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * ç­æ¬¡å¯¹åº”的时间
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-07-24 11:22:17
 */
@Getter
@Setter
@TableName("shift_time")
@ApiModel(value = "ShiftTime对象", description = "班次对应的时间")
public class ShiftTime  implements Serializable {
    @ApiModelProperty("主键ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("班次")
    private String shift;
    @ApiModelProperty("开始时间")
    private String startTime;
    @ApiModelProperty("结束时间")
    private String endTime;
    @ApiModelProperty("创建人Id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建日期")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("更新人Id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
performance-server/src/main/java/com/ruoyi/performance/service/AuxiliaryCorrectionHoursService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.performance.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.ruoyi.performance.dto.AuxiliaryCorrectionHoursDto;
import com.ruoyi.performance.pojo.AuxiliaryCorrectionHours;
import java.util.List;
import java.util.Map;
/**
 * <p>
 * å·¥æ—¶ç»Ÿè®¡çš„修正工时 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-29 02:38:19
 */
public interface AuxiliaryCorrectionHoursService extends IService<AuxiliaryCorrectionHours> {
    IPage<AuxiliaryCorrectionHoursDto> selectAuxiliaryCorrectionHours(Page page, AuxiliaryCorrectionHoursDto auxiliaryCorrectionHoursDto);
    /**
     * å¯¼å…¥ä¸Šä¼ 
     * @param list
     */
    void importExcel(List<AuxiliaryCorrectionHoursDto> list);
}
performance-server/src/main/java/com/ruoyi/performance/service/AuxiliaryOriginalHoursService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.performance.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.performance.dto.AuxiliaryAllDto;
import com.ruoyi.performance.dto.AuxiliaryOriginalHoursDto;
import com.ruoyi.performance.dto.AuxiliaryOriginalHoursLookDto;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public interface AuxiliaryOriginalHoursService {
    IPage<AuxiliaryOriginalHoursDto> selectAuxiliaryOriginalHours(Page page, AuxiliaryOriginalHoursLookDto auxiliaryOriginalHoursLookDto);
    /**
     * å¯¼å‡ºåŽŸå§‹å·¥æ—¶
     *
     * @param response
     */
    void exportWorkingHours(String month, String name, String departLims,HttpServletResponse response) throws IOException;
    /**
     * æŸ¥è¯¢æœˆä»½å…¨éƒ¨å·¥æ—¶
     * @return
     */
    List<AuxiliaryAllDto> selectAuxiliaryAllByMonth(AuxiliaryOriginalHoursLookDto dto);
}
performance-server/src/main/java/com/ruoyi/performance/service/AuxiliaryOutputWorkingHoursService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.ruoyi.performance.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.ruoyi.performance.dto.AuxiliaryOutputWorkingHoursDto;
import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
/**
 * <p>
 * æ—¥å·¥æ—¶ç®¡ç†çš„产量工时 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-28 03:48:48
 */
public interface AuxiliaryOutputWorkingHoursService extends IService<AuxiliaryOutputWorkingHours> {
    IPage<AuxiliaryOutputWorkingHoursDto> selectAuxiliaryOutputWorkingHours(Page page, AuxiliaryOutputWorkingHoursDto auxiliaryOutputWorkingHoursDto);
    /**
     * ç»Ÿè®¡äº§é‡å·¥æ—¶æ±‡æ€»å’Œè¾…助工时汇总
     * @return
     */
    Map<String,Object> collectWorkingHours(AuxiliaryOutputWorkingHoursDto auxiliaryOutputWorkingHoursDto);
    /**
     * å¯¼å‡º
     * @param response
     * @throws IOException
     */
    void exportWorkingHours(HttpServletResponse response)throws IOException;
    /**
     * å¯¼å‡ºäº§é‡å·¥æ—¶
     * @param entity
     * @param response
     */
    void exportOutputHours(AuxiliaryOutputWorkingHoursDto entity, HttpServletResponse response);
}
performance-server/src/main/java/com/ruoyi/performance/service/AuxiliaryWorkingHoursDayService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.ruoyi.performance.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.ruoyi.performance.dto.AuxiliaryWorkingHoursDayDto;
import com.ruoyi.performance.dto.HoursDay;
import com.ruoyi.performance.pojo.AuxiliaryWorkingHoursDay;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.Map;
/**
 * <p>
 * æ—¥å·¥æ—¶ç®¡ç†çš„辅助工时 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-28 02:22:19
 */
public interface AuxiliaryWorkingHoursDayService extends IService<AuxiliaryWorkingHoursDay> {
    IPage<AuxiliaryWorkingHoursDayDto> selectAuxiliaryWorkingHoursDay(Page page, AuxiliaryWorkingHoursDayDto auxiliaryWorkingHoursDayDto);
    int insertAuxiliaryWorkingHoursDay(AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay);
    AuxiliaryWorkingHoursDay selectAuxiliaryWorkingHoursByNumber(String number);
    boolean checkOrApprove(HoursDay hoursDay);
    int updateAuxiliaryWorkingHoursDay(AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay);
    int deleteAuxiliaryWorkingHoursDay(Integer id);
    String selectshiftByUser(LocalDateTime dateTime);
    /**
     * å¯¼å‡ºè¾…助工时
     * @param entity
     * @param response
     */
    void exportWorkingHours(AuxiliaryWorkingHoursDayDto entity, HttpServletResponse response);
}
performance-server/src/main/java/com/ruoyi/performance/service/AuxiliaryWorkingHoursService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.performance.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.ruoyi.performance.pojo.AuxiliaryWorkingHours;
import java.util.Map;
/**
 * <p>
 * è¾…助工时 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-09 06:58:31
 */
public interface AuxiliaryWorkingHoursService extends IService<AuxiliaryWorkingHours> {
    IPage<AuxiliaryWorkingHours> selectAuxiliaryWorkingHours(Page page, AuxiliaryWorkingHours auxiliaryWorkingHours);
    int deleteAuxiliaryWorkingHours(Integer id);
    int upAuxiliaryWorkingHours(AuxiliaryWorkingHours auxiliaryWorkingHours);
    int insertAuxiliaryWorkingHours(AuxiliaryWorkingHours auxiliaryWorkingHours);
}
performance-server/src/main/java/com/ruoyi/performance/service/PerformanceShiftService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.performance.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.ruoyi.performance.dto.PerformanceShiftAddDto;
import com.ruoyi.performance.pojo.PerformanceShift;
import java.util.Map;
/**
 * <p>
 * ç»©æ•ˆç®¡ç†-班次 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-08 09:12:04
 */
public interface PerformanceShiftService extends IService<PerformanceShift> {
    void performanceShiftAdd(PerformanceShiftAddDto performanceShiftAddDto);
    Map<String, Object> performanceShiftPage(Page<Object> page, String time, String userName, String laboratory);
    void performanceShiftUpdate(PerformanceShift performanceShift);
    IPage<Map<String, Object>> performanceShiftPageYear(Page<Object> page, String time, String userName, String laboratory);
    Map<Object, Object> exportToYearExcel(String time, String userName, String laboratory) throws Exception;
    Map<Object, Object> exportToMonthExcel(String time, String userName, String laboratory);
}
performance-server/src/main/java/com/ruoyi/performance/service/ShiftTimeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.performance.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.performance.pojo.ShiftTime;
import java.util.List;
/**
 * <p>
 * ç­æ¬¡å¯¹åº”的时间 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-07-24 11:22:17
 */
public interface ShiftTimeService extends IService<ShiftTime> {
    void shiftTimeAdd(ShiftTime shiftTime);
    List<ShiftTime> shiftTimeList();
}
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryCorrectionHoursServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
package com.ruoyi.performance.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
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.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.performance.dto.AuxiliaryCorrectionHoursDto;
import com.ruoyi.performance.mapper.AuxiliaryCorrectionHoursMapper;
import com.ruoyi.performance.pojo.AuxiliaryCorrectionHours;
import com.ruoyi.performance.service.AuxiliaryCorrectionHoursService;
import com.ruoyi.system.mapper.UserMapper;
import org.apache.commons.math3.analysis.function.Power;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
 * <p>
 * å·¥æ—¶ç»Ÿè®¡çš„修正工时 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-29 02:38:19
 */
@Service
public class AuxiliaryCorrectionHoursServiceImpl extends ServiceImpl<AuxiliaryCorrectionHoursMapper, AuxiliaryCorrectionHours> implements AuxiliaryCorrectionHoursService {
    @Resource
    AuxiliaryCorrectionHoursMapper auxiliaryCorrectionHoursMapper;
    @Resource
    UserMapper userMapper;
    @Override
    public IPage<AuxiliaryCorrectionHoursDto> selectAuxiliaryCorrectionHours(Page page, AuxiliaryCorrectionHoursDto auxiliaryCorrectionHoursDto) {
        List<Long> ids = new ArrayList<>();
        String departLims = auxiliaryCorrectionHoursDto.getDepartLims();
        auxiliaryCorrectionHoursDto.setDepartLims(null);
        if (ObjectUtils.isNotEmpty(departLims)) {
            //先模糊查询出来id
            List<Integer> ides = auxiliaryCorrectionHoursMapper.selDepartLimsByName(departLims);
            for (Integer ide : ides) {
                List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery()
                        .like(User::getDepartLimsId, ide));
                if (ObjectUtils.isNotEmpty(users)) {
                    ids.clear();
                    ids.addAll(users.stream().map(User::getId).distinct().collect(Collectors.toList()));
                }
            }
        }
        if (ids.size() == 0) {
            ids = null;
        }
        return auxiliaryCorrectionHoursMapper.selectAuxiliaryCorrectionHours(page, QueryWrappers.queryWrappers(auxiliaryCorrectionHoursDto).eq("month", auxiliaryCorrectionHoursDto.getMonth()), ids);
    }
    //导入上传
    @Override
    public void importExcel(List<AuxiliaryCorrectionHoursDto> list) {
        if (CollectionUtil.isEmpty(list)) {
            return;
        }
        List<AuxiliaryCorrectionHours> auxiliaryCorrectionHoursList = new ArrayList<>();
        List<AuxiliaryCorrectionHours> auxiliaryCorrectionHoursList1 = new ArrayList<>();
        for (AuxiliaryCorrectionHoursDto auxiliaryCorrectionHoursDto : list) {
            AuxiliaryCorrectionHours auxiliaryCorrectionHours = new AuxiliaryCorrectionHours();
            User user = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getName, auxiliaryCorrectionHoursDto.getName()));
            if (ObjectUtils.isEmpty(user)) {
                throw new RuntimeException("系统没有查到" + auxiliaryCorrectionHoursDto.getName() + "这个用户信息!");
            }
            String regex = "\\d{4}-\\d{2}";
            if (!Pattern.matches(regex, auxiliaryCorrectionHoursDto.getMonth())) {
                throw new RuntimeException(auxiliaryCorrectionHoursDto.getMonth() + "格式不正确,月份格式应为yyyy-MM");
            }
            BeanUtils.copyProperties(auxiliaryCorrectionHoursDto, auxiliaryCorrectionHours);
            auxiliaryCorrectionHours.setNameUser(user.getId().intValue());
            AuxiliaryCorrectionHours auxiliaryCorrectionHours1 = auxiliaryCorrectionHoursMapper.selectOne(Wrappers.<AuxiliaryCorrectionHours>lambdaQuery()
                    .eq(AuxiliaryCorrectionHours::getNameUser, user.getId())
                    .eq(AuxiliaryCorrectionHours::getType, auxiliaryCorrectionHours.getType())
                    .eq(AuxiliaryCorrectionHours::getMonth, auxiliaryCorrectionHours.getMonth()));
            if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours1)) {
                auxiliaryCorrectionHoursList1.add(auxiliaryCorrectionHours);
            } else {
                auxiliaryCorrectionHoursList.add(auxiliaryCorrectionHours);
            }
        }
        //批量新增
        saveBatch(auxiliaryCorrectionHoursList);
        //批量修改
        updateBatchById(auxiliaryCorrectionHoursList1);
    }
}
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOriginalHoursServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,635 @@
package com.ruoyi.performance.service.impl;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.performance.dto.AuxiliaryAllDto;
import com.ruoyi.performance.dto.AuxiliaryCorrectionHoursDto;
import com.ruoyi.performance.dto.AuxiliaryOriginalHoursDto;
import com.ruoyi.performance.dto.AuxiliaryOriginalHoursLookDto;
import com.ruoyi.performance.mapper.AuxiliaryCorrectionHoursMapper;
import com.ruoyi.performance.mapper.AuxiliaryOriginalHoursMapper;
import com.ruoyi.performance.mapper.AuxiliaryOutputWorkingHoursMapper;
import com.ruoyi.performance.mapper.AuxiliaryWorkingHoursDayMapper;
import com.ruoyi.performance.pojo.AuxiliaryCorrectionHours;
import com.ruoyi.performance.service.AuxiliaryOriginalHoursService;
import com.ruoyi.system.mapper.UserMapper;
import org.apache.commons.math3.analysis.function.Power;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class AuxiliaryOriginalHoursServiceImpl implements AuxiliaryOriginalHoursService {
    @Resource
    UserMapper userMapper;
    @Resource
    AuxiliaryOriginalHoursMapper auxiliaryOriginalHoursMapper;
    @Resource
    AuxiliaryOutputWorkingHoursMapper auxiliaryOutputWorkingHoursMapper;
    @Resource
    AuxiliaryWorkingHoursDayMapper auxiliaryWorkingHoursDayMapper;
    @Resource
    AuxiliaryCorrectionHoursMapper auxiliaryCorrectionHoursMapper;
    @Override
    public IPage<AuxiliaryOriginalHoursDto> selectAuxiliaryOriginalHours(Page page, AuxiliaryOriginalHoursLookDto auxiliaryOriginalHoursLookDto) {
        List<Long> ids = new ArrayList<>();
        String departLims = auxiliaryOriginalHoursLookDto.getDepartLims();
        auxiliaryOriginalHoursLookDto.setDepartLims(null);
        String name = auxiliaryOriginalHoursLookDto.getName();
        auxiliaryOriginalHoursLookDto.setName(null);
        if (ObjectUtils.isNotEmpty(departLims)) {
            //先模糊查询出来id
            List<Integer> ides = auxiliaryCorrectionHoursMapper.selDepartLimsByName(departLims);
            for (Integer ide : ides) {
                List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery()
                        .like(User::getDepartLimsId, ide));
                if (ObjectUtils.isNotEmpty(users)) {
                    ides.clear();
                    ids.addAll(users.stream().map(User::getId).distinct().collect(Collectors.toList()));
                }
            }
        }
        if (ObjectUtils.isNotEmpty(name)) {
            ids.clear();
            ids.add(userMapper.selectOne(Wrappers.<User>lambdaQuery().like(User::getName, name)).getId());
        }
        if (ids.size() == 0) {
            ids = null;
        }
        IPage<AuxiliaryOriginalHoursDto> originalHoursDtoIPage = new Page<>();
        originalHoursDtoIPage.setSize(page.getSize());
        originalHoursDtoIPage.setCurrent(page.getCurrent());
        List<AuxiliaryOriginalHoursDto> auxiliaryOriginalHoursDtos = new ArrayList<>();
        Map<String, AuxiliaryOriginalHoursDto> data1 = new HashMap<>();
        Map<String, AuxiliaryOriginalHoursDto> data2 = new HashMap<>();
        Map<String, AuxiliaryOriginalHoursDto> data3 = new HashMap<>();
        //产量工时
        List<Map<String, Object>> maps = auxiliaryOutputWorkingHoursMapper.totalHours(auxiliaryOriginalHoursLookDto.getMonth(), ids, "产量工时");
        if (ObjectUtils.isNotEmpty(maps)) {
            data1 = getData(maps, "产量工时");
            auxiliaryOriginalHoursDtos.addAll(data1.values());
        }
        //辅助工时
        List<Map<String, Object>> maps1 = auxiliaryWorkingHoursDayMapper.totalHours(auxiliaryOriginalHoursLookDto.getMonth(), ids);
        if (ObjectUtils.isNotEmpty(maps1)) {
            data2 = getData(maps1, "辅助工时");
            auxiliaryOriginalHoursDtos.addAll(data2.values());
        }
        //加班工时
        List<Map<String, Object>> maps2 = auxiliaryOutputWorkingHoursMapper.totalHours(auxiliaryOriginalHoursLookDto.getMonth(), ids, "加班工时");
        if (ObjectUtils.isNotEmpty(maps2)) {
            data3 = getData(maps2, "加班工时");
            auxiliaryOriginalHoursDtos.addAll(data3.values());
        }
        //总工时=产量工时+辅助工时+加班工时
        Map<String, AuxiliaryOriginalHoursDto> data4 = new HashMap<String, AuxiliaryOriginalHoursDto>();
        if (data1.size() > 0) {
            Map<String, AuxiliaryOriginalHoursDto> data5 = data1;
            if (data2.size() > 0) {
                merge(data5, data4, data2);
            }
            if (data3.size() > 0) {
//                merge(data5,data4,data3);
            }
            if (data2.size() == 0 && data3.size() == 0) {
                for (Map.Entry<String, AuxiliaryOriginalHoursDto> entry : data5.entrySet()) {
                    AuxiliaryOriginalHoursDto dto = entry.getValue();
                    AuxiliaryOriginalHoursDto originalHoursDto = new AuxiliaryOriginalHoursDto();
                    BeanUtils.copyProperties(dto, originalHoursDto);
                    originalHoursDto.setType("总工时");
                    data4.put(entry.getKey(), originalHoursDto);
                }
            }
            auxiliaryOriginalHoursDtos.addAll(data4.values());
        }
        auxiliaryOriginalHoursDtos = auxiliaryOriginalHoursDtos.stream().sorted(Comparator.comparing(AuxiliaryOriginalHoursDto::getName)).collect(Collectors.toList());
        // æ£€æŸ¥æ¯ä¸ªäººçš„工时类型,补全缺少的工时
        Map<String, Set<String>> workHoursMap = new HashMap<>();
        String[] requiredHours = {"产量工时", "辅助工时", "加班工时", "总工时"};
        for (AuxiliaryOriginalHoursDto dto : auxiliaryOriginalHoursDtos) {
            workHoursMap.computeIfAbsent(dto.getName(), k -> new HashSet<>()).add(dto.getType());
        }
        List<AuxiliaryOriginalHoursDto> result = auxiliaryOriginalHoursDtos;
        for (String name1 : workHoursMap.keySet()) {
            Set<String> workTypes = workHoursMap.get(name1);
            for (String requiredHour : requiredHours) {
                if (!workTypes.contains(requiredHour)) {
                    AuxiliaryOriginalHoursDto auxiliaryOriginalHoursDto = new AuxiliaryOriginalHoursDto();
                    auxiliaryOriginalHoursDto.setName(name1);
                    auxiliaryOriginalHoursDto.setAuxiliaryCorrectionHours(null);
                    auxiliaryOriginalHoursDto.setType(requiredHour);
                    auxiliaryOriginalHoursDto.setMonth(auxiliaryOriginalHoursLookDto.getMonth());
                    result.add(auxiliaryOriginalHoursDto);
                }
            }
        }
        List<String> order = Arrays.asList("产量工时", "辅助工时", "加班工时", "总工时");
        Comparator<AuxiliaryOriginalHoursDto> comparator = Comparator.comparingInt(dto -> {
            String type = dto.getType();
            return order.indexOf(type) == -1 ? order.size() : order.indexOf(type);
        });
        result = result.stream().sorted(Comparator.comparing(AuxiliaryOriginalHoursDto::getName).thenComparing(comparator)).collect(Collectors.toList());
        originalHoursDtoIPage.setRecords(result);
        originalHoursDtoIPage.setTotal(result.size());
        return originalHoursDtoIPage;
    }
    //导出原始工时
    @Override
    public void exportWorkingHours(String month, String name, String departLims, HttpServletResponse response) throws IOException {
        List<AuxiliaryOriginalHoursDto> auxiliaryOriginalHoursDtos = new ArrayList<AuxiliaryOriginalHoursDto>();
        //查询原始工时(使用分页查询)
        AuxiliaryOriginalHoursLookDto auxiliaryOriginalHoursLookDto = new AuxiliaryOriginalHoursLookDto();
        if (ObjectUtils.isNotEmpty(month)) {
            auxiliaryOriginalHoursLookDto.setMonth(month);
        }
        if (ObjectUtils.isNotEmpty(name)) {
            auxiliaryOriginalHoursLookDto.setName(name);
        }
        if (ObjectUtils.isNotEmpty(departLims)) {
            auxiliaryOriginalHoursLookDto.setDepartLims(departLims);
        }
        IPage<AuxiliaryOriginalHoursDto> body = selectAuxiliaryOriginalHours(new Page(-1, -1), auxiliaryOriginalHoursLookDto);
        auxiliaryOriginalHoursDtos = body.getRecords();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        // è¿™é‡ŒURLEncoder.encode可以防止中文乱码 å½“ç„¶å’Œeasyexcel没有关系
        String fileName = URLEncoder.encode("工时统计导出", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        try {
            // æ–°å»ºExcelWriter
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
            WriteSheet mainSheet = EasyExcel.writerSheet(0, "原始工时导出").head(AuxiliaryOriginalHoursDto.class).build();
            excelWriter.write(auxiliaryOriginalHoursDtos, mainSheet);
            // å…³é—­æµ
            excelWriter.finish();
        } catch (IOException e) {
            throw new RuntimeException("导出失败");
        }
    }
    /**
     * æŸ¥è¯¢æœˆä»½å…¨éƒ¨å·¥æ—¶
     *
     * @return
     */
    @Override
    public List<AuxiliaryAllDto> selectAuxiliaryAllByMonth(AuxiliaryOriginalHoursLookDto dto) {
        if (StringUtils.isBlank(dto.getMonth())) {
            throw new BaseException("缺少月份");
        }
        List<Long> userIds = new ArrayList<>();
        String name = dto.getName();
        if (ObjectUtils.isNotEmpty(name)) {
            userIds.addAll(userMapper.selectList(Wrappers.<User>lambdaQuery().like(User::getName, name)).stream().map(User::getId).collect(Collectors.toList()));
        }
        // è§£æžè¾“入的时间字符串
        LocalDate date = LocalDate.parse(dto.getMonth() + "-01", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        // èŽ·å–å‰ä¸€ä¸ªæœˆçš„26号
        LocalDate previousMonth26th = date.minusMonths(1).withDayOfMonth(26);
        // èŽ·å–å½“å‰æœˆçš„25号
        LocalDate currentMonth25th = date.withDayOfMonth(25);
        // æ ¼å¼åŒ–日期为 yyyy-MM-dd HH:mm:ss
        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String beginDate = previousMonth26th.atStartOfDay().format(outputFormatter);
        String endDate = currentMonth25th.atStartOfDay().format(outputFormatter);
//        dto.setBeginDate(beginDate + " 00:00:00");
//        dto.setEndDate(endDate + " 23:59:59");
        dto.setBeginDate(beginDate);
        dto.setEndDate(endDate);
        // æŸ¥è¯¢äº§é‡å·¥æ—¶
        List<AuxiliaryAllDto> auxiliaryAllDtos = auxiliaryOutputWorkingHoursMapper.selectAuxiliaryAllByMonth(dto, userIds);
        // æŸ¥è¯¢è¾…助工时
        List<AuxiliaryAllDto> auxiliarySubsidiary = auxiliaryOutputWorkingHoursMapper.selectSubsidiaryAllByMonth(dto, userIds);
        //产量工时进行人员分组, æŠŠè¾…助工时添加
        Map<Integer, List<AuxiliaryAllDto>> groupIds = auxiliaryAllDtos.stream().collect(Collectors.groupingBy(AuxiliaryAllDto::getUserId));
        for (AuxiliaryAllDto auxiliaryAllDto : auxiliarySubsidiary) {
            List<AuxiliaryAllDto> allDtos = groupIds.get(auxiliaryAllDto.getUserId());
            // åˆ¤æ–­æ˜¯å¦ä¸ºç©º
            if (CollectionUtils.isNotEmpty(allDtos)) {
                // æ·»åŠ è¾…åŠ©å·¥æ—¶
                allDtos.get(0).setSubsidiaryHour(auxiliaryAllDto.getSubsidiaryHour());
            } else {
                // æ²¡æœ‰æ”¹äººå‘˜æ·»åŠ ä¸€è¡Œ
                auxiliaryAllDtos.add(auxiliaryAllDto);
            }
        }
        for (AuxiliaryAllDto auxiliaryAllDto : auxiliaryAllDtos) {
            BigDecimal total = (auxiliaryAllDto.getYieldHour() != null ? auxiliaryAllDto.getYieldHour() : BigDecimal.ZERO)
                    .add(auxiliaryAllDto.getSubsidiaryHour() != null ? auxiliaryAllDto.getSubsidiaryHour() : BigDecimal.ZERO);
            auxiliaryAllDto.setTotalHour(total);
        }
        return auxiliaryAllDtos;
    }
    private Map<String, AuxiliaryOriginalHoursDto> getData(List<Map<String, Object>> objectMaps, String type) {
        Map<String, AuxiliaryOriginalHoursDto> dtoMap = new HashMap<>();
        for (Map<String, Object> objectMap : objectMaps) {
            String name = objectMap.get("name").toString();
            String month = objectMap.get("month").toString().substring(0, 7);
            AuxiliaryOriginalHoursDto auxiliaryOriginalHoursDto = dtoMap.get(name);
            if (auxiliaryOriginalHoursDto == null) {
                auxiliaryOriginalHoursDto = new AuxiliaryOriginalHoursDto();
                auxiliaryOriginalHoursDto.setName(name);
                auxiliaryOriginalHoursDto.setType(type);
                auxiliaryOriginalHoursDto.setMonth(month);
                // æŸ¥è¯¢è¿™ä¸ªäººè¿™ä¸ªæœˆæ˜¯å¦æœ‰ä¿®æ­£çš„产量工时
                AuxiliaryCorrectionHours auxiliaryCorrectionHours = auxiliaryCorrectionHoursMapper.selectOne(Wrappers.<AuxiliaryCorrectionHours>lambdaQuery()
                        .eq(AuxiliaryCorrectionHours::getNameUser, userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getName, auxiliaryOriginalHoursDto.getName())).getId())
                        .eq(AuxiliaryCorrectionHours::getType, auxiliaryOriginalHoursDto.getType())
                        .eq(AuxiliaryCorrectionHours::getMonth, auxiliaryOriginalHoursDto.getMonth()));
                auxiliaryOriginalHoursDto.setAuxiliaryCorrectionHours(auxiliaryCorrectionHours);
            }
            AuxiliaryCorrectionHours auxiliaryCorrectionHours = auxiliaryOriginalHoursDto.getAuxiliaryCorrectionHours();
            switch (objectMap.get("month").toString().substring(8, 10)) {
                case "01":
                    auxiliaryOriginalHoursDto.setOneHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getOneHours().compareTo(auxiliaryOriginalHoursDto.getOneHours()) != 0) {
                            auxiliaryOriginalHoursDto.setOne(1);
                        }
                    }
                    break;
                case "02":
                    auxiliaryOriginalHoursDto.setTwoHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getTwoHours().compareTo(auxiliaryOriginalHoursDto.getTwoHours()) != 0) {
                            auxiliaryOriginalHoursDto.setTwo(1);
                        }
                    }
                    break;
                case "03":
                    auxiliaryOriginalHoursDto.setThreeHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getThreeHours().compareTo(auxiliaryOriginalHoursDto.getThreeHours()) != 0) {
                            auxiliaryOriginalHoursDto.setThree(1);
                        }
                    }
                    break;
                case "04":
                    auxiliaryOriginalHoursDto.setFourHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getFourHours().compareTo(auxiliaryOriginalHoursDto.getFourHours()) != 0) {
                            auxiliaryOriginalHoursDto.setFour(1);
                        }
                    }
                    break;
                case "05":
                    auxiliaryOriginalHoursDto.setFiveHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getFiveHours().compareTo(auxiliaryOriginalHoursDto.getFiveHours()) != 0) {
                            auxiliaryOriginalHoursDto.setFive(1);
                        }
                    }
                    break;
                case "06":
                    auxiliaryOriginalHoursDto.setSixHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getSixHours().compareTo(auxiliaryOriginalHoursDto.getSixHours()) != 0) {
                            auxiliaryOriginalHoursDto.setSix(1);
                        }
                    }
                    break;
                case "07":
                    auxiliaryOriginalHoursDto.setSevenHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getSevenHours().compareTo(auxiliaryOriginalHoursDto.getSevenHours()) != 0) {
                            auxiliaryOriginalHoursDto.setSeven(1);
                        }
                    }
                    break;
                case "08":
                    auxiliaryOriginalHoursDto.setEightHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getEightHours().compareTo(auxiliaryOriginalHoursDto.getEightHours()) != 0) {
                            auxiliaryOriginalHoursDto.setEight(1);
                        }
                    }
                    break;
                case "09":
                    auxiliaryOriginalHoursDto.setNineHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getNineHours().compareTo(auxiliaryOriginalHoursDto.getNineHours()) != 0) {
                            auxiliaryOriginalHoursDto.setNine(1);
                        }
                    }
                    break;
                case "10":
                    auxiliaryOriginalHoursDto.setTenHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getTenHours().compareTo(auxiliaryOriginalHoursDto.getTenHours()) != 0) {
                            auxiliaryOriginalHoursDto.setTen(1);
                        }
                    }
                    break;
                case "11":
                    auxiliaryOriginalHoursDto.setElevenHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getElevenHours().compareTo(auxiliaryOriginalHoursDto.getElevenHours()) != 0) {
                            auxiliaryOriginalHoursDto.setEleven(1);
                        }
                    }
                    break;
                case "12":
                    auxiliaryOriginalHoursDto.setTwelveHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getTwelveHours().compareTo(auxiliaryOriginalHoursDto.getTwelveHours()) != 0) {
                            auxiliaryOriginalHoursDto.setTwelve(1);
                        }
                    }
                    break;
                case "13":
                    auxiliaryOriginalHoursDto.setThirteenHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getThirteenHours().compareTo(auxiliaryOriginalHoursDto.getThirteenHours()) != 0) {
                            auxiliaryOriginalHoursDto.setThirteen(1);
                        }
                    }
                    break;
                case "14":
                    auxiliaryOriginalHoursDto.setFourteenHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getFourteenHours().compareTo(auxiliaryOriginalHoursDto.getFourteenHours()) != 0) {
                            auxiliaryOriginalHoursDto.setFourteen(1);
                        }
                    }
                    break;
                case "15":
                    auxiliaryOriginalHoursDto.setFifteenHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getFifteenHours().compareTo(auxiliaryOriginalHoursDto.getFifteenHours()) != 0) {
                            auxiliaryOriginalHoursDto.setFifteen(1);
                        }
                    }
                    break;
                case "16":
                    auxiliaryOriginalHoursDto.setSixteenHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getSixteenHours().compareTo(auxiliaryOriginalHoursDto.getSixteenHours()) != 0) {
                            auxiliaryOriginalHoursDto.setSixteen(1);
                        }
                    }
                    break;
                case "17":
                    auxiliaryOriginalHoursDto.setSeventeenHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getSeventeenHours().compareTo(auxiliaryOriginalHoursDto.getSeventeenHours()) != 0) {
                            auxiliaryOriginalHoursDto.setSeventeen(1);
                        }
                    }
                    break;
                case "18":
                    auxiliaryOriginalHoursDto.setEighteenHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getEighteenHours().compareTo(auxiliaryOriginalHoursDto.getEighteenHours()) != 0) {
                            auxiliaryOriginalHoursDto.setEighteen(1);
                        }
                    }
                    break;
                case "19":
                    auxiliaryOriginalHoursDto.setNineteenHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getNineteenHours().compareTo(auxiliaryOriginalHoursDto.getNineteenHours()) != 0) {
                            auxiliaryOriginalHoursDto.setNineteen(1);
                        }
                    }
                    break;
                case "20":
                    auxiliaryOriginalHoursDto.setTwentyHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getTwentyHours().compareTo(auxiliaryOriginalHoursDto.getTwentyHours()) != 0) {
                            auxiliaryOriginalHoursDto.setTwenty(1);
                        }
                    }
                    break;
                case "21":
                    auxiliaryOriginalHoursDto.setTwentyOneHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getTwentyOneHours().compareTo(auxiliaryOriginalHoursDto.getTwentyOneHours()) != 0) {
                            auxiliaryOriginalHoursDto.setTwentyOne(1);
                        }
                    }
                    break;
                case "22":
                    auxiliaryOriginalHoursDto.setTwentyTwoHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getTwentyTwoHours().compareTo(auxiliaryOriginalHoursDto.getTwentyTwoHours()) != 0) {
                            auxiliaryOriginalHoursDto.setTwentyTwo(1);
                        }
                    }
                    break;
                case "23":
                    auxiliaryOriginalHoursDto.setTwentyThreeHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getTwentyThreeHours().compareTo(auxiliaryOriginalHoursDto.getTwentyThreeHours()) != 0) {
                            auxiliaryOriginalHoursDto.setTwentyThree(1);
                        }
                    }
                    break;
                case "24":
                    auxiliaryOriginalHoursDto.setTwentyFourHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getTwentyFourHours().compareTo(auxiliaryOriginalHoursDto.getTwentyFourHours()) != 0) {
                            auxiliaryOriginalHoursDto.setTwentyFour(1);
                        }
                    }
                    break;
                case "25":
                    auxiliaryOriginalHoursDto.setTwentyFiveHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getTwentyFiveHours().compareTo(auxiliaryOriginalHoursDto.getTwentyFiveHours()) != 0) {
                            auxiliaryOriginalHoursDto.setTwentyFive(1);
                        }
                    }
                    break;
                case "26":
                    auxiliaryOriginalHoursDto.setTwentySixHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getTwentySixHours().compareTo(auxiliaryOriginalHoursDto.getTwentySixHours()) != 0) {
                            auxiliaryOriginalHoursDto.setTwentySix(1);
                        }
                    }
                    break;
                case "27":
                    auxiliaryOriginalHoursDto.setTwentySevenHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getTwentySevenHours().compareTo(auxiliaryOriginalHoursDto.getTwentySevenHours()) != 0) {
                            auxiliaryOriginalHoursDto.setTwentySeven(1);
                        }
                    }
                    break;
                case "28":
                    auxiliaryOriginalHoursDto.setTwentyEightHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getTwentyEightHours().compareTo(auxiliaryOriginalHoursDto.getTwentyEightHours()) != 0) {
                            auxiliaryOriginalHoursDto.setTwentyEight(1);
                        }
                    }
                    break;
                case "29":
                    auxiliaryOriginalHoursDto.setTwentyNineHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getTwentyNineHours().compareTo(auxiliaryOriginalHoursDto.getTwentyNineHours()) != 0) {
                            auxiliaryOriginalHoursDto.setTwentyNine(1);
                        }
                    }
                    break;
                case "30":
                    auxiliaryOriginalHoursDto.setThirtyHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getThirtyHours().compareTo(auxiliaryOriginalHoursDto.getThirtyHours()) != 0) {
                            auxiliaryOriginalHoursDto.setThirty(1);
                        }
                    }
                    break;
                case "31":
                    auxiliaryOriginalHoursDto.setThirtyOneHours(new BigDecimal(objectMap.get("manHours").toString()));
                    if (ObjectUtils.isNotEmpty(auxiliaryCorrectionHours)) {
                        if (auxiliaryCorrectionHours.getThirtyOneHours().compareTo(auxiliaryOriginalHoursDto.getThirtyOneHours()) != 0) {
                            auxiliaryOriginalHoursDto.setThirtyOne(1);
                        }
                    }
                    break;
            }
            auxiliaryOriginalHoursDto.setTotal((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getOneHours()) ? auxiliaryOriginalHoursDto.getOneHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getThreeHours()) ? auxiliaryOriginalHoursDto.getThreeHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getFourHours()) ? auxiliaryOriginalHoursDto.getFourHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getFiveHours()) ? auxiliaryOriginalHoursDto.getFiveHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getSixHours()) ? auxiliaryOriginalHoursDto.getSixHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getSevenHours()) ? auxiliaryOriginalHoursDto.getSevenHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getEightHours()) ? auxiliaryOriginalHoursDto.getEightHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getNineHours()) ? auxiliaryOriginalHoursDto.getNineHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTenHours()) ? auxiliaryOriginalHoursDto.getTenHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getElevenHours()) ? auxiliaryOriginalHoursDto.getElevenHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwelveHours()) ? auxiliaryOriginalHoursDto.getTwelveHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getThirteenHours()) ? auxiliaryOriginalHoursDto.getThirteenHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getFourteenHours()) ? auxiliaryOriginalHoursDto.getFourteenHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getFifteenHours()) ? auxiliaryOriginalHoursDto.getFifteenHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getSixteenHours()) ? auxiliaryOriginalHoursDto.getSixteenHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getSeventeenHours()) ? auxiliaryOriginalHoursDto.getSeventeenHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getEighteenHours()) ? auxiliaryOriginalHoursDto.getEighteenHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getNineteenHours()) ? auxiliaryOriginalHoursDto.getNineteenHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyHours()) ? auxiliaryOriginalHoursDto.getTwentyHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyOneHours()) ? auxiliaryOriginalHoursDto.getTwentyOneHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyTwoHours()) ? auxiliaryOriginalHoursDto.getTwentyTwoHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyThreeHours()) ? auxiliaryOriginalHoursDto.getTwentyThreeHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyFourHours()) ? auxiliaryOriginalHoursDto.getTwentyFourHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyFiveHours()) ? auxiliaryOriginalHoursDto.getTwentyFiveHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentySixHours()) ? auxiliaryOriginalHoursDto.getTwentySixHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentySevenHours()) ? auxiliaryOriginalHoursDto.getTwentySevenHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyEightHours()) ? auxiliaryOriginalHoursDto.getTwentyEightHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyNineHours()) ? auxiliaryOriginalHoursDto.getTwentyNineHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getThirtyHours()) ? auxiliaryOriginalHoursDto.getThirtyHours() : BigDecimal.ZERO)
                    .add(ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getThirtyOneHours()) ? auxiliaryOriginalHoursDto.getThirtyOneHours() : BigDecimal.ZERO)
            );
            auxiliaryOriginalHoursDto.setTotal(auxiliaryOriginalHoursDto.getTotal().setScale(4, RoundingMode.HALF_UP));
            dtoMap.put(name, auxiliaryOriginalHoursDto);
        }
        return dtoMap;
    }
    //合并
    private void merge(Map<String, AuxiliaryOriginalHoursDto> data5, Map<String, AuxiliaryOriginalHoursDto> data4, Map<String, AuxiliaryOriginalHoursDto> data2) {
        for (Map.Entry<String, AuxiliaryOriginalHoursDto> entry : data2.entrySet()) {
            String key = entry.getKey();
            AuxiliaryOriginalHoursDto value = entry.getValue();
            if (data5.containsKey(key)) {
                for (Map.Entry<String, AuxiliaryOriginalHoursDto> dtoEntry : data5.entrySet()) {
                    if (dtoEntry.getKey().equals(key)) {
                        AuxiliaryOriginalHoursDto auxiliaryOriginalHoursDto = new AuxiliaryOriginalHoursDto();
                        AuxiliaryOriginalHoursDto hoursDto = data5.get(key);
                        BeanUtils.copyProperties(hoursDto, auxiliaryOriginalHoursDto);
                        auxiliaryOriginalHoursDto.setType("总工时");
                        auxiliaryOriginalHoursDto.setOneHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getOneHours()) ? auxiliaryOriginalHoursDto.getOneHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getOneHours()) ? value.getOneHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setTwoHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwoHours()) ? auxiliaryOriginalHoursDto.getTwoHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getTwoHours()) ? value.getTwoHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setThreeHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getThreeHours()) ? auxiliaryOriginalHoursDto.getThreeHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getThreeHours()) ? value.getThreeHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setFourHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getFourHours()) ? auxiliaryOriginalHoursDto.getFourHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getFourHours()) ? value.getFourHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setFiveHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getFiveHours()) ? auxiliaryOriginalHoursDto.getFiveHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getFiveHours()) ? value.getFiveHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setSixHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getSixHours()) ? auxiliaryOriginalHoursDto.getSixHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getSixHours()) ? value.getSixHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setSevenHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getSevenHours()) ? auxiliaryOriginalHoursDto.getSevenHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getSevenHours()) ? value.getSevenHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setEightHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getEightHours()) ? auxiliaryOriginalHoursDto.getEightHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getEightHours()) ? value.getEightHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setNineHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getNineHours()) ? auxiliaryOriginalHoursDto.getNineHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getNineHours()) ? value.getNineHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setTenHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTenHours()) ? auxiliaryOriginalHoursDto.getTenHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getTenHours()) ? value.getTenHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setElevenHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getElevenHours()) ? auxiliaryOriginalHoursDto.getElevenHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getElevenHours()) ? value.getElevenHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setTwelveHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwelveHours()) ? auxiliaryOriginalHoursDto.getTwelveHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getTwelveHours()) ? value.getTwelveHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setThirteenHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getThirteenHours()) ? auxiliaryOriginalHoursDto.getThirteenHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getThirteenHours()) ? value.getThirteenHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setFourteenHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getFourteenHours()) ? auxiliaryOriginalHoursDto.getFourteenHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getFourteenHours()) ? value.getFourteenHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setFifteenHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getFifteenHours()) ? auxiliaryOriginalHoursDto.getFifteenHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getFifteenHours()) ? value.getFifteenHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setSixteenHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getSixteenHours()) ? auxiliaryOriginalHoursDto.getSixteenHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getSixteenHours()) ? value.getSixteenHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setSeventeenHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getSeventeenHours()) ? auxiliaryOriginalHoursDto.getSeventeenHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getSeventeenHours()) ? value.getSeventeenHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setEighteenHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getEighteenHours()) ? auxiliaryOriginalHoursDto.getEighteenHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getEighteenHours()) ? value.getEighteenHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setNineteenHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getNineteenHours()) ? auxiliaryOriginalHoursDto.getNineteenHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getNineteenHours()) ? value.getNineteenHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setTwelveHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwelveHours()) ? auxiliaryOriginalHoursDto.getTwelveHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getTwelveHours()) ? value.getTwelveHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setTwentyOneHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyOneHours()) ? auxiliaryOriginalHoursDto.getTwentyOneHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getTwentyOneHours()) ? value.getTwentyOneHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setTwentyTwoHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyTwoHours()) ? auxiliaryOriginalHoursDto.getTwentyTwoHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getTwentyTwoHours()) ? value.getTwentyTwoHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setTwentyThreeHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyThreeHours()) ? auxiliaryOriginalHoursDto.getTwentyThreeHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getTwentyThreeHours()) ? value.getTwentyThreeHours() : BigDecimal.ZERO));
                        BigDecimal v = ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyFourHours()) ? auxiliaryOriginalHoursDto.getTwentyFourHours() : BigDecimal.ZERO;
                        BigDecimal v1 = ObjectUtils.isNotEmpty(value.getTwentyFourHours()) ? value.getTwentyFourHours() : BigDecimal.ZERO;
                        BigDecimal v2 = v.add(v1);
                        auxiliaryOriginalHoursDto.setTwentyFourHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyFourHours()) ? auxiliaryOriginalHoursDto.getTwentyFourHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getTwentyFourHours()) ? value.getTwentyFourHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setTwentyFiveHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyFiveHours()) ? auxiliaryOriginalHoursDto.getTwentyFiveHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getTwentyFiveHours()) ? value.getTwentyFiveHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setTwentySixHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentySixHours()) ? auxiliaryOriginalHoursDto.getTwentySixHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getTwentySixHours()) ? value.getTwentySixHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setTwentySevenHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentySevenHours()) ? auxiliaryOriginalHoursDto.getTwentySevenHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getTwentySevenHours()) ? value.getTwentySevenHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setTwentyEightHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyEightHours()) ? auxiliaryOriginalHoursDto.getTwentyEightHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getTwentyEightHours()) ? value.getTwentyEightHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setTwentyNineHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTwentyNineHours()) ? auxiliaryOriginalHoursDto.getTwentyNineHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getTwentyNineHours()) ? value.getTwentyNineHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setThirtyHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getThirtyHours()) ? auxiliaryOriginalHoursDto.getThirtyHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getThirtyHours()) ? value.getThirtyHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setThirtyOneHours((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getThirtyOneHours()) ? auxiliaryOriginalHoursDto.getThirtyOneHours() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getThirtyOneHours()) ? value.getThirtyOneHours() : BigDecimal.ZERO));
                        auxiliaryOriginalHoursDto.setTotal((ObjectUtils.isNotEmpty(auxiliaryOriginalHoursDto.getTotal()) ? auxiliaryOriginalHoursDto.getTotal() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(value.getTotal()) ? value.getTotal() : BigDecimal.ZERO));
                        data4.put(key, auxiliaryOriginalHoursDto);
                    } /*else {
                        AuxiliaryOriginalHoursDto hoursDto = data5.get(dtoEntry.getKey());
                        AuxiliaryOriginalHoursDto dto = new AuxiliaryOriginalHoursDto();
                        BeanUtils.copyProperties(hoursDto, dto);
                        dto.setType("总工时");
                        data4.put(dtoEntry.getKey(), dto);
                    }*/
                }
            } else {
                value.setType("总工时");
                data4.put(key, value);
            }
        }
    }
}
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,260 @@
package com.ruoyi.performance.service.impl;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
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.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.performance.dto.AuxiliaryOutputWorkingHoursDto;
import com.ruoyi.performance.dto.AuxiliaryWorkingHoursDayDto;
import com.ruoyi.performance.mapper.AuxiliaryOutputWorkingHoursMapper;
import com.ruoyi.performance.mapper.AuxiliaryWorkingHoursDayMapper;
import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours;
import com.ruoyi.performance.pojo.AuxiliaryWorkingHoursDay;
import com.ruoyi.performance.service.AuxiliaryOutputWorkingHoursService;
import com.ruoyi.system.mapper.UserMapper;
import org.apache.commons.math3.analysis.function.Power;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * <p>
 * æ—¥å·¥æ—¶ç®¡ç†çš„产量工时 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-28 03:48:48
 */
@Service
public class AuxiliaryOutputWorkingHoursServiceImpl extends ServiceImpl<AuxiliaryOutputWorkingHoursMapper, AuxiliaryOutputWorkingHours> implements AuxiliaryOutputWorkingHoursService {
    @Resource
    AuxiliaryOutputWorkingHoursMapper auxiliaryOutputWorkingHoursMapper;
    @Resource
    AuxiliaryWorkingHoursDayMapper auxiliaryWorkingHoursDayMapper;
    @Resource
    UserMapper userMapper;
    @Override
    public IPage<AuxiliaryOutputWorkingHoursDto> selectAuxiliaryOutputWorkingHours(Page page, AuxiliaryOutputWorkingHoursDto auxiliaryOutputWorkingHoursDto) {
        String dates = auxiliaryOutputWorkingHoursDto.getDateTime();
        String week = auxiliaryOutputWorkingHoursDto.getWeek();
        auxiliaryOutputWorkingHoursDto.setDateTime(null);
        auxiliaryOutputWorkingHoursDto.setWeek(null);
        List<Long> ids = new ArrayList<>();
        if (ids.size() == 0) {
            ids = null;
        }
        if (ObjectUtils.isNotEmpty(dates) && ObjectUtils.isNotEmpty(week)) {
            String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            String[] weeks = week.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            IPage<AuxiliaryOutputWorkingHoursDto> auxiliaryOutputWorkingHoursDtoIPage = auxiliaryOutputWorkingHoursMapper.selectAuxiliaryOutputWorkingHours(page,
                    QueryWrappers.queryWrappers(auxiliaryOutputWorkingHoursDto)
                            .ge("date_time", split[0]).le("date_time", split[1] + " 23:59:59")
                            .ge("week", weeks[0]).le("week", weeks[1]), ids);
            for (AuxiliaryOutputWorkingHoursDto record : auxiliaryOutputWorkingHoursDtoIPage.getRecords()) {
                record.setDateTime(record.getDateTime().substring(0,10));
            }
            return auxiliaryOutputWorkingHoursDtoIPage ;
        } else if (ObjectUtils.isNotEmpty(dates) && ObjectUtils.isEmpty(week)) {
            String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            IPage<AuxiliaryOutputWorkingHoursDto> auxiliaryOutputWorkingHoursDtoIPage = auxiliaryOutputWorkingHoursMapper.selectAuxiliaryOutputWorkingHours(page,
                    QueryWrappers.queryWrappers(auxiliaryOutputWorkingHoursDto)
                            .ge("date_time", split[0]).le("date_time", split[1] + " 23:59:59"), ids);
            for (AuxiliaryOutputWorkingHoursDto record : auxiliaryOutputWorkingHoursDtoIPage.getRecords()) {
                record.setDateTime(record.getDateTime().substring(0,10));
            }
            return auxiliaryOutputWorkingHoursDtoIPage ;
        } else if (ObjectUtils.isEmpty(dates) && ObjectUtils.isNotEmpty(week)) {
            String[] weeks = week.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            IPage<AuxiliaryOutputWorkingHoursDto> auxiliaryOutputWorkingHoursDtoIPage = auxiliaryOutputWorkingHoursMapper.selectAuxiliaryOutputWorkingHours(page,
                    QueryWrappers.queryWrappers(auxiliaryOutputWorkingHoursDto)
                            .ge("week", weeks[0]).le("week", weeks[1]), ids);
            for (AuxiliaryOutputWorkingHoursDto record : auxiliaryOutputWorkingHoursDtoIPage.getRecords()) {
                record.setDateTime(record.getDateTime().substring(0,10));
            }
            return auxiliaryOutputWorkingHoursDtoIPage ;
        } else {
            IPage<AuxiliaryOutputWorkingHoursDto> auxiliaryOutputWorkingHoursDtoIPage = auxiliaryOutputWorkingHoursMapper.selectAuxiliaryOutputWorkingHours(page, QueryWrappers.queryWrappers(auxiliaryOutputWorkingHoursDto), ids);
            for (AuxiliaryOutputWorkingHoursDto record : auxiliaryOutputWorkingHoursDtoIPage.getRecords()) {
                record.setDateTime(record.getDateTime().substring(0,10));
            }
            return auxiliaryOutputWorkingHoursDtoIPage ;
        }
    }
    //统计产量工时汇总和辅助工时汇总
    @Override
    public Map<String, Object> collectWorkingHours(AuxiliaryOutputWorkingHoursDto auxiliaryOutputWorkingHoursDto) {
        AuxiliaryOutputWorkingHours outputWorkingHours = new AuxiliaryOutputWorkingHours();
        AuxiliaryWorkingHoursDay workingHoursDay = new AuxiliaryWorkingHoursDay();
        List<Long> ids = new ArrayList<>();
        if (ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHoursDto.getWeekDay())){
            outputWorkingHours.setWeekDay(auxiliaryOutputWorkingHoursDto.getWeekDay());
            workingHoursDay.setWeekDay(auxiliaryOutputWorkingHoursDto.getWeekDay());
        }
        if (ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHoursDto.getName())){
            List<User> user = userMapper.selectList(Wrappers.<User>lambdaQuery().like(User::getName, auxiliaryOutputWorkingHoursDto.getName()));
            ids.addAll(user.stream().map(User::getId).collect(Collectors.toList()));
        }
        String dates = auxiliaryOutputWorkingHoursDto.getDateTime();
        auxiliaryOutputWorkingHoursDto.setDateTime(null);
        Map<String, Object> map = new HashMap<>();
        BigDecimal sumOutputWorkTime = BigDecimal.ZERO;
        BigDecimal sumApprovedWorkingHour = BigDecimal.ZERO;
        //判断是组长还是组员还是管理员
        List<AuxiliaryOutputWorkingHours> auxiliaryOutputWorkingHours = new ArrayList<>();
        List<AuxiliaryWorkingHoursDay> auxiliaryWorkingHoursDays = new ArrayList<>();
        if (ids.size() == 0) {
            ids=null;
        }
        if (ObjectUtils.isNotEmpty(dates)) {
            String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            //统计当前用户的产品工时
            auxiliaryOutputWorkingHours = auxiliaryOutputWorkingHoursMapper.selectLists(QueryWrappers.queryWrappers(outputWorkingHours)
                    .ge("date_time", split[0])
                    .le("date_time", split[1] + " 23:59:59"),ids);
            //统计当前用户的辅助工时
            auxiliaryWorkingHoursDays = auxiliaryWorkingHoursDayMapper.selectLists(QueryWrappers.queryWrappers(workingHoursDay)
                    .eq("state","已批准")
                    .ge("date_time", split[0])
                    .le("date_time", split[1] + " 23:59:59"),ids);
        }else if (ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHoursDto.getWeekDay())){
            //统计当前用户的产品工时
            auxiliaryOutputWorkingHours = auxiliaryOutputWorkingHoursMapper.selectLists(QueryWrappers.queryWrappers(outputWorkingHours),ids);
            //统计当前用户的辅助工时
            auxiliaryWorkingHoursDays = auxiliaryWorkingHoursDayMapper.selectLists(QueryWrappers.queryWrappers(workingHoursDay).eq("state","已批准"),ids);
        }
        else {
            auxiliaryOutputWorkingHours = auxiliaryOutputWorkingHoursMapper.selectListByIds(ids);
            auxiliaryWorkingHoursDays = auxiliaryWorkingHoursDayMapper.selectListByIds(ids);
        }
        if (ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours)) {
            Map<String, BigDecimal> sumMap = new HashMap<>();
            for (AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHour : auxiliaryOutputWorkingHours) {
                if (!sumMap.containsKey(auxiliaryOutputWorkingHour.getManHourGroup()+auxiliaryOutputWorkingHour.getOrderNo()+auxiliaryOutputWorkingHour.getSample())) {
                    sumMap.put(auxiliaryOutputWorkingHour.getManHourGroup()+auxiliaryOutputWorkingHour.getOrderNo()+auxiliaryOutputWorkingHour.getSample(), auxiliaryOutputWorkingHour.getOutputWorkTime());
                }
            }
            sumOutputWorkTime = sumMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
        }
        map.put("产量工时汇总", sumOutputWorkTime);
        if (ObjectUtils.isNotEmpty(auxiliaryWorkingHoursDays)) {
            for (AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay : auxiliaryWorkingHoursDays) {
                sumApprovedWorkingHour = sumApprovedWorkingHour.add(auxiliaryWorkingHoursDay.getReviewerNonproductiveTime());//复核工时
            }
        }
        map.put("辅助工时汇总", sumApprovedWorkingHour);
        return map;
    }
    //导出
    @Override
    public void exportWorkingHours(HttpServletResponse response) throws IOException {
        List<AuxiliaryOutputWorkingHoursDto> auxiliaryOutputWorkingHoursDtos = new ArrayList<>();
        List<AuxiliaryWorkingHoursDayDto> auxiliaryWorkingHoursDayDtos = new ArrayList<>();
        List<Long> ids = new ArrayList<>();
        //查询辅助工时
        auxiliaryWorkingHoursDayDtos = auxiliaryWorkingHoursDayMapper.selectDataByUser(ids);
        //查询统计工时
        auxiliaryOutputWorkingHoursDtos = auxiliaryOutputWorkingHoursMapper.selectDataByUser(ids);
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        // è¿™é‡ŒURLEncoder.encode可以防止中文乱码 å½“ç„¶å’Œeasyexcel没有关系
        String fileName = URLEncoder.encode("日工时管理导出", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        try {
            // æ–°å»ºExcelWriter
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
            WriteSheet mainSheet = EasyExcel.writerSheet(0, "辅助工时导出").head(AuxiliaryWorkingHoursDayDto.class).build();
            excelWriter.write(auxiliaryWorkingHoursDayDtos, mainSheet);
            WriteSheet mainSheet1 = EasyExcel.writerSheet(1, "产量工时导出").head(AuxiliaryOutputWorkingHoursDto.class).build();
            excelWriter.write(auxiliaryOutputWorkingHoursDtos, mainSheet1);
            // å…³é—­æµ
            excelWriter.finish();
        } catch (IOException e) {
            throw new RuntimeException("导出失败");
        }
    }
    /**
     * å¯¼å‡ºäº§é‡å·¥æ—¶
     * @param response
     */
    @Override
    public void exportOutputHours(AuxiliaryOutputWorkingHoursDto auxiliaryOutputWorkingHoursDto, HttpServletResponse response) {
        //查询导出的费用统计数据
        String dates = auxiliaryOutputWorkingHoursDto.getDateTime();
        String week = auxiliaryOutputWorkingHoursDto.getWeek();
        auxiliaryOutputWorkingHoursDto.setDateTime(null);
        auxiliaryOutputWorkingHoursDto.setWeek(null);
        List<Long> ids = new ArrayList<>();
        String name = auxiliaryOutputWorkingHoursDto.getName();
        if (ObjectUtils.isNotEmpty(name)) {
            ids.addAll(userMapper.selectList(Wrappers.<User>lambdaQuery().like(User::getName, name)).stream().map(User::getId).collect(Collectors.toList()));
        }
        List<AuxiliaryOutputWorkingHoursDto> auxiliaryOutputWorkingHoursDtoIPage = new ArrayList<>();
        if (ObjectUtils.isNotEmpty(dates) && ObjectUtils.isNotEmpty(week)) {
            String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            String[] weeks = week.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            auxiliaryOutputWorkingHoursDtoIPage = auxiliaryOutputWorkingHoursMapper.selectAuxiliaryOutputWorkingHoursList(QueryWrappers.queryWrappers(auxiliaryOutputWorkingHoursDto)
                            .ge("date_time", split[0]).le("date_time", split[1] + " 23:59:59")
                            .ge("week", weeks[0]).le("week", weeks[1]), ids);
        } else if (ObjectUtils.isNotEmpty(dates) && ObjectUtils.isEmpty(week)) {
            String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            auxiliaryOutputWorkingHoursDtoIPage = auxiliaryOutputWorkingHoursMapper.selectAuxiliaryOutputWorkingHoursList(QueryWrappers.queryWrappers(auxiliaryOutputWorkingHoursDto)
                            .ge("date_time", split[0]).le("date_time", split[1] + " 23:59:59"), ids);
        } else if (ObjectUtils.isEmpty(dates) && ObjectUtils.isNotEmpty(week)) {
            String[] weeks = week.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            auxiliaryOutputWorkingHoursDtoIPage = auxiliaryOutputWorkingHoursMapper.selectAuxiliaryOutputWorkingHoursList(QueryWrappers.queryWrappers(auxiliaryOutputWorkingHoursDto)
                            .ge("week", weeks[0]).le("week", weeks[1]), ids);
        } else {
            auxiliaryOutputWorkingHoursDtoIPage = auxiliaryOutputWorkingHoursMapper.selectAuxiliaryOutputWorkingHoursList(QueryWrappers.queryWrappers(auxiliaryOutputWorkingHoursDto), ids);
        }
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("UTF-8");
            // è¿™é‡ŒURLEncoder.encode可以防止中文乱码 å½“ç„¶å’Œeasyexcel没有关系
            String fileName = URLEncoder.encode("产量工时信息导出", "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            //新建ExcelWriter
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
            //获取sheet0对象
            WriteSheet mainSheet = EasyExcel.writerSheet(0, "产量工时信息导出").head(AuxiliaryOutputWorkingHoursDto.class).build();
            //向sheet0写入数据 ä¼ å…¥ç©ºlist这样只导出表头
            excelWriter.write(auxiliaryOutputWorkingHoursDtoIPage, mainSheet);
            //关闭流
            excelWriter.finish();
        } catch (IOException e) {
            throw new RuntimeException("导出失败");
        }
    }
}
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryWorkingHoursDayServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,232 @@
package com.ruoyi.performance.service.impl;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
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.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.performance.dto.AuxiliaryWorkingHoursDayDto;
import com.ruoyi.performance.dto.HoursDay;
import com.ruoyi.performance.mapper.AuxiliaryWorkingHoursDayMapper;
import com.ruoyi.performance.mapper.AuxiliaryWorkingHoursMapper;
import com.ruoyi.performance.mapper.PerformanceShiftMapper;
import com.ruoyi.performance.pojo.AuxiliaryWorkingHours;
import com.ruoyi.performance.pojo.AuxiliaryWorkingHoursDay;
import com.ruoyi.performance.pojo.PerformanceShift;
import com.ruoyi.performance.service.AuxiliaryWorkingHoursDayService;
import com.ruoyi.system.mapper.UserMapper;
import org.apache.commons.math3.analysis.function.Power;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * <p>
 * æ—¥å·¥æ—¶ç®¡ç†çš„辅助工时 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-28 02:22:19
 */
@Service
public class AuxiliaryWorkingHoursDayServiceImpl extends ServiceImpl<AuxiliaryWorkingHoursDayMapper, AuxiliaryWorkingHoursDay> implements AuxiliaryWorkingHoursDayService {
    @Resource
    AuxiliaryWorkingHoursDayMapper auxiliaryWorkingHoursDayMapper;
    @Resource
    AuxiliaryWorkingHoursMapper auxiliaryWorkingHoursMapper;
    @Resource
    UserMapper userMapper;
    @Resource
    PerformanceShiftMapper performanceShiftMapper;
    @Override
    public IPage<AuxiliaryWorkingHoursDayDto> selectAuxiliaryWorkingHoursDay(Page page, AuxiliaryWorkingHoursDayDto auxiliaryWorkingHoursDayDto) {
        String dates = auxiliaryWorkingHoursDayDto.getDateTime();
        String week = auxiliaryWorkingHoursDayDto.getWeek();
        auxiliaryWorkingHoursDayDto.setDateTime(null);
        auxiliaryWorkingHoursDayDto.setWeek(null);
        Map<String, Object> map = new HashMap<>();
        List<Long> ids = new ArrayList<>();
        if (ids.size() == 0) {
            ids = null;
        }
        if (ObjectUtils.isNotEmpty(dates) && ObjectUtils.isNotEmpty(week)) {
            String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            String[] weeks = week.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            IPage<AuxiliaryWorkingHoursDayDto> auxiliaryWorkingHoursDayDtoIPage = auxiliaryWorkingHoursDayMapper.selectAuxiliaryWorkingHoursDay(page,
                    QueryWrappers.queryWrappers(auxiliaryWorkingHoursDayDto)
                            .ge("date_time", split[0]).le("date_time", split[1] + " 23:59:59")
                            .ge("week", weeks[0]).le("week", weeks[1]), ids);
            for (AuxiliaryWorkingHoursDayDto record : auxiliaryWorkingHoursDayDtoIPage.getRecords()) {
                record.setDateTime(record.getDateTime().substring(0, 10));
            }
            return auxiliaryWorkingHoursDayDtoIPage;
        } else if (ObjectUtils.isNotEmpty(dates) && ObjectUtils.isEmpty(week)) {
            String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            IPage<AuxiliaryWorkingHoursDayDto> auxiliaryWorkingHoursDayDtoIPage = auxiliaryWorkingHoursDayMapper.selectAuxiliaryWorkingHoursDay(page,
                    QueryWrappers.queryWrappers(auxiliaryWorkingHoursDayDto)
                            .ge("date_time", split[0]).le("date_time", split[1] + " 23:59:59"), ids);
            for (AuxiliaryWorkingHoursDayDto record : auxiliaryWorkingHoursDayDtoIPage.getRecords()) {
                record.setDateTime(record.getDateTime().substring(0, 10));
            }
            return auxiliaryWorkingHoursDayDtoIPage;
        } else if (ObjectUtils.isEmpty(dates) && ObjectUtils.isNotEmpty(week)) {
            String[] weeks = week.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            IPage<AuxiliaryWorkingHoursDayDto> auxiliaryWorkingHoursDayDtoIPage = auxiliaryWorkingHoursDayMapper.selectAuxiliaryWorkingHoursDay(page,
                    QueryWrappers.queryWrappers(auxiliaryWorkingHoursDayDto)
                            .ge("week", weeks[0]).le("week", weeks[1]), ids);
            for (AuxiliaryWorkingHoursDayDto record : auxiliaryWorkingHoursDayDtoIPage.getRecords()) {
                record.setDateTime(record.getDateTime().substring(0, 10));
            }
            return auxiliaryWorkingHoursDayDtoIPage;
        } else {
            IPage<AuxiliaryWorkingHoursDayDto> auxiliaryWorkingHoursDayDtoIPage = auxiliaryWorkingHoursDayMapper.selectAuxiliaryWorkingHoursDay(page, QueryWrappers.queryWrappers(auxiliaryWorkingHoursDayDto), ids);
            for (AuxiliaryWorkingHoursDayDto record : auxiliaryWorkingHoursDayDtoIPage.getRecords()) {
                record.setDateTime(record.getDateTime().substring(0, 10));
            }
            return auxiliaryWorkingHoursDayDtoIPage;
        }
    }
    //根据编号查询辅助工时配置信息
    @Override
    public AuxiliaryWorkingHoursDay selectAuxiliaryWorkingHoursByNumber(String number) {
        //根据填写的编号查询辅助工时配置
        AuxiliaryWorkingHours auxiliaryWorkingHours = auxiliaryWorkingHoursMapper.selectOne(Wrappers.<AuxiliaryWorkingHours>lambdaQuery().eq(AuxiliaryWorkingHours::getNumber, number));
        if (ObjectUtils.isEmpty(auxiliaryWorkingHours)) {
            throw new BaseException("该编号没有对应的辅助工时配置");
        }
        AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay = new AuxiliaryWorkingHoursDay();
        BeanUtils.copyProperties(auxiliaryWorkingHours, auxiliaryWorkingHoursDay);
        return auxiliaryWorkingHoursDay;
    }
    //录入数据(新增)
    @Override
    public int insertAuxiliaryWorkingHoursDay(AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay) {
        Integer userId = SecurityUtils.getUserId().intValue();
        auxiliaryWorkingHoursDay.setNameUser(userId);//姓名id
        auxiliaryWorkingHoursDay.setState("已提交");
        return auxiliaryWorkingHoursDayMapper.insert(auxiliaryWorkingHoursDay);
    }
    //审核/批准
    @Override
    public boolean checkOrApprove(HoursDay hoursDay) {
        List<AuxiliaryWorkingHoursDay> auxiliaryWorkingHoursDays = hoursDay.getAuxiliaryWorkingHoursDays();
        for (AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay : auxiliaryWorkingHoursDays) {
            Integer userId = SecurityUtils.getUserId().intValue();
            auxiliaryWorkingHoursDay.setReviewer(userMapper.selectById(userId).getName());
            if (auxiliaryWorkingHoursDay.getReviewerNumber() == null) {
                auxiliaryWorkingHoursDay.setReviewerNumber(auxiliaryWorkingHoursDay.getAmount());//复核数量
                auxiliaryWorkingHoursDay.setReviewerNonproductiveTime(auxiliaryWorkingHoursDay.getNonproductiveTime());//复核工时
            }
        }
        return updateBatchById(auxiliaryWorkingHoursDays);
    }
    //编辑
    @Override
    public int updateAuxiliaryWorkingHoursDay(AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay) {
        Integer userId = SecurityUtils.getUserId().intValue();
        auxiliaryWorkingHoursDay.setNameUser(userId);//姓名id
        return auxiliaryWorkingHoursDayMapper.updateById(auxiliaryWorkingHoursDay);
    }
    //删除
    @Override
    public int deleteAuxiliaryWorkingHoursDay(Integer id) {
        return auxiliaryWorkingHoursDayMapper.deleteById(id);
    }
    //根据编号当前用户信息查询所在班次
    @Override
    public String selectshiftByUser(LocalDateTime dateTime) {
        Integer userId = SecurityUtils.getUserId().intValue();
        PerformanceShift performanceShift = performanceShiftMapper.selectOne(Wrappers.<PerformanceShift>lambdaQuery().eq(PerformanceShift::getUserId, userId).eq(PerformanceShift::getWorkTime, dateTime));
        if (ObjectUtils.isEmpty(performanceShift)) {
            return null;
        }
        return performanceShift.getShift();
    }
    /**
     * å¯¼å‡ºè¾…助工时
     * @param
     * @param response
     */
    @Override
    public void exportWorkingHours(AuxiliaryWorkingHoursDayDto auxiliaryWorkingHoursDayDto, HttpServletResponse response) {
        String dates = auxiliaryWorkingHoursDayDto.getDateTime();
        String week = auxiliaryWorkingHoursDayDto.getWeek();
        auxiliaryWorkingHoursDayDto.setDateTime(null);
        auxiliaryWorkingHoursDayDto.setWeek(null);
        List<Long> ids = new ArrayList<>();
        String name = auxiliaryWorkingHoursDayDto.getName();
        if (ObjectUtils.isNotEmpty(name)) {
            ids.addAll(userMapper.selectList(Wrappers.<User>lambdaQuery().like(User::getName, name)).stream().map(User::getId).collect(Collectors.toList()));
        }
        List<AuxiliaryWorkingHoursDayDto> auxiliaryWorkingHoursDayDtoIPage = new ArrayList<>();
        if (ObjectUtils.isNotEmpty(dates) && ObjectUtils.isNotEmpty(week)) {
            String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            String[] weeks = week.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            auxiliaryWorkingHoursDayDtoIPage = auxiliaryWorkingHoursDayMapper.selectAuxiliaryWorkingHoursDayList(QueryWrappers.queryWrappers(auxiliaryWorkingHoursDayDto)
                            .ge("date_time", split[0]).le("date_time", split[1] + " 23:59:59")
                            .ge("week", weeks[0]).le("week", weeks[1]), ids);
        } else if (ObjectUtils.isNotEmpty(dates) && ObjectUtils.isEmpty(week)) {
            String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            auxiliaryWorkingHoursDayDtoIPage = auxiliaryWorkingHoursDayMapper.selectAuxiliaryWorkingHoursDayList(QueryWrappers.queryWrappers(auxiliaryWorkingHoursDayDto)
                            .ge("date_time", split[0]).le("date_time", split[1] + " 23:59:59"), ids);
        } else if (ObjectUtils.isEmpty(dates) && ObjectUtils.isNotEmpty(week)) {
            String[] weeks = week.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
            auxiliaryWorkingHoursDayDtoIPage = auxiliaryWorkingHoursDayMapper.selectAuxiliaryWorkingHoursDayList(QueryWrappers.queryWrappers(auxiliaryWorkingHoursDayDto)
                            .ge("week", weeks[0]).le("week", weeks[1]), ids);
        } else {
            auxiliaryWorkingHoursDayDtoIPage = auxiliaryWorkingHoursDayMapper.selectAuxiliaryWorkingHoursDayList( QueryWrappers.queryWrappers(auxiliaryWorkingHoursDayDto), ids);
        }
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("UTF-8");
            // è¿™é‡ŒURLEncoder.encode可以防止中文乱码 å½“ç„¶å’Œeasyexcel没有关系
            String fileName = URLEncoder.encode("辅助工时信息导出", "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            //新建ExcelWriter
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
            //获取sheet0对象
            WriteSheet mainSheet = EasyExcel.writerSheet(0, "辅助工时信息导出").head(AuxiliaryWorkingHoursDayDto.class).build();
            //向sheet0写入数据 ä¼ å…¥ç©ºlist这样只导出表头
            excelWriter.write(auxiliaryWorkingHoursDayDtoIPage, mainSheet);
            //关闭流
            excelWriter.finish();
        } catch (IOException e) {
            throw new RuntimeException("导出失败");
        }
    }
}
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryWorkingHoursServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ruoyi.performance.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.performance.mapper.AuxiliaryWorkingHoursMapper;
import com.ruoyi.performance.pojo.AuxiliaryWorkingHours;
import com.ruoyi.performance.service.AuxiliaryWorkingHoursService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * <p>
 * è¾…助工时 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-09 06:58:31
 */
@Service
public class AuxiliaryWorkingHoursServiceImpl extends ServiceImpl<AuxiliaryWorkingHoursMapper, AuxiliaryWorkingHours> implements AuxiliaryWorkingHoursService {
    @Resource
    private  AuxiliaryWorkingHoursMapper auxiliaryWorkingHoursMapper;
    @Override
    public IPage<AuxiliaryWorkingHours> selectAuxiliaryWorkingHours(Page page, AuxiliaryWorkingHours auxiliaryWorkingHours) {
        return auxiliaryWorkingHoursMapper.selectAuxiliaryWorkingHours(page, QueryWrappers.queryWrappers(auxiliaryWorkingHours));
    }
    @Override
    public int deleteAuxiliaryWorkingHours(Integer id) {
        return auxiliaryWorkingHoursMapper.deleteById(id);
    }
    @Override
    public int upAuxiliaryWorkingHours(AuxiliaryWorkingHours auxiliaryWorkingHours) {
        return auxiliaryWorkingHoursMapper.updateById(auxiliaryWorkingHours);
    }
    @Override
    public int insertAuxiliaryWorkingHours(AuxiliaryWorkingHours auxiliaryWorkingHours) {
        //编号不能重复
        List<String> strings = auxiliaryWorkingHoursMapper.selectList(null).stream().map(AuxiliaryWorkingHours::getNumber).distinct().collect(Collectors.toList());
        if (strings.contains(auxiliaryWorkingHours.getNumber())){
            throw new RuntimeException("编号不能重复!");
        }
        return auxiliaryWorkingHoursMapper.insert(auxiliaryWorkingHours);
    }
}
performance-server/src/main/java/com/ruoyi/performance/service/impl/PerformanceShiftServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,563 @@
package com.ruoyi.performance.service.impl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
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.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.JackSonUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.performance.dto.PerformanceShiftAddDto;
import com.ruoyi.performance.dto.PerformanceShiftMapDto;
import com.ruoyi.performance.mapper.PerformanceShiftMapper;
import com.ruoyi.performance.pojo.PerformanceShift;
import com.ruoyi.performance.service.PerformanceShiftService;
import com.ruoyi.system.mapper.UserMapper;
import com.ruoyi.system.service.ISysDictTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
/**
 * <p>
 * ç»©æ•ˆç®¡ç†-班次 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-05-08 09:12:04
 */
@Service
public class PerformanceShiftServiceImpl extends ServiceImpl<PerformanceShiftMapper, PerformanceShift> implements PerformanceShiftService {
    @Autowired
    private ISysDictTypeService dictTypeService;
    @Autowired
    UserMapper userMapper;
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void performanceShiftAdd(PerformanceShiftAddDto performanceShiftAddDto) {
        List<PerformanceShift> list = new ArrayList<>();
        LocalDateTime startWeek = performanceShiftAddDto.getStartWeek();
        LocalDateTime endWeek = performanceShiftAddDto.getEndWeek();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String formattedDateTime = performanceShiftAddDto.getStartWeek().format(formatter);
        String[] splitUserId = performanceShiftAddDto.getUserId().split(",");
        for (String userId : splitUserId) {
            //判断是否跨月
            boolean isMonth = startWeek.getMonthValue() != endWeek.getMonthValue();
            if (isMonth){
                //如果跨月,则两个月都判断一下看数据库是哪个月份的数据没有
                boolean exists1 = baseMapper.exists(Wrappers.<PerformanceShift>lambdaQuery()
                        .eq(PerformanceShift::getWorkTime, startWeek)
                        .eq(PerformanceShift::getUserId, userId));
                boolean exists2 = baseMapper.exists(Wrappers.<PerformanceShift>lambdaQuery()
                        .eq(PerformanceShift::getWorkTime, endWeek)
                        .eq(PerformanceShift::getUserId, userId));
                if (!exists1 && !exists2){
                    //两个月都不存在数据
                    list = saveMonth(performanceShiftAddDto.getStartWeek(), userId, list);
                    list = saveMonth(performanceShiftAddDto.getEndWeek(), userId, list);
                }else if (!exists1 && exists2){
                    //开始的月份不存在数据
                    list = saveMonth(performanceShiftAddDto.getStartWeek(), userId, list);
                }else if (exists1 && !exists2){
                    //结束的月份不存在数据
                    list = saveMonth(performanceShiftAddDto.getEndWeek(), userId, list);
                }
            }else {
                //不跨月
                boolean exists = baseMapper.exists(Wrappers.<PerformanceShift>lambdaQuery()
                        .in(PerformanceShift::getWorkTime, formattedDateTime)
                        .eq(PerformanceShift::getUserId, userId));
                // å¦‚果不存在添加数据
                if (!exists) {
                    list = saveMonth(performanceShiftAddDto.getEndWeek(), userId, list);
                }
            }
        }
        if (!list.isEmpty()) {
            baseMapper.insertBatchSomeColumn(list);
            list.clear();
        }
        // å†æ¬¡æ›´æ–°
        List<LocalDateTime> datesBetween = getLocalDateTimesBetween(performanceShiftAddDto.getStartWeek(), performanceShiftAddDto.getEndWeek());
        for (LocalDateTime date : datesBetween) {
            for (String s : splitUserId) {
                PerformanceShift performanceShift = new PerformanceShift();
                performanceShift.setShift(performanceShiftAddDto.getShift());
                performanceShift.setUserId(Integer.valueOf(s));
                performanceShift.setWorkTime(date);
                String formatterDateTime = date.format(formatter);
                baseMapper.update(new PerformanceShift(), Wrappers.<PerformanceShift>lambdaUpdate()
                        .set(PerformanceShift::getShift, performanceShiftAddDto.getShift())
                        .eq(PerformanceShift::getUserId, s)
                        .eq(PerformanceShift::getWorkTime, formatterDateTime));
            }
        }
    }
    private List<PerformanceShift>   saveMonth (LocalDateTime week,String userId,List<PerformanceShift> list){
        LocalDate firstDayOfMonth = week.toLocalDate().withDayOfMonth(1);
        LocalDate lastDayOfMonth = week.toLocalDate().with(TemporalAdjusters.lastDayOfMonth());
        List<LocalDateTime> localDateTimesBetween = getLocalDateTimesBetween(firstDayOfMonth.atStartOfDay(), lastDayOfMonth.atStartOfDay());
        localDateTimesBetween.forEach(i -> {
            PerformanceShift performanceShift = new PerformanceShift();
            performanceShift.setUserId(Integer.valueOf(userId));
            performanceShift.setWorkTime(i);
            performanceShift.setShift("");
            list.add(performanceShift);
            if (list.size() >= 1000) {
                baseMapper.insertBatchSomeColumn(list);
                list.clear();
            }
        });
        return list;
    }
    @Override
    public Map<String, Object> performanceShiftPage(Page<Object> page, String time, String userName, String laboratory) {
        //查询当前登录人员的架构
        Integer userId = SecurityUtils.getUserId().intValue();
        //判断全部,个人,组织的权限
        User user = userMapper.selectById(userId);//当前登录的人
        //获取当前人所属实验室id
        String departLimsId = user.getDepartLimsId();
        if (com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isNotEmpty(departLimsId) && !departLimsId.equals("")) {
            String[] split = departLimsId.split(",");
            //查询对应架构名称(通信实验室,电力实验室,检测办)
            String departLims = baseMapper.seldepLimsId(Integer.parseInt(split[split.length - 1]));
            if (departLims.contains("实验室")) {
                laboratory = departLims;
            }
        }
        IPage<PerformanceShiftMapDto> mapIPage = baseMapper.performanceShiftPage(page, time, userName, laboratory);
        List<SysDictData> shiftType = dictTypeService.selectDictDataByName("班次类型");
        List<Map<String, Object>> mapYearIPage = baseMapper.performanceShiftYearPage(time, userName, laboratory);
        mapIPage.getRecords().forEach(i -> {
            String[] shiftTimes = i.getShiftTime().split(";");
            double totalAttendance = 0;
            List<Map<String, Object>> map = new ArrayList<>();
            // åˆ†å‰²æ—¥æœŸ
            for (String shiftTime : shiftTimes) {
                Map<String, Object> hashMap = new HashMap<>();
                String[] shiftTimeAndShift = shiftTime.split(":");
                for (SysDictData enums : shiftType) {
                    if (!i.getMonthlyAttendance().containsKey(enums.getDictLabel())) {
                        i.getMonthlyAttendance().put(enums.getDictLabel(), 0);
                    }
                    if (enums.getDictValue().equals(shiftTimeAndShift[1])) {
                        BigDecimal bigDecimal = new BigDecimal(i.getMonthlyAttendance().get(enums.getDictLabel()).toString());
                        i.getMonthlyAttendance().put(enums.getDictLabel(), bigDecimal.add(new BigDecimal("1")));
                    }
                    // åŠï¼Œå¦å¤–半天算给早
                    if (shiftTimeAndShift[1].equals("5") && enums.getDictValue().equals("0")) {
                        BigDecimal bigDecimal = new BigDecimal(i.getMonthlyAttendance().get(enums.getDictLabel()).toString());
                        i.getMonthlyAttendance().put(enums.getDictLabel(), bigDecimal.add(new BigDecimal("0.5")));
                    }
                }
                // æ—©ï¼Œä¸­ï¼Œå¤œï¼Œå·®
                if (shiftTimeAndShift[1].equals("1") || shiftTimeAndShift[1].equals("2") || shiftTimeAndShift[1].equals("0") || shiftTimeAndShift[1].equals("6")) {
                    i.getMonthlyAttendance().put("totalAttendance", totalAttendance += 1);
                }
                // åŠ
                if (shiftTimeAndShift[1].equals("5")) {
                    i.getMonthlyAttendance().put("totalAttendance", totalAttendance += 0.5);
                }
                hashMap.put("id", shiftTimeAndShift[2]);
                hashMap.put("shift", shiftTimeAndShift[1]);
                hashMap.put("time", shiftTimeAndShift[0]);
                map.add(hashMap);
            }
            double totalYearAttendance = 0;
            Map<String, Object> hashMap = new HashMap<>();
            for (Map<String, Object> record : mapYearIPage) {
                if (record.get("user_id").toString().equals(i.getUserId())) {
                    for (SysDictData enums : shiftType) {
                        if (!hashMap.containsKey(enums.getDictLabel())) {
                            hashMap.put(enums.getDictLabel(), 0);
                        }
                        if (enums.getDictValue().equals(record.get("shift"))) {
                            BigDecimal num = new BigDecimal(hashMap.get(enums.getDictLabel()).toString());
                            hashMap.put(enums.getDictLabel(), num.add(new BigDecimal("1")));
                        }
                        // åŠï¼Œå¦å¤–半天算给早
                        if (record.get("shift").equals("5") && enums.getDictValue().equals("0")) {
                            BigDecimal bigDecimal = new BigDecimal(hashMap.get(enums.getDictLabel()).toString());
                            hashMap.put(enums.getDictLabel(), bigDecimal.add(new BigDecimal("0.5")));
                        }
                    }
                    if (record.get("shift").equals("1") || record.get("shift").equals("2") || record.get("shift").equals("0") || record.get("shift").equals("6")) {
                        hashMap.put("totalAttendance", totalYearAttendance += 1);
                    }
                    // åŠ
                    if (record.get("shift").equals("5")) {
                        hashMap.put("totalAttendance", totalYearAttendance += 0.5);
                    }
                }
            }
            i.setSidebarAnnualAttendance(hashMap);
            i.setList(map);
            i.setShiftTime(null);
        });
        // èŽ·å–header时间
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // å°†å­—符串时间转换为 LocalDateTime ç±»åž‹æ—¶é—´
        LocalDateTime localDateTime = LocalDateTime.parse(time, formatters);
        LocalDate firstDayOfMonth = localDateTime.toLocalDate().withDayOfMonth(1);
        LocalDate lastDayOfMonth = localDateTime.toLocalDate().with(TemporalAdjusters.lastDayOfMonth());
        List<LocalDateTime> localDateTimesBetween = getLocalDateTimesBetween(firstDayOfMonth.atStartOfDay(), lastDayOfMonth.atStartOfDay());
        List<Object> list1 = new ArrayList<>();
        for (LocalDateTime dateTime : localDateTimesBetween) {
            Map<Object, Object> hashMap = new HashMap<>();
            DateTime parse = DateUtil.parse(dateTime.format(formatter));
            hashMap.put("weekly", DateUtil.weekOfYear(DateUtil.offsetDay(parse, 1)));
            hashMap.put("headerTime", getWeek(dateTime.format(formatters)));
            list1.add(hashMap);
        }
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("page", mapIPage);
        resultMap.put("headerList", list1);
        return resultMap;
    }
    @Override
    public void performanceShiftUpdate(PerformanceShift performanceShift) {
        baseMapper.update(new PerformanceShift(), Wrappers.<PerformanceShift>lambdaUpdate()
                .eq(PerformanceShift::getId, performanceShift.getId())
                .set(PerformanceShift::getShift, performanceShift.getShift()));
    }
    @Override
    public IPage<Map<String, Object>> performanceShiftPageYear(Page<Object> page, String time, String userName, String laboratory) {
        //查询当前登录人员的架构
        Integer userId = SecurityUtils.getUserId().intValue();
        //判断全部,个人,组织的权限
        User user = userMapper.selectById(userId);//当前登录的人
        //获取当前人所属实验室id
        String departLimsId = user.getDepartLimsId();
        if (com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isNotEmpty(departLimsId) && !departLimsId.equals("")) {
            String[] split = departLimsId.split(",");
            //查询对应架构名称(通信实验室,电力实验室,检测办)
            String departLims = baseMapper.seldepLimsId(Integer.parseInt(split[split.length - 1]));
            if (departLims.contains("实验室")) {
                laboratory = departLims;
            }
        }
        IPage<Map<String, Object>> mapYearIPage = baseMapper.performanceShiftYear(page, time, userName, laboratory);
        List<SysDictData> shiftType = dictTypeService.selectDictDataByName("班次类型");
        mapYearIPage.setRecords(annualAttendanceProcessing(mapYearIPage.getRecords(), shiftType));
        return mapYearIPage;
    }
    // å¹´åˆ†é¡µä¸Žå¯¼å‡ºå…±åŒä½¿ç”¨
    public List<Map<String, Object>> annualAttendanceProcessing(List<Map<String, Object>> mapYearList, List<SysDictData> shiftType) {
        for (Map<String, Object> map : mapYearList) {
            Map<String, Object> resultMap = new LinkedHashMap<>();
            Map<String, Object> hashMapYear = new LinkedHashMap<>();
            double totalYearAttendance = 0;
            // ä¸€å¹´12个月
            for (int i = 1; i < 13; i++) {
                Map<String, Object> hashMapMonth = new LinkedHashMap<>();
                double totalMonthAttendance = 0;
                for (SysDictData shift : shiftType) {
                    // åˆå§‹åŒ–赋值
                    if (!hashMapYear.containsKey(shift.getDictLabel())) {
                        hashMapYear.put(shift.getDictLabel(), 0);
                    }
                    // æœˆ
                    if (!ObjectUtils.isEmpty(map.get("month_str"))) {
                        String charArray = map.get("month_str").toString();
                        int count = countOccurrences(charArray, i + ":" + shift.getDictValue());
                        hashMapMonth.put(shift.getDictLabel(), count);
                        hashMapYear.put(shift.getDictLabel(), new BigDecimal(hashMapYear.get(shift.getDictLabel()).toString()).add(new BigDecimal(count)));
                        // æ—©ï¼Œä¸­ï¼Œå¤œï¼Œå·®
                        if (shift.getDictValue().equals("0") || shift.getDictValue().equals("1") || shift.getDictValue().equals("2") || shift.getDictValue().equals("6")) {
                            totalMonthAttendance += count;
                            totalYearAttendance += count;
                        }
//                      åŠï¼Œå¦å¤–半天算给早
                        if (shift.getDictValue().equals("5")) {
                            BigDecimal multiply = new BigDecimal("0.5").multiply(new BigDecimal(count)).setScale(1, BigDecimal.ROUND_CEILING);
                            hashMapMonth.put(shiftType.get(0).getDictLabel(), new BigDecimal(hashMapMonth.get(shiftType.get(0).getDictLabel()).toString()).add(multiply));
                            hashMapYear.put(shiftType.get(0).getDictLabel(), new BigDecimal(hashMapYear.get(shiftType.get(0).getDictLabel()).toString()).add(multiply));
                            totalMonthAttendance += multiply.doubleValue();
                            totalYearAttendance += multiply.doubleValue();
                        }
                    }
                    // ç©ºæ•°æ®
                    else {
                        map.put("work_time", i);
                        hashMapMonth.put(shift.getDictLabel(), 0);
                    }
                }
                hashMapMonth.put("totalMonthAttendance", totalMonthAttendance);
                hashMapYear.put("totalYearAttendance", totalYearAttendance);
                resultMap.put(i + "", hashMapMonth);
            }
            map.remove("month_str");
            map.remove("year_str");
            map.put("year", hashMapYear);
            map.put("month", resultMap);
        }
        return mapYearList;
    }
    public static int countOccurrences(String str, String target) {
        int count = 0;
        int index = 0;
        while ((index = str.indexOf(target, index)) != -1) {
            count++;
            index += target.length();
        }
        return count;
    }
    public List<List<Object>> dataRequiredForProcessingIntoExcel(List<Map<String, Object>> list, List<SysDictData> enums) throws Exception {
        List<List<Object>> data = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            List<Object> excelRowList = new ArrayList<>();
            excelRowList.add(i + 1);
            excelRowList.add(list.get(i).get("account"));
            excelRowList.add(list.get(i).get("name"));
            Map<String, Object> year = JackSonUtil.unmarshal(JackSonUtil.marshal(list.get(i).get("year")), Map.class);
            excelRowList.add(year.get("totalYearAttendance"));
            enums.forEach(j -> {
                if (!j.getDictValue().equals("5")) {
                    excelRowList.add(year.get(j.getDictLabel()));
                }
            });
            Map<String, Map<String, Object>> month = JackSonUtil.unmarshal(JackSonUtil.marshal(list.get(i).get("month")), Map.class);
            for (int j = 1; j < 13; j++) {
                Object totalMonthAttendance = month.get(j + "").get("totalMonthAttendance");
                excelRowList.add(totalMonthAttendance);
                for (SysDictData anEnum : enums) {
                    if (!anEnum.getDictValue().equals("5")) {
                        excelRowList.add(month.get(j + "").get(anEnum.getDictLabel()));
                    }
                }
            }
            data.add(excelRowList);
        }
        return data;
    }
    @Override
    public Map<Object, Object> exportToYearExcel(String time, String userName, String laboratory) throws Exception {
        Map<Object, Object> map = new HashMap<>();
        List<SysDictData> shiftType = dictTypeService.selectDictDataByName("班次类型");
        DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // å°†å­—符串时间转换为 LocalDateTime ç±»åž‹æ—¶é—´
        LocalDateTime localDateTime = LocalDateTime.parse(time, formatters);
        map.put("header", getYearHeader(localDateTime.getYear() + " å¹´", shiftType));
        List<Map<String, Object>> mapYearList = baseMapper.performanceShiftYearList(time, userName, laboratory);
        annualAttendanceProcessing(mapYearList, shiftType);
        List<List<Object>> lists = dataRequiredForProcessingIntoExcel(mapYearList, shiftType);
        map.put("data", lists);
        return map;
    }
    @Override
    public Map<Object, Object> exportToMonthExcel(String time, String userName, String laboratory) {
        List<SysDictData> shiftType = dictTypeService.selectDictDataByName("班次类型");
        List<PerformanceShiftMapDto> mapIPage = baseMapper.performanceShiftList(time, userName, laboratory);
        mapIPage.forEach(i -> {
            String[] shiftTimes = i.getShiftTime().split(";");
            double totalAttendance = 0;
            List<Map<String, Object>> map = new ArrayList<>();
            // åˆ†å‰²æ—¥æœŸ
            for (String shiftTime : shiftTimes) {
                Map<String, Object> hashMap = new HashMap<>();
                String[] shiftTimeAndShift = shiftTime.split(":");
                for (SysDictData enums : shiftType) {
                    if (!i.getMonthlyAttendance().containsKey(enums.getDictLabel())) {
                        i.getMonthlyAttendance().put(enums.getDictLabel(), 0);
                    }
                    if (enums.getDictValue().equals(shiftTimeAndShift[1])) {
                        BigDecimal bigDecimal = new BigDecimal(i.getMonthlyAttendance().get(enums.getDictLabel()).toString());
                        i.getMonthlyAttendance().put(enums.getDictLabel(), bigDecimal.add(new BigDecimal("1")));
                    }
                    // åŠï¼Œå¦å¤–半天算给早
                    if (shiftTimeAndShift[1].equals("5") && enums.getDictValue().equals("0")) {
                        BigDecimal bigDecimal = new BigDecimal(i.getMonthlyAttendance().get(enums.getDictLabel()).toString());
                        i.getMonthlyAttendance().put(enums.getDictLabel(), bigDecimal.add(new BigDecimal("0.5")));
                    }
                }
                // æ—©ï¼Œä¸­ï¼Œå¤œï¼Œå·®
                if (shiftTimeAndShift[1].equals("1") || shiftTimeAndShift[1].equals("2") || shiftTimeAndShift[1].equals("0") || shiftTimeAndShift[1].equals("6")) {
                    i.getMonthlyAttendance().put("totalAttendance", totalAttendance += 1);
                }
                // åŠ
                if (shiftTimeAndShift[1].equals("5")) {
                    i.getMonthlyAttendance().put("totalAttendance", totalAttendance += 0.5);
                }
                hashMap.put("id", shiftTimeAndShift[2]);
                hashMap.put("shift", shiftTimeAndShift[1]);
                hashMap.put("time", shiftTimeAndShift[0]);
                map.add(hashMap);
            }
            i.setList(map);
            i.setShiftTime(null);
        });
        Map<Object, Object> map = new HashMap<>();
        DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // å°†å­—符串时间转换为 LocalDateTime ç±»åž‹æ—¶é—´
        LocalDateTime localDateTime = LocalDateTime.parse(time, formatters);
        map.put("header", getMonthHeader(localDateTime, shiftType));
        List<List<Object>> lists = dataRequiredForProcessingIntoExcelMonth(mapIPage, shiftType);
        map.put("data", lists);
        return map;
    }
    // èŽ·å–ä¸¤ä¸ªlocalDateTime的每一天
    public static List<LocalDateTime> getLocalDateTimesBetween(LocalDateTime start, LocalDateTime end) {
        List<LocalDateTime> localDateTimes = new ArrayList<>();
        LocalDate currentDate = start.toLocalDate();
        LocalDateTime currentLocalDateTime = start;
        while (!currentDate.isAfter(end.toLocalDate())) {
            localDateTimes.add(currentLocalDateTime);
            currentLocalDateTime = currentLocalDateTime.plusDays(1);
            currentDate = currentDate.plusDays(1);
        }
        return localDateTimes;
    }
    public static String getWeek(String dayStr) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date date = sdf.parse(dayStr);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
            int day = calendar.get(Calendar.DAY_OF_MONTH);
            return day + " " + getWeekDay(dayOfWeek);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    public static String getWeekDay(int dayOfWeek) {
        switch (dayOfWeek) {
            case Calendar.MONDAY:
                return "周一";
            case Calendar.TUESDAY:
                return "周二";
            case Calendar.WEDNESDAY:
                return "周三";
            case Calendar.THURSDAY:
                return "周四";
            case Calendar.FRIDAY:
                return "周五";
            case Calendar.SATURDAY:
                return "周六";
            case Calendar.SUNDAY:
                return "周日";
            default:
                return "未知";
        }
    }
    /**
     * è¿”回表头
     * <p>
     * å¤–层List代表行内层 List代表列  ç›¸åŒçš„列数据会被主动合并
     * æž„造双列表头
     *
     * @return List<List < String>>
     */
    private static List<List<String>> getYearHeader(String year, List<SysDictData> enums) {
        List<List<String>> line = new ArrayList<>();
        line.add(Arrays.asList("考勤汇总", "序号", "序号"));
        line.add(Arrays.asList("考勤汇总", "工号", "工号"));
        line.add(Arrays.asList("考勤汇总", "姓名", "姓名"));
        line.add(Arrays.asList("出勤详情", year, "出勤"));
        // å¹´ header
        for (SysDictData anEnum : enums) {
            if (!anEnum.getDictValue().equals("5")) {
                line.add(Arrays.asList("考勤汇总", year, anEnum.getDictLabel()));
            }
        }
        // æœˆheader
        for (int i = 1; i < 13; i++) {
            line.add(Arrays.asList("出勤详情", i + " æœˆ", "出勤"));
            for (SysDictData anEnum : enums) {
                if (!anEnum.getDictValue().equals("5")) {
                    line.add(Arrays.asList("出勤详情", i + " æœˆ", anEnum.getDictLabel()));
                }
            }
        }
        return line;
    }
    private static List<List<String>> getMonthHeader(LocalDateTime localDateTimeYear, List<SysDictData> enums) {
        String year = localDateTimeYear.getYear() + " å¹´äººå‘˜ç­æ¬¡";
        List<List<String>> line = new ArrayList<>();
        line.add(Arrays.asList(year, "序号", "序号", "序号"));
        line.add(Arrays.asList(year, "姓名", "姓名", "姓名"));
        line.add(Arrays.asList(year, "实验室", "实验室", "实验室"));
        line.add(Arrays.asList(year, localDateTimeYear.getYear() + "", localDateTimeYear.getYear() + "", "出勤"));
        line.add(Arrays.asList(year, localDateTimeYear.getYear() + "", localDateTimeYear.getYear() + "", enums.get(3).getDictLabel()));
        line.add(Arrays.asList(year, "å¹´", "å¹´", enums.get(4).getDictLabel()));
        line.add(Arrays.asList(year, localDateTimeYear.getMonthValue() + "", localDateTimeYear.getMonthValue() + "", enums.get(0).getDictLabel()));
        line.add(Arrays.asList(year, "月", "月", enums.get(1).getDictLabel()));
        line.add(Arrays.asList(year, "", "", enums.get(2).getDictLabel()));
        line.add(Arrays.asList(year, "周次", "星期", "出差"));
        LocalDate firstDayOfMonth = localDateTimeYear.toLocalDate().withDayOfMonth(1);
        LocalDate lastDayOfMonth = localDateTimeYear.toLocalDate().with(TemporalAdjusters.lastDayOfMonth());
        List<LocalDateTime> timeList = getLocalDateTimesBetween(firstDayOfMonth.atStartOfDay(), lastDayOfMonth.atStartOfDay());
        timeList.forEach(i -> {
            int dayOfYear = i.getDayOfMonth();
            Date from = Date.from(i.atZone(ZoneId.systemDefault()).toInstant());
            String weekDay = getWeekDay(i.getDayOfWeek().getValue());
            line.add(Arrays.asList(year, DateUtil.weekOfYear(DateUtil.offsetDay(from, 1)) + "", weekDay, dayOfYear + ""));
        });
        return line;
    }
    public List<List<Object>> dataRequiredForProcessingIntoExcelMonth(List<PerformanceShiftMapDto> list, List<SysDictData> enums) {
        List<List<Object>> data = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            List<Object> excelRowList = new ArrayList<>();
            excelRowList.add(i + 1);
            excelRowList.add(list.get(i).getName());
            excelRowList.add(list.get(i).getDepartment());
            excelRowList.add(list.get(i).getMonthlyAttendance().get("totalAttendance"));
            excelRowList.add(list.get(i).getMonthlyAttendance().get(enums.get(3).getDictLabel())); // ä¼‘
            excelRowList.add(list.get(i).getMonthlyAttendance().get(enums.get(4).getDictLabel())); // å‡
            excelRowList.add(list.get(i).getMonthlyAttendance().get(enums.get(0).getDictLabel())); // æ—©
            excelRowList.add(list.get(i).getMonthlyAttendance().get(enums.get(1).getDictLabel())); // ä¸­
            excelRowList.add(list.get(i).getMonthlyAttendance().get(enums.get(2).getDictLabel())); // å¤œ
            excelRowList.add(list.get(i).getMonthlyAttendance().get(enums.get(6).getDictLabel())); // å·®
            for (Map<String, Object> o : list.get(i).getList()) {
                String enumLabel = "";
                for (SysDictData anEnum : enums) {
                    if (anEnum.getDictValue().equals(o.get("shift"))) {
                        enumLabel = anEnum.getDictLabel();
                    }
                }
                excelRowList.add(ObjectUtils.isEmpty(enumLabel) ? "-" : enumLabel);
            }
            data.add(excelRowList);
        }
        return data;
    }
}
performance-server/src/main/java/com/ruoyi/performance/service/impl/ShiftTimeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.performance.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.performance.mapper.ShiftTimeMapper;
import com.ruoyi.performance.pojo.ShiftTime;
import com.ruoyi.performance.service.ShiftTimeService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
 * ç­æ¬¡å¯¹åº”的时间 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-07-24 11:22:17
 */
@Service
public class ShiftTimeServiceImpl extends ServiceImpl<ShiftTimeMapper, ShiftTime> implements ShiftTimeService {
    @Resource
    ShiftTimeMapper shiftTimeMapper;
    @Override
    public void shiftTimeAdd(ShiftTime shiftTime) {
        List<ShiftTime> shiftTimes = shiftTimeMapper.selectList(Wrappers.<ShiftTime>lambdaQuery().eq(ShiftTime::getShift, shiftTime.getShift()));
        if (shiftTimes.size() > 0) {
           throw new BaseException("已存在该班次的时间配置,请删掉后再新增!");
        }
        shiftTimeMapper.insert(shiftTime);
    }
    @Override
    public List<ShiftTime> shiftTimeList() {
        return shiftTimeMapper.selectList(null);
    }
}
performance-server/src/main/java/com/ruoyi/performance/utils/CustomerDoubleSerialize.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.performance.utils;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.text.DecimalFormat;
public class CustomerDoubleSerialize extends JsonSerializer {
    private DecimalFormat df = new DecimalFormat("0.0000");
    @Override
    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if(o.toString() != null && !o.toString().equals("0.0")) {
            Double dd=Double.parseDouble(o.toString());
            jsonGenerator.writeString(df.format(dd));
        } else{
            if(o.toString().equals("0.0")) {
                jsonGenerator.writeString("0");
            } else {
                jsonGenerator.writeString(o.toString());
            }
        }
    }
}
performance-server/src/main/java/com/ruoyi/performance/utils/StyleMonthUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package com.ruoyi.performance.utils;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
public class StyleMonthUtils {
    /**
     * æ ‡é¢˜æ ·å¼
     * @return
     */
    public static WriteCellStyle getHeadStyle(){
        // å¤´çš„ç­–ç•¥
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // èƒŒæ™¯é¢œè‰²
//        headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
//        headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        // å­—体
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontName("等线");//设置字体名字
        headWriteFont.setFontHeightInPoints((short)9);//设置字体大小
        headWriteFont.setBold(true);//字体加粗
        headWriteFont.setColor((short) 0);
        headWriteCellStyle.setWriteFont(headWriteFont); //在样式用应用设置的字体;
        // æ ·å¼
        headWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
        headWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色;
        headWriteCellStyle.setBorderLeft(BorderStyle.THIN);  //设置左边框;
        headWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色;
        headWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
        headWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色;
        headWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
        headWriteCellStyle.setTopBorderColor((short) 0); //设置顶边框颜色;
        headWriteCellStyle.setWrapped(false);  //设置自动换行;
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//设置水平对齐的样式为居中对齐;
        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);  //设置垂直对齐的样式为居中对齐;
        headWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适
        return headWriteCellStyle;
    }
    /**
     * å†…容样式
     * @return
     */
    public static WriteCellStyle getContentStyle(){
        // å†…容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // è¿™é‡Œéœ€è¦æŒ‡å®š FillPatternType ä¸ºFillPatternType.SOLID_FOREGROUND ä¸ç„¶æ— æ³•显示背景颜色.头默认了 FillPatternType所以可以不指定
//        contentWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());
        contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        // è®¾ç½®å­—体
        WriteFont contentWriteFont = new WriteFont();
        contentWriteFont.setFontHeightInPoints((short) 10);//设置字体大小
        contentWriteFont.setFontName("等线"); //设置字体名字
        contentWriteCellStyle.setWriteFont(contentWriteFont);//在样式用应用设置的字体;
        //设置样式;
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
        contentWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色;
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);  //设置左边框;
        contentWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色;
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
        contentWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色;
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
        contentWriteCellStyle.setTopBorderColor((short) 0); ///设置顶边框颜色;
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// æ°´å¹³å±…中
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// åž‚直居中
        contentWriteCellStyle.setWrapped(false); //设置自动换行;
//        contentWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适
        return contentWriteCellStyle;
    }
}
performance-server/src/main/java/com/ruoyi/performance/utils/StyleYearUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.ruoyi.performance.utils;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
public class StyleYearUtils {
    /**
     * æ ‡é¢˜æ ·å¼
     *
     * @return
     */
    public static WriteCellStyle getHeadStyle() {
        // å¤´çš„ç­–ç•¥
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // èƒŒæ™¯é¢œè‰²
//        headWriteCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());
        headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        // å­—体
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontName("仿宋");//设置字体名字
        headWriteFont.setFontHeightInPoints((short) 9);//设置字体大小
        headWriteFont.setBold(true);//字体加粗
        headWriteFont.setColor((short) 1);
        headWriteCellStyle.setWriteFont(headWriteFont); //在样式用应用设置的字体;
        // æ ·å¼
        headWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
        headWriteCellStyle.setBottomBorderColor((short) 1);//设置底边框颜色;
        headWriteCellStyle.setBorderLeft(BorderStyle.THIN);  //设置左边框;
        headWriteCellStyle.setLeftBorderColor((short) 1);//设置左边框颜色;
        headWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
        headWriteCellStyle.setRightBorderColor((short) 1);//设置右边框颜色;
        headWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
        headWriteCellStyle.setTopBorderColor((short) 1); //设置顶边框颜色;
        headWriteCellStyle.setWrapped(false);  //设置自动换行;
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//设置水平对齐的样式为居中对齐;
        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);  //设置垂直对齐的样式为居中对齐;
        headWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适
        return headWriteCellStyle;
    }
    /**
     * å†…容样式
     *
     * @return
     */
    public static WriteCellStyle getContentStyle() {
        // å†…容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // è¿™é‡Œéœ€è¦æŒ‡å®š FillPatternType ä¸ºFillPatternType.SOLID_FOREGROUND ä¸ç„¶æ— æ³•显示背景颜色.头默认了 FillPatternType所以可以不指定
//        contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        // è®¾ç½®å­—体
        WriteFont contentWriteFont = new WriteFont();
        contentWriteFont.setFontHeightInPoints((short) 9);//设置字体大小
        contentWriteFont.setFontName("仿宋"); //设置字体名字
        contentWriteCellStyle.setWriteFont(contentWriteFont);//在样式用应用设置的字体;
        //设置样式;
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
        contentWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色;
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);  //设置左边框;
        contentWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色;
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
        contentWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色;
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
        contentWriteCellStyle.setTopBorderColor((short) 0); ///设置顶边框颜色;
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// æ°´å¹³å±…中
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// åž‚直居中
        contentWriteCellStyle.setWrapped(false); //设置自动换行;
//        contentWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适
        return contentWriteCellStyle;
    }
}
performance-server/src/main/resources/mapper/AuxiliaryCorrectionHoursMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.performance.mapper.AuxiliaryCorrectionHoursMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.performance.pojo.AuxiliaryCorrectionHours">
        <id column="id" property="id"/>
        <result column="name_user" property="nameUser"/>
        <result column="type" property="type"/>
        <result column="one_hours" property="oneHours"/>
        <result column="two_hours" property="twoHours"/>
        <result column="three_hours" property="threeHours"/>
        <result column="four_hours" property="fourHours"/>
        <result column="five_hours" property="fiveHours"/>
        <result column="six_hours" property="sixHours"/>
        <result column="seven_hours" property="sevenHours"/>
        <result column="eight_hours" property="eightHours"/>
        <result column="nine_hours" property="nineHours"/>
        <result column="ten_hours" property="tenHours"/>
        <result column="eleven_hours" property="elevenHours"/>
        <result column="twelve_hours" property="twelveHours"/>
        <result column="thirteen_hours" property="thirteenHours"/>
        <result column="fourteen_hours" property="fourteenHours"/>
        <result column="fifteen_hours" property="fifteenHours"/>
        <result column="sixteen_hours" property="sixteenHours"/>
        <result column="seventeen_hours" property="seventeenHours"/>
        <result column="eighteen_hours" property="eighteenHours"/>
        <result column="nineteen_hours" property="nineteenHours"/>
        <result column="twenty_hours" property="twentyHours"/>
        <result column="twenty_one_hours" property="twentyOneHours"/>
        <result column="twenty_two_hours" property="twentyTwoHours"/>
        <result column="twenty_three_hours" property="twentyThreeHours"/>
        <result column="twenty_four_hours" property="twentyFourHours"/>
        <result column="twenty_five_hours" property="twentyFiveHours"/>
        <result column="twenty_six_hours" property="twentySixHours"/>
        <result column="twenty_seven_hours" property="twentySevenHours"/>
        <result column="twenty_eight_hours" property="twentyEightHours"/>
        <result column="twenty_nine_hours" property="twentyNineHours"/>
        <result column="thirty_hours" property="thirtyHours"/>
        <result column="thirty_one_hours" property="thirtyOneHours"/>
        <result column="month" property="month"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="create_user" property="createUser"/>
        <result column="update_user" property="updateUser"/>
    </resultMap>
    <select id="selectAuxiliaryCorrectionHours" resultType="com.ruoyi.performance.dto.AuxiliaryCorrectionHoursDto">
        select A.*
        from (
        select ach.*,
        name,
        sum(one_hours+two_hours+ three_hours+ four_hours+ five_hours+ six_hours+ seven_hours+ eight_hours+ nine_hours+
        ten_hours+ eleven_hours+ twelve_hours+thirteen_hours+ fourteen_hours+ fifteen_hours+ sixteen_hours+
        seventeen_hours+ eighteen_hours+ nineteen_hours+ twenty_hours+ twenty_one_hours+ twenty_two_hours+
        twenty_three_hours+ twenty_four_hours+ twenty_five_hours+ twenty_six_hours+ twenty_seven_hours+
        twenty_eight_hours+ twenty_nine_hours+ thirty_hours+ thirty_one_hours) as total
        FROM auxiliary_correction_hours ach
        left join user on user.id=ach.name_user
        WHERE 1=1
        <if test="ids !=null and ids != ''">
            and name_user in
            <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
                #{val}
            </foreach>
        </if>
        ) A
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="selDepartLimsByName" resultType="java.lang.Integer">
        select id
        from department_lims
        where name LIKE CONCAT('%', #{departLims}, '%');
    </select>
</mapper>
performance-server/src/main/resources/mapper/AuxiliaryOriginalHoursMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.ruoyi.performance.mapper.AuxiliaryOriginalHoursMapper">
    <select id="totalHours" resultType="java.util.Map">
        select E.name, E.month, E.total manHours
        from (select C.name, C.month, C.manHours + D.manHours as total
        from (select A.name,
        A.month,
        FORMAT(SUM(manHour), 4) as manHours
        from (
        select user.name,
        case
        when reviewer_nonproductive_time is null then nonproductive_time
        else reviewer_nonproductive_time end as manHour,
        date_time as month
        from auxiliary_working_hours_day awhd
        left join user on user.id = awhd.name_user
        left join department_lims dl on depart_lims_id = dl.id
        where date_time LIKE CONCAT('%', #{month}, '%')
        and awhd.state='已批准'
        <!--and name_user in(#{ids})-->
         <if test="ids !=null and ids != ''">
             and name_user in
             <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
                 #{val}
             </foreach>
         </if>
        order by month
        ) A
        group by A.name, A.month) C
        INNER JOIN
        (select B.name,
        B.month,
        B.manHours
        from (
        select user.name,
        date_time as month,
        FORMAT(SUM(output_work_time), 4) as manHours
        from auxiliary_output_working_hours aowh
        left join user on user.id = aowh.`check`
        left join department_lims dl on depart_lims_id = dl.id
        where date_time LIKE CONCAT('%', #{month}, '%')
        <!--and `check` in(#{ids})-->
        <if test="ids !=null and ids != ''">
            and `check` in
            <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
                #{val}
            </foreach>
        </if>
        group by user.name, month
        order by user.name, month
        ) B
        group by B.name, B.month) D
        on C.month = D.month
        where C.name = D.name
        ) E
        group by E.name, E.month
    </select>
</mapper>
performance-server/src/main/resources/mapper/AuxiliaryOutputWorkingHoursMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,186 @@
<?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.ruoyi.performance.mapper.AuxiliaryOutputWorkingHoursMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours">
        <id column="id" property="id"/>
        <result column="inspection_item" property="inspectionItem"/>
        <result column="inspection_item_subclass" property="inspectionItemSubclass"/>
        <result column="sample" property="sample"/>
        <result column="overtime_order_no" property="overtimeOrderNo"/>
        <result column="overtime_work_time" property="overtimeWorkTime"/>
        <result column="overtime_amount" property="overtimeAmount"/>
        <result column="order_no" property="orderNo"/>
        <result column="work_time" property="workTime"/>
        <result column="amount" property="amount"/>
        <result column="output_work_time" property="outputWorkTime"/>
        <result column="date_time" property="dateTime"/>
        <result column="week" property="week"/>
        <result column="week_day" property="weekDay"/>
        <result column="check" property="check"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="create_user" property="createUser"/>
        <result column="update_user" property="updateUser"/>
    </resultMap>
    <sql id="selectAuxiliaryOutputWorking">
        select *
        from (
        select aowh.id,
        aowh.inspection_item_class,
        aowh.inspection_item,
        aowh.inspection_item_subclass,
        aowh.overtime_order_no,
        aowh.overtime_work_time,
        aowh.overtime_amount,
        aowh.order_no,
        aowh.work_time,
        aowh.amount,
        aowh.output_work_time,
        aowh.date_time,
        aowh.week,
        aowh.week_day,
        user.name,
        aowh.sample,
        aowh.price,
        aowh.man_hour_group,
        ip.cable_tag
        FROM auxiliary_output_working_hours aowh
        left join ins_product ip on ip.id = aowh.ins_product_id
        left join user on user.id=aowh.`check`
        WHERE 1=1
        <if test="ids !=null and ids.size() > 0">
            and `check` in
            <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
                #{val}
            </foreach>
        </if>
        ) A
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </sql>
    <select id="selectAuxiliaryOutputWorkingHours" resultType="com.ruoyi.performance.dto.AuxiliaryOutputWorkingHoursDto">
        <include refid="selectAuxiliaryOutputWorking"/>
    </select>
    <select id="selectDataByUser" resultType="com.ruoyi.performance.dto.AuxiliaryOutputWorkingHoursDto">
        select aowh.*, name, ip.cable_tag cableTag
        FROM auxiliary_output_working_hours aowh
        left join ins_product ip on ip.id = aowh.ins_product_id
        left join user on user.id = aowh.`check`
        WHERE 1 = 1
        <if test="ids !=null and ids.size() > 0">
            and `check` in
            <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
                #{val}
            </foreach>
        </if>
    </select>
    <select id="totalHours" resultType="java.util.Map">
        select A.name,
        A.month,
        FORMAT(SUM(A.manHours), 4) manHours
        from(
        select user.name,
        date_time as month,
        order_no,
        sample,
        man_hour_group,
        case when #{type}='加班工时' then  case when overtime_work_time is null then 0 else overtime_work_time end
        else case when work_time is null then 0 else work_time end  end as manHours
        -- FORMAT(SUM(output_work_time), 4) as manHours
        from auxiliary_output_working_hours aowh
        left join user on user.id=aowh.`check`
        left join department_lims dl on depart_lims_id=dl.id
        where date_time LIKE CONCAT('%', #{month}, '%')
        <if test="ids !=null and ids != ''">
            and `check` in
            <foreach collection="ids" open="(" separator="," close=")" item="val">
                #{val}
            </foreach>
        </if>
        group by user.name,date_time,order_no,
        sample,
        man_hour_group
        order by user.name,date_time,order_no,
        sample,
        man_hour_group
        )A
        group by A.name,
        A.month
        order by A.name,
        A.month
    </select>
    <select id="selectListByIds" resultType="com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours">
        select * from auxiliary_output_working_hours
        where 1=1
        <if test="ids !=null and ids != ''">
            and `check` in
            <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
                #{val}
            </foreach>
        </if>
    </select>
    <select id="selectLists" resultMap="BaseResultMap">
        select * from(select * from auxiliary_output_working_hours
        WHERE 1=1
        <if test="ids !=null and ids != ''">
            and `check` in
            <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
                #{val}
            </foreach>
        </if>
        ) A
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="selectAuxiliaryAllByMonth" resultType="com.ruoyi.performance.dto.AuxiliaryAllDto">
        select sum(aowh.work_time) yieldHour,
               u.name           userName,
               aowh.`check`           userId,
               #{dto.month} month
        from (SELECT *
              FROM auxiliary_output_working_hours
              GROUP BY CASE
                           WHEN man_hour_group IS NOT NULL AND man_hour_group != '' THEN man_hour_group
                           ELSE id
                  END
                     , CASE
                           WHEN man_hour_group IS NOT NULL AND man_hour_group != '' THEN order_id
                           ELSE id
                  END) aowh
                 left join user u on u.id = aowh.`check`
        where aowh.date_time between #{dto.beginDate} and #{dto.endDate}
        <if test="userIds !=null and userIds.size() > 0">
            and aowh.`check` in
            <foreach collection="userIds" index="index" open="(" separator="," close=")" item="val">
                #{val}
            </foreach>
        </if>
        group by aowh.`check`
    </select>
    <select id="selectSubsidiaryAllByMonth" resultType="com.ruoyi.performance.dto.AuxiliaryAllDto">
        select sum(awhd.reviewer_nonproductive_time) subsidiaryHour,
               u.name              userName,
               awhd.name_user      userId,
               #{dto.month} month
        from auxiliary_working_hours_day awhd
                 left join user u on u.id = awhd.name_user
        where awhd.date_time between #{dto.beginDate} and #{dto.endDate}
        and awhd.state = '已批准'
        <if test="userIds !=null and userIds.size() > 0">
            and awhd.name_user in
            <foreach collection="userIds" index="index" open="(" separator="," close=")" item="val">
                #{val}
            </foreach>
        </if>
        group by awhd.name_user
    </select>
    <!-- æŸ¥è¯¢äº§é‡å·¥æ—¶é›†åˆ -->
    <select id="selectAuxiliaryOutputWorkingHoursList" resultType="com.ruoyi.performance.dto.AuxiliaryOutputWorkingHoursDto">
        <include refid="selectAuxiliaryOutputWorking"/>
    </select>
</mapper>
performance-server/src/main/resources/mapper/AuxiliaryWorkingHoursDayMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,116 @@
<?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.ruoyi.performance.mapper.AuxiliaryWorkingHoursDayMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.performance.pojo.AuxiliaryWorkingHoursDay">
        <id column="id" property="id"/>
        <result column="nameUser" property="nameUser"/>
        <result column="number" property="number"/>
        <result column="auxiliary_project" property="auxiliaryProject"/>
        <result column="approved_working_hour" property="approvedWorkingHour"/>
        <result column="amount" property="amount"/>
        <result column="nonproductive_time" property="nonproductiveTime"/>
        <result column="remarks" property="remarks"/>
        <result column="reviewer" property="reviewer"/>
        <result column="reviewer_number" property="reviewerNumber"/>
        <result column="reviewer_nonproductive_time" property="reviewerNonproductiveTime"/>
        <result column="reviewer_remark" property="reviewerRemark"/>
        <result column="year" property="year"/>
        <result column="shift" property="shift"/>
        <result column="week" property="week"/>
        <result column="week_day" property="weekDay"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="create_user" property="createUser"/>
        <result column="update_user" property="updateUser"/>
        <result column="state" property="state"/>
    </resultMap>
    <sql id="selectAuxiliaryWorkingHours">
        select A.*
        from (
        select awhd.*,name
        FROM auxiliary_working_hours_day awhd
        left join user on name_user=user.id
        WHERE 1=1
        <if test="ids !=null and ids.size() > 0">
            and name_user in
            <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
                #{val}
            </foreach>
        </if>
        ) A
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </sql>
    <select id="selectAuxiliaryWorkingHoursDay" resultType="com.ruoyi.performance.dto.AuxiliaryWorkingHoursDayDto">
        <include refid="selectAuxiliaryWorkingHours"/>
    </select>
    <select id="selectDataByUser" resultType="com.ruoyi.performance.dto.AuxiliaryWorkingHoursDayDto">
        select awhd.*,name
        FROM auxiliary_working_hours_day awhd
        left join user on name_user=user.id
        WHERE 1=1
        <if test="ids !=null and ids.size() > 0">
            and name_user in
            <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
                #{val}
            </foreach>
        </if>
    </select>
    <select id="selectListByIds" resultType="com.ruoyi.performance.pojo.AuxiliaryWorkingHoursDay">
        select * from auxiliary_working_hours_day
        where state='已审核'
        <if test="ids !=null and ids != ''">
            and name_user in
            <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
                #{val}
            </foreach>
        </if>
    </select>
    <select id="totalHours" resultType="java.util.Map">
        select A.name,
        A.month,
        FORMAT(SUM(manHour), 4)as manHours
        from(
        select user.name,
        case when reviewer_nonproductive_time is null then nonproductive_time
        else reviewer_nonproductive_time end as manHour,
        date_time as month
        from auxiliary_working_hours_day awhd
        left join user on user.id=awhd.name_user
        left join department_lims dl on depart_lims_id=dl.id
        where date_time LIKE CONCAT('%', #{month}, '%')
        and awhd.state='已批准'
         <if test="ids !=null and ids.size() > 0">
             and name_user in
             <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
                 #{val}
             </foreach>
         </if>
        order by month,user.name
        )A
        group by A.name,A.month
        order by A.name,A.month
    </select>
    <select id="selectLists" resultMap="BaseResultMap">
        select * from(select * from auxiliary_working_hours_day
        WHERE 1=1
        <if test="ids !=null and ids.size() > 0">
            and name_user in
            <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
                #{val}
            </foreach>
        </if>
        ) A
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="selectAuxiliaryWorkingHoursDayList" resultType="com.ruoyi.performance.dto.AuxiliaryWorkingHoursDayDto">
        <include refid="selectAuxiliaryWorkingHours"/>
    </select>
</mapper>
performance-server/src/main/resources/mapper/AuxiliaryWorkingHoursMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
<?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.ruoyi.performance.mapper.AuxiliaryWorkingHoursMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.performance.pojo.AuxiliaryWorkingHours">
        <id column="id" property="id" />
        <result column="number" property="number"/>
        <result column="AuxiliaryProject" property="auxiliaryProject" />
        <result column="approved_working_hour" property="approvedWorkingHour" />
        <result column="remarks" property="remarks" />
        <result column="create_user" property="createUser" />
        <result column="update_user" property="updateUser" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="department" property="department" />
        <result column="laboratory" property="laboratory" />
        <result column="unit" property="unit"/>
    </resultMap>
  <select id="selectAuxiliaryWorkingHours" resultType="com.ruoyi.performance.pojo.AuxiliaryWorkingHours">
      select data.*
      from (
      select
      awh.id,
      awh.number,
      awh.auxiliary_project,
      awh.laboratory,
      awh.unit,
      awh.approved_working_hour,
      awh.department,
      awh.remarks
      FROM auxiliary_working_hours awh
      ) data
      <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
          ${ew.customSqlSegment}
      </if>
  </select>
</mapper>
performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,135 @@
<?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.ruoyi.performance.mapper.PerformanceShiftMapper">
    <resultMap id="performanceShiftPageMap" type="com.ruoyi.performance.dto.PerformanceShiftMapDto">
        <result column="name" property="name"/>
        <result column="shift_time" property="shiftTime"/>
        <result column="user_id" property="userId" />
        <result column="department" property="department" />
    </resultMap>
    <select id="performanceShiftPage" resultMap="performanceShiftPageMap">
        SELECT
        if(u2.department is not null and u2.department != '', CONCAT(u2.name, '(', u2.department, ')'), u2.name) name,
        GROUP_CONCAT(s.work_time, ':', s.shift, ':', s.id order by s.work_time SEPARATOR ';') AS shift_time, u2.id user_id
        FROM performance_shift s
        LEFT JOIN (SELECT distinct u.* from
        user u
        left join department_lims dl on FIND_IN_SET(dl.id,u.depart_lims_id)
        where state=1
        <if test="laboratory != null and laboratory != ''">
          and   dl.name=#{laboratory}
        </if>
         ) u2    on u2.id = s.user_id
        <where>
            name is not null
            <if test="time != null and time != ''">
                and DATE_FORMAT(s.work_time, '%Y-%m') = DATE_FORMAT(#{time}, '%Y-%m' )
            </if>
            <if test="userName != null and userName != ''">
                and u2.name like concat('%', #{userName}, '%')
            </if>
        </where>
        order by s.create_time
        GROUP BY u2.id
    </select>
    <select id="performanceShiftYearPage" resultType="map">
        SELECT
        s.user_id, s.shift
        FROM performance_shift s
        LEFT JOIN (SELECT u.* from
        user u
        left join department_lims dl on FIND_IN_SET(dl.id,u.depart_lims_id)
        where state=1
        <if test="laboratory != null and laboratory != ''">
            and   dl.name=#{laboratory}
        </if>
        ) u2   on u2.id = s.user_id
        where s.shift is not NULL
        and s.shift != ''
        and name is not null
        <if test="time != null and time != ''">
            and DATE_FORMAT(s.work_time, '%Y') = DATE_FORMAT(#{time}, '%Y' )
        </if>
        <if test="userName != null and userName != ''">
            and u2.name like concat('%', #{userName}, '%')
        </if>
        order by s.create_time
    </select>
    <select id="performanceShiftYear" resultType="java.util.Map">
        SELECT if(u2.department is not null and u2.department != '', CONCAT(u2.name, '(', u2.department, ')'), u2.name) name,
        s.user_id, u2.account,
        DATE_FORMAT(s.work_time, '%c') work_time,
        GROUP_CONCAT(DATE_FORMAT(s.work_time, '%c'), ':', s.shift order by s.work_time SEPARATOR ';') month_str
        FROM performance_shift s
        LEFT JOIN (SELECT u.* from
        user u
        left join department_lims dl on FIND_IN_SET(dl.id,u.depart_lims_id)
        where state=1
        <if test="laboratory != null and laboratory != ''">
            and   dl.name=#{laboratory}
        </if>
        ) u2   on u2.id = s.user_id
        where s.shift is not NULL
        and s.shift != ''
        and name is not null
        <if test="time != null and time != ''">
            and DATE_FORMAT(s.work_time, '%Y') = DATE_FORMAT(#{time}, '%Y' )
        </if>
        <if test="userName != null and userName != ''">
            and u.name like concat('%', #{userName}, '%')
        </if>
        GROUP BY u2.id
        order by s.create_time
    </select>
    <select id="performanceShiftYearList" resultType="map">
        SELECT if(u.department is not null and u.department != '', CONCAT(u.name, '(', u.department, ')'), u.name) name,
        s.user_id, u.account,
        DATE_FORMAT(s.work_time, '%c') work_time,
        GROUP_CONCAT(DATE_FORMAT(s.work_time, '%c'), ':', s.shift order by s.work_time SEPARATOR ';') month_str
        FROM performance_shift s
        LEFT JOIN user u on u.id = s.user_id
        where s.shift is not NULL
        and s.shift != ''
        <if test="time != null and time != ''">
            and DATE_FORMAT(s.work_time, '%Y') = DATE_FORMAT(#{time}, '%Y' )
        </if>
        <if test="userName != null and userName != ''">
            and u.name like concat('%', #{userName}, '%')
        </if>
        <if test="laboratory != null and laboratory != ''">
        </if>
        GROUP BY u.id
        order by s.create_time
    </select>
    <select id="performanceShiftList" resultMap="performanceShiftPageMap">
        SELECT
        if(u.department is not null and u.department != '', CONCAT(u.name, '(', u.department, ')'), u.name) name,
        GROUP_CONCAT(s.work_time, ':', s.shift, ':', s.id order by s.work_time SEPARATOR ';') AS shift_time, u.id user_id, u.department
        FROM performance_shift s
        LEFT JOIN user u on u.id = s.user_id
        <where>
            <if test="time != null and time != ''">
                and DATE_FORMAT(s.work_time, '%Y-%m') = DATE_FORMAT(#{time}, '%Y-%m' )
            </if>
            <if test="userName != null and userName != ''">
                and u.name like concat('%', #{userName}, '%')
            </if>
            <if test="laboratory != null and laboratory != ''">
            </if>
        </where>
        order by s.create_time
        GROUP BY u.id
    </select>
    <select id="seldepLimsId" resultType="java.lang.String">
        select name
        from department_lims
        where id = #{depLimsId}
    </select>
</mapper>
performance-server/src/main/resources/mapper/ShiftTimeMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
<?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.ruoyi.performance.mapper.ShiftTimeMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.performance.pojo.ShiftTime">
        <id column="id" property="id" />
        <result column="shift" property="shift" />
        <result column="start_time" property="startTime" />
        <result column="end_time" property="endTime" />
        <result column="create_user" property="createUser" />
        <result column="create_time" property="createTime" />
        <result column="update_user" property="updateUser" />
        <result column="update_time" property="updateTime" />
    </resultMap>
</mapper>
pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,385 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ruoyi</groupId>
    <artifactId>ruoyi</artifactId>
    <version>3.8.9</version>
    <name>ruoyi</name>
    <url>http://www.ruoyi.vip</url>
    <description>若依管理系统</description>
    <properties>
        <ruoyi.version>3.8.9</ruoyi.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
        <spring-boot.version>2.5.15</spring-boot.version>
        <druid.version>1.2.23</druid.version>
        <bitwalker.version>1.21</bitwalker.version>
        <swagger.version>3.0.0</swagger.version>
        <kaptcha.version>2.3.3</kaptcha.version>
        <pagehelper.boot.version>1.4.7</pagehelper.boot.version>
        <fastjson.version>2.0.53</fastjson.version>
        <oshi.version>6.6.5</oshi.version>
        <commons.io.version>2.13.0</commons.io.version>
        <poi.version>4.1.2</poi.version>
        <velocity.version>2.3</velocity.version>
        <jwt.version>0.9.1</jwt.version>
        <!-- override dependency version -->
        <tomcat.version>9.0.96</tomcat.version>
        <logback.version>1.2.13</logback.version>
        <spring-security.version>5.7.12</spring-security.version>
        <spring-framework.version>5.3.39</spring-framework.version>
        <mybatis-plus.version>3.5.3.1</mybatis-plus.version>
        <freemarker.version>2.3.30</freemarker.version>
        <knife4j-spring-ui.version>3.0.3</knife4j-spring-ui.version>
        <core.version>3.4.1</core.version>
        <javase.version>3.4.1</javase.version>
        <minio.version>8.4.3</minio.version>
        <okhttp.version>4.9.0</okhttp.version>
        <hutool.version>5.8.18</hutool.version>
        <easyexcel.version>3.3.2</easyexcel.version>
    </properties>
    <!-- ä¾èµ–声明 -->
    <dependencyManagement>
        <dependencies>
            <!-- è¦†ç›–SpringFramework的依赖配置-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-framework-bom</artifactId>
                <version>${spring-framework.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- è¦†ç›–SpringSecurity的依赖配置-->
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-bom</artifactId>
                <version>${spring-security.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringBoot的依赖配置-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--后端注释检验工具-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-validation</artifactId>
                <version>${spring-boot.version}</version>
            </dependency>
            <!-- è¦†ç›–logback的依赖配置-->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>${logback.version}</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>${logback.version}</version>
            </dependency>
            <!-- è¦†ç›–tomcat的依赖配置-->
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
                <version>${tomcat.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-el</artifactId>
                <version>${tomcat.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-websocket</artifactId>
                <version>${tomcat.version}</version>
            </dependency>
            <!-- é˜¿é‡Œæ•°æ®åº“连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <!-- è§£æžå®¢æˆ·ç«¯æ“ä½œç³»ç»Ÿã€æµè§ˆå™¨ç­‰ -->
            <dependency>
                <groupId>eu.bitwalker</groupId>
                <artifactId>UserAgentUtils</artifactId>
                <version>${bitwalker.version}</version>
            </dependency>
            <!-- pagehelper åˆ†é¡µæ’ä»¶ -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>${pagehelper.boot.version}</version>
            </dependency>
            <!-- èŽ·å–ç³»ç»Ÿä¿¡æ¯ -->
            <dependency>
                <groupId>com.github.oshi</groupId>
                <artifactId>oshi-core</artifactId>
                <version>${oshi.version}</version>
            </dependency>
            <!-- Swagger3依赖 -->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-boot-starter</artifactId>
                <version>${swagger.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>io.swagger</groupId>
                        <artifactId>swagger-models</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!-- io常用工具类 -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>${commons.io.version}</version>
            </dependency>
            <!-- excel工具 -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>${poi.version}</version>
            </dependency>
            <!-- velocity代码生成使用模板 -->
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity-engine-core</artifactId>
                <version>${velocity.version}</version>
            </dependency>
            <!-- é˜¿é‡ŒJSON解析器 -->
            <dependency>
                <groupId>com.alibaba.fastjson2</groupId>
                <artifactId>fastjson2</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
            <!-- Token生成与解析-->
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>${jwt.version}</version>
            </dependency>
            <!-- éªŒè¯ç  -->
            <dependency>
                <groupId>pro.fessional</groupId>
                <artifactId>kaptcha</artifactId>
                <version>${kaptcha.version}</version>
            </dependency>
            <!-- å®šæ—¶ä»»åŠ¡-->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-quartz</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- ä»£ç ç”Ÿæˆ-->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-generator</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- æ ¸å¿ƒæ¨¡å—-->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-framework</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- ç³»ç»Ÿæ¨¡å—-->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-system</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- é€šç”¨å·¥å…·-->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- minio -->
            <dependency>
                <groupId>io.minio</groupId>
                <artifactId>minio</artifactId>
                <version>${minio.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>com.squareup.okhttp3</groupId>
                        <artifactId>okhttp</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!-- minio依赖okhttp ä¸ç„¶æŠ¥é”™ -->
            <dependency>
                <groupId>com.squareup.okhttp3</groupId>
                <artifactId>okhttp</artifactId>
                <version>${okhttp.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!--  å…¨å±€å¼•å…¥  -->
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>${easyexcel.version}</version>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <!--mybatis-plus代码生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>${freemarker.version}</version>
        </dependency>
        <!-- Swagger3依赖 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <!--Swagger3-Ui美化-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-ui</artifactId>
            <version>${knife4j-spring-ui.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>${core.version}</version> <!-- æˆ–者更高版本 -->
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>${javase.version}</version> <!-- æˆ–者更高版本 -->
        </dependency>
        <!--hutool工具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.23</version>
        </dependency>
    </dependencies>
    <modules>
        <module>ruoyi-admin</module>
        <module>ruoyi-framework</module>
        <module>ruoyi-system</module>
        <module>ruoyi-quartz</module>
        <module>ruoyi-generator</module>
        <module>ruoyi-common</module>
        <module>basic-server</module>
        <module>inspect-server</module>
        <module>performance-server</module>
    </modules>
    <packaging>pom</packaging>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
</project>
ruoyi-admin/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ruoyi</artifactId>
        <groupId>com.ruoyi</groupId>
        <version>3.8.9</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
    <artifactId>ruoyi-admin</artifactId>
    <description>
        web服务入口
    </description>
    <dependencies>
        <!-- spring-boot-devtools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional> <!-- è¡¨ç¤ºä¾èµ–不会传递 -->
        </dependency>
        <!-- swagger3-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
        </dependency>
        <!-- é˜²æ­¢è¿›å…¥swagger页面报类型转换错误,排除3.0.0中的引用,手动增加1.6.2版本 -->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-models</artifactId>
            <version>1.6.2</version>
        </dependency>
         <!-- Mysql驱动包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common</artifactId>
        </dependency>
        <!-- æ ¸å¿ƒæ¨¡å—-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-framework</artifactId>
        </dependency>
        <!-- å®šæ—¶ä»»åŠ¡-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-quartz</artifactId>
        </dependency>
        <!-- ä»£ç ç”Ÿæˆ-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-generator</artifactId>
        </dependency>
        <!--基础模块-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>basic-server</artifactId>
            <version>${ruoyi.version}</version>
        </dependency>
        <!--业务模块-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>inspect-server</artifactId>
            <version>${ruoyi.version}</version>
        </dependency>
        <!--绩效模块-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>performance-server</artifactId>
            <version>${ruoyi.version}</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.5.15</version>
                <configuration>
                    <fork>true</fork> <!-- å¦‚果没有该配置,devtools不会生效 -->
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <warName>${project.artifactId}</warName>
                </configuration>
           </plugin>
        </plugins>
        <finalName>${project.artifactId}</finalName>
    </build>
</project>
ruoyi-admin/src/main/java/com/ruoyi/CodeGenerator.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
package com.ruoyi;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
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.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import java.util.Collections;
import java.util.Scanner;
// æ¼”示例子,执行 main æ–¹æ³•控制台输入模块表名回车自动生成对应项目目录中
public class CodeGenerator {
    public static String database_url = "jdbc:mysql://114.132.189.42:9004/lims-zb";
    public static String database_username = "root";
    public static String database_password= "123456";
    public static String author = "芯导软件(江苏)有限公司";
    public static String model_name = "/mes-technical"; // å¦‚果为分布式填子模块名称,如果不是分布式为空即可
    public static String setParent = "com.ruoyi.technical"; // åŒ…路径
    public static String tablePrefix = "technical"; // è®¾ç½®è¿‡æ»¤è¡¨å‰ç¼€
    public static void main(String[] args) {
        String projectPath = System.getProperty("user.dir");
        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() //禁止打开输出目录,默认打开
                            .enableSwagger() // å¼€å¯swagger
                    ;
                })
                // åŒ…配置
                .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(tablePrefix) // è®¾ç½®è¿‡æ»¤è¡¨å‰ç¼€
                            // Entity ç­–略配置
                            .entityBuilder()
                            .enableLombok() //开启 Lombok
                            .naming(NamingStrategy.underline_to_camel)  //数据库表映射到实体的命名策略:下划线转驼峰命
                            .columnNaming(NamingStrategy.underline_to_camel)    //数据库表字段映射到实体的命名策略:下划线转驼峰命
                            .enableFileOverride() // è¦†ç›–已经生成的Entity文件
                            .logicDeleteColumnName("state")
                            .addTableFills(
                                    new Column("create_time", FieldFill.INSERT),
                                    new Column("update_time", FieldFill.INSERT_UPDATE),
                                    new Column("create_user", FieldFill.INSERT),
                                    new Column("update_user", FieldFill.INSERT_UPDATE)
                            )
                            .idType(IdType.AUTO) // è‡ªå¢žä¸»é”®
                            // Mapper ç­–略配置
                            .mapperBuilder()
                            .enableFileOverride() // è¦†ç›–已生成Mapper文件
                            .enableBaseResultMap() // è‡ªåŠ¨ç”ŸæˆresultMap
                            // Service ç­–略配置
                            .serviceBuilder()
                            .formatServiceFileName("%sService") //格式化 service æŽ¥å£æ–‡ä»¶åç§°ï¼Œ%s进行匹配表名,如 UserService
                            .formatServiceImplFileName("%sServiceImpl") //格式化 service å®žçŽ°ç±»æ–‡ä»¶åç§°ï¼Œ%s进行匹配表名,如 UserServiceImpl
                            .enableFileOverride() // è¦†ç›–已生成文件
                            // Controller ç­–略配置
                            .controllerBuilder()
                            .enableFileOverride() // è¦†ç›–已生成文件
                            .enableRestStyle() // å¼€å¯ç”Ÿæˆ@RestController æŽ§åˆ¶å™¨
                    ;
                })
                //5、模板引擎
                .templateEngine(new FreemarkerTemplateEngine())    //默认
                .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 + "!");
    }
}
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
/**
 * å¯åŠ¨ç¨‹åº
 *
 * @author ruoyi
 */
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class RuoYiApplication
{
    public static void main(String[] args)
    {
        System.setProperty("spring.devtools.restart.enabled", "false");
        SpringApplication.run(RuoYiApplication.class, args);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
 * web容器中进行部署
 *
 * @author ruoyi
 */
public class RuoYiServletInitializer extends SpringBootServletInitializer
{
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
    {
        return application.sources(RuoYiApplication.class);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,94 @@
package com.ruoyi.web.controller.common;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.google.code.kaptcha.Producer;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.sign.Base64;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.system.service.ISysConfigService;
/**
 * éªŒè¯ç æ“ä½œå¤„理
 *
 * @author ruoyi
 */
@RestController
public class CaptchaController
{
    @Resource(name = "captchaProducer")
    private Producer captchaProducer;
    @Resource(name = "captchaProducerMath")
    private Producer captchaProducerMath;
    @Autowired
    private RedisCache redisCache;
    @Autowired
    private ISysConfigService configService;
    /**
     * ç”ŸæˆéªŒè¯ç 
     */
    @GetMapping("/captchaImage")
    public AjaxResult getCode(HttpServletResponse response) throws IOException
    {
        AjaxResult ajax = AjaxResult.success();
        boolean captchaEnabled = configService.selectCaptchaEnabled();
        ajax.put("captchaEnabled", captchaEnabled);
        if (!captchaEnabled)
        {
            return ajax;
        }
        // ä¿å­˜éªŒè¯ç ä¿¡æ¯
        String uuid = IdUtils.simpleUUID();
        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
        String capStr = null, code = null;
        BufferedImage image = null;
        // ç”ŸæˆéªŒè¯ç 
        String captchaType = RuoYiConfig.getCaptchaType();
        if ("math".equals(captchaType))
        {
            String capText = captchaProducerMath.createText();
            capStr = capText.substring(0, capText.lastIndexOf("@"));
            code = capText.substring(capText.lastIndexOf("@") + 1);
            image = captchaProducerMath.createImage(capStr);
        }
        else if ("char".equals(captchaType))
        {
            capStr = code = captchaProducer.createText();
            image = captchaProducer.createImage(capStr);
        }
        redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
        // è½¬æ¢æµä¿¡æ¯å†™å‡º
        FastByteArrayOutputStream os = new FastByteArrayOutputStream();
        try
        {
            ImageIO.write(image, "jpg", os);
        }
        catch (IOException e)
        {
            return AjaxResult.error(e.getMessage());
        }
        ajax.put("uuid", uuid);
        ajax.put("img", Base64.encode(os.toByteArray()));
        return ajax;
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,163 @@
package com.ruoyi.web.controller.common;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.framework.config.ServerConfig;
/**
 * é€šç”¨è¯·æ±‚处理
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/common")
public class CommonController
{
    private static final Logger log = LoggerFactory.getLogger(CommonController.class);
    @Autowired
    private ServerConfig serverConfig;
    private static final String FILE_DELIMETER = ",";
    /**
     * é€šç”¨ä¸‹è½½è¯·æ±‚
     *
     * @param fileName æ–‡ä»¶åç§°
     * @param delete æ˜¯å¦åˆ é™¤
     */
    @GetMapping("/download")
    public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
    {
        try
        {
            if (!FileUtils.checkAllowDownload(fileName))
            {
                throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
            }
            String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
            String filePath = RuoYiConfig.getDownloadPath() + fileName;
            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            FileUtils.setAttachmentResponseHeader(response, realFileName);
            FileUtils.writeBytes(filePath, response.getOutputStream());
            if (delete)
            {
                FileUtils.deleteFile(filePath);
            }
        }
        catch (Exception e)
        {
            log.error("下载文件失败", e);
        }
    }
    /**
     * é€šç”¨ä¸Šä¼ è¯·æ±‚(单个)
     */
    @PostMapping("/upload")
    public AjaxResult uploadFile(MultipartFile file) throws Exception
    {
        try
        {
            // ä¸Šä¼ æ–‡ä»¶è·¯å¾„
            String filePath = RuoYiConfig.getUploadPath();
            // ä¸Šä¼ å¹¶è¿”回新文件名称
            String fileName = FileUploadUtils.upload(filePath, file);
            String url = serverConfig.getUrl() + fileName;
            AjaxResult ajax = AjaxResult.success();
            ajax.put("url", url);
            ajax.put("fileName", fileName);
            ajax.put("newFileName", FileUtils.getName(fileName));
            ajax.put("originalFilename", file.getOriginalFilename());
            return ajax;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }
    /**
     * é€šç”¨ä¸Šä¼ è¯·æ±‚(多个)
     */
    @PostMapping("/uploads")
    public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception
    {
        try
        {
            // ä¸Šä¼ æ–‡ä»¶è·¯å¾„
            String filePath = RuoYiConfig.getUploadPath();
            List<String> urls = new ArrayList<String>();
            List<String> fileNames = new ArrayList<String>();
            List<String> newFileNames = new ArrayList<String>();
            List<String> originalFilenames = new ArrayList<String>();
            for (MultipartFile file : files)
            {
                // ä¸Šä¼ å¹¶è¿”回新文件名称
                String fileName = FileUploadUtils.upload(filePath, file);
                String url = serverConfig.getUrl() + fileName;
                urls.add(url);
                fileNames.add(fileName);
                newFileNames.add(FileUtils.getName(fileName));
                originalFilenames.add(file.getOriginalFilename());
            }
            AjaxResult ajax = AjaxResult.success();
            ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));
            ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
            ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER));
            ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER));
            return ajax;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }
    /**
     * æœ¬åœ°èµ„源通用下载
     */
    @GetMapping("/download/resource")
    public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
            throws Exception
    {
        try
        {
            if (!FileUtils.checkAllowDownload(resource))
            {
                throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
            }
            // æœ¬åœ°èµ„源路径
            String localPath = RuoYiConfig.getProfile();
            // æ•°æ®åº“资源地址
            String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
            // ä¸‹è½½åç§°
            String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            FileUtils.setAttachmentResponseHeader(response, downloadName);
            FileUtils.writeBytes(downloadPath, response.getOutputStream());
        }
        catch (Exception e)
        {
            log.error("下载文件失败", e);
        }
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
package com.ruoyi.web.controller.monitor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysCache;
/**
 * ç¼“存监控
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/monitor/cache")
public class CacheController
{
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    private final static List<SysCache> caches = new ArrayList<SysCache>();
    {
        caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息"));
        caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息"));
        caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典"));
        caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码"));
        caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交"));
        caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理"));
        caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数"));
    }
    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
    @GetMapping()
    public AjaxResult getInfo() throws Exception
    {
        Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info());
        Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
        Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize());
        Map<String, Object> result = new HashMap<>(3);
        result.put("info", info);
        result.put("dbSize", dbSize);
        List<Map<String, String>> pieList = new ArrayList<>();
        commandStats.stringPropertyNames().forEach(key -> {
            Map<String, String> data = new HashMap<>(2);
            String property = commandStats.getProperty(key);
            data.put("name", StringUtils.removeStart(key, "cmdstat_"));
            data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
            pieList.add(data);
        });
        result.put("commandStats", pieList);
        return AjaxResult.success(result);
    }
    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
    @GetMapping("/getNames")
    public AjaxResult cache()
    {
        return AjaxResult.success(caches);
    }
    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
    @GetMapping("/getKeys/{cacheName}")
    public AjaxResult getCacheKeys(@PathVariable String cacheName)
    {
        Set<String> cacheKeys = redisTemplate.keys(cacheName + "*");
        return AjaxResult.success(new TreeSet<>(cacheKeys));
    }
    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
    @GetMapping("/getValue/{cacheName}/{cacheKey}")
    public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey)
    {
        String cacheValue = redisTemplate.opsForValue().get(cacheKey);
        SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue);
        return AjaxResult.success(sysCache);
    }
    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
    @DeleteMapping("/clearCacheName/{cacheName}")
    public AjaxResult clearCacheName(@PathVariable String cacheName)
    {
        Collection<String> cacheKeys = redisTemplate.keys(cacheName + "*");
        redisTemplate.delete(cacheKeys);
        return AjaxResult.success();
    }
    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
    @DeleteMapping("/clearCacheKey/{cacheKey}")
    public AjaxResult clearCacheKey(@PathVariable String cacheKey)
    {
        redisTemplate.delete(cacheKey);
        return AjaxResult.success();
    }
    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
    @DeleteMapping("/clearCacheAll")
    public AjaxResult clearCacheAll()
    {
        Collection<String> cacheKeys = redisTemplate.keys("*");
        redisTemplate.delete(cacheKeys);
        return AjaxResult.success();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.web.controller.monitor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.framework.web.domain.Server;
/**
 * æœåŠ¡å™¨ç›‘æŽ§
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/monitor/server")
public class ServerController
{
    @PreAuthorize("@ss.hasPermi('monitor:server:list')")
    @GetMapping()
    public AjaxResult getInfo() throws Exception
    {
        Server server = new Server();
        server.copyTo();
        return AjaxResult.success(server);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.ruoyi.web.controller.monitor;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.service.SysPasswordService;
import com.ruoyi.system.domain.SysLogininfor;
import com.ruoyi.system.service.ISysLogininforService;
/**
 * ç³»ç»Ÿè®¿é—®è®°å½•
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/monitor/logininfor")
public class SysLogininforController extends BaseController
{
    @Autowired
    private ISysLogininforService logininforService;
    @Autowired
    private SysPasswordService passwordService;
    @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysLogininfor logininfor)
    {
        startPage();
        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
        return getDataTable(list);
    }
    @Log(title = "登录日志", businessType = BusinessType.EXPORT)
    @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysLogininfor logininfor)
    {
        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
        ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class);
        util.exportExcel(response, list, "登录日志");
    }
    @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
    @Log(title = "登录日志", businessType = BusinessType.DELETE)
    @DeleteMapping("/{infoIds}")
    public AjaxResult remove(@PathVariable Long[] infoIds)
    {
        return toAjax(logininforService.deleteLogininforByIds(infoIds));
    }
    @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
    @Log(title = "登录日志", businessType = BusinessType.CLEAN)
    @DeleteMapping("/clean")
    public AjaxResult clean()
    {
        logininforService.cleanLogininfor();
        return success();
    }
    @PreAuthorize("@ss.hasPermi('monitor:logininfor:unlock')")
    @Log(title = "账户解锁", businessType = BusinessType.OTHER)
    @GetMapping("/unlock/{userName}")
    public AjaxResult unlock(@PathVariable("userName") String userName)
    {
        passwordService.clearLoginRecordCache(userName);
        return success();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.web.controller.monitor;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysOperLog;
import com.ruoyi.system.service.ISysOperLogService;
/**
 * æ“ä½œæ—¥å¿—记录
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/monitor/operlog")
public class SysOperlogController extends BaseController
{
    @Autowired
    private ISysOperLogService operLogService;
    @PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysOperLog operLog)
    {
        startPage();
        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
        return getDataTable(list);
    }
    @Log(title = "操作日志", businessType = BusinessType.EXPORT)
    @PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysOperLog operLog)
    {
        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
        ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
        util.exportExcel(response, list, "操作日志");
    }
    @Log(title = "操作日志", businessType = BusinessType.DELETE)
    @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
    @DeleteMapping("/{operIds}")
    public AjaxResult remove(@PathVariable Long[] operIds)
    {
        return toAjax(operLogService.deleteOperLogByIds(operIds));
    }
    @Log(title = "操作日志", businessType = BusinessType.CLEAN)
    @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
    @DeleteMapping("/clean")
    public AjaxResult clean()
    {
        operLogService.cleanOperLog();
        return success();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
package com.ruoyi.web.controller.monitor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.service.ISysUserOnlineService;
/**
 * åœ¨çº¿ç”¨æˆ·ç›‘控
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/monitor/online")
public class SysUserOnlineController extends BaseController
{
    @Autowired
    private ISysUserOnlineService userOnlineService;
    @Autowired
    private RedisCache redisCache;
    @PreAuthorize("@ss.hasPermi('monitor:online:list')")
    @GetMapping("/list")
    public TableDataInfo list(String ipaddr, String userName)
    {
        Collection<String> keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
        List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
        for (String key : keys)
        {
            LoginUser user = redisCache.getCacheObject(key);
            if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName))
            {
                userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user));
            }
            else if (StringUtils.isNotEmpty(ipaddr))
            {
                userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user));
            }
            else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser()))
            {
                userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user));
            }
            else
            {
                userOnlineList.add(userOnlineService.loginUserToUserOnline(user));
            }
        }
        Collections.reverse(userOnlineList);
        userOnlineList.removeAll(Collections.singleton(null));
        return getDataTable(userOnlineList);
    }
    /**
     * å¼ºé€€ç”¨æˆ·
     */
    @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')")
    @Log(title = "在线用户", businessType = BusinessType.FORCE)
    @DeleteMapping("/{tokenId}")
    public AjaxResult forceLogout(@PathVariable String tokenId)
    {
        redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);
        return success();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/CustomController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ruoyi.web.controller.system;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.Custom;
import com.ruoyi.system.service.CustomService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * å®¢æˆ·ç®¡ç†
 *
 * @author zhuo
 * @since 2025-02-13
 */
@Api(tags = "客户管理")
@RestController
@RequestMapping("/system/custom")
public class CustomController {
    @Resource
    private CustomService customService;
    @ApiOperation(value = "获取客户列表")
    @GetMapping("/selectCustomPageList")
    public Result<IPage<Custom>> selectCustomPageList(Page page, Custom custom) throws Exception {
        return Result.success(customService.selectCustomPageList(page, custom));
    }
    @ApiOperation(value = "删除客户信息")
    @PostMapping("/delCustomById")
    public Result delCustomById(Long id) {
        return Result.success(customService.delCustomById(id));
    }
    @ApiOperation(value = "新增客户信息")
    @PostMapping("/addCustom")
    public Result addCustom(@RequestBody Custom custom) {
        return Result.success(customService.addCustom(custom));
    }
    @ApiOperation(value = "修改客户信息")
    @PostMapping("/upCustom")
    public Result upCustom(@RequestBody Custom custom) {
        return Result.success(customService.upCustom(custom));
    }
    @ApiOperation(value = "获取客户枚举")
    @GetMapping ("/selectCustomEnum")
    public Result<List<Custom>> selectCustomEnum(){
        return Result.success(customService.selectCustomEnum());
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,133 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.service.ISysConfigService;
/**
 * å‚数配置 ä¿¡æ¯æ“ä½œå¤„理
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/config")
public class SysConfigController extends BaseController
{
    @Autowired
    private ISysConfigService configService;
    /**
     * èŽ·å–å‚æ•°é…ç½®åˆ—è¡¨
     */
    @PreAuthorize("@ss.hasPermi('system:config:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysConfig config)
    {
        startPage();
        List<SysConfig> list = configService.selectConfigList(config);
        return getDataTable(list);
    }
    @Log(title = "参数管理", businessType = BusinessType.EXPORT)
    @PreAuthorize("@ss.hasPermi('system:config:export')")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysConfig config)
    {
        List<SysConfig> list = configService.selectConfigList(config);
        ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
        util.exportExcel(response, list, "参数数据");
    }
    /**
     * æ ¹æ®å‚数编号获取详细信息
     */
    @PreAuthorize("@ss.hasPermi('system:config:query')")
    @GetMapping(value = "/{configId}")
    public AjaxResult getInfo(@PathVariable Long configId)
    {
        return success(configService.selectConfigById(configId));
    }
    /**
     * æ ¹æ®å‚数键名查询参数值
     */
    @GetMapping(value = "/configKey/{configKey}")
    public AjaxResult getConfigKey(@PathVariable String configKey)
    {
        return success(configService.selectConfigByKey(configKey));
    }
    /**
     * æ–°å¢žå‚数配置
     */
    @PreAuthorize("@ss.hasPermi('system:config:add')")
    @Log(title = "参数管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysConfig config)
    {
        if (!configService.checkConfigKeyUnique(config))
        {
            return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
        }
        config.setCreateBy(getUsername());
        return toAjax(configService.insertConfig(config));
    }
    /**
     * ä¿®æ”¹å‚数配置
     */
    @PreAuthorize("@ss.hasPermi('system:config:edit')")
    @Log(title = "参数管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysConfig config)
    {
        if (!configService.checkConfigKeyUnique(config))
        {
            return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
        }
        config.setUpdateBy(getUsername());
        return toAjax(configService.updateConfig(config));
    }
    /**
     * åˆ é™¤å‚数配置
     */
    @PreAuthorize("@ss.hasPermi('system:config:remove')")
    @Log(title = "参数管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{configIds}")
    public AjaxResult remove(@PathVariable Long[] configIds)
    {
        configService.deleteConfigByIds(configIds);
        return success();
    }
    /**
     * åˆ·æ–°å‚数缓存
     */
    @PreAuthorize("@ss.hasPermi('system:config:remove')")
    @Log(title = "参数管理", businessType = BusinessType.CLEAN)
    @DeleteMapping("/refreshCache")
    public AjaxResult refreshCache()
    {
        configService.resetConfigCache();
        return success();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysDeptService;
/**
 * éƒ¨é—¨ä¿¡æ¯
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/dept")
public class SysDeptController extends BaseController
{
    @Autowired
    private ISysDeptService deptService;
    /**
     * èŽ·å–éƒ¨é—¨åˆ—è¡¨
     */
    @PreAuthorize("@ss.hasPermi('system:dept:list')")
    @GetMapping("/list")
    public AjaxResult list(SysDept dept)
    {
        List<SysDept> depts = deptService.selectDeptList(dept);
        return success(depts);
    }
    /**
     * æŸ¥è¯¢éƒ¨é—¨åˆ—表(排除节点)
     */
    @PreAuthorize("@ss.hasPermi('system:dept:list')")
    @GetMapping("/list/exclude/{deptId}")
    public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
    {
        List<SysDept> depts = deptService.selectDeptList(new SysDept());
        depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
        return success(depts);
    }
    /**
     * æ ¹æ®éƒ¨é—¨ç¼–号获取详细信息
     */
    @PreAuthorize("@ss.hasPermi('system:dept:query')")
    @GetMapping(value = "/{deptId}")
    public AjaxResult getInfo(@PathVariable Long deptId)
    {
        deptService.checkDeptDataScope(deptId);
        return success(deptService.selectDeptById(deptId));
    }
    /**
     * æ–°å¢žéƒ¨é—¨
     */
    @PreAuthorize("@ss.hasPermi('system:dept:add')")
    @Log(title = "部门管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysDept dept)
    {
        if (!deptService.checkDeptNameUnique(dept))
        {
            return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
        }
        dept.setCreateBy(getUsername());
        return toAjax(deptService.insertDept(dept));
    }
    /**
     * ä¿®æ”¹éƒ¨é—¨
     */
    @PreAuthorize("@ss.hasPermi('system:dept:edit')")
    @Log(title = "部门管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysDept dept)
    {
        Long deptId = dept.getDeptId();
        deptService.checkDeptDataScope(deptId);
        if (!deptService.checkDeptNameUnique(dept))
        {
            return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
        }
        else if (dept.getParentId().equals(deptId))
        {
            return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
        }
        else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0)
        {
            return error("该部门包含未停用的子部门!");
        }
        dept.setUpdateBy(getUsername());
        return toAjax(deptService.updateDept(dept));
    }
    /**
     * åˆ é™¤éƒ¨é—¨
     */
    @PreAuthorize("@ss.hasPermi('system:dept:remove')")
    @Log(title = "部门管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{deptId}")
    public AjaxResult remove(@PathVariable Long deptId)
    {
        if (deptService.hasChildByDeptId(deptId))
        {
            return warn("存在下级部门,不允许删除");
        }
        if (deptService.checkDeptExistUser(deptId))
        {
            return warn("部门存在用户,不允许删除");
        }
        deptService.checkDeptDataScope(deptId);
        return toAjax(deptService.deleteDeptById(deptId));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
package com.ruoyi.web.controller.system;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.system.service.ISysDictTypeService;
/**
 * æ•°æ®å­—典信息
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/dict/data")
public class SysDictDataController extends BaseController
{
    @Autowired
    private ISysDictDataService dictDataService;
    @Autowired
    private ISysDictTypeService dictTypeService;
    @PreAuthorize("@ss.hasPermi('system:dict:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysDictData dictData)
    {
        startPage();
        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
        return getDataTable(list);
    }
    @Log(title = "字典数据", businessType = BusinessType.EXPORT)
    @PreAuthorize("@ss.hasPermi('system:dict:export')")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysDictData dictData)
    {
        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
        ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class);
        util.exportExcel(response, list, "字典数据");
    }
    /**
     * æŸ¥è¯¢å­—典数据详细
     */
    @PreAuthorize("@ss.hasPermi('system:dict:query')")
    @GetMapping(value = "/{dictCode}")
    public AjaxResult getInfo(@PathVariable Long dictCode)
    {
        return success(dictDataService.selectDictDataById(dictCode));
    }
    /**
     * æ ¹æ®å­—典类型查询字典数据信息
     */
    @GetMapping(value = "/type/{dictType}")
    public AjaxResult dictType(@PathVariable String dictType)
    {
        List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
        if (StringUtils.isNull(data))
        {
            data = new ArrayList<SysDictData>();
        }
        return success(data);
    }
    /**
     * æ–°å¢žå­—典类型
     */
    @PreAuthorize("@ss.hasPermi('system:dict:add')")
    @Log(title = "字典数据", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysDictData dict)
    {
        dict.setCreateBy(getUsername());
        return toAjax(dictDataService.insertDictData(dict));
    }
    /**
     * ä¿®æ”¹ä¿å­˜å­—典类型
     */
    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
    @Log(title = "字典数据", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysDictData dict)
    {
        dict.setUpdateBy(getUsername());
        return toAjax(dictDataService.updateDictData(dict));
    }
    /**
     * åˆ é™¤å­—典类型
     */
    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
    @Log(title = "字典类型", businessType = BusinessType.DELETE)
    @DeleteMapping("/{dictCodes}")
    public AjaxResult remove(@PathVariable Long[] dictCodes)
    {
        dictDataService.deleteDictDataByIds(dictCodes);
        return success();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDictType;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDictTypeService;
/**
 * æ•°æ®å­—典信息
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/dict/type")
public class SysDictTypeController extends BaseController
{
    @Autowired
    private ISysDictTypeService dictTypeService;
    @PreAuthorize("@ss.hasPermi('system:dict:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysDictType dictType)
    {
        startPage();
        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
        return getDataTable(list);
    }
    @Log(title = "字典类型", businessType = BusinessType.EXPORT)
    @PreAuthorize("@ss.hasPermi('system:dict:export')")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysDictType dictType)
    {
        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
        ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class);
        util.exportExcel(response, list, "字典类型");
    }
    /**
     * æŸ¥è¯¢å­—典类型详细
     */
    @PreAuthorize("@ss.hasPermi('system:dict:query')")
    @GetMapping(value = "/{dictId}")
    public AjaxResult getInfo(@PathVariable Long dictId)
    {
        return success(dictTypeService.selectDictTypeById(dictId));
    }
    /**
     * æ–°å¢žå­—典类型
     */
    @PreAuthorize("@ss.hasPermi('system:dict:add')")
    @Log(title = "字典类型", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysDictType dict)
    {
        if (!dictTypeService.checkDictTypeUnique(dict))
        {
            return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
        }
        dict.setCreateBy(getUsername());
        return toAjax(dictTypeService.insertDictType(dict));
    }
    /**
     * ä¿®æ”¹å­—典类型
     */
    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
    @Log(title = "字典类型", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysDictType dict)
    {
        if (!dictTypeService.checkDictTypeUnique(dict))
        {
            return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
        }
        dict.setUpdateBy(getUsername());
        return toAjax(dictTypeService.updateDictType(dict));
    }
    /**
     * åˆ é™¤å­—典类型
     */
    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
    @Log(title = "字典类型", businessType = BusinessType.DELETE)
    @DeleteMapping("/{dictIds}")
    public AjaxResult remove(@PathVariable Long[] dictIds)
    {
        dictTypeService.deleteDictTypeByIds(dictIds);
        return success();
    }
    /**
     * åˆ·æ–°å­—典缓存
     */
    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
    @Log(title = "字典类型", businessType = BusinessType.CLEAN)
    @DeleteMapping("/refreshCache")
    public AjaxResult refreshCache()
    {
        dictTypeService.resetDictCache();
        return success();
    }
    /**
     * èŽ·å–å­—å…¸é€‰æ‹©æ¡†åˆ—è¡¨
     */
    @GetMapping("/optionselect")
    public AjaxResult optionselect()
    {
        List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();
        return success(dictTypes);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.web.controller.system;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.utils.StringUtils;
/**
 * é¦–页
 *
 * @author ruoyi
 */
@RestController
public class SysIndexController
{
    /** ç³»ç»ŸåŸºç¡€é…ç½® */
    @Autowired
    private RuoYiConfig ruoyiConfig;
    /**
     * è®¿é—®é¦–页,提示语
     */
    @RequestMapping("/")
    public String index()
    {
        return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion());
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.service.ISysMenuService;
/**
 * ç™»å½•验证
 *
 * @author ruoyi
 */
@RestController
public class SysLoginController
{
    @Autowired
    private SysLoginService loginService;
    @Autowired
    private ISysMenuService menuService;
    @Autowired
    private SysPermissionService permissionService;
    @Autowired
    private TokenService tokenService;
    /**
     * ç™»å½•方法
     *
     * @param loginBody ç™»å½•信息
     * @return ç»“æžœ
     */
    @PostMapping("/login")
    public AjaxResult login(@RequestBody LoginBody loginBody)
    {
        AjaxResult ajax = AjaxResult.success();
        // ç”Ÿæˆä»¤ç‰Œ
        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
                loginBody.getUuid());
        ajax.put(Constants.TOKEN, token);
        return ajax;
    }
    /**
     * èŽ·å–ç”¨æˆ·ä¿¡æ¯
     *
     * @return ç”¨æˆ·ä¿¡æ¯
     */
    @GetMapping("getInfo")
    public AjaxResult getInfo()
    {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        SysUser user = loginUser.getUser();
        // è§’色集合
        Set<String> roles = permissionService.getRolePermission(user);
        // æƒé™é›†åˆ
        Set<String> permissions = permissionService.getMenuPermission(user);
        if (!loginUser.getPermissions().equals(permissions))
        {
            loginUser.setPermissions(permissions);
            tokenService.refreshToken(loginUser);
        }
        AjaxResult ajax = AjaxResult.success();
        ajax.put("user", user);
        ajax.put("roles", roles);
        ajax.put("permissions", permissions);
        return ajax;
    }
    /**
     * èŽ·å–è·¯ç”±ä¿¡æ¯
     *
     * @return è·¯ç”±ä¿¡æ¯
     */
    @GetMapping("getRouters")
    public AjaxResult getRouters()
    {
        Long userId = SecurityUtils.getUserId();
        List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
        return AjaxResult.success(menuService.buildMenus(menus));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,142 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysMenuService;
/**
 * èœå•信息
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/menu")
public class SysMenuController extends BaseController
{
    @Autowired
    private ISysMenuService menuService;
    /**
     * èŽ·å–èœå•åˆ—è¡¨
     */
    @PreAuthorize("@ss.hasPermi('system:menu:list')")
    @GetMapping("/list")
    public AjaxResult list(SysMenu menu)
    {
        List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
        return success(menus);
    }
    /**
     * æ ¹æ®èœå•编号获取详细信息
     */
    @PreAuthorize("@ss.hasPermi('system:menu:query')")
    @GetMapping(value = "/{menuId}")
    public AjaxResult getInfo(@PathVariable Long menuId)
    {
        return success(menuService.selectMenuById(menuId));
    }
    /**
     * èŽ·å–èœå•ä¸‹æ‹‰æ ‘åˆ—è¡¨
     */
    @GetMapping("/treeselect")
    public AjaxResult treeselect(SysMenu menu)
    {
        List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
        return success(menuService.buildMenuTreeSelect(menus));
    }
    /**
     * åŠ è½½å¯¹åº”è§’è‰²èœå•åˆ—è¡¨æ ‘
     */
    @GetMapping(value = "/roleMenuTreeselect/{roleId}")
    public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
    {
        List<SysMenu> menus = menuService.selectMenuList(getUserId());
        AjaxResult ajax = AjaxResult.success();
        ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));
        ajax.put("menus", menuService.buildMenuTreeSelect(menus));
        return ajax;
    }
    /**
     * æ–°å¢žèœå•
     */
    @PreAuthorize("@ss.hasPermi('system:menu:add')")
    @Log(title = "菜单管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysMenu menu)
    {
        if (!menuService.checkMenuNameUnique(menu))
        {
            return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
        }
        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
        {
            return error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
        }
        menu.setCreateBy(getUsername());
        return toAjax(menuService.insertMenu(menu));
    }
    /**
     * ä¿®æ”¹èœå•
     */
    @PreAuthorize("@ss.hasPermi('system:menu:edit')")
    @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysMenu menu)
    {
        if (!menuService.checkMenuNameUnique(menu))
        {
            return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
        }
        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
        {
            return error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
        }
        else if (menu.getMenuId().equals(menu.getParentId()))
        {
            return error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
        }
        menu.setUpdateBy(getUsername());
        return toAjax(menuService.updateMenu(menu));
    }
    /**
     * åˆ é™¤èœå•
     */
    @PreAuthorize("@ss.hasPermi('system:menu:remove')")
    @Log(title = "菜单管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{menuId}")
    public AjaxResult remove(@PathVariable("menuId") Long menuId)
    {
        if (menuService.hasChildByMenuId(menuId))
        {
            return warn("存在子菜单,不允许删除");
        }
        if (menuService.checkMenuExistRole(menuId))
        {
            return warn("菜单已分配,不允许删除");
        }
        return toAjax(menuService.deleteMenuById(menuId));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.service.ISysNoticeService;
/**
 * å…¬å‘Š ä¿¡æ¯æ“ä½œå¤„ç†
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/notice")
public class SysNoticeController extends BaseController
{
    @Autowired
    private ISysNoticeService noticeService;
    /**
     * èŽ·å–é€šçŸ¥å…¬å‘Šåˆ—è¡¨
     */
    @PreAuthorize("@ss.hasPermi('system:notice:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysNotice notice)
    {
        startPage();
        List<SysNotice> list = noticeService.selectNoticeList(notice);
        return getDataTable(list);
    }
    /**
     * æ ¹æ®é€šçŸ¥å…¬å‘Šç¼–号获取详细信息
     */
    @PreAuthorize("@ss.hasPermi('system:notice:query')")
    @GetMapping(value = "/{noticeId}")
    public AjaxResult getInfo(@PathVariable Long noticeId)
    {
        return success(noticeService.selectNoticeById(noticeId));
    }
    /**
     * æ–°å¢žé€šçŸ¥å…¬å‘Š
     */
    @PreAuthorize("@ss.hasPermi('system:notice:add')")
    @Log(title = "通知公告", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysNotice notice)
    {
        notice.setCreateBy(getUsername());
        return toAjax(noticeService.insertNotice(notice));
    }
    /**
     * ä¿®æ”¹é€šçŸ¥å…¬å‘Š
     */
    @PreAuthorize("@ss.hasPermi('system:notice:edit')")
    @Log(title = "通知公告", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysNotice notice)
    {
        notice.setUpdateBy(getUsername());
        return toAjax(noticeService.updateNotice(notice));
    }
    /**
     * åˆ é™¤é€šçŸ¥å…¬å‘Š
     */
    @PreAuthorize("@ss.hasPermi('system:notice:remove')")
    @Log(title = "通知公告", businessType = BusinessType.DELETE)
    @DeleteMapping("/{noticeIds}")
    public AjaxResult remove(@PathVariable Long[] noticeIds)
    {
        return toAjax(noticeService.deleteNoticeByIds(noticeIds));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,129 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.service.ISysPostService;
/**
 * å²—位信息操作处理
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/post")
public class SysPostController extends BaseController
{
    @Autowired
    private ISysPostService postService;
    /**
     * èŽ·å–å²—ä½åˆ—è¡¨
     */
    @PreAuthorize("@ss.hasPermi('system:post:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysPost post)
    {
        startPage();
        List<SysPost> list = postService.selectPostList(post);
        return getDataTable(list);
    }
    @Log(title = "岗位管理", businessType = BusinessType.EXPORT)
    @PreAuthorize("@ss.hasPermi('system:post:export')")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysPost post)
    {
        List<SysPost> list = postService.selectPostList(post);
        ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class);
        util.exportExcel(response, list, "岗位数据");
    }
    /**
     * æ ¹æ®å²—位编号获取详细信息
     */
    @PreAuthorize("@ss.hasPermi('system:post:query')")
    @GetMapping(value = "/{postId}")
    public AjaxResult getInfo(@PathVariable Long postId)
    {
        return success(postService.selectPostById(postId));
    }
    /**
     * æ–°å¢žå²—位
     */
    @PreAuthorize("@ss.hasPermi('system:post:add')")
    @Log(title = "岗位管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysPost post)
    {
        if (!postService.checkPostNameUnique(post))
        {
            return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
        }
        else if (!postService.checkPostCodeUnique(post))
        {
            return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
        }
        post.setCreateBy(getUsername());
        return toAjax(postService.insertPost(post));
    }
    /**
     * ä¿®æ”¹å²—位
     */
    @PreAuthorize("@ss.hasPermi('system:post:edit')")
    @Log(title = "岗位管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysPost post)
    {
        if (!postService.checkPostNameUnique(post))
        {
            return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
        }
        else if (!postService.checkPostCodeUnique(post))
        {
            return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
        }
        post.setUpdateBy(getUsername());
        return toAjax(postService.updatePost(post));
    }
    /**
     * åˆ é™¤å²—位
     */
    @PreAuthorize("@ss.hasPermi('system:post:remove')")
    @Log(title = "岗位管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{postIds}")
    public AjaxResult remove(@PathVariable Long[] postIds)
    {
        return toAjax(postService.deletePostByIds(postIds));
    }
    /**
     * èŽ·å–å²—ä½é€‰æ‹©æ¡†åˆ—è¡¨
     */
    @GetMapping("/optionselect")
    public AjaxResult optionselect()
    {
        List<SysPost> posts = postService.selectPostAll();
        return success(posts);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,140 @@
package com.ruoyi.web.controller.system;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.service.ISysUserService;
/**
 * ä¸ªäººä¿¡æ¯ ä¸šåŠ¡å¤„ç†
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/user/profile")
public class SysProfileController extends BaseController
{
    @Autowired
    private ISysUserService userService;
    @Autowired
    private TokenService tokenService;
    /**
     * ä¸ªäººä¿¡æ¯
     */
    @GetMapping
    public AjaxResult profile()
    {
        LoginUser loginUser = getLoginUser();
        SysUser user = loginUser.getUser();
        AjaxResult ajax = AjaxResult.success(user);
        ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
        ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
        return ajax;
    }
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult updateProfile(@RequestBody SysUser user)
    {
        LoginUser loginUser = getLoginUser();
        SysUser currentUser = loginUser.getUser();
        currentUser.setNickName(user.getNickName());
        currentUser.setEmail(user.getEmail());
        currentUser.setPhonenumber(user.getPhonenumber());
        currentUser.setSex(user.getSex());
        if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser))
        {
            return error("修改用户'" + loginUser.getUsername() + "'失败,手机号码已存在");
        }
        if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser))
        {
            return error("修改用户'" + loginUser.getUsername() + "'失败,邮箱账号已存在");
        }
        if (userService.updateUserProfile(currentUser) > 0)
        {
            // æ›´æ–°ç¼“存用户信息
            tokenService.setLoginUser(loginUser);
            return success();
        }
        return error("修改个人信息异常,请联系管理员");
    }
    /**
     * é‡ç½®å¯†ç 
     */
    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
    @PutMapping("/updatePwd")
    public AjaxResult updatePwd(@RequestBody Map<String, String> params)
    {
        String oldPassword = params.get("oldPassword");
        String newPassword = params.get("newPassword");
        LoginUser loginUser = getLoginUser();
        String userName = loginUser.getUsername();
        String password = loginUser.getPassword();
        if (!SecurityUtils.matchesPassword(oldPassword, password))
        {
            return error("修改密码失败,旧密码错误");
        }
        if (SecurityUtils.matchesPassword(newPassword, password))
        {
            return error("新密码不能与旧密码相同");
        }
        newPassword = SecurityUtils.encryptPassword(newPassword);
        if (userService.resetUserPwd(userName, newPassword) > 0)
        {
            // æ›´æ–°ç¼“存用户密码
            loginUser.getUser().setPassword(newPassword);
            tokenService.setLoginUser(loginUser);
            return success();
        }
        return error("修改密码异常,请联系管理员");
    }
    /**
     * å¤´åƒä¸Šä¼ 
     */
    @Log(title = "用户头像", businessType = BusinessType.UPDATE)
    @PostMapping("/avatar")
    public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception
    {
        if (!file.isEmpty())
        {
            LoginUser loginUser = getLoginUser();
            String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION);
            if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
            {
                AjaxResult ajax = AjaxResult.success();
                ajax.put("imgUrl", avatar);
                // æ›´æ–°ç¼“存用户头像
                loginUser.getUser().setAvatar(avatar);
                tokenService.setLoginUser(loginUser);
                return ajax;
            }
        }
        return error("上传图片异常,请联系管理员");
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.ruoyi.web.controller.system;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.RegisterBody;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.SysRegisterService;
import com.ruoyi.system.service.ISysConfigService;
/**
 * æ³¨å†ŒéªŒè¯
 *
 * @author ruoyi
 */
@RestController
public class SysRegisterController extends BaseController
{
    @Autowired
    private SysRegisterService registerService;
    @Autowired
    private ISysConfigService configService;
    @PostMapping("/register")
    public AjaxResult register(@RequestBody RegisterBody user)
    {
        if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
        {
            return error("当前系统没有开启注册功能!");
        }
        String msg = registerService.register(user);
        return StringUtils.isEmpty(msg) ? success() : error(msg);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,262 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
/**
 * è§’色信息
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/role")
public class SysRoleController extends BaseController
{
    @Autowired
    private ISysRoleService roleService;
    @Autowired
    private TokenService tokenService;
    @Autowired
    private SysPermissionService permissionService;
    @Autowired
    private ISysUserService userService;
    @Autowired
    private ISysDeptService deptService;
    @PreAuthorize("@ss.hasPermi('system:role:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysRole role)
    {
        startPage();
        List<SysRole> list = roleService.selectRoleList(role);
        return getDataTable(list);
    }
    @Log(title = "角色管理", businessType = BusinessType.EXPORT)
    @PreAuthorize("@ss.hasPermi('system:role:export')")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysRole role)
    {
        List<SysRole> list = roleService.selectRoleList(role);
        ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
        util.exportExcel(response, list, "角色数据");
    }
    /**
     * æ ¹æ®è§’色编号获取详细信息
     */
    @PreAuthorize("@ss.hasPermi('system:role:query')")
    @GetMapping(value = "/{roleId}")
    public AjaxResult getInfo(@PathVariable Long roleId)
    {
        roleService.checkRoleDataScope(roleId);
        return success(roleService.selectRoleById(roleId));
    }
    /**
     * æ–°å¢žè§’色
     */
    @PreAuthorize("@ss.hasPermi('system:role:add')")
    @Log(title = "角色管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysRole role)
    {
        if (!roleService.checkRoleNameUnique(role))
        {
            return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
        }
        else if (!roleService.checkRoleKeyUnique(role))
        {
            return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
        }
        role.setCreateBy(getUsername());
        return toAjax(roleService.insertRole(role));
    }
    /**
     * ä¿®æ”¹ä¿å­˜è§’色
     */
    @PreAuthorize("@ss.hasPermi('system:role:edit')")
    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysRole role)
    {
        roleService.checkRoleAllowed(role);
        roleService.checkRoleDataScope(role.getRoleId());
        if (!roleService.checkRoleNameUnique(role))
        {
            return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
        }
        else if (!roleService.checkRoleKeyUnique(role))
        {
            return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
        }
        role.setUpdateBy(getUsername());
        if (roleService.updateRole(role) > 0)
        {
            // æ›´æ–°ç¼“存用户权限
            LoginUser loginUser = getLoginUser();
            if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
            {
                loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
                loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
                tokenService.setLoginUser(loginUser);
            }
            return success();
        }
        return error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
    }
    /**
     * ä¿®æ”¹ä¿å­˜æ•°æ®æƒé™
     */
    @PreAuthorize("@ss.hasPermi('system:role:edit')")
    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
    @PutMapping("/dataScope")
    public AjaxResult dataScope(@RequestBody SysRole role)
    {
        roleService.checkRoleAllowed(role);
        roleService.checkRoleDataScope(role.getRoleId());
        return toAjax(roleService.authDataScope(role));
    }
    /**
     * çŠ¶æ€ä¿®æ”¹
     */
    @PreAuthorize("@ss.hasPermi('system:role:edit')")
    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
    @PutMapping("/changeStatus")
    public AjaxResult changeStatus(@RequestBody SysRole role)
    {
        roleService.checkRoleAllowed(role);
        roleService.checkRoleDataScope(role.getRoleId());
        role.setUpdateBy(getUsername());
        return toAjax(roleService.updateRoleStatus(role));
    }
    /**
     * åˆ é™¤è§’色
     */
    @PreAuthorize("@ss.hasPermi('system:role:remove')")
    @Log(title = "角色管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{roleIds}")
    public AjaxResult remove(@PathVariable Long[] roleIds)
    {
        return toAjax(roleService.deleteRoleByIds(roleIds));
    }
    /**
     * èŽ·å–è§’è‰²é€‰æ‹©æ¡†åˆ—è¡¨
     */
    @PreAuthorize("@ss.hasPermi('system:role:query')")
    @GetMapping("/optionselect")
    public AjaxResult optionselect()
    {
        return success(roleService.selectRoleAll());
    }
    /**
     * æŸ¥è¯¢å·²åˆ†é…ç”¨æˆ·è§’色列表
     */
    @PreAuthorize("@ss.hasPermi('system:role:list')")
    @GetMapping("/authUser/allocatedList")
    public TableDataInfo allocatedList(SysUser user)
    {
        startPage();
        List<SysUser> list = userService.selectAllocatedList(user);
        return getDataTable(list);
    }
    /**
     * æŸ¥è¯¢æœªåˆ†é…ç”¨æˆ·è§’色列表
     */
    @PreAuthorize("@ss.hasPermi('system:role:list')")
    @GetMapping("/authUser/unallocatedList")
    public TableDataInfo unallocatedList(SysUser user)
    {
        startPage();
        List<SysUser> list = userService.selectUnallocatedList(user);
        return getDataTable(list);
    }
    /**
     * å–消授权用户
     */
    @PreAuthorize("@ss.hasPermi('system:role:edit')")
    @Log(title = "角色管理", businessType = BusinessType.GRANT)
    @PutMapping("/authUser/cancel")
    public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole)
    {
        return toAjax(roleService.deleteAuthUser(userRole));
    }
    /**
     * æ‰¹é‡å–消授权用户
     */
    @PreAuthorize("@ss.hasPermi('system:role:edit')")
    @Log(title = "角色管理", businessType = BusinessType.GRANT)
    @PutMapping("/authUser/cancelAll")
    public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds)
    {
        return toAjax(roleService.deleteAuthUsers(roleId, userIds));
    }
    /**
     * æ‰¹é‡é€‰æ‹©ç”¨æˆ·æŽˆæƒ
     */
    @PreAuthorize("@ss.hasPermi('system:role:edit')")
    @Log(title = "角色管理", businessType = BusinessType.GRANT)
    @PutMapping("/authUser/selectAll")
    public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds)
    {
        roleService.checkRoleDataScope(roleId);
        return toAjax(roleService.insertAuthUsers(roleId, userIds));
    }
    /**
     * èŽ·å–å¯¹åº”è§’è‰²éƒ¨é—¨æ ‘åˆ—è¡¨
     */
    @PreAuthorize("@ss.hasPermi('system:role:query')")
    @GetMapping(value = "/deptTree/{roleId}")
    public AjaxResult deptTree(@PathVariable("roleId") Long roleId)
    {
        AjaxResult ajax = AjaxResult.success();
        ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
        ajax.put("depts", deptService.selectDeptTreeList(new SysDept()));
        return ajax;
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,256 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysPostService;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
/**
 * ç”¨æˆ·ä¿¡æ¯
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/user")
public class SysUserController extends BaseController
{
    @Autowired
    private ISysUserService userService;
    @Autowired
    private ISysRoleService roleService;
    @Autowired
    private ISysDeptService deptService;
    @Autowired
    private ISysPostService postService;
    /**
     * èŽ·å–ç”¨æˆ·åˆ—è¡¨
     */
    @PreAuthorize("@ss.hasPermi('system:user:list')")
    @GetMapping("/list")
    public TableDataInfo list(SysUser user)
    {
        startPage();
        List<SysUser> list = userService.selectUserList(user);
        return getDataTable(list);
    }
    @Log(title = "用户管理", businessType = BusinessType.EXPORT)
    @PreAuthorize("@ss.hasPermi('system:user:export')")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysUser user)
    {
        List<SysUser> list = userService.selectUserList(user);
        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
        util.exportExcel(response, list, "用户数据");
    }
    @Log(title = "用户管理", businessType = BusinessType.IMPORT)
    @PreAuthorize("@ss.hasPermi('system:user:import')")
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
    {
        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
        List<SysUser> userList = util.importExcel(file.getInputStream());
        String operName = getUsername();
        String message = userService.importUser(userList, updateSupport, operName);
        return success(message);
    }
    @PostMapping("/importTemplate")
    public void importTemplate(HttpServletResponse response)
    {
        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
        util.importTemplateExcel(response, "用户数据");
    }
    /**
     * æ ¹æ®ç”¨æˆ·ç¼–号获取详细信息
     */
    @PreAuthorize("@ss.hasPermi('system:user:query')")
    @GetMapping(value = { "/", "/{userId}" })
    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
    {
        AjaxResult ajax = AjaxResult.success();
        if (StringUtils.isNotNull(userId))
        {
            userService.checkUserDataScope(userId);
            SysUser sysUser = userService.selectUserById(userId);
            ajax.put(AjaxResult.DATA_TAG, sysUser);
            ajax.put("postIds", postService.selectPostListByUserId(userId));
            ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
        }
        List<SysRole> roles = roleService.selectRoleAll();
        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
        ajax.put("posts", postService.selectPostAll());
        return ajax;
    }
    /**
     * æ–°å¢žç”¨æˆ·
     */
    @PreAuthorize("@ss.hasPermi('system:user:add')")
    @Log(title = "用户管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysUser user)
    {
        deptService.checkDeptDataScope(user.getDeptId());
        roleService.checkRoleDataScope(user.getRoleIds());
        if (!userService.checkUserNameUnique(user))
        {
            return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
        }
        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
        {
            return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
        }
        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
        {
            return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
        }
        user.setCreateBy(getUsername());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        return toAjax(userService.insertUser(user));
    }
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @PreAuthorize("@ss.hasPermi('system:user:edit')")
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysUser user)
    {
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        deptService.checkDeptDataScope(user.getDeptId());
        roleService.checkRoleDataScope(user.getRoleIds());
        if (!userService.checkUserNameUnique(user))
        {
            return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
        }
        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
        {
            return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
        }
        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
        {
            return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
        }
        user.setUpdateBy(getUsername());
        return toAjax(userService.updateUser(user));
    }
    /**
     * åˆ é™¤ç”¨æˆ·
     */
    @PreAuthorize("@ss.hasPermi('system:user:remove')")
    @Log(title = "用户管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{userIds}")
    public AjaxResult remove(@PathVariable Long[] userIds)
    {
        if (ArrayUtils.contains(userIds, getUserId()))
        {
            return error("当前用户不能删除");
        }
        return toAjax(userService.deleteUserByIds(userIds));
    }
    /**
     * é‡ç½®å¯†ç 
     */
    @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/resetPwd")
    public AjaxResult resetPwd(@RequestBody SysUser user)
    {
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        user.setUpdateBy(getUsername());
        return toAjax(userService.resetPwd(user));
    }
    /**
     * çŠ¶æ€ä¿®æ”¹
     */
    @PreAuthorize("@ss.hasPermi('system:user:edit')")
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/changeStatus")
    public AjaxResult changeStatus(@RequestBody SysUser user)
    {
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        user.setUpdateBy(getUsername());
        return toAjax(userService.updateUserStatus(user));
    }
    /**
     * æ ¹æ®ç”¨æˆ·ç¼–号获取授权角色
     */
    @PreAuthorize("@ss.hasPermi('system:user:query')")
    @GetMapping("/authRole/{userId}")
    public AjaxResult authRole(@PathVariable("userId") Long userId)
    {
        AjaxResult ajax = AjaxResult.success();
        SysUser user = userService.selectUserById(userId);
        List<SysRole> roles = roleService.selectRolesByUserId(userId);
        ajax.put("user", user);
        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
        return ajax;
    }
    /**
     * ç”¨æˆ·æŽˆæƒè§’色
     */
    @PreAuthorize("@ss.hasPermi('system:user:edit')")
    @Log(title = "用户管理", businessType = BusinessType.GRANT)
    @PutMapping("/authRole")
    public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
    {
        userService.checkUserDataScope(userId);
        roleService.checkRoleDataScope(roleIds);
        userService.insertUserAuth(userId, roleIds);
        return success();
    }
    /**
     * èŽ·å–éƒ¨é—¨æ ‘åˆ—è¡¨
     */
    @PreAuthorize("@ss.hasPermi('system:user:list')")
    @GetMapping("/deptTree")
    public AjaxResult deptTree(SysDept dept)
    {
        return success(deptService.selectDeptTreeList(dept));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.web.controller.system;
import com.ruoyi.system.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
 * ç”¨æˆ·ä¿¡æ¯è¡¨
 *
 * @author zhuo
 * @since 2025-02-13
 */
@RestController
@RequestMapping("/system/newUser")
public class UserController {
    @Resource
    private UserService userService;
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,183 @@
package com.ruoyi.web.controller.tool;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.utils.StringUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
/**
 * swagger ç”¨æˆ·æµ‹è¯•方法
 *
 * @author ruoyi
 */
@Api("用户信息管理")
@RestController
@RequestMapping("/test/user")
public class TestController extends BaseController
{
    private final static Map<Integer, UserEntity> users = new LinkedHashMap<Integer, UserEntity>();
    {
        users.put(1, new UserEntity(1, "admin", "admin123", "15888888888"));
        users.put(2, new UserEntity(2, "ry", "admin123", "15666666666"));
    }
    @ApiOperation("获取用户列表")
    @GetMapping("/list")
    public Result<List<UserEntity>> userList()
    {
        List<UserEntity> userList = new ArrayList<UserEntity>(users.values());
        return Result.success(userList);
    }
    @ApiOperation("获取用户详细")
    @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
    @GetMapping("/{userId}")
    public Result<UserEntity> getUser(@PathVariable Integer userId)
    {
        if (!users.isEmpty() && users.containsKey(userId))
        {
            return Result.success(users.get(userId));
        }
        else
        {
            return Result.fail("用户不存在");
        }
    }
    @ApiOperation("新增用户")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class),
        @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class),
        @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class),
        @ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class)
    })
    @PostMapping("/save")
    public Result<String> save(UserEntity user)
    {
        if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
        {
            return Result.fail("用户ID不能为空");
        }
        users.put(user.getUserId(), user);
        return Result.success();
    }
    @ApiOperation("更新用户")
    @PutMapping("/update")
    public Result<String> update(@RequestBody UserEntity user)
    {
        if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
        {
            return Result.fail("用户ID不能为空");
        }
        if (users.isEmpty() || !users.containsKey(user.getUserId()))
        {
            return Result.fail("用户不存在");
        }
        users.remove(user.getUserId());
        users.put(user.getUserId(), user);
        return Result.success();
    }
    @ApiOperation("删除用户信息")
    @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
    @DeleteMapping("/{userId}")
    public Result<String> delete(@PathVariable Integer userId)
    {
        if (!users.isEmpty() && users.containsKey(userId))
        {
            users.remove(userId);
            return Result.success();
        }
        else
        {
            return Result.fail("用户不存在");
        }
    }
}
@ApiModel(value = "UserEntity", description = "用户实体")
class UserEntity
{
    @ApiModelProperty("用户ID")
    private Integer userId;
    @ApiModelProperty("用户名称")
    private String username;
    @ApiModelProperty("用户密码")
    private String password;
    @ApiModelProperty("用户手机")
    private String mobile;
    public UserEntity()
    {
    }
    public UserEntity(Integer userId, String username, String password, String mobile)
    {
        this.userId = userId;
        this.username = username;
        this.password = password;
        this.mobile = mobile;
    }
    public Integer getUserId()
    {
        return userId;
    }
    public void setUserId(Integer userId)
    {
        this.userId = userId;
    }
    public String getUsername()
    {
        return username;
    }
    public void setUsername(String username)
    {
        this.username = username;
    }
    public String getPassword()
    {
        return password;
    }
    public void setPassword(String password)
    {
        this.password = password;
    }
    public String getMobile()
    {
        return mobile;
    }
    public void setMobile(String mobile)
    {
        this.mobile = mobile;
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,120 @@
package com.ruoyi.web.core.config;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.ruoyi.common.config.RuoYiConfig;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.Contact;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.service.SecurityScheme;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
/**
 * Swagger2的接口配置
 *
 * @author ruoyi
 */
@Configuration
public class SwaggerConfig
{
    /** ç³»ç»ŸåŸºç¡€é…ç½® */
    @Autowired
    private RuoYiConfig ruoyiConfig;
    /** æ˜¯å¦å¼€å¯swagger */
    @Value("${swagger.enabled}")
    private boolean enabled;
    /**
     * åˆ›å»ºAPI
     */
    @Bean
    public Docket createRestApi()
    {
        return new Docket(DocumentationType.OAS_30)
                // æ˜¯å¦å¯ç”¨Swagger
                .enable(enabled)
                // ç”¨æ¥åˆ›å»ºè¯¥API的基本信息,展示在文档的页面中(自定义展示的信息)
                .apiInfo(apiInfo())
                // è®¾ç½®å“ªäº›æŽ¥å£æš´éœ²ç»™Swagger展示
                .select()
                // æ‰«ææ‰€æœ‰æœ‰æ³¨è§£çš„api,用这种方式更灵活
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                // æ‰«ææŒ‡å®šåŒ…中的swagger注解
                // .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger"))
                // æ‰«ææ‰€æœ‰ .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build()
                /* è®¾ç½®å®‰å…¨æ¨¡å¼ï¼Œswagger可以设置访问token */
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts());
    }
    /**
     * å®‰å…¨æ¨¡å¼ï¼Œè¿™é‡ŒæŒ‡å®štoken通过Authorization头请求头传递
     */
    private List<SecurityScheme> securitySchemes()
    {
        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
        apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
        return apiKeyList;
    }
    /**
     * å®‰å…¨ä¸Šä¸‹æ–‡
     */
    private List<SecurityContext> securityContexts()
    {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
                        .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;
    }
    /**
     * æ·»åŠ æ‘˜è¦ä¿¡æ¯
     */
    private ApiInfo apiInfo()
    {
        // ç”¨ApiInfoBuilder进行定制
        return new ApiInfoBuilder()
                // è®¾ç½®æ ‡é¢˜
                .title("标题:若依管理系统_接口文档")
                // æè¿°
                .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
                // ä½œè€…信息
                .contact(new Contact(ruoyiConfig.getName(), null, null))
                // ç‰ˆæœ¬
                .version("版本号:" + ruoyiConfig.getVersion())
                .build();
    }
}
ruoyi-admin/src/main/resources/META-INF/spring-devtools.properties
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
restart.include.json=/com.alibaba.fastjson2.*.jar
ruoyi-admin/src/main/resources/application-druid.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
# æ•°æ®æºé…ç½®
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # ä¸»åº“数据源
            master:
#                url: jdbc:mysql://114.132.189.42:9004/lims-ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                url: jdbc:mysql://127.0.0.1:3307/center-lims-test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                username: root
                password: 123456
            # ä»Žåº“数据源
            slave:
                # ä»Žæ•°æ®æºå¼€å…³/默认关闭
                enabled: false
                url:
                username:
                password:
            # åˆå§‹è¿žæŽ¥æ•°
            initialSize: 5
            # æœ€å°è¿žæŽ¥æ± æ•°é‡
            minIdle: 10
            # æœ€å¤§è¿žæŽ¥æ± æ•°é‡
            maxActive: 20
            # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
            maxWait: 60000
            # é…ç½®è¿žæŽ¥è¶…æ—¶æ—¶é—´
            connectTimeout: 30000
            # é…ç½®ç½‘络超时时间
            socketTimeout: 60000
            # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            timeBetweenEvictionRunsMillis: 60000
            # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
            minEvictableIdleTimeMillis: 300000
            # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
            maxEvictableIdleTimeMillis: 900000
            # é…ç½®æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆ
            validationQuery: SELECT 1 FROM DUAL
            testWhileIdle: true
            testOnBorrow: false
            testOnReturn: false
            webStatFilter:
                enabled: true
            statViewServlet:
                enabled: true
                # è®¾ç½®ç™½åå•,不填则允许所有访问
                allow:
                url-pattern: /druid/*
                # æŽ§åˆ¶å°ç®¡ç†ç”¨æˆ·åå’Œå¯†ç 
                login-username: ruoyi
                login-password: 123456
            filter:
                stat:
                    enabled: true
                    # æ…¢SQL记录
                    log-slow-sql: true
                    slow-sql-millis: 1000
                    merge-sql: true
                wall:
                    config:
                        multi-statement-allow: true
minio:
    endpoint: http://114.132.189.42/
    port: 7019
    secure: false
    accessKey: admin
    secretKey: 12345678
    preview-expiry: 24 # é¢„览地址默认24小时
ruoyi-admin/src/main/resources/application.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
# é¡¹ç›®ç›¸å…³é…ç½®
ruoyi:
  # åç§°
  name: RuoYi
  # ç‰ˆæœ¬
  version: 3.8.9
  # ç‰ˆæƒå¹´ä»½
  copyrightYear: 2025
  # æ–‡ä»¶è·¯å¾„ ç¤ºä¾‹ï¼ˆ Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
  profile: D:/ruoyi/uploadPath
  # èŽ·å–ip地址开关
  addressEnabled: false
  # éªŒè¯ç ç±»åž‹ math æ•°å­—计算 char å­—符验证
  captchaType: math
# å¼€å‘环境配置
server:
  # æœåŠ¡å™¨çš„HTTP端口,默认为8080
  port: 8002
  servlet:
    # åº”用的访问路径
    context-path: /
  tomcat:
    # tomcat的URI编码
    uri-encoding: UTF-8
    # è¿žæŽ¥æ•°æ»¡åŽçš„æŽ’队数,默认为100
    accept-count: 1000
    threads:
      # tomcat最大线程数,默认为200
      max: 800
      # Tomcat启动初始化的线程数,默认值10
      min-spare: 100
# æ—¥å¿—配置
logging:
  level:
    com.ruoyi: debug
    org.springframework: warn
# ç”¨æˆ·é…ç½®
user:
  password:
    # å¯†ç æœ€å¤§é”™è¯¯æ¬¡æ•°
    maxRetryCount: 5
    # å¯†ç é”å®šæ—¶é—´ï¼ˆé»˜è®¤10分钟)
    lockTime: 10
# Spring配置
spring:
  # èµ„源信息
  messages:
    # å›½é™…化资源文件路径
    basename: i18n/messages
  profiles:
    active: druid
  # æ–‡ä»¶ä¸Šä¼ 
  servlet:
    multipart:
      # å•个文件大小
      max-file-size: 10MB
      # è®¾ç½®æ€»ä¸Šä¼ çš„æ–‡ä»¶å¤§å°
      max-request-size: 20MB
  # æœåŠ¡æ¨¡å—
  devtools:
    restart:
      # çƒ­éƒ¨ç½²å¼€å…³
      enabled: true
  # redis é…ç½®
  redis:
    # åœ°å€
    host: localhost
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
    database: 0
    # å¯†ç 
    password: 123456
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
    timeout: 10s
    lettuce:
      pool:
        # è¿žæŽ¥æ± ä¸­çš„æœ€å°ç©ºé—²è¿žæŽ¥
        min-idle: 0
        # è¿žæŽ¥æ± ä¸­çš„æœ€å¤§ç©ºé—²è¿žæŽ¥
        max-idle: 8
        # è¿žæŽ¥æ± çš„æœ€å¤§æ•°æ®åº“连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
# token配置
token:
  # ä»¤ç‰Œè‡ªå®šä¹‰æ ‡è¯†
  header: Authorization
  # ä»¤ç‰Œå¯†é’¥
  secret: abcdefghijklmnopqrstuvwxyz
  # ä»¤ç‰Œæœ‰æ•ˆæœŸï¼ˆé»˜è®¤30分钟)
  expireTime: 30
# PageHelper分页插件
pagehelper:
  helperDialect: mysql
  supportMethodsArguments: true
  params: count=countSql
# Swagger配置
swagger:
  # æ˜¯å¦å¼€å¯swagger
  enabled: true
# é˜²æ­¢XSS攻击
xss:
  # è¿‡æ»¤å¼€å…³
  enabled: true
  # æŽ’除链接(多个用逗号分隔)
  excludes: /system/notice
  # åŒ¹é…é“¾æŽ¥
  urlPatterns: /system/*,/monitor/*,/tool/*
# mybatis-plus配置
mybatis-plus:
  mapper-locations: classpath*:mapper/**/*Mapper.xml
  type-aliases-package: com.ruoyi.**.domain
  global-config:
    banner: off
    db-config:
      id-type: auto
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    log-impl: # org.apache.ibatis.logging.stdout.StdOutImpl
ruoyi-admin/src/main/resources/banner.txt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
Application Version: ${ruoyi.version}
Spring Boot Version: ${spring-boot.version}
////////////////////////////////////////////////////////////////////
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//             ä½›ç¥–保佑       æ°¸ä¸å®•机      æ°¸æ— BUG               //
////////////////////////////////////////////////////////////////////
ruoyi-admin/src/main/resources/i18n/messages.properties
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
#错误消息
not.null=* å¿…须填写
user.jcaptcha.error=验证码错误
user.jcaptcha.expire=验证码已失效
user.not.exists=用户不存在/密码错误
user.password.not.match=用户不存在/密码错误
user.password.retry.limit.count=密码输入错误{0}次
user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟
user.password.delete=对不起,您的账号已被删除
user.blocked=用户已封禁,请联系管理员
role.blocked=角色已封禁,请联系管理员
login.blocked=很遗憾,访问IP已被列入系统黑名单
user.logout.success=退出成功
length.not.valid=长度必须在{min}到{max}个字符之间
user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头
user.password.not.valid=* 5-50个字符
user.email.not.valid=邮箱格式错误
user.mobile.phone.number.not.valid=手机号格式错误
user.login.success=登录成功
user.register.success=注册成功
user.notfound=请重新登录
user.forcelogout=管理员强制退出,请重新登录
user.unknown.error=未知错误,请重新登录
##文件上传消息
upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB!
upload.filename.exceed.length=上传的文件名最长{0}个字符
##权限
no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]
ruoyi-admin/src/main/resources/logback.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- æ—¥å¿—存放路径 -->
    <property name="log.path" value="/home/ruoyi/logs" />
    <!-- æ—¥å¿—输出格式 -->
    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
    <!-- æŽ§åˆ¶å°è¾“出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!-- ç³»ç»Ÿæ—¥å¿—输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-info.log</file>
        <!-- å¾ªçŽ¯æ”¿ç­–ï¼šåŸºäºŽæ—¶é—´åˆ›å»ºæ—¥å¿—æ–‡ä»¶ -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- æ—¥å¿—文件名格式 -->
            <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- æ—¥å¿—最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- è¿‡æ»¤çš„级别 -->
            <level>INFO</level>
            <!-- åŒ¹é…æ—¶çš„æ“ä½œï¼šæŽ¥æ”¶ï¼ˆè®°å½•) -->
            <onMatch>ACCEPT</onMatch>
            <!-- ä¸åŒ¹é…æ—¶çš„æ“ä½œï¼šæ‹’绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-error.log</file>
        <!-- å¾ªçŽ¯æ”¿ç­–ï¼šåŸºäºŽæ—¶é—´åˆ›å»ºæ—¥å¿—æ–‡ä»¶ -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- æ—¥å¿—文件名格式 -->
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- æ—¥å¿—最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- è¿‡æ»¤çš„级别 -->
            <level>ERROR</level>
            <!-- åŒ¹é…æ—¶çš„æ“ä½œï¼šæŽ¥æ”¶ï¼ˆè®°å½•) -->
            <onMatch>ACCEPT</onMatch>
            <!-- ä¸åŒ¹é…æ—¶çš„æ“ä½œï¼šæ‹’绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- ç”¨æˆ·è®¿é—®æ—¥å¿—输出  -->
    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-user.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- æŒ‰å¤©å›žæ»š daily -->
            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- æ—¥å¿—最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!-- ç³»ç»Ÿæ¨¡å—日志级别控制  -->
    <logger name="com.ruoyi" level="info" />
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn" />
    <root level="info">
        <appender-ref ref="console" />
    </root>
    <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
    </root>
    <!--系统用户操作日志-->
    <logger name="sys-user" level="info">
        <appender-ref ref="sys-user"/>
    </logger>
</configuration>
ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- å…¨å±€å‚æ•° -->
    <settings>
        <!-- ä½¿å…¨å±€çš„æ˜ å°„器启用或禁用缓存 -->
        <setting name="cacheEnabled"             value="true"   />
        <!-- å…è®¸JDBC æ”¯æŒè‡ªåŠ¨ç”Ÿæˆä¸»é”® -->
        <setting name="useGeneratedKeys"         value="true"   />
        <!-- é…ç½®é»˜è®¤çš„æ‰§è¡Œå™¨.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
        <setting name="defaultExecutorType"      value="SIMPLE" />
        <!-- æŒ‡å®š MyBatis æ‰€ç”¨æ—¥å¿—的具体实现 -->
        <setting name="logImpl"                  value="SLF4J"  />
        <!-- ä½¿ç”¨é©¼å³°å‘½åæ³•转换字段 -->
        <!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
    </settings>
</configuration>
ruoyi-common/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,150 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ruoyi</artifactId>
        <groupId>com.ruoyi</groupId>
        <version>3.8.9</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>ruoyi-common</artifactId>
    <description>
        common通用工具
    </description>
    <dependencies>
        <!-- Spring框架基本的核心工具 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <!-- SpringWeb模块 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <!-- spring security å®‰å…¨è®¤è¯ -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <!-- pagehelper åˆ†é¡µæ’ä»¶ -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
        </dependency>
        <!-- è‡ªå®šä¹‰éªŒè¯æ³¨è§£ -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <!--常用工具类 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <!-- JSON工具类 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <!-- é˜¿é‡ŒJSON解析器 -->
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
        </dependency>
        <!-- io常用工具类 -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
        </dependency>
        <!-- excel工具 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </dependency>
        <!-- yml解析器 -->
        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
        </dependency>
        <!-- Token生成与解析-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
        </dependency>
        <!-- Jaxb -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
        </dependency>
        <!-- redis ç¼“存操作 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- pool å¯¹è±¡æ±  -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
        <!-- è§£æžå®¢æˆ·ç«¯æ“ä½œç³»ç»Ÿã€æµè§ˆå™¨ç­‰ -->
        <dependency>
            <groupId>eu.bitwalker</groupId>
            <artifactId>UserAgentUtils</artifactId>
        </dependency>
        <!-- servlet包 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
        <!-- minio -->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
        </dependency>
        <!-- minio依赖okhttp ä¸ç„¶æŠ¥é”™ -->
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-text</artifactId>
            <version>1.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>
    </dependencies>
</project>
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * åŒ¿åè®¿é—®ä¸é‰´æƒæ³¨è§£
 *
 * @author ruoyi
 */
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Anonymous
{
}
ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * æ•°æ®æƒé™è¿‡æ»¤æ³¨è§£
 *
 * @author ruoyi
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataScope
{
    /**
     * éƒ¨é—¨è¡¨çš„别名
     */
    public String deptAlias() default "";
    /**
     * ç”¨æˆ·è¡¨çš„别名
     */
    public String userAlias() default "";
    /**
     * æƒé™å­—符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来
     */
    public String permission() default "";
}
ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.ruoyi.common.enums.DataSourceType;
/**
 * è‡ªå®šä¹‰å¤šæ•°æ®æºåˆ‡æ¢æ³¨è§£
 *
 * ä¼˜å…ˆçº§ï¼šå…ˆæ–¹æ³•,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准
 *
 * @author ruoyi
 */
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DataSource
{
    /**
     * åˆ‡æ¢æ•°æ®æºåç§°
     */
    public DataSourceType value() default DataSourceType.MASTER;
}
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,197 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.math.BigDecimal;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import com.ruoyi.common.utils.poi.ExcelHandlerAdapter;
/**
 * è‡ªå®šä¹‰å¯¼å‡ºExcel数据注解
 *
 * @author ruoyi
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel
{
    /**
     * å¯¼å‡ºæ—¶åœ¨excel中排序
     */
    public int sort() default Integer.MAX_VALUE;
    /**
     * å¯¼å‡ºåˆ°Excel中的名字.
     */
    public String name() default "";
    /**
     * æ—¥æœŸæ ¼å¼, å¦‚: yyyy-MM-dd
     */
    public String dateFormat() default "";
    /**
     * å¦‚果是字典类型,请设置字典的type值 (如: sys_user_sex)
     */
    public String dictType() default "";
    /**
     * è¯»å–内容转表达式 (如: 0=男,1=女,2=未知)
     */
    public String readConverterExp() default "";
    /**
     * åˆ†éš”符,读取字符串组内容
     */
    public String separator() default ",";
    /**
     * BigDecimal ç²¾åº¦ é»˜è®¤:-1(默认不开启BigDecimal格式化)
     */
    public int scale() default -1;
    /**
     * BigDecimal èˆå…¥è§„则 é»˜è®¤:BigDecimal.ROUND_HALF_EVEN
     */
    public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
    /**
     * å¯¼å‡ºæ—¶åœ¨excel中每个列的高度
     */
    public double height() default 14;
    /**
     * å¯¼å‡ºæ—¶åœ¨excel中每个列的宽度
     */
    public double width() default 16;
    /**
     * æ–‡å­—后缀,如% 90 å˜æˆ90%
     */
    public String suffix() default "";
    /**
     * å½“值为空时,字段的默认值
     */
    public String defaultValue() default "";
    /**
     * æç¤ºä¿¡æ¯
     */
    public String prompt() default "";
    /**
     * æ˜¯å¦å…è®¸å†…容换行
     */
    public boolean wrapText() default false;
    /**
     * è®¾ç½®åªèƒ½é€‰æ‹©ä¸èƒ½è¾“入的列内容.
     */
    public String[] combo() default {};
    /**
     * æ˜¯å¦ä»Žå­—典读数据到combo,默认不读取,如读取需要设置dictType注解.
     */
    public boolean comboReadDict() default false;
    /**
     * æ˜¯å¦éœ€è¦çºµå‘合并单元格,应对需求:含有list集合单元格)
     */
    public boolean needMerge() default false;
    /**
     * æ˜¯å¦å¯¼å‡ºæ•°æ®,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
     */
    public boolean isExport() default true;
    /**
     * å¦ä¸€ä¸ªç±»ä¸­çš„属性名称,支持多级获取,以小数点隔开
     */
    public String targetAttr() default "";
    /**
     * æ˜¯å¦è‡ªåŠ¨ç»Ÿè®¡æ•°æ®,在最后追加一行统计数据总和
     */
    public boolean isStatistics() default false;
    /**
     * å¯¼å‡ºç±»åž‹ï¼ˆ0数字 1字符串 2图片)
     */
    public ColumnType cellType() default ColumnType.STRING;
    /**
     * å¯¼å‡ºåˆ—头背景颜色
     */
    public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT;
    /**
     * å¯¼å‡ºåˆ—头字体颜色
     */
    public IndexedColors headerColor() default IndexedColors.WHITE;
    /**
     * å¯¼å‡ºå•元格背景颜色
     */
    public IndexedColors backgroundColor() default IndexedColors.WHITE;
    /**
     * å¯¼å‡ºå•元格字体颜色
     */
    public IndexedColors color() default IndexedColors.BLACK;
    /**
     * å¯¼å‡ºå­—段对齐方式
     */
    public HorizontalAlignment align() default HorizontalAlignment.CENTER;
    /**
     * è‡ªå®šä¹‰æ•°æ®å¤„理器
     */
    public Class<?> handler() default ExcelHandlerAdapter.class;
    /**
     * è‡ªå®šä¹‰æ•°æ®å¤„理器参数
     */
    public String[] args() default {};
    /**
     * å­—段类型(0:导出导入;1:仅导出;2:仅导入)
     */
    Type type() default Type.ALL;
    public enum Type
    {
        ALL(0), EXPORT(1), IMPORT(2);
        private final int value;
        Type(int value)
        {
            this.value = value;
        }
        public int value()
        {
            return this.value;
        }
    }
    public enum ColumnType
    {
        NUMERIC(0), STRING(1), IMAGE(2), TEXT(3);
        private final int value;
        ColumnType(int value)
        {
            this.value = value;
        }
        public int value()
        {
            return this.value;
        }
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * Excel注解集
 *
 * @author ruoyi
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Excels
{
    public Excel[] value();
}
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.enums.OperatorType;
/**
 * è‡ªå®šä¹‰æ“ä½œæ—¥å¿—记录注解
 *
 * @author ruoyi
 *
 */
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log
{
    /**
     * æ¨¡å—
     */
    public String title() default "";
    /**
     * åŠŸèƒ½
     */
    public BusinessType businessType() default BusinessType.OTHER;
    /**
     * æ“ä½œäººç±»åˆ«
     */
    public OperatorType operatorType() default OperatorType.MANAGE;
    /**
     * æ˜¯å¦ä¿å­˜è¯·æ±‚的参数
     */
    public boolean isSaveRequestData() default true;
    /**
     * æ˜¯å¦ä¿å­˜å“åº”的参数
     */
    public boolean isSaveResponseData() default true;
    /**
     * æŽ’除指定的请求参数
     */
    public String[] excludeParamNames() default {};
}
ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.enums.LimitType;
/**
 * é™æµæ³¨è§£
 *
 * @author ruoyi
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimiter
{
    /**
     * é™æµkey
     */
    public String key() default CacheConstants.RATE_LIMIT_KEY;
    /**
     * é™æµæ—¶é—´,单位秒
     */
    public int time() default 60;
    /**
     * é™æµæ¬¡æ•°
     */
    public int count() default 100;
    /**
     * é™æµç±»åž‹
     */
    public LimitType limitType() default LimitType.DEFAULT;
}
ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * è‡ªå®šä¹‰æ³¨è§£é˜²æ­¢è¡¨å•重复提交
 *
 * @author ruoyi
 *
 */
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RepeatSubmit
{
    /**
     * é—´é𔿗¶é—´(ms),小于此时间视为重复提交
     */
    public int interval() default 5000;
    /**
     * æç¤ºæ¶ˆæ¯
     */
    public String message() default "不允许重复提交,请稍候再试";
}
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Sensitive.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.ruoyi.common.config.serializer.SensitiveJsonSerializer;
import com.ruoyi.common.enums.DesensitizedType;
/**
 * æ•°æ®è„±æ•æ³¨è§£
 *
 * @author ruoyi
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive
{
    DesensitizedType desensitizedType();
}
ruoyi-common/src/main/java/com/ruoyi/common/config/MinioConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.common.config;
import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
@Configuration
@Component
@ConfigurationProperties(prefix = "minio")
@Data
public class MinioConfig {
    private String endpoint;
    private int port;
    private String accessKey;
    private String secretKey;
    private Boolean secure;
    @Bean
    public MinioClient getMinioClient() {
        return MinioClient.builder().endpoint(endpoint, port, secure)
                .credentials(accessKey, secretKey)
                .build();
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
package com.ruoyi.common.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * è¯»å–项目相关配置
 *
 * @author ruoyi
 */
@Component
@ConfigurationProperties(prefix = "ruoyi")
public class RuoYiConfig
{
    /** é¡¹ç›®åç§° */
    private String name;
    /** ç‰ˆæœ¬ */
    private String version;
    /** ç‰ˆæƒå¹´ä»½ */
    private String copyrightYear;
    /** ä¸Šä¼ è·¯å¾„ */
    private static String profile;
    /** èŽ·å–åœ°å€å¼€å…³ */
    private static boolean addressEnabled;
    /** éªŒè¯ç ç±»åž‹ */
    private static String captchaType;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getVersion()
    {
        return version;
    }
    public void setVersion(String version)
    {
        this.version = version;
    }
    public String getCopyrightYear()
    {
        return copyrightYear;
    }
    public void setCopyrightYear(String copyrightYear)
    {
        this.copyrightYear = copyrightYear;
    }
    public static String getProfile()
    {
        return profile;
    }
    public void setProfile(String profile)
    {
        RuoYiConfig.profile = profile;
    }
    public static boolean isAddressEnabled()
    {
        return addressEnabled;
    }
    public void setAddressEnabled(boolean addressEnabled)
    {
        RuoYiConfig.addressEnabled = addressEnabled;
    }
    public static String getCaptchaType() {
        return captchaType;
    }
    public void setCaptchaType(String captchaType) {
        RuoYiConfig.captchaType = captchaType;
    }
    /**
     * èŽ·å–å¯¼å…¥ä¸Šä¼ è·¯å¾„
     */
    public static String getImportPath()
    {
        return getProfile() + "/import";
    }
    /**
     * èŽ·å–å¤´åƒä¸Šä¼ è·¯å¾„
     */
    public static String getAvatarPath()
    {
        return getProfile() + "/avatar";
    }
    /**
     * èŽ·å–ä¸‹è½½è·¯å¾„
     */
    public static String getDownloadPath()
    {
        return getProfile() + "/download/";
    }
    /**
     * èŽ·å–ä¸Šä¼ è·¯å¾„
     */
    public static String getUploadPath()
    {
        return getProfile() + "/upload";
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/config/serializer/SensitiveJsonSerializer.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.common.config.serializer;
import java.io.IOException;
import java.util.Objects;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import com.ruoyi.common.annotation.Sensitive;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.DesensitizedType;
import com.ruoyi.common.utils.SecurityUtils;
/**
 * æ•°æ®è„±æ•åºåˆ—化过滤
 *
 * @author ruoyi
 */
public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer
{
    private DesensitizedType desensitizedType;
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException
    {
        if (desensitization())
        {
            gen.writeString(desensitizedType.desensitizer().apply(value));
        }
        else
        {
            gen.writeString(value);
        }
    }
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property)
            throws JsonMappingException
    {
        Sensitive annotation = property.getAnnotation(Sensitive.class);
        if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass()))
        {
            this.desensitizedType = annotation.desensitizedType();
            return this;
        }
        return prov.findValueSerializer(property.getType(), property);
    }
    /**
     * æ˜¯å¦éœ€è¦è„±æ•å¤„理
     */
    private boolean desensitization()
    {
        try
        {
            LoginUser securityUser = SecurityUtils.getLoginUser();
            // ç®¡ç†å‘˜ä¸è„±æ•
            return !securityUser.getUser().isAdmin();
        }
        catch (Exception e)
        {
            return true;
        }
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.ruoyi.common.constant;
/**
 * ç¼“存的key å¸¸é‡
 *
 * @author ruoyi
 */
public class CacheConstants
{
    /**
     * ç™»å½•用户 redis key
     */
    public static final String LOGIN_TOKEN_KEY = "login_tokens:";
    /**
     * éªŒè¯ç  redis key
     */
    public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
    /**
     * å‚数管理 cache key
     */
    public static final String SYS_CONFIG_KEY = "sys_config:";
    /**
     * å­—典管理 cache key
     */
    public static final String SYS_DICT_KEY = "sys_dict:";
    /**
     * é˜²é‡æäº¤ redis key
     */
    public static final String REPEAT_SUBMIT_KEY = "repeat_submit:";
    /**
     * é™æµ redis key
     */
    public static final String RATE_LIMIT_KEY = "rate_limit:";
    /**
     * ç™»å½•账户密码错误次数 redis key
     */
    public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
}
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,173 @@
package com.ruoyi.common.constant;
import java.util.Locale;
import io.jsonwebtoken.Claims;
/**
 * é€šç”¨å¸¸é‡ä¿¡æ¯
 *
 * @author ruoyi
 */
public class Constants
{
    /**
     * UTF-8 å­—符集
     */
    public static final String UTF8 = "UTF-8";
    /**
     * GBK å­—符集
     */
    public static final String GBK = "GBK";
    /**
     * ç³»ç»Ÿè¯­è¨€
     */
    public static final Locale DEFAULT_LOCALE = Locale.SIMPLIFIED_CHINESE;
    /**
     * www主域
     */
    public static final String WWW = "www.";
    /**
     * http请求
     */
    public static final String HTTP = "http://";
    /**
     * https请求
     */
    public static final String HTTPS = "https://";
    /**
     * é€šç”¨æˆåŠŸæ ‡è¯†
     */
    public static final String SUCCESS = "0";
    /**
     * é€šç”¨å¤±è´¥æ ‡è¯†
     */
    public static final String FAIL = "1";
    /**
     * ç™»å½•成功
     */
    public static final String LOGIN_SUCCESS = "Success";
    /**
     * æ³¨é”€
     */
    public static final String LOGOUT = "Logout";
    /**
     * æ³¨å†Œ
     */
    public static final String REGISTER = "Register";
    /**
     * ç™»å½•失败
     */
    public static final String LOGIN_FAIL = "Error";
    /**
     * æ‰€æœ‰æƒé™æ ‡è¯†
     */
    public static final String ALL_PERMISSION = "*:*:*";
    /**
     * ç®¡ç†å‘˜è§’色权限标识
     */
    public static final String SUPER_ADMIN = "admin";
    /**
     * è§’色权限分隔符
     */
    public static final String ROLE_DELIMETER = ",";
    /**
     * æƒé™æ ‡è¯†åˆ†éš”符
     */
    public static final String PERMISSION_DELIMETER = ",";
    /**
     * éªŒè¯ç æœ‰æ•ˆæœŸï¼ˆåˆ†é’Ÿï¼‰
     */
    public static final Integer CAPTCHA_EXPIRATION = 2;
    /**
     * ä»¤ç‰Œ
     */
    public static final String TOKEN = "token";
    /**
     * ä»¤ç‰Œå‰ç¼€
     */
    public static final String TOKEN_PREFIX = "Bearer ";
    /**
     * ä»¤ç‰Œå‰ç¼€
     */
    public static final String LOGIN_USER_KEY = "login_user_key";
    /**
     * ç”¨æˆ·ID
     */
    public static final String JWT_USERID = "userid";
    /**
     * ç”¨æˆ·åç§°
     */
    public static final String JWT_USERNAME = Claims.SUBJECT;
    /**
     * ç”¨æˆ·å¤´åƒ
     */
    public static final String JWT_AVATAR = "avatar";
    /**
     * åˆ›å»ºæ—¶é—´
     */
    public static final String JWT_CREATED = "created";
    /**
     * ç”¨æˆ·æƒé™
     */
    public static final String JWT_AUTHORITIES = "authorities";
    /**
     * èµ„源映射路径 å‰ç¼€
     */
    public static final String RESOURCE_PREFIX = "/profile";
    /**
     * RMI è¿œç¨‹æ–¹æ³•调用
     */
    public static final String LOOKUP_RMI = "rmi:";
    /**
     * LDAP è¿œç¨‹æ–¹æ³•调用
     */
    public static final String LOOKUP_LDAP = "ldap:";
    /**
     * LDAPS è¿œç¨‹æ–¹æ³•调用
     */
    public static final String LOOKUP_LDAPS = "ldaps:";
    /**
     * è‡ªåŠ¨è¯†åˆ«json对象白名单配置(仅允许解析的包名,范围越小越安全)
     */
    public static final String[] JSON_WHITELIST_STR = { "org.springframework", "com.ruoyi" };
    /**
     * å®šæ—¶ä»»åŠ¡ç™½åå•é…ç½®ï¼ˆä»…å…è®¸è®¿é—®çš„åŒ…åï¼Œå¦‚å…¶ä»–éœ€è¦å¯ä»¥è‡ªè¡Œæ·»åŠ ï¼‰
     */
    public static final String[] JOB_WHITELIST_STR = { "com.ruoyi.quartz.task" };
    /**
     * å®šæ—¶ä»»åŠ¡è¿è§„çš„å­—ç¬¦
     */
    public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
            "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config", "com.ruoyi.generator" };
}
ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,117 @@
package com.ruoyi.common.constant;
/**
 * ä»£ç ç”Ÿæˆé€šç”¨å¸¸é‡
 *
 * @author ruoyi
 */
public class GenConstants
{
    /** å•表(增删改查) */
    public static final String TPL_CRUD = "crud";
    /** æ ‘表(增删改查) */
    public static final String TPL_TREE = "tree";
    /** ä¸»å­è¡¨ï¼ˆå¢žåˆ æ”¹æŸ¥ï¼‰ */
    public static final String TPL_SUB = "sub";
    /** æ ‘编码字段 */
    public static final String TREE_CODE = "treeCode";
    /** æ ‘父编码字段 */
    public static final String TREE_PARENT_CODE = "treeParentCode";
    /** æ ‘名称字段 */
    public static final String TREE_NAME = "treeName";
    /** ä¸Šçº§èœå•ID字段 */
    public static final String PARENT_MENU_ID = "parentMenuId";
    /** ä¸Šçº§èœå•名称字段 */
    public static final String PARENT_MENU_NAME = "parentMenuName";
    /** æ•°æ®åº“字符串类型 */
    public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" };
    /** æ•°æ®åº“文本类型 */
    public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" };
    /** æ•°æ®åº“时间类型 */
    public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" };
    /** æ•°æ®åº“数字类型 */
    public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer",
            "bit", "bigint", "float", "double", "decimal" };
    /** é¡µé¢ä¸éœ€è¦ç¼–辑字段 */
    public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" };
    /** é¡µé¢ä¸éœ€è¦æ˜¾ç¤ºçš„列表字段 */
    public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by",
            "update_time" };
    /** é¡µé¢ä¸éœ€è¦æŸ¥è¯¢å­—段 */
    public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by",
            "update_time", "remark" };
    /** Entity基类字段 */
    public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" };
    /** Tree基类字段 */
    public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors", "children" };
    /** æ–‡æœ¬æ¡† */
    public static final String HTML_INPUT = "input";
    /** æ–‡æœ¬åŸŸ */
    public static final String HTML_TEXTAREA = "textarea";
    /** ä¸‹æ‹‰æ¡† */
    public static final String HTML_SELECT = "select";
    /** å•选框 */
    public static final String HTML_RADIO = "radio";
    /** å¤é€‰æ¡† */
    public static final String HTML_CHECKBOX = "checkbox";
    /** æ—¥æœŸæŽ§ä»¶ */
    public static final String HTML_DATETIME = "datetime";
    /** å›¾ç‰‡ä¸Šä¼ æŽ§ä»¶ */
    public static final String HTML_IMAGE_UPLOAD = "imageUpload";
    /** æ–‡ä»¶ä¸Šä¼ æŽ§ä»¶ */
    public static final String HTML_FILE_UPLOAD = "fileUpload";
    /** å¯Œæ–‡æœ¬æŽ§ä»¶ */
    public static final String HTML_EDITOR = "editor";
    /** å­—符串类型 */
    public static final String TYPE_STRING = "String";
    /** æ•´åž‹ */
    public static final String TYPE_INTEGER = "Integer";
    /** é•¿æ•´åž‹ */
    public static final String TYPE_LONG = "Long";
    /** æµ®ç‚¹åž‹ */
    public static final String TYPE_DOUBLE = "Double";
    /** é«˜ç²¾åº¦è®¡ç®—类型 */
    public static final String TYPE_BIGDECIMAL = "BigDecimal";
    /** æ—¶é—´ç±»åž‹ */
    public static final String TYPE_DATE = "Date";
    /** æ¨¡ç³ŠæŸ¥è¯¢ */
    public static final String QUERY_LIKE = "LIKE";
    /** ç›¸ç­‰æŸ¥è¯¢ */
    public static final String QUERY_EQ = "EQ";
    /** éœ€è¦ */
    public static final String REQUIRE = "1";
}
ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,94 @@
package com.ruoyi.common.constant;
/**
 * è¿”回状态码
 *
 * @author ruoyi
 */
public class HttpStatus
{
    /**
     * æ“ä½œæˆåŠŸ
     */
    public static final int SUCCESS = 200;
    /**
     * å¯¹è±¡åˆ›å»ºæˆåŠŸ
     */
    public static final int CREATED = 201;
    /**
     * è¯·æ±‚已经被接受
     */
    public static final int ACCEPTED = 202;
    /**
     * æ“ä½œå·²ç»æ‰§è¡ŒæˆåŠŸï¼Œä½†æ˜¯æ²¡æœ‰è¿”å›žæ•°æ®
     */
    public static final int NO_CONTENT = 204;
    /**
     * èµ„源已被移除
     */
    public static final int MOVED_PERM = 301;
    /**
     * é‡å®šå‘
     */
    public static final int SEE_OTHER = 303;
    /**
     * èµ„源没有被修改
     */
    public static final int NOT_MODIFIED = 304;
    /**
     * å‚数列表错误(缺少,格式不匹配)
     */
    public static final int BAD_REQUEST = 400;
    /**
     * æœªæŽˆæƒ
     */
    public static final int UNAUTHORIZED = 401;
    /**
     * è®¿é—®å—限,授权过期
     */
    public static final int FORBIDDEN = 403;
    /**
     * èµ„源,服务未找到
     */
    public static final int NOT_FOUND = 404;
    /**
     * ä¸å…è®¸çš„http方法
     */
    public static final int BAD_METHOD = 405;
    /**
     * èµ„源冲突,或者资源被锁
     */
    public static final int CONFLICT = 409;
    /**
     * ä¸æ”¯æŒçš„æ•°æ®ï¼Œåª’体类型
     */
    public static final int UNSUPPORTED_TYPE = 415;
    /**
     * ç³»ç»Ÿå†…部错误
     */
    public static final int ERROR = 500;
    /**
     * æŽ¥å£æœªå®žçް
     */
    public static final int NOT_IMPLEMENTED = 501;
    /**
     * ç³»ç»Ÿè­¦å‘Šæ¶ˆæ¯
     */
    public static final int WARN = 601;
}
ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.ruoyi.common.constant;
/**
 * ä»»åŠ¡è°ƒåº¦é€šç”¨å¸¸é‡
 *
 * @author ruoyi
 */
public class ScheduleConstants
{
    public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME";
    /** æ‰§è¡Œç›®æ ‡key */
    public static final String TASK_PROPERTIES = "TASK_PROPERTIES";
    /** é»˜è®¤ */
    public static final String MISFIRE_DEFAULT = "0";
    /** ç«‹å³è§¦å‘执行 */
    public static final String MISFIRE_IGNORE_MISFIRES = "1";
    /** è§¦å‘一次执行 */
    public static final String MISFIRE_FIRE_AND_PROCEED = "2";
    /** ä¸è§¦å‘立即执行 */
    public static final String MISFIRE_DO_NOTHING = "3";
    public enum Status
    {
        /**
         * æ­£å¸¸
         */
        NORMAL("0"),
        /**
         * æš‚停
         */
        PAUSE("1");
        private String value;
        private Status(String value)
        {
            this.value = value;
        }
        public String getValue()
        {
            return value;
        }
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
package com.ruoyi.common.constant;
/**
 * ç”¨æˆ·å¸¸é‡ä¿¡æ¯
 *
 * @author ruoyi
 */
public class UserConstants
{
    /**
     * å¹³å°å†…系统用户的唯一标志
     */
    public static final String SYS_USER = "SYS_USER";
    /** æ­£å¸¸çŠ¶æ€ */
    public static final String NORMAL = "0";
    /** å¼‚常状态 */
    public static final String EXCEPTION = "1";
    /** ç”¨æˆ·å°ç¦çŠ¶æ€ */
    public static final String USER_DISABLE = "1";
    /** è§’色正常状态 */
    public static final String ROLE_NORMAL = "0";
    /** è§’色封禁状态 */
    public static final String ROLE_DISABLE = "1";
    /** éƒ¨é—¨æ­£å¸¸çŠ¶æ€ */
    public static final String DEPT_NORMAL = "0";
    /** éƒ¨é—¨åœç”¨çŠ¶æ€ */
    public static final String DEPT_DISABLE = "1";
    /** å­—典正常状态 */
    public static final String DICT_NORMAL = "0";
    /** æ˜¯å¦ä¸ºç³»ç»Ÿé»˜è®¤ï¼ˆæ˜¯ï¼‰ */
    public static final String YES = "Y";
    /** æ˜¯å¦èœå•外链(是) */
    public static final String YES_FRAME = "0";
    /** æ˜¯å¦èœå•外链(否) */
    public static final String NO_FRAME = "1";
    /** èœå•类型(目录) */
    public static final String TYPE_DIR = "M";
    /** èœå•类型(菜单) */
    public static final String TYPE_MENU = "C";
    /** èœå•类型(按钮) */
    public static final String TYPE_BUTTON = "F";
    /** Layout组件标识 */
    public final static String LAYOUT = "Layout";
    /** ParentView组件标识 */
    public final static String PARENT_VIEW = "ParentView";
    /** InnerLink组件标识 */
    public final static String INNER_LINK = "InnerLink";
    /** æ ¡éªŒæ˜¯å¦å”¯ä¸€çš„返回标识 */
    public final static boolean UNIQUE = true;
    public final static boolean NOT_UNIQUE = false;
    /**
     * ç”¨æˆ·åé•¿åº¦é™åˆ¶
     */
    public static final int USERNAME_MIN_LENGTH = 2;
    public static final int USERNAME_MAX_LENGTH = 20;
    /**
     * å¯†ç é•¿åº¦é™åˆ¶
     */
    public static final int PASSWORD_MIN_LENGTH = 5;
    public static final int PASSWORD_MAX_LENGTH = 20;
}
ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,202 @@
package com.ruoyi.common.core.controller;
import java.beans.PropertyEditorSupport;
import java.util.Date;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.sql.SqlUtil;
/**
 * web层通用数据处理
 *
 * @author ruoyi
 */
public class BaseController
{
    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
    /**
     * å°†å‰å°ä¼ é€’过来的日期格式的字符串,自动转化为Date类型
     */
    @InitBinder
    public void initBinder(WebDataBinder binder)
    {
        // Date ç±»åž‹è½¬æ¢
        binder.registerCustomEditor(Date.class, new PropertyEditorSupport()
        {
            @Override
            public void setAsText(String text)
            {
                setValue(DateUtils.parseDate(text));
            }
        });
    }
    /**
     * è®¾ç½®è¯·æ±‚分页数据
     */
    protected void startPage()
    {
        PageUtils.startPage();
    }
    /**
     * è®¾ç½®è¯·æ±‚排序数据
     */
    protected void startOrderBy()
    {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        if (StringUtils.isNotEmpty(pageDomain.getOrderBy()))
        {
            String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
            PageHelper.orderBy(orderBy);
        }
    }
    /**
     * æ¸…理分页的线程变量
     */
    protected void clearPage()
    {
        PageUtils.clearPage();
    }
    /**
     * å“åº”请求分页数据
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    protected TableDataInfo getDataTable(List<?> list)
    {
        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(HttpStatus.SUCCESS);
        rspData.setMsg("查询成功");
        rspData.setRows(list);
        rspData.setTotal(new PageInfo(list).getTotal());
        return rspData;
    }
    /**
     * è¿”回成功
     */
    public AjaxResult success()
    {
        return AjaxResult.success();
    }
    /**
     * è¿”回失败消息
     */
    public AjaxResult error()
    {
        return AjaxResult.error();
    }
    /**
     * è¿”回成功消息
     */
    public AjaxResult success(String message)
    {
        return AjaxResult.success(message);
    }
    /**
     * è¿”回成功消息
     */
    public AjaxResult success(Object data)
    {
        return AjaxResult.success(data);
    }
    /**
     * è¿”回失败消息
     */
    public AjaxResult error(String message)
    {
        return AjaxResult.error(message);
    }
    /**
     * è¿”回警告消息
     */
    public AjaxResult warn(String message)
    {
        return AjaxResult.warn(message);
    }
    /**
     * å“åº”返回结果
     *
     * @param rows å½±å“è¡Œæ•°
     * @return æ“ä½œç»“æžœ
     */
    protected AjaxResult toAjax(int rows)
    {
        return rows > 0 ? AjaxResult.success() : AjaxResult.error();
    }
    /**
     * å“åº”返回结果
     *
     * @param result ç»“æžœ
     * @return æ“ä½œç»“æžœ
     */
    protected AjaxResult toAjax(boolean result)
    {
        return result ? success() : error();
    }
    /**
     * é¡µé¢è·³è½¬
     */
    public String redirect(String url)
    {
        return StringUtils.format("redirect:{}", url);
    }
    /**
     * èŽ·å–ç”¨æˆ·ç¼“å­˜ä¿¡æ¯
     */
    public LoginUser getLoginUser()
    {
        return SecurityUtils.getLoginUser();
    }
    /**
     * èŽ·å–ç™»å½•ç”¨æˆ·id
     */
    public Long getUserId()
    {
        return getLoginUser().getUserId();
    }
    /**
     * èŽ·å–ç™»å½•éƒ¨é—¨id
     */
    public Long getDeptId()
    {
        return getLoginUser().getDeptId();
    }
    /**
     * èŽ·å–ç™»å½•ç”¨æˆ·å
     */
    public String getUsername()
    {
        return getLoginUser().getUsername();
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,216 @@
package com.ruoyi.common.core.domain;
import java.util.HashMap;
import java.util.Objects;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.utils.StringUtils;
/**
 * æ“ä½œæ¶ˆæ¯æé†’
 *
 * @author ruoyi
 */
public class AjaxResult extends HashMap<String, Object>
{
    private static final long serialVersionUID = 1L;
    /** çŠ¶æ€ç  */
    public static final String CODE_TAG = "code";
    /** è¿”回内容 */
    public static final String MSG_TAG = "msg";
    /** æ•°æ®å¯¹è±¡ */
    public static final String DATA_TAG = "data";
    /**
     * åˆå§‹åŒ–一个新创建的 AjaxResult å¯¹è±¡ï¼Œä½¿å…¶è¡¨ç¤ºä¸€ä¸ªç©ºæ¶ˆæ¯ã€‚
     */
    public AjaxResult()
    {
    }
    /**
     * åˆå§‹åŒ–一个新创建的 AjaxResult å¯¹è±¡
     *
     * @param code çŠ¶æ€ç 
     * @param msg è¿”回内容
     */
    public AjaxResult(int code, String msg)
    {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
    }
    /**
     * åˆå§‹åŒ–一个新创建的 AjaxResult å¯¹è±¡
     *
     * @param code çŠ¶æ€ç 
     * @param msg è¿”回内容
     * @param data æ•°æ®å¯¹è±¡
     */
    public AjaxResult(int code, String msg, Object data)
    {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
        if (StringUtils.isNotNull(data))
        {
            super.put(DATA_TAG, data);
        }
    }
    /**
     * è¿”回成功消息
     *
     * @return æˆåŠŸæ¶ˆæ¯
     */
    public static AjaxResult success()
    {
        return AjaxResult.success("操作成功");
    }
    /**
     * è¿”回成功数据
     *
     * @return æˆåŠŸæ¶ˆæ¯
     */
    public static AjaxResult success(Object data)
    {
        return AjaxResult.success("操作成功", data);
    }
    /**
     * è¿”回成功消息
     *
     * @param msg è¿”回内容
     * @return æˆåŠŸæ¶ˆæ¯
     */
    public static AjaxResult success(String msg)
    {
        return AjaxResult.success(msg, null);
    }
    /**
     * è¿”回成功消息
     *
     * @param msg è¿”回内容
     * @param data æ•°æ®å¯¹è±¡
     * @return æˆåŠŸæ¶ˆæ¯
     */
    public static AjaxResult success(String msg, Object data)
    {
        return new AjaxResult(HttpStatus.SUCCESS, msg, data);
    }
    /**
     * è¿”回警告消息
     *
     * @param msg è¿”回内容
     * @return è­¦å‘Šæ¶ˆæ¯
     */
    public static AjaxResult warn(String msg)
    {
        return AjaxResult.warn(msg, null);
    }
    /**
     * è¿”回警告消息
     *
     * @param msg è¿”回内容
     * @param data æ•°æ®å¯¹è±¡
     * @return è­¦å‘Šæ¶ˆæ¯
     */
    public static AjaxResult warn(String msg, Object data)
    {
        return new AjaxResult(HttpStatus.WARN, msg, data);
    }
    /**
     * è¿”回错误消息
     *
     * @return é”™è¯¯æ¶ˆæ¯
     */
    public static AjaxResult error()
    {
        return AjaxResult.error("操作失败");
    }
    /**
     * è¿”回错误消息
     *
     * @param msg è¿”回内容
     * @return é”™è¯¯æ¶ˆæ¯
     */
    public static AjaxResult error(String msg)
    {
        return AjaxResult.error(msg, null);
    }
    /**
     * è¿”回错误消息
     *
     * @param msg è¿”回内容
     * @param data æ•°æ®å¯¹è±¡
     * @return é”™è¯¯æ¶ˆæ¯
     */
    public static AjaxResult error(String msg, Object data)
    {
        return new AjaxResult(HttpStatus.ERROR, msg, data);
    }
    /**
     * è¿”回错误消息
     *
     * @param code çŠ¶æ€ç 
     * @param msg è¿”回内容
     * @return é”™è¯¯æ¶ˆæ¯
     */
    public static AjaxResult error(int code, String msg)
    {
        return new AjaxResult(code, msg, null);
    }
    /**
     * æ˜¯å¦ä¸ºæˆåŠŸæ¶ˆæ¯
     *
     * @return ç»“æžœ
     */
    public boolean isSuccess()
    {
        return Objects.equals(HttpStatus.SUCCESS, this.get(CODE_TAG));
    }
    /**
     * æ˜¯å¦ä¸ºè­¦å‘Šæ¶ˆæ¯
     *
     * @return ç»“æžœ
     */
    public boolean isWarn()
    {
        return Objects.equals(HttpStatus.WARN, this.get(CODE_TAG));
    }
    /**
     * æ˜¯å¦ä¸ºé”™è¯¯æ¶ˆæ¯
     *
     * @return ç»“æžœ
     */
    public boolean isError()
    {
        return Objects.equals(HttpStatus.ERROR, this.get(CODE_TAG));
    }
    /**
     * æ–¹ä¾¿é“¾å¼è°ƒç”¨
     *
     * @param key é”®
     * @param value å€¼
     * @return æ•°æ®å¯¹è±¡
     */
    @Override
    public AjaxResult put(String key, Object value)
    {
        super.put(key, value);
        return this;
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,118 @@
package com.ruoyi.common.core.domain;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
/**
 * Entity基类
 *
 * @author ruoyi
 */
public class BaseEntity implements Serializable
{
    private static final long serialVersionUID = 1L;
    /** æœç´¢å€¼ */
    @JsonIgnore
    private String searchValue;
    /** åˆ›å»ºè€… */
    private String createBy;
    /** åˆ›å»ºæ—¶é—´ */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /** æ›´æ–°è€… */
    private String updateBy;
    /** æ›´æ–°æ—¶é—´ */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /** å¤‡æ³¨ */
    private String remark;
    /** è¯·æ±‚参数 */
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private Map<String, Object> params;
    public String getSearchValue()
    {
        return searchValue;
    }
    public void setSearchValue(String searchValue)
    {
        this.searchValue = searchValue;
    }
    public String getCreateBy()
    {
        return createBy;
    }
    public void setCreateBy(String createBy)
    {
        this.createBy = createBy;
    }
    public Date getCreateTime()
    {
        return createTime;
    }
    public void setCreateTime(Date createTime)
    {
        this.createTime = createTime;
    }
    public String getUpdateBy()
    {
        return updateBy;
    }
    public void setUpdateBy(String updateBy)
    {
        this.updateBy = updateBy;
    }
    public Date getUpdateTime()
    {
        return updateTime;
    }
    public void setUpdateTime(Date updateTime)
    {
        this.updateTime = updateTime;
    }
    public String getRemark()
    {
        return remark;
    }
    public void setRemark(String remark)
    {
        this.remark = remark;
    }
    public Map<String, Object> getParams()
    {
        if (params == null)
        {
            params = new HashMap<>();
        }
        return params;
    }
    public void setParams(Map<String, Object> params)
    {
        this.params = params;
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/MinioResult.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.common.core.domain;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class MinioResult {
    @ApiModelProperty("minio中的文件名称")
    private String bucketFileName;
    @ApiModelProperty("源文件名称")
    private String originalName;
    @ApiModelProperty("预览路径")
    private String previewExpiry;
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/Result.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
package com.ruoyi.common.core.domain;
import java.io.Serializable;
import com.ruoyi.common.constant.HttpStatus;
/**
 * å“åº”信息主体
 *
 * @author ruoyi
 */
public class Result<T> implements Serializable
{
    private static final long serialVersionUID = 1L;
    /** æˆåŠŸ */
    public static final int SUCCESS = HttpStatus.SUCCESS;
    /** å¤±è´¥ */
    public static final int FAIL = HttpStatus.ERROR;
    private int code;
    private String msg;
    private T data;
    public static <T> Result<T> success()
    {
        return restResult(null, SUCCESS, "操作成功");
    }
    public static <T> Result<T> success(T data)
    {
        return restResult(data, SUCCESS, "操作成功");
    }
    public static <T> Result<T> success(T data, String msg)
    {
        return restResult(data, SUCCESS, msg);
    }
    public static <T> Result<T> fail()
    {
        return restResult(null, FAIL, "操作失败");
    }
    public static <T> Result<T> fail(String msg)
    {
        return restResult(null, FAIL, msg);
    }
    public static <T> Result<T> fail(T data)
    {
        return restResult(data, FAIL, "操作失败");
    }
    public static <T> Result<T> fail(T data, String msg)
    {
        return restResult(data, FAIL, msg);
    }
    public static <T> Result<T> fail(int code, String msg)
    {
        return restResult(null, code, msg);
    }
    private static <T> Result<T> restResult(T data, int code, String msg)
    {
        Result<T> apiResult = new Result<>();
        apiResult.setCode(code);
        apiResult.setData(data);
        apiResult.setMsg(msg);
        return apiResult;
    }
    public int getCode()
    {
        return code;
    }
    public void setCode(int code)
    {
        this.code = code;
    }
    public String getMsg()
    {
        return msg;
    }
    public void setMsg(String msg)
    {
        this.msg = msg;
    }
    public T getData()
    {
        return data;
    }
    public void setData(T data)
    {
        this.data = data;
    }
    public static <T> Boolean isError(Result<T> ret)
    {
        return !isSuccess(ret);
    }
    public static <T> Boolean isSuccess(Result<T> ret)
    {
        return Result.SUCCESS == ret.getCode();
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.ruoyi.common.core.domain;
import java.util.ArrayList;
import java.util.List;
/**
 * Tree基类
 *
 * @author ruoyi
 */
public class TreeEntity extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** çˆ¶èœå•名称 */
    private String parentName;
    /** çˆ¶èœå•ID */
    private Long parentId;
    /** æ˜¾ç¤ºé¡ºåº */
    private Integer orderNum;
    /** ç¥–级列表 */
    private String ancestors;
    /** å­éƒ¨é—¨ */
    private List<?> children = new ArrayList<>();
    public String getParentName()
    {
        return parentName;
    }
    public void setParentName(String parentName)
    {
        this.parentName = parentName;
    }
    public Long getParentId()
    {
        return parentId;
    }
    public void setParentId(Long parentId)
    {
        this.parentId = parentId;
    }
    public Integer getOrderNum()
    {
        return orderNum;
    }
    public void setOrderNum(Integer orderNum)
    {
        this.orderNum = orderNum;
    }
    public String getAncestors()
    {
        return ancestors;
    }
    public void setAncestors(String ancestors)
    {
        this.ancestors = ancestors;
    }
    public List<?> getChildren()
    {
        return children;
    }
    public void setChildren(List<?> children)
    {
        this.children = children;
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.ruoyi.common.core.domain;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.utils.StringUtils;
/**
 * Treeselect树结构实体类
 *
 * @author ruoyi
 */
public class TreeSelect implements Serializable
{
    private static final long serialVersionUID = 1L;
    /** èŠ‚ç‚¹ID */
    private Long id;
    /** èŠ‚ç‚¹åç§° */
    private String label;
    /** èŠ‚ç‚¹ç¦ç”¨ */
    private boolean disabled = false;
    /** å­èŠ‚ç‚¹ */
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private List<TreeSelect> children;
    public TreeSelect()
    {
    }
    public TreeSelect(SysDept dept)
    {
        this.id = dept.getDeptId();
        this.label = dept.getDeptName();
        this.disabled = StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus());
        this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
    }
    public TreeSelect(SysMenu menu)
    {
        this.id = menu.getMenuId();
        this.label = menu.getMenuName();
        this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
    }
    public Long getId()
    {
        return id;
    }
    public void setId(Long id)
    {
        this.id = id;
    }
    public String getLabel()
    {
        return label;
    }
    public void setLabel(String label)
    {
        this.label = label;
    }
    public boolean isDisabled()
    {
        return disabled;
    }
    public void setDisabled(boolean disabled)
    {
        this.disabled = disabled;
    }
    public List<TreeSelect> getChildren()
    {
        return children;
    }
    public void setChildren(List<TreeSelect> children)
    {
        this.children = children;
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/Custom.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.ruoyi.common.core.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName("custom")
public class Custom implements Serializable {
    @ApiModelProperty(value = "主键")
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "客户名称")
    private String company;
    @ApiModelProperty(value = "单位地址")
    private String address;
    @ApiModelProperty(value = "工厂域")
    private String code;
    @ApiModelProperty(value = "客户编号")
    private String code2;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建日期")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "更新用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "客户单位EN")
    private String companyEn;
    @ApiModelProperty(value = "单位地址EN")
    private String addressEn;
    @ApiModelProperty(value = "加急额度")
    private Integer num;
    @ApiModelProperty(value = "单位电话")
    private String phone;
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,203 @@
package com.ruoyi.common.core.domain.entity;
import java.util.ArrayList;
import java.util.List;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.core.domain.BaseEntity;
/**
 * éƒ¨é—¨è¡¨ sys_dept
 *
 * @author ruoyi
 */
public class SysDept extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** éƒ¨é—¨ID */
    private Long deptId;
    /** çˆ¶éƒ¨é—¨ID */
    private Long parentId;
    /** ç¥–级列表 */
    private String ancestors;
    /** éƒ¨é—¨åç§° */
    private String deptName;
    /** æ˜¾ç¤ºé¡ºåº */
    private Integer orderNum;
    /** è´Ÿè´£äºº */
    private String leader;
    /** è”系电话 */
    private String phone;
    /** é‚®ç®± */
    private String email;
    /** éƒ¨é—¨çŠ¶æ€:0正常,1停用 */
    private String status;
    /** åˆ é™¤æ ‡å¿—(0代表存在 2代表删除) */
    private String delFlag;
    /** çˆ¶éƒ¨é—¨åç§° */
    private String parentName;
    /** å­éƒ¨é—¨ */
    private List<SysDept> children = new ArrayList<SysDept>();
    public Long getDeptId()
    {
        return deptId;
    }
    public void setDeptId(Long deptId)
    {
        this.deptId = deptId;
    }
    public Long getParentId()
    {
        return parentId;
    }
    public void setParentId(Long parentId)
    {
        this.parentId = parentId;
    }
    public String getAncestors()
    {
        return ancestors;
    }
    public void setAncestors(String ancestors)
    {
        this.ancestors = ancestors;
    }
    @NotBlank(message = "部门名称不能为空")
    @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
    public String getDeptName()
    {
        return deptName;
    }
    public void setDeptName(String deptName)
    {
        this.deptName = deptName;
    }
    @NotNull(message = "显示顺序不能为空")
    public Integer getOrderNum()
    {
        return orderNum;
    }
    public void setOrderNum(Integer orderNum)
    {
        this.orderNum = orderNum;
    }
    public String getLeader()
    {
        return leader;
    }
    public void setLeader(String leader)
    {
        this.leader = leader;
    }
    @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符")
    public String getPhone()
    {
        return phone;
    }
    public void setPhone(String phone)
    {
        this.phone = phone;
    }
    @Email(message = "邮箱格式不正确")
    @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
    public String getEmail()
    {
        return email;
    }
    public void setEmail(String email)
    {
        this.email = email;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    public String getDelFlag()
    {
        return delFlag;
    }
    public void setDelFlag(String delFlag)
    {
        this.delFlag = delFlag;
    }
    public String getParentName()
    {
        return parentName;
    }
    public void setParentName(String parentName)
    {
        this.parentName = parentName;
    }
    public List<SysDept> getChildren()
    {
        return children;
    }
    public void setChildren(List<SysDept> children)
    {
        this.children = children;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("deptId", getDeptId())
            .append("parentId", getParentId())
            .append("ancestors", getAncestors())
            .append("deptName", getDeptName())
            .append("orderNum", getOrderNum())
            .append("leader", getLeader())
            .append("phone", getPhone())
            .append("email", getEmail())
            .append("status", getStatus())
            .append("delFlag", getDelFlag())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .toString();
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,176 @@
package com.ruoyi.common.core.domain.entity;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.BaseEntity;
/**
 * å­—典数据表 sys_dict_data
 *
 * @author ruoyi
 */
public class SysDictData extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** å­—典编码 */
    @Excel(name = "字典编码", cellType = ColumnType.NUMERIC)
    private Long dictCode;
    /** å­—典排序 */
    @Excel(name = "字典排序", cellType = ColumnType.NUMERIC)
    private Long dictSort;
    /** å­—典标签 */
    @Excel(name = "字典标签")
    private String dictLabel;
    /** å­—典键值 */
    @Excel(name = "字典键值")
    private String dictValue;
    /** å­—典类型 */
    @Excel(name = "字典类型")
    private String dictType;
    /** æ ·å¼å±žæ€§ï¼ˆå…¶ä»–样式扩展) */
    private String cssClass;
    /** è¡¨æ ¼å­—典样式 */
    private String listClass;
    /** æ˜¯å¦é»˜è®¤ï¼ˆY是 N否) */
    @Excel(name = "是否默认", readConverterExp = "Y=是,N=否")
    private String isDefault;
    /** çŠ¶æ€ï¼ˆ0正常 1停用) */
    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
    private String status;
    public Long getDictCode()
    {
        return dictCode;
    }
    public void setDictCode(Long dictCode)
    {
        this.dictCode = dictCode;
    }
    public Long getDictSort()
    {
        return dictSort;
    }
    public void setDictSort(Long dictSort)
    {
        this.dictSort = dictSort;
    }
    @NotBlank(message = "字典标签不能为空")
    @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符")
    public String getDictLabel()
    {
        return dictLabel;
    }
    public void setDictLabel(String dictLabel)
    {
        this.dictLabel = dictLabel;
    }
    @NotBlank(message = "字典键值不能为空")
    @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符")
    public String getDictValue()
    {
        return dictValue;
    }
    public void setDictValue(String dictValue)
    {
        this.dictValue = dictValue;
    }
    @NotBlank(message = "字典类型不能为空")
    @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符")
    public String getDictType()
    {
        return dictType;
    }
    public void setDictType(String dictType)
    {
        this.dictType = dictType;
    }
    @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符")
    public String getCssClass()
    {
        return cssClass;
    }
    public void setCssClass(String cssClass)
    {
        this.cssClass = cssClass;
    }
    public String getListClass()
    {
        return listClass;
    }
    public void setListClass(String listClass)
    {
        this.listClass = listClass;
    }
    public boolean getDefault()
    {
        return UserConstants.YES.equals(this.isDefault);
    }
    public String getIsDefault()
    {
        return isDefault;
    }
    public void setIsDefault(String isDefault)
    {
        this.isDefault = isDefault;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("dictCode", getDictCode())
            .append("dictSort", getDictSort())
            .append("dictLabel", getDictLabel())
            .append("dictValue", getDictValue())
            .append("dictType", getDictType())
            .append("cssClass", getCssClass())
            .append("listClass", getListClass())
            .append("isDefault", getIsDefault())
            .append("status", getStatus())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .toString();
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.ruoyi.common.core.domain.entity;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.core.domain.BaseEntity;
/**
 * å­—典类型表 sys_dict_type
 *
 * @author ruoyi
 */
public class SysDictType extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** å­—典主键 */
    @Excel(name = "字典主键", cellType = ColumnType.NUMERIC)
    private Long dictId;
    /** å­—典名称 */
    @Excel(name = "字典名称")
    private String dictName;
    /** å­—典类型 */
    @Excel(name = "字典类型")
    private String dictType;
    /** çŠ¶æ€ï¼ˆ0正常 1停用) */
    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
    private String status;
    public Long getDictId()
    {
        return dictId;
    }
    public void setDictId(Long dictId)
    {
        this.dictId = dictId;
    }
    @NotBlank(message = "字典名称不能为空")
    @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符")
    public String getDictName()
    {
        return dictName;
    }
    public void setDictName(String dictName)
    {
        this.dictName = dictName;
    }
    @NotBlank(message = "字典类型不能为空")
    @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
    @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
    public String getDictType()
    {
        return dictType;
    }
    public void setDictType(String dictType)
    {
        this.dictType = dictType;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("dictId", getDictId())
            .append("dictName", getDictName())
            .append("dictType", getDictType())
            .append("status", getStatus())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .toString();
    }
}
在上述文件截断后对比
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java ruoyi-common/src/main/java/com/ruoyi/common/enums/DesensitizedType.java ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java ruoyi-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/UtilException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileSizeLimitExceededException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/file/FileUploadException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/job/TaskException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/user/BlackListException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserNotExistsException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitExceedException.java ruoyi-common/src/main/java/com/ruoyi/common/filter/PropertyPreExcludeFilter.java ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java ruoyi-common/src/main/java/com/ruoyi/common/handler/MybatisHandler.java ruoyi-common/src/main/java/com/ruoyi/common/numgen/LambdaUtils.java ruoyi-common/src/main/java/com/ruoyi/common/numgen/NumberGenerator.java ruoyi-common/src/main/java/com/ruoyi/common/numgen/NumberGeneratorModelHelper.java ruoyi-common/src/main/java/com/ruoyi/common/numgen/NumberTableInfo.java ruoyi-common/src/main/java/com/ruoyi/common/numgen/SerializedLambda.java ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/DesensitizedUtil.java ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java ruoyi-common/src/main/java/com/ruoyi/common/utils/JackSonUtil.java ruoyi-common/src/main/java/com/ruoyi/common/utils/LogUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/QueryWrappers.java ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MinioUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Base64.java ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java ruoyi-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java ruoyi-framework/pom.xml ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java ruoyi-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java ruoyi-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java ruoyi-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java ruoyi-framework/src/main/java/com/ruoyi/framework/config/I18nConfig.java ruoyi-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java ruoyi-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java ruoyi-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java ruoyi-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java ruoyi-framework/src/main/java/com/ruoyi/framework/mybatis_config/MyBaseMapper.java ruoyi-framework/src/main/java/com/ruoyi/framework/mybatis_config/MyBatisPlusConfig.java ruoyi-framework/src/main/java/com/ruoyi/framework/mybatis_config/MySqlInjector.java ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/AuthenticationContextHolder.java ruoyi-framework/src/main/java/com/ruoyi/framework/security/context/PermissionContextHolder.java ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java ruoyi-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java ruoyi-generator/pom.xml ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java ruoyi-generator/src/main/resources/generator.yml ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml ruoyi-generator/src/main/resources/vm/java/controller.java.vm ruoyi-generator/src/main/resources/vm/java/domain.java.vm ruoyi-generator/src/main/resources/vm/java/mapper.java.vm ruoyi-generator/src/main/resources/vm/java/service.java.vm ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm ruoyi-generator/src/main/resources/vm/js/api.js.vm ruoyi-generator/src/main/resources/vm/sql/sql.vm ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm ruoyi-generator/src/main/resources/vm/vue/index.vue.vm ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm ruoyi-quartz/pom.xml ruoyi-quartz/src/main/java/com/ruoyi/quartz/config/ScheduleConfig.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobLogMapper.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobMapper.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/CronUtils.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzDisallowConcurrentExecution.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzJobExecution.java ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml ruoyi-system/pom.xml ruoyi-system/src/main/java/com/ruoyi/system/domain/SysCache.java ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/CustomMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java ruoyi-system/src/main/java/com/ruoyi/system/service/CustomService.java ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomServiceImpl.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java ruoyi-system/src/main/resources/mapper/system/CustomMapper.xml ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml ry.bat ry.sh